aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00usb.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
index dc85d3e0ffe5..892270dd3e7b 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
@@ -42,37 +42,27 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
42{ 42{
43 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); 43 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
44 int status; 44 int status;
45 unsigned int i;
46 unsigned int pipe = 45 unsigned int pipe =
47 (requesttype == USB_VENDOR_REQUEST_IN) ? 46 (requesttype == USB_VENDOR_REQUEST_IN) ?
48 usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0); 47 usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
48 unsigned long expire = jiffies + msecs_to_jiffies(timeout);
49 49
50 if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) 50 if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
51 return -ENODEV; 51 return -ENODEV;
52 52
53 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 53 do {
54 status = usb_control_msg(usb_dev, pipe, request, requesttype, 54 status = usb_control_msg(usb_dev, pipe, request, requesttype,
55 value, offset, buffer, buffer_length, 55 value, offset, buffer, buffer_length,
56 timeout); 56 timeout / 2);
57 if (status >= 0) 57 if (status >= 0)
58 return 0; 58 return 0;
59 59
60 /* 60 if (status == -ENODEV) {
61 * Check for errors 61 /* Device has disappeared. */
62 * -ENODEV: Device has disappeared, no point continuing.
63 * All other errors: Try again.
64 */
65 else if (status == -ENODEV) {
66 clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); 62 clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
67 break; 63 break;
68 } 64 }
69 } 65 } while (time_before(jiffies, expire));
70
71 /* If the port is powered down, we get a -EPROTO error, and this
72 * leads to a endless loop. So just say that the device is gone.
73 */
74 if (status == -EPROTO)
75 clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
76 66
77 rt2x00_err(rt2x00dev, 67 rt2x00_err(rt2x00dev,
78 "Vendor Request 0x%02x failed for offset 0x%04x with error %d\n", 68 "Vendor Request 0x%02x failed for offset 0x%04x with error %d\n",
@@ -154,7 +144,7 @@ int rt2x00usb_regbusy_read(struct rt2x00_dev *rt2x00dev,
154 if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) 144 if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
155 return -ENODEV; 145 return -ENODEV;
156 146
157 for (i = 0; i < REGISTER_BUSY_COUNT; i++) { 147 for (i = 0; i < REGISTER_USB_BUSY_COUNT; i++) {
158 rt2x00usb_register_read_lock(rt2x00dev, offset, reg); 148 rt2x00usb_register_read_lock(rt2x00dev, offset, reg);
159 if (!rt2x00_get_field32(*reg, field)) 149 if (!rt2x00_get_field32(*reg, field))
160 return 1; 150 return 1;