]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 31 Mar 2024 11:04:50 +0000 (13:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 31 Mar 2024 11:04:50 +0000 (13:04 +0200)
added patches:
revert-usb-phy-generic-get-the-vbus-supply.patch
usb-cdc-wdm-close-race-between-read-and-workqueue.patch
usb-uas-return-enodev-when-submit-urbs-fail-with-device-not-attached.patch

queue-6.1/revert-usb-phy-generic-get-the-vbus-supply.patch [new file with mode: 0644]
queue-6.1/series
queue-6.1/usb-cdc-wdm-close-race-between-read-and-workqueue.patch [new file with mode: 0644]
queue-6.1/usb-uas-return-enodev-when-submit-urbs-fail-with-device-not-attached.patch [new file with mode: 0644]

diff --git a/queue-6.1/revert-usb-phy-generic-get-the-vbus-supply.patch b/queue-6.1/revert-usb-phy-generic-get-the-vbus-supply.patch
new file mode 100644 (file)
index 0000000..dba0a2b
--- /dev/null
@@ -0,0 +1,39 @@
+From fdada0db0b2ae2addef4ccafe50937874dbeeebe Mon Sep 17 00:00:00 2001
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+Date: Thu, 14 Mar 2024 10:26:27 +0100
+Subject: Revert "usb: phy: generic: Get the vbus supply"
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+commit fdada0db0b2ae2addef4ccafe50937874dbeeebe upstream.
+
+This reverts commit 75fd6485cccef269ac9eb3b71cf56753341195ef.
+This patch was applied twice by accident, causing probe failures.
+Revert the accident.
+
+Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
+Fixes: 75fd6485ccce ("usb: phy: generic: Get the vbus supply")
+Cc: stable <stable@kernel.org>
+Reviewed-by: Sean Anderson <sean.anderson@seco.com>
+Link: https://lore.kernel.org/r/20240314092628.1869414-1-alexander.stein@ew.tq-group.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/phy/phy-generic.c |    7 -------
+ 1 file changed, 7 deletions(-)
+
+--- a/drivers/usb/phy/phy-generic.c
++++ b/drivers/usb/phy/phy-generic.c
+@@ -272,13 +272,6 @@ int usb_phy_gen_create_phy(struct device
+               return dev_err_probe(dev, PTR_ERR(nop->vbus_draw),
+                                    "could not get vbus regulator\n");
+-      nop->vbus_draw = devm_regulator_get_exclusive(dev, "vbus");
+-      if (PTR_ERR(nop->vbus_draw) == -ENODEV)
+-              nop->vbus_draw = NULL;
+-      if (IS_ERR(nop->vbus_draw))
+-              return dev_err_probe(dev, PTR_ERR(nop->vbus_draw),
+-                                   "could not get vbus regulator\n");
+-
+       nop->dev                = dev;
+       nop->phy.dev            = nop->dev;
+       nop->phy.label          = "nop-xceiv";
index 07eef3a289b76214572e7ce38c77138edf8d3e4d..9faa219a3cd1e60b95c11072279bb7d8dc89a199 100644 (file)
@@ -228,3 +228,6 @@ drm-amdkfd-fix-tlb-flush-after-unmap-for-gfx9.4.2.patch
 drm-i915-bios-tolerate-devdata-null-in-intel_bios_encoder_supports_dp_dual_mode.patch
 drm-i915-gt-reset-queue_priority_hint-on-parking.patch
 bluetooth-hci_sync-fix-not-checking-error-on-hci_cmd_sync_cancel_sync.patch
+revert-usb-phy-generic-get-the-vbus-supply.patch
+usb-cdc-wdm-close-race-between-read-and-workqueue.patch
+usb-uas-return-enodev-when-submit-urbs-fail-with-device-not-attached.patch
diff --git a/queue-6.1/usb-cdc-wdm-close-race-between-read-and-workqueue.patch b/queue-6.1/usb-cdc-wdm-close-race-between-read-and-workqueue.patch
new file mode 100644 (file)
index 0000000..8108b8b
--- /dev/null
@@ -0,0 +1,47 @@
+From 339f83612f3a569b194680768b22bf113c26a29d Mon Sep 17 00:00:00 2001
+From: Oliver Neukum <oneukum@suse.com>
+Date: Thu, 14 Mar 2024 12:50:48 +0100
+Subject: usb: cdc-wdm: close race between read and workqueue
+
+From: Oliver Neukum <oneukum@suse.com>
+
+commit 339f83612f3a569b194680768b22bf113c26a29d upstream.
+
+wdm_read() cannot race with itself. However, in
+service_outstanding_interrupt() it can race with the
+workqueue, which can be triggered by error handling.
+
+Hence we need to make sure that the WDM_RESPONDING
+flag is not just only set but tested.
+
+Fixes: afba937e540c9 ("USB: CDC WDM driver")
+Cc: stable <stable@kernel.org>
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Link: https://lore.kernel.org/r/20240314115132.3907-1-oneukum@suse.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/class/cdc-wdm.c |    6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/class/cdc-wdm.c
++++ b/drivers/usb/class/cdc-wdm.c
+@@ -485,6 +485,7 @@ out_free_mem:
+ static int service_outstanding_interrupt(struct wdm_device *desc)
+ {
+       int rv = 0;
++      int used;
+       /* submit read urb only if the device is waiting for it */
+       if (!desc->resp_count || !--desc->resp_count)
+@@ -499,7 +500,10 @@ static int service_outstanding_interrupt
+               goto out;
+       }
+-      set_bit(WDM_RESPONDING, &desc->flags);
++      used = test_and_set_bit(WDM_RESPONDING, &desc->flags);
++      if (used)
++              goto out;
++
+       spin_unlock_irq(&desc->iuspin);
+       rv = usb_submit_urb(desc->response, GFP_KERNEL);
+       spin_lock_irq(&desc->iuspin);
diff --git a/queue-6.1/usb-uas-return-enodev-when-submit-urbs-fail-with-device-not-attached.patch b/queue-6.1/usb-uas-return-enodev-when-submit-urbs-fail-with-device-not-attached.patch
new file mode 100644 (file)
index 0000000..e6ae988
--- /dev/null
@@ -0,0 +1,147 @@
+From cd5432c712351a3d5f82512908f5febfca946ca6 Mon Sep 17 00:00:00 2001
+From: Weitao Wang <WeitaoWang-oc@zhaoxin.com>
+Date: Thu, 7 Mar 2024 02:08:14 +0800
+Subject: USB: UAS: return ENODEV when submit urbs fail with device not attached
+
+From: Weitao Wang <WeitaoWang-oc@zhaoxin.com>
+
+commit cd5432c712351a3d5f82512908f5febfca946ca6 upstream.
+
+In the scenario of entering hibernation with udisk in the system, if the
+udisk was gone or resume fail in the thaw phase of hibernation. Its state
+will be set to NOTATTACHED. At this point, usb_hub_wq was already freezed
+and can't not handle disconnect event. Next, in the poweroff phase of
+hibernation, SYNCHRONIZE_CACHE SCSI command will be sent to this udisk
+when poweroff this scsi device, which will cause uas_submit_urbs to be
+called to submit URB for sense/data/cmd pipe. However, these URBs will
+submit fail as device was set to NOTATTACHED state. Then, uas_submit_urbs
+will return a value SCSI_MLQUEUE_DEVICE_BUSY to the caller. That will lead
+the SCSI layer go into an ugly loop and system fail to go into hibernation.
+
+On the other hand, when we specially check for -ENODEV in function
+uas_queuecommand_lck, returning DID_ERROR to SCSI layer will cause device
+poweroff fail and system shutdown instead of entering hibernation.
+
+To fix this issue, let uas_submit_urbs to return original generic error
+when submitting URB failed. At the same time, we need to translate -ENODEV
+to DID_NOT_CONNECT for the SCSI layer.
+
+Suggested-by: Oliver Neukum <oneukum@suse.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Weitao Wang <WeitaoWang-oc@zhaoxin.com>
+Link: https://lore.kernel.org/r/20240306180814.4897-1-WeitaoWang-oc@zhaoxin.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/storage/uas.c |   28 +++++++++++++---------------
+ 1 file changed, 13 insertions(+), 15 deletions(-)
+
+--- a/drivers/usb/storage/uas.c
++++ b/drivers/usb/storage/uas.c
+@@ -533,7 +533,7 @@ static struct urb *uas_alloc_cmd_urb(str
+  * daft to me.
+  */
+-static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd, gfp_t gfp)
++static int uas_submit_sense_urb(struct scsi_cmnd *cmnd, gfp_t gfp)
+ {
+       struct uas_dev_info *devinfo = cmnd->device->hostdata;
+       struct urb *urb;
+@@ -541,30 +541,28 @@ static struct urb *uas_submit_sense_urb(
+       urb = uas_alloc_sense_urb(devinfo, gfp, cmnd);
+       if (!urb)
+-              return NULL;
++              return -ENOMEM;
+       usb_anchor_urb(urb, &devinfo->sense_urbs);
+       err = usb_submit_urb(urb, gfp);
+       if (err) {
+               usb_unanchor_urb(urb);
+               uas_log_cmd_state(cmnd, "sense submit err", err);
+               usb_free_urb(urb);
+-              return NULL;
+       }
+-      return urb;
++      return err;
+ }
+ static int uas_submit_urbs(struct scsi_cmnd *cmnd,
+                          struct uas_dev_info *devinfo)
+ {
+       struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
+-      struct urb *urb;
+       int err;
+       lockdep_assert_held(&devinfo->lock);
+       if (cmdinfo->state & SUBMIT_STATUS_URB) {
+-              urb = uas_submit_sense_urb(cmnd, GFP_ATOMIC);
+-              if (!urb)
+-                      return SCSI_MLQUEUE_DEVICE_BUSY;
++              err = uas_submit_sense_urb(cmnd, GFP_ATOMIC);
++              if (err)
++                      return err;
+               cmdinfo->state &= ~SUBMIT_STATUS_URB;
+       }
+@@ -572,7 +570,7 @@ static int uas_submit_urbs(struct scsi_c
+               cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC,
+                                                       cmnd, DMA_FROM_DEVICE);
+               if (!cmdinfo->data_in_urb)
+-                      return SCSI_MLQUEUE_DEVICE_BUSY;
++                      return -ENOMEM;
+               cmdinfo->state &= ~ALLOC_DATA_IN_URB;
+       }
+@@ -582,7 +580,7 @@ static int uas_submit_urbs(struct scsi_c
+               if (err) {
+                       usb_unanchor_urb(cmdinfo->data_in_urb);
+                       uas_log_cmd_state(cmnd, "data in submit err", err);
+-                      return SCSI_MLQUEUE_DEVICE_BUSY;
++                      return err;
+               }
+               cmdinfo->state &= ~SUBMIT_DATA_IN_URB;
+               cmdinfo->state |= DATA_IN_URB_INFLIGHT;
+@@ -592,7 +590,7 @@ static int uas_submit_urbs(struct scsi_c
+               cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC,
+                                                       cmnd, DMA_TO_DEVICE);
+               if (!cmdinfo->data_out_urb)
+-                      return SCSI_MLQUEUE_DEVICE_BUSY;
++                      return -ENOMEM;
+               cmdinfo->state &= ~ALLOC_DATA_OUT_URB;
+       }
+@@ -602,7 +600,7 @@ static int uas_submit_urbs(struct scsi_c
+               if (err) {
+                       usb_unanchor_urb(cmdinfo->data_out_urb);
+                       uas_log_cmd_state(cmnd, "data out submit err", err);
+-                      return SCSI_MLQUEUE_DEVICE_BUSY;
++                      return err;
+               }
+               cmdinfo->state &= ~SUBMIT_DATA_OUT_URB;
+               cmdinfo->state |= DATA_OUT_URB_INFLIGHT;
+@@ -611,7 +609,7 @@ static int uas_submit_urbs(struct scsi_c
+       if (cmdinfo->state & ALLOC_CMD_URB) {
+               cmdinfo->cmd_urb = uas_alloc_cmd_urb(devinfo, GFP_ATOMIC, cmnd);
+               if (!cmdinfo->cmd_urb)
+-                      return SCSI_MLQUEUE_DEVICE_BUSY;
++                      return -ENOMEM;
+               cmdinfo->state &= ~ALLOC_CMD_URB;
+       }
+@@ -621,7 +619,7 @@ static int uas_submit_urbs(struct scsi_c
+               if (err) {
+                       usb_unanchor_urb(cmdinfo->cmd_urb);
+                       uas_log_cmd_state(cmnd, "cmd submit err", err);
+-                      return SCSI_MLQUEUE_DEVICE_BUSY;
++                      return err;
+               }
+               cmdinfo->cmd_urb = NULL;
+               cmdinfo->state &= ~SUBMIT_CMD_URB;
+@@ -698,7 +696,7 @@ static int uas_queuecommand_lck(struct s
+        * of queueing, no matter how fatal the error
+        */
+       if (err == -ENODEV) {
+-              set_host_byte(cmnd, DID_ERROR);
++              set_host_byte(cmnd, DID_NO_CONNECT);
+               scsi_done(cmnd);
+               goto zombie;
+       }