From: Greg Kroah-Hartman Date: Sun, 31 Mar 2024 11:04:50 +0000 (+0200) Subject: 6.1-stable patches X-Git-Tag: v6.7.12~94 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f46088a0ee04b08ec997869da52ca81be8f885ee;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches 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 --- 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 index 00000000000..dba0a2b425f --- /dev/null +++ b/queue-6.1/revert-usb-phy-generic-get-the-vbus-supply.patch @@ -0,0 +1,39 @@ +From fdada0db0b2ae2addef4ccafe50937874dbeeebe Mon Sep 17 00:00:00 2001 +From: Alexander Stein +Date: Thu, 14 Mar 2024 10:26:27 +0100 +Subject: Revert "usb: phy: generic: Get the vbus supply" + +From: Alexander Stein + +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 +Fixes: 75fd6485ccce ("usb: phy: generic: Get the vbus supply") +Cc: stable +Reviewed-by: Sean Anderson +Link: https://lore.kernel.org/r/20240314092628.1869414-1-alexander.stein@ew.tq-group.com +Signed-off-by: Greg Kroah-Hartman +--- + 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"; diff --git a/queue-6.1/series b/queue-6.1/series index 07eef3a289b..9faa219a3cd 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -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 index 00000000000..8108b8b0d98 --- /dev/null +++ b/queue-6.1/usb-cdc-wdm-close-race-between-read-and-workqueue.patch @@ -0,0 +1,47 @@ +From 339f83612f3a569b194680768b22bf113c26a29d Mon Sep 17 00:00:00 2001 +From: Oliver Neukum +Date: Thu, 14 Mar 2024 12:50:48 +0100 +Subject: usb: cdc-wdm: close race between read and workqueue + +From: Oliver Neukum + +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 +Signed-off-by: Oliver Neukum +Link: https://lore.kernel.org/r/20240314115132.3907-1-oneukum@suse.com +Signed-off-by: Greg Kroah-Hartman +--- + 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 index 00000000000..e6ae988f82d --- /dev/null +++ b/queue-6.1/usb-uas-return-enodev-when-submit-urbs-fail-with-device-not-attached.patch @@ -0,0 +1,147 @@ +From cd5432c712351a3d5f82512908f5febfca946ca6 Mon Sep 17 00:00:00 2001 +From: Weitao Wang +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 + +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 +Cc: stable@vger.kernel.org +Signed-off-by: Weitao Wang +Link: https://lore.kernel.org/r/20240306180814.4897-1-WeitaoWang-oc@zhaoxin.com +Signed-off-by: Greg Kroah-Hartman +--- + 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; + }