Commit 95305baa authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann
Browse files

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: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 42ce26de
Loading
Loading
Loading
Loading
+11 −17
Original line number Diff line number Diff line
@@ -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)
		return 0;

	if (params->auto_connect == HCI_AUTO_CONN_REPORT &&
	    auto_connect != HCI_AUTO_CONN_REPORT)
	list_del_init(&params->action);

	switch (auto_connect) {
	case HCI_AUTO_CONN_DISABLED:
	case HCI_AUTO_CONN_LINK_LOSS:
		hci_pend_le_conn_del(hdev, params);
		hci_update_background_scan(hdev);
		break;
	case HCI_AUTO_CONN_REPORT:
		if (params->auto_connect != HCI_AUTO_CONN_REPORT) {
			list_del_init(&params->action);
			list_add(&params->action,
				 &hdev->pend_le_reports);
		}
		hci_pend_le_conn_del(hdev, params);
		list_add(&params->action, &hdev->pend_le_reports);
		hci_update_background_scan(hdev);
		break;
	case HCI_AUTO_CONN_ALWAYS:
		if (!is_connected(hdev, addr, addr_type))
			hci_pend_le_conn_add(hdev, params);
		if (!is_connected(hdev, addr, addr_type)) {
			list_add(&params->action, &hdev->pend_le_conns);
			hci_update_background_scan(hdev);
		}
		break;
	}

@@ -3568,14 +3564,12 @@ void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
	if (!params)
		return;

	if (params->auto_connect == HCI_AUTO_CONN_REPORT)
		list_del_init(&params->action);

	hci_pend_le_conn_del(hdev, params);

	list_del(&params->action);
	list_del(&params->list);
	kfree(params);

	hci_update_background_scan(hdev);

	BT_DBG("addr %pMR (type %u)", addr, addr_type);
}

+4 −2
Original line number Diff line number Diff line
@@ -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);

	params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
	if (params)
		hci_pend_le_conn_del(hdev, params);
	if (params) {
		list_del_init(&params->action);
		hci_update_background_scan(hdev);
	}

unlock:
	hci_dev_unlock(hdev);
+2 −4
Original line number Diff line number Diff line
@@ -5225,12 +5225,10 @@ static int remove_device(struct sock *sk, struct hci_dev *hdev,
			goto unlock;
		}

		if (params->auto_connect == HCI_AUTO_CONN_REPORT)
		list_del_init(&params->action);

		hci_pend_le_conn_del(hdev, params);
		list_del(&params->list);
		kfree(params);
		hci_update_background_scan(hdev);

		device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type);
	} else {