mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-19 07:27:50 +00:00
Bluetooth: Fix returning proper cmd_complete for mgmt_disconnect
The Disconnect Management command should return Command Complete instead of Command Status whenever possible so that user space can distinguish exactly which command failed in the case of multiple commands. This patch does the necessary changes in the disconnect command handler to return the right event to user space. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
This commit is contained in:
parent
118da70b76
commit
06a63b19e9
@ -1654,6 +1654,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
u16 len)
|
||||
{
|
||||
struct mgmt_cp_disconnect *cp = data;
|
||||
struct mgmt_rp_disconnect rp;
|
||||
struct hci_cp_disconnect dc;
|
||||
struct pending_cmd *cmd;
|
||||
struct hci_conn *conn;
|
||||
@ -1661,21 +1662,26 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
|
||||
BT_DBG("");
|
||||
|
||||
memset(&rp, 0, sizeof(rp));
|
||||
bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
|
||||
rp.addr.type = cp->addr.type;
|
||||
|
||||
if (!bdaddr_type_is_valid(cp->addr.type))
|
||||
return cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_INVALID_PARAMS);
|
||||
return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_INVALID_PARAMS,
|
||||
&rp, sizeof(rp));
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
if (!test_bit(HCI_UP, &hdev->flags)) {
|
||||
err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_NOT_POWERED);
|
||||
err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
|
||||
err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_BUSY);
|
||||
err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_BUSY, &rp, sizeof(rp));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
@ -1686,8 +1692,8 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
|
||||
|
||||
if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
|
||||
err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_NOT_CONNECTED);
|
||||
err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||
MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user