diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 52 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.h | 18 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 23 |
4 files changed, 24 insertions, 79 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 826ed692878c..9f59db91cfc2 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -292,6 +292,12 @@ static void rt2500usb_led_brightness(struct led_classdev *led_cdev, | |||
292 | unsigned int activity = | 292 | unsigned int activity = |
293 | led->rt2x00dev->led_flags & LED_SUPPORT_ACTIVITY; | 293 | led->rt2x00dev->led_flags & LED_SUPPORT_ACTIVITY; |
294 | 294 | ||
295 | if (in_atomic()) { | ||
296 | NOTICE(led->rt2x00dev, | ||
297 | "Ignoring LED brightness command for led %d", led->type); | ||
298 | return; | ||
299 | } | ||
300 | |||
295 | if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC) { | 301 | if (led->type == LED_TYPE_RADIO || led->type == LED_TYPE_ASSOC) { |
296 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, | 302 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, |
297 | MAC_CSR20_LINK, enabled); | 303 | MAC_CSR20_LINK, enabled); |
@@ -299,8 +305,8 @@ static void rt2500usb_led_brightness(struct led_classdev *led_cdev, | |||
299 | MAC_CSR20_ACTIVITY, enabled && activity); | 305 | MAC_CSR20_ACTIVITY, enabled && activity); |
300 | } | 306 | } |
301 | 307 | ||
302 | rt2x00usb_vendor_request_async(led->rt2x00dev, USB_SINGLE_WRITE, | 308 | rt2500usb_register_write(led->rt2x00dev, MAC_CSR20, |
303 | MAC_CSR20, led->rt2x00dev->led_mcu_reg); | 309 | led->rt2x00dev->led_mcu_reg); |
304 | } | 310 | } |
305 | #else | 311 | #else |
306 | #define rt2500usb_led_brightness NULL | 312 | #define rt2500usb_led_brightness NULL |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 89471b24a443..063b167da31e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -122,58 +122,6 @@ int rt2x00usb_vendor_request_buff(struct rt2x00_dev *rt2x00dev, | |||
122 | } | 122 | } |
123 | EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_buff); | 123 | EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_buff); |
124 | 124 | ||
125 | static void rt2x00usb_vendor_request_async_complete(struct urb *urb) | ||
126 | { | ||
127 | /* | ||
128 | * We're done with it, descrease usage count and let the | ||
129 | * usb layer delete it as soon as it is done with it. | ||
130 | */ | ||
131 | usb_put_urb(urb); | ||
132 | } | ||
133 | |||
134 | int rt2x00usb_vendor_request_async(struct rt2x00_dev *rt2x00dev, | ||
135 | const u8 request, const u16 offset, | ||
136 | const u16 value) | ||
137 | { | ||
138 | struct usb_device *usb_dev = rt2x00dev_usb_dev(rt2x00dev); | ||
139 | struct usb_ctrlrequest *ctrl; | ||
140 | struct urb *urb; | ||
141 | int status; | ||
142 | |||
143 | urb = usb_alloc_urb(0, GFP_NOIO); | ||
144 | if (!urb) | ||
145 | return -ENOMEM; | ||
146 | |||
147 | ctrl = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); | ||
148 | if (!ctrl) { | ||
149 | status = -ENOMEM; | ||
150 | goto exit; | ||
151 | } | ||
152 | |||
153 | ctrl->bRequestType= USB_VENDOR_REQUEST_OUT; | ||
154 | ctrl->bRequest = request; | ||
155 | ctrl->wValue = cpu_to_le16p(&value); | ||
156 | ctrl->wIndex = cpu_to_le16p(&offset); | ||
157 | ctrl->wLength = 0; | ||
158 | |||
159 | usb_fill_control_urb(urb, usb_dev, usb_sndctrlpipe(usb_dev, 0), | ||
160 | (unsigned char *)ctrl, NULL, 0, | ||
161 | rt2x00usb_vendor_request_async_complete, NULL); | ||
162 | |||
163 | status = usb_submit_urb(urb, GFP_ATOMIC); | ||
164 | if (!status) | ||
165 | goto exit; | ||
166 | |||
167 | return 0; | ||
168 | |||
169 | exit: | ||
170 | usb_put_urb(urb); | ||
171 | kfree(ctrl); | ||
172 | |||
173 | return status; | ||
174 | } | ||
175 | EXPORT_SYMBOL_GPL(rt2x00usb_vendor_request_async); | ||
176 | |||
177 | /* | 125 | /* |
178 | * TX data handlers. | 126 | * TX data handlers. |
179 | */ | 127 | */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.h b/drivers/net/wireless/rt2x00/rt2x00usb.h index 275b089a2a4d..11e55180cbaf 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.h +++ b/drivers/net/wireless/rt2x00/rt2x00usb.h | |||
@@ -194,24 +194,6 @@ static inline int rt2x00usb_eeprom_read(struct rt2x00_dev *rt2x00dev, | |||
194 | eeprom, lenght, timeout); | 194 | eeprom, lenght, timeout); |
195 | } | 195 | } |
196 | 196 | ||
197 | /** | ||
198 | * rt2x00usb_vendor_request_async - Send register command to device (async) | ||
199 | * @rt2x00dev: Pointer to &struct rt2x00_dev | ||
200 | * @request: USB vendor command (See &enum rt2x00usb_vendor_request) | ||
201 | * @offset: Register offset to perform action on | ||
202 | * @value: Value to write to device | ||
203 | * | ||
204 | * Asynchroneous version of &rt2x00usb_vendor_request this is required | ||
205 | * for some routines where the driver cannot sleep because it is in | ||
206 | * irq context. Note that with this function the driver will not be | ||
207 | * notified on failure or timeout of the command. It will only be notified | ||
208 | * if the start of the command succeeded or not. This means it should not be | ||
209 | * used when the command must succeed. | ||
210 | */ | ||
211 | int rt2x00usb_vendor_request_async(struct rt2x00_dev *rt2x00dev, | ||
212 | const u8 request, const u16 offset, | ||
213 | const u16 value); | ||
214 | |||
215 | /* | 197 | /* |
216 | * Radio handlers | 198 | * Radio handlers |
217 | */ | 199 | */ |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index bf2391b89571..6546b0d607b9 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -290,29 +290,38 @@ static void rt73usb_led_brightness(struct led_classdev *led_cdev, | |||
290 | unsigned int bg_mode = | 290 | unsigned int bg_mode = |
291 | (enabled && led->rt2x00dev->curr_band == IEEE80211_BAND_2GHZ); | 291 | (enabled && led->rt2x00dev->curr_band == IEEE80211_BAND_2GHZ); |
292 | 292 | ||
293 | if (in_atomic()) { | ||
294 | NOTICE(led->rt2x00dev, | ||
295 | "Ignoring LED brightness command for led %d", led->type); | ||
296 | return; | ||
297 | } | ||
298 | |||
293 | if (led->type == LED_TYPE_RADIO) { | 299 | if (led->type == LED_TYPE_RADIO) { |
294 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, | 300 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, |
295 | MCU_LEDCS_RADIO_STATUS, enabled); | 301 | MCU_LEDCS_RADIO_STATUS, enabled); |
296 | 302 | ||
297 | rt2x00usb_vendor_request_async(led->rt2x00dev, USB_LED_CONTROL, | 303 | rt2x00usb_vendor_request_sw(led->rt2x00dev, USB_LED_CONTROL, |
298 | 0, led->rt2x00dev->led_mcu_reg); | 304 | 0, led->rt2x00dev->led_mcu_reg, |
305 | REGISTER_TIMEOUT); | ||
299 | } else if (led->type == LED_TYPE_ASSOC) { | 306 | } else if (led->type == LED_TYPE_ASSOC) { |
300 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, | 307 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, |
301 | MCU_LEDCS_LINK_BG_STATUS, bg_mode); | 308 | MCU_LEDCS_LINK_BG_STATUS, bg_mode); |
302 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, | 309 | rt2x00_set_field16(&led->rt2x00dev->led_mcu_reg, |
303 | MCU_LEDCS_LINK_A_STATUS, a_mode); | 310 | MCU_LEDCS_LINK_A_STATUS, a_mode); |
304 | 311 | ||
305 | rt2x00usb_vendor_request_async(led->rt2x00dev, USB_LED_CONTROL, | 312 | rt2x00usb_vendor_request_sw(led->rt2x00dev, USB_LED_CONTROL, |
306 | 0, led->rt2x00dev->led_mcu_reg); | 313 | 0, led->rt2x00dev->led_mcu_reg, |
314 | REGISTER_TIMEOUT); | ||
307 | } else if (led->type == LED_TYPE_QUALITY) { | 315 | } else if (led->type == LED_TYPE_QUALITY) { |
308 | /* | 316 | /* |
309 | * The brightness is divided into 6 levels (0 - 5), | 317 | * The brightness is divided into 6 levels (0 - 5), |
310 | * this means we need to convert the brightness | 318 | * this means we need to convert the brightness |
311 | * argument into the matching level within that range. | 319 | * argument into the matching level within that range. |
312 | */ | 320 | */ |
313 | rt2x00usb_vendor_request_async(led->rt2x00dev, USB_LED_CONTROL, | 321 | rt2x00usb_vendor_request_sw(led->rt2x00dev, USB_LED_CONTROL, |
314 | brightness / (LED_FULL / 6), | 322 | brightness / (LED_FULL / 6), |
315 | led->rt2x00dev->led_mcu_reg); | 323 | led->rt2x00dev->led_mcu_reg, |
324 | REGISTER_TIMEOUT); | ||
316 | } | 325 | } |
317 | } | 326 | } |
318 | #else | 327 | #else |