mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Bluetooth: Enable all supported LE PHY by default
This enables 2M and Coded PHY by default if they are marked as supported in the LE features bits. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
		
							parent
							
								
									0fe8c8d071
								
							
						
					
					
						commit
						288c90224e
					
				
					 3 changed files with 30 additions and 6 deletions
				
			
		| 
						 | 
					@ -1683,9 +1683,13 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
 | 
				
			||||||
#define scan_1m(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_1M) || \
 | 
					#define scan_1m(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_1M) || \
 | 
				
			||||||
		      ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_1M))
 | 
							      ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_1M))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define le_2m_capable(dev) (((dev)->le_features[1] & HCI_LE_PHY_2M))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define scan_2m(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_2M) || \
 | 
					#define scan_2m(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_2M) || \
 | 
				
			||||||
		      ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_2M))
 | 
							      ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_2M))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define le_coded_capable(dev) (((dev)->le_features[1] & HCI_LE_PHY_CODED))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define scan_coded(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_CODED) || \
 | 
					#define scan_coded(dev) (((dev)->le_tx_def_phys & HCI_LE_SET_PHY_CODED) || \
 | 
				
			||||||
			 ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_CODED))
 | 
								 ((dev)->le_rx_def_phys & HCI_LE_SET_PHY_CODED))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4414,18 +4414,38 @@ static int hci_le_set_write_def_data_len_sync(struct hci_dev *hdev)
 | 
				
			||||||
				     sizeof(cp), &cp, HCI_CMD_TIMEOUT);
 | 
									     sizeof(cp), &cp, HCI_CMD_TIMEOUT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Set Default PHY parameters if command is supported */
 | 
					/* Set Default PHY parameters if command is supported, enables all supported
 | 
				
			||||||
 | 
					 * PHYs according to the LE Features bits.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
static int hci_le_set_default_phy_sync(struct hci_dev *hdev)
 | 
					static int hci_le_set_default_phy_sync(struct hci_dev *hdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct hci_cp_le_set_default_phy cp;
 | 
						struct hci_cp_le_set_default_phy cp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(hdev->commands[35] & 0x20))
 | 
						if (!(hdev->commands[35] & 0x20)) {
 | 
				
			||||||
 | 
							/* If the command is not supported it means only 1M PHY is
 | 
				
			||||||
 | 
							 * supported.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							hdev->le_tx_def_phys = HCI_LE_SET_PHY_1M;
 | 
				
			||||||
 | 
							hdev->le_rx_def_phys = HCI_LE_SET_PHY_1M;
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memset(&cp, 0, sizeof(cp));
 | 
						memset(&cp, 0, sizeof(cp));
 | 
				
			||||||
	cp.all_phys = 0x00;
 | 
						cp.all_phys = 0x00;
 | 
				
			||||||
	cp.tx_phys = hdev->le_tx_def_phys;
 | 
						cp.tx_phys = HCI_LE_SET_PHY_1M;
 | 
				
			||||||
	cp.rx_phys = hdev->le_rx_def_phys;
 | 
						cp.rx_phys = HCI_LE_SET_PHY_1M;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Enables 2M PHY if supported */
 | 
				
			||||||
 | 
						if (le_2m_capable(hdev)) {
 | 
				
			||||||
 | 
							cp.tx_phys |= HCI_LE_SET_PHY_2M;
 | 
				
			||||||
 | 
							cp.rx_phys |= HCI_LE_SET_PHY_2M;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Enables Coded PHY if supported */
 | 
				
			||||||
 | 
						if (le_coded_capable(hdev)) {
 | 
				
			||||||
 | 
							cp.tx_phys |= HCI_LE_SET_PHY_CODED;
 | 
				
			||||||
 | 
							cp.rx_phys |= HCI_LE_SET_PHY_CODED;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_DEFAULT_PHY,
 | 
						return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_DEFAULT_PHY,
 | 
				
			||||||
				     sizeof(cp), &cp, HCI_CMD_TIMEOUT);
 | 
									     sizeof(cp), &cp, HCI_CMD_TIMEOUT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8393,10 +8393,10 @@ static u32 get_supported_adv_flags(struct hci_dev *hdev)
 | 
				
			||||||
		flags |= MGMT_ADV_FLAG_HW_OFFLOAD;
 | 
							flags |= MGMT_ADV_FLAG_HW_OFFLOAD;
 | 
				
			||||||
		flags |= MGMT_ADV_FLAG_CAN_SET_TX_POWER;
 | 
							flags |= MGMT_ADV_FLAG_CAN_SET_TX_POWER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (hdev->le_features[1] & HCI_LE_PHY_2M)
 | 
							if (le_2m_capable(hdev))
 | 
				
			||||||
			flags |= MGMT_ADV_FLAG_SEC_2M;
 | 
								flags |= MGMT_ADV_FLAG_SEC_2M;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (hdev->le_features[1] & HCI_LE_PHY_CODED)
 | 
							if (le_coded_capable(hdev))
 | 
				
			||||||
			flags |= MGMT_ADV_FLAG_SEC_CODED;
 | 
								flags |= MGMT_ADV_FLAG_SEC_CODED;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue