| From 3824c1ddaf744be44b170a335332b9d6afe79254 Mon Sep 17 00:00:00 2001 |
| From: Libor Pechacek <lpechacek@suse.cz> |
| Date: Fri, 20 May 2011 14:53:25 +0200 |
| Subject: USB: core: Tolerate protocol stall during hub and port |
| status read |
| |
| From: Libor Pechacek <lpechacek@suse.cz> |
| |
| commit 3824c1ddaf744be44b170a335332b9d6afe79254 upstream. |
| |
| Protocol stall should not be fatal while reading port or hub status as it is |
| transient state. Currently hub EP0 STALL during port status read results in |
| failed device enumeration. This has been observed with ST-Ericsson (formerly |
| Philips) USB 2.0 Hub (04cc:1521) after connecting keyboard. |
| |
| Signed-off-by: Libor Pechacek <lpechacek@suse.cz> |
| Acked-by: Alan Stern <stern@rowland.harvard.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/usb/core/hub.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/usb/core/hub.c |
| +++ b/drivers/usb/core/hub.c |
| @@ -327,7 +327,8 @@ static int get_hub_status(struct usb_dev |
| { |
| int i, status = -ETIMEDOUT; |
| |
| - for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { |
| + for (i = 0; i < USB_STS_RETRIES && |
| + (status == -ETIMEDOUT || status == -EPIPE); i++) { |
| status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), |
| USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0, |
| data, sizeof(*data), USB_STS_TIMEOUT); |
| @@ -343,7 +344,8 @@ static int get_port_status(struct usb_de |
| { |
| int i, status = -ETIMEDOUT; |
| |
| - for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) { |
| + for (i = 0; i < USB_STS_RETRIES && |
| + (status == -ETIMEDOUT || status == -EPIPE); i++) { |
| status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), |
| USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1, |
| data, sizeof(*data), USB_STS_TIMEOUT); |