Hi Johan, > Even though the HCI_Delete_Stored_Link_Key command is mandatory for 1.1 > and later controllers some controllers do not seem to support it > properly as was witnessed by one Broadcom based controller: > > < HCI Command: Delete Stored Link Key (0x03|0x0012) plen 7 > bdaddr 00:00:00:00:00:00 all 1 >> HCI Event: Command Complete (0x0e) plen 4 > Delete Stored Link Key (0x03|0x0012) ncmd 1 > status 0x11 deleted 0 > Error: Unsupported Feature or Parameter Value > > Luckily this same controller also doesn't list the command in its > supported commands bit mask (counting from 0 bit 7 of octet 6): > > < HCI Command: Read Local Supported Commands (0x04|0x0002) plen 0 >> HCI Event: Command Complete (0x0e) plen 68 > Read Local Supported Commands (0x04|0x0002) ncmd 1 > status 0x00 > Commands: ffffffffffff1ffffffffffff30fffff3f > > Therefore, it makes sense to move sending of HCI_Delete_Stored_Link_Key > to after receiving the supported commands response and to only send it > if its respective bit in the mask is set. The downside of this is that > we no longer send the HCI_Delete_Stored_Link_Key command for Bluetooth > 1.1 controllers since HCI_Read_Local_Supported_Command was introduced in > version 1.2, but this is an acceptable penalty as the command in > question shouldn't affect critical behavior. > > Reported-by: Pavel Machek <pavel@xxxxxx> > Signed-off-by: Johan Hedberg <johan.hedberg@xxxxxxxxx> > --- > net/bluetooth/hci_core.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c > index d817c93..d68425c 100644 > --- a/net/bluetooth/hci_core.c > +++ b/net/bluetooth/hci_core.c > @@ -341,7 +341,6 @@ static void hci_init1_req(struct hci_request *req, unsigned long opt) > > static void bredr_setup(struct hci_request *req) > { > - struct hci_cp_delete_stored_link_key cp; > __le16 param; > __u8 flt_type; > > @@ -365,10 +364,6 @@ static void bredr_setup(struct hci_request *req) > param = __constant_cpu_to_le16(0x7d00); > hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); > > - bacpy(&cp.bdaddr, BDADDR_ANY); > - cp.delete_all = 0x01; > - hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY, sizeof(cp), &cp); > - > /* Read page scan parameters */ > if (req->hdev->hci_ver > BLUETOOTH_VER_1_1) { > hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL); > @@ -602,6 +597,15 @@ static void hci_init3_req(struct hci_request *req, unsigned long opt) > struct hci_dev *hdev = req->hdev; > u8 p; I would have added here a comment to explain what bit we are checking for. > > + if (hdev->commands[6] & 0x80) { > + struct hci_cp_delete_stored_link_key cp; > + > + bacpy(&cp.bdaddr, BDADDR_ANY); > + cp.delete_all = 0x01; > + hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY, > + sizeof(cp), &cp); > + } > + > if (hdev->commands[5] & 0x10) > hci_setup_link_policy(req); Regards Marcel -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html