Bluetooth: hci_sync: Refactor remove Adv Monitor
Make use of hci_cmd_sync_queue for removing an advertisement monitor. Signed-off-by: Manish Mandlik <mmandlik@google.com> Reviewed-by: Miao-chen Chou <mcchou@google.com> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
committed by
Luiz Augusto von Dentz
parent
b747a83690
commit
7cf5c2978f
@@ -4861,49 +4861,46 @@ done:
|
||||
MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI);
|
||||
}
|
||||
|
||||
int mgmt_remove_adv_monitor_complete(struct hci_dev *hdev, u8 status)
|
||||
static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev,
|
||||
void *data, int status)
|
||||
{
|
||||
struct mgmt_rp_remove_adv_monitor rp;
|
||||
struct mgmt_cp_remove_adv_monitor *cp;
|
||||
struct mgmt_pending_cmd *cmd;
|
||||
int err = 0;
|
||||
struct mgmt_pending_cmd *cmd = data;
|
||||
struct mgmt_cp_remove_adv_monitor *cp = cmd->param;
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
cmd = pending_find(MGMT_OP_REMOVE_ADV_MONITOR, hdev);
|
||||
if (!cmd)
|
||||
goto done;
|
||||
|
||||
cp = cmd->param;
|
||||
rp.monitor_handle = cp->monitor_handle;
|
||||
|
||||
if (!status)
|
||||
hci_update_passive_scan(hdev);
|
||||
|
||||
err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
||||
mgmt_status(status), &rp, sizeof(rp));
|
||||
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
||||
mgmt_status(status), &rp, sizeof(rp));
|
||||
mgmt_pending_remove(cmd);
|
||||
|
||||
done:
|
||||
hci_dev_unlock(hdev);
|
||||
bt_dev_dbg(hdev, "remove monitor %d complete, status %u",
|
||||
bt_dev_dbg(hdev, "remove monitor %d complete, status %d",
|
||||
rp.monitor_handle, status);
|
||||
}
|
||||
|
||||
return err;
|
||||
static int mgmt_remove_adv_monitor_sync(struct hci_dev *hdev, void *data)
|
||||
{
|
||||
struct mgmt_pending_cmd *cmd = data;
|
||||
struct mgmt_cp_remove_adv_monitor *cp = cmd->param;
|
||||
u16 handle = __le16_to_cpu(cp->monitor_handle);
|
||||
|
||||
if (!handle)
|
||||
return hci_remove_all_adv_monitor(hdev);
|
||||
|
||||
return hci_remove_single_adv_monitor(hdev, handle);
|
||||
}
|
||||
|
||||
static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev,
|
||||
void *data, u16 len)
|
||||
{
|
||||
struct mgmt_cp_remove_adv_monitor *cp = data;
|
||||
struct mgmt_rp_remove_adv_monitor rp;
|
||||
struct mgmt_pending_cmd *cmd;
|
||||
u16 handle = __le16_to_cpu(cp->monitor_handle);
|
||||
int err, status;
|
||||
bool pending;
|
||||
|
||||
BT_DBG("request for %s", hdev->name);
|
||||
rp.monitor_handle = cp->monitor_handle;
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
@@ -4921,34 +4918,23 @@ static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (handle)
|
||||
pending = hci_remove_single_adv_monitor(hdev, handle, &err);
|
||||
else
|
||||
pending = hci_remove_all_adv_monitor(hdev, &err);
|
||||
err = hci_cmd_sync_queue(hdev, mgmt_remove_adv_monitor_sync, cmd,
|
||||
mgmt_remove_adv_monitor_complete);
|
||||
|
||||
if (err) {
|
||||
mgmt_pending_remove(cmd);
|
||||
|
||||
if (err == -ENOENT)
|
||||
status = MGMT_STATUS_INVALID_INDEX;
|
||||
if (err == -ENOMEM)
|
||||
status = MGMT_STATUS_NO_RESOURCES;
|
||||
else
|
||||
status = MGMT_STATUS_FAILED;
|
||||
|
||||
mgmt_pending_remove(cmd);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/* monitor can be removed without forwarding request to controller */
|
||||
if (!pending) {
|
||||
mgmt_pending_remove(cmd);
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
return mgmt_cmd_complete(sk, hdev->id,
|
||||
MGMT_OP_REMOVE_ADV_MONITOR,
|
||||
MGMT_STATUS_SUCCESS,
|
||||
&rp, sizeof(rp));
|
||||
}
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
return 0;
|
||||
|
||||
unlock:
|
||||
|
||||
Reference in New Issue
Block a user