| From 22454b79e6de05fa61a2a72d00d2eed798abbb75 Mon Sep 17 00:00:00 2001 |
| From: Dennis Wassenberg <dennis.wassenberg@secunet.com> |
| Date: Tue, 13 Nov 2018 14:40:34 +0100 |
| Subject: usb: core: Fix hub port connection events lost |
| |
| From: Dennis Wassenberg <dennis.wassenberg@secunet.com> |
| |
| commit 22454b79e6de05fa61a2a72d00d2eed798abbb75 upstream. |
| |
| This will clear the USB_PORT_FEAT_C_CONNECTION bit in case of a hub port reset |
| only if a device is was attached to the hub port before resetting the hub port. |
| |
| Using a Lenovo T480s attached to the ultra dock it was not possible to detect |
| some usb-c devices at the dock usb-c ports because the hub_port_reset code |
| will clear the USB_PORT_FEAT_C_CONNECTION bit after the actual hub port reset. |
| Using this device combo the USB_PORT_FEAT_C_CONNECTION bit was set between the |
| actual hub port reset and the clear of the USB_PORT_FEAT_C_CONNECTION bit. |
| This ends up with clearing the USB_PORT_FEAT_C_CONNECTION bit after the |
| new device was attached such that it was not detected. |
| |
| This patch will not clear the USB_PORT_FEAT_C_CONNECTION bit if there is |
| currently no device attached to the port before the hub port reset. |
| This will avoid clearing the connection bit for new attached devices. |
| |
| Signed-off-by: Dennis Wassenberg <dennis.wassenberg@secunet.com> |
| 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/core/hub.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/usb/core/hub.c |
| +++ b/drivers/usb/core/hub.c |
| @@ -2757,7 +2757,9 @@ static int hub_port_reset(struct usb_hub |
| USB_PORT_FEAT_C_BH_PORT_RESET); |
| usb_clear_port_feature(hub->hdev, port1, |
| USB_PORT_FEAT_C_PORT_LINK_STATE); |
| - usb_clear_port_feature(hub->hdev, port1, |
| + |
| + if (udev) |
| + usb_clear_port_feature(hub->hdev, port1, |
| USB_PORT_FEAT_C_CONNECTION); |
| |
| /* |