]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.19-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Oct 2023 20:02:13 +0000 (22:02 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Oct 2023 20:02:13 +0000 (22:02 +0200)
added patches:
perf-disallow-mis-matched-inherited-group-reads.patch
s390-pci-fix-iommu-bitmap-allocation.patch
usb-serial-option-add-entry-for-sierra-em9191-with-new-firmware.patch
usb-serial-option-add-fibocom-to-dell-custom-modem-fm101r-gl.patch
usb-serial-option-add-telit-le910c4-wwx-0x1035-composition.patch

queue-4.19/perf-disallow-mis-matched-inherited-group-reads.patch [new file with mode: 0644]
queue-4.19/s390-pci-fix-iommu-bitmap-allocation.patch [new file with mode: 0644]
queue-4.19/series
queue-4.19/usb-serial-option-add-entry-for-sierra-em9191-with-new-firmware.patch [new file with mode: 0644]
queue-4.19/usb-serial-option-add-fibocom-to-dell-custom-modem-fm101r-gl.patch [new file with mode: 0644]
queue-4.19/usb-serial-option-add-telit-le910c4-wwx-0x1035-composition.patch [new file with mode: 0644]

diff --git a/queue-4.19/perf-disallow-mis-matched-inherited-group-reads.patch b/queue-4.19/perf-disallow-mis-matched-inherited-group-reads.patch
new file mode 100644 (file)
index 0000000..8d3cc83
--- /dev/null
@@ -0,0 +1,142 @@
+From 32671e3799ca2e4590773fd0e63aaa4229e50c06 Mon Sep 17 00:00:00 2001
+From: Peter Zijlstra <peterz@infradead.org>
+Date: Wed, 18 Oct 2023 13:56:54 +0200
+Subject: perf: Disallow mis-matched inherited group reads
+
+From: Peter Zijlstra <peterz@infradead.org>
+
+commit 32671e3799ca2e4590773fd0e63aaa4229e50c06 upstream.
+
+Because group consistency is non-atomic between parent (filedesc) and children
+(inherited) events, it is possible for PERF_FORMAT_GROUP read() to try and sum
+non-matching counter groups -- with non-sensical results.
+
+Add group_generation to distinguish the case where a parent group removes and
+adds an event and thus has the same number, but a different configuration of
+events as inherited groups.
+
+This became a problem when commit fa8c269353d5 ("perf/core: Invert
+perf_read_group() loops") flipped the order of child_list and sibling_list.
+Previously it would iterate the group (sibling_list) first, and for each
+sibling traverse the child_list. In this order, only the group composition of
+the parent is relevant. By flipping the order the group composition of the
+child (inherited) events becomes an issue and the mis-match in group
+composition becomes evident.
+
+That said; even prior to this commit, while reading of a group that is not
+equally inherited was not broken, it still made no sense.
+
+(Ab)use ECHILD as error return to indicate issues with child process group
+composition.
+
+Fixes: fa8c269353d5 ("perf/core: Invert perf_read_group() loops")
+Reported-by: Budimir Markovic <markovicbudimir@gmail.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lkml.kernel.org/r/20231018115654.GK33217@noisy.programming.kicks-ass.net
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/linux/perf_event.h |    1 +
+ kernel/events/core.c       |   39 +++++++++++++++++++++++++++++++++------
+ 2 files changed, 34 insertions(+), 6 deletions(-)
+
+--- a/include/linux/perf_event.h
++++ b/include/linux/perf_event.h
+@@ -593,6 +593,7 @@ struct perf_event {
+       /* The cumulative AND of all event_caps for events in this group. */
+       int                             group_caps;
++      unsigned int                    group_generation;
+       struct perf_event               *group_leader;
+       struct pmu                      *pmu;
+       void                            *pmu_private;
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -1848,6 +1848,7 @@ static void perf_group_attach(struct per
+       list_add_tail(&event->sibling_list, &group_leader->sibling_list);
+       group_leader->nr_siblings++;
++      group_leader->group_generation++;
+       perf_event__header_size(group_leader);
+@@ -1918,6 +1919,7 @@ static void perf_group_detach(struct per
+       if (event->group_leader != event) {
+               list_del_init(&event->sibling_list);
+               event->group_leader->nr_siblings--;
++              event->group_leader->group_generation++;
+               goto out;
+       }
+@@ -4755,7 +4757,7 @@ static int __perf_read_group_add(struct
+                                       u64 read_format, u64 *values)
+ {
+       struct perf_event_context *ctx = leader->ctx;
+-      struct perf_event *sub;
++      struct perf_event *sub, *parent;
+       unsigned long flags;
+       int n = 1; /* skip @nr */
+       int ret;
+@@ -4765,6 +4767,33 @@ static int __perf_read_group_add(struct
+               return ret;
+       raw_spin_lock_irqsave(&ctx->lock, flags);
++      /*
++       * Verify the grouping between the parent and child (inherited)
++       * events is still in tact.
++       *
++       * Specifically:
++       *  - leader->ctx->lock pins leader->sibling_list
++       *  - parent->child_mutex pins parent->child_list
++       *  - parent->ctx->mutex pins parent->sibling_list
++       *
++       * Because parent->ctx != leader->ctx (and child_list nests inside
++       * ctx->mutex), group destruction is not atomic between children, also
++       * see perf_event_release_kernel(). Additionally, parent can grow the
++       * group.
++       *
++       * Therefore it is possible to have parent and child groups in a
++       * different configuration and summing over such a beast makes no sense
++       * what so ever.
++       *
++       * Reject this.
++       */
++      parent = leader->parent;
++      if (parent &&
++          (parent->group_generation != leader->group_generation ||
++           parent->nr_siblings != leader->nr_siblings)) {
++              ret = -ECHILD;
++              goto unlock;
++      }
+       /*
+        * Since we co-schedule groups, {enabled,running} times of siblings
+@@ -4794,8 +4823,9 @@ static int __perf_read_group_add(struct
+                       values[n++] = primary_event_id(sub);
+       }
++unlock:
+       raw_spin_unlock_irqrestore(&ctx->lock, flags);
+-      return 0;
++      return ret;
+ }
+ static int perf_read_group(struct perf_event *event,
+@@ -4814,10 +4844,6 @@ static int perf_read_group(struct perf_e
+       values[0] = 1 + leader->nr_siblings;
+-      /*
+-       * By locking the child_mutex of the leader we effectively
+-       * lock the child list of all siblings.. XXX explain how.
+-       */
+       mutex_lock(&leader->child_mutex);
+       ret = __perf_read_group_add(leader, read_format, values);
+@@ -11603,6 +11629,7 @@ static int inherit_group(struct perf_eve
+               if (IS_ERR(child_ctr))
+                       return PTR_ERR(child_ctr);
+       }
++      leader->group_generation = parent_event->group_generation;
+       return 0;
+ }
diff --git a/queue-4.19/s390-pci-fix-iommu-bitmap-allocation.patch b/queue-4.19/s390-pci-fix-iommu-bitmap-allocation.patch
new file mode 100644 (file)
index 0000000..3a80ef6
--- /dev/null
@@ -0,0 +1,79 @@
+From c1ae1c59c8c6e0b66a718308c623e0cb394dab6b Mon Sep 17 00:00:00 2001
+From: Niklas Schnelle <schnelle@linux.ibm.com>
+Date: Tue, 17 Oct 2023 15:37:29 +0200
+Subject: s390/pci: fix iommu bitmap allocation
+
+From: Niklas Schnelle <schnelle@linux.ibm.com>
+
+commit c1ae1c59c8c6e0b66a718308c623e0cb394dab6b upstream.
+
+Since the fixed commits both zdev->iommu_bitmap and zdev->lazy_bitmap
+are allocated as vzalloc(zdev->iommu_pages / 8). The problem is that
+zdev->iommu_bitmap is a pointer to unsigned long but the above only
+yields an allocation that is a multiple of sizeof(unsigned long) which
+is 8 on s390x if the number of IOMMU pages is a multiple of 64.
+This in turn is the case only if the effective IOMMU aperture is
+a multiple of 64 * 4K = 256K. This is usually the case and so didn't
+cause visible issues since both the virt_to_phys(high_memory) reduced
+limit and hardware limits use nice numbers.
+
+Under KVM, and in particular with QEMU limiting the IOMMU aperture to
+the vfio DMA limit (default 65535), it is possible for the reported
+aperture not to be a multiple of 256K however. In this case we end up
+with an iommu_bitmap whose allocation is not a multiple of
+8 causing bitmap operations to access it out of bounds.
+
+Sadly we can't just fix this in the obvious way and use bitmap_zalloc()
+because for large RAM systems (tested on 8 TiB) the zdev->iommu_bitmap
+grows too large for kmalloc(). So add our own bitmap_vzalloc() wrapper.
+This might be a candidate for common code, but this area of code will
+be replaced by the upcoming conversion to use the common code DMA API on
+s390 so just add a local routine.
+
+Fixes: 224593215525 ("s390/pci: use virtual memory for iommu bitmap")
+Fixes: 13954fd6913a ("s390/pci_dma: improve lazy flush for unmap")
+Cc: stable@vger.kernel.org
+Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
+Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/s390/pci/pci_dma.c |   15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+--- a/arch/s390/pci/pci_dma.c
++++ b/arch/s390/pci/pci_dma.c
+@@ -545,6 +545,17 @@ static void s390_dma_unmap_sg(struct dev
+               s->dma_length = 0;
+       }
+ }
++
++static unsigned long *bitmap_vzalloc(size_t bits, gfp_t flags)
++{
++      size_t n = BITS_TO_LONGS(bits);
++      size_t bytes;
++
++      if (unlikely(check_mul_overflow(n, sizeof(unsigned long), &bytes)))
++              return NULL;
++
++      return vzalloc(bytes);
++}
+       
+ static int s390_mapping_error(struct device *dev, dma_addr_t dma_addr)
+ {
+@@ -586,13 +597,13 @@ int zpci_dma_init_device(struct zpci_dev
+                               zdev->end_dma - zdev->start_dma + 1);
+       zdev->end_dma = zdev->start_dma + zdev->iommu_size - 1;
+       zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT;
+-      zdev->iommu_bitmap = vzalloc(zdev->iommu_pages / 8);
++      zdev->iommu_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
+       if (!zdev->iommu_bitmap) {
+               rc = -ENOMEM;
+               goto free_dma_table;
+       }
+       if (!s390_iommu_strict) {
+-              zdev->lazy_bitmap = vzalloc(zdev->iommu_pages / 8);
++              zdev->lazy_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL);
+               if (!zdev->lazy_bitmap) {
+                       rc = -ENOMEM;
+                       goto free_bitmap;
index fb657537ddc45ed0180354a45708284e8997e24d..d4b4727513a164d40ae3dbe4f7df46f65fb02fec 100644 (file)
@@ -89,3 +89,8 @@ mtd-spinand-micron-correct-bitmask-for-ecc-status.patch
 mmc-core-capture-correct-oemid-bits-for-emmc-cards.patch
 revert-pinctrl-avoid-unsafe-code-pattern-in-find_pinctrl.patch
 acpi-irq-fix-incorrect-return-value-in-acpi_register_gsi.patch
+usb-serial-option-add-telit-le910c4-wwx-0x1035-composition.patch
+usb-serial-option-add-entry-for-sierra-em9191-with-new-firmware.patch
+usb-serial-option-add-fibocom-to-dell-custom-modem-fm101r-gl.patch
+perf-disallow-mis-matched-inherited-group-reads.patch
+s390-pci-fix-iommu-bitmap-allocation.patch
diff --git a/queue-4.19/usb-serial-option-add-entry-for-sierra-em9191-with-new-firmware.patch b/queue-4.19/usb-serial-option-add-entry-for-sierra-em9191-with-new-firmware.patch
new file mode 100644 (file)
index 0000000..9004e28
--- /dev/null
@@ -0,0 +1,45 @@
+From 064f6e2ba9eb59b2c87b866e1e968e79ccedf9dd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Beno=C3=AEt=20Monin?= <benoit.monin@gmx.fr>
+Date: Mon, 2 Oct 2023 17:51:40 +0200
+Subject: USB: serial: option: add entry for Sierra EM9191 with new firmware
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benoît Monin <benoit.monin@gmx.fr>
+
+commit 064f6e2ba9eb59b2c87b866e1e968e79ccedf9dd upstream.
+
+Following a firmware update of the modem, the interface for the AT
+command port changed, so add it back.
+
+T:  Bus=08 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  2 Spd=5000 MxCh= 0
+D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
+P:  Vendor=1199 ProdID=90d3 Rev=00.06
+S:  Manufacturer=Sierra Wireless, Incorporated
+S:  Product=Sierra Wireless EM9191
+S:  SerialNumber=xxxxxxxxxxxxxxxx
+C:  #Ifs= 4 Cfg#= 1 Atr=a0 MxPwr=896mA
+I:  If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim
+I:  If#=0x1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
+I:  If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=(none)
+I:  If#=0x4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
+
+Signed-off-by: Benoît Monin <benoit.monin@gmx.fr>
+Cc: stable@vger.kernel.org
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/serial/option.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -2263,6 +2263,7 @@ static const struct usb_device_id option
+       { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) },                   /* GosunCn GM500 ECM/NCM */
+       { USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) },
+       { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) },
++      { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x40) },
+       { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0, 0) },
+       { USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) },
+       { } /* Terminating entry */
diff --git a/queue-4.19/usb-serial-option-add-fibocom-to-dell-custom-modem-fm101r-gl.patch b/queue-4.19/usb-serial-option-add-fibocom-to-dell-custom-modem-fm101r-gl.patch
new file mode 100644 (file)
index 0000000..bfcadda
--- /dev/null
@@ -0,0 +1,88 @@
+From 52480e1f1a259c93d749ba3961af0bffedfe7a7a Mon Sep 17 00:00:00 2001
+From: Puliang Lu <puliang.lu@fibocom.com>
+Date: Mon, 16 Oct 2023 15:36:16 +0800
+Subject: USB: serial: option: add Fibocom to DELL custom modem FM101R-GL
+
+From: Puliang Lu <puliang.lu@fibocom.com>
+
+commit 52480e1f1a259c93d749ba3961af0bffedfe7a7a upstream.
+
+Update the USB serial option driver support for the Fibocom
+FM101R-GL LTE modules as there are actually several different variants.
+
+- VID:PID 413C:8213, FM101R-GL are laptop M.2 cards (with
+  MBIM interfaces for Linux)
+
+- VID:PID 413C:8215, FM101R-GL ESIM are laptop M.2 cards (with
+  MBIM interface for Linux)
+
+0x8213: mbim, tty
+0x8215: mbim, tty
+
+T:  Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
+D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
+P:  Vendor=413c ProdID=8213 Rev= 5.04
+S:  Manufacturer=Fibocom Wireless Inc.
+S:  Product=Fibocom FM101-GL Module
+S:  SerialNumber=a3b7cbf0
+C:* #Ifs= 3 Cfg#= 1 Atr=a0 MxPwr=896mA
+A:  FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=0e Prot=00
+I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0e Prot=00 Driver=cdc_mbim
+E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=32ms
+I:  If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
+I:* If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
+E:  Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+E:  Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=(none)
+E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
+E:  Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+E:  Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+
+T:  Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  3 Spd=5000 MxCh= 0
+D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
+P:  Vendor=413c ProdID=8215 Rev= 5.04
+S:  Manufacturer=Fibocom Wireless Inc.
+S:  Product=Fibocom FM101-GL Module
+S:  SerialNumber=a3b7cbf0
+C:* #Ifs= 3 Cfg#= 1 Atr=a0 MxPwr=896mA
+A:  FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=0e Prot=00
+I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0e Prot=00 Driver=cdc_mbim
+E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=32ms
+I:  If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
+I:* If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
+E:  Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+E:  Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=(none)
+E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
+E:  Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+E:  Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+
+Signed-off-by: Puliang Lu <puliang.lu@fibocom.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/serial/option.c |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -203,6 +203,9 @@ static void option_instat_callback(struc
+ #define DELL_PRODUCT_5829E_ESIM                       0x81e4
+ #define DELL_PRODUCT_5829E                    0x81e6
++#define DELL_PRODUCT_FM101R                   0x8213
++#define DELL_PRODUCT_FM101R_ESIM              0x8215
++
+ #define KYOCERA_VENDOR_ID                     0x0c88
+ #define KYOCERA_PRODUCT_KPC650                        0x17da
+ #define KYOCERA_PRODUCT_KPC680                        0x180a
+@@ -1108,6 +1111,8 @@ static const struct usb_device_id option
+         .driver_info = RSVD(0) | RSVD(6) },
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM),
+         .driver_info = RSVD(0) | RSVD(6) },
++      { USB_DEVICE_INTERFACE_CLASS(DELL_VENDOR_ID, DELL_PRODUCT_FM101R, 0xff) },
++      { USB_DEVICE_INTERFACE_CLASS(DELL_VENDOR_ID, DELL_PRODUCT_FM101R_ESIM, 0xff) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },   /* ADU-E100, ADU-310 */
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
diff --git a/queue-4.19/usb-serial-option-add-telit-le910c4-wwx-0x1035-composition.patch b/queue-4.19/usb-serial-option-add-telit-le910c4-wwx-0x1035-composition.patch
new file mode 100644 (file)
index 0000000..def35ca
--- /dev/null
@@ -0,0 +1,53 @@
+From 6a7be48e9bd18d309ba25c223a27790ad1bf0fa3 Mon Sep 17 00:00:00 2001
+From: Fabio Porcedda <fabio.porcedda@gmail.com>
+Date: Tue, 5 Sep 2023 09:37:24 +0200
+Subject: USB: serial: option: add Telit LE910C4-WWX 0x1035 composition
+
+From: Fabio Porcedda <fabio.porcedda@gmail.com>
+
+commit 6a7be48e9bd18d309ba25c223a27790ad1bf0fa3 upstream.
+
+Add support for the following Telit LE910C4-WWX composition:
+
+0x1035: TTY, TTY, ECM
+
+T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  5 Spd=480 MxCh= 0
+D:  Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
+P:  Vendor=1bc7 ProdID=1035 Rev=00.00
+S:  Manufacturer=Telit
+S:  Product=LE910C4-WWX
+S:  SerialNumber=e1b117c7
+C:  #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
+I:  If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
+E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=fe Prot=ff Driver=option
+E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=83(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
+E:  Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+I:  If#= 2 Alt= 0 #EPs= 1 Cls=02(commc) Sub=06 Prot=00 Driver=cdc_ether
+E:  Ad=85(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
+I:  If#= 3 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether
+E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+
+Signed-off-by: Fabio Porcedda <fabio.porcedda@gmail.com>
+Cc: stable@vger.kernel.org
+Reviewed-by: Daniele Palmas <dnlplm@gmail.com>
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/serial/option.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -1290,6 +1290,7 @@ static const struct usb_device_id option
+        .driver_info = NCTRL(0) | RSVD(3) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1033, 0xff),    /* Telit LE910C1-EUX (ECM) */
+        .driver_info = NCTRL(0) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1035, 0xff) }, /* Telit LE910C4-WWX (ECM) */
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0),
+         .driver_info = RSVD(0) | RSVD(1) | NCTRL(2) | RSVD(3) },
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG1),