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) || \ | ||||
| 		      ((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) || \ | ||||
| 		      ((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) || \ | ||||
| 			 ((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); | ||||
| } | ||||
| 
 | ||||
| /* 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) | ||||
| { | ||||
| 	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; | ||||
| 	} | ||||
| 
 | ||||
| 	memset(&cp, 0, sizeof(cp)); | ||||
| 	cp.all_phys = 0x00; | ||||
| 	cp.tx_phys = hdev->le_tx_def_phys; | ||||
| 	cp.rx_phys = hdev->le_rx_def_phys; | ||||
| 	cp.tx_phys = HCI_LE_SET_PHY_1M; | ||||
| 	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, | ||||
| 				     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_CAN_SET_TX_POWER; | ||||
| 
 | ||||
| 		if (hdev->le_features[1] & HCI_LE_PHY_2M) | ||||
| 		if (le_2m_capable(hdev)) | ||||
| 			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; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Luiz Augusto von Dentz
						Luiz Augusto von Dentz