Bluetooth: Fix support for Read Local Supported Codecs V2
authorChethan T N <chethan.tumkur.narayan@intel.com>
Tue, 22 Nov 2022 09:02:57 +0000 (14:32 +0530)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 2 Dec 2022 21:09:31 +0000 (13:09 -0800)
Handling of Read Local Supported Codecs was broken during the
HCI serialization design change patches.

Fixes: d0b137062b2d ("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>
net/bluetooth/hci_codec.c
net/bluetooth/hci_sync.c

index 3820153..3cc135b 100644 (file)
@@ -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)",
index a91145e..1fc6931 100644 (file)
@@ -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"
@@ -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 */
 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 */