linux/drivers/usb/misc
Serge Semin 6e3c8beb4f usb: usb251xb: Lock i2c-bus segment the hub resides
SMBus slave configuration is activated by CFG_SEL[1:0]=0x1 pins
state. This is the mode the hub is supposed to be to let this driver
work correctly. But a race condition might happen right after reset
is cleared due to CFG_SEL[0] pin being multiplexed with SMBus SCL
function. In case if the reset pin is handled by a i2c GPIO expander,
which is also placed at the same i2c-bus segment as the usb251x
SMB-interface connected to, then the hub reset clearance might
cause the CFG_SEL[0] being latched in unpredictable state. So
sometimes the hub configuration mode might be 0x1 (as expected),
but sometimes being 0x0, which doesn't imply to have the hub SMBus-slave
interface activated and consequently causes this driver failure.

In order to fix the problem we must make sure the GPIO-reset chip doesn't
reside the same i2c-bus segment as the SMBus-interface of the hub. If
it doesn't, we can safely block the segment for the time the reset is
cleared to prevent anyone generating a traffic at the i2c-bus SCL lane
connected to the CFG_SEL[0] pin. But if it does, nothing we can do, so
just return an error. If we locked the i2c-bus segment and tried to
communicate with the GPIO-expander, it would cause a deadlock. If we didn't
lock the i2c-bus segment, it would randomly cause the CFG_SEL[0] bit flip.

Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-04-25 10:59:03 +02:00
..
sisusbvga usb: sisusb: remove useless macros and compact the code 2019-01-25 10:02:49 +01:00
adutux.c usb: adutux: use irqsave() in USB's complete callback 2018-06-28 19:36:06 +09:00
appledisplay.c Merge 4.20-rc6 into usb-next 2018-12-10 10:19:08 +01:00
chaoskey.c USB: chaoskey: Use kasprintf() over strcpy()/strcat() 2018-02-22 15:17:05 +01:00
cypress_cy7c63.c USB: move many drivers to use DEVICE_ATTR_RW 2018-01-24 08:49:51 +01:00
cytherm.c USB: misc: fix up some remaining DEVICE_ATTR() usages 2018-01-24 08:49:52 +01:00
ehset.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
emi26.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
emi62.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
ezusb.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
ftdi-elan.c usb: ftdi-elan: Fix if == else warnings in ftdi_elan_respond_engine 2019-01-25 10:06:25 +01:00
idmouse.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
iowarrior.c usb: iowarrior: replace kmalloc with kmalloc_array 2018-09-10 20:05:28 +02:00
isight_firmware.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
Kconfig USB: add missing SPDX lines to Kconfig and Makefiles 2019-01-22 09:08:17 +01:00
ldusb.c usb: ldusb: use irqsave() in USB's complete callback 2018-06-28 19:36:06 +09:00
legousbtower.c usb: legousbtower: use irqsave() in USB's complete callback 2018-06-28 19:36:07 +09:00
lvstest.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
rio500_usb.h USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
rio500.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
trancevibrator.c usb: misc: fix obsolete function 2018-09-10 20:06:48 +02:00
usb251xb.c usb: usb251xb: Lock i2c-bus segment the hub resides 2019-04-25 10:59:03 +02:00
usb3503.c usb: misc: usb3503: get optional clock by devm_clk_get_optional() 2019-04-19 14:24:25 +02:00
usb4604.c USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
usb_u132.h USB: misc: Remove redundant license text 2017-11-04 11:55:38 +01:00
usblcd.c USB: add SPDX identifiers to all remaining files in drivers/usb/ 2017-11-04 11:48:02 +01:00
usbsevseg.c USB: misc: fix up some remaining DEVICE_ATTR() usages 2018-01-24 08:49:52 +01:00
usbtest.c usb: misc: usbtest: add super-speed isoc support 2019-02-13 13:03:23 +02:00
uss720.c usb: misc: uss720: Fix two sleep-in-atomic-context bugs 2018-09-05 14:36:53 +02:00
yurex.c USB: yurex: Check for truncation in yurex_read() 2018-09-05 13:27:06 +02:00