Commit a789c70c authored by Jakub Kicinski's avatar Jakub Kicinski

Merge tag 'for-net-2022-12-02' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth

Luiz Augusto von Dentz says:

====================
bluetooth pull request for net:

 - Fix regressions with CSR controller clones
 - Fix support for Read Local Supported Codecs V2
 - Fix overflow on L2CAP code
 - Fix missing hci_dev_put on ISO and L2CAP code

* tag 'for-net-2022-12-02' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth:
  Bluetooth: Fix crash when replugging CSR fake controllers
  Bluetooth: Fix not cleanup led when bt_init fails
  Bluetooth: Fix support for Read Local Supported Codecs V2
  Bluetooth: Remove codec id field in vendor codec definition
  Bluetooth: L2CAP: Fix u8 overflow
  Bluetooth: silence a dmesg error message in hci_request.c
  Bluetooth: hci_conn: add missing hci_dev_put() in iso_listen_bis()
  Bluetooth: 6LoWPAN: add missing hci_dev_put() in get_l2cap_conn()
  Bluetooth: btusb: Add debug message for CSR controllers
  Bluetooth: btusb: Fix CSR clones again by re-adding ERR_DATA_REPORTING quirk
====================

Link: https://lore.kernel.org/r/20221202213726.2801581-1-luiz.dentz@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents e931a173 b5ca3387
...@@ -2056,6 +2056,11 @@ static int btusb_setup_csr(struct hci_dev *hdev) ...@@ -2056,6 +2056,11 @@ static int btusb_setup_csr(struct hci_dev *hdev)
rp = (struct hci_rp_read_local_version *)skb->data; rp = (struct hci_rp_read_local_version *)skb->data;
bt_dev_info(hdev, "CSR: Setting up dongle with HCI ver=%u rev=%04x; LMP ver=%u subver=%04x; manufacturer=%u",
le16_to_cpu(rp->hci_ver), le16_to_cpu(rp->hci_rev),
le16_to_cpu(rp->lmp_ver), le16_to_cpu(rp->lmp_subver),
le16_to_cpu(rp->manufacturer));
/* Detect a wide host of Chinese controllers that aren't CSR. /* Detect a wide host of Chinese controllers that aren't CSR.
* *
* Known fake bcdDevices: 0x0100, 0x0134, 0x1915, 0x2520, 0x7558, 0x8891 * Known fake bcdDevices: 0x0100, 0x0134, 0x1915, 0x2520, 0x7558, 0x8891
...@@ -2118,6 +2123,7 @@ static int btusb_setup_csr(struct hci_dev *hdev) ...@@ -2118,6 +2123,7 @@ static int btusb_setup_csr(struct hci_dev *hdev)
* without these the controller will lock up. * without these the controller will lock up.
*/ */
set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks);
set_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &hdev->quirks); set_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &hdev->quirks);
set_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks); set_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks);
......
...@@ -228,6 +228,17 @@ enum { ...@@ -228,6 +228,17 @@ enum {
*/ */
HCI_QUIRK_VALID_LE_STATES, HCI_QUIRK_VALID_LE_STATES,
/* When this quirk is set, then erroneous data reporting
* is ignored. This is mainly due to the fact that the HCI
* Read Default Erroneous Data Reporting command is advertised,
* but not supported; these controllers often reply with unknown
* command and tend to lock up randomly. Needing a hard reset.
*
* This quirk can be set before hci_register_dev is called or
* during the hdev->setup vendor callback.
*/
HCI_QUIRK_BROKEN_ERR_DATA_REPORTING,
/* /*
* When this quirk is set, then the hci_suspend_notifier is not * When this quirk is set, then the hci_suspend_notifier is not
* registered. This is intended for devices which drop completely * registered. This is intended for devices which drop completely
...@@ -1424,7 +1435,6 @@ struct hci_std_codecs_v2 { ...@@ -1424,7 +1435,6 @@ struct hci_std_codecs_v2 {
} __packed; } __packed;
struct hci_vnd_codec_v2 { struct hci_vnd_codec_v2 {
__u8 id;
__le16 cid; __le16 cid;
__le16 vid; __le16 vid;
__u8 transport; __u8 transport;
......
...@@ -972,6 +972,7 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type, ...@@ -972,6 +972,7 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type,
hci_dev_lock(hdev); hci_dev_lock(hdev);
hcon = hci_conn_hash_lookup_le(hdev, addr, *addr_type); hcon = hci_conn_hash_lookup_le(hdev, addr, *addr_type);
hci_dev_unlock(hdev); hci_dev_unlock(hdev);
hci_dev_put(hdev);
if (!hcon) if (!hcon)
return -ENOENT; return -ENOENT;
......
...@@ -737,7 +737,7 @@ static int __init bt_init(void) ...@@ -737,7 +737,7 @@ static int __init bt_init(void)
err = bt_sysfs_init(); err = bt_sysfs_init();
if (err < 0) if (err < 0)
return err; goto cleanup_led;
err = sock_register(&bt_sock_family_ops); err = sock_register(&bt_sock_family_ops);
if (err) if (err)
...@@ -773,6 +773,8 @@ static int __init bt_init(void) ...@@ -773,6 +773,8 @@ static int __init bt_init(void)
sock_unregister(PF_BLUETOOTH); sock_unregister(PF_BLUETOOTH);
cleanup_sysfs: cleanup_sysfs:
bt_sysfs_cleanup(); bt_sysfs_cleanup();
cleanup_led:
bt_leds_cleanup();
return err; return err;
} }
......
...@@ -72,9 +72,8 @@ static void hci_read_codec_capabilities(struct hci_dev *hdev, __u8 transport, ...@@ -72,9 +72,8 @@ static void hci_read_codec_capabilities(struct hci_dev *hdev, __u8 transport,
continue; continue;
} }
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_CODEC_CAPS, skb = __hci_cmd_sync_sk(hdev, HCI_OP_READ_LOCAL_CODEC_CAPS,
sizeof(*cmd), cmd, sizeof(*cmd), cmd, 0, HCI_CMD_TIMEOUT, NULL);
HCI_CMD_TIMEOUT);
if (IS_ERR(skb)) { if (IS_ERR(skb)) {
bt_dev_err(hdev, "Failed to read codec capabilities (%ld)", bt_dev_err(hdev, "Failed to read codec capabilities (%ld)",
PTR_ERR(skb)); PTR_ERR(skb));
...@@ -127,8 +126,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev) ...@@ -127,8 +126,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev)
struct hci_op_read_local_codec_caps caps; struct hci_op_read_local_codec_caps caps;
__u8 i; __u8 i;
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_CODECS, 0, NULL, skb = __hci_cmd_sync_sk(hdev, HCI_OP_READ_LOCAL_CODECS, 0, NULL,
HCI_CMD_TIMEOUT); 0, HCI_CMD_TIMEOUT, NULL);
if (IS_ERR(skb)) { if (IS_ERR(skb)) {
bt_dev_err(hdev, "Failed to read local supported codecs (%ld)", bt_dev_err(hdev, "Failed to read local supported codecs (%ld)",
...@@ -158,7 +157,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev) ...@@ -158,7 +157,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev)
for (i = 0; i < std_codecs->num; i++) { for (i = 0; i < std_codecs->num; i++) {
caps.id = std_codecs->codec[i]; caps.id = std_codecs->codec[i];
caps.direction = 0x00; caps.direction = 0x00;
hci_read_codec_capabilities(hdev, LOCAL_CODEC_ACL_MASK, &caps); hci_read_codec_capabilities(hdev,
LOCAL_CODEC_ACL_MASK | LOCAL_CODEC_SCO_MASK, &caps);
} }
skb_pull(skb, flex_array_size(std_codecs, codec, std_codecs->num) skb_pull(skb, flex_array_size(std_codecs, codec, std_codecs->num)
...@@ -178,7 +178,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev) ...@@ -178,7 +178,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev)
caps.cid = vnd_codecs->codec[i].cid; caps.cid = vnd_codecs->codec[i].cid;
caps.vid = vnd_codecs->codec[i].vid; caps.vid = vnd_codecs->codec[i].vid;
caps.direction = 0x00; caps.direction = 0x00;
hci_read_codec_capabilities(hdev, LOCAL_CODEC_ACL_MASK, &caps); hci_read_codec_capabilities(hdev,
LOCAL_CODEC_ACL_MASK | LOCAL_CODEC_SCO_MASK, &caps);
} }
error: error:
...@@ -194,8 +195,8 @@ void hci_read_supported_codecs_v2(struct hci_dev *hdev) ...@@ -194,8 +195,8 @@ void hci_read_supported_codecs_v2(struct hci_dev *hdev)
struct hci_op_read_local_codec_caps caps; struct hci_op_read_local_codec_caps caps;
__u8 i; __u8 i;
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_CODECS_V2, 0, NULL, skb = __hci_cmd_sync_sk(hdev, HCI_OP_READ_LOCAL_CODECS_V2, 0, NULL,
HCI_CMD_TIMEOUT); 0, HCI_CMD_TIMEOUT, NULL);
if (IS_ERR(skb)) { if (IS_ERR(skb)) {
bt_dev_err(hdev, "Failed to read local supported codecs (%ld)", bt_dev_err(hdev, "Failed to read local supported codecs (%ld)",
......
...@@ -2764,7 +2764,8 @@ int hci_register_suspend_notifier(struct hci_dev *hdev) ...@@ -2764,7 +2764,8 @@ int hci_register_suspend_notifier(struct hci_dev *hdev)
{ {
int ret = 0; int ret = 0;
if (!test_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks)) { if (!hdev->suspend_notifier.notifier_call &&
!test_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks)) {
hdev->suspend_notifier.notifier_call = hci_suspend_notifier; hdev->suspend_notifier.notifier_call = hci_suspend_notifier;
ret = register_pm_notifier(&hdev->suspend_notifier); ret = register_pm_notifier(&hdev->suspend_notifier);
} }
...@@ -2776,8 +2777,11 @@ int hci_unregister_suspend_notifier(struct hci_dev *hdev) ...@@ -2776,8 +2777,11 @@ int hci_unregister_suspend_notifier(struct hci_dev *hdev)
{ {
int ret = 0; int ret = 0;
if (!test_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks)) if (hdev->suspend_notifier.notifier_call) {
ret = unregister_pm_notifier(&hdev->suspend_notifier); ret = unregister_pm_notifier(&hdev->suspend_notifier);
if (!ret)
hdev->suspend_notifier.notifier_call = NULL;
}
return ret; return ret;
} }
......
...@@ -269,7 +269,7 @@ void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen, ...@@ -269,7 +269,7 @@ void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
void hci_req_add(struct hci_request *req, u16 opcode, u32 plen, void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
const void *param) const void *param)
{ {
bt_dev_err(req->hdev, "HCI_REQ-0x%4.4x", opcode); bt_dev_dbg(req->hdev, "HCI_REQ-0x%4.4x", opcode);
hci_req_add_ev(req, opcode, plen, param, 0); hci_req_add_ev(req, opcode, plen, param, 0);
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <net/bluetooth/mgmt.h> #include <net/bluetooth/mgmt.h>
#include "hci_request.h" #include "hci_request.h"
#include "hci_codec.h"
#include "hci_debugfs.h" #include "hci_debugfs.h"
#include "smp.h" #include "smp.h"
#include "eir.h" #include "eir.h"
...@@ -3780,7 +3781,8 @@ static int hci_read_page_scan_activity_sync(struct hci_dev *hdev) ...@@ -3780,7 +3781,8 @@ static int hci_read_page_scan_activity_sync(struct hci_dev *hdev)
static int hci_read_def_err_data_reporting_sync(struct hci_dev *hdev) static int hci_read_def_err_data_reporting_sync(struct hci_dev *hdev)
{ {
if (!(hdev->commands[18] & 0x04) || if (!(hdev->commands[18] & 0x04) ||
!(hdev->features[0][6] & LMP_ERR_DATA_REPORTING)) !(hdev->features[0][6] & LMP_ERR_DATA_REPORTING) ||
test_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks))
return 0; return 0;
return __hci_cmd_sync_status(hdev, HCI_OP_READ_DEF_ERR_DATA_REPORTING, return __hci_cmd_sync_status(hdev, HCI_OP_READ_DEF_ERR_DATA_REPORTING,
...@@ -4238,11 +4240,12 @@ static int hci_set_event_mask_page_2_sync(struct hci_dev *hdev) ...@@ -4238,11 +4240,12 @@ static int hci_set_event_mask_page_2_sync(struct hci_dev *hdev)
/* Read local codec list if the HCI command is supported */ /* Read local codec list if the HCI command is supported */
static int hci_read_local_codecs_sync(struct hci_dev *hdev) static int hci_read_local_codecs_sync(struct hci_dev *hdev)
{ {
if (!(hdev->commands[29] & 0x20)) if (hdev->commands[45] & 0x04)
return 0; hci_read_supported_codecs_v2(hdev);
else if (hdev->commands[29] & 0x20)
hci_read_supported_codecs(hdev);
return __hci_cmd_sync_status(hdev, HCI_OP_READ_LOCAL_CODECS, 0, NULL, return 0;
HCI_CMD_TIMEOUT);
} }
/* Read local pairing options if the HCI command is supported */ /* Read local pairing options if the HCI command is supported */
...@@ -4298,7 +4301,8 @@ static int hci_set_err_data_report_sync(struct hci_dev *hdev) ...@@ -4298,7 +4301,8 @@ static int hci_set_err_data_report_sync(struct hci_dev *hdev)
bool enabled = hci_dev_test_flag(hdev, HCI_WIDEBAND_SPEECH_ENABLED); bool enabled = hci_dev_test_flag(hdev, HCI_WIDEBAND_SPEECH_ENABLED);
if (!(hdev->commands[18] & 0x08) || if (!(hdev->commands[18] & 0x08) ||
!(hdev->features[0][6] & LMP_ERR_DATA_REPORTING)) !(hdev->features[0][6] & LMP_ERR_DATA_REPORTING) ||
test_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks))
return 0; return 0;
if (enabled == hdev->err_data_reporting) if (enabled == hdev->err_data_reporting)
...@@ -4457,6 +4461,9 @@ static const struct { ...@@ -4457,6 +4461,9 @@ static const struct {
HCI_QUIRK_BROKEN(STORED_LINK_KEY, HCI_QUIRK_BROKEN(STORED_LINK_KEY,
"HCI Delete Stored Link Key command is advertised, " "HCI Delete Stored Link Key command is advertised, "
"but not supported."), "but not supported."),
HCI_QUIRK_BROKEN(ERR_DATA_REPORTING,
"HCI Read Default Erroneous Data Reporting command is "
"advertised, but not supported."),
HCI_QUIRK_BROKEN(READ_TRANSMIT_POWER, HCI_QUIRK_BROKEN(READ_TRANSMIT_POWER,
"HCI Read Transmit Power Level command is advertised, " "HCI Read Transmit Power Level command is advertised, "
"but not supported."), "but not supported."),
......
...@@ -879,6 +879,7 @@ static int iso_listen_bis(struct sock *sk) ...@@ -879,6 +879,7 @@ static int iso_listen_bis(struct sock *sk)
iso_pi(sk)->bc_sid); iso_pi(sk)->bc_sid);
hci_dev_unlock(hdev); hci_dev_unlock(hdev);
hci_dev_put(hdev);
return err; return err;
} }
......
...@@ -4453,7 +4453,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, ...@@ -4453,7 +4453,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn,
chan->ident = cmd->ident; chan->ident = cmd->ident;
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
chan->num_conf_rsp++; if (chan->num_conf_rsp < L2CAP_CONF_MAX_CONF_RSP)
chan->num_conf_rsp++;
/* Reset config buffer. */ /* Reset config buffer. */
chan->conf_len = 0; chan->conf_len = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment