mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
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 -----BEGIN PGP SIGNATURE----- iQJNBAABCAA3FiEE7E6oRXp8w05ovYr/9JCA4xAyCykFAmOKbsEZHGx1aXoudm9u LmRlbnR6QGludGVsLmNvbQAKCRD0kIDjEDILKa8JD/9wFnXgEO77SeeZhY4uk3W3 yKozgIE0HwYuAkXkKTQAOPgsNwuHbBH7hfK6h1AE3ucUqfFcVoxS4Q94DB7ZcYe0 sAgTtiFBh+NGTDZB+TrWYuvgtkZNZMnZv/k8HcSw7GxA9I+9dMMXdpIDI1FmkaJx wD90NVvGkES4JVUzJ3AXq0bcv/F8Nyoim72cafr5BpzawZ7myDqBOEI9OxWfS2lF +gPG94gEJ73h3Pdr7zPHGM1z+e3Uh0QWt4lN9S3rOEjh12LcQKVZdEWzLfPHz3sO 7HX0eFT7bTj7fhjkU5qUa7b5IWsx0KmrodDo6W+EDy62mq50XiwhlyW2/X2nNoSC TzwT5iV73JLJshn+nuEGEHhkYdBw+3YSsuvgJYCuXJMBA0AhoIOD5oN0PW7CLwZb t/1h/Npy0Jr1Pdh9utQ8V1Jo6rp4YXowAkNRkDY5QbYv91I3FPgssA3bUIvoW2Bw 46TB2EKhSVzfl4FpZghtYHjAf0gZbAuQYLGtxf2WtSTCn61REg3W/JmUOfsjPPnK JeP5zz7APJaBZ6PKsmlLbNAPzWexoQWs7ZTiHa5vIQ/mUaMaLMD714SmqL0T9jwx O6n4GpxxHyInx/kqDS/r/3OFioQLj6mKlW2OV6rRBnJ5wVZQn6QbQ30BZSTU6rsm huSgvgl7r7WnlhLT/ImKaA== =Cpsz -----END PGP SIGNATURE----- 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.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
a789c70c1d
|
|
@ -2056,6 +2056,11 @@ static int btusb_setup_csr(struct hci_dev *hdev)
|
|||
|
||||
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.
|
||||
*
|
||||
* Known fake bcdDevices: 0x0100, 0x0134, 0x1915, 0x2520, 0x7558, 0x8891
|
||||
|
|
@ -2118,6 +2123,7 @@ static int btusb_setup_csr(struct hci_dev *hdev)
|
|||
* without these the controller will lock up.
|
||||
*/
|
||||
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_NO_SUSPEND_NOTIFIER, &hdev->quirks);
|
||||
|
||||
|
|
|
|||
|
|
@ -228,6 +228,17 @@ enum {
|
|||
*/
|
||||
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
|
||||
* registered. This is intended for devices which drop completely
|
||||
|
|
@ -1424,7 +1435,6 @@ struct hci_std_codecs_v2 {
|
|||
} __packed;
|
||||
|
||||
struct hci_vnd_codec_v2 {
|
||||
__u8 id;
|
||||
__le16 cid;
|
||||
__le16 vid;
|
||||
__u8 transport;
|
||||
|
|
|
|||
|
|
@ -972,6 +972,7 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type,
|
|||
hci_dev_lock(hdev);
|
||||
hcon = hci_conn_hash_lookup_le(hdev, addr, *addr_type);
|
||||
hci_dev_unlock(hdev);
|
||||
hci_dev_put(hdev);
|
||||
|
||||
if (!hcon)
|
||||
return -ENOENT;
|
||||
|
|
|
|||
|
|
@ -737,7 +737,7 @@ static int __init bt_init(void)
|
|||
|
||||
err = bt_sysfs_init();
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto cleanup_led;
|
||||
|
||||
err = sock_register(&bt_sock_family_ops);
|
||||
if (err)
|
||||
|
|
@ -773,6 +773,8 @@ static int __init bt_init(void)
|
|||
sock_unregister(PF_BLUETOOTH);
|
||||
cleanup_sysfs:
|
||||
bt_sysfs_cleanup();
|
||||
cleanup_led:
|
||||
bt_leds_cleanup();
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,9 +72,8 @@ static void hci_read_codec_capabilities(struct hci_dev *hdev, __u8 transport,
|
|||
continue;
|
||||
}
|
||||
|
||||
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_CODEC_CAPS,
|
||||
sizeof(*cmd), cmd,
|
||||
HCI_CMD_TIMEOUT);
|
||||
skb = __hci_cmd_sync_sk(hdev, HCI_OP_READ_LOCAL_CODEC_CAPS,
|
||||
sizeof(*cmd), cmd, 0, HCI_CMD_TIMEOUT, NULL);
|
||||
if (IS_ERR(skb)) {
|
||||
bt_dev_err(hdev, "Failed to read codec capabilities (%ld)",
|
||||
PTR_ERR(skb));
|
||||
|
|
@ -127,8 +126,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev)
|
|||
struct hci_op_read_local_codec_caps caps;
|
||||
__u8 i;
|
||||
|
||||
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_CODECS, 0, NULL,
|
||||
HCI_CMD_TIMEOUT);
|
||||
skb = __hci_cmd_sync_sk(hdev, HCI_OP_READ_LOCAL_CODECS, 0, NULL,
|
||||
0, HCI_CMD_TIMEOUT, NULL);
|
||||
|
||||
if (IS_ERR(skb)) {
|
||||
bt_dev_err(hdev, "Failed to read local supported codecs (%ld)",
|
||||
|
|
@ -158,7 +157,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev)
|
|||
for (i = 0; i < std_codecs->num; i++) {
|
||||
caps.id = std_codecs->codec[i];
|
||||
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)
|
||||
|
|
@ -178,7 +178,8 @@ void hci_read_supported_codecs(struct hci_dev *hdev)
|
|||
caps.cid = vnd_codecs->codec[i].cid;
|
||||
caps.vid = vnd_codecs->codec[i].vid;
|
||||
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:
|
||||
|
|
@ -194,8 +195,8 @@ void hci_read_supported_codecs_v2(struct hci_dev *hdev)
|
|||
struct hci_op_read_local_codec_caps caps;
|
||||
__u8 i;
|
||||
|
||||
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_CODECS_V2, 0, NULL,
|
||||
HCI_CMD_TIMEOUT);
|
||||
skb = __hci_cmd_sync_sk(hdev, HCI_OP_READ_LOCAL_CODECS_V2, 0, NULL,
|
||||
0, HCI_CMD_TIMEOUT, NULL);
|
||||
|
||||
if (IS_ERR(skb)) {
|
||||
bt_dev_err(hdev, "Failed to read local supported codecs (%ld)",
|
||||
|
|
|
|||
|
|
@ -2764,7 +2764,8 @@ int hci_register_suspend_notifier(struct hci_dev *hdev)
|
|||
{
|
||||
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;
|
||||
ret = register_pm_notifier(&hdev->suspend_notifier);
|
||||
}
|
||||
|
|
@ -2776,8 +2777,11 @@ int hci_unregister_suspend_notifier(struct hci_dev *hdev)
|
|||
{
|
||||
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);
|
||||
if (!ret)
|
||||
hdev->suspend_notifier.notifier_call = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <net/bluetooth/mgmt.h>
|
||||
|
||||
#include "hci_request.h"
|
||||
#include "hci_codec.h"
|
||||
#include "hci_debugfs.h"
|
||||
#include "smp.h"
|
||||
#include "eir.h"
|
||||
|
|
@ -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)
|
||||
{
|
||||
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 __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)
|
|||
/* Read local codec list if the HCI command is supported */
|
||||
static int hci_read_local_codecs_sync(struct hci_dev *hdev)
|
||||
{
|
||||
if (!(hdev->commands[29] & 0x20))
|
||||
return 0;
|
||||
if (hdev->commands[45] & 0x04)
|
||||
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,
|
||||
HCI_CMD_TIMEOUT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 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)
|
|||
bool enabled = hci_dev_test_flag(hdev, HCI_WIDEBAND_SPEECH_ENABLED);
|
||||
|
||||
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;
|
||||
|
||||
if (enabled == hdev->err_data_reporting)
|
||||
|
|
@ -4457,6 +4461,9 @@ static const struct {
|
|||
HCI_QUIRK_BROKEN(STORED_LINK_KEY,
|
||||
"HCI Delete Stored Link Key command is advertised, "
|
||||
"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 Read Transmit Power Level command is advertised, "
|
||||
"but not supported."),
|
||||
|
|
|
|||
|
|
@ -879,6 +879,7 @@ static int iso_listen_bis(struct sock *sk)
|
|||
iso_pi(sk)->bc_sid);
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
hci_dev_put(hdev);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4453,7 +4453,8 @@ static inline int l2cap_config_req(struct l2cap_conn *conn,
|
|||
|
||||
chan->ident = cmd->ident;
|
||||
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. */
|
||||
chan->conf_len = 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user