mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 05:06:29 +00:00
Bluetooth: Fix support for Read Local Supported Codecs V2
Handling of Read Local Supported Codecs was broken during the
HCI serialization design change patches.
Fixes: d0b137062b
("Bluetooth: hci_sync: Rework init stages")
Signed-off-by: Chethan T N <chethan.tumkur.narayan@intel.com>
Signed-off-by: Kiran K <kiran.k@intel.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
93df7d56f1
commit
828cea2b71
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)",
|
||||||
|
@ -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"
|
||||||
@ -4239,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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user