Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: Add channel parameter to mgmt_pending_find() API

To be able to have pending commands for different HCI channels we need
to be able to distinguish for which channel a command was sent to. The
channel information is already part of the socket data and can be
fetched using the recently added hci_sock_get_channel() function. To not
require all mgmt.c code to pass an extra channel parameter this patch
also adds a helper pending_find() & pending_find_data() functions which
act as a wrapper to the new mgmt_pending_find() & mgmt_pending_find_data()
APIs.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Johan Hedberg and committed by
Marcel Holtmann
333ae95d d0f172b1

+62 -46
+62 -46
net/bluetooth/mgmt.c
··· 882 882 return ptr; 883 883 } 884 884 885 - static struct mgmt_pending_cmd *mgmt_pending_find(u16 opcode, 885 + static struct mgmt_pending_cmd *mgmt_pending_find(unsigned short channel, 886 + u16 opcode, 886 887 struct hci_dev *hdev) 887 888 { 888 889 struct mgmt_pending_cmd *cmd; 889 890 890 891 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { 892 + if (hci_sock_get_channel(cmd->sk) != channel) 893 + continue; 891 894 if (cmd->opcode == opcode) 892 895 return cmd; 893 896 } ··· 898 895 return NULL; 899 896 } 900 897 901 - static struct mgmt_pending_cmd *mgmt_pending_find_data(u16 opcode, 898 + static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev) 899 + { 900 + return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev); 901 + } 902 + 903 + static struct mgmt_pending_cmd *mgmt_pending_find_data(unsigned short channel, 904 + u16 opcode, 902 905 struct hci_dev *hdev, 903 906 const void *data) 904 907 { ··· 918 909 } 919 910 920 911 return NULL; 912 + } 913 + 914 + static struct mgmt_pending_cmd *pending_find_data(u16 opcode, 915 + struct hci_dev *hdev, 916 + const void *data) 917 + { 918 + return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data); 921 919 } 922 920 923 921 static u8 create_scan_rsp_data(struct hci_dev *hdev, u8 *ptr) ··· 985 969 /* If there's a pending mgmt command the flags will not yet have 986 970 * their final values, so check for this first. 987 971 */ 988 - cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); 972 + cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); 989 973 if (cmd) { 990 974 struct mgmt_mode *cp = cmd->param; 991 975 if (cp->val == 0x01) ··· 1193 1177 /* If there's a pending mgmt command the flag will not yet have 1194 1178 * it's final value, so check for this first. 1195 1179 */ 1196 - cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev); 1180 + cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev); 1197 1181 if (cmd) { 1198 1182 struct mgmt_mode *cp = cmd->param; 1199 1183 return cp->val; ··· 1533 1517 1534 1518 hci_dev_lock(hdev); 1535 1519 1536 - if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) { 1520 + if (pending_find(MGMT_OP_SET_POWERED, hdev)) { 1537 1521 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, 1538 1522 MGMT_STATUS_BUSY); 1539 1523 goto failed; ··· 1685 1669 1686 1670 hci_dev_lock(hdev); 1687 1671 1688 - cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); 1672 + cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); 1689 1673 if (!cmd) 1690 1674 goto unlock; 1691 1675 ··· 1770 1754 goto failed; 1771 1755 } 1772 1756 1773 - if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || 1774 - mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { 1757 + if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || 1758 + pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { 1775 1759 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, 1776 1760 MGMT_STATUS_BUSY); 1777 1761 goto failed; ··· 1942 1926 1943 1927 hci_dev_lock(hdev); 1944 1928 1945 - cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev); 1929 + cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev); 1946 1930 if (!cmd) 1947 1931 goto unlock; 1948 1932 ··· 2037 2021 goto failed; 2038 2022 } 2039 2023 2040 - if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || 2041 - mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { 2024 + if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || 2025 + pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { 2042 2026 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, 2043 2027 MGMT_STATUS_BUSY); 2044 2028 goto failed; ··· 2177 2161 goto failed; 2178 2162 } 2179 2163 2180 - if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) { 2164 + if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) { 2181 2165 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, 2182 2166 MGMT_STATUS_BUSY); 2183 2167 goto failed; ··· 2256 2240 goto failed; 2257 2241 } 2258 2242 2259 - if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) { 2243 + if (pending_find(MGMT_OP_SET_SSP, hdev)) { 2260 2244 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, 2261 2245 MGMT_STATUS_BUSY); 2262 2246 goto failed; ··· 2315 2299 2316 2300 hci_dev_lock(hdev); 2317 2301 2318 - if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) { 2302 + if (pending_find(MGMT_OP_SET_SSP, hdev)) { 2319 2303 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, 2320 2304 MGMT_STATUS_BUSY); 2321 2305 goto unlock; ··· 2437 2421 goto unlock; 2438 2422 } 2439 2423 2440 - if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) || 2441 - mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) { 2424 + if (pending_find(MGMT_OP_SET_LE, hdev) || 2425 + pending_find(MGMT_OP_SET_ADVERTISING, hdev)) { 2442 2426 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, 2443 2427 MGMT_STATUS_BUSY); 2444 2428 goto unlock; ··· 2522 2506 2523 2507 hci_dev_lock(hdev); 2524 2508 2525 - cmd = mgmt_pending_find(mgmt_op, hdev); 2509 + cmd = pending_find(mgmt_op, hdev); 2526 2510 if (!cmd) 2527 2511 goto unlock; 2528 2512 ··· 3016 3000 goto failed; 3017 3001 } 3018 3002 3019 - if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) { 3003 + if (pending_find(MGMT_OP_DISCONNECT, hdev)) { 3020 3004 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, 3021 3005 MGMT_STATUS_BUSY, &rp, sizeof(rp)); 3022 3006 goto failed; ··· 3480 3464 goto unlock; 3481 3465 } 3482 3466 3483 - cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev); 3467 + cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev); 3484 3468 if (!cmd) { 3485 3469 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 3486 3470 MGMT_STATUS_INVALID_PARAMS); ··· 3658 3642 3659 3643 hci_dev_lock(hdev); 3660 3644 3661 - cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); 3645 + cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); 3662 3646 if (!cmd) 3663 3647 goto unlock; 3664 3648 ··· 3768 3752 goto unlock; 3769 3753 } 3770 3754 3771 - if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) { 3755 + if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) { 3772 3756 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, 3773 3757 MGMT_STATUS_BUSY); 3774 3758 goto unlock; ··· 4081 4065 4082 4066 hci_dev_lock(hdev); 4083 4067 4084 - cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev); 4068 + cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev); 4085 4069 if (!cmd) 4086 - cmd = mgmt_pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev); 4070 + cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev); 4087 4071 4088 4072 if (cmd) { 4089 4073 cmd->cmd_complete(cmd, mgmt_status(status)); ··· 4338 4322 4339 4323 hci_dev_lock(hdev); 4340 4324 4341 - cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev); 4325 + cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev); 4342 4326 if (cmd) { 4343 4327 cmd->cmd_complete(cmd, mgmt_status(status)); 4344 4328 mgmt_pending_remove(cmd); ··· 4647 4631 goto unlock; 4648 4632 } 4649 4633 4650 - if (mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev) || 4651 - mgmt_pending_find(MGMT_OP_SET_LE, hdev)) { 4634 + if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) || 4635 + pending_find(MGMT_OP_SET_LE, hdev)) { 4652 4636 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, 4653 4637 MGMT_STATUS_BUSY); 4654 4638 goto unlock; ··· 4791 4775 4792 4776 hci_dev_lock(hdev); 4793 4777 4794 - cmd = mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev); 4778 + cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev); 4795 4779 if (!cmd) 4796 4780 goto unlock; 4797 4781 ··· 4837 4821 4838 4822 hci_dev_lock(hdev); 4839 4823 4840 - if (mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) { 4824 + if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) { 4841 4825 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, 4842 4826 MGMT_STATUS_BUSY); 4843 4827 goto unlock; ··· 4889 4873 4890 4874 hci_dev_lock(hdev); 4891 4875 4892 - cmd = mgmt_pending_find(MGMT_OP_SET_BREDR, hdev); 4876 + cmd = pending_find(MGMT_OP_SET_BREDR, hdev); 4893 4877 if (!cmd) 4894 4878 goto unlock; 4895 4879 ··· 4989 4973 } 4990 4974 } 4991 4975 4992 - if (mgmt_pending_find(MGMT_OP_SET_BREDR, hdev)) { 4976 + if (pending_find(MGMT_OP_SET_BREDR, hdev)) { 4993 4977 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, 4994 4978 MGMT_STATUS_BUSY); 4995 4979 goto unlock; ··· 5034 5018 5035 5019 hci_dev_lock(hdev); 5036 5020 5037 - cmd = mgmt_pending_find(MGMT_OP_SET_SECURE_CONN, hdev); 5021 + cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev); 5038 5022 if (!cmd) 5039 5023 goto unlock; 5040 5024 ··· 5125 5109 goto failed; 5126 5110 } 5127 5111 5128 - if (mgmt_pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) { 5112 + if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) { 5129 5113 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, 5130 5114 MGMT_STATUS_BUSY); 5131 5115 goto failed; ··· 5518 5502 goto unlock; 5519 5503 } 5520 5504 5521 - cmd = mgmt_pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn); 5505 + cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn); 5522 5506 if (!cmd) 5523 5507 goto unlock; 5524 5508 ··· 5571 5555 goto unlock; 5572 5556 } 5573 5557 5574 - if (mgmt_pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) { 5558 + if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) { 5575 5559 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, 5576 5560 MGMT_STATUS_BUSY, &rp, sizeof(rp)); 5577 5561 goto unlock; ··· 5707 5691 conn = NULL; 5708 5692 } 5709 5693 5710 - cmd = mgmt_pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn); 5694 + cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn); 5711 5695 if (!cmd) 5712 5696 goto unlock; 5713 5697 ··· 5873 5857 5874 5858 hci_dev_lock(hdev); 5875 5859 5876 - cmd = mgmt_pending_find(MGMT_OP_ADD_DEVICE, hdev); 5860 + cmd = pending_find(MGMT_OP_ADD_DEVICE, hdev); 5877 5861 if (!cmd) 5878 5862 goto unlock; 5879 5863 ··· 5996 5980 5997 5981 hci_dev_lock(hdev); 5998 5982 5999 - cmd = mgmt_pending_find(MGMT_OP_REMOVE_DEVICE, hdev); 5983 + cmd = pending_find(MGMT_OP_REMOVE_DEVICE, hdev); 6000 5984 if (!cmd) 6001 5985 goto unlock; 6002 5986 ··· 6953 6937 struct mgmt_pending_cmd *cmd; 6954 6938 u8 status; 6955 6939 6956 - cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev); 6940 + cmd = pending_find(MGMT_OP_SET_POWERED, hdev); 6957 6941 if (!cmd) 6958 6942 return; 6959 6943 ··· 7218 7202 struct mgmt_pending_cmd *cmd; 7219 7203 struct mgmt_mode *cp; 7220 7204 7221 - cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev); 7205 + cmd = pending_find(MGMT_OP_SET_POWERED, hdev); 7222 7206 if (!cmd) 7223 7207 return false; 7224 7208 ··· 7275 7259 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, 7276 7260 hdev); 7277 7261 7278 - cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev); 7262 + cmd = pending_find(MGMT_OP_DISCONNECT, hdev); 7279 7263 if (!cmd) 7280 7264 return; 7281 7265 ··· 7327 7311 { 7328 7312 struct mgmt_pending_cmd *cmd; 7329 7313 7330 - cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev); 7314 + cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev); 7331 7315 if (!cmd) 7332 7316 return; 7333 7317 ··· 7340 7324 { 7341 7325 struct mgmt_pending_cmd *cmd; 7342 7326 7343 - cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev); 7327 + cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev); 7344 7328 if (!cmd) 7345 7329 return; 7346 7330 ··· 7385 7369 { 7386 7370 struct mgmt_pending_cmd *cmd; 7387 7371 7388 - cmd = mgmt_pending_find(opcode, hdev); 7372 + cmd = pending_find(opcode, hdev); 7389 7373 if (!cmd) 7390 7374 return -ENOENT; 7391 7375 ··· 7596 7580 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH); 7597 7581 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH); 7598 7582 7599 - cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); 7583 + cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); 7600 7584 if (!cmd) { 7601 7585 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name)); 7602 7586 7603 7587 /* If this is a HCI command related to powering on the 7604 7588 * HCI dev don't send any mgmt signals. 7605 7589 */ 7606 - if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) 7590 + if (pending_find(MGMT_OP_SET_POWERED, hdev)) 7607 7591 return; 7608 7592 } 7609 7593 ··· 7619 7603 7620 7604 BT_DBG("%s status %u", hdev->name, status); 7621 7605 7622 - cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev); 7606 + cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev); 7623 7607 if (!cmd) 7624 7608 return; 7625 7609