usb: handle warm-reset port requests on hub resume
[ Upstream commit 4fdc1790e6a9ef22399c6bc6e63b80f4609f3b7e ] On plug-in of my USB-C device, its USB_SS_PORT_LS_SS_INACTIVE link state bit is set. Greping all the kernel for this bit shows that the port status requests a warm-reset this way. This just happens, if its the only device on the root hub, the hub therefore resumes and the HCDs status_urb isn't yet available. If a warm-reset request is detected, this sets the hubs event_bits, which will prevent any auto-suspend and allows the hubs workqueue to warm-reset the port later in port_event. Signed-off-by: Jan-Marek Glogowski <glogow@fbihome.de> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
bc4212d998
commit
041b4fa087
@ -103,6 +103,8 @@ EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
|
|||||||
static void hub_release(struct kref *kref);
|
static void hub_release(struct kref *kref);
|
||||||
static int usb_reset_and_verify_device(struct usb_device *udev);
|
static int usb_reset_and_verify_device(struct usb_device *udev);
|
||||||
static int hub_port_disable(struct usb_hub *hub, int port1, int set_state);
|
static int hub_port_disable(struct usb_hub *hub, int port1, int set_state);
|
||||||
|
static bool hub_port_warm_reset_required(struct usb_hub *hub, int port1,
|
||||||
|
u16 portstatus);
|
||||||
|
|
||||||
static inline char *portspeed(struct usb_hub *hub, int portstatus)
|
static inline char *portspeed(struct usb_hub *hub, int portstatus)
|
||||||
{
|
{
|
||||||
@ -1097,6 +1099,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
|
|||||||
USB_PORT_FEAT_ENABLE);
|
USB_PORT_FEAT_ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make sure a warm-reset request is handled by port_event */
|
||||||
|
if (type == HUB_RESUME &&
|
||||||
|
hub_port_warm_reset_required(hub, port1, portstatus))
|
||||||
|
set_bit(port1, hub->event_bits);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add debounce if USB3 link is in polling/link training state.
|
* Add debounce if USB3 link is in polling/link training state.
|
||||||
* Link will automatically transition to Enabled state after
|
* Link will automatically transition to Enabled state after
|
||||||
|
Loading…
Reference in New Issue
Block a user