diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 24 |
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; |