]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 Mar 2016 06:36:34 +0000 (22:36 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 Mar 2016 06:36:34 +0000 (22:36 -0800)
added patches:
can-ems_usb-fix-possible-tx-overflow.patch
dm-thin-fix-race-condition-when-destroying-thin-pool-workqueue.patch
drivers-android-correct-the-size-of-struct-binder_uintptr_t-for-bc_dead_binder_done.patch
drm-i915-shut-up-gen8-sde-irq-dmesg-noise.patch
iw_cxgb3-fix-incorrectly-returning-error-on-success.patch
mm-numa-quickly-fail-allocations-for-numa-balancing-on-full-nodes.patch
mm-thp-fix-smp-race-condition-between-thp-page-fault-and-madv_dontneed.patch
ocfs2-unlock-inode-if-deleting-inode-from-orphan-fails.patch
spi-omap2-mcspi-prevent-duplicate-gpio_request.patch
usb-cp210x-add-ids-for-ge-b650v3-and-b850v3-boards.patch
usb-dwc3-fix-assignment-of-ep-transfer-resources.patch
usb-option-add-4g-lte-usb-modem-u901.patch
usb-option-add-support-for-sim7100e.patch

14 files changed:
queue-4.4/can-ems_usb-fix-possible-tx-overflow.patch [new file with mode: 0644]
queue-4.4/dm-thin-fix-race-condition-when-destroying-thin-pool-workqueue.patch [new file with mode: 0644]
queue-4.4/drivers-android-correct-the-size-of-struct-binder_uintptr_t-for-bc_dead_binder_done.patch [new file with mode: 0644]
queue-4.4/drm-i915-shut-up-gen8-sde-irq-dmesg-noise.patch [new file with mode: 0644]
queue-4.4/iw_cxgb3-fix-incorrectly-returning-error-on-success.patch [new file with mode: 0644]
queue-4.4/mm-numa-quickly-fail-allocations-for-numa-balancing-on-full-nodes.patch [new file with mode: 0644]
queue-4.4/mm-thp-fix-smp-race-condition-between-thp-page-fault-and-madv_dontneed.patch [new file with mode: 0644]
queue-4.4/ocfs2-unlock-inode-if-deleting-inode-from-orphan-fails.patch [new file with mode: 0644]
queue-4.4/series
queue-4.4/spi-omap2-mcspi-prevent-duplicate-gpio_request.patch [new file with mode: 0644]
queue-4.4/usb-cp210x-add-ids-for-ge-b650v3-and-b850v3-boards.patch [new file with mode: 0644]
queue-4.4/usb-dwc3-fix-assignment-of-ep-transfer-resources.patch [new file with mode: 0644]
queue-4.4/usb-option-add-4g-lte-usb-modem-u901.patch [new file with mode: 0644]
queue-4.4/usb-option-add-support-for-sim7100e.patch [new file with mode: 0644]

diff --git a/queue-4.4/can-ems_usb-fix-possible-tx-overflow.patch b/queue-4.4/can-ems_usb-fix-possible-tx-overflow.patch
new file mode 100644 (file)
index 0000000..6f9a998
--- /dev/null
@@ -0,0 +1,74 @@
+From 90cfde46586d2286488d8ed636929e936c0c9ab2 Mon Sep 17 00:00:00 2001
+From: Gerhard Uttenthaler <uttenthaler@ems-wuensche.com>
+Date: Tue, 22 Dec 2015 17:29:16 +0100
+Subject: can: ems_usb: Fix possible tx overflow
+
+From: Gerhard Uttenthaler <uttenthaler@ems-wuensche.com>
+
+commit 90cfde46586d2286488d8ed636929e936c0c9ab2 upstream.
+
+This patch fixes the problem that more CAN messages could be sent to the
+interface as could be send on the CAN bus. This was more likely for slow baud
+rates. The sleeping _start_xmit was woken up in the _write_bulk_callback. Under
+heavy TX load this produced another bulk transfer without checking the
+free_slots variable and hence caused the overflow in the interface.
+
+Signed-off-by: Gerhard Uttenthaler <uttenthaler@ems-wuensche.com>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/can/usb/ems_usb.c |   14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+--- a/drivers/net/can/usb/ems_usb.c
++++ b/drivers/net/can/usb/ems_usb.c
+@@ -117,6 +117,9 @@ MODULE_LICENSE("GPL v2");
+  */
+ #define EMS_USB_ARM7_CLOCK 8000000
++#define CPC_TX_QUEUE_TRIGGER_LOW      25
++#define CPC_TX_QUEUE_TRIGGER_HIGH     35
++
+ /*
+  * CAN-Message representation in a CPC_MSG. Message object type is
+  * CPC_MSG_TYPE_CAN_FRAME or CPC_MSG_TYPE_RTR_FRAME or
+@@ -278,6 +281,11 @@ static void ems_usb_read_interrupt_callb
+       switch (urb->status) {
+       case 0:
+               dev->free_slots = dev->intr_in_buffer[1];
++              if(dev->free_slots > CPC_TX_QUEUE_TRIGGER_HIGH){
++                      if (netif_queue_stopped(netdev)){
++                              netif_wake_queue(netdev);
++                      }
++              }
+               break;
+       case -ECONNRESET: /* unlink */
+@@ -526,8 +534,6 @@ static void ems_usb_write_bulk_callback(
+       /* Release context */
+       context->echo_index = MAX_TX_URBS;
+-      if (netif_queue_stopped(netdev))
+-              netif_wake_queue(netdev);
+ }
+ /*
+@@ -587,7 +593,7 @@ static int ems_usb_start(struct ems_usb
+       int err, i;
+       dev->intr_in_buffer[0] = 0;
+-      dev->free_slots = 15; /* initial size */
++      dev->free_slots = 50; /* initial size */
+       for (i = 0; i < MAX_RX_URBS; i++) {
+               struct urb *urb = NULL;
+@@ -835,7 +841,7 @@ static netdev_tx_t ems_usb_start_xmit(st
+               /* Slow down tx path */
+               if (atomic_read(&dev->active_tx_urbs) >= MAX_TX_URBS ||
+-                  dev->free_slots < 5) {
++                  dev->free_slots < CPC_TX_QUEUE_TRIGGER_LOW) {
+                       netif_stop_queue(netdev);
+               }
+       }
diff --git a/queue-4.4/dm-thin-fix-race-condition-when-destroying-thin-pool-workqueue.patch b/queue-4.4/dm-thin-fix-race-condition-when-destroying-thin-pool-workqueue.patch
new file mode 100644 (file)
index 0000000..a8372ac
--- /dev/null
@@ -0,0 +1,39 @@
+From 18d03e8c25f173f4107a40d0b8c24defb6ed69f3 Mon Sep 17 00:00:00 2001
+From: Nikolay Borisov <kernel@kyup.com>
+Date: Thu, 17 Dec 2015 18:03:35 +0200
+Subject: dm thin: fix race condition when destroying thin pool workqueue
+
+From: Nikolay Borisov <kernel@kyup.com>
+
+commit 18d03e8c25f173f4107a40d0b8c24defb6ed69f3 upstream.
+
+When a thin pool is being destroyed delayed work items are
+cancelled using cancel_delayed_work(), which doesn't guarantee that on
+return the delayed item isn't running.  This can cause the work item to
+requeue itself on an already destroyed workqueue.  Fix this by using
+cancel_delayed_work_sync() which guarantees that on return the work item
+is not running anymore.
+
+Fixes: 905e51b39a555 ("dm thin: commit outstanding data every second")
+Fixes: 85ad643b7e7e5 ("dm thin: add timeout to stop out-of-data-space mode holding IO forever")
+Signed-off-by: Nikolay Borisov <kernel@kyup.com>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/md/dm-thin.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/md/dm-thin.c
++++ b/drivers/md/dm-thin.c
+@@ -3453,8 +3453,8 @@ static void pool_postsuspend(struct dm_t
+       struct pool_c *pt = ti->private;
+       struct pool *pool = pt->pool;
+-      cancel_delayed_work(&pool->waker);
+-      cancel_delayed_work(&pool->no_space_timeout);
++      cancel_delayed_work_sync(&pool->waker);
++      cancel_delayed_work_sync(&pool->no_space_timeout);
+       flush_workqueue(pool->wq);
+       (void) commit(pool);
+ }
diff --git a/queue-4.4/drivers-android-correct-the-size-of-struct-binder_uintptr_t-for-bc_dead_binder_done.patch b/queue-4.4/drivers-android-correct-the-size-of-struct-binder_uintptr_t-for-bc_dead_binder_done.patch
new file mode 100644 (file)
index 0000000..c59b127
--- /dev/null
@@ -0,0 +1,36 @@
+From 7a64cd887fdb97f074c3fda03bee0bfb9faceac3 Mon Sep 17 00:00:00 2001
+From: Lisa Du <cldu@marvell.com>
+Date: Wed, 17 Feb 2016 09:32:52 +0800
+Subject: drivers: android: correct the size of struct binder_uintptr_t for BC_DEAD_BINDER_DONE
+
+From: Lisa Du <cldu@marvell.com>
+
+commit 7a64cd887fdb97f074c3fda03bee0bfb9faceac3 upstream.
+
+There's one point was missed in the patch commit da49889deb34 ("staging:
+binder: Support concurrent 32 bit and 64 bit processes."). When configure
+BINDER_IPC_32BIT, the size of binder_uintptr_t was 32bits, but size of
+void * is 64bit on 64bit system. Correct it here.
+
+Signed-off-by: Lisa Du <cldu@marvell.com>
+Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
+Fixes: da49889deb34 ("staging: binder: Support concurrent 32 bit and 64 bit processes.")
+Acked-by: Olof Johansson <olof@lixom.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/android/binder.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/android/binder.c
++++ b/drivers/android/binder.c
+@@ -2074,7 +2074,7 @@ static int binder_thread_write(struct bi
+                       if (get_user(cookie, (binder_uintptr_t __user *)ptr))
+                               return -EFAULT;
+-                      ptr += sizeof(void *);
++                      ptr += sizeof(cookie);
+                       list_for_each_entry(w, &proc->delivered_death, entry) {
+                               struct binder_ref_death *tmp_death = container_of(w, struct binder_ref_death, work);
diff --git a/queue-4.4/drm-i915-shut-up-gen8-sde-irq-dmesg-noise.patch b/queue-4.4/drm-i915-shut-up-gen8-sde-irq-dmesg-noise.patch
new file mode 100644 (file)
index 0000000..65ff0b2
--- /dev/null
@@ -0,0 +1,72 @@
+From 97e5ed1111dcc5300a0f59a55248cd243937a8ab Mon Sep 17 00:00:00 2001
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date: Fri, 23 Oct 2015 10:56:12 +0200
+Subject: drm/i915: shut up gen8+ SDE irq dmesg noise
+
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+
+commit 97e5ed1111dcc5300a0f59a55248cd243937a8ab upstream.
+
+We get tons of cases where the master interrupt handler apparently set
+a bit, with the SDEIIR disagreeing. No idea what's going on there, but
+it's consistent on gen8+, no one seems to care about it and it's
+making CI results flaky.
+
+Shut it up.
+
+No idea what's going on here, but we've had fun with PCH interrupts
+before:
+
+commit 44498aea293b37af1d463acd9658cdce1ecdf427
+Author: Paulo Zanoni <paulo.r.zanoni@intel.com>
+Date:   Fri Feb 22 17:05:28 2013 -0300
+
+    drm/i915: also disable south interrupts when handling them
+
+Note that there's a regression report in Bugzilla, and other
+regression reports on the mailing lists keep croping up. But no ill
+effects have ever been reported. But for paranoia still keep the
+message at a debug level as a breadcrumb, just in case.
+
+This message was introduced in
+
+commit 38cc46d73ed99dd7002f1406002e52d7975d16cc
+Author: Oscar Mateo <oscar.mateo@intel.com>
+Date:   Mon Jun 16 16:10:59 2014 +0100
+
+    drm/i915/bdw: Ack interrupts before handling them (GEN8)
+
+v2: Improve commit message a bit.
+
+Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
+Link: http://patchwork.freedesktop.org/patch/msgid/1445590572-23631-2-git-send-email-daniel.vetter@ffwll.ch
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92084
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=80896
+Acked-by: Mika Kuoppala <mika.kuoppala@intel.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/i915/i915_irq.c |   10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+--- a/drivers/gpu/drm/i915/i915_irq.c
++++ b/drivers/gpu/drm/i915/i915_irq.c
+@@ -2354,9 +2354,13 @@ static irqreturn_t gen8_irq_handler(int
+                               spt_irq_handler(dev, pch_iir);
+                       else
+                               cpt_irq_handler(dev, pch_iir);
+-              } else
+-                      DRM_ERROR("The master control interrupt lied (SDE)!\n");
+-
++              } else {
++                      /*
++                       * Like on previous PCH there seems to be something
++                       * fishy going on with forwarding PCH interrupts.
++                       */
++                      DRM_DEBUG_DRIVER("The master control interrupt lied (SDE)!\n");
++              }
+       }
+       I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
diff --git a/queue-4.4/iw_cxgb3-fix-incorrectly-returning-error-on-success.patch b/queue-4.4/iw_cxgb3-fix-incorrectly-returning-error-on-success.patch
new file mode 100644 (file)
index 0000000..86cac58
--- /dev/null
@@ -0,0 +1,43 @@
+From 67f1aee6f45059fd6b0f5b0ecb2c97ad0451f6b3 Mon Sep 17 00:00:00 2001
+From: Hariprasad S <hariprasad@chelsio.com>
+Date: Fri, 11 Dec 2015 13:59:17 +0530
+Subject: iw_cxgb3: Fix incorrectly returning error on success
+
+From: Hariprasad S <hariprasad@chelsio.com>
+
+commit 67f1aee6f45059fd6b0f5b0ecb2c97ad0451f6b3 upstream.
+
+The cxgb3_*_send() functions return NET_XMIT_ values, which are
+positive integers values. So don't treat positive return values
+as an error.
+
+Signed-off-by: Steve Wise <swise@opengridcomputing.com>
+Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
+Signed-off-by: Doug Ledford <dledford@redhat.com>
+[a pox on developers and maintainers who do not cc: stable for bug fixes like this - gregkh]
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/infiniband/hw/cxgb3/iwch_cm.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
++++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
+@@ -149,7 +149,7 @@ static int iwch_l2t_send(struct t3cdev *
+       error = l2t_send(tdev, skb, l2e);
+       if (error < 0)
+               kfree_skb(skb);
+-      return error;
++      return error < 0 ? error : 0;
+ }
+ int iwch_cxgb3_ofld_send(struct t3cdev *tdev, struct sk_buff *skb)
+@@ -165,7 +165,7 @@ int iwch_cxgb3_ofld_send(struct t3cdev *
+       error = cxgb3_ofld_send(tdev, skb);
+       if (error < 0)
+               kfree_skb(skb);
+-      return error;
++      return error < 0 ? error : 0;
+ }
+ static void release_tid(struct t3cdev *tdev, u32 hwtid, struct sk_buff *skb)
diff --git a/queue-4.4/mm-numa-quickly-fail-allocations-for-numa-balancing-on-full-nodes.patch b/queue-4.4/mm-numa-quickly-fail-allocations-for-numa-balancing-on-full-nodes.patch
new file mode 100644 (file)
index 0000000..cd76204
--- /dev/null
@@ -0,0 +1,96 @@
+From 8479eba7781fa9ffb28268840de6facfc12c35a7 Mon Sep 17 00:00:00 2001
+From: Mel Gorman <mgorman@techsingularity.net>
+Date: Fri, 26 Feb 2016 15:19:31 -0800
+Subject: mm: numa: quickly fail allocations for NUMA balancing on full nodes
+
+From: Mel Gorman <mgorman@techsingularity.net>
+
+commit 8479eba7781fa9ffb28268840de6facfc12c35a7 upstream.
+
+Commit 4167e9b2cf10 ("mm: remove GFP_THISNODE") removed the GFP_THISNODE
+flag combination due to confusing semantics.  It noted that
+alloc_misplaced_dst_page() was one such user after changes made by
+commit e97ca8e5b864 ("mm: fix GFP_THISNODE callers and clarify").
+
+Unfortunately when GFP_THISNODE was removed, users of
+alloc_misplaced_dst_page() started waking kswapd and entering direct
+reclaim because the wrong GFP flags are cleared.  The consequence is
+that workloads that used to fit into memory now get reclaimed which is
+addressed by this patch.
+
+The problem can be demonstrated with "mutilate" that exercises memcached
+which is software dedicated to memory object caching.  The configuration
+uses 80% of memory and is run 3 times for varying numbers of clients.
+The results on a 4-socket NUMA box are
+
+mutilate
+                            4.4.0                 4.4.0
+                          vanilla           numaswap-v1
+Hmean    1      8394.71 (  0.00%)     8395.32 (  0.01%)
+Hmean    4     30024.62 (  0.00%)    34513.54 ( 14.95%)
+Hmean    7     32821.08 (  0.00%)    70542.96 (114.93%)
+Hmean    12    55229.67 (  0.00%)    93866.34 ( 69.96%)
+Hmean    21    39438.96 (  0.00%)    85749.21 (117.42%)
+Hmean    30    37796.10 (  0.00%)    50231.49 ( 32.90%)
+Hmean    47    18070.91 (  0.00%)    38530.13 (113.22%)
+
+The metric is queries/second with the more the better.  The results are
+way outside of the noise and the reason for the improvement is obvious
+from some of the vmstats
+
+                                 4.4.0       4.4.0
+                               vanillanumaswap-v1r1
+Minor Faults                1929399272  2146148218
+Major Faults                  19746529        3567
+Swap Ins                      57307366        9913
+Swap Outs                     50623229       17094
+Allocation stalls                35909         443
+DMA allocs                           0           0
+DMA32 allocs                  72976349   170567396
+Normal allocs               5306640898  5310651252
+Movable allocs                       0           0
+Direct pages scanned         404130893      799577
+Kswapd pages scanned         160230174           0
+Kswapd pages reclaimed        55928786           0
+Direct pages reclaimed         1843936       41921
+Page writes file                  2391           0
+Page writes anon              50623229       17094
+
+The vanilla kernel is swapping like crazy with large amounts of direct
+reclaim and kswapd activity.  The figures are aggregate but it's known
+that the bad activity is throughout the entire test.
+
+Note that simple streaming anon/file memory consumers also see this
+problem but it's not as obvious.  In those cases, kswapd is awake when
+it should not be.
+
+As there are at least two reclaim-related bugs out there, it's worth
+spelling out the user-visible impact.  This patch only addresses bugs
+related to excessive reclaim on NUMA hardware when the working set is
+larger than a NUMA node.  There is a bug related to high kswapd CPU
+usage but the reports are against laptops and other UMA hardware and is
+not addressed by this patch.
+
+Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
+Cc: Vlastimil Babka <vbabka@suse.cz>
+Cc: Johannes Weiner <hannes@cmpxchg.org>
+Cc: David Rientjes <rientjes@google.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ mm/migrate.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/mm/migrate.c
++++ b/mm/migrate.c
+@@ -1578,7 +1578,7 @@ static struct page *alloc_misplaced_dst_
+                                        (GFP_HIGHUSER_MOVABLE |
+                                         __GFP_THISNODE | __GFP_NOMEMALLOC |
+                                         __GFP_NORETRY | __GFP_NOWARN) &
+-                                       ~(__GFP_IO | __GFP_FS), 0);
++                                       ~__GFP_RECLAIM, 0);
+       return newpage;
+ }
diff --git a/queue-4.4/mm-thp-fix-smp-race-condition-between-thp-page-fault-and-madv_dontneed.patch b/queue-4.4/mm-thp-fix-smp-race-condition-between-thp-page-fault-and-madv_dontneed.patch
new file mode 100644 (file)
index 0000000..c3595f7
--- /dev/null
@@ -0,0 +1,59 @@
+From ad33bb04b2a6cee6c1f99fabb15cddbf93ff0433 Mon Sep 17 00:00:00 2001
+From: Andrea Arcangeli <aarcange@redhat.com>
+Date: Fri, 26 Feb 2016 15:19:28 -0800
+Subject: mm: thp: fix SMP race condition between THP page fault and MADV_DONTNEED
+
+From: Andrea Arcangeli <aarcange@redhat.com>
+
+commit ad33bb04b2a6cee6c1f99fabb15cddbf93ff0433 upstream.
+
+pmd_trans_unstable()/pmd_none_or_trans_huge_or_clear_bad() were
+introduced to locklessy (but atomically) detect when a pmd is a regular
+(stable) pmd or when the pmd is unstable and can infinitely transition
+from pmd_none() and pmd_trans_huge() from under us, while only holding
+the mmap_sem for reading (for writing not).
+
+While holding the mmap_sem only for reading, MADV_DONTNEED can run from
+under us and so before we can assume the pmd to be a regular stable pmd
+we need to compare it against pmd_none() and pmd_trans_huge() in an
+atomic way, with pmd_trans_unstable().  The old pmd_trans_huge() left a
+tiny window for a race.
+
+Useful applications are unlikely to notice the difference as doing
+MADV_DONTNEED concurrently with a page fault would lead to undefined
+behavior.
+
+[akpm@linux-foundation.org: tidy up comment grammar/layout]
+Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
+Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ mm/memory.c |   14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -3399,8 +3399,18 @@ static int __handle_mm_fault(struct mm_s
+       if (unlikely(pmd_none(*pmd)) &&
+           unlikely(__pte_alloc(mm, vma, pmd, address)))
+               return VM_FAULT_OOM;
+-      /* if an huge pmd materialized from under us just retry later */
+-      if (unlikely(pmd_trans_huge(*pmd)))
++      /*
++       * If a huge pmd materialized under us just retry later.  Use
++       * pmd_trans_unstable() instead of pmd_trans_huge() to ensure the pmd
++       * didn't become pmd_trans_huge under us and then back to pmd_none, as
++       * a result of MADV_DONTNEED running immediately after a huge pmd fault
++       * in a different thread of this mm, in turn leading to a misleading
++       * pmd_trans_huge() retval.  All we have to ensure is that it is a
++       * regular pmd that we can walk with pte_offset_map() and we can do that
++       * through an atomic read in C, which is what pmd_trans_unstable()
++       * provides.
++       */
++      if (unlikely(pmd_trans_unstable(pmd)))
+               return 0;
+       /*
+        * A regular pmd is established and it can't morph into a huge pmd
diff --git a/queue-4.4/ocfs2-unlock-inode-if-deleting-inode-from-orphan-fails.patch b/queue-4.4/ocfs2-unlock-inode-if-deleting-inode-from-orphan-fails.patch
new file mode 100644 (file)
index 0000000..35bdb47
--- /dev/null
@@ -0,0 +1,39 @@
+From a4a8481ff68a8a324a878e281bc37f18665224f7 Mon Sep 17 00:00:00 2001
+From: Guozhonghua <guozhonghua@h3c.com>
+Date: Fri, 26 Feb 2016 15:19:40 -0800
+Subject: ocfs2: unlock inode if deleting inode from orphan fails
+
+From: Guozhonghua <guozhonghua@h3c.com>
+
+commit a4a8481ff68a8a324a878e281bc37f18665224f7 upstream.
+
+When doing append direct io cleanup, if deleting inode fails, it goes
+out without unlocking inode, which will cause the inode deadlock.
+
+This issue was introduced by commit cf1776a9e834 ("ocfs2: fix a tiny
+race when truncate dio orohaned entry").
+
+Signed-off-by: Guozhonghua <guozhonghua@h3c.com>
+Signed-off-by: Joseph Qi <joseph.qi@huawei.com>
+Reviewed-by: Gang He <ghe@suse.com>
+Cc: Mark Fasheh <mfasheh@suse.de>
+Cc: Joel Becker <jlbec@evilplan.org>
+Cc: Junxiao Bi <junxiao.bi@oracle.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ocfs2/aops.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/fs/ocfs2/aops.c
++++ b/fs/ocfs2/aops.c
+@@ -956,6 +956,7 @@ clean_orphan:
+               tmp_ret = ocfs2_del_inode_from_orphan(osb, inode, di_bh,
+                               update_isize, end);
+               if (tmp_ret < 0) {
++                      ocfs2_inode_unlock(inode, 1);
+                       ret = tmp_ret;
+                       mlog_errno(ret);
+                       brelse(di_bh);
index a034244ba8edcd2431d3e910dee26a3756555e97..4bd9c3dbc7434e8cd603bba61df524925f9dbb1c 100644 (file)
@@ -67,3 +67,16 @@ bcache-unregister-reboot-notifier-if-bcache-fails-to-unregister-device.patch
 bcache-allows-use-of-register-in-udev-to-avoid-device_busy-error.patch
 bcache-prevent-crash-on-changing-writeback_running.patch
 bcache-change-refill_dirty-to-always-scan-entire-disk-if-necessary.patch
+dm-thin-fix-race-condition-when-destroying-thin-pool-workqueue.patch
+can-ems_usb-fix-possible-tx-overflow.patch
+usb-dwc3-fix-assignment-of-ep-transfer-resources.patch
+usb-cp210x-add-ids-for-ge-b650v3-and-b850v3-boards.patch
+usb-option-add-support-for-sim7100e.patch
+usb-option-add-4g-lte-usb-modem-u901.patch
+drivers-android-correct-the-size-of-struct-binder_uintptr_t-for-bc_dead_binder_done.patch
+spi-omap2-mcspi-prevent-duplicate-gpio_request.patch
+iw_cxgb3-fix-incorrectly-returning-error-on-success.patch
+drm-i915-shut-up-gen8-sde-irq-dmesg-noise.patch
+ocfs2-unlock-inode-if-deleting-inode-from-orphan-fails.patch
+mm-thp-fix-smp-race-condition-between-thp-page-fault-and-madv_dontneed.patch
+mm-numa-quickly-fail-allocations-for-numa-balancing-on-full-nodes.patch
diff --git a/queue-4.4/spi-omap2-mcspi-prevent-duplicate-gpio_request.patch b/queue-4.4/spi-omap2-mcspi-prevent-duplicate-gpio_request.patch
new file mode 100644 (file)
index 0000000..5a9eafb
--- /dev/null
@@ -0,0 +1,58 @@
+From 2f538c017e1a8620d19553931199c6d6a6d31bb2 Mon Sep 17 00:00:00 2001
+From: Michael Welling <mwelling@ieee.org>
+Date: Mon, 30 Nov 2015 09:02:39 -0600
+Subject: spi: omap2-mcspi: Prevent duplicate gpio_request
+
+From: Michael Welling <mwelling@ieee.org>
+
+commit 2f538c017e1a8620d19553931199c6d6a6d31bb2 upstream.
+
+Occasionally the setup function will be called multiple times. Only request
+the gpio the first time otherwise -EBUSY will occur on subsequent calls to
+setup.
+
+Reported-by: Joseph Bell <joe@iachieved.it>
+
+Signed-off-by: Michael Welling <mwelling@ieee.org>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/spi/spi-omap2-mcspi.c |   19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+--- a/drivers/spi/spi-omap2-mcspi.c
++++ b/drivers/spi/spi-omap2-mcspi.c
+@@ -1024,6 +1024,16 @@ static int omap2_mcspi_setup(struct spi_
+               spi->controller_state = cs;
+               /* Link this to context save list */
+               list_add_tail(&cs->node, &ctx->cs);
++
++              if (gpio_is_valid(spi->cs_gpio)) {
++                      ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
++                      if (ret) {
++                              dev_err(&spi->dev, "failed to request gpio\n");
++                              return ret;
++                      }
++                      gpio_direction_output(spi->cs_gpio,
++                                       !(spi->mode & SPI_CS_HIGH));
++              }
+       }
+       if (!mcspi_dma->dma_rx || !mcspi_dma->dma_tx) {
+@@ -1032,15 +1042,6 @@ static int omap2_mcspi_setup(struct spi_
+                       return ret;
+       }
+-      if (gpio_is_valid(spi->cs_gpio)) {
+-              ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
+-              if (ret) {
+-                      dev_err(&spi->dev, "failed to request gpio\n");
+-                      return ret;
+-              }
+-              gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
+-      }
+-
+       ret = pm_runtime_get_sync(mcspi->dev);
+       if (ret < 0)
+               return ret;
diff --git a/queue-4.4/usb-cp210x-add-ids-for-ge-b650v3-and-b850v3-boards.patch b/queue-4.4/usb-cp210x-add-ids-for-ge-b650v3-and-b850v3-boards.patch
new file mode 100644 (file)
index 0000000..7fbd36c
--- /dev/null
@@ -0,0 +1,31 @@
+From 6627ae19385283b89356a199d7f03c75ba35fb29 Mon Sep 17 00:00:00 2001
+From: Ken Lin <ken.lin@advantech.com.tw>
+Date: Mon, 1 Feb 2016 14:57:25 -0500
+Subject: USB: cp210x: add IDs for GE B650V3 and B850V3 boards
+
+From: Ken Lin <ken.lin@advantech.com.tw>
+
+commit 6627ae19385283b89356a199d7f03c75ba35fb29 upstream.
+
+Add USB ID for cp2104/5 devices on GE B650v3 and B850v3 boards.
+
+Signed-off-by: Ken Lin <ken.lin@advantech.com.tw>
+Signed-off-by: Akshay Bhat <akshay.bhat@timesys.com>
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/cp210x.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -162,6 +162,8 @@ static const struct usb_device_id id_tab
+       { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
+       { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
+       { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
++      { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */
++      { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */
+       { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
+       { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
+       { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
diff --git a/queue-4.4/usb-dwc3-fix-assignment-of-ep-transfer-resources.patch b/queue-4.4/usb-dwc3-fix-assignment-of-ep-transfer-resources.patch
new file mode 100644 (file)
index 0000000..19b4f79
--- /dev/null
@@ -0,0 +1,201 @@
+From c450960187f45d4260db87c7dd4fc0bceb5565d8 Mon Sep 17 00:00:00 2001
+From: John Youn <John.Youn@synopsys.com>
+Date: Tue, 16 Feb 2016 20:10:53 -0800
+Subject: usb: dwc3: Fix assignment of EP transfer resources
+
+From: John Youn <John.Youn@synopsys.com>
+
+commit c450960187f45d4260db87c7dd4fc0bceb5565d8 upstream.
+
+The assignement of EP transfer resources was not handled properly in the
+dwc3 driver. Commit aebda6187181 ("usb: dwc3: Reset the transfer
+resource index on SET_INTERFACE") previously fixed one aspect of this
+where resources may be exhausted with multiple calls to SET_INTERFACE.
+However, it introduced an issue where composite devices with multiple
+interfaces can be assigned the same transfer resources for different
+endpoints. This patch solves both issues.
+
+The assignment of transfer resources cannot perfectly follow the data
+book due to the fact that the controller driver does not have all
+knowledge of the configuration in advance. It is given this information
+piecemeal by the composite gadget framework after every
+SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook
+programming model in this scenario can cause errors. For two reasons:
+
+1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION and
+SET_INTERFACE (8.1.5). This is incorrect in the scenario of multiple
+interfaces.
+
+2) The databook does not mention doing more DEPXFERCFG for new endpoint
+on alt setting (8.1.6).
+
+The following simplified method is used instead:
+
+All hardware endpoints can be assigned a transfer resource and this
+setting will stay persistent until either a core reset or hibernation.
+So whenever we do a DEPSTARTCFG(0) we can go ahead and do DEPXFERCFG for
+every hardware endpoint as well. We are guaranteed that there are as
+many transfer resources as endpoints.
+
+This patch triggers off of the calling dwc3_gadget_start_config() for
+EP0-out, which always happens first, and which should only happen in one
+of the above conditions.
+
+Fixes: aebda6187181 ("usb: dwc3: Reset the transfer resource index on SET_INTERFACE")
+Reported-by: Ravi Babu <ravibabu@ti.com>
+Signed-off-by: John Youn <johnyoun@synopsys.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/dwc3/core.h   |    1 
+ drivers/usb/dwc3/ep0.c    |    5 ---
+ drivers/usb/dwc3/gadget.c |   70 ++++++++++++++++++++++++++++++++++------------
+ 3 files changed, 52 insertions(+), 24 deletions(-)
+
+--- a/drivers/usb/dwc3/core.h
++++ b/drivers/usb/dwc3/core.h
+@@ -853,7 +853,6 @@ struct dwc3 {
+       unsigned                pullups_connected:1;
+       unsigned                resize_fifos:1;
+       unsigned                setup_packet_pending:1;
+-      unsigned                start_config_issued:1;
+       unsigned                three_stage_setup:1;
+       unsigned                usb3_lpm_capable:1;
+--- a/drivers/usb/dwc3/ep0.c
++++ b/drivers/usb/dwc3/ep0.c
+@@ -555,7 +555,6 @@ static int dwc3_ep0_set_config(struct dw
+       int ret;
+       u32 reg;
+-      dwc->start_config_issued = false;
+       cfg = le16_to_cpu(ctrl->wValue);
+       switch (state) {
+@@ -737,10 +736,6 @@ static int dwc3_ep0_std_request(struct d
+               dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_ISOCH_DELAY");
+               ret = dwc3_ep0_set_isoch_delay(dwc, ctrl);
+               break;
+-      case USB_REQ_SET_INTERFACE:
+-              dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_INTERFACE");
+-              dwc->start_config_issued = false;
+-              /* Fall through */
+       default:
+               dwc3_trace(trace_dwc3_ep0, "Forwarding to gadget driver");
+               ret = dwc3_ep0_delegate_req(dwc, ctrl);
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -388,24 +388,66 @@ static void dwc3_free_trb_pool(struct dw
+       dep->trb_pool_dma = 0;
+ }
++static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep);
++
++/**
++ * dwc3_gadget_start_config - Configure EP resources
++ * @dwc: pointer to our controller context structure
++ * @dep: endpoint that is being enabled
++ *
++ * The assignment of transfer resources cannot perfectly follow the
++ * data book due to the fact that the controller driver does not have
++ * all knowledge of the configuration in advance. It is given this
++ * information piecemeal by the composite gadget framework after every
++ * SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook
++ * programming model in this scenario can cause errors. For two
++ * reasons:
++ *
++ * 1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION
++ * and SET_INTERFACE (8.1.5). This is incorrect in the scenario of
++ * multiple interfaces.
++ *
++ * 2) The databook does not mention doing more DEPXFERCFG for new
++ * endpoint on alt setting (8.1.6).
++ *
++ * The following simplified method is used instead:
++ *
++ * All hardware endpoints can be assigned a transfer resource and this
++ * setting will stay persistent until either a core reset or
++ * hibernation. So whenever we do a DEPSTARTCFG(0) we can go ahead and
++ * do DEPXFERCFG for every hardware endpoint as well. We are
++ * guaranteed that there are as many transfer resources as endpoints.
++ *
++ * This function is called for each endpoint when it is being enabled
++ * but is triggered only when called for EP0-out, which always happens
++ * first, and which should only happen in one of the above conditions.
++ */
+ static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep)
+ {
+       struct dwc3_gadget_ep_cmd_params params;
+       u32                     cmd;
++      int                     i;
++      int                     ret;
++
++      if (dep->number)
++              return 0;
+       memset(&params, 0x00, sizeof(params));
++      cmd = DWC3_DEPCMD_DEPSTARTCFG;
+-      if (dep->number != 1) {
+-              cmd = DWC3_DEPCMD_DEPSTARTCFG;
+-              /* XferRscIdx == 0 for ep0 and 2 for the remaining */
+-              if (dep->number > 1) {
+-                      if (dwc->start_config_issued)
+-                              return 0;
+-                      dwc->start_config_issued = true;
+-                      cmd |= DWC3_DEPCMD_PARAM(2);
+-              }
++      ret = dwc3_send_gadget_ep_cmd(dwc, 0, cmd, &params);
++      if (ret)
++              return ret;
++
++      for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
++              struct dwc3_ep *dep = dwc->eps[i];
+-              return dwc3_send_gadget_ep_cmd(dwc, 0, cmd, &params);
++              if (!dep)
++                      continue;
++
++              ret = dwc3_gadget_set_xfer_resource(dwc, dep);
++              if (ret)
++                      return ret;
+       }
+       return 0;
+@@ -519,10 +561,6 @@ static int __dwc3_gadget_ep_enable(struc
+               struct dwc3_trb *trb_st_hw;
+               struct dwc3_trb *trb_link;
+-              ret = dwc3_gadget_set_xfer_resource(dwc, dep);
+-              if (ret)
+-                      return ret;
+-
+               dep->endpoint.desc = desc;
+               dep->comp_desc = comp_desc;
+               dep->type = usb_endpoint_type(desc);
+@@ -1604,8 +1642,6 @@ static int dwc3_gadget_start(struct usb_
+       }
+       dwc3_writel(dwc->regs, DWC3_DCFG, reg);
+-      dwc->start_config_issued = false;
+-
+       /* Start with SuperSpeed Default */
+       dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
+@@ -2202,7 +2238,6 @@ static void dwc3_gadget_disconnect_inter
+       dwc3_writel(dwc->regs, DWC3_DCTL, reg);
+       dwc3_disconnect_gadget(dwc);
+-      dwc->start_config_issued = false;
+       dwc->gadget.speed = USB_SPEED_UNKNOWN;
+       dwc->setup_packet_pending = false;
+@@ -2253,7 +2288,6 @@ static void dwc3_gadget_reset_interrupt(
+       dwc3_stop_active_transfers(dwc);
+       dwc3_clear_stall_all_ep(dwc);
+-      dwc->start_config_issued = false;
+       /* Reset device address to zero */
+       reg = dwc3_readl(dwc->regs, DWC3_DCFG);
diff --git a/queue-4.4/usb-option-add-4g-lte-usb-modem-u901.patch b/queue-4.4/usb-option-add-4g-lte-usb-modem-u901.patch
new file mode 100644 (file)
index 0000000..32f83ed
--- /dev/null
@@ -0,0 +1,47 @@
+From d061c1caa31d4d9792cfe48a2c6b309a0e01ef46 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no>
+Date: Fri, 12 Feb 2016 16:40:00 +0100
+Subject: USB: option: add "4G LTE usb-modem U901"
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Bjørn Mork <bjorn@mork.no>
+
+commit d061c1caa31d4d9792cfe48a2c6b309a0e01ef46 upstream.
+
+Thomas reports:
+
+T:  Bus=01 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#=  4 Spd=480 MxCh= 0
+D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
+P:  Vendor=05c6 ProdID=6001 Rev=00.00
+S:  Manufacturer=USB Modem
+S:  Product=USB Modem
+S:  SerialNumber=1234567890ABCDEF
+C:  #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
+I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+I:  If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
+I:  If#= 4 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
+
+Reported-by: Thomas Schäfer <tschaefer@t-online.de>
+Signed-off-by: Bjørn Mork <bjorn@mork.no>
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/option.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -1127,6 +1127,8 @@ static const struct usb_device_id option
+       { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
+       { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
++      { USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, 0x6001, 0xff, 0xff, 0xff), /* 4G LTE usb-modem U901 */
++        .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
diff --git a/queue-4.4/usb-option-add-support-for-sim7100e.patch b/queue-4.4/usb-option-add-support-for-sim7100e.patch
new file mode 100644 (file)
index 0000000..4585eb1
--- /dev/null
@@ -0,0 +1,75 @@
+From 3158a8d416f4e1b79dcc867d67cb50013140772c Mon Sep 17 00:00:00 2001
+From: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+Date: Fri, 29 Jan 2016 00:07:30 +0300
+Subject: USB: option: add support for SIM7100E
+
+From: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+
+commit 3158a8d416f4e1b79dcc867d67cb50013140772c upstream.
+
+$ lsusb:
+Bus 001 Device 101: ID 1e0e:9001 Qualcomm / Option
+
+$ usb-devices:
+T:  Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#=101 Spd=480  MxCh= 0
+D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  2
+P:  Vendor=1e0e ProdID=9001 Rev= 2.32
+S:  Manufacturer=SimTech, Incorporated
+S:  Product=SimTech, Incorporated
+S:  SerialNumber=0123456789ABCDEF
+C:* #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=500mA
+I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
+I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
+I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
+I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
+I:* If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
+I:* If#= 6 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
+
+The last interface (6) is used for Android Composite ADB interface.
+
+Serial port layout:
+0: QCDM/DIAG
+1: NMEA
+2: AT
+3: AT/PPP
+4: audio
+
+Signed-off-by: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/serial/option.c |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -315,6 +315,7 @@ static void option_instat_callback(struc
+ #define TOSHIBA_PRODUCT_G450                  0x0d45
+ #define ALINK_VENDOR_ID                               0x1e0e
++#define SIMCOM_PRODUCT_SIM7100E                       0x9001 /* Yes, ALINK_VENDOR_ID */
+ #define ALINK_PRODUCT_PH300                   0x9100
+ #define ALINK_PRODUCT_3GU                     0x9200
+@@ -607,6 +608,10 @@ static const struct option_blacklist_inf
+       .reserved = BIT(3) | BIT(4),
+ };
++static const struct option_blacklist_info simcom_sim7100e_blacklist = {
++      .reserved = BIT(5) | BIT(6),
++};
++
+ static const struct option_blacklist_info telit_le910_blacklist = {
+       .sendsetup = BIT(0),
+       .reserved = BIT(1) | BIT(2),
+@@ -1645,6 +1650,8 @@ static const struct usb_device_id option
+       { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) },
+       { USB_DEVICE(ALINK_VENDOR_ID, ALINK_PRODUCT_PH300) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) },
++      { USB_DEVICE(ALINK_VENDOR_ID, SIMCOM_PRODUCT_SIM7100E),
++        .driver_info = (kernel_ulong_t)&simcom_sim7100e_blacklist },
+       { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
+         .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist
+       },