Linux upstream usb_assign_descriptors() now takes four sets of
descriptors. Add the missing super speed plus descriptors.

Signed-off-by: Sascha Hauer <[email protected]>
---
 drivers/usb/gadget/config.c                  | 8 +++++++-
 drivers/usb/gadget/function/dfu.c            | 2 +-
 drivers/usb/gadget/function/f_acm.c          | 2 +-
 drivers/usb/gadget/function/f_fastboot.c     | 2 +-
 drivers/usb/gadget/function/f_mass_storage.c | 2 +-
 drivers/usb/gadget/function/f_serial.c       | 2 +-
 include/linux/usb/composite.h                | 1 +
 include/linux/usb/gadget.h                   | 3 ++-
 8 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/gadget/config.c b/drivers/usb/gadget/config.c
index 979cfafa70..27e4dda52f 100644
--- a/drivers/usb/gadget/config.c
+++ b/drivers/usb/gadget/config.c
@@ -152,7 +152,8 @@ EXPORT_SYMBOL_GPL(usb_copy_descriptors);
 int usb_assign_descriptors(struct usb_function *f,
                struct usb_descriptor_header **fs,
                struct usb_descriptor_header **hs,
-               struct usb_descriptor_header **ss)
+               struct usb_descriptor_header **ss,
+               struct usb_descriptor_header **ssp)
 {
        struct usb_gadget *g = f->config->cdev->gadget;
 
@@ -171,6 +172,11 @@ int usb_assign_descriptors(struct usb_function *f,
                if (!f->ss_descriptors)
                        goto err;
        }
+       if (ssp && gadget_is_superspeed_plus(g)) {
+               f->ssp_descriptors = usb_copy_descriptors(ssp);
+               if (!f->ssp_descriptors)
+                       goto err;
+       }
        return 0;
 err:
        usb_free_all_descriptors(f);
diff --git a/drivers/usb/gadget/function/dfu.c 
b/drivers/usb/gadget/function/dfu.c
index 930a10b766..e6ba829a85 100644
--- a/drivers/usb/gadget/function/dfu.c
+++ b/drivers/usb/gadget/function/dfu.c
@@ -427,7 +427,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function 
*f)
        header[i] = (struct usb_descriptor_header *) &usb_dfu_func;
        header[i + 1] = NULL;
 
-       status = usb_assign_descriptors(f, header, header, NULL);
+       status = usb_assign_descriptors(f, header, header, NULL, NULL);
 
        free(desc);
        free(header);
diff --git a/drivers/usb/gadget/function/f_acm.c 
b/drivers/usb/gadget/function/f_acm.c
index 1210622d96..3532fd5892 100644
--- a/drivers/usb/gadget/function/f_acm.c
+++ b/drivers/usb/gadget/function/f_acm.c
@@ -678,7 +678,7 @@ acm_bind(struct usb_configuration *c, struct usb_function 
*f)
        acm_ss_out_desc.bEndpointAddress = acm_fs_out_desc.bEndpointAddress;
 
        status = usb_assign_descriptors(f, acm_fs_function, acm_hs_function,
-                       acm_ss_function);
+                       acm_ss_function, acm_ss_function);
        if (status)
                goto fail;
 
diff --git a/drivers/usb/gadget/function/f_fastboot.c 
b/drivers/usb/gadget/function/f_fastboot.c
index 499262a64b..4e9c373796 100644
--- a/drivers/usb/gadget/function/f_fastboot.c
+++ b/drivers/usb/gadget/function/f_fastboot.c
@@ -266,7 +266,7 @@ static int fastboot_bind(struct usb_configuration *c, 
struct usb_function *f)
        f_fb->out_req->complete = rx_handler_command;
        f_fb->out_req->context = f_fb;
 
-       ret = usb_assign_descriptors(f, fb_fs_descs, fb_hs_descs, NULL);
+       ret = usb_assign_descriptors(f, fb_fs_descs, fb_hs_descs, NULL, NULL);
        if (ret)
                goto err_free_in_req;
 
diff --git a/drivers/usb/gadget/function/f_mass_storage.c 
b/drivers/usb/gadget/function/f_mass_storage.c
index 61f369bd07..4e9777994e 100644
--- a/drivers/usb/gadget/function/f_mass_storage.c
+++ b/drivers/usb/gadget/function/f_mass_storage.c
@@ -2666,7 +2666,7 @@ static int fsg_bind(struct usb_configuration *c, struct 
usb_function *f)
        }
 
        /* Copy descriptors */
-       return usb_assign_descriptors(f, fsg_fs_function, hs_function, NULL);
+       return usb_assign_descriptors(f, fsg_fs_function, fsg_hs_function, 
NULL, NULL);
 
 autoconf_fail:
        ERROR(fsg, "unable to autoconfigure all endpoints\n");
diff --git a/drivers/usb/gadget/function/f_serial.c 
b/drivers/usb/gadget/function/f_serial.c
index 494f6c872e..a768c580ea 100644
--- a/drivers/usb/gadget/function/f_serial.c
+++ b/drivers/usb/gadget/function/f_serial.c
@@ -231,7 +231,7 @@ static int gser_bind(struct usb_configuration *c, struct 
usb_function *f)
        gser_ss_out_desc.bEndpointAddress = gser_fs_out_desc.bEndpointAddress;
 
        status = usb_assign_descriptors(f, gser_fs_function, gser_hs_function,
-                       gser_ss_function);
+                       gser_ss_function, gser_ss_function);
        if (status)
                goto fail;
        DBG(cdev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n",
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
index 26e6fe5c47..7bd89b1de1 100644
--- a/include/linux/usb/composite.h
+++ b/include/linux/usb/composite.h
@@ -125,6 +125,7 @@ struct usb_function {
        struct usb_descriptor_header    **fs_descriptors;
        struct usb_descriptor_header    **hs_descriptors;
        struct usb_descriptor_header    **ss_descriptors;
+       struct usb_descriptor_header    **ssp_descriptors;
 
        struct usb_configuration        *config;
 
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index a9b45bb824..d4c02cb37c 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -855,7 +855,8 @@ struct usb_function;
 int usb_assign_descriptors(struct usb_function *f,
                struct usb_descriptor_header **fs,
                struct usb_descriptor_header **hs,
-               struct usb_descriptor_header **ss);
+               struct usb_descriptor_header **ss,
+               struct usb_descriptor_header **ssp);
 void usb_free_all_descriptors(struct usb_function *f);
 
 struct usb_descriptor_header *usb_otg_descriptor_alloc(
-- 
2.30.2


Reply via email to