]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Feb 2024 13:06:19 +0000 (14:06 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Feb 2024 13:06:19 +0000 (14:06 +0100)
added patches:
hrtimer-report-offline-hrtimer-enqueue.patch
input-atkbd-skip-atkbd_cmd_setleds-when-skipping-atkbd_cmd_getid.patch
usb-serial-cp210x-add-id-for-imst-im871a-usb.patch
usb-serial-option-add-fibocom-fm101-gl-variant.patch
usb-serial-qcserial-add-new-usb-id-for-dell-wireless-dw5826e.patch
xhci-handle-isoc-babble-and-buffer-overrun-events-properly.patch

queue-5.4/hrtimer-report-offline-hrtimer-enqueue.patch [new file with mode: 0644]
queue-5.4/input-atkbd-skip-atkbd_cmd_setleds-when-skipping-atkbd_cmd_getid.patch [new file with mode: 0644]
queue-5.4/series
queue-5.4/usb-serial-cp210x-add-id-for-imst-im871a-usb.patch [new file with mode: 0644]
queue-5.4/usb-serial-option-add-fibocom-fm101-gl-variant.patch [new file with mode: 0644]
queue-5.4/usb-serial-qcserial-add-new-usb-id-for-dell-wireless-dw5826e.patch [new file with mode: 0644]
queue-5.4/xhci-handle-isoc-babble-and-buffer-overrun-events-properly.patch [new file with mode: 0644]

diff --git a/queue-5.4/hrtimer-report-offline-hrtimer-enqueue.patch b/queue-5.4/hrtimer-report-offline-hrtimer-enqueue.patch
new file mode 100644 (file)
index 0000000..ce57bf7
--- /dev/null
@@ -0,0 +1,78 @@
+From dad6a09f3148257ac1773cd90934d721d68ab595 Mon Sep 17 00:00:00 2001
+From: Frederic Weisbecker <frederic@kernel.org>
+Date: Mon, 29 Jan 2024 15:56:36 -0800
+Subject: hrtimer: Report offline hrtimer enqueue
+
+From: Frederic Weisbecker <frederic@kernel.org>
+
+commit dad6a09f3148257ac1773cd90934d721d68ab595 upstream.
+
+The hrtimers migration on CPU-down hotplug process has been moved
+earlier, before the CPU actually goes to die. This leaves a small window
+of opportunity to queue an hrtimer in a blind spot, leaving it ignored.
+
+For example a practical case has been reported with RCU waking up a
+SCHED_FIFO task right before the CPUHP_AP_IDLE_DEAD stage, queuing that
+way a sched/rt timer to the local offline CPU.
+
+Make sure such situations never go unnoticed and warn when that happens.
+
+Fixes: 5c0930ccaad5 ("hrtimers: Push pending hrtimers away from outgoing CPU earlier")
+Reported-by: Paul E. McKenney <paulmck@kernel.org>
+Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
+Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/20240129235646.3171983-4-boqun.feng@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/linux/hrtimer.h |    4 +++-
+ kernel/time/hrtimer.c   |    3 +++
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+--- a/include/linux/hrtimer.h
++++ b/include/linux/hrtimer.h
+@@ -196,6 +196,7 @@ enum  hrtimer_base_type {
+  * @max_hang_time:    Maximum time spent in hrtimer_interrupt
+  * @softirq_expiry_lock: Lock which is taken while softirq based hrtimer are
+  *                     expired
++ * @online:           CPU is online from an hrtimers point of view
+  * @timer_waiters:    A hrtimer_cancel() invocation waits for the timer
+  *                    callback to finish.
+  * @expires_next:     absolute time of the next event, is required for remote
+@@ -218,7 +219,8 @@ struct hrtimer_cpu_base {
+       unsigned int                    hres_active             : 1,
+                                       in_hrtirq               : 1,
+                                       hang_detected           : 1,
+-                                      softirq_activated       : 1;
++                                      softirq_activated       : 1,
++                                      online                  : 1;
+ #ifdef CONFIG_HIGH_RES_TIMERS
+       unsigned int                    nr_events;
+       unsigned short                  nr_retries;
+--- a/kernel/time/hrtimer.c
++++ b/kernel/time/hrtimer.c
+@@ -981,6 +981,7 @@ static int enqueue_hrtimer(struct hrtime
+                          enum hrtimer_mode mode)
+ {
+       debug_activate(timer, mode);
++      WARN_ON_ONCE(!base->cpu_base->online);
+       base->cpu_base->active_bases |= 1 << base->index;
+@@ -2069,6 +2070,7 @@ int hrtimers_prepare_cpu(unsigned int cp
+       cpu_base->softirq_next_timer = NULL;
+       cpu_base->expires_next = KTIME_MAX;
+       cpu_base->softirq_expires_next = KTIME_MAX;
++      cpu_base->online = 1;
+       hrtimer_cpu_base_init_expiry_lock(cpu_base);
+       return 0;
+ }
+@@ -2136,6 +2138,7 @@ int hrtimers_cpu_dying(unsigned int dyin
+       smp_call_function_single(ncpu, retrigger_next_event, NULL, 0);
+       raw_spin_unlock(&new_base->lock);
++      old_base->online = 0;
+       raw_spin_unlock(&old_base->lock);
+       return 0;
diff --git a/queue-5.4/input-atkbd-skip-atkbd_cmd_setleds-when-skipping-atkbd_cmd_getid.patch b/queue-5.4/input-atkbd-skip-atkbd_cmd_setleds-when-skipping-atkbd_cmd_getid.patch
new file mode 100644 (file)
index 0000000..c1e1f78
--- /dev/null
@@ -0,0 +1,82 @@
+From 683cd8259a9b883a51973511f860976db2550a6e Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede@redhat.com>
+Date: Fri, 26 Jan 2024 17:07:23 +0100
+Subject: Input: atkbd - skip ATKBD_CMD_SETLEDS when skipping ATKBD_CMD_GETID
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+commit 683cd8259a9b883a51973511f860976db2550a6e upstream.
+
+After commit 936e4d49ecbc ("Input: atkbd - skip ATKBD_CMD_GETID in
+translated mode") the keyboard on Dell XPS 13 9350 / 9360 / 9370 models
+has stopped working after a suspend/resume.
+
+The problem appears to be that atkbd_probe() fails when called
+from atkbd_reconnect() on resume, which on systems where
+ATKBD_CMD_GETID is skipped can only happen by ATKBD_CMD_SETLEDS
+failing. ATKBD_CMD_SETLEDS failing because ATKBD_CMD_GETID was
+skipped is weird, but apparently that is what is happening.
+
+Fix this by also skipping ATKBD_CMD_SETLEDS when skipping
+ATKBD_CMD_GETID.
+
+Fixes: 936e4d49ecbc ("Input: atkbd - skip ATKBD_CMD_GETID in translated mode")
+Reported-by: Paul Menzel <pmenzel@molgen.mpg.de>
+Closes: https://lore.kernel.org/linux-input/0aa4a61f-c939-46fe-a572-08022e8931c7@molgen.mpg.de/
+Closes: https://bbs.archlinux.org/viewtopic.php?pid=2146300
+Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218424
+Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2260517
+Tested-by: Paul Menzel <pmenzel@molgen.mpg.de>
+Cc: stable@vger.kernel.org
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Link: https://lore.kernel.org/r/20240126160724.13278-2-hdegoede@redhat.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/input/keyboard/atkbd.c |   13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+--- a/drivers/input/keyboard/atkbd.c
++++ b/drivers/input/keyboard/atkbd.c
+@@ -761,7 +761,6 @@ static int atkbd_probe(struct atkbd *atk
+ {
+       struct ps2dev *ps2dev = &atkbd->ps2dev;
+       unsigned char param[2];
+-      bool skip_getid;
+ /*
+  * Some systems, where the bit-twiddling when testing the io-lines of the
+@@ -775,6 +774,11 @@ static int atkbd_probe(struct atkbd *atk
+                                "keyboard reset failed on %s\n",
+                                ps2dev->serio->phys);
++      if (atkbd_skip_getid(atkbd)) {
++              atkbd->id = 0xab83;
++              return 0;
++      }
++
+ /*
+  * Then we check the keyboard ID. We should get 0xab83 under normal conditions.
+  * Some keyboards report different values, but the first byte is always 0xab or
+@@ -783,18 +787,17 @@ static int atkbd_probe(struct atkbd *atk
+  */
+       param[0] = param[1] = 0xa5;     /* initialize with invalid values */
+-      skip_getid = atkbd_skip_getid(atkbd);
+-      if (skip_getid || ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
++      if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
+ /*
+- * If the get ID command was skipped or failed, we check if we can at least set
++ * If the get ID command failed, we check if we can at least set
+  * the LEDs on the keyboard. This should work on every keyboard out there.
+  * It also turns the LEDs off, which we want anyway.
+  */
+               param[0] = 0;
+               if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
+                       return -1;
+-              atkbd->id = skip_getid ? 0xab83 : 0xabba;
++              atkbd->id = 0xabba;
+               return 0;
+       }
index 8fb5e501f87e99b4ce296bf3ce41b759e7def0ce..05bab1947fb507fae9187b9484d802d7b3a4cea5 100644 (file)
@@ -192,3 +192,9 @@ netfilter-nft_compat-reject-unused-compat-flag.patch
 netfilter-nft_compat-restrict-match-target-protocol-.patch
 netfilter-nft_ct-reject-direction-for-ct-id.patch
 net-af_iucv-clean-up-a-try_then_request_module.patch
+usb-serial-qcserial-add-new-usb-id-for-dell-wireless-dw5826e.patch
+usb-serial-option-add-fibocom-fm101-gl-variant.patch
+usb-serial-cp210x-add-id-for-imst-im871a-usb.patch
+xhci-handle-isoc-babble-and-buffer-overrun-events-properly.patch
+hrtimer-report-offline-hrtimer-enqueue.patch
+input-atkbd-skip-atkbd_cmd_setleds-when-skipping-atkbd_cmd_getid.patch
diff --git a/queue-5.4/usb-serial-cp210x-add-id-for-imst-im871a-usb.patch b/queue-5.4/usb-serial-cp210x-add-id-for-imst-im871a-usb.patch
new file mode 100644 (file)
index 0000000..068150f
--- /dev/null
@@ -0,0 +1,31 @@
+From 12b17b4eb82a41977eb848048137b5908d52845c Mon Sep 17 00:00:00 2001
+From: Leonard Dallmayr <leonard.dallmayr@mailbox.org>
+Date: Fri, 5 Jan 2024 13:35:51 +0100
+Subject: USB: serial: cp210x: add ID for IMST iM871A-USB
+
+From: Leonard Dallmayr <leonard.dallmayr@mailbox.org>
+
+commit 12b17b4eb82a41977eb848048137b5908d52845c upstream.
+
+The device IMST USB-Stick for Smart Meter is a rebranded IMST iM871A-USB
+Wireless M-Bus USB-adapter. It is used to read wireless water, gas and
+electricity meters.
+
+Signed-off-by: Leonard Dallmayr <leonard.dallmayr@mailbox.org>
+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/cp210x.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -147,6 +147,7 @@ static const struct usb_device_id id_tab
+       { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */
+       { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
+       { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */
++      { USB_DEVICE(0x10C4, 0x87ED) }, /* IMST USB-Stick for Smart Meter */
+       { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */
+       { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */
+       { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */
diff --git a/queue-5.4/usb-serial-option-add-fibocom-fm101-gl-variant.patch b/queue-5.4/usb-serial-option-add-fibocom-fm101-gl-variant.patch
new file mode 100644 (file)
index 0000000..abe6d3a
--- /dev/null
@@ -0,0 +1,54 @@
+From b4a1f4eaf1d798066affc6ad040f76eb1a16e1c9 Mon Sep 17 00:00:00 2001
+From: Puliang Lu <puliang.lu@fibocom.com>
+Date: Wed, 31 Jan 2024 17:12:24 +0800
+Subject: USB: serial: option: add Fibocom FM101-GL variant
+
+From: Puliang Lu <puliang.lu@fibocom.com>
+
+commit b4a1f4eaf1d798066affc6ad040f76eb1a16e1c9 upstream.
+
+Update the USB serial option driver support for the Fibocom
+FM101-GL
+LTE modules as there are actually several different variants.
+- VID:PID 2cb7:01a3, FM101-GL are laptop M.2 cards (with
+MBIM interfaces for /Linux/Chrome OS)
+
+0x01a3:mbim,gnss
+
+Here are the outputs of usb-devices:
+
+T:  Bus=04 Lev=01 Prnt=01 Port=00 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=2cb7 ProdID=01a3 Rev=05.04
+S:  Manufacturer=Fibocom Wireless Inc.
+S:  Product=Fibocom FM101-GL Module
+S:  SerialNumber=5ccd5cd4
+C:  #Ifs= 3 Cfg#= 1 Atr=a0 MxPwr=896mA
+I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim
+E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=32ms
+I:  If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
+E:  Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+E:  Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=option
+E:  Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+E:  Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
+E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
+
+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 |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -2269,6 +2269,7 @@ static const struct usb_device_id option
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) },                   /* Fibocom FM160 (MBIM mode) */
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) },                   /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) },                   /* Fibocom FM101-GL (laptop MBIM) */
++      { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a3, 0xff) },                   /* Fibocom FM101-GL (laptop MBIM) */
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff),                     /* Fibocom FM101-GL (laptop MBIM) */
+         .driver_info = RSVD(4) },
+       { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) },                   /* LongSung M5710 */
diff --git a/queue-5.4/usb-serial-qcserial-add-new-usb-id-for-dell-wireless-dw5826e.patch b/queue-5.4/usb-serial-qcserial-add-new-usb-id-for-dell-wireless-dw5826e.patch
new file mode 100644 (file)
index 0000000..10fbe1c
--- /dev/null
@@ -0,0 +1,71 @@
+From 129690fb229a20b6e563a77a2c85266acecf20bc Mon Sep 17 00:00:00 2001
+From: JackBB Wu <wojackbb@gmail.com>
+Date: Tue, 23 Jan 2024 17:39:48 +0800
+Subject: USB: serial: qcserial: add new usb-id for Dell Wireless DW5826e
+
+From: JackBB Wu <wojackbb@gmail.com>
+
+commit 129690fb229a20b6e563a77a2c85266acecf20bc upstream.
+
+Add support for Dell DW5826e with USB-id 0x413c:0x8217 & 0x413c:0x8218.
+
+It is 0x413c:0x8217
+T:  Bus=02 Lev=01 Prnt=01 Port=05 Cnt=01 Dev#=  4 Spd=480  MxCh= 0
+D:  Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
+P:  Vendor=413c ProdID=8217 Rev= 5.04
+S:  Manufacturer=DELL
+S:  Product=COMPAL Electronics EXM-G1A
+S:  SerialNumber=359302940050401
+C:* #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=500mA
+I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=qcserial
+E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=usbfs
+E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=60 Driver=qcserial
+E:  Ad=84(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
+E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=qcserial
+E:  Ad=86(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
+E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+I:* If#= 4 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
+E:  Ad=87(I) Atr=03(Int.) MxPS=  64 Ivl=32ms
+I:* If#= 8 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan
+E:  Ad=88(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
+E:  Ad=8e(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=0f(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+
+It is 0x413c:0x8218
+T:  Bus=02 Lev=01 Prnt=01 Port=05 Cnt=01 Dev#=  3 Spd=480  MxCh= 0
+D:  Ver= 2.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
+P:  Vendor=413c ProdID=8218 Rev= 0.00
+S:  Manufacturer=DELL
+S:  Product=COMPAL Electronics EXM-G1A
+S:  SerialNumber=359302940050401
+C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=  2mA
+I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=qcserial
+E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+
+Signed-off-by: JackBB Wu <wojackbb@gmail.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/qcserial.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/usb/serial/qcserial.c
++++ b/drivers/usb/serial/qcserial.c
+@@ -184,6 +184,8 @@ static const struct usb_device_id id_tab
+       {DEVICE_SWI(0x413c, 0x81d0)},   /* Dell Wireless 5819 */
+       {DEVICE_SWI(0x413c, 0x81d1)},   /* Dell Wireless 5818 */
+       {DEVICE_SWI(0x413c, 0x81d2)},   /* Dell Wireless 5818 */
++      {DEVICE_SWI(0x413c, 0x8217)},   /* Dell Wireless DW5826e */
++      {DEVICE_SWI(0x413c, 0x8218)},   /* Dell Wireless DW5826e QDL */
+       /* Huawei devices */
+       {DEVICE_HWI(0x03f0, 0x581d)},   /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */
diff --git a/queue-5.4/xhci-handle-isoc-babble-and-buffer-overrun-events-properly.patch b/queue-5.4/xhci-handle-isoc-babble-and-buffer-overrun-events-properly.patch
new file mode 100644 (file)
index 0000000..a8ac3fa
--- /dev/null
@@ -0,0 +1,51 @@
+From 7c4650ded49e5b88929ecbbb631efb8b0838e811 Mon Sep 17 00:00:00 2001
+From: Michal Pecio <michal.pecio@gmail.com>
+Date: Thu, 25 Jan 2024 17:27:37 +0200
+Subject: xhci: handle isoc Babble and Buffer Overrun events properly
+
+From: Michal Pecio <michal.pecio@gmail.com>
+
+commit 7c4650ded49e5b88929ecbbb631efb8b0838e811 upstream.
+
+xHCI 4.9 explicitly forbids assuming that the xHC has released its
+ownership of a multi-TRB TD when it reports an error on one of the
+early TRBs. Yet the driver makes such assumption and releases the TD,
+allowing the remaining TRBs to be freed or overwritten by new TDs.
+
+The xHC should also report completion of the final TRB due to its IOC
+flag being set by us, regardless of prior errors. This event cannot
+be recognized if the TD has already been freed earlier, resulting in
+"Transfer event TRB DMA ptr not part of current TD" error message.
+
+Fix this by reusing the logic for processing isoc Transaction Errors.
+This also handles hosts which fail to report the final completion.
+
+Fix transfer length reporting on Babble errors. They may be caused by
+device malfunction, no guarantee that the buffer has been filled.
+
+Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Link: https://lore.kernel.org/r/20240125152737.2983959-5-mathias.nyman@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/host/xhci-ring.c |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -2227,9 +2227,13 @@ static int process_isoc_td(struct xhci_h
+       case COMP_BANDWIDTH_OVERRUN_ERROR:
+               frame->status = -ECOMM;
+               break;
+-      case COMP_ISOCH_BUFFER_OVERRUN:
+       case COMP_BABBLE_DETECTED_ERROR:
++              sum_trbs_for_length = true;
++              fallthrough;
++      case COMP_ISOCH_BUFFER_OVERRUN:
+               frame->status = -EOVERFLOW;
++              if (ep_trb != td->last_trb)
++                      td->error_mid_td = true;
+               break;
+       case COMP_INCOMPATIBLE_DEVICE_ERROR:
+       case COMP_STALL_ERROR: