linux/drivers/usb
Sergey Ryazanov 01e01f5c89 usb: cdc-wdm: fix reading stuck on device close
cdc-wdm tracks whether a response reading request is in-progress and
blocks the next request from being sent until the previous request is
completed. As soon as last user closes the cdc-wdm device file, the
driver cancels any ongoing requests, resets the pending response
counter, but leaves the response reading in-progress flag
(WDM_RESPONDING) untouched.

So if the user closes the device file during the response receive
request is being performed, no more data will be obtained from the
modem. The request will be cancelled, effectively preventing the
WDM_RESPONDING flag from being reseted. Keeping the flag set will
prevent a new response receive request from being sent, permanently
blocking the read path. The read path will staying blocked until the
module will be reloaded or till the modem will be re-attached.

This stuck has been observed with a Huawei E3372 modem attached to an
OpenWrt router and using the comgt utility to set up a network
connection.

Fix this issue by clearing the WDM_RESPONDING flag on the device file
close.

Without this fix, the device reading stuck can be easily reproduced in a
few connection establishing attempts. With this fix, a load test for
modem connection re-establishing worked for several hours without any
issues.

Fixes: 922a5eadd5 ("usb: cdc-wdm: Fix race between autosuspend and reading from the device")
Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
Cc: stable <stable@vger.kernel.org>
Acked-by: Oliver Neukum <oneukum@suse.com>
Link: https://lore.kernel.org/r/20220501175828.8185-1-ryazanov.s.a@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-05-05 22:17:43 +02:00
..
atm exit: Rename complete_and_exit to kthread_complete_and_exit 2021-12-13 12:04:45 -06:00
c67x00
cdns3 usb: cdns3: Fix issue for clear halt endpoint 2022-04-09 17:18:00 +02:00
chipidea usb: udc: Fix typo in comment 2022-01-31 14:24:39 +01:00
class usb: cdc-wdm: fix reading stuck on device close 2022-05-05 22:17:43 +02:00
common usb: common: usb-conn-gpio: Make VBUS supply completely optional 2022-03-15 18:22:15 +01:00
core usb: core: Don't hold the device lock while sleeping in do_proc_control() 2022-04-21 19:17:00 +02:00
dwc2 Merge 5.17-rc6 into usb-next 2022-02-28 21:42:36 +01:00
dwc3 usb: dwc3: gadget: Return proper request status 2022-04-26 14:10:25 +02:00
early usb: early: xhci-dbc: Fix xdbc number parsing 2022-03-15 18:20:34 +01:00
gadget usb: gadget: configfs: clear deactivation flag in configfs_composite_unbind() 2022-04-21 19:24:21 +02:00
host xhci: Enable runtime PM on second Alderlake controller 2022-04-21 18:58:54 +02:00
image scsi: Remove drivers/scsi/scsi.h 2022-02-22 21:11:02 -05:00
isp1760 usb: isp1760: remove redundant max_packet() macro 2022-03-15 18:24:02 +01:00
misc usb: misc: eud: Fix an error handling path in eud_probe() 2022-04-21 19:24:10 +02:00
mon
mtu3 usb: mtu3: fix USB 3.0 dual-role-switch from device to host 2022-04-21 19:06:41 +02:00
musb partially Revert "usb: musb: Set the DT node on the child device" 2022-03-15 15:49:15 +01:00
phy usb: phy: generic: Get the vbus supply 2022-04-26 14:10:54 +02:00
renesas_usbhs usb: renesas_usbhs: Use platform_get_irq() to get the interrupt 2021-12-21 08:51:57 +01:00
roles
serial USB: serial: whiteheat: fix heap overflow in WHITEHEAT_GET_DTR_RTS 2022-04-21 10:08:06 +02:00
storage USB/Thunderbolt patches for 5.18-rc1 2022-03-26 13:08:25 -07:00
typec usb: typec: rt1719: Fix build error without CONFIG_POWER_SUPPLY 2022-04-21 18:33:45 +02:00
usbip usb: usbip: eliminate anonymous module_init & module_exit 2022-03-18 12:52:56 +01:00
Kconfig usb: remove reference to deleted config STB03xxx 2021-08-18 15:32:19 +02:00
Makefile usb: host: remove line for obsolete config USB_HWA_HCD 2021-08-18 15:32:19 +02:00
usb-skeleton.c usb: usb-skeleton: Update min() to min_t() 2021-10-05 12:56:48 +02:00