Bluetooth: Simplify hci_conn_params->action list usage

Since params->action is used for both the pend_le_conns and
pend_le_reports lists we can simplify the adding and deleting of the
lists considerably. For example, when deleting entries in most
situations we no-longer need to check the auto_connect value but can
directly proceed with calling list_del_init on param->action (which is
safe even if the entry is not part of any list).

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Johan Hedberg 2014-07-04 12:37:21 +03:00 committed by Marcel Holtmann
parent 42ce26de67
commit 95305baa77
3 changed files with 17 additions and 23 deletions

View File

@ -3528,26 +3528,22 @@ int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
if (params->auto_connect == auto_connect) if (params->auto_connect == auto_connect)
return 0; return 0;
if (params->auto_connect == HCI_AUTO_CONN_REPORT &&
auto_connect != HCI_AUTO_CONN_REPORT)
list_del_init(&params->action); list_del_init(&params->action);
switch (auto_connect) { switch (auto_connect) {
case HCI_AUTO_CONN_DISABLED: case HCI_AUTO_CONN_DISABLED:
case HCI_AUTO_CONN_LINK_LOSS: case HCI_AUTO_CONN_LINK_LOSS:
hci_pend_le_conn_del(hdev, params); hci_update_background_scan(hdev);
break; break;
case HCI_AUTO_CONN_REPORT: case HCI_AUTO_CONN_REPORT:
if (params->auto_connect != HCI_AUTO_CONN_REPORT) { list_add(&params->action, &hdev->pend_le_reports);
list_del_init(&params->action); hci_update_background_scan(hdev);
list_add(&params->action,
&hdev->pend_le_reports);
}
hci_pend_le_conn_del(hdev, params);
break; break;
case HCI_AUTO_CONN_ALWAYS: case HCI_AUTO_CONN_ALWAYS:
if (!is_connected(hdev, addr, addr_type)) if (!is_connected(hdev, addr, addr_type)) {
hci_pend_le_conn_add(hdev, params); list_add(&params->action, &hdev->pend_le_conns);
hci_update_background_scan(hdev);
}
break; break;
} }
@ -3568,14 +3564,12 @@ void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
if (!params) if (!params)
return; return;
if (params->auto_connect == HCI_AUTO_CONN_REPORT) list_del(&params->action);
list_del_init(&params->action);
hci_pend_le_conn_del(hdev, params);
list_del(&params->list); list_del(&params->list);
kfree(params); kfree(params);
hci_update_background_scan(hdev);
BT_DBG("addr %pMR (type %u)", addr, addr_type); BT_DBG("addr %pMR (type %u)", addr, addr_type);
} }

View File

@ -4154,8 +4154,10 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
hci_proto_connect_cfm(conn, ev->status); hci_proto_connect_cfm(conn, ev->status);
params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type); params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
if (params) if (params) {
hci_pend_le_conn_del(hdev, params); list_del_init(&params->action);
hci_update_background_scan(hdev);
}
unlock: unlock:
hci_dev_unlock(hdev); hci_dev_unlock(hdev);

View File

@ -5225,12 +5225,10 @@ static int remove_device(struct sock *sk, struct hci_dev *hdev,
goto unlock; goto unlock;
} }
if (params->auto_connect == HCI_AUTO_CONN_REPORT)
list_del_init(&params->action); list_del_init(&params->action);
hci_pend_le_conn_del(hdev, params);
list_del(&params->list); list_del(&params->list);
kfree(params); kfree(params);
hci_update_background_scan(hdev);
device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type); device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type);
} else { } else {