forked from mirrors/linux
		
	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
	
	 Luiz Augusto von Dentz
						Luiz Augusto von Dentz