|
@@ -555,8 +555,9 @@ static int hub_port_status(struct usb_hub *hub, int port1,
|
|
|
mutex_lock(&hub->status_mutex);
|
|
|
ret = get_port_status(hub->hdev, port1, &hub->status->port);
|
|
|
if (ret < 4) {
|
|
|
- dev_err(hub->intfdev,
|
|
|
- "%s failed (err = %d)\n", __func__, ret);
|
|
|
+ if (ret != -ENODEV)
|
|
|
+ dev_err(hub->intfdev,
|
|
|
+ "%s failed (err = %d)\n", __func__, ret);
|
|
|
if (ret >= 0)
|
|
|
ret = -EIO;
|
|
|
} else {
|
|
@@ -699,7 +700,7 @@ static void hub_tt_work(struct work_struct *work)
|
|
|
/* drop lock so HCD can concurrently report other TT errors */
|
|
|
spin_unlock_irqrestore (&hub->tt.lock, flags);
|
|
|
status = hub_clear_tt_buffer (hdev, clear->devinfo, clear->tt);
|
|
|
- if (status)
|
|
|
+ if (status && status != -ENODEV)
|
|
|
dev_err (&hdev->dev,
|
|
|
"clear tt %d (%04x) error %d\n",
|
|
|
clear->tt, clear->devinfo, status);
|
|
@@ -837,10 +838,11 @@ static int hub_hub_status(struct usb_hub *hub,
|
|
|
|
|
|
mutex_lock(&hub->status_mutex);
|
|
|
ret = get_hub_status(hub->hdev, &hub->status->hub);
|
|
|
- if (ret < 0)
|
|
|
- dev_err (hub->intfdev,
|
|
|
- "%s failed (err = %d)\n", __func__, ret);
|
|
|
- else {
|
|
|
+ if (ret < 0) {
|
|
|
+ if (ret != -ENODEV)
|
|
|
+ dev_err(hub->intfdev,
|
|
|
+ "%s failed (err = %d)\n", __func__, ret);
|
|
|
+ } else {
|
|
|
*status = le16_to_cpu(hub->status->hub.wHubStatus);
|
|
|
*change = le16_to_cpu(hub->status->hub.wHubChange);
|
|
|
ret = 0;
|
|
@@ -877,11 +879,8 @@ static int hub_usb3_port_disable(struct usb_hub *hub, int port1)
|
|
|
return -EINVAL;
|
|
|
|
|
|
ret = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_SS_DISABLED);
|
|
|
- if (ret) {
|
|
|
- dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",
|
|
|
- port1, ret);
|
|
|
+ if (ret)
|
|
|
return ret;
|
|
|
- }
|
|
|
|
|
|
/* Wait for the link to enter the disabled state. */
|
|
|
for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) {
|
|
@@ -918,7 +917,7 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
|
|
|
ret = usb_clear_port_feature(hdev, port1,
|
|
|
USB_PORT_FEAT_ENABLE);
|
|
|
}
|
|
|
- if (ret)
|
|
|
+ if (ret && ret != -ENODEV)
|
|
|
dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",
|
|
|
port1, ret);
|
|
|
return ret;
|
|
@@ -2196,8 +2195,9 @@ static int usb_enumerate_device(struct usb_device *udev)
|
|
|
if (udev->config == NULL) {
|
|
|
err = usb_get_configuration(udev);
|
|
|
if (err < 0) {
|
|
|
- dev_err(&udev->dev, "can't read configurations, error %d\n",
|
|
|
- err);
|
|
|
+ if (err != -ENODEV)
|
|
|
+ dev_err(&udev->dev, "can't read configurations, error %d\n",
|
|
|
+ err);
|
|
|
return err;
|
|
|
}
|
|
|
}
|
|
@@ -2644,14 +2644,16 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
|
|
|
status = set_port_feature(hub->hdev, port1, (warm ?
|
|
|
USB_PORT_FEAT_BH_PORT_RESET :
|
|
|
USB_PORT_FEAT_RESET));
|
|
|
- if (status) {
|
|
|
+ if (status == -ENODEV) {
|
|
|
+ ; /* The hub is gone */
|
|
|
+ } else if (status) {
|
|
|
dev_err(hub->intfdev,
|
|
|
"cannot %sreset port %d (err = %d)\n",
|
|
|
warm ? "warm " : "", port1, status);
|
|
|
} else {
|
|
|
status = hub_port_wait_reset(hub, port1, udev, delay,
|
|
|
warm);
|
|
|
- if (status && status != -ENOTCONN)
|
|
|
+ if (status && status != -ENOTCONN && status != -ENODEV)
|
|
|
dev_dbg(hub->intfdev,
|
|
|
"port_wait_reset: err = %d\n",
|
|
|
status);
|
|
@@ -4094,9 +4096,9 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
goto fail;
|
|
|
}
|
|
|
if (r) {
|
|
|
- dev_err(&udev->dev,
|
|
|
- "device descriptor read/64, error %d\n",
|
|
|
- r);
|
|
|
+ if (r != -ENODEV)
|
|
|
+ dev_err(&udev->dev, "device descriptor read/64, error %d\n",
|
|
|
+ r);
|
|
|
retval = -EMSGSIZE;
|
|
|
continue;
|
|
|
}
|
|
@@ -4116,9 +4118,9 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
msleep(200);
|
|
|
}
|
|
|
if (retval < 0) {
|
|
|
- dev_err(&udev->dev,
|
|
|
- "device not accepting address %d, error %d\n",
|
|
|
- devnum, retval);
|
|
|
+ if (retval != -ENODEV)
|
|
|
+ dev_err(&udev->dev, "device not accepting address %d, error %d\n",
|
|
|
+ devnum, retval);
|
|
|
goto fail;
|
|
|
}
|
|
|
if (udev->speed == USB_SPEED_SUPER) {
|
|
@@ -4140,7 +4142,8 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
|
|
|
retval = usb_get_device_descriptor(udev, 8);
|
|
|
if (retval < 8) {
|
|
|
- dev_err(&udev->dev,
|
|
|
+ if (retval != -ENODEV)
|
|
|
+ dev_err(&udev->dev,
|
|
|
"device descriptor read/8, error %d\n",
|
|
|
retval);
|
|
|
if (retval >= 0)
|
|
@@ -4194,8 +4197,9 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
|
|
|
|
|
retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);
|
|
|
if (retval < (signed)sizeof(udev->descriptor)) {
|
|
|
- dev_err(&udev->dev, "device descriptor read/all, error %d\n",
|
|
|
- retval);
|
|
|
+ if (retval != -ENODEV)
|
|
|
+ dev_err(&udev->dev, "device descriptor read/all, error %d\n",
|
|
|
+ retval);
|
|
|
if (retval >= 0)
|
|
|
retval = -ENOMSG;
|
|
|
goto fail;
|
|
@@ -4377,7 +4381,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
|
|
|
USB_PORT_STAT_C_ENABLE)) {
|
|
|
status = hub_port_debounce_be_stable(hub, port1);
|
|
|
if (status < 0) {
|
|
|
- if (printk_ratelimit())
|
|
|
+ if (status != -ENODEV && printk_ratelimit())
|
|
|
dev_err(hub_dev, "connect-debounce failed, "
|
|
|
"port %d disabled\n", port1);
|
|
|
portstatus &= ~USB_PORT_STAT_CONNECTION;
|
|
@@ -4406,6 +4410,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
|
|
|
else
|
|
|
unit_load = 100;
|
|
|
|
|
|
+ status = 0;
|
|
|
for (i = 0; i < SET_CONFIG_TRIES; i++) {
|
|
|
|
|
|
/* reallocate for each attempt, since references
|
|
@@ -4530,9 +4535,11 @@ loop:
|
|
|
}
|
|
|
if (hub->hdev->parent ||
|
|
|
!hcd->driver->port_handed_over ||
|
|
|
- !(hcd->driver->port_handed_over)(hcd, port1))
|
|
|
- dev_err(hub_dev, "unable to enumerate USB device on port %d\n",
|
|
|
- port1);
|
|
|
+ !(hcd->driver->port_handed_over)(hcd, port1)) {
|
|
|
+ if (status != -ENOTCONN && status != -ENODEV)
|
|
|
+ dev_err(hub_dev, "unable to enumerate USB device on port %d\n",
|
|
|
+ port1);
|
|
|
+ }
|
|
|
|
|
|
done:
|
|
|
hub_port_disable(hub, port1, 1);
|