Commit 828cea2b authored by Chethan T N's avatar Chethan T N Committed by Luiz Augusto von Dentz

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: d0b13706 ("Bluetooth: hci_sync: Rework init stages")
Signed-off-by: default avatarChethan T N <chethan.tumkur.narayan@intel.com>
Signed-off-by: default avatarKiran K <kiran.k@intel.com>
Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
parent 93df7d56
...@@ -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)",
......
...@@ -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"
...@@ -4239,11 +4240,12 @@ static int hci_set_event_mask_page_2_sync(struct hci_dev *hdev) ...@@ -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 */
......
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