Merge 5.16-rc5 into usb-next
[linux-2.6-microblaze.git] / drivers / usb / gadget / composite.c
index 284eea9..7dce462 100644 (file)
@@ -159,6 +159,8 @@ int config_ep_by_speed_and_alt(struct usb_gadget *g,
        int want_comp_desc = 0;
 
        struct usb_descriptor_header **d_spd; /* cursor for speed desc */
+       struct usb_composite_dev *cdev;
+       bool incomplete_desc = false;
 
        if (!g || !f || !_ep)
                return -EIO;
@@ -167,28 +169,43 @@ int config_ep_by_speed_and_alt(struct usb_gadget *g,
        switch (g->speed) {
        case USB_SPEED_SUPER_PLUS:
                if (gadget_is_superspeed_plus(g)) {
-                       speed_desc = f->ssp_descriptors;
-                       want_comp_desc = 1;
-                       break;
+                       if (f->ssp_descriptors) {
+                               speed_desc = f->ssp_descriptors;
+                               want_comp_desc = 1;
+                               break;
+                       }
+                       incomplete_desc = true;
                }
                fallthrough;
        case USB_SPEED_SUPER:
                if (gadget_is_superspeed(g)) {
-                       speed_desc = f->ss_descriptors;
-                       want_comp_desc = 1;
-                       break;
+                       if (f->ss_descriptors) {
+                               speed_desc = f->ss_descriptors;
+                               want_comp_desc = 1;
+                               break;
+                       }
+                       incomplete_desc = true;
                }
                fallthrough;
        case USB_SPEED_HIGH:
                if (gadget_is_dualspeed(g)) {
-                       speed_desc = f->hs_descriptors;
-                       break;
+                       if (f->hs_descriptors) {
+                               speed_desc = f->hs_descriptors;
+                               break;
+                       }
+                       incomplete_desc = true;
                }
                fallthrough;
        default:
                speed_desc = f->fs_descriptors;
        }
 
+       cdev = get_gadget_data(g);
+       if (incomplete_desc)
+               WARNING(cdev,
+                       "%s doesn't hold the descriptors for current speed\n",
+                       f->name);
+
        /* find correct alternate setting descriptor */
        for_each_desc(speed_desc, d_spd, USB_DT_INTERFACE) {
                int_desc = (struct usb_interface_descriptor *)*d_spd;
@@ -244,12 +261,8 @@ ep_found:
                        _ep->maxburst = comp_desc->bMaxBurst + 1;
                        break;
                default:
-                       if (comp_desc->bMaxBurst != 0) {
-                               struct usb_composite_dev *cdev;
-
-                               cdev = get_gadget_data(g);
+                       if (comp_desc->bMaxBurst != 0)
                                ERROR(cdev, "ep0 bMaxBurst must be 0\n");
-                       }
                        _ep->maxburst = 1;
                        break;
                }