aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-06-24 09:58:58 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-06-24 09:58:58 -0400
commit135e7d0d4a488df06c2301c74e190a8aff6f75ab (patch)
tree6e49ce0dfd101cd439414eee9b9f46ef658fb561
parenta497c3ba1d97fc69c1e78e7b96435ba8c2cb42ee (diff)
parent5d881802c407d83c169c875dad88fe2bba066c33 (diff)
Merge tag 'fixes-for-v3.16-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
usb: fixes for v3.16-rc2 dwc3-omap won't crash anymore on module removal and suspend/resume won't kill xHCI interrupts. MUSB got a fix to handle Babble condition only in host mode, how it should be. The f_fs function driver got a fix for a NULL pointer dereference. Renesas gadget got a fix for Status stage handling. Signed-of-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/dwc3/Kconfig1
-rw-r--r--drivers/usb/dwc3/dwc3-omap.c17
-rw-r--r--drivers/usb/dwc3/gadget.c8
-rw-r--r--drivers/usb/gadget/configfs.c37
-rw-r--r--drivers/usb/gadget/configfs.h1
-rw-r--r--drivers/usb/gadget/f_fs.c12
-rw-r--r--drivers/usb/gadget/f_rndis.c6
-rw-r--r--drivers/usb/gadget/inode.c7
-rw-r--r--drivers/usb/gadget/u_ether.c3
-rw-r--r--drivers/usb/musb/musb_core.c2
-rw-r--r--drivers/usb/musb/ux500.c1
-rw-r--r--drivers/usb/renesas_usbhs/fifo.c8
-rw-r--r--include/uapi/linux/usb/functionfs.h2
-rw-r--r--tools/usb/Makefile6
-rw-r--r--tools/usb/ffs-test.c20
15 files changed, 92 insertions, 39 deletions
diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index 8eb996e4f058..261c3b428220 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -45,6 +45,7 @@ comment "Platform Glue Driver Support"
45config USB_DWC3_OMAP 45config USB_DWC3_OMAP
46 tristate "Texas Instruments OMAP5 and similar Platforms" 46 tristate "Texas Instruments OMAP5 and similar Platforms"
47 depends on EXTCON && (ARCH_OMAP2PLUS || COMPILE_TEST) 47 depends on EXTCON && (ARCH_OMAP2PLUS || COMPILE_TEST)
48 depends on OF
48 default USB_DWC3 49 default USB_DWC3
49 help 50 help
50 Some platforms from Texas Instruments like OMAP5, DRA7xxx and 51 Some platforms from Texas Instruments like OMAP5, DRA7xxx and
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index 4af4c3567656..07a736acd0f2 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -322,7 +322,7 @@ static int dwc3_omap_remove_core(struct device *dev, void *c)
322{ 322{
323 struct platform_device *pdev = to_platform_device(dev); 323 struct platform_device *pdev = to_platform_device(dev);
324 324
325 platform_device_unregister(pdev); 325 of_device_unregister(pdev);
326 326
327 return 0; 327 return 0;
328} 328}
@@ -599,7 +599,7 @@ static int dwc3_omap_prepare(struct device *dev)
599{ 599{
600 struct dwc3_omap *omap = dev_get_drvdata(dev); 600 struct dwc3_omap *omap = dev_get_drvdata(dev);
601 601
602 dwc3_omap_disable_irqs(omap); 602 dwc3_omap_write_irqmisc_set(omap, 0x00);
603 603
604 return 0; 604 return 0;
605} 605}
@@ -607,8 +607,19 @@ static int dwc3_omap_prepare(struct device *dev)
607static void dwc3_omap_complete(struct device *dev) 607static void dwc3_omap_complete(struct device *dev)
608{ 608{
609 struct dwc3_omap *omap = dev_get_drvdata(dev); 609 struct dwc3_omap *omap = dev_get_drvdata(dev);
610 u32 reg;
610 611
611 dwc3_omap_enable_irqs(omap); 612 reg = (USBOTGSS_IRQMISC_OEVT |
613 USBOTGSS_IRQMISC_DRVVBUS_RISE |
614 USBOTGSS_IRQMISC_CHRGVBUS_RISE |
615 USBOTGSS_IRQMISC_DISCHRGVBUS_RISE |
616 USBOTGSS_IRQMISC_IDPULLUP_RISE |
617 USBOTGSS_IRQMISC_DRVVBUS_FALL |
618 USBOTGSS_IRQMISC_CHRGVBUS_FALL |
619 USBOTGSS_IRQMISC_DISCHRGVBUS_FALL |
620 USBOTGSS_IRQMISC_IDPULLUP_FALL);
621
622 dwc3_omap_write_irqmisc_set(omap, reg);
612} 623}
613 624
614static int dwc3_omap_suspend(struct device *dev) 625static int dwc3_omap_suspend(struct device *dev)
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 9d64dd02c57e..dab7927d1009 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -828,10 +828,6 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
828 length, last ? " last" : "", 828 length, last ? " last" : "",
829 chain ? " chain" : ""); 829 chain ? " chain" : "");
830 830
831 /* Skip the LINK-TRB on ISOC */
832 if (((dep->free_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
833 usb_endpoint_xfer_isoc(dep->endpoint.desc))
834 dep->free_slot++;
835 831
836 trb = &dep->trb_pool[dep->free_slot & DWC3_TRB_MASK]; 832 trb = &dep->trb_pool[dep->free_slot & DWC3_TRB_MASK];
837 833
@@ -843,6 +839,10 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
843 } 839 }
844 840
845 dep->free_slot++; 841 dep->free_slot++;
842 /* Skip the LINK-TRB on ISOC */
843 if (((dep->free_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
844 usb_endpoint_xfer_isoc(dep->endpoint.desc))
845 dep->free_slot++;
846 846
847 trb->size = DWC3_TRB_SIZE_LENGTH(length); 847 trb->size = DWC3_TRB_SIZE_LENGTH(length);
848 trb->bpl = lower_32_bits(dma); 848 trb->bpl = lower_32_bits(dma);
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index 2ddcd635ca2a..97142146eead 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -1145,15 +1145,15 @@ static struct configfs_item_operations interf_item_ops = {
1145 .store_attribute = usb_os_desc_attr_store, 1145 .store_attribute = usb_os_desc_attr_store,
1146}; 1146};
1147 1147
1148static ssize_t rndis_grp_compatible_id_show(struct usb_os_desc *desc, 1148static ssize_t interf_grp_compatible_id_show(struct usb_os_desc *desc,
1149 char *page) 1149 char *page)
1150{ 1150{
1151 memcpy(page, desc->ext_compat_id, 8); 1151 memcpy(page, desc->ext_compat_id, 8);
1152 return 8; 1152 return 8;
1153} 1153}
1154 1154
1155static ssize_t rndis_grp_compatible_id_store(struct usb_os_desc *desc, 1155static ssize_t interf_grp_compatible_id_store(struct usb_os_desc *desc,
1156 const char *page, size_t len) 1156 const char *page, size_t len)
1157{ 1157{
1158 int l; 1158 int l;
1159 1159
@@ -1171,20 +1171,20 @@ static ssize_t rndis_grp_compatible_id_store(struct usb_os_desc *desc,
1171 return len; 1171 return len;
1172} 1172}
1173 1173
1174static struct usb_os_desc_attribute rndis_grp_attr_compatible_id = 1174static struct usb_os_desc_attribute interf_grp_attr_compatible_id =
1175 __CONFIGFS_ATTR(compatible_id, S_IRUGO | S_IWUSR, 1175 __CONFIGFS_ATTR(compatible_id, S_IRUGO | S_IWUSR,
1176 rndis_grp_compatible_id_show, 1176 interf_grp_compatible_id_show,
1177 rndis_grp_compatible_id_store); 1177 interf_grp_compatible_id_store);
1178 1178
1179static ssize_t rndis_grp_sub_compatible_id_show(struct usb_os_desc *desc, 1179static ssize_t interf_grp_sub_compatible_id_show(struct usb_os_desc *desc,
1180 char *page) 1180 char *page)
1181{ 1181{
1182 memcpy(page, desc->ext_compat_id + 8, 8); 1182 memcpy(page, desc->ext_compat_id + 8, 8);
1183 return 8; 1183 return 8;
1184} 1184}
1185 1185
1186static ssize_t rndis_grp_sub_compatible_id_store(struct usb_os_desc *desc, 1186static ssize_t interf_grp_sub_compatible_id_store(struct usb_os_desc *desc,
1187 const char *page, size_t len) 1187 const char *page, size_t len)
1188{ 1188{
1189 int l; 1189 int l;
1190 1190
@@ -1202,20 +1202,21 @@ static ssize_t rndis_grp_sub_compatible_id_store(struct usb_os_desc *desc,
1202 return len; 1202 return len;
1203} 1203}
1204 1204
1205static struct usb_os_desc_attribute rndis_grp_attr_sub_compatible_id = 1205static struct usb_os_desc_attribute interf_grp_attr_sub_compatible_id =
1206 __CONFIGFS_ATTR(sub_compatible_id, S_IRUGO | S_IWUSR, 1206 __CONFIGFS_ATTR(sub_compatible_id, S_IRUGO | S_IWUSR,
1207 rndis_grp_sub_compatible_id_show, 1207 interf_grp_sub_compatible_id_show,
1208 rndis_grp_sub_compatible_id_store); 1208 interf_grp_sub_compatible_id_store);
1209 1209
1210static struct configfs_attribute *interf_grp_attrs[] = { 1210static struct configfs_attribute *interf_grp_attrs[] = {
1211 &rndis_grp_attr_compatible_id.attr, 1211 &interf_grp_attr_compatible_id.attr,
1212 &rndis_grp_attr_sub_compatible_id.attr, 1212 &interf_grp_attr_sub_compatible_id.attr,
1213 NULL 1213 NULL
1214}; 1214};
1215 1215
1216int usb_os_desc_prepare_interf_dir(struct config_group *parent, 1216int usb_os_desc_prepare_interf_dir(struct config_group *parent,
1217 int n_interf, 1217 int n_interf,
1218 struct usb_os_desc **desc, 1218 struct usb_os_desc **desc,
1219 char **names,
1219 struct module *owner) 1220 struct module *owner)
1220{ 1221{
1221 struct config_group **f_default_groups, *os_desc_group, 1222 struct config_group **f_default_groups, *os_desc_group,
@@ -1257,8 +1258,8 @@ int usb_os_desc_prepare_interf_dir(struct config_group *parent,
1257 d = desc[n_interf]; 1258 d = desc[n_interf];
1258 d->owner = owner; 1259 d->owner = owner;
1259 config_group_init_type_name(&d->group, "", interface_type); 1260 config_group_init_type_name(&d->group, "", interface_type);
1260 config_item_set_name(&d->group.cg_item, "interface.%d", 1261 config_item_set_name(&d->group.cg_item, "interface.%s",
1261 n_interf); 1262 names[n_interf]);
1262 interface_groups[n_interf] = &d->group; 1263 interface_groups[n_interf] = &d->group;
1263 } 1264 }
1264 1265
diff --git a/drivers/usb/gadget/configfs.h b/drivers/usb/gadget/configfs.h
index a14ac792c698..36c468c4f5e9 100644
--- a/drivers/usb/gadget/configfs.h
+++ b/drivers/usb/gadget/configfs.h
@@ -8,6 +8,7 @@ void unregister_gadget_item(struct config_item *item);
8int usb_os_desc_prepare_interf_dir(struct config_group *parent, 8int usb_os_desc_prepare_interf_dir(struct config_group *parent,
9 int n_interf, 9 int n_interf,
10 struct usb_os_desc **desc, 10 struct usb_os_desc **desc,
11 char **names,
11 struct module *owner); 12 struct module *owner);
12 13
13static inline struct usb_os_desc *to_usb_os_desc(struct config_item *item) 14static inline struct usb_os_desc *to_usb_os_desc(struct config_item *item)
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c
index 74202d67f911..8598c27c7d43 100644
--- a/drivers/usb/gadget/f_fs.c
+++ b/drivers/usb/gadget/f_fs.c
@@ -1483,11 +1483,13 @@ static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev)
1483 ffs->ep0req->context = ffs; 1483 ffs->ep0req->context = ffs;
1484 1484
1485 lang = ffs->stringtabs; 1485 lang = ffs->stringtabs;
1486 for (lang = ffs->stringtabs; *lang; ++lang) { 1486 if (lang) {
1487 struct usb_string *str = (*lang)->strings; 1487 for (; *lang; ++lang) {
1488 int id = first_id; 1488 struct usb_string *str = (*lang)->strings;
1489 for (; str->s; ++id, ++str) 1489 int id = first_id;
1490 str->id = id; 1490 for (; str->s; ++id, ++str)
1491 str->id = id;
1492 }
1491 } 1493 }
1492 1494
1493 ffs->gadget = cdev->gadget; 1495 ffs->gadget = cdev->gadget;
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
index eed3ad878047..9c41e9515b8e 100644
--- a/drivers/usb/gadget/f_rndis.c
+++ b/drivers/usb/gadget/f_rndis.c
@@ -687,7 +687,7 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
687 f->os_desc_table = kzalloc(sizeof(*f->os_desc_table), 687 f->os_desc_table = kzalloc(sizeof(*f->os_desc_table),
688 GFP_KERNEL); 688 GFP_KERNEL);
689 if (!f->os_desc_table) 689 if (!f->os_desc_table)
690 return PTR_ERR(f->os_desc_table); 690 return -ENOMEM;
691 f->os_desc_n = 1; 691 f->os_desc_n = 1;
692 f->os_desc_table[0].os_desc = &rndis_opts->rndis_os_desc; 692 f->os_desc_table[0].os_desc = &rndis_opts->rndis_os_desc;
693 } 693 }
@@ -905,6 +905,7 @@ static struct usb_function_instance *rndis_alloc_inst(void)
905{ 905{
906 struct f_rndis_opts *opts; 906 struct f_rndis_opts *opts;
907 struct usb_os_desc *descs[1]; 907 struct usb_os_desc *descs[1];
908 char *names[1];
908 909
909 opts = kzalloc(sizeof(*opts), GFP_KERNEL); 910 opts = kzalloc(sizeof(*opts), GFP_KERNEL);
910 if (!opts) 911 if (!opts)
@@ -922,8 +923,9 @@ static struct usb_function_instance *rndis_alloc_inst(void)
922 INIT_LIST_HEAD(&opts->rndis_os_desc.ext_prop); 923 INIT_LIST_HEAD(&opts->rndis_os_desc.ext_prop);
923 924
924 descs[0] = &opts->rndis_os_desc; 925 descs[0] = &opts->rndis_os_desc;
926 names[0] = "rndis";
925 usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs, 927 usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs,
926 THIS_MODULE); 928 names, THIS_MODULE);
927 config_group_init_type_name(&opts->func_inst.group, "", 929 config_group_init_type_name(&opts->func_inst.group, "",
928 &rndis_func_type); 930 &rndis_func_type);
929 931
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
index ee6c16416c30..2e4ce7704908 100644
--- a/drivers/usb/gadget/inode.c
+++ b/drivers/usb/gadget/inode.c
@@ -1264,8 +1264,13 @@ dev_release (struct inode *inode, struct file *fd)
1264 1264
1265 kfree (dev->buf); 1265 kfree (dev->buf);
1266 dev->buf = NULL; 1266 dev->buf = NULL;
1267 put_dev (dev);
1268 1267
1268 /* other endpoints were all decoupled from this device */
1269 spin_lock_irq(&dev->lock);
1270 dev->state = STATE_DEV_DISABLED;
1271 spin_unlock_irq(&dev->lock);
1272
1273 put_dev (dev);
1269 return 0; 1274 return 0;
1270} 1275}
1271 1276
diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
index 3d78a8844e43..97b027724ee7 100644
--- a/drivers/usb/gadget/u_ether.c
+++ b/drivers/usb/gadget/u_ether.c
@@ -1120,7 +1120,10 @@ void gether_disconnect(struct gether *link)
1120 1120
1121 DBG(dev, "%s\n", __func__); 1121 DBG(dev, "%s\n", __func__);
1122 1122
1123 netif_tx_lock(dev->net);
1123 netif_stop_queue(dev->net); 1124 netif_stop_queue(dev->net);
1125 netif_tx_unlock(dev->net);
1126
1124 netif_carrier_off(dev->net); 1127 netif_carrier_off(dev->net);
1125 1128
1126 /* disable endpoints, forcing (synchronous) completion 1129 /* disable endpoints, forcing (synchronous) completion
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 61da471b7aed..eff3c5cf84f4 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -849,7 +849,7 @@ b_host:
849 } 849 }
850 850
851 /* handle babble condition */ 851 /* handle babble condition */
852 if (int_usb & MUSB_INTR_BABBLE) 852 if (int_usb & MUSB_INTR_BABBLE && is_host_active(musb))
853 schedule_work(&musb->recover_work); 853 schedule_work(&musb->recover_work);
854 854
855#if 0 855#if 0
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c
index c2e45e632723..f202e5088461 100644
--- a/drivers/usb/musb/ux500.c
+++ b/drivers/usb/musb/ux500.c
@@ -274,7 +274,6 @@ static int ux500_probe(struct platform_device *pdev)
274 musb->dev.parent = &pdev->dev; 274 musb->dev.parent = &pdev->dev;
275 musb->dev.dma_mask = &pdev->dev.coherent_dma_mask; 275 musb->dev.dma_mask = &pdev->dev.coherent_dma_mask;
276 musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask; 276 musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask;
277 musb->dev.of_node = pdev->dev.of_node;
278 277
279 glue->dev = &pdev->dev; 278 glue->dev = &pdev->dev;
280 glue->musb = musb; 279 glue->musb = musb;
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c
index d49f9c326035..4fd36530bfa3 100644
--- a/drivers/usb/renesas_usbhs/fifo.c
+++ b/drivers/usb/renesas_usbhs/fifo.c
@@ -681,6 +681,14 @@ usbhs_fifo_read_end:
681 usbhs_pipe_number(pipe), 681 usbhs_pipe_number(pipe),
682 pkt->length, pkt->actual, *is_done, pkt->zero); 682 pkt->length, pkt->actual, *is_done, pkt->zero);
683 683
684 /*
685 * Transmission end
686 */
687 if (*is_done) {
688 if (usbhs_pipe_is_dcp(pipe))
689 usbhs_dcp_control_transfer_done(pipe);
690 }
691
684usbhs_fifo_read_busy: 692usbhs_fifo_read_busy:
685 usbhsf_fifo_unselect(pipe, fifo); 693 usbhsf_fifo_unselect(pipe, fifo);
686 694
diff --git a/include/uapi/linux/usb/functionfs.h b/include/uapi/linux/usb/functionfs.h
index 2a4b4a72a4f9..ecb3a31f7ca6 100644
--- a/include/uapi/linux/usb/functionfs.h
+++ b/include/uapi/linux/usb/functionfs.h
@@ -53,7 +53,7 @@ struct usb_endpoint_descriptor_no_audio {
53 * structure. Any flags that are not recognised cause the whole block to be 53 * structure. Any flags that are not recognised cause the whole block to be
54 * rejected with -ENOSYS. 54 * rejected with -ENOSYS.
55 * 55 *
56 * Legacy descriptors format: 56 * Legacy descriptors format (deprecated as of 3.14):
57 * 57 *
58 * | off | name | type | description | 58 * | off | name | type | description |
59 * |-----+-----------+--------------+--------------------------------------| 59 * |-----+-----------+--------------+--------------------------------------|
diff --git a/tools/usb/Makefile b/tools/usb/Makefile
index acf2165c04e6..d576b3bac3cf 100644
--- a/tools/usb/Makefile
+++ b/tools/usb/Makefile
@@ -6,7 +6,11 @@ WARNINGS = -Wall -Wextra
6CFLAGS = $(WARNINGS) -g -I../include 6CFLAGS = $(WARNINGS) -g -I../include
7LDFLAGS = $(PTHREAD_LIBS) 7LDFLAGS = $(PTHREAD_LIBS)
8 8
9all: testusb ffs-test 9all: testusb ffs-test ffs-test-legacy
10
11ffs-test-legacy: ffs-test.c
12 $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -DUSE_LEGACY_DESC_HEAD
13
10%: %.c 14%: %.c
11 $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) 15 $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
12 16
diff --git a/tools/usb/ffs-test.c b/tools/usb/ffs-test.c
index fe1e66b6ef40..74b353d9eb50 100644
--- a/tools/usb/ffs-test.c
+++ b/tools/usb/ffs-test.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * ffs-test.c.c -- user mode filesystem api for usb composite function 2 * ffs-test.c -- user mode filesystem api for usb composite function
3 * 3 *
4 * Copyright (C) 2010 Samsung Electronics 4 * Copyright (C) 2010 Samsung Electronics
5 * Author: Michal Nazarewicz <mina86@mina86.com> 5 * Author: Michal Nazarewicz <mina86@mina86.com>
@@ -21,6 +21,8 @@
21 21
22/* $(CROSS_COMPILE)cc -Wall -Wextra -g -o ffs-test ffs-test.c -lpthread */ 22/* $(CROSS_COMPILE)cc -Wall -Wextra -g -o ffs-test ffs-test.c -lpthread */
23 23
24/* Uncomment to make the tool use legacy FFS descriptor headers. */
25/* #define USE_LEGACY_DESC_HEAD */
24 26
25#define _BSD_SOURCE /* for endian.h */ 27#define _BSD_SOURCE /* for endian.h */
26 28
@@ -106,7 +108,15 @@ static void _msg(unsigned level, const char *fmt, ...)
106/******************** Descriptors and Strings *******************************/ 108/******************** Descriptors and Strings *******************************/
107 109
108static const struct { 110static const struct {
109 struct usb_functionfs_descs_head header; 111 struct {
112 __le32 magic;
113 __le32 length;
114#ifndef USE_LEGACY_DESC_HEAD
115 __le32 flags;
116#endif
117 __le32 fs_count;
118 __le32 hs_count;
119 } __attribute__((packed)) header;
110 struct { 120 struct {
111 struct usb_interface_descriptor intf; 121 struct usb_interface_descriptor intf;
112 struct usb_endpoint_descriptor_no_audio sink; 122 struct usb_endpoint_descriptor_no_audio sink;
@@ -114,7 +124,13 @@ static const struct {
114 } __attribute__((packed)) fs_descs, hs_descs; 124 } __attribute__((packed)) fs_descs, hs_descs;
115} __attribute__((packed)) descriptors = { 125} __attribute__((packed)) descriptors = {
116 .header = { 126 .header = {
127#ifdef USE_LEGACY_DESC_HEAD
117 .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC), 128 .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC),
129#else
130 .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
131 .flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC |
132 FUNCTIONFS_HAS_HS_DESC),
133#endif
118 .length = cpu_to_le32(sizeof descriptors), 134 .length = cpu_to_le32(sizeof descriptors),
119 .fs_count = 3, 135 .fs_count = 3,
120 .hs_count = 3, 136 .hs_count = 3,