Home Home > GIT Browse > openSUSE-15.1
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Tesarik <ptesarik@suse.cz>2019-01-11 14:43:52 +0100
committerPetr Tesarik <ptesarik@suse.cz>2019-01-11 14:43:52 +0100
commitd0a916f8f86fdb3f4a12c6c3a470c35fbc4b9c7a (patch)
treed2afef8fed5407d854fb2b55d77b4ce3264590d4
parent5438954647c61663734d3bd467818c80138483a3 (diff)
parentf37544afa28e6c34b136515072b79e3364685790 (diff)
Merge branch 'users/nsaenzjulienne/SLE15-SP1/for-next' into SLE15-SP1
Pull USB fixes from Nicolas Saenz
-rw-r--r--patches.drivers/usb-typec-tcpm-extend-the-matching-rules-on-pps-apdo-selection.patch117
-rw-r--r--patches.drivers/usb-xhci-fix-broken_suspend-placement-in-struct-xchi_hcd.patch43
-rw-r--r--patches.drivers/xhci-add-quirk-to-workaround-the-errata-seen-on-cavium-thunder-x2-soc.patch4
-rw-r--r--patches.drivers/xhci-add-quirk-to-zero-64bit-registers-on-renesas-pcie-controllers.patch155
-rw-r--r--patches.fixes/0001-xhci-workaround-CSS-timeout-on-AMD-SNPS-3.0-xHC.patch12
-rw-r--r--series.conf3
6 files changed, 326 insertions, 8 deletions
diff --git a/patches.drivers/usb-typec-tcpm-extend-the-matching-rules-on-pps-apdo-selection.patch b/patches.drivers/usb-typec-tcpm-extend-the-matching-rules-on-pps-apdo-selection.patch
new file mode 100644
index 0000000000..04ed5f40bb
--- /dev/null
+++ b/patches.drivers/usb-typec-tcpm-extend-the-matching-rules-on-pps-apdo-selection.patch
@@ -0,0 +1,117 @@
+From: Kyle Tso <kyletso@google.com>
+Date: Mon, 17 Dec 2018 21:22:13 +0800
+Subject: usb: typec: tcpm: Extend the matching rules on PPS APDO selection
+Git-commit: c710d0bb76ff0795d8b6c1cda1e01e6e1e661a4a
+Patch-mainline: v5.0-rc1
+References: FATE#326325
+
+Current matching rules ensure that the voltage range of selected Source
+Capability is entirely within the range defined in one of the Sink
+Capabilities. This is reasonable but not practical because Sink may not
+support wide range of voltage when sinking power while Source could
+advertise its capabilities in relatively wider range. For example, a
+Source PDO advertising 3.3V-11V@3A (9V Prog of Fixed Nominal Voltage)
+will not be selected if the Sink requires 5V-12V@3A PPS power. However,
+the Sink could work well if the requested voltage range in RDOs is
+5V-11V@3A.
+
+Currently accepted:
+ |--------- source -----|
+ |----------- sink ---------------|
+
+Currently not accepted:
+ |--------- source -----|
+ |----------- sink ---------------|
+
+ |--------- source -----|
+ |----------- sink ---------------|
+
+ |--------- source -----------------|
+ |------ sink -------|
+
+To improve the usability, change the matching rules to what listed
+below:
+a. The Source PDO is selectable if any portion of the voltage range
+ overlaps one of the Sink PDO's voltage range.
+b. The maximum operational voltage will be the lower one between the
+ selected Source PDO and the matching Sink PDO.
+c. The maximum power will be the maximum operational voltage times the
+ maximum current defined in the selected Source PDO
+d. Select the Source PDO with the highest maximum power
+
+Signed-off-by: Kyle Tso <kyletso@google.com>
+Acked-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
+Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Acked-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+---
+ drivers/usb/typec/tcpm/tcpm.c | 35 ++++++++++++++++++++---------------
+ 1 file changed, 20 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
+index 3620efee2688..4bc29b586698 100644
+--- a/drivers/usb/typec/tcpm/tcpm.c
++++ b/drivers/usb/typec/tcpm/tcpm.c
+@@ -2213,7 +2213,8 @@ static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port)
+ unsigned int i, j, max_mw = 0, max_mv = 0;
+ unsigned int min_src_mv, max_src_mv, src_ma, src_mw;
+ unsigned int min_snk_mv, max_snk_mv;
+- u32 pdo;
++ unsigned int max_op_mv;
++ u32 pdo, src, snk;
+ unsigned int src_pdo = 0, snk_pdo = 0;
+
+ /*
+@@ -2263,16 +2264,18 @@ static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port)
+ continue;
+ }
+
+- if (max_src_mv <= max_snk_mv &&
+- min_src_mv >= min_snk_mv) {
++ if (min_src_mv <= max_snk_mv &&
++ max_src_mv >= min_snk_mv) {
++ max_op_mv = min(max_src_mv, max_snk_mv);
++ src_mw = (max_op_mv * src_ma) / 1000;
+ /* Prefer higher voltages if available */
+ if ((src_mw == max_mw &&
+- min_src_mv > max_mv) ||
++ max_op_mv > max_mv) ||
+ src_mw > max_mw) {
+ src_pdo = i;
+ snk_pdo = j;
+ max_mw = src_mw;
+- max_mv = max_src_mv;
++ max_mv = max_op_mv;
+ }
+ }
+ }
+@@ -2285,16 +2288,18 @@ static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port)
+ }
+
+ if (src_pdo) {
+- pdo = port->source_caps[src_pdo];
+-
+- port->pps_data.min_volt = pdo_pps_apdo_min_voltage(pdo);
+- port->pps_data.max_volt = pdo_pps_apdo_max_voltage(pdo);
+- port->pps_data.max_curr =
+- min_pps_apdo_current(pdo, port->snk_pdo[snk_pdo]);
+- port->pps_data.out_volt =
+- min(pdo_pps_apdo_max_voltage(pdo), port->pps_data.out_volt);
+- port->pps_data.op_curr =
+- min(port->pps_data.max_curr, port->pps_data.op_curr);
++ src = port->source_caps[src_pdo];
++ snk = port->snk_pdo[snk_pdo];
++
++ port->pps_data.min_volt = max(pdo_pps_apdo_min_voltage(src),
++ pdo_pps_apdo_min_voltage(snk));
++ port->pps_data.max_volt = min(pdo_pps_apdo_max_voltage(src),
++ pdo_pps_apdo_max_voltage(snk));
++ port->pps_data.max_curr = min_pps_apdo_current(src, snk);
++ port->pps_data.out_volt = min(port->pps_data.max_volt,
++ port->pps_data.out_volt);
++ port->pps_data.op_curr = min(port->pps_data.max_curr,
++ port->pps_data.op_curr);
+ }
+
+ return src_pdo;
+
diff --git a/patches.drivers/usb-xhci-fix-broken_suspend-placement-in-struct-xchi_hcd.patch b/patches.drivers/usb-xhci-fix-broken_suspend-placement-in-struct-xchi_hcd.patch
new file mode 100644
index 0000000000..3fda27df61
--- /dev/null
+++ b/patches.drivers/usb-xhci-fix-broken_suspend-placement-in-struct-xchi_hcd.patch
@@ -0,0 +1,43 @@
+From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+Date: Mon, 17 Dec 2018 14:37:40 +0100
+Subject: USB: xhci: fix 'broken_suspend' placement in struct xchi_hcd
+Git-commit: 2419f30a4a4fcaa5f35111563b4c61f1b2b26841
+Patch-mainline: v4.20
+References: git-fixes
+
+As commented in the struct's definition there shouldn't be anything
+underneath its 'priv[0]' member as it would break some macros.
+
+The patch converts the broken_suspend into a bit-field and relocates it
+next to to the rest of bit-fields.
+
+Fixes: a7d57abcc8a5 ("xhci: workaround CSS timeout on AMD SNPS 3.0 xHC")
+Reported-by: Oliver Neukum <oneukum@suse.com>
+Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Cc: stable <stable@vger.kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/host/xhci.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/host/xhci.h
++++ b/drivers/usb/host/xhci.h
+@@ -1858,6 +1858,8 @@ struct xhci_hcd {
+ unsigned sw_lpm_support:1;
+ /* support xHCI 1.0 spec USB2 hardware LPM */
+ unsigned hw_lpm_support:1;
++ /* Broken Suspend flag for SNPS Suspend resume issue */
++ unsigned broken_suspend:1;
+ /* cached usb2 extened protocol capabilites */
+ u32 *ext_caps;
+ unsigned int num_ext_caps;
+@@ -1870,8 +1872,6 @@ struct xhci_hcd {
+
+ /* platform-specific data -- must come last */
+ unsigned long priv[0] __aligned(sizeof(s64));
+- /* Broken Suspend flag for SNPS Suspend resume issue */
+- u8 broken_suspend;
+ };
+
+ /* Platform specific overrides to generic XHCI hc_driver ops */
diff --git a/patches.drivers/xhci-add-quirk-to-workaround-the-errata-seen-on-cavium-thunder-x2-soc.patch b/patches.drivers/xhci-add-quirk-to-workaround-the-errata-seen-on-cavium-thunder-x2-soc.patch
index cb38587e20..a99dfc7b48 100644
--- a/patches.drivers/xhci-add-quirk-to-workaround-the-errata-seen-on-cavium-thunder-x2-soc.patch
+++ b/patches.drivers/xhci-add-quirk-to-workaround-the-errata-seen-on-cavium-thunder-x2-soc.patch
@@ -36,7 +36,7 @@ to move the quirk to bit 29 (should have been bit 34 with quirk being a long).
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
-@@ -236,6 +236,11 @@ static void xhci_pci_quirks(struct devic
+@@ -240,6 +240,11 @@ static void xhci_pci_quirks(struct devic
if (pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241)
xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_7;
@@ -109,5 +109,5 @@ to move the quirk to bit 29 (should have been bit 34 with quirk being a long).
#define XHCI_ASMEDIA_MODIFY_FLOWCONTROL BIT_ULL(28)
+#define XHCI_RESET_PLL_ON_DISCONNECT BIT_ULL(29)
#define XHCI_SUSPEND_DELAY BIT_ULL(30)
+ #define XHCI_ZERO_64B_REGS BIT_ULL(32)
- unsigned int num_active_eps;
diff --git a/patches.drivers/xhci-add-quirk-to-zero-64bit-registers-on-renesas-pcie-controllers.patch b/patches.drivers/xhci-add-quirk-to-zero-64bit-registers-on-renesas-pcie-controllers.patch
new file mode 100644
index 0000000000..9eb3881ea1
--- /dev/null
+++ b/patches.drivers/xhci-add-quirk-to-zero-64bit-registers-on-renesas-pcie-controllers.patch
@@ -0,0 +1,155 @@
+From: Marc Zyngier <marc.zyngier@arm.com>
+Date: Wed, 23 May 2018 18:41:37 +0100
+Subject: xhci: Add quirk to zero 64bit registers on Renesas PCIe controllers
+Git-commit: 12de0a35c996c3a75d050bff748815db3432849c
+Patch-mainline: v4.18-rc1
+References: bsc#1120854
+
+Some Renesas controllers get into a weird state if they are reset while
+programmed with 64bit addresses (they will preserve the top half of the
+address in internal, non visible registers).
+
+You end up with half the address coming from the kernel, and the other
+half coming from the firmware.
+
+Also, changing the programming leads to extra accesses even if the
+controller is supposed to be halted. The controller ends up with a fatal
+fault, and is then ripe for being properly reset. On the flip side,
+this is completely unsafe if the defvice isn't behind an IOMMU, so
+we have to make sure that this is the case. Can you say "broken"?
+
+This is an alternative method to the one introduced in 8466489ef5ba
+("xhci: Reset Renesas uPD72020x USB controller for 32-bit DMA issue"),
+which will subsequently be removed.
+
+Tested-by: Domenico Andreoli <domenico.andreoli@linux.com>
+Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
+Tested-by: Faiz Abbas <faiz_abbas@ti.com>
+Tested-by: Domenico Andreoli <domenico.andreoli@linux.com>
+Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Acked-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
+---
+ drivers/usb/host/xhci-pci.c | 8 ++++-
+ drivers/usb/host/xhci.c | 65 ++++++++++++++++++++++++++++++++++++++++++++
+ drivers/usb/host/xhci.h | 1
+ 3 files changed, 72 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/host/xhci-pci.c
++++ b/drivers/usb/host/xhci-pci.c
+@@ -207,11 +207,15 @@ static void xhci_pci_quirks(struct devic
+ xhci->quirks |= XHCI_BROKEN_STREAMS;
+ }
+ if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
+- pdev->device == 0x0014)
++ pdev->device == 0x0014) {
+ xhci->quirks |= XHCI_TRUST_TX_LENGTH;
++ xhci->quirks |= XHCI_ZERO_64B_REGS;
++ }
+ if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
+- pdev->device == 0x0015)
++ pdev->device == 0x0015) {
+ xhci->quirks |= XHCI_RESET_ON_RESUME;
++ xhci->quirks |= XHCI_ZERO_64B_REGS;
++ }
+ if (pdev->vendor == PCI_VENDOR_ID_VIA)
+ xhci->quirks |= XHCI_RESET_ON_RESUME;
+
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -219,6 +219,68 @@ int xhci_reset(struct xhci_hcd *xhci)
+ return ret;
+ }
+
++static void xhci_zero_64b_regs(struct xhci_hcd *xhci)
++{
++ struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
++ int err, i;
++ u64 val;
++
++ /*
++ * Some Renesas controllers get into a weird state if they are
++ * reset while programmed with 64bit addresses (they will preserve
++ * the top half of the address in internal, non visible
++ * registers). You end up with half the address coming from the
++ * kernel, and the other half coming from the firmware. Also,
++ * changing the programming leads to extra accesses even if the
++ * controller is supposed to be halted. The controller ends up with
++ * a fatal fault, and is then ripe for being properly reset.
++ *
++ * Special care is taken to only apply this if the device is behind
++ * an iommu. Doing anything when there is no iommu is definitely
++ * unsafe...
++ */
++ if (!(xhci->quirks & XHCI_ZERO_64B_REGS) || !dev->iommu_group)
++ return;
++
++ xhci_info(xhci, "Zeroing 64bit base registers, expecting fault\n");
++
++ /* Clear HSEIE so that faults do not get signaled */
++ val = readl(&xhci->op_regs->command);
++ val &= ~CMD_HSEIE;
++ writel(val, &xhci->op_regs->command);
++
++ /* Clear HSE (aka FATAL) */
++ val = readl(&xhci->op_regs->status);
++ val |= STS_FATAL;
++ writel(val, &xhci->op_regs->status);
++
++ /* Now zero the registers, and brace for impact */
++ val = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr);
++ if (upper_32_bits(val))
++ xhci_write_64(xhci, 0, &xhci->op_regs->dcbaa_ptr);
++ val = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
++ if (upper_32_bits(val))
++ xhci_write_64(xhci, 0, &xhci->op_regs->cmd_ring);
++
++ for (i = 0; i < HCS_MAX_INTRS(xhci->hcs_params1); i++) {
++ struct xhci_intr_reg __iomem *ir;
++
++ ir = &xhci->run_regs->ir_set[i];
++ val = xhci_read_64(xhci, &ir->erst_base);
++ if (upper_32_bits(val))
++ xhci_write_64(xhci, 0, &ir->erst_base);
++ val= xhci_read_64(xhci, &ir->erst_dequeue);
++ if (upper_32_bits(val))
++ xhci_write_64(xhci, 0, &ir->erst_dequeue);
++ }
++
++ /* Wait for the fault to appear. It will be cleared on reset */
++ err = xhci_handshake(&xhci->op_regs->status,
++ STS_FATAL, STS_FATAL,
++ XHCI_MAX_HALT_USEC);
++ if (!err)
++ xhci_info(xhci, "Fault detected\n");
++}
+
+ #ifdef CONFIG_USB_PCI
+ /*
+@@ -1014,6 +1076,7 @@ int xhci_resume(struct xhci_hcd *xhci, b
+
+ xhci_dbg(xhci, "Stop HCD\n");
+ xhci_halt(xhci);
++ xhci_zero_64b_regs(xhci);
+ xhci_reset(xhci);
+ spin_unlock_irq(&xhci->lock);
+ xhci_cleanup_msix(xhci);
+@@ -4837,6 +4900,8 @@ int xhci_gen_setup(struct usb_hcd *hcd,
+ if (retval)
+ return retval;
+
++ xhci_zero_64b_regs(xhci);
++
+ xhci_dbg(xhci, "Resetting HCD\n");
+ /* Reset the internal HC memory state and registers. */
+ retval = xhci_reset(xhci);
+--- a/drivers/usb/host/xhci.h
++++ b/drivers/usb/host/xhci.h
+@@ -1832,6 +1832,7 @@ struct xhci_hcd {
+ #define XHCI_U2_DISABLE_WAKE BIT_ULL(27)
+ #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL BIT_ULL(28)
+ #define XHCI_SUSPEND_DELAY BIT_ULL(30)
++#define XHCI_ZERO_64B_REGS BIT_ULL(32)
+
+ unsigned int num_active_eps;
+ unsigned int limit_active_eps;
diff --git a/patches.fixes/0001-xhci-workaround-CSS-timeout-on-AMD-SNPS-3.0-xHC.patch b/patches.fixes/0001-xhci-workaround-CSS-timeout-on-AMD-SNPS-3.0-xHC.patch
index 6047aa10bb..c8fe860ffd 100644
--- a/patches.fixes/0001-xhci-workaround-CSS-timeout-on-AMD-SNPS-3.0-xHC.patch
+++ b/patches.fixes/0001-xhci-workaround-CSS-timeout-on-AMD-SNPS-3.0-xHC.patch
@@ -47,7 +47,7 @@ Signed-off-by: Oliver Neukum <oneukum@suse.com>
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
-@@ -916,6 +916,7 @@ int xhci_suspend(struct xhci_hcd *xhci,
+@@ -978,6 +978,7 @@ int xhci_suspend(struct xhci_hcd *xhci,
unsigned int delay = XHCI_MAX_HALT_USEC;
struct usb_hcd *hcd = xhci_to_hcd(xhci);
u32 command;
@@ -55,7 +55,7 @@ Signed-off-by: Oliver Neukum <oneukum@suse.com>
if (!hcd->state)
return 0;
-@@ -967,11 +968,28 @@ int xhci_suspend(struct xhci_hcd *xhci,
+@@ -1029,11 +1030,28 @@ int xhci_suspend(struct xhci_hcd *xhci,
command = readl(&xhci->op_regs->command);
command |= CMD_CSS;
writel(command, &xhci->op_regs->command);
@@ -87,7 +87,7 @@ Signed-off-by: Oliver Neukum <oneukum@suse.com>
}
spin_unlock_irq(&xhci->lock);
-@@ -1024,7 +1042,7 @@ int xhci_resume(struct xhci_hcd *xhci, b
+@@ -1086,7 +1104,7 @@ int xhci_resume(struct xhci_hcd *xhci, b
set_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
spin_lock_irq(&xhci->lock);
@@ -98,15 +98,15 @@ Signed-off-by: Oliver Neukum <oneukum@suse.com>
if (!hibernated) {
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
-@@ -1837,6 +1837,7 @@ struct xhci_hcd {
- #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL BIT_ULL(28)
+@@ -1838,6 +1838,7 @@ struct xhci_hcd {
#define XHCI_RESET_PLL_ON_DISCONNECT BIT_ULL(29)
#define XHCI_SUSPEND_DELAY BIT_ULL(30)
+ #define XHCI_ZERO_64B_REGS BIT_ULL(32)
+#define XHCI_SNPS_BROKEN_SUSPEND BIT_ULL(35)
unsigned int num_active_eps;
unsigned int limit_active_eps;
-@@ -1868,6 +1869,8 @@ struct xhci_hcd {
+@@ -1869,6 +1870,8 @@ struct xhci_hcd {
/* platform-specific data -- must come last */
unsigned long priv[0] __aligned(sizeof(s64));
diff --git a/series.conf b/series.conf
index f41d5f4a2a..200540d95b 100644
--- a/series.conf
+++ b/series.conf
@@ -30028,6 +30028,7 @@
patches.drivers/usbip-usbip_detach-Fix-memory-udev-context-and-udev-
patches.drivers/0001-USB-typec-tcpm-no-need-to-check-return-value-of-debu.patch
patches.fixes/0001-xhci-Allow-more-than-32-quirks.patch
+ patches.drivers/xhci-add-quirk-to-zero-64bit-registers-on-renesas-pcie-controllers.patch
patches.suse/msft-hv-1679-Drivers-hv-vmbus-enable-VMBus-protocol-version-5.0.patch
patches.fixes/ARM-amba-Fix-wrong-indentation-in-driver_override_st.patch
patches.drivers/w1-mxc_w1-Enable-clock-before-calling-clk_get_rate-o
@@ -41658,6 +41659,7 @@
patches.drivers/USB-serial-option-add-Simcom-SIM7500-SIM7600-MBIM-mo.patch
patches.drivers/USB-serial-option-add-Fibocom-NL668-series.patch
patches.drivers/USB-serial-option-add-Telit-LN940-series.patch
+ patches.drivers/usb-xhci-fix-broken_suspend-placement-in-struct-xchi_hcd.patch
patches.suse/msft-hv-1804-uio_hv_generic-set-callbacks-on-open.patch
patches.suse/msft-hv-1805-x86-hyperv-remove-PCI-dependency.patch
patches.suse/msft-hv-1806-Drivers-hv-vmbus-Return-EINVAL-for-the-sys-files-for.patch
@@ -42018,6 +42020,7 @@
patches.drivers/gpio-raspberrypi-exp-decrease-refcount-on-firmware-dt-node.patch
patches.drivers/power-supply-olpc_battery-correct-the-temperature-un.patch
patches.drivers/usb-dwc2-host-use-hrtimer-for-nak-retries.patch
+ patches.drivers/usb-typec-tcpm-extend-the-matching-rules-on-pps-apdo-selection.patch
patches.suse/tty-ldsem-Wake-up-readers-after-timed-out-down_write.patch
patches.suse/tty-Hold-tty_ldisc_lock-during-tty_reopen.patch
patches.suse/tty-Don-t-block-on-IO-when-ldisc-change-is-pending.patch