|
@@ -417,10 +417,37 @@ void amp_write_remote_assoc(struct hci_dev *hdev, u8 handle)
|
|
amp_write_rem_assoc_frag(hdev, hcon);
|
|
amp_write_rem_assoc_frag(hdev, hcon);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void create_phylink_complete(struct hci_dev *hdev, u8 status,
|
|
|
|
+ u16 opcode)
|
|
|
|
+{
|
|
|
|
+ struct hci_cp_create_phy_link *cp;
|
|
|
|
+
|
|
|
|
+ BT_DBG("%s status 0x%2.2x", hdev->name, status);
|
|
|
|
+
|
|
|
|
+ cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
|
|
|
|
+ if (!cp)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ hci_dev_lock(hdev);
|
|
|
|
+
|
|
|
|
+ if (status) {
|
|
|
|
+ struct hci_conn *hcon;
|
|
|
|
+
|
|
|
|
+ hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
|
|
|
|
+ if (hcon)
|
|
|
|
+ hci_conn_del(hcon);
|
|
|
|
+ } else {
|
|
|
|
+ amp_write_remote_assoc(hdev, cp->phy_handle);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ hci_dev_unlock(hdev);
|
|
|
|
+}
|
|
|
|
+
|
|
void amp_create_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
|
void amp_create_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
|
struct hci_conn *hcon)
|
|
struct hci_conn *hcon)
|
|
{
|
|
{
|
|
struct hci_cp_create_phy_link cp;
|
|
struct hci_cp_create_phy_link cp;
|
|
|
|
+ struct hci_request req;
|
|
|
|
|
|
cp.phy_handle = hcon->handle;
|
|
cp.phy_handle = hcon->handle;
|
|
|
|
|
|
@@ -433,13 +460,33 @@ void amp_create_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- hci_send_cmd(hdev, HCI_OP_CREATE_PHY_LINK, sizeof(cp), &cp);
|
|
|
|
|
|
+ hci_req_init(&req, hdev);
|
|
|
|
+ hci_req_add(&req, HCI_OP_CREATE_PHY_LINK, sizeof(cp), &cp);
|
|
|
|
+ hci_req_run(&req, create_phylink_complete);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void accept_phylink_complete(struct hci_dev *hdev, u8 status,
|
|
|
|
+ u16 opcode)
|
|
|
|
+{
|
|
|
|
+ struct hci_cp_accept_phy_link *cp;
|
|
|
|
+
|
|
|
|
+ BT_DBG("%s status 0x%2.2x", hdev->name, status);
|
|
|
|
+
|
|
|
|
+ if (status)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
|
|
|
|
+ if (!cp)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ amp_write_remote_assoc(hdev, cp->phy_handle);
|
|
}
|
|
}
|
|
|
|
|
|
void amp_accept_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
|
void amp_accept_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
|
struct hci_conn *hcon)
|
|
struct hci_conn *hcon)
|
|
{
|
|
{
|
|
struct hci_cp_accept_phy_link cp;
|
|
struct hci_cp_accept_phy_link cp;
|
|
|
|
+ struct hci_request req;
|
|
|
|
|
|
cp.phy_handle = hcon->handle;
|
|
cp.phy_handle = hcon->handle;
|
|
|
|
|
|
@@ -452,7 +499,9 @@ void amp_accept_phylink(struct hci_dev *hdev, struct amp_mgr *mgr,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- hci_send_cmd(hdev, HCI_OP_ACCEPT_PHY_LINK, sizeof(cp), &cp);
|
|
|
|
|
|
+ hci_req_init(&req, hdev);
|
|
|
|
+ hci_req_add(&req, HCI_OP_ACCEPT_PHY_LINK, sizeof(cp), &cp);
|
|
|
|
+ hci_req_run(&req, accept_phylink_complete);
|
|
}
|
|
}
|
|
|
|
|
|
void amp_physical_cfm(struct hci_conn *bredr_hcon, struct hci_conn *hs_hcon)
|
|
void amp_physical_cfm(struct hci_conn *bredr_hcon, struct hci_conn *hs_hcon)
|