Loading drivers/usb/gadget/composite.c +23 −52 Original line number Diff line number Diff line Loading @@ -1566,6 +1566,7 @@ static int fill_ext_compat(struct usb_configuration *c, u8 *buf) int i, count; count = 16; buf += 16; for (i = 0; i < c->next_interface_id; ++i) { struct usb_function *f; int j; Loading Loading @@ -1641,6 +1642,7 @@ static int fill_ext_prop(struct usb_configuration *c, int interface, u8 *buf) f = c->interface[interface]; count = 10; /* header length */ buf += 10; for (j = 0; j < f->os_desc_n; ++j) { if (interface != f->os_desc_table[j].if_id) continue; Loading Loading @@ -1980,7 +1982,6 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) if (w_index != 0x4 || (w_value >> 8)) break; buf[6] = w_index; if (w_length == 0x10) { /* Number of ext compat interfaces */ count = count_ext_compat(os_desc_cfg); buf[8] = count; Loading @@ -1988,14 +1989,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) count += 16; /* header */ put_unaligned_le32(count, buf); value = w_length; } else { /* "extended compatibility ID"s */ count = count_ext_compat(os_desc_cfg); buf[8] = count; count *= 24; /* 24 B/ext compat desc */ count += 16; /* header */ put_unaligned_le32(count, buf); buf += 16; if (w_length > 0x10) { value = fill_ext_compat(os_desc_cfg, buf); value = min_t(u16, w_length, value); } Loading @@ -2005,47 +1999,23 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) break; interface = w_value & 0xFF; buf[6] = w_index; if (w_length == 0x0A) { count = count_ext_prop(os_desc_cfg, interface); put_unaligned_le16(count, buf + 8); count = len_ext_prop(os_desc_cfg, interface); put_unaligned_le32(count, buf); value = w_length; } else { count = count_ext_prop(os_desc_cfg, interface); put_unaligned_le16(count, buf + 8); count = len_ext_prop(os_desc_cfg, interface); put_unaligned_le32(count, buf); buf += 10; if (w_length > 0x0A) { value = fill_ext_prop(os_desc_cfg, interface, buf); if (value < 0) return value; value = min_t(u16, w_length, value); if (value >= 0) value = min_t(u16, w_length, value); } break; } if (value >= 0) { req->length = value; req->context = cdev; req->zero = value < w_length; value = composite_ep0_queue(cdev, req, GFP_ATOMIC); if (value < 0) { DBG(cdev, "ep_queue --> %d\n", value); req->status = 0; if (value != -ESHUTDOWN) composite_setup_complete( gadget->ep0, req); } } return value; goto check_value; } VDBG(cdev, Loading Loading @@ -2119,6 +2089,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) goto done; } check_value: /* respond with data transfer before status phase? */ if (value >= 0 && value != USB_GADGET_DELAYED_STATUS) { req->length = value; Loading Loading
drivers/usb/gadget/composite.c +23 −52 Original line number Diff line number Diff line Loading @@ -1566,6 +1566,7 @@ static int fill_ext_compat(struct usb_configuration *c, u8 *buf) int i, count; count = 16; buf += 16; for (i = 0; i < c->next_interface_id; ++i) { struct usb_function *f; int j; Loading Loading @@ -1641,6 +1642,7 @@ static int fill_ext_prop(struct usb_configuration *c, int interface, u8 *buf) f = c->interface[interface]; count = 10; /* header length */ buf += 10; for (j = 0; j < f->os_desc_n; ++j) { if (interface != f->os_desc_table[j].if_id) continue; Loading Loading @@ -1980,7 +1982,6 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) if (w_index != 0x4 || (w_value >> 8)) break; buf[6] = w_index; if (w_length == 0x10) { /* Number of ext compat interfaces */ count = count_ext_compat(os_desc_cfg); buf[8] = count; Loading @@ -1988,14 +1989,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) count += 16; /* header */ put_unaligned_le32(count, buf); value = w_length; } else { /* "extended compatibility ID"s */ count = count_ext_compat(os_desc_cfg); buf[8] = count; count *= 24; /* 24 B/ext compat desc */ count += 16; /* header */ put_unaligned_le32(count, buf); buf += 16; if (w_length > 0x10) { value = fill_ext_compat(os_desc_cfg, buf); value = min_t(u16, w_length, value); } Loading @@ -2005,47 +1999,23 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) break; interface = w_value & 0xFF; buf[6] = w_index; if (w_length == 0x0A) { count = count_ext_prop(os_desc_cfg, interface); put_unaligned_le16(count, buf + 8); count = len_ext_prop(os_desc_cfg, interface); put_unaligned_le32(count, buf); value = w_length; } else { count = count_ext_prop(os_desc_cfg, interface); put_unaligned_le16(count, buf + 8); count = len_ext_prop(os_desc_cfg, interface); put_unaligned_le32(count, buf); buf += 10; if (w_length > 0x0A) { value = fill_ext_prop(os_desc_cfg, interface, buf); if (value < 0) return value; value = min_t(u16, w_length, value); if (value >= 0) value = min_t(u16, w_length, value); } break; } if (value >= 0) { req->length = value; req->context = cdev; req->zero = value < w_length; value = composite_ep0_queue(cdev, req, GFP_ATOMIC); if (value < 0) { DBG(cdev, "ep_queue --> %d\n", value); req->status = 0; if (value != -ESHUTDOWN) composite_setup_complete( gadget->ep0, req); } } return value; goto check_value; } VDBG(cdev, Loading Loading @@ -2119,6 +2089,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) goto done; } check_value: /* respond with data transfer before status phase? */ if (value >= 0 && value != USB_GADGET_DELAYED_STATUS) { req->length = value; Loading