1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <linux/module.h>
19#include <linux/mmc/card.h>
20#include <linux/mmc/mmc.h>
21#include <linux/mmc/host.h>
22#include <linux/mmc/sdio_func.h>
23#include <linux/mmc/sdio_ids.h>
24#include <linux/mmc/sdio.h>
25#include <linux/mmc/sd.h>
26#include "hif.h"
27#include "hif-ops.h"
28#include "target.h"
29#include "debug.h"
30#include "cfg80211.h"
31#include "trace.h"
32
33struct ath6kl_sdio {
34 struct sdio_func *func;
35
36
37 spinlock_t lock;
38
39
40 struct list_head bus_req_freeq;
41
42
43 struct bus_request bus_req[BUS_REQUEST_MAX_NUM];
44
45 struct ath6kl *ar;
46
47 u8 *dma_buffer;
48
49
50 struct mutex dma_buffer_mutex;
51
52
53 struct list_head scat_req;
54
55 atomic_t irq_handling;
56 wait_queue_head_t irq_wq;
57
58
59 spinlock_t scat_lock;
60
61 bool scatter_enabled;
62
63 bool is_disabled;
64 const struct sdio_device_id *id;
65 struct work_struct wr_async_work;
66 struct list_head wr_asyncq;
67
68
69 spinlock_t wr_async_lock;
70};
71
72#define CMD53_ARG_READ 0
73#define CMD53_ARG_WRITE 1
74#define CMD53_ARG_BLOCK_BASIS 1
75#define CMD53_ARG_FIXED_ADDRESS 0
76#define CMD53_ARG_INCR_ADDRESS 1
77
78static inline struct ath6kl_sdio *ath6kl_sdio_priv(struct ath6kl *ar)
79{
80 return ar->hif_priv;
81}
82
83
84
85
86
87
88
89static inline bool buf_needs_bounce(u8 *buf)
90{
91 return ((unsigned long) buf & 0x3) || !virt_addr_valid(buf);
92}
93
94static void ath6kl_sdio_set_mbox_info(struct ath6kl *ar)
95{
96 struct ath6kl_mbox_info *mbox_info = &ar->mbox_info;
97
98
99 mbox_info->htc_addr = HIF_MBOX_BASE_ADDR;
100 mbox_info->htc_ext_addr = HIF_MBOX0_EXT_BASE_ADDR;
101 mbox_info->htc_ext_sz = HIF_MBOX0_EXT_WIDTH;
102 mbox_info->block_size = HIF_MBOX_BLOCK_SIZE;
103 mbox_info->gmbox_addr = HIF_GMBOX_BASE_ADDR;
104 mbox_info->gmbox_sz = HIF_GMBOX_WIDTH;
105}
106
107static inline void ath6kl_sdio_set_cmd53_arg(u32 *arg, u8 rw, u8 func,
108 u8 mode, u8 opcode, u32 addr,
109 u16 blksz)
110{
111 *arg = (((rw & 1) << 31) |
112 ((func & 0x7) << 28) |
113 ((mode & 1) << 27) |
114 ((opcode & 1) << 26) |
115 ((addr & 0x1FFFF) << 9) |
116 (blksz & 0x1FF));
117}
118
119static inline void ath6kl_sdio_set_cmd52_arg(u32 *arg, u8 write, u8 raw,
120 unsigned int address,
121 unsigned char val)
122{
123 const u8 func = 0;
124
125 *arg = ((write & 1) << 31) |
126 ((func & 0x7) << 28) |
127 ((raw & 1) << 27) |
128 (1 << 26) |
129 ((address & 0x1FFFF) << 9) |
130 (1 << 8) |
131 (val & 0xFF);
132}
133
134static int ath6kl_sdio_func0_cmd52_wr_byte(struct mmc_card *card,
135 unsigned int address,
136 unsigned char byte)
137{
138 struct mmc_command io_cmd;
139
140 memset(&io_cmd, 0, sizeof(io_cmd));
141 ath6kl_sdio_set_cmd52_arg(&io_cmd.arg, 1, 0, address, byte);
142 io_cmd.opcode = SD_IO_RW_DIRECT;
143 io_cmd.flags = MMC_RSP_R5 | MMC_CMD_AC;
144
145 return mmc_wait_for_cmd(card->host, &io_cmd, 0);
146}
147
148static int ath6kl_sdio_io(struct sdio_func *func, u32 request, u32 addr,
149 u8 *buf, u32 len)
150{
151 int ret = 0;
152
153 sdio_claim_host(func);
154
155 if (request & HIF_WRITE) {
156
157 if (addr >= HIF_MBOX_BASE_ADDR &&
158 addr <= HIF_MBOX_END_ADDR)
159 addr += (HIF_MBOX_WIDTH - len);
160
161
162 if (addr == HIF_MBOX0_EXT_BASE_ADDR)
163 addr += HIF_MBOX0_EXT_WIDTH - len;
164
165 if (request & HIF_FIXED_ADDRESS)
166 ret = sdio_writesb(func, addr, buf, len);
167 else
168 ret = sdio_memcpy_toio(func, addr, buf, len);
169 } else {
170 if (request & HIF_FIXED_ADDRESS)
171 ret = sdio_readsb(func, buf, addr, len);
172 else
173 ret = sdio_memcpy_fromio(func, buf, addr, len);
174 }
175
176 sdio_release_host(func);
177
178 ath6kl_dbg(ATH6KL_DBG_SDIO, "%s addr 0x%x%s buf 0x%p len %d\n",
179 request & HIF_WRITE ? "wr" : "rd", addr,
180 request & HIF_FIXED_ADDRESS ? " (fixed)" : "", buf, len);
181 ath6kl_dbg_dump(ATH6KL_DBG_SDIO_DUMP, NULL, "sdio ", buf, len);
182
183 trace_ath6kl_sdio(addr, request, buf, len);
184
185 return ret;
186}
187
188static struct bus_request *ath6kl_sdio_alloc_busreq(struct ath6kl_sdio *ar_sdio)
189{
190 struct bus_request *bus_req;
191
192 spin_lock_bh(&ar_sdio->lock);
193
194 if (list_empty(&ar_sdio->bus_req_freeq)) {
195 spin_unlock_bh(&ar_sdio->lock);
196 return NULL;
197 }
198
199 bus_req = list_first_entry(&ar_sdio->bus_req_freeq,
200 struct bus_request, list);
201 list_del(&bus_req->list);
202
203 spin_unlock_bh(&ar_sdio->lock);
204 ath6kl_dbg(ATH6KL_DBG_SCATTER, "%s: bus request 0x%p\n",
205 __func__, bus_req);
206
207 return bus_req;
208}
209
210static void ath6kl_sdio_free_bus_req(struct ath6kl_sdio *ar_sdio,
211 struct bus_request *bus_req)
212{
213 ath6kl_dbg(ATH6KL_DBG_SCATTER, "%s: bus request 0x%p\n",
214 __func__, bus_req);
215
216 spin_lock_bh(&ar_sdio->lock);
217 list_add_tail(&bus_req->list, &ar_sdio->bus_req_freeq);
218 spin_unlock_bh(&ar_sdio->lock);
219}
220
221static void ath6kl_sdio_setup_scat_data(struct hif_scatter_req *scat_req,
222 struct mmc_data *data)
223{
224 struct scatterlist *sg;
225 int i;
226
227 data->blksz = HIF_MBOX_BLOCK_SIZE;
228 data->blocks = scat_req->len / HIF_MBOX_BLOCK_SIZE;
229
230 ath6kl_dbg(ATH6KL_DBG_SCATTER,
231 "hif-scatter: (%s) addr: 0x%X, (block len: %d, block count: %d) , (tot:%d,sg:%d)\n",
232 (scat_req->req & HIF_WRITE) ? "WR" : "RD", scat_req->addr,
233 data->blksz, data->blocks, scat_req->len,
234 scat_req->scat_entries);
235
236 data->flags = (scat_req->req & HIF_WRITE) ? MMC_DATA_WRITE :
237 MMC_DATA_READ;
238
239
240 sg = scat_req->sgentries;
241 sg_init_table(sg, scat_req->scat_entries);
242
243
244 for (i = 0; i < scat_req->scat_entries; i++, sg++) {
245 ath6kl_dbg(ATH6KL_DBG_SCATTER, "%d: addr:0x%p, len:%d\n",
246 i, scat_req->scat_list[i].buf,
247 scat_req->scat_list[i].len);
248
249 sg_set_buf(sg, scat_req->scat_list[i].buf,
250 scat_req->scat_list[i].len);
251 }
252
253
254 data->sg = scat_req->sgentries;
255 data->sg_len = scat_req->scat_entries;
256}
257
258static int ath6kl_sdio_scat_rw(struct ath6kl_sdio *ar_sdio,
259 struct bus_request *req)
260{
261 struct mmc_request mmc_req;
262 struct mmc_command cmd;
263 struct mmc_data data;
264 struct hif_scatter_req *scat_req;
265 u8 opcode, rw;
266 int status, len;
267
268 scat_req = req->scat_req;
269
270 if (scat_req->virt_scat) {
271 len = scat_req->len;
272 if (scat_req->req & HIF_BLOCK_BASIS)
273 len = round_down(len, HIF_MBOX_BLOCK_SIZE);
274
275 status = ath6kl_sdio_io(ar_sdio->func, scat_req->req,
276 scat_req->addr, scat_req->virt_dma_buf,
277 len);
278 goto scat_complete;
279 }
280
281 memset(&mmc_req, 0, sizeof(struct mmc_request));
282 memset(&cmd, 0, sizeof(struct mmc_command));
283 memset(&data, 0, sizeof(struct mmc_data));
284
285 ath6kl_sdio_setup_scat_data(scat_req, &data);
286
287 opcode = (scat_req->req & HIF_FIXED_ADDRESS) ?
288 CMD53_ARG_FIXED_ADDRESS : CMD53_ARG_INCR_ADDRESS;
289
290 rw = (scat_req->req & HIF_WRITE) ? CMD53_ARG_WRITE : CMD53_ARG_READ;
291
292
293 if (scat_req->req & HIF_WRITE) {
294 if (scat_req->addr == HIF_MBOX_BASE_ADDR)
295 scat_req->addr += HIF_MBOX_WIDTH - scat_req->len;
296 else
297
298 scat_req->addr += HIF_MBOX0_EXT_WIDTH - scat_req->len;
299 }
300
301
302 ath6kl_sdio_set_cmd53_arg(&cmd.arg, rw, ar_sdio->func->num,
303 CMD53_ARG_BLOCK_BASIS, opcode, scat_req->addr,
304 data.blocks);
305
306 cmd.opcode = SD_IO_RW_EXTENDED;
307 cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC;
308
309 mmc_req.cmd = &cmd;
310 mmc_req.data = &data;
311
312 sdio_claim_host(ar_sdio->func);
313
314 mmc_set_data_timeout(&data, ar_sdio->func->card);
315
316 trace_ath6kl_sdio_scat(scat_req->addr,
317 scat_req->req,
318 scat_req->len,
319 scat_req->scat_entries,
320 scat_req->scat_list);
321
322
323 mmc_wait_for_req(ar_sdio->func->card->host, &mmc_req);
324
325 sdio_release_host(ar_sdio->func);
326
327 status = cmd.error ? cmd.error : data.error;
328
329scat_complete:
330 scat_req->status = status;
331
332 if (scat_req->status)
333 ath6kl_err("Scatter write request failed:%d\n",
334 scat_req->status);
335
336 if (scat_req->req & HIF_ASYNCHRONOUS)
337 scat_req->complete(ar_sdio->ar->htc_target, scat_req);
338
339 return status;
340}
341
342static int ath6kl_sdio_alloc_prep_scat_req(struct ath6kl_sdio *ar_sdio,
343 int n_scat_entry, int n_scat_req,
344 bool virt_scat)
345{
346 struct hif_scatter_req *s_req;
347 struct bus_request *bus_req;
348 int i, scat_req_sz, scat_list_sz, size;
349 u8 *virt_buf;
350
351 scat_list_sz = n_scat_entry * sizeof(struct hif_scatter_item);
352 scat_req_sz = sizeof(*s_req) + scat_list_sz;
353
354 if (!virt_scat)
355 size = sizeof(struct scatterlist) * n_scat_entry;
356 else
357 size = 2 * L1_CACHE_BYTES +
358 ATH6KL_MAX_TRANSFER_SIZE_PER_SCATTER;
359
360 for (i = 0; i < n_scat_req; i++) {
361
362 s_req = kzalloc(scat_req_sz, GFP_KERNEL);
363 if (!s_req)
364 return -ENOMEM;
365
366 if (virt_scat) {
367 virt_buf = kzalloc(size, GFP_KERNEL);
368 if (!virt_buf) {
369 kfree(s_req);
370 return -ENOMEM;
371 }
372
373 s_req->virt_dma_buf =
374 (u8 *)L1_CACHE_ALIGN((unsigned long)virt_buf);
375 } else {
376
377 s_req->sgentries = kzalloc(size, GFP_KERNEL);
378
379 if (!s_req->sgentries) {
380 kfree(s_req);
381 return -ENOMEM;
382 }
383 }
384
385
386 bus_req = ath6kl_sdio_alloc_busreq(ar_sdio);
387 if (!bus_req) {
388 kfree(s_req->sgentries);
389 kfree(s_req->virt_dma_buf);
390 kfree(s_req);
391 return -ENOMEM;
392 }
393
394
395 bus_req->scat_req = s_req;
396 s_req->busrequest = bus_req;
397
398 s_req->virt_scat = virt_scat;
399
400
401 hif_scatter_req_add(ar_sdio->ar, s_req);
402 }
403
404 return 0;
405}
406
407static int ath6kl_sdio_read_write_sync(struct ath6kl *ar, u32 addr, u8 *buf,
408 u32 len, u32 request)
409{
410 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
411 u8 *tbuf = NULL;
412 int ret;
413 bool bounced = false;
414
415 if (request & HIF_BLOCK_BASIS)
416 len = round_down(len, HIF_MBOX_BLOCK_SIZE);
417
418 if (buf_needs_bounce(buf)) {
419 if (!ar_sdio->dma_buffer)
420 return -ENOMEM;
421 mutex_lock(&ar_sdio->dma_buffer_mutex);
422 tbuf = ar_sdio->dma_buffer;
423
424 if (request & HIF_WRITE)
425 memcpy(tbuf, buf, len);
426
427 bounced = true;
428 } else {
429 tbuf = buf;
430 }
431
432 ret = ath6kl_sdio_io(ar_sdio->func, request, addr, tbuf, len);
433 if ((request & HIF_READ) && bounced)
434 memcpy(buf, tbuf, len);
435
436 if (bounced)
437 mutex_unlock(&ar_sdio->dma_buffer_mutex);
438
439 return ret;
440}
441
442static void __ath6kl_sdio_write_async(struct ath6kl_sdio *ar_sdio,
443 struct bus_request *req)
444{
445 if (req->scat_req) {
446 ath6kl_sdio_scat_rw(ar_sdio, req);
447 } else {
448 void *context;
449 int status;
450
451 status = ath6kl_sdio_read_write_sync(ar_sdio->ar, req->address,
452 req->buffer, req->length,
453 req->request);
454 context = req->packet;
455 ath6kl_sdio_free_bus_req(ar_sdio, req);
456 ath6kl_hif_rw_comp_handler(context, status);
457 }
458}
459
460static void ath6kl_sdio_write_async_work(struct work_struct *work)
461{
462 struct ath6kl_sdio *ar_sdio;
463 struct bus_request *req, *tmp_req;
464
465 ar_sdio = container_of(work, struct ath6kl_sdio, wr_async_work);
466
467 spin_lock_bh(&ar_sdio->wr_async_lock);
468 list_for_each_entry_safe(req, tmp_req, &ar_sdio->wr_asyncq, list) {
469 list_del(&req->list);
470 spin_unlock_bh(&ar_sdio->wr_async_lock);
471 __ath6kl_sdio_write_async(ar_sdio, req);
472 spin_lock_bh(&ar_sdio->wr_async_lock);
473 }
474 spin_unlock_bh(&ar_sdio->wr_async_lock);
475}
476
477static void ath6kl_sdio_irq_handler(struct sdio_func *func)
478{
479 int status;
480 struct ath6kl_sdio *ar_sdio;
481
482 ath6kl_dbg(ATH6KL_DBG_SDIO, "irq\n");
483
484 ar_sdio = sdio_get_drvdata(func);
485 atomic_set(&ar_sdio->irq_handling, 1);
486
487
488
489
490 sdio_release_host(ar_sdio->func);
491
492 status = ath6kl_hif_intr_bh_handler(ar_sdio->ar);
493 sdio_claim_host(ar_sdio->func);
494
495 atomic_set(&ar_sdio->irq_handling, 0);
496 wake_up(&ar_sdio->irq_wq);
497
498 WARN_ON(status && status != -ECANCELED);
499}
500
501static int ath6kl_sdio_power_on(struct ath6kl *ar)
502{
503 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
504 struct sdio_func *func = ar_sdio->func;
505 int ret = 0;
506
507 if (!ar_sdio->is_disabled)
508 return 0;
509
510 ath6kl_dbg(ATH6KL_DBG_BOOT, "sdio power on\n");
511
512 sdio_claim_host(func);
513
514 ret = sdio_enable_func(func);
515 if (ret) {
516 ath6kl_err("Unable to enable sdio func: %d)\n", ret);
517 sdio_release_host(func);
518 return ret;
519 }
520
521 sdio_release_host(func);
522
523
524
525
526
527 msleep(10);
528
529 ar_sdio->is_disabled = false;
530
531 return ret;
532}
533
534static int ath6kl_sdio_power_off(struct ath6kl *ar)
535{
536 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
537 int ret;
538
539 if (ar_sdio->is_disabled)
540 return 0;
541
542 ath6kl_dbg(ATH6KL_DBG_BOOT, "sdio power off\n");
543
544
545 sdio_claim_host(ar_sdio->func);
546 ret = sdio_disable_func(ar_sdio->func);
547 sdio_release_host(ar_sdio->func);
548
549 if (ret)
550 return ret;
551
552 ar_sdio->is_disabled = true;
553
554 return ret;
555}
556
557static int ath6kl_sdio_write_async(struct ath6kl *ar, u32 address, u8 *buffer,
558 u32 length, u32 request,
559 struct htc_packet *packet)
560{
561 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
562 struct bus_request *bus_req;
563
564 bus_req = ath6kl_sdio_alloc_busreq(ar_sdio);
565
566 if (WARN_ON_ONCE(!bus_req))
567 return -ENOMEM;
568
569 bus_req->address = address;
570 bus_req->buffer = buffer;
571 bus_req->length = length;
572 bus_req->request = request;
573 bus_req->packet = packet;
574
575 spin_lock_bh(&ar_sdio->wr_async_lock);
576 list_add_tail(&bus_req->list, &ar_sdio->wr_asyncq);
577 spin_unlock_bh(&ar_sdio->wr_async_lock);
578 queue_work(ar->ath6kl_wq, &ar_sdio->wr_async_work);
579
580 return 0;
581}
582
583static void ath6kl_sdio_irq_enable(struct ath6kl *ar)
584{
585 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
586 int ret;
587
588 sdio_claim_host(ar_sdio->func);
589
590
591 ret = sdio_claim_irq(ar_sdio->func, ath6kl_sdio_irq_handler);
592 if (ret)
593 ath6kl_err("Failed to claim sdio irq: %d\n", ret);
594
595 sdio_release_host(ar_sdio->func);
596}
597
598static bool ath6kl_sdio_is_on_irq(struct ath6kl *ar)
599{
600 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
601
602 return !atomic_read(&ar_sdio->irq_handling);
603}
604
605static void ath6kl_sdio_irq_disable(struct ath6kl *ar)
606{
607 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
608 int ret;
609
610 sdio_claim_host(ar_sdio->func);
611
612 if (atomic_read(&ar_sdio->irq_handling)) {
613 sdio_release_host(ar_sdio->func);
614
615 ret = wait_event_interruptible(ar_sdio->irq_wq,
616 ath6kl_sdio_is_on_irq(ar));
617 if (ret)
618 return;
619
620 sdio_claim_host(ar_sdio->func);
621 }
622
623 ret = sdio_release_irq(ar_sdio->func);
624 if (ret)
625 ath6kl_err("Failed to release sdio irq: %d\n", ret);
626
627 sdio_release_host(ar_sdio->func);
628}
629
630static struct hif_scatter_req *ath6kl_sdio_scatter_req_get(struct ath6kl *ar)
631{
632 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
633 struct hif_scatter_req *node = NULL;
634
635 spin_lock_bh(&ar_sdio->scat_lock);
636
637 if (!list_empty(&ar_sdio->scat_req)) {
638 node = list_first_entry(&ar_sdio->scat_req,
639 struct hif_scatter_req, list);
640 list_del(&node->list);
641
642 node->scat_q_depth = get_queue_depth(&ar_sdio->scat_req);
643 }
644
645 spin_unlock_bh(&ar_sdio->scat_lock);
646
647 return node;
648}
649
650static void ath6kl_sdio_scatter_req_add(struct ath6kl *ar,
651 struct hif_scatter_req *s_req)
652{
653 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
654
655 spin_lock_bh(&ar_sdio->scat_lock);
656
657 list_add_tail(&s_req->list, &ar_sdio->scat_req);
658
659 spin_unlock_bh(&ar_sdio->scat_lock);
660}
661
662
663static int ath6kl_sdio_async_rw_scatter(struct ath6kl *ar,
664 struct hif_scatter_req *scat_req)
665{
666 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
667 u32 request = scat_req->req;
668 int status = 0;
669
670 if (!scat_req->len)
671 return -EINVAL;
672
673 ath6kl_dbg(ATH6KL_DBG_SCATTER,
674 "hif-scatter: total len: %d scatter entries: %d\n",
675 scat_req->len, scat_req->scat_entries);
676
677 if (request & HIF_SYNCHRONOUS) {
678 status = ath6kl_sdio_scat_rw(ar_sdio, scat_req->busrequest);
679 } else {
680 spin_lock_bh(&ar_sdio->wr_async_lock);
681 list_add_tail(&scat_req->busrequest->list, &ar_sdio->wr_asyncq);
682 spin_unlock_bh(&ar_sdio->wr_async_lock);
683 queue_work(ar->ath6kl_wq, &ar_sdio->wr_async_work);
684 }
685
686 return status;
687}
688
689
690static void ath6kl_sdio_cleanup_scatter(struct ath6kl *ar)
691{
692 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
693 struct hif_scatter_req *s_req, *tmp_req;
694
695
696 spin_lock_bh(&ar_sdio->scat_lock);
697 list_for_each_entry_safe(s_req, tmp_req, &ar_sdio->scat_req, list) {
698 list_del(&s_req->list);
699 spin_unlock_bh(&ar_sdio->scat_lock);
700
701
702
703
704
705
706 if (s_req->busrequest)
707 ath6kl_sdio_free_bus_req(ar_sdio, s_req->busrequest);
708 kfree(s_req->virt_dma_buf);
709 kfree(s_req->sgentries);
710 kfree(s_req);
711
712 spin_lock_bh(&ar_sdio->scat_lock);
713 }
714 spin_unlock_bh(&ar_sdio->scat_lock);
715}
716
717
718static int ath6kl_sdio_enable_scatter(struct ath6kl *ar)
719{
720 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
721 struct htc_target *target = ar->htc_target;
722 int ret = 0;
723 bool virt_scat = false;
724
725 if (ar_sdio->scatter_enabled)
726 return 0;
727
728 ar_sdio->scatter_enabled = true;
729
730
731 if (ar_sdio->func->card->host->max_segs < MAX_SCATTER_ENTRIES_PER_REQ) {
732 ath6kl_err("host only supports scatter of :%d entries, need: %d\n",
733 ar_sdio->func->card->host->max_segs,
734 MAX_SCATTER_ENTRIES_PER_REQ);
735 virt_scat = true;
736 }
737
738 if (!virt_scat) {
739 ret = ath6kl_sdio_alloc_prep_scat_req(ar_sdio,
740 MAX_SCATTER_ENTRIES_PER_REQ,
741 MAX_SCATTER_REQUESTS, virt_scat);
742
743 if (!ret) {
744 ath6kl_dbg(ATH6KL_DBG_BOOT,
745 "hif-scatter enabled requests %d entries %d\n",
746 MAX_SCATTER_REQUESTS,
747 MAX_SCATTER_ENTRIES_PER_REQ);
748
749 target->max_scat_entries = MAX_SCATTER_ENTRIES_PER_REQ;
750 target->max_xfer_szper_scatreq =
751 MAX_SCATTER_REQ_TRANSFER_SIZE;
752 } else {
753 ath6kl_sdio_cleanup_scatter(ar);
754 ath6kl_warn("hif scatter resource setup failed, trying virtual scatter method\n");
755 }
756 }
757
758 if (virt_scat || ret) {
759 ret = ath6kl_sdio_alloc_prep_scat_req(ar_sdio,
760 ATH6KL_SCATTER_ENTRIES_PER_REQ,
761 ATH6KL_SCATTER_REQS, virt_scat);
762
763 if (ret) {
764 ath6kl_err("failed to alloc virtual scatter resources !\n");
765 ath6kl_sdio_cleanup_scatter(ar);
766 return ret;
767 }
768
769 ath6kl_dbg(ATH6KL_DBG_BOOT,
770 "virtual scatter enabled requests %d entries %d\n",
771 ATH6KL_SCATTER_REQS, ATH6KL_SCATTER_ENTRIES_PER_REQ);
772
773 target->max_scat_entries = ATH6KL_SCATTER_ENTRIES_PER_REQ;
774 target->max_xfer_szper_scatreq =
775 ATH6KL_MAX_TRANSFER_SIZE_PER_SCATTER;
776 }
777
778 return 0;
779}
780
781static int ath6kl_sdio_config(struct ath6kl *ar)
782{
783 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
784 struct sdio_func *func = ar_sdio->func;
785 int ret;
786
787 sdio_claim_host(func);
788
789 if ((ar_sdio->id->device & MANUFACTURER_ID_ATH6KL_BASE_MASK) >=
790 MANUFACTURER_ID_AR6003_BASE) {
791
792 ret = ath6kl_sdio_func0_cmd52_wr_byte(func->card,
793 CCCR_SDIO_IRQ_MODE_REG,
794 SDIO_IRQ_MODE_ASYNC_4BIT_IRQ);
795 if (ret) {
796 ath6kl_err("Failed to enable 4-bit async irq mode %d\n",
797 ret);
798 goto out;
799 }
800
801 ath6kl_dbg(ATH6KL_DBG_BOOT, "4-bit async irq mode enabled\n");
802 }
803
804
805 func->enable_timeout = 100;
806
807 ret = sdio_set_block_size(func, HIF_MBOX_BLOCK_SIZE);
808 if (ret) {
809 ath6kl_err("Set sdio block size %d failed: %d)\n",
810 HIF_MBOX_BLOCK_SIZE, ret);
811 goto out;
812 }
813
814out:
815 sdio_release_host(func);
816
817 return ret;
818}
819
820static int ath6kl_set_sdio_pm_caps(struct ath6kl *ar)
821{
822 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
823 struct sdio_func *func = ar_sdio->func;
824 mmc_pm_flag_t flags;
825 int ret;
826
827 flags = sdio_get_host_pm_caps(func);
828
829 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio suspend pm_caps 0x%x\n", flags);
830
831 if (!(flags & MMC_PM_WAKE_SDIO_IRQ) ||
832 !(flags & MMC_PM_KEEP_POWER))
833 return -EINVAL;
834
835 ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
836 if (ret) {
837 ath6kl_err("set sdio keep pwr flag failed: %d\n", ret);
838 return ret;
839 }
840
841
842 ret = sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ);
843 if (ret)
844 ath6kl_err("set sdio wake irq flag failed: %d\n", ret);
845
846 return ret;
847}
848
849static int ath6kl_sdio_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
850{
851 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
852 struct sdio_func *func = ar_sdio->func;
853 mmc_pm_flag_t flags;
854 bool try_deepsleep = false;
855 int ret;
856
857 if (ar->suspend_mode == WLAN_POWER_STATE_WOW ||
858 (!ar->suspend_mode && wow)) {
859 ret = ath6kl_set_sdio_pm_caps(ar);
860 if (ret)
861 goto cut_pwr;
862
863 ret = ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_WOW, wow);
864 if (ret && ret != -ENOTCONN)
865 ath6kl_err("wow suspend failed: %d\n", ret);
866
867 if (ret &&
868 (!ar->wow_suspend_mode ||
869 ar->wow_suspend_mode == WLAN_POWER_STATE_DEEP_SLEEP))
870 try_deepsleep = true;
871 else if (ret &&
872 ar->wow_suspend_mode == WLAN_POWER_STATE_CUT_PWR)
873 goto cut_pwr;
874 if (!ret)
875 return 0;
876 }
877
878 if (ar->suspend_mode == WLAN_POWER_STATE_DEEP_SLEEP ||
879 !ar->suspend_mode || try_deepsleep) {
880 flags = sdio_get_host_pm_caps(func);
881 if (!(flags & MMC_PM_KEEP_POWER))
882 goto cut_pwr;
883
884 ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
885 if (ret)
886 goto cut_pwr;
887
888
889
890
891
892
893
894 if ((flags & MMC_PM_WAKE_SDIO_IRQ)) {
895 ret = sdio_set_host_pm_flags(func,
896 MMC_PM_WAKE_SDIO_IRQ);
897 if (ret)
898 goto cut_pwr;
899 }
900
901 ret = ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_DEEPSLEEP,
902 NULL);
903 if (ret)
904 goto cut_pwr;
905
906 return 0;
907 }
908
909cut_pwr:
910 if (func->card && func->card->host)
911 func->card->host->pm_flags &= ~MMC_PM_KEEP_POWER;
912
913 return ath6kl_cfg80211_suspend(ar, ATH6KL_CFG_SUSPEND_CUTPOWER, NULL);
914}
915
916static int ath6kl_sdio_resume(struct ath6kl *ar)
917{
918 switch (ar->state) {
919 case ATH6KL_STATE_OFF:
920 case ATH6KL_STATE_CUTPOWER:
921 ath6kl_dbg(ATH6KL_DBG_SUSPEND,
922 "sdio resume configuring sdio\n");
923
924
925 ath6kl_sdio_config(ar);
926 break;
927
928 case ATH6KL_STATE_ON:
929 break;
930
931 case ATH6KL_STATE_DEEPSLEEP:
932 break;
933
934 case ATH6KL_STATE_WOW:
935 break;
936
937 case ATH6KL_STATE_SUSPENDING:
938 break;
939
940 case ATH6KL_STATE_RESUMING:
941 break;
942
943 case ATH6KL_STATE_RECOVERY:
944 break;
945 }
946
947 ath6kl_cfg80211_resume(ar);
948
949 return 0;
950}
951
952
953static int ath6kl_set_addrwin_reg(struct ath6kl *ar, u32 reg_addr, u32 addr)
954{
955 int status;
956 u8 addr_val[4];
957 s32 i;
958
959
960
961
962
963
964 for (i = 1; i <= 3; i++) {
965
966
967
968
969 memset(addr_val, ((u8 *)&addr)[i], 4);
970
971
972
973
974
975
976 status = ath6kl_sdio_read_write_sync(ar, reg_addr + i, addr_val,
977 4, HIF_WR_SYNC_BYTE_FIX);
978 if (status)
979 break;
980 }
981
982 if (status) {
983 ath6kl_err("%s: failed to write initial bytes of 0x%x to window reg: 0x%X\n",
984 __func__, addr, reg_addr);
985 return status;
986 }
987
988
989
990
991
992
993
994 status = ath6kl_sdio_read_write_sync(ar, reg_addr, (u8 *)(&addr),
995 4, HIF_WR_SYNC_BYTE_INC);
996
997 if (status) {
998 ath6kl_err("%s: failed to write 0x%x to window reg: 0x%X\n",
999 __func__, addr, reg_addr);
1000 return status;
1001 }
1002
1003 return 0;
1004}
1005
1006static int ath6kl_sdio_diag_read32(struct ath6kl *ar, u32 address, u32 *data)
1007{
1008 int status;
1009
1010
1011 status = ath6kl_set_addrwin_reg(ar, WINDOW_READ_ADDR_ADDRESS,
1012 address);
1013
1014 if (status)
1015 return status;
1016
1017
1018 status = ath6kl_sdio_read_write_sync(ar, WINDOW_DATA_ADDRESS,
1019 (u8 *)data, sizeof(u32), HIF_RD_SYNC_BYTE_INC);
1020 if (status) {
1021 ath6kl_err("%s: failed to read from window data addr\n",
1022 __func__);
1023 return status;
1024 }
1025
1026 return status;
1027}
1028
1029static int ath6kl_sdio_diag_write32(struct ath6kl *ar, u32 address,
1030 __le32 data)
1031{
1032 int status;
1033 u32 val = (__force u32) data;
1034
1035
1036 status = ath6kl_sdio_read_write_sync(ar, WINDOW_DATA_ADDRESS,
1037 (u8 *) &val, sizeof(u32), HIF_WR_SYNC_BYTE_INC);
1038 if (status) {
1039 ath6kl_err("%s: failed to write 0x%x to window data addr\n",
1040 __func__, data);
1041 return status;
1042 }
1043
1044
1045 return ath6kl_set_addrwin_reg(ar, WINDOW_WRITE_ADDR_ADDRESS,
1046 address);
1047}
1048
1049static int ath6kl_sdio_bmi_credits(struct ath6kl *ar)
1050{
1051 u32 addr;
1052 unsigned long timeout;
1053 int ret;
1054
1055 ar->bmi.cmd_credits = 0;
1056
1057
1058 addr = COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 4;
1059
1060 timeout = jiffies + msecs_to_jiffies(BMI_COMMUNICATION_TIMEOUT);
1061 while (time_before(jiffies, timeout) && !ar->bmi.cmd_credits) {
1062
1063
1064
1065
1066
1067
1068 ret = ath6kl_sdio_read_write_sync(ar, addr,
1069 (u8 *)&ar->bmi.cmd_credits, 4,
1070 HIF_RD_SYNC_BYTE_INC);
1071 if (ret) {
1072 ath6kl_err("Unable to decrement the command credit count register: %d\n",
1073 ret);
1074 return ret;
1075 }
1076
1077
1078
1079
1080 ar->bmi.cmd_credits &= 0xFF;
1081 }
1082
1083 if (!ar->bmi.cmd_credits) {
1084 ath6kl_err("bmi communication timeout\n");
1085 return -ETIMEDOUT;
1086 }
1087
1088 return 0;
1089}
1090
1091static int ath6kl_bmi_get_rx_lkahd(struct ath6kl *ar)
1092{
1093 unsigned long timeout;
1094 u32 rx_word = 0;
1095 int ret = 0;
1096
1097 timeout = jiffies + msecs_to_jiffies(BMI_COMMUNICATION_TIMEOUT);
1098 while ((time_before(jiffies, timeout)) && !rx_word) {
1099 ret = ath6kl_sdio_read_write_sync(ar,
1100 RX_LOOKAHEAD_VALID_ADDRESS,
1101 (u8 *)&rx_word, sizeof(rx_word),
1102 HIF_RD_SYNC_BYTE_INC);
1103 if (ret) {
1104 ath6kl_err("unable to read RX_LOOKAHEAD_VALID\n");
1105 return ret;
1106 }
1107
1108
1109 rx_word &= (1 << ENDPOINT1);
1110 }
1111
1112 if (!rx_word) {
1113 ath6kl_err("bmi_recv_buf FIFO empty\n");
1114 return -EINVAL;
1115 }
1116
1117 return ret;
1118}
1119
1120static int ath6kl_sdio_bmi_write(struct ath6kl *ar, u8 *buf, u32 len)
1121{
1122 int ret;
1123 u32 addr;
1124
1125 ret = ath6kl_sdio_bmi_credits(ar);
1126 if (ret)
1127 return ret;
1128
1129 addr = ar->mbox_info.htc_addr;
1130
1131 ret = ath6kl_sdio_read_write_sync(ar, addr, buf, len,
1132 HIF_WR_SYNC_BYTE_INC);
1133 if (ret) {
1134 ath6kl_err("unable to send the bmi data to the device\n");
1135 return ret;
1136 }
1137
1138 return 0;
1139}
1140
1141static int ath6kl_sdio_bmi_read(struct ath6kl *ar, u8 *buf, u32 len)
1142{
1143 int ret;
1144 u32 addr;
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192 if (len >= 4) {
1193 ret = ath6kl_bmi_get_rx_lkahd(ar);
1194 if (ret)
1195 return ret;
1196 }
1197
1198 addr = ar->mbox_info.htc_addr;
1199 ret = ath6kl_sdio_read_write_sync(ar, addr, buf, len,
1200 HIF_RD_SYNC_BYTE_INC);
1201 if (ret) {
1202 ath6kl_err("Unable to read the bmi data from the device: %d\n",
1203 ret);
1204 return ret;
1205 }
1206
1207 return 0;
1208}
1209
1210static void ath6kl_sdio_stop(struct ath6kl *ar)
1211{
1212 struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
1213 struct bus_request *req, *tmp_req;
1214 void *context;
1215
1216
1217
1218 cancel_work_sync(&ar_sdio->wr_async_work);
1219
1220 spin_lock_bh(&ar_sdio->wr_async_lock);
1221
1222 list_for_each_entry_safe(req, tmp_req, &ar_sdio->wr_asyncq, list) {
1223 list_del(&req->list);
1224
1225 if (req->scat_req) {
1226
1227 req->scat_req->status = -ECANCELED;
1228 req->scat_req->complete(ar_sdio->ar->htc_target,
1229 req->scat_req);
1230 } else {
1231 context = req->packet;
1232 ath6kl_sdio_free_bus_req(ar_sdio, req);
1233 ath6kl_hif_rw_comp_handler(context, -ECANCELED);
1234 }
1235 }
1236
1237 spin_unlock_bh(&ar_sdio->wr_async_lock);
1238
1239 WARN_ON(get_queue_depth(&ar_sdio->scat_req) != 4);
1240}
1241
1242static const struct ath6kl_hif_ops ath6kl_sdio_ops = {
1243 .read_write_sync = ath6kl_sdio_read_write_sync,
1244 .write_async = ath6kl_sdio_write_async,
1245 .irq_enable = ath6kl_sdio_irq_enable,
1246 .irq_disable = ath6kl_sdio_irq_disable,
1247 .scatter_req_get = ath6kl_sdio_scatter_req_get,
1248 .scatter_req_add = ath6kl_sdio_scatter_req_add,
1249 .enable_scatter = ath6kl_sdio_enable_scatter,
1250 .scat_req_rw = ath6kl_sdio_async_rw_scatter,
1251 .cleanup_scatter = ath6kl_sdio_cleanup_scatter,
1252 .suspend = ath6kl_sdio_suspend,
1253 .resume = ath6kl_sdio_resume,
1254 .diag_read32 = ath6kl_sdio_diag_read32,
1255 .diag_write32 = ath6kl_sdio_diag_write32,
1256 .bmi_read = ath6kl_sdio_bmi_read,
1257 .bmi_write = ath6kl_sdio_bmi_write,
1258 .power_on = ath6kl_sdio_power_on,
1259 .power_off = ath6kl_sdio_power_off,
1260 .stop = ath6kl_sdio_stop,
1261};
1262
1263#ifdef CONFIG_PM_SLEEP
1264
1265
1266
1267
1268
1269static int ath6kl_sdio_pm_suspend(struct device *device)
1270{
1271 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio pm suspend\n");
1272
1273 return 0;
1274}
1275
1276static int ath6kl_sdio_pm_resume(struct device *device)
1277{
1278 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "sdio pm resume\n");
1279
1280 return 0;
1281}
1282
1283static SIMPLE_DEV_PM_OPS(ath6kl_sdio_pm_ops, ath6kl_sdio_pm_suspend,
1284 ath6kl_sdio_pm_resume);
1285
1286#define ATH6KL_SDIO_PM_OPS (&ath6kl_sdio_pm_ops)
1287
1288#else
1289
1290#define ATH6KL_SDIO_PM_OPS NULL
1291
1292#endif
1293
1294static int ath6kl_sdio_probe(struct sdio_func *func,
1295 const struct sdio_device_id *id)
1296{
1297 int ret;
1298 struct ath6kl_sdio *ar_sdio;
1299 struct ath6kl *ar;
1300 int count;
1301
1302 ath6kl_dbg(ATH6KL_DBG_BOOT,
1303 "sdio new func %d vendor 0x%x device 0x%x block 0x%x/0x%x\n",
1304 func->num, func->vendor, func->device,
1305 func->max_blksize, func->cur_blksize);
1306
1307 ar_sdio = kzalloc(sizeof(struct ath6kl_sdio), GFP_KERNEL);
1308 if (!ar_sdio)
1309 return -ENOMEM;
1310
1311 ar_sdio->dma_buffer = kzalloc(HIF_DMA_BUFFER_SIZE, GFP_KERNEL);
1312 if (!ar_sdio->dma_buffer) {
1313 ret = -ENOMEM;
1314 goto err_hif;
1315 }
1316
1317 ar_sdio->func = func;
1318 sdio_set_drvdata(func, ar_sdio);
1319
1320 ar_sdio->id = id;
1321 ar_sdio->is_disabled = true;
1322
1323 spin_lock_init(&ar_sdio->lock);
1324 spin_lock_init(&ar_sdio->scat_lock);
1325 spin_lock_init(&ar_sdio->wr_async_lock);
1326 mutex_init(&ar_sdio->dma_buffer_mutex);
1327
1328 INIT_LIST_HEAD(&ar_sdio->scat_req);
1329 INIT_LIST_HEAD(&ar_sdio->bus_req_freeq);
1330 INIT_LIST_HEAD(&ar_sdio->wr_asyncq);
1331
1332 INIT_WORK(&ar_sdio->wr_async_work, ath6kl_sdio_write_async_work);
1333
1334 init_waitqueue_head(&ar_sdio->irq_wq);
1335
1336 for (count = 0; count < BUS_REQUEST_MAX_NUM; count++)
1337 ath6kl_sdio_free_bus_req(ar_sdio, &ar_sdio->bus_req[count]);
1338
1339 ar = ath6kl_core_create(&ar_sdio->func->dev);
1340 if (!ar) {
1341 ath6kl_err("Failed to alloc ath6kl core\n");
1342 ret = -ENOMEM;
1343 goto err_dma;
1344 }
1345
1346 ar_sdio->ar = ar;
1347 ar->hif_type = ATH6KL_HIF_TYPE_SDIO;
1348 ar->hif_priv = ar_sdio;
1349 ar->hif_ops = &ath6kl_sdio_ops;
1350 ar->bmi.max_data_size = 256;
1351
1352 ath6kl_sdio_set_mbox_info(ar);
1353
1354 ret = ath6kl_sdio_config(ar);
1355 if (ret) {
1356 ath6kl_err("Failed to config sdio: %d\n", ret);
1357 goto err_core_alloc;
1358 }
1359
1360 ret = ath6kl_core_init(ar, ATH6KL_HTC_TYPE_MBOX);
1361 if (ret) {
1362 ath6kl_err("Failed to init ath6kl core\n");
1363 goto err_core_alloc;
1364 }
1365
1366 return ret;
1367
1368err_core_alloc:
1369 ath6kl_core_destroy(ar_sdio->ar);
1370err_dma:
1371 kfree(ar_sdio->dma_buffer);
1372err_hif:
1373 kfree(ar_sdio);
1374
1375 return ret;
1376}
1377
1378static void ath6kl_sdio_remove(struct sdio_func *func)
1379{
1380 struct ath6kl_sdio *ar_sdio;
1381
1382 ath6kl_dbg(ATH6KL_DBG_BOOT,
1383 "sdio removed func %d vendor 0x%x device 0x%x\n",
1384 func->num, func->vendor, func->device);
1385
1386 ar_sdio = sdio_get_drvdata(func);
1387
1388 ath6kl_stop_txrx(ar_sdio->ar);
1389 cancel_work_sync(&ar_sdio->wr_async_work);
1390
1391 ath6kl_core_cleanup(ar_sdio->ar);
1392 ath6kl_core_destroy(ar_sdio->ar);
1393
1394 kfree(ar_sdio->dma_buffer);
1395 kfree(ar_sdio);
1396}
1397
1398static const struct sdio_device_id ath6kl_sdio_devices[] = {
1399 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6003_BASE | 0x0))},
1400 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6003_BASE | 0x1))},
1401 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x0))},
1402 {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x1))},
1403 {},
1404};
1405
1406MODULE_DEVICE_TABLE(sdio, ath6kl_sdio_devices);
1407
1408static struct sdio_driver ath6kl_sdio_driver = {
1409 .name = "ath6kl_sdio",
1410 .id_table = ath6kl_sdio_devices,
1411 .probe = ath6kl_sdio_probe,
1412 .remove = ath6kl_sdio_remove,
1413 .drv.pm = ATH6KL_SDIO_PM_OPS,
1414};
1415
1416static int __init ath6kl_sdio_init(void)
1417{
1418 int ret;
1419
1420 ret = sdio_register_driver(&ath6kl_sdio_driver);
1421 if (ret)
1422 ath6kl_err("sdio driver registration failed: %d\n", ret);
1423
1424 return ret;
1425}
1426
1427static void __exit ath6kl_sdio_exit(void)
1428{
1429 sdio_unregister_driver(&ath6kl_sdio_driver);
1430}
1431
1432module_init(ath6kl_sdio_init);
1433module_exit(ath6kl_sdio_exit);
1434
1435MODULE_AUTHOR("Atheros Communications, Inc.");
1436MODULE_DESCRIPTION("Driver support for Atheros AR600x SDIO devices");
1437MODULE_LICENSE("Dual BSD/GPL");
1438
1439MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_OTP_FILE);
1440MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_FIRMWARE_FILE);
1441MODULE_FIRMWARE(AR6003_HW_2_0_FW_DIR "/" AR6003_HW_2_0_PATCH_FILE);
1442MODULE_FIRMWARE(AR6003_HW_2_0_BOARD_DATA_FILE);
1443MODULE_FIRMWARE(AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE);
1444MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_OTP_FILE);
1445MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_FIRMWARE_FILE);
1446MODULE_FIRMWARE(AR6003_HW_2_1_1_FW_DIR "/" AR6003_HW_2_1_1_PATCH_FILE);
1447MODULE_FIRMWARE(AR6003_HW_2_1_1_BOARD_DATA_FILE);
1448MODULE_FIRMWARE(AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE);
1449MODULE_FIRMWARE(AR6004_HW_1_0_FW_DIR "/" AR6004_HW_1_0_FIRMWARE_FILE);
1450MODULE_FIRMWARE(AR6004_HW_1_0_BOARD_DATA_FILE);
1451MODULE_FIRMWARE(AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE);
1452MODULE_FIRMWARE(AR6004_HW_1_1_FW_DIR "/" AR6004_HW_1_1_FIRMWARE_FILE);
1453MODULE_FIRMWARE(AR6004_HW_1_1_BOARD_DATA_FILE);
1454MODULE_FIRMWARE(AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE);
1455MODULE_FIRMWARE(AR6004_HW_1_2_FW_DIR "/" AR6004_HW_1_2_FIRMWARE_FILE);
1456MODULE_FIRMWARE(AR6004_HW_1_2_BOARD_DATA_FILE);
1457MODULE_FIRMWARE(AR6004_HW_1_2_DEFAULT_BOARD_DATA_FILE);
1458MODULE_FIRMWARE(AR6004_HW_1_3_FW_DIR "/" AR6004_HW_1_3_FIRMWARE_FILE);
1459MODULE_FIRMWARE(AR6004_HW_1_3_BOARD_DATA_FILE);
1460MODULE_FIRMWARE(AR6004_HW_1_3_DEFAULT_BOARD_DATA_FILE);
1461