blob: e1c2fcaa8bed92889a3cc30d0dd8fcd6c3bffb00 [file] [log] [blame]
Christian Lamparterb63a2cb2009-03-21 23:05:48 +01001/*
2 * Atheros AR9170 driver
3 *
4 * USB - frontend
5 *
6 * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
7 * Copyright 2009, Christian Lamparter <chunkeey@web.de>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; see the file COPYING. If not, see
21 * http://www.gnu.org/licenses/.
22 *
23 * This file incorporates work covered by the following copyright and
24 * permission notice:
25 * Copyright (c) 2007-2008 Atheros Communications, Inc.
26 *
27 * Permission to use, copy, modify, and/or distribute this software for any
28 * purpose with or without fee is hereby granted, provided that the above
29 * copyright notice and this permission notice appear in all copies.
30 *
31 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
32 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
33 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
34 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
35 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
36 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
37 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
38 */
39
40#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090041#include <linux/slab.h>
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010042#include <linux/usb.h>
43#include <linux/firmware.h>
44#include <linux/etherdevice.h>
45#include <net/mac80211.h>
46#include "ar9170.h"
47#include "cmd.h"
48#include "hw.h"
49#include "usb.h"
50
Christian Lamparterde00c042009-03-24 16:21:55 +010051MODULE_AUTHOR("Johannes Berg <johannes@sipsolutions.net>");
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010052MODULE_AUTHOR("Christian Lamparter <chunkeey@web.de>");
53MODULE_LICENSE("GPL");
Christian Lamparterde00c042009-03-24 16:21:55 +010054MODULE_DESCRIPTION("Atheros AR9170 802.11n USB wireless");
Luis R. Rodriguezc768b582009-05-28 17:36:04 -040055MODULE_FIRMWARE("ar9170.fw");
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010056MODULE_FIRMWARE("ar9170-1.fw");
57MODULE_FIRMWARE("ar9170-2.fw");
58
Luis R. Rodriguezbdf6d322009-05-28 17:36:05 -040059enum ar9170_requirements {
60 AR9170_REQ_FW1_ONLY = 1,
61};
62
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010063static struct usb_device_id ar9170_usb_ids[] = {
64 /* Atheros 9170 */
65 { USB_DEVICE(0x0cf3, 0x9170) },
66 /* Atheros TG121N */
67 { USB_DEVICE(0x0cf3, 0x1001) },
Christian Lamparterfe9f6342009-09-17 13:46:53 +020068 /* TP-Link TL-WN821N v2 */
69 { USB_DEVICE(0x0cf3, 0x1002) },
Christian Lamparter4fc298b2009-03-24 21:58:08 +010070 /* Cace Airpcap NX */
71 { USB_DEVICE(0xcace, 0x0300) },
Thomas Klute15295382009-11-17 11:58:18 +010072 /* D-Link DWA 160 A1 */
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010073 { USB_DEVICE(0x07d1, 0x3c10) },
Thomas Klute15295382009-11-17 11:58:18 +010074 /* D-Link DWA 160 A2 */
75 { USB_DEVICE(0x07d1, 0x3a09) },
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010076 /* Netgear WNDA3100 */
77 { USB_DEVICE(0x0846, 0x9010) },
78 /* Netgear WN111 v2 */
79 { USB_DEVICE(0x0846, 0x9001) },
80 /* Zydas ZD1221 */
81 { USB_DEVICE(0x0ace, 0x1221) },
Christian Lamparter957b0512009-04-17 14:52:23 +020082 /* ZyXEL NWD271N */
83 { USB_DEVICE(0x0586, 0x3417) },
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010084 /* Z-Com UB81 BG */
85 { USB_DEVICE(0x0cde, 0x0023) },
86 /* Z-Com UB82 ABG */
87 { USB_DEVICE(0x0cde, 0x0026) },
Stefan Seyfried5b6e2f12009-12-08 15:21:34 +010088 /* Sphairon Homelink 1202 */
89 { USB_DEVICE(0x0cde, 0x0027) },
Christian Lamparterb63a2cb2009-03-21 23:05:48 +010090 /* Arcadyan WN7512 */
91 { USB_DEVICE(0x083a, 0xf522) },
92 /* Planex GWUS300 */
93 { USB_DEVICE(0x2019, 0x5304) },
94 /* IO-Data WNGDNUS2 */
95 { USB_DEVICE(0x04bb, 0x093f) },
Luis R. Rodriguezbdf6d322009-05-28 17:36:05 -040096 /* AVM FRITZ!WLAN USB Stick N */
97 { USB_DEVICE(0x057C, 0x8401) },
Ben Konratheb3d72c2010-03-18 19:06:57 -040098 /* NEC WL300NU-G */
99 { USB_DEVICE(0x0409, 0x0249) },
Luis R. Rodriguezbdf6d322009-05-28 17:36:05 -0400100 /* AVM FRITZ!WLAN USB Stick N 2.4 */
101 { USB_DEVICE(0x057C, 0x8402), .driver_info = AR9170_REQ_FW1_ONLY },
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100102
103 /* terminate */
104 {}
105};
106MODULE_DEVICE_TABLE(usb, ar9170_usb_ids);
107
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200108static void ar9170_usb_submit_urb(struct ar9170_usb *aru)
109{
110 struct urb *urb;
111 unsigned long flags;
112 int err;
113
114 if (unlikely(!IS_STARTED(&aru->common)))
115 return ;
116
117 spin_lock_irqsave(&aru->tx_urb_lock, flags);
Christian Lamparter731d6bf2009-10-17 21:56:51 +0200118 if (atomic_read(&aru->tx_submitted_urbs) >= AR9170_NUM_TX_URBS) {
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200119 spin_unlock_irqrestore(&aru->tx_urb_lock, flags);
120 return ;
121 }
Christian Lamparter731d6bf2009-10-17 21:56:51 +0200122 atomic_inc(&aru->tx_submitted_urbs);
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200123
124 urb = usb_get_from_anchor(&aru->tx_pending);
125 if (!urb) {
Christian Lamparter731d6bf2009-10-17 21:56:51 +0200126 atomic_dec(&aru->tx_submitted_urbs);
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200127 spin_unlock_irqrestore(&aru->tx_urb_lock, flags);
128
129 return ;
130 }
131 spin_unlock_irqrestore(&aru->tx_urb_lock, flags);
132
133 aru->tx_pending_urbs--;
134 usb_anchor_urb(urb, &aru->tx_submitted);
135
136 err = usb_submit_urb(urb, GFP_ATOMIC);
137 if (unlikely(err)) {
138 if (ar9170_nag_limiter(&aru->common))
139 dev_err(&aru->udev->dev, "submit_urb failed (%d).\n",
140 err);
141
142 usb_unanchor_urb(urb);
Christian Lamparter731d6bf2009-10-17 21:56:51 +0200143 atomic_dec(&aru->tx_submitted_urbs);
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200144 ar9170_tx_callback(&aru->common, urb->context);
145 }
146
147 usb_free_urb(urb);
148}
149
150static void ar9170_usb_tx_urb_complete_frame(struct urb *urb)
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100151{
152 struct sk_buff *skb = urb->context;
153 struct ar9170_usb *aru = (struct ar9170_usb *)
154 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
155
Christian Lamparter66d00812009-05-28 17:04:27 +0200156 if (unlikely(!aru)) {
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100157 dev_kfree_skb_irq(skb);
158 return ;
159 }
160
Christian Lamparter731d6bf2009-10-17 21:56:51 +0200161 atomic_dec(&aru->tx_submitted_urbs);
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200162
163 ar9170_tx_callback(&aru->common, skb);
164
165 ar9170_usb_submit_urb(aru);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100166}
167
168static void ar9170_usb_tx_urb_complete(struct urb *urb)
169{
170}
171
172static void ar9170_usb_irq_completed(struct urb *urb)
173{
174 struct ar9170_usb *aru = urb->context;
175
176 switch (urb->status) {
177 /* everything is fine */
178 case 0:
179 break;
180
181 /* disconnect */
182 case -ENOENT:
183 case -ECONNRESET:
184 case -ENODEV:
185 case -ESHUTDOWN:
186 goto free;
187
188 default:
189 goto resubmit;
190 }
191
Christian Lamparter66d00812009-05-28 17:04:27 +0200192 ar9170_handle_command_response(&aru->common, urb->transfer_buffer,
193 urb->actual_length);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100194
195resubmit:
196 usb_anchor_urb(urb, &aru->rx_submitted);
197 if (usb_submit_urb(urb, GFP_ATOMIC)) {
198 usb_unanchor_urb(urb);
199 goto free;
200 }
201
202 return;
203
204free:
205 usb_buffer_free(aru->udev, 64, urb->transfer_buffer, urb->transfer_dma);
206}
207
208static void ar9170_usb_rx_completed(struct urb *urb)
209{
210 struct sk_buff *skb = urb->context;
211 struct ar9170_usb *aru = (struct ar9170_usb *)
212 usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
213 int err;
214
215 if (!aru)
216 goto free;
217
218 switch (urb->status) {
219 /* everything is fine */
220 case 0:
221 break;
222
223 /* disconnect */
224 case -ENOENT:
225 case -ECONNRESET:
226 case -ENODEV:
227 case -ESHUTDOWN:
228 goto free;
229
230 default:
231 goto resubmit;
232 }
233
234 skb_put(skb, urb->actual_length);
235 ar9170_rx(&aru->common, skb);
236
237resubmit:
238 skb_reset_tail_pointer(skb);
239 skb_trim(skb, 0);
240
241 usb_anchor_urb(urb, &aru->rx_submitted);
242 err = usb_submit_urb(urb, GFP_ATOMIC);
Christian Lamparter66d00812009-05-28 17:04:27 +0200243 if (unlikely(err)) {
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100244 usb_unanchor_urb(urb);
Christian Lamparter66d00812009-05-28 17:04:27 +0200245 goto free;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100246 }
247
248 return ;
249
250free:
251 dev_kfree_skb_irq(skb);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100252}
253
254static int ar9170_usb_prep_rx_urb(struct ar9170_usb *aru,
255 struct urb *urb, gfp_t gfp)
256{
257 struct sk_buff *skb;
258
259 skb = __dev_alloc_skb(AR9170_MAX_RX_BUFFER_SIZE + 32, gfp);
260 if (!skb)
261 return -ENOMEM;
262
263 /* reserve some space for mac80211's radiotap */
264 skb_reserve(skb, 32);
265
266 usb_fill_bulk_urb(urb, aru->udev,
267 usb_rcvbulkpipe(aru->udev, AR9170_EP_RX),
268 skb->data, min(skb_tailroom(skb),
269 AR9170_MAX_RX_BUFFER_SIZE),
270 ar9170_usb_rx_completed, skb);
271
272 return 0;
273}
274
275static int ar9170_usb_alloc_rx_irq_urb(struct ar9170_usb *aru)
276{
277 struct urb *urb = NULL;
278 void *ibuf;
279 int err = -ENOMEM;
280
281 /* initialize interrupt endpoint */
282 urb = usb_alloc_urb(0, GFP_KERNEL);
283 if (!urb)
284 goto out;
285
286 ibuf = usb_buffer_alloc(aru->udev, 64, GFP_KERNEL, &urb->transfer_dma);
287 if (!ibuf)
288 goto out;
289
290 usb_fill_int_urb(urb, aru->udev,
291 usb_rcvintpipe(aru->udev, AR9170_EP_IRQ), ibuf,
292 64, ar9170_usb_irq_completed, aru, 1);
293 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
294
295 usb_anchor_urb(urb, &aru->rx_submitted);
296 err = usb_submit_urb(urb, GFP_KERNEL);
297 if (err) {
298 usb_unanchor_urb(urb);
299 usb_buffer_free(aru->udev, 64, urb->transfer_buffer,
300 urb->transfer_dma);
301 }
302
303out:
304 usb_free_urb(urb);
305 return err;
306}
307
308static int ar9170_usb_alloc_rx_bulk_urbs(struct ar9170_usb *aru)
309{
310 struct urb *urb;
311 int i;
312 int err = -EINVAL;
313
314 for (i = 0; i < AR9170_NUM_RX_URBS; i++) {
315 err = -ENOMEM;
316 urb = usb_alloc_urb(0, GFP_KERNEL);
317 if (!urb)
318 goto err_out;
319
320 err = ar9170_usb_prep_rx_urb(aru, urb, GFP_KERNEL);
321 if (err) {
322 usb_free_urb(urb);
323 goto err_out;
324 }
325
326 usb_anchor_urb(urb, &aru->rx_submitted);
327 err = usb_submit_urb(urb, GFP_KERNEL);
328 if (err) {
329 usb_unanchor_urb(urb);
330 dev_kfree_skb_any((void *) urb->transfer_buffer);
331 usb_free_urb(urb);
332 goto err_out;
333 }
334 usb_free_urb(urb);
335 }
336
337 /* the device now waiting for a firmware. */
338 aru->common.state = AR9170_IDLE;
339 return 0;
340
341err_out:
342
343 usb_kill_anchored_urbs(&aru->rx_submitted);
344 return err;
345}
346
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200347static int ar9170_usb_flush(struct ar9170 *ar)
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100348{
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200349 struct ar9170_usb *aru = (void *) ar;
350 struct urb *urb;
351 int ret, err = 0;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100352
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200353 if (IS_STARTED(ar))
354 aru->common.state = AR9170_IDLE;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100355
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200356 usb_wait_anchor_empty_timeout(&aru->tx_pending,
357 msecs_to_jiffies(800));
358 while ((urb = usb_get_from_anchor(&aru->tx_pending))) {
359 ar9170_tx_callback(&aru->common, (void *) urb->context);
360 usb_free_urb(urb);
361 }
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100362
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200363 /* lets wait a while until the tx - queues are dried out */
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100364 ret = usb_wait_anchor_empty_timeout(&aru->tx_submitted,
365 msecs_to_jiffies(100));
366 if (ret == 0)
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200367 err = -ETIMEDOUT;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100368
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200369 usb_kill_anchored_urbs(&aru->tx_submitted);
370
371 if (IS_ACCEPTING_CMD(ar))
372 aru->common.state = AR9170_STARTED;
373
374 return err;
375}
376
377static void ar9170_usb_cancel_urbs(struct ar9170_usb *aru)
378{
379 int err;
380
381 aru->common.state = AR9170_UNKNOWN_STATE;
382
383 err = ar9170_usb_flush(&aru->common);
384 if (err)
385 dev_err(&aru->udev->dev, "stuck tx urbs!\n");
386
387 usb_poison_anchored_urbs(&aru->tx_submitted);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100388 usb_poison_anchored_urbs(&aru->rx_submitted);
389}
390
391static int ar9170_usb_exec_cmd(struct ar9170 *ar, enum ar9170_cmd cmd,
392 unsigned int plen, void *payload,
393 unsigned int outlen, void *out)
394{
395 struct ar9170_usb *aru = (void *) ar;
396 struct urb *urb = NULL;
397 unsigned long flags;
398 int err = -ENOMEM;
399
400 if (unlikely(!IS_ACCEPTING_CMD(ar)))
401 return -EPERM;
402
403 if (WARN_ON(plen > AR9170_MAX_CMD_LEN - 4))
404 return -EINVAL;
405
406 urb = usb_alloc_urb(0, GFP_ATOMIC);
407 if (unlikely(!urb))
408 goto err_free;
409
410 ar->cmdbuf[0] = cpu_to_le32(plen);
411 ar->cmdbuf[0] |= cpu_to_le32(cmd << 8);
412 /* writing multiple regs fills this buffer already */
413 if (plen && payload != (u8 *)(&ar->cmdbuf[1]))
414 memcpy(&ar->cmdbuf[1], payload, plen);
415
416 spin_lock_irqsave(&aru->common.cmdlock, flags);
417 aru->readbuf = (u8 *)out;
418 aru->readlen = outlen;
419 spin_unlock_irqrestore(&aru->common.cmdlock, flags);
420
421 usb_fill_int_urb(urb, aru->udev,
Valentin Longchamp2d20c72c2010-03-26 11:44:33 +0100422 usb_sndintpipe(aru->udev, AR9170_EP_CMD),
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100423 aru->common.cmdbuf, plen + 4,
424 ar9170_usb_tx_urb_complete, NULL, 1);
425
426 usb_anchor_urb(urb, &aru->tx_submitted);
427 err = usb_submit_urb(urb, GFP_ATOMIC);
Christian Lamparter66d00812009-05-28 17:04:27 +0200428 if (unlikely(err)) {
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100429 usb_unanchor_urb(urb);
430 usb_free_urb(urb);
431 goto err_unbuf;
432 }
433 usb_free_urb(urb);
434
435 err = wait_for_completion_timeout(&aru->cmd_wait, HZ);
436 if (err == 0) {
437 err = -ETIMEDOUT;
438 goto err_unbuf;
439 }
440
Roel Kluinba5101d2009-04-26 14:40:59 +0200441 if (aru->readlen != outlen) {
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100442 err = -EMSGSIZE;
443 goto err_unbuf;
444 }
445
446 return 0;
447
448err_unbuf:
449 /* Maybe the device was removed in the second we were waiting? */
450 if (IS_STARTED(ar)) {
451 dev_err(&aru->udev->dev, "no command feedback "
452 "received (%d).\n", err);
453
454 /* provide some maybe useful debug information */
455 print_hex_dump_bytes("ar9170 cmd: ", DUMP_PREFIX_NONE,
456 aru->common.cmdbuf, plen + 4);
457 dump_stack();
458 }
459
460 /* invalidate to avoid completing the next prematurely */
461 spin_lock_irqsave(&aru->common.cmdlock, flags);
462 aru->readbuf = NULL;
463 aru->readlen = 0;
464 spin_unlock_irqrestore(&aru->common.cmdlock, flags);
465
466err_free:
467
468 return err;
469}
470
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200471static int ar9170_usb_tx(struct ar9170 *ar, struct sk_buff *skb)
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100472{
473 struct ar9170_usb *aru = (struct ar9170_usb *) ar;
474 struct urb *urb;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100475
476 if (unlikely(!IS_STARTED(ar))) {
477 /* Seriously, what were you drink... err... thinking!? */
478 return -EPERM;
479 }
480
481 urb = usb_alloc_urb(0, GFP_ATOMIC);
482 if (unlikely(!urb))
483 return -ENOMEM;
484
485 usb_fill_bulk_urb(urb, aru->udev,
486 usb_sndbulkpipe(aru->udev, AR9170_EP_TX),
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200487 skb->data, skb->len,
488 ar9170_usb_tx_urb_complete_frame, skb);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100489 urb->transfer_flags |= URB_ZERO_PACKET;
490
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200491 usb_anchor_urb(urb, &aru->tx_pending);
492 aru->tx_pending_urbs++;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100493
494 usb_free_urb(urb);
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200495
496 ar9170_usb_submit_urb(aru);
497 return 0;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100498}
499
500static void ar9170_usb_callback_cmd(struct ar9170 *ar, u32 len , void *buffer)
501{
502 struct ar9170_usb *aru = (void *) ar;
503 unsigned long flags;
504 u32 in, out;
505
Christian Lamparter66d00812009-05-28 17:04:27 +0200506 if (unlikely(!buffer))
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100507 return ;
508
509 in = le32_to_cpup((__le32 *)buffer);
510 out = le32_to_cpu(ar->cmdbuf[0]);
511
512 /* mask off length byte */
513 out &= ~0xFF;
514
515 if (aru->readlen >= 0) {
516 /* add expected length */
517 out |= aru->readlen;
518 } else {
519 /* add obtained length */
520 out |= in & 0xFF;
521 }
522
523 /*
524 * Some commands (e.g: AR9170_CMD_FREQUENCY) have a variable response
525 * length and we cannot predict the correct length in advance.
526 * So we only check if we provided enough space for the data.
527 */
528 if (unlikely(out < in)) {
529 dev_warn(&aru->udev->dev, "received invalid command response "
530 "got %d bytes, instead of %d bytes "
531 "and the resp length is %d bytes\n",
532 in, out, len);
533 print_hex_dump_bytes("ar9170 invalid resp: ",
534 DUMP_PREFIX_OFFSET, buffer, len);
535 /*
536 * Do not complete, then the command times out,
537 * and we get a stack trace from there.
538 */
539 return ;
540 }
541
542 spin_lock_irqsave(&aru->common.cmdlock, flags);
543 if (aru->readbuf && len > 0) {
544 memcpy(aru->readbuf, buffer + 4, len - 4);
545 aru->readbuf = NULL;
546 }
547 complete(&aru->cmd_wait);
548 spin_unlock_irqrestore(&aru->common.cmdlock, flags);
549}
550
551static int ar9170_usb_upload(struct ar9170_usb *aru, const void *data,
552 size_t len, u32 addr, bool complete)
553{
554 int transfer, err;
555 u8 *buf = kmalloc(4096, GFP_KERNEL);
556
557 if (!buf)
558 return -ENOMEM;
559
560 while (len) {
561 transfer = min_t(int, len, 4096);
562 memcpy(buf, data, transfer);
563
564 err = usb_control_msg(aru->udev, usb_sndctrlpipe(aru->udev, 0),
565 0x30 /* FW DL */, 0x40 | USB_DIR_OUT,
566 addr >> 8, 0, buf, transfer, 1000);
567
568 if (err < 0) {
569 kfree(buf);
570 return err;
571 }
572
573 len -= transfer;
574 data += transfer;
575 addr += transfer;
576 }
577 kfree(buf);
578
579 if (complete) {
580 err = usb_control_msg(aru->udev, usb_sndctrlpipe(aru->udev, 0),
581 0x31 /* FW DL COMPLETE */,
582 0x40 | USB_DIR_OUT, 0, 0, NULL, 0, 5000);
583 }
584
585 return 0;
586}
587
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100588static int ar9170_usb_reset(struct ar9170_usb *aru)
589{
590 int ret, lock = (aru->intf->condition != USB_INTERFACE_BINDING);
591
592 if (lock) {
593 ret = usb_lock_device_for_reset(aru->udev, aru->intf);
594 if (ret < 0) {
595 dev_err(&aru->udev->dev, "unable to lock device "
596 "for reset (%d).\n", ret);
597 return ret;
598 }
599 }
600
601 ret = usb_reset_device(aru->udev);
602 if (lock)
603 usb_unlock_device(aru->udev);
604
605 /* let it rest - for a second - */
606 msleep(1000);
607
608 return ret;
609}
610
611static int ar9170_usb_upload_firmware(struct ar9170_usb *aru)
612{
613 int err;
614
Luis R. Rodriguezc768b582009-05-28 17:36:04 -0400615 if (!aru->init_values)
616 goto upload_fw_start;
617
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100618 /* First, upload initial values to device RAM */
619 err = ar9170_usb_upload(aru, aru->init_values->data,
620 aru->init_values->size, 0x102800, false);
621 if (err) {
622 dev_err(&aru->udev->dev, "firmware part 1 "
623 "upload failed (%d).\n", err);
624 return err;
625 }
626
Luis R. Rodriguezc768b582009-05-28 17:36:04 -0400627upload_fw_start:
628
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100629 /* Then, upload the firmware itself and start it */
630 return ar9170_usb_upload(aru, aru->firmware->data, aru->firmware->size,
631 0x200000, true);
632}
633
634static int ar9170_usb_init_transport(struct ar9170_usb *aru)
635{
636 struct ar9170 *ar = (void *) &aru->common;
637 int err;
638
639 ar9170_regwrite_begin(ar);
640
641 /* Set USB Rx stream mode MAX packet number to 2 */
642 ar9170_regwrite(AR9170_USB_REG_MAX_AGG_UPLOAD, 0x4);
643
644 /* Set USB Rx stream mode timeout to 10us */
645 ar9170_regwrite(AR9170_USB_REG_UPLOAD_TIME_CTL, 0x80);
646
647 ar9170_regwrite_finish();
648
649 err = ar9170_regwrite_result();
650 if (err)
651 dev_err(&aru->udev->dev, "USB setup failed (%d).\n", err);
652
653 return err;
654}
655
656static void ar9170_usb_stop(struct ar9170 *ar)
657{
658 struct ar9170_usb *aru = (void *) ar;
659 int ret;
660
661 if (IS_ACCEPTING_CMD(ar))
662 aru->common.state = AR9170_STOPPED;
663
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200664 ret = ar9170_usb_flush(ar);
665 if (ret)
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100666 dev_err(&aru->udev->dev, "kill pending tx urbs.\n");
667
668 usb_poison_anchored_urbs(&aru->tx_submitted);
669
670 /*
671 * Note:
672 * So far we freed all tx urbs, but we won't dare to touch any rx urbs.
673 * Else we would end up with a unresponsive device...
674 */
675}
676
677static int ar9170_usb_open(struct ar9170 *ar)
678{
679 struct ar9170_usb *aru = (void *) ar;
680 int err;
681
682 usb_unpoison_anchored_urbs(&aru->tx_submitted);
683 err = ar9170_usb_init_transport(aru);
684 if (err) {
685 usb_poison_anchored_urbs(&aru->tx_submitted);
686 return err;
687 }
688
689 aru->common.state = AR9170_IDLE;
690 return 0;
691}
692
Christian Lampartere10a9df2009-04-18 17:12:18 +0200693static int ar9170_usb_init_device(struct ar9170_usb *aru)
694{
695 int err;
696
697 err = ar9170_usb_alloc_rx_irq_urb(aru);
698 if (err)
699 goto err_out;
700
701 err = ar9170_usb_alloc_rx_bulk_urbs(aru);
702 if (err)
703 goto err_unrx;
704
705 err = ar9170_usb_upload_firmware(aru);
706 if (err) {
707 err = ar9170_echo_test(&aru->common, 0x60d43110);
708 if (err) {
709 /* force user invention, by disabling the device */
710 err = usb_driver_set_configuration(aru->udev, -1);
711 dev_err(&aru->udev->dev, "device is in a bad state. "
712 "please reconnect it!\n");
713 goto err_unrx;
714 }
715 }
716
717 return 0;
718
719err_unrx:
720 ar9170_usb_cancel_urbs(aru);
721
722err_out:
723 return err;
724}
725
Johannes Berg53576512009-12-23 13:15:30 +0100726static void ar9170_usb_firmware_failed(struct ar9170_usb *aru)
727{
728 struct device *parent = aru->udev->dev.parent;
729
Christian Lamparter160b8242010-04-29 17:53:33 +0200730 complete(&aru->firmware_loading_complete);
731
Johannes Berg53576512009-12-23 13:15:30 +0100732 /* unbind anything failed */
733 if (parent)
734 down(&parent->sem);
735 device_release_driver(&aru->udev->dev);
736 if (parent)
737 up(&parent->sem);
Christian Lamparter160b8242010-04-29 17:53:33 +0200738
739 usb_put_dev(aru->udev);
Johannes Berg53576512009-12-23 13:15:30 +0100740}
741
742static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context)
743{
744 struct ar9170_usb *aru = context;
745 int err;
746
747 aru->firmware = fw;
748
749 if (!fw) {
750 dev_err(&aru->udev->dev, "firmware file not found.\n");
751 goto err_freefw;
752 }
753
754 err = ar9170_usb_init_device(aru);
755 if (err)
756 goto err_freefw;
757
758 err = ar9170_usb_open(&aru->common);
759 if (err)
760 goto err_unrx;
761
762 err = ar9170_register(&aru->common, &aru->udev->dev);
763
764 ar9170_usb_stop(&aru->common);
765 if (err)
766 goto err_unrx;
767
Christian Lamparter160b8242010-04-29 17:53:33 +0200768 complete(&aru->firmware_loading_complete);
769 usb_put_dev(aru->udev);
Johannes Berg53576512009-12-23 13:15:30 +0100770 return;
771
772 err_unrx:
773 ar9170_usb_cancel_urbs(aru);
774
775 err_freefw:
776 ar9170_usb_firmware_failed(aru);
777}
778
779static void ar9170_usb_firmware_inits(const struct firmware *fw,
780 void *context)
781{
782 struct ar9170_usb *aru = context;
783 int err;
784
785 if (!fw) {
786 dev_err(&aru->udev->dev, "file with init values not found.\n");
787 ar9170_usb_firmware_failed(aru);
788 return;
789 }
790
791 aru->init_values = fw;
792
793 /* ok so we have the init values -- get code for two-stage */
794
795 err = request_firmware_nowait(THIS_MODULE, 1, "ar9170-2.fw",
796 &aru->udev->dev, GFP_KERNEL, aru,
797 ar9170_usb_firmware_finish);
798 if (err)
799 ar9170_usb_firmware_failed(aru);
800}
801
802static void ar9170_usb_firmware_step2(const struct firmware *fw, void *context)
803{
804 struct ar9170_usb *aru = context;
805 int err;
806
807 if (fw) {
808 ar9170_usb_firmware_finish(fw, context);
809 return;
810 }
811
812 if (aru->req_one_stage_fw) {
813 dev_err(&aru->udev->dev, "ar9170.fw firmware file "
814 "not found and is required for this device\n");
815 ar9170_usb_firmware_failed(aru);
816 return;
817 }
818
819 dev_err(&aru->udev->dev, "ar9170.fw firmware file "
820 "not found, trying old firmware...\n");
821
822 err = request_firmware_nowait(THIS_MODULE, 1, "ar9170-1.fw",
823 &aru->udev->dev, GFP_KERNEL, aru,
824 ar9170_usb_firmware_inits);
825 if (err)
826 ar9170_usb_firmware_failed(aru);
827}
828
Luis R. Rodriguezbdf6d322009-05-28 17:36:05 -0400829static bool ar9170_requires_one_stage(const struct usb_device_id *id)
830{
831 if (!id->driver_info)
832 return false;
833 if (id->driver_info == AR9170_REQ_FW1_ONLY)
834 return true;
835 return false;
836}
837
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100838static int ar9170_usb_probe(struct usb_interface *intf,
839 const struct usb_device_id *id)
840{
841 struct ar9170_usb *aru;
842 struct ar9170 *ar;
843 struct usb_device *udev;
844 int err;
845
846 aru = ar9170_alloc(sizeof(*aru));
847 if (IS_ERR(aru)) {
848 err = PTR_ERR(aru);
849 goto out;
850 }
851
852 udev = interface_to_usbdev(intf);
853 usb_get_dev(udev);
854 aru->udev = udev;
855 aru->intf = intf;
856 ar = &aru->common;
857
Luis R. Rodriguezbdf6d322009-05-28 17:36:05 -0400858 aru->req_one_stage_fw = ar9170_requires_one_stage(id);
859
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100860 usb_set_intfdata(intf, aru);
Christian Lamparter92179982009-06-20 05:10:24 +0200861 SET_IEEE80211_DEV(ar->hw, &intf->dev);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100862
863 init_usb_anchor(&aru->rx_submitted);
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200864 init_usb_anchor(&aru->tx_pending);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100865 init_usb_anchor(&aru->tx_submitted);
866 init_completion(&aru->cmd_wait);
Christian Lamparter160b8242010-04-29 17:53:33 +0200867 init_completion(&aru->firmware_loading_complete);
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200868 spin_lock_init(&aru->tx_urb_lock);
869
870 aru->tx_pending_urbs = 0;
Christian Lamparter731d6bf2009-10-17 21:56:51 +0200871 atomic_set(&aru->tx_submitted_urbs, 0);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100872
873 aru->common.stop = ar9170_usb_stop;
Christian Lamparter9b9c5aa2009-06-06 05:07:23 +0200874 aru->common.flush = ar9170_usb_flush;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100875 aru->common.open = ar9170_usb_open;
876 aru->common.tx = ar9170_usb_tx;
877 aru->common.exec_cmd = ar9170_usb_exec_cmd;
878 aru->common.callback_cmd = ar9170_usb_callback_cmd;
879
Alexander Beregalov8a713042009-05-04 20:46:25 +0400880#ifdef CONFIG_PM
Christian Lamparter90ccda92009-04-25 21:32:09 +0200881 udev->reset_resume = 1;
Christian Lamparter66d00812009-05-28 17:04:27 +0200882#endif /* CONFIG_PM */
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100883 err = ar9170_usb_reset(aru);
884 if (err)
Christian Lampartere10a9df2009-04-18 17:12:18 +0200885 goto err_freehw;
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100886
Christian Lamparter160b8242010-04-29 17:53:33 +0200887 usb_get_dev(aru->udev);
Johannes Berg53576512009-12-23 13:15:30 +0100888 return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw",
889 &aru->udev->dev, GFP_KERNEL, aru,
890 ar9170_usb_firmware_step2);
Christian Lampartere10a9df2009-04-18 17:12:18 +0200891err_freehw:
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100892 usb_set_intfdata(intf, NULL);
893 usb_put_dev(udev);
894 ieee80211_free_hw(ar->hw);
895out:
896 return err;
897}
898
899static void ar9170_usb_disconnect(struct usb_interface *intf)
900{
901 struct ar9170_usb *aru = usb_get_intfdata(intf);
902
903 if (!aru)
904 return;
905
906 aru->common.state = AR9170_IDLE;
Christian Lamparter160b8242010-04-29 17:53:33 +0200907
908 wait_for_completion(&aru->firmware_loading_complete);
909
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100910 ar9170_unregister(&aru->common);
911 ar9170_usb_cancel_urbs(aru);
912
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100913 usb_put_dev(aru->udev);
914 usb_set_intfdata(intf, NULL);
915 ieee80211_free_hw(aru->common.hw);
Johannes Berg53576512009-12-23 13:15:30 +0100916
917 release_firmware(aru->init_values);
918 release_firmware(aru->firmware);
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100919}
920
Christian Lampartere10a9df2009-04-18 17:12:18 +0200921#ifdef CONFIG_PM
922static int ar9170_suspend(struct usb_interface *intf,
923 pm_message_t message)
924{
925 struct ar9170_usb *aru = usb_get_intfdata(intf);
926
927 if (!aru)
928 return -ENODEV;
929
930 aru->common.state = AR9170_IDLE;
931 ar9170_usb_cancel_urbs(aru);
932
933 return 0;
934}
935
936static int ar9170_resume(struct usb_interface *intf)
937{
938 struct ar9170_usb *aru = usb_get_intfdata(intf);
939 int err;
940
941 if (!aru)
942 return -ENODEV;
943
944 usb_unpoison_anchored_urbs(&aru->rx_submitted);
945 usb_unpoison_anchored_urbs(&aru->tx_submitted);
946
Christian Lampartere10a9df2009-04-18 17:12:18 +0200947 err = ar9170_usb_init_device(aru);
948 if (err)
949 goto err_unrx;
950
951 err = ar9170_usb_open(&aru->common);
952 if (err)
953 goto err_unrx;
954
955 return 0;
956
957err_unrx:
958 aru->common.state = AR9170_IDLE;
959 ar9170_usb_cancel_urbs(aru);
960
961 return err;
962}
963#endif /* CONFIG_PM */
964
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100965static struct usb_driver ar9170_driver = {
966 .name = "ar9170usb",
967 .probe = ar9170_usb_probe,
968 .disconnect = ar9170_usb_disconnect,
969 .id_table = ar9170_usb_ids,
970 .soft_unbind = 1,
Christian Lampartere10a9df2009-04-18 17:12:18 +0200971#ifdef CONFIG_PM
972 .suspend = ar9170_suspend,
973 .resume = ar9170_resume,
Christian Lamparter90ccda92009-04-25 21:32:09 +0200974 .reset_resume = ar9170_resume,
Christian Lampartere10a9df2009-04-18 17:12:18 +0200975#endif /* CONFIG_PM */
Christian Lamparterb63a2cb2009-03-21 23:05:48 +0100976};
977
978static int __init ar9170_init(void)
979{
980 return usb_register(&ar9170_driver);
981}
982
983static void __exit ar9170_exit(void)
984{
985 usb_deregister(&ar9170_driver);
986}
987
988module_init(ar9170_init);
989module_exit(ar9170_exit);