]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
usb: gadget: f_uac2: fix AC Interface Header Descriptor wTotalLength
authorRuslan Bilovol <ruslan.bilovol@gmail.com>
Fri, 3 Jul 2020 13:49:03 +0000 (16:49 +0300)
committerThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Fri, 4 Sep 2020 19:29:12 +0000 (16:29 -0300)
BugLink: https://bugs.launchpad.net/bugs/1892417
[ Upstream commit a9cf8715180b18c62addbfe6f6267b8101903119 ]

As per UAC2 spec (ch. 4.7.2), wTotalLength of AC Interface
Header Descriptor "includes the combined length of this
descriptor header and all Clock Source, Unit and Terminal
descriptors."

Thus add its size to its wTotalLength.

Also after recent changes wTotalLength is calculated
dynamically, update static definition of uac2_ac_header_descriptor
accordingly

Fixes: 132fcb460839 ("usb: gadget: Add Audio Class 2.0 Driver")
Signed-off-by: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
drivers/usb/gadget/function/f_uac2.c

index db2d4980cb3549b51e187a1bd5788d52f2120e49..3633df6d7610f04e1d6b1142e9d8c2223900d806 100644 (file)
@@ -215,10 +215,7 @@ static struct uac2_ac_header_descriptor ac_hdr_desc = {
        .bDescriptorSubtype = UAC_MS_HEADER,
        .bcdADC = cpu_to_le16(0x200),
        .bCategory = UAC2_FUNCTION_IO_BOX,
-       .wTotalLength = cpu_to_le16(sizeof in_clk_src_desc
-                       + sizeof out_clk_src_desc + sizeof usb_out_it_desc
-                       + sizeof io_in_it_desc + sizeof usb_in_ot_desc
-                       + sizeof io_out_ot_desc),
+       /* .wTotalLength = DYNAMIC */
        .bmControls = 0,
 };
 
@@ -501,7 +498,7 @@ static void setup_descriptor(struct f_uac2_opts *opts)
        as_in_hdr_desc.bTerminalLink = usb_in_ot_desc.bTerminalID;
 
        iad_desc.bInterfaceCount = 1;
-       ac_hdr_desc.wTotalLength = 0;
+       ac_hdr_desc.wTotalLength = cpu_to_le16(sizeof(ac_hdr_desc));
 
        if (EPIN_EN(opts)) {
                u16 len = le16_to_cpu(ac_hdr_desc.wTotalLength);