mwifiex: enable MSI interrupt support in pcie
[deliverable/linux.git] / drivers / net / wireless / marvell / mwifiex / pcie.c
1 /*
2 * Marvell Wireless LAN device driver: PCIE specific handling
3 *
4 * Copyright (C) 2011-2014, Marvell International Ltd.
5 *
6 * This software file (the "File") is distributed by Marvell International
7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8 * (the "License"). You may use, redistribute and/or modify this File in
9 * accordance with the terms and conditions of the License, a copy of which
10 * is available by writing to the Free Software Foundation, Inc.,
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
13 *
14 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
16 * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
17 * this warranty disclaimer.
18 */
19
20 #include <linux/firmware.h>
21
22 #include "decl.h"
23 #include "ioctl.h"
24 #include "util.h"
25 #include "fw.h"
26 #include "main.h"
27 #include "wmm.h"
28 #include "11n.h"
29 #include "pcie.h"
30
31 #define PCIE_VERSION "1.0"
32 #define DRV_NAME "Marvell mwifiex PCIe"
33
34 static u8 user_rmmod;
35
36 static struct mwifiex_if_ops pcie_ops;
37
38 static struct semaphore add_remove_card_sem;
39
40 static struct memory_type_mapping mem_type_mapping_tbl[] = {
41 {"ITCM", NULL, 0, 0xF0},
42 {"DTCM", NULL, 0, 0xF1},
43 {"SQRAM", NULL, 0, 0xF2},
44 {"IRAM", NULL, 0, 0xF3},
45 {"APU", NULL, 0, 0xF4},
46 {"CIU", NULL, 0, 0xF5},
47 {"ICU", NULL, 0, 0xF6},
48 {"MAC", NULL, 0, 0xF7},
49 };
50
51 static int
52 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
53 size_t size, int flags)
54 {
55 struct pcie_service_card *card = adapter->card;
56 struct mwifiex_dma_mapping mapping;
57
58 mapping.addr = pci_map_single(card->dev, skb->data, size, flags);
59 if (pci_dma_mapping_error(card->dev, mapping.addr)) {
60 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
61 return -1;
62 }
63 mapping.len = size;
64 mwifiex_store_mapping(skb, &mapping);
65 return 0;
66 }
67
68 static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
69 struct sk_buff *skb, int flags)
70 {
71 struct pcie_service_card *card = adapter->card;
72 struct mwifiex_dma_mapping mapping;
73
74 mwifiex_get_mapping(skb, &mapping);
75 pci_unmap_single(card->dev, mapping.addr, mapping.len, flags);
76 }
77
78 /*
79 * This function reads sleep cookie and checks if FW is ready
80 */
81 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
82 {
83 u32 *cookie_addr;
84 struct pcie_service_card *card = adapter->card;
85 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
86
87 if (!reg->sleep_cookie)
88 return true;
89
90 if (card->sleep_cookie_vbase) {
91 cookie_addr = (u32 *)card->sleep_cookie_vbase;
92 mwifiex_dbg(adapter, INFO,
93 "info: ACCESS_HW: sleep cookie=0x%x\n",
94 *cookie_addr);
95 if (*cookie_addr == FW_AWAKE_COOKIE)
96 return true;
97 }
98
99 return false;
100 }
101
102 #ifdef CONFIG_PM_SLEEP
103 /*
104 * Kernel needs to suspend all functions separately. Therefore all
105 * registered functions must have drivers with suspend and resume
106 * methods. Failing that the kernel simply removes the whole card.
107 *
108 * If already not suspended, this function allocates and sends a host
109 * sleep activate request to the firmware and turns off the traffic.
110 */
111 static int mwifiex_pcie_suspend(struct device *dev)
112 {
113 struct mwifiex_adapter *adapter;
114 struct pcie_service_card *card;
115 int hs_actived;
116 struct pci_dev *pdev = to_pci_dev(dev);
117
118 if (pdev) {
119 card = pci_get_drvdata(pdev);
120 if (!card || !card->adapter) {
121 pr_err("Card or adapter structure is not valid\n");
122 return 0;
123 }
124 } else {
125 pr_err("PCIE device is not specified\n");
126 return 0;
127 }
128
129 adapter = card->adapter;
130
131 hs_actived = mwifiex_enable_hs(adapter);
132
133 /* Indicate device suspended */
134 adapter->is_suspended = true;
135 adapter->hs_enabling = false;
136
137 return 0;
138 }
139
140 /*
141 * Kernel needs to suspend all functions separately. Therefore all
142 * registered functions must have drivers with suspend and resume
143 * methods. Failing that the kernel simply removes the whole card.
144 *
145 * If already not resumed, this function turns on the traffic and
146 * sends a host sleep cancel request to the firmware.
147 */
148 static int mwifiex_pcie_resume(struct device *dev)
149 {
150 struct mwifiex_adapter *adapter;
151 struct pcie_service_card *card;
152 struct pci_dev *pdev = to_pci_dev(dev);
153
154 if (pdev) {
155 card = pci_get_drvdata(pdev);
156 if (!card || !card->adapter) {
157 pr_err("Card or adapter structure is not valid\n");
158 return 0;
159 }
160 } else {
161 pr_err("PCIE device is not specified\n");
162 return 0;
163 }
164
165 adapter = card->adapter;
166
167 if (!adapter->is_suspended) {
168 mwifiex_dbg(adapter, WARN,
169 "Device already resumed\n");
170 return 0;
171 }
172
173 adapter->is_suspended = false;
174
175 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
176 MWIFIEX_ASYNC_CMD);
177
178 return 0;
179 }
180 #endif
181
182 /*
183 * This function probes an mwifiex device and registers it. It allocates
184 * the card structure, enables PCIE function number and initiates the
185 * device registration and initialization procedure by adding a logical
186 * interface.
187 */
188 static int mwifiex_pcie_probe(struct pci_dev *pdev,
189 const struct pci_device_id *ent)
190 {
191 struct pcie_service_card *card;
192
193 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
194 pdev->vendor, pdev->device, pdev->revision);
195
196 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
197 if (!card)
198 return -ENOMEM;
199
200 card->dev = pdev;
201
202 if (ent->driver_data) {
203 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
204 card->pcie.firmware = data->firmware;
205 card->pcie.reg = data->reg;
206 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
207 card->pcie.tx_buf_size = data->tx_buf_size;
208 card->pcie.can_dump_fw = data->can_dump_fw;
209 card->pcie.can_ext_scan = data->can_ext_scan;
210 }
211
212 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
213 MWIFIEX_PCIE)) {
214 pr_err("%s failed\n", __func__);
215 kfree(card);
216 return -1;
217 }
218
219 return 0;
220 }
221
222 /*
223 * This function removes the interface and frees up the card structure.
224 */
225 static void mwifiex_pcie_remove(struct pci_dev *pdev)
226 {
227 struct pcie_service_card *card;
228 struct mwifiex_adapter *adapter;
229 struct mwifiex_private *priv;
230
231 card = pci_get_drvdata(pdev);
232 if (!card)
233 return;
234
235 adapter = card->adapter;
236 if (!adapter || !adapter->priv_num)
237 return;
238
239 if (user_rmmod) {
240 #ifdef CONFIG_PM_SLEEP
241 if (adapter->is_suspended)
242 mwifiex_pcie_resume(&pdev->dev);
243 #endif
244
245 mwifiex_deauthenticate_all(adapter);
246
247 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
248
249 mwifiex_disable_auto_ds(priv);
250
251 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
252 }
253
254 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
255 }
256
257 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
258 {
259 user_rmmod = 1;
260 mwifiex_pcie_remove(pdev);
261
262 return;
263 }
264
265 static const struct pci_device_id mwifiex_ids[] = {
266 {
267 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
268 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
269 .driver_data = (unsigned long)&mwifiex_pcie8766,
270 },
271 {
272 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
273 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
274 .driver_data = (unsigned long)&mwifiex_pcie8897,
275 },
276 {
277 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
278 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
279 .driver_data = (unsigned long)&mwifiex_pcie8997,
280 },
281 {},
282 };
283
284 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
285
286 #ifdef CONFIG_PM_SLEEP
287 /* Power Management Hooks */
288 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
289 mwifiex_pcie_resume);
290 #endif
291
292 /* PCI Device Driver */
293 static struct pci_driver __refdata mwifiex_pcie = {
294 .name = "mwifiex_pcie",
295 .id_table = mwifiex_ids,
296 .probe = mwifiex_pcie_probe,
297 .remove = mwifiex_pcie_remove,
298 #ifdef CONFIG_PM_SLEEP
299 .driver = {
300 .pm = &mwifiex_pcie_pm_ops,
301 },
302 #endif
303 .shutdown = mwifiex_pcie_shutdown,
304 };
305
306 /*
307 * This function writes data into PCIE card register.
308 */
309 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
310 {
311 struct pcie_service_card *card = adapter->card;
312
313 iowrite32(data, card->pci_mmap1 + reg);
314
315 return 0;
316 }
317
318 /*
319 * This function reads data from PCIE card register.
320 */
321 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
322 {
323 struct pcie_service_card *card = adapter->card;
324
325 *data = ioread32(card->pci_mmap1 + reg);
326
327 return 0;
328 }
329
330 /* This function reads u8 data from PCIE card register. */
331 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
332 int reg, u8 *data)
333 {
334 struct pcie_service_card *card = adapter->card;
335
336 *data = ioread8(card->pci_mmap1 + reg);
337
338 return 0;
339 }
340
341 /*
342 * This function adds delay loop to ensure FW is awake before proceeding.
343 */
344 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
345 {
346 int i = 0;
347
348 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
349 i++;
350 usleep_range(10, 20);
351 /* 50ms max wait */
352 if (i == 5000)
353 break;
354 }
355
356 return;
357 }
358
359 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
360 u32 max_delay_loop_cnt)
361 {
362 struct pcie_service_card *card = adapter->card;
363 u8 *buffer;
364 u32 sleep_cookie, count;
365
366 for (count = 0; count < max_delay_loop_cnt; count++) {
367 buffer = card->cmdrsp_buf->data - INTF_HEADER_LEN;
368 sleep_cookie = *(u32 *)buffer;
369
370 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
371 mwifiex_dbg(adapter, INFO,
372 "sleep cookie found at count %d\n", count);
373 break;
374 }
375 usleep_range(20, 30);
376 }
377
378 if (count >= max_delay_loop_cnt)
379 mwifiex_dbg(adapter, INFO,
380 "max count reached while accessing sleep cookie\n");
381 }
382
383 /* This function wakes up the card by reading fw_status register. */
384 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
385 {
386 u32 fw_status;
387 struct pcie_service_card *card = adapter->card;
388 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
389
390 mwifiex_dbg(adapter, EVENT,
391 "event: Wakeup device...\n");
392
393 if (reg->sleep_cookie)
394 mwifiex_pcie_dev_wakeup_delay(adapter);
395
396 /* Reading fw_status register will wakeup device */
397 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status)) {
398 mwifiex_dbg(adapter, ERROR,
399 "Reading fw_status register failed\n");
400 return -1;
401 }
402
403 if (reg->sleep_cookie) {
404 mwifiex_pcie_dev_wakeup_delay(adapter);
405 mwifiex_dbg(adapter, INFO,
406 "PCIE wakeup: Setting PS_STATE_AWAKE\n");
407 adapter->ps_state = PS_STATE_AWAKE;
408 }
409
410 return 0;
411 }
412
413 /*
414 * This function is called after the card has woken up.
415 *
416 * The card configuration register is reset.
417 */
418 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
419 {
420 mwifiex_dbg(adapter, CMD,
421 "cmd: Wakeup device completed\n");
422
423 return 0;
424 }
425
426 /*
427 * This function disables the host interrupt.
428 *
429 * The host interrupt mask is read, the disable bit is reset and
430 * written back to the card host interrupt mask register.
431 */
432 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
433 {
434 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
435 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
436 0x00000000)) {
437 mwifiex_dbg(adapter, ERROR,
438 "Disable host interrupt failed\n");
439 return -1;
440 }
441 }
442
443 return 0;
444 }
445
446 /*
447 * This function enables the host interrupt.
448 *
449 * The host interrupt enable mask is written to the card
450 * host interrupt mask register.
451 */
452 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
453 {
454 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
455 /* Simply write the mask to the register */
456 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
457 HOST_INTR_MASK)) {
458 mwifiex_dbg(adapter, ERROR,
459 "Enable host interrupt failed\n");
460 return -1;
461 }
462 }
463
464 return 0;
465 }
466
467 /*
468 * This function initializes TX buffer ring descriptors
469 */
470 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
471 {
472 struct pcie_service_card *card = adapter->card;
473 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
474 struct mwifiex_pcie_buf_desc *desc;
475 struct mwifiex_pfu_buf_desc *desc2;
476 int i;
477
478 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
479 card->tx_buf_list[i] = NULL;
480 if (reg->pfu_enabled) {
481 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
482 (sizeof(*desc2) * i);
483 desc2 = card->txbd_ring[i];
484 memset(desc2, 0, sizeof(*desc2));
485 } else {
486 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
487 (sizeof(*desc) * i);
488 desc = card->txbd_ring[i];
489 memset(desc, 0, sizeof(*desc));
490 }
491 }
492
493 return 0;
494 }
495
496 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
497 * here and after mapping PCI memory, its physical address is assigned to
498 * PCIE Rx buffer descriptor's physical address.
499 */
500 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
501 {
502 struct pcie_service_card *card = adapter->card;
503 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
504 struct sk_buff *skb;
505 struct mwifiex_pcie_buf_desc *desc;
506 struct mwifiex_pfu_buf_desc *desc2;
507 dma_addr_t buf_pa;
508 int i;
509
510 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
511 /* Allocate skb here so that firmware can DMA data from it */
512 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
513 GFP_KERNEL | GFP_DMA);
514 if (!skb) {
515 mwifiex_dbg(adapter, ERROR,
516 "Unable to allocate skb for RX ring.\n");
517 kfree(card->rxbd_ring_vbase);
518 return -ENOMEM;
519 }
520
521 if (mwifiex_map_pci_memory(adapter, skb,
522 MWIFIEX_RX_DATA_BUF_SIZE,
523 PCI_DMA_FROMDEVICE))
524 return -1;
525
526 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
527
528 mwifiex_dbg(adapter, INFO,
529 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
530 skb, skb->len, skb->data, (u32)buf_pa,
531 (u32)((u64)buf_pa >> 32));
532
533 card->rx_buf_list[i] = skb;
534 if (reg->pfu_enabled) {
535 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
536 (sizeof(*desc2) * i);
537 desc2 = card->rxbd_ring[i];
538 desc2->paddr = buf_pa;
539 desc2->len = (u16)skb->len;
540 desc2->frag_len = (u16)skb->len;
541 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
542 desc2->offset = 0;
543 } else {
544 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
545 (sizeof(*desc) * i));
546 desc = card->rxbd_ring[i];
547 desc->paddr = buf_pa;
548 desc->len = (u16)skb->len;
549 desc->flags = 0;
550 }
551 }
552
553 return 0;
554 }
555
556 /* This function initializes event buffer ring descriptors. Each SKB is
557 * allocated here and after mapping PCI memory, its physical address is assigned
558 * to PCIE Rx buffer descriptor's physical address
559 */
560 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
561 {
562 struct pcie_service_card *card = adapter->card;
563 struct mwifiex_evt_buf_desc *desc;
564 struct sk_buff *skb;
565 dma_addr_t buf_pa;
566 int i;
567
568 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
569 /* Allocate skb here so that firmware can DMA data from it */
570 skb = dev_alloc_skb(MAX_EVENT_SIZE);
571 if (!skb) {
572 mwifiex_dbg(adapter, ERROR,
573 "Unable to allocate skb for EVENT buf.\n");
574 kfree(card->evtbd_ring_vbase);
575 return -ENOMEM;
576 }
577 skb_put(skb, MAX_EVENT_SIZE);
578
579 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
580 PCI_DMA_FROMDEVICE))
581 return -1;
582
583 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
584
585 mwifiex_dbg(adapter, EVENT,
586 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
587 skb, skb->len, skb->data, (u32)buf_pa,
588 (u32)((u64)buf_pa >> 32));
589
590 card->evt_buf_list[i] = skb;
591 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
592 (sizeof(*desc) * i));
593 desc = card->evtbd_ring[i];
594 desc->paddr = buf_pa;
595 desc->len = (u16)skb->len;
596 desc->flags = 0;
597 }
598
599 return 0;
600 }
601
602 /* This function cleans up TX buffer rings. If any of the buffer list has valid
603 * SKB address, associated SKB is freed.
604 */
605 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
606 {
607 struct pcie_service_card *card = adapter->card;
608 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
609 struct sk_buff *skb;
610 struct mwifiex_pcie_buf_desc *desc;
611 struct mwifiex_pfu_buf_desc *desc2;
612 int i;
613
614 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
615 if (reg->pfu_enabled) {
616 desc2 = card->txbd_ring[i];
617 if (card->tx_buf_list[i]) {
618 skb = card->tx_buf_list[i];
619 mwifiex_unmap_pci_memory(adapter, skb,
620 PCI_DMA_TODEVICE);
621 dev_kfree_skb_any(skb);
622 }
623 memset(desc2, 0, sizeof(*desc2));
624 } else {
625 desc = card->txbd_ring[i];
626 if (card->tx_buf_list[i]) {
627 skb = card->tx_buf_list[i];
628 mwifiex_unmap_pci_memory(adapter, skb,
629 PCI_DMA_TODEVICE);
630 dev_kfree_skb_any(skb);
631 }
632 memset(desc, 0, sizeof(*desc));
633 }
634 card->tx_buf_list[i] = NULL;
635 }
636
637 return;
638 }
639
640 /* This function cleans up RX buffer rings. If any of the buffer list has valid
641 * SKB address, associated SKB is freed.
642 */
643 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
644 {
645 struct pcie_service_card *card = adapter->card;
646 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
647 struct mwifiex_pcie_buf_desc *desc;
648 struct mwifiex_pfu_buf_desc *desc2;
649 struct sk_buff *skb;
650 int i;
651
652 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
653 if (reg->pfu_enabled) {
654 desc2 = card->rxbd_ring[i];
655 if (card->rx_buf_list[i]) {
656 skb = card->rx_buf_list[i];
657 mwifiex_unmap_pci_memory(adapter, skb,
658 PCI_DMA_FROMDEVICE);
659 dev_kfree_skb_any(skb);
660 }
661 memset(desc2, 0, sizeof(*desc2));
662 } else {
663 desc = card->rxbd_ring[i];
664 if (card->rx_buf_list[i]) {
665 skb = card->rx_buf_list[i];
666 mwifiex_unmap_pci_memory(adapter, skb,
667 PCI_DMA_FROMDEVICE);
668 dev_kfree_skb_any(skb);
669 }
670 memset(desc, 0, sizeof(*desc));
671 }
672 card->rx_buf_list[i] = NULL;
673 }
674
675 return;
676 }
677
678 /* This function cleans up event buffer rings. If any of the buffer list has
679 * valid SKB address, associated SKB is freed.
680 */
681 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
682 {
683 struct pcie_service_card *card = adapter->card;
684 struct mwifiex_evt_buf_desc *desc;
685 struct sk_buff *skb;
686 int i;
687
688 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
689 desc = card->evtbd_ring[i];
690 if (card->evt_buf_list[i]) {
691 skb = card->evt_buf_list[i];
692 mwifiex_unmap_pci_memory(adapter, skb,
693 PCI_DMA_FROMDEVICE);
694 dev_kfree_skb_any(skb);
695 }
696 card->evt_buf_list[i] = NULL;
697 memset(desc, 0, sizeof(*desc));
698 }
699
700 return;
701 }
702
703 /* This function creates buffer descriptor ring for TX
704 */
705 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
706 {
707 struct pcie_service_card *card = adapter->card;
708 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
709
710 /*
711 * driver maintaines the write pointer and firmware maintaines the read
712 * pointer. The write pointer starts at 0 (zero) while the read pointer
713 * starts at zero with rollover bit set
714 */
715 card->txbd_wrptr = 0;
716
717 if (reg->pfu_enabled)
718 card->txbd_rdptr = 0;
719 else
720 card->txbd_rdptr |= reg->tx_rollover_ind;
721
722 /* allocate shared memory for the BD ring and divide the same in to
723 several descriptors */
724 if (reg->pfu_enabled)
725 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
726 MWIFIEX_MAX_TXRX_BD;
727 else
728 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
729 MWIFIEX_MAX_TXRX_BD;
730
731 mwifiex_dbg(adapter, INFO,
732 "info: txbd_ring: Allocating %d bytes\n",
733 card->txbd_ring_size);
734 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
735 card->txbd_ring_size,
736 &card->txbd_ring_pbase);
737 if (!card->txbd_ring_vbase) {
738 mwifiex_dbg(adapter, ERROR,
739 "allocate consistent memory (%d bytes) failed!\n",
740 card->txbd_ring_size);
741 return -ENOMEM;
742 }
743 mwifiex_dbg(adapter, DATA,
744 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
745 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
746 (u32)((u64)card->txbd_ring_pbase >> 32),
747 card->txbd_ring_size);
748
749 return mwifiex_init_txq_ring(adapter);
750 }
751
752 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
753 {
754 struct pcie_service_card *card = adapter->card;
755 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
756
757 mwifiex_cleanup_txq_ring(adapter);
758
759 if (card->txbd_ring_vbase)
760 pci_free_consistent(card->dev, card->txbd_ring_size,
761 card->txbd_ring_vbase,
762 card->txbd_ring_pbase);
763 card->txbd_ring_size = 0;
764 card->txbd_wrptr = 0;
765 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
766 card->txbd_ring_vbase = NULL;
767 card->txbd_ring_pbase = 0;
768
769 return 0;
770 }
771
772 /*
773 * This function creates buffer descriptor ring for RX
774 */
775 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
776 {
777 struct pcie_service_card *card = adapter->card;
778 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
779
780 /*
781 * driver maintaines the read pointer and firmware maintaines the write
782 * pointer. The write pointer starts at 0 (zero) while the read pointer
783 * starts at zero with rollover bit set
784 */
785 card->rxbd_wrptr = 0;
786 card->rxbd_rdptr = reg->rx_rollover_ind;
787
788 if (reg->pfu_enabled)
789 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
790 MWIFIEX_MAX_TXRX_BD;
791 else
792 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
793 MWIFIEX_MAX_TXRX_BD;
794
795 mwifiex_dbg(adapter, INFO,
796 "info: rxbd_ring: Allocating %d bytes\n",
797 card->rxbd_ring_size);
798 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
799 card->rxbd_ring_size,
800 &card->rxbd_ring_pbase);
801 if (!card->rxbd_ring_vbase) {
802 mwifiex_dbg(adapter, ERROR,
803 "allocate consistent memory (%d bytes) failed!\n",
804 card->rxbd_ring_size);
805 return -ENOMEM;
806 }
807
808 mwifiex_dbg(adapter, DATA,
809 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
810 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
811 (u32)((u64)card->rxbd_ring_pbase >> 32),
812 card->rxbd_ring_size);
813
814 return mwifiex_init_rxq_ring(adapter);
815 }
816
817 /*
818 * This function deletes Buffer descriptor ring for RX
819 */
820 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
821 {
822 struct pcie_service_card *card = adapter->card;
823 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
824
825 mwifiex_cleanup_rxq_ring(adapter);
826
827 if (card->rxbd_ring_vbase)
828 pci_free_consistent(card->dev, card->rxbd_ring_size,
829 card->rxbd_ring_vbase,
830 card->rxbd_ring_pbase);
831 card->rxbd_ring_size = 0;
832 card->rxbd_wrptr = 0;
833 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
834 card->rxbd_ring_vbase = NULL;
835 card->rxbd_ring_pbase = 0;
836
837 return 0;
838 }
839
840 /*
841 * This function creates buffer descriptor ring for Events
842 */
843 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
844 {
845 struct pcie_service_card *card = adapter->card;
846 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
847
848 /*
849 * driver maintaines the read pointer and firmware maintaines the write
850 * pointer. The write pointer starts at 0 (zero) while the read pointer
851 * starts at zero with rollover bit set
852 */
853 card->evtbd_wrptr = 0;
854 card->evtbd_rdptr = reg->evt_rollover_ind;
855
856 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
857 MWIFIEX_MAX_EVT_BD;
858
859 mwifiex_dbg(adapter, INFO,
860 "info: evtbd_ring: Allocating %d bytes\n",
861 card->evtbd_ring_size);
862 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
863 card->evtbd_ring_size,
864 &card->evtbd_ring_pbase);
865 if (!card->evtbd_ring_vbase) {
866 mwifiex_dbg(adapter, ERROR,
867 "allocate consistent memory (%d bytes) failed!\n",
868 card->evtbd_ring_size);
869 return -ENOMEM;
870 }
871
872 mwifiex_dbg(adapter, EVENT,
873 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
874 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
875 (u32)((u64)card->evtbd_ring_pbase >> 32),
876 card->evtbd_ring_size);
877
878 return mwifiex_pcie_init_evt_ring(adapter);
879 }
880
881 /*
882 * This function deletes Buffer descriptor ring for Events
883 */
884 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
885 {
886 struct pcie_service_card *card = adapter->card;
887 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
888
889 mwifiex_cleanup_evt_ring(adapter);
890
891 if (card->evtbd_ring_vbase)
892 pci_free_consistent(card->dev, card->evtbd_ring_size,
893 card->evtbd_ring_vbase,
894 card->evtbd_ring_pbase);
895 card->evtbd_wrptr = 0;
896 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
897 card->evtbd_ring_size = 0;
898 card->evtbd_ring_vbase = NULL;
899 card->evtbd_ring_pbase = 0;
900
901 return 0;
902 }
903
904 /*
905 * This function allocates a buffer for CMDRSP
906 */
907 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
908 {
909 struct pcie_service_card *card = adapter->card;
910 struct sk_buff *skb;
911
912 /* Allocate memory for receiving command response data */
913 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
914 if (!skb) {
915 mwifiex_dbg(adapter, ERROR,
916 "Unable to allocate skb for command response data.\n");
917 return -ENOMEM;
918 }
919 skb_put(skb, MWIFIEX_UPLD_SIZE);
920 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
921 PCI_DMA_FROMDEVICE))
922 return -1;
923
924 card->cmdrsp_buf = skb;
925
926 return 0;
927 }
928
929 /*
930 * This function deletes a buffer for CMDRSP
931 */
932 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
933 {
934 struct pcie_service_card *card;
935
936 if (!adapter)
937 return 0;
938
939 card = adapter->card;
940
941 if (card && card->cmdrsp_buf) {
942 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
943 PCI_DMA_FROMDEVICE);
944 dev_kfree_skb_any(card->cmdrsp_buf);
945 }
946
947 if (card && card->cmd_buf) {
948 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
949 PCI_DMA_TODEVICE);
950 }
951 return 0;
952 }
953
954 /*
955 * This function allocates a buffer for sleep cookie
956 */
957 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
958 {
959 struct pcie_service_card *card = adapter->card;
960
961 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
962 &card->sleep_cookie_pbase);
963 if (!card->sleep_cookie_vbase) {
964 mwifiex_dbg(adapter, ERROR,
965 "pci_alloc_consistent failed!\n");
966 return -ENOMEM;
967 }
968 /* Init val of Sleep Cookie */
969 *(u32 *)card->sleep_cookie_vbase = FW_AWAKE_COOKIE;
970
971 mwifiex_dbg(adapter, INFO,
972 "alloc_scook: sleep cookie=0x%x\n",
973 *((u32 *)card->sleep_cookie_vbase));
974
975 return 0;
976 }
977
978 /*
979 * This function deletes buffer for sleep cookie
980 */
981 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
982 {
983 struct pcie_service_card *card;
984
985 if (!adapter)
986 return 0;
987
988 card = adapter->card;
989
990 if (card && card->sleep_cookie_vbase) {
991 pci_free_consistent(card->dev, sizeof(u32),
992 card->sleep_cookie_vbase,
993 card->sleep_cookie_pbase);
994 card->sleep_cookie_vbase = NULL;
995 }
996
997 return 0;
998 }
999
1000 /* This function flushes the TX buffer descriptor ring
1001 * This function defined as handler is also called while cleaning TXRX
1002 * during disconnect/ bss stop.
1003 */
1004 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1005 {
1006 struct pcie_service_card *card = adapter->card;
1007
1008 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1009 card->txbd_flush = 1;
1010 /* write pointer already set at last send
1011 * send dnld-rdy intr again, wait for completion.
1012 */
1013 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1014 CPU_INTR_DNLD_RDY)) {
1015 mwifiex_dbg(adapter, ERROR,
1016 "failed to assert dnld-rdy interrupt.\n");
1017 return -1;
1018 }
1019 }
1020 return 0;
1021 }
1022
1023 /*
1024 * This function unmaps and frees downloaded data buffer
1025 */
1026 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1027 {
1028 struct sk_buff *skb;
1029 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1030 struct mwifiex_pcie_buf_desc *desc;
1031 struct mwifiex_pfu_buf_desc *desc2;
1032 struct pcie_service_card *card = adapter->card;
1033 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1034
1035 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1036 mwifiex_pm_wakeup_card(adapter);
1037
1038 /* Read the TX ring read pointer set by firmware */
1039 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1040 mwifiex_dbg(adapter, ERROR,
1041 "SEND COMP: failed to read reg->tx_rdptr\n");
1042 return -1;
1043 }
1044
1045 mwifiex_dbg(adapter, DATA,
1046 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1047 card->txbd_rdptr, rdptr);
1048
1049 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1050 /* free from previous txbd_rdptr to current txbd_rdptr */
1051 while (((card->txbd_rdptr & reg->tx_mask) !=
1052 (rdptr & reg->tx_mask)) ||
1053 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1054 (rdptr & reg->tx_rollover_ind))) {
1055 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1056 reg->tx_start_ptr;
1057
1058 skb = card->tx_buf_list[wrdoneidx];
1059
1060 if (skb) {
1061 mwifiex_dbg(adapter, DATA,
1062 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1063 skb, wrdoneidx);
1064 mwifiex_unmap_pci_memory(adapter, skb,
1065 PCI_DMA_TODEVICE);
1066
1067 unmap_count++;
1068
1069 if (card->txbd_flush)
1070 mwifiex_write_data_complete(adapter, skb, 0,
1071 -1);
1072 else
1073 mwifiex_write_data_complete(adapter, skb, 0, 0);
1074 }
1075
1076 card->tx_buf_list[wrdoneidx] = NULL;
1077
1078 if (reg->pfu_enabled) {
1079 desc2 = card->txbd_ring[wrdoneidx];
1080 memset(desc2, 0, sizeof(*desc2));
1081 } else {
1082 desc = card->txbd_ring[wrdoneidx];
1083 memset(desc, 0, sizeof(*desc));
1084 }
1085 switch (card->dev->device) {
1086 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1087 card->txbd_rdptr++;
1088 break;
1089 case PCIE_DEVICE_ID_MARVELL_88W8897:
1090 case PCIE_DEVICE_ID_MARVELL_88W8997:
1091 card->txbd_rdptr += reg->ring_tx_start_ptr;
1092 break;
1093 }
1094
1095
1096 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1097 card->txbd_rdptr = ((card->txbd_rdptr &
1098 reg->tx_rollover_ind) ^
1099 reg->tx_rollover_ind);
1100 }
1101
1102 if (unmap_count)
1103 adapter->data_sent = false;
1104
1105 if (card->txbd_flush) {
1106 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1107 card->txbd_flush = 0;
1108 else
1109 mwifiex_clean_pcie_ring_buf(adapter);
1110 }
1111
1112 return 0;
1113 }
1114
1115 /* This function sends data buffer to device. First 4 bytes of payload
1116 * are filled with payload length and payload type. Then this payload
1117 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1118 * Download ready interrupt to FW is deffered if Tx ring is not full and
1119 * additional payload can be accomodated.
1120 * Caller must ensure tx_param parameter to this function is not NULL.
1121 */
1122 static int
1123 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1124 struct mwifiex_tx_param *tx_param)
1125 {
1126 struct pcie_service_card *card = adapter->card;
1127 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1128 u32 wrindx, num_tx_buffs, rx_val;
1129 int ret;
1130 dma_addr_t buf_pa;
1131 struct mwifiex_pcie_buf_desc *desc = NULL;
1132 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1133 __le16 *tmp;
1134
1135 if (!(skb->data && skb->len)) {
1136 mwifiex_dbg(adapter, ERROR,
1137 "%s(): invalid parameter <%p, %#x>\n",
1138 __func__, skb->data, skb->len);
1139 return -1;
1140 }
1141
1142 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1143 mwifiex_pm_wakeup_card(adapter);
1144
1145 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1146 mwifiex_dbg(adapter, DATA,
1147 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1148 card->txbd_rdptr, card->txbd_wrptr);
1149 if (mwifiex_pcie_txbd_not_full(card)) {
1150 u8 *payload;
1151
1152 adapter->data_sent = true;
1153 payload = skb->data;
1154 tmp = (__le16 *)&payload[0];
1155 *tmp = cpu_to_le16((u16)skb->len);
1156 tmp = (__le16 *)&payload[2];
1157 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
1158
1159 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1160 PCI_DMA_TODEVICE))
1161 return -1;
1162
1163 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1164 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1165 card->tx_buf_list[wrindx] = skb;
1166
1167 if (reg->pfu_enabled) {
1168 desc2 = card->txbd_ring[wrindx];
1169 desc2->paddr = buf_pa;
1170 desc2->len = (u16)skb->len;
1171 desc2->frag_len = (u16)skb->len;
1172 desc2->offset = 0;
1173 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1174 MWIFIEX_BD_FLAG_LAST_DESC;
1175 } else {
1176 desc = card->txbd_ring[wrindx];
1177 desc->paddr = buf_pa;
1178 desc->len = (u16)skb->len;
1179 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1180 MWIFIEX_BD_FLAG_LAST_DESC;
1181 }
1182
1183 switch (card->dev->device) {
1184 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1185 card->txbd_wrptr++;
1186 break;
1187 case PCIE_DEVICE_ID_MARVELL_88W8897:
1188 case PCIE_DEVICE_ID_MARVELL_88W8997:
1189 card->txbd_wrptr += reg->ring_tx_start_ptr;
1190 break;
1191 }
1192
1193 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1194 card->txbd_wrptr = ((card->txbd_wrptr &
1195 reg->tx_rollover_ind) ^
1196 reg->tx_rollover_ind);
1197
1198 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1199 /* Write the TX ring write pointer in to reg->tx_wrptr */
1200 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1201 card->txbd_wrptr | rx_val)) {
1202 mwifiex_dbg(adapter, ERROR,
1203 "SEND DATA: failed to write reg->tx_wrptr\n");
1204 ret = -1;
1205 goto done_unmap;
1206 }
1207 if ((mwifiex_pcie_txbd_not_full(card)) &&
1208 tx_param->next_pkt_len) {
1209 /* have more packets and TxBD still can hold more */
1210 mwifiex_dbg(adapter, DATA,
1211 "SEND DATA: delay dnld-rdy interrupt.\n");
1212 adapter->data_sent = false;
1213 } else {
1214 /* Send the TX ready interrupt */
1215 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1216 CPU_INTR_DNLD_RDY)) {
1217 mwifiex_dbg(adapter, ERROR,
1218 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1219 ret = -1;
1220 goto done_unmap;
1221 }
1222 }
1223 mwifiex_dbg(adapter, DATA,
1224 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1225 "%#x> and sent packet to firmware successfully\n",
1226 card->txbd_rdptr, card->txbd_wrptr);
1227 } else {
1228 mwifiex_dbg(adapter, DATA,
1229 "info: TX Ring full, can't send packets to fw\n");
1230 adapter->data_sent = true;
1231 /* Send the TX ready interrupt */
1232 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1233 CPU_INTR_DNLD_RDY))
1234 mwifiex_dbg(adapter, ERROR,
1235 "SEND DATA: failed to assert door-bell intr\n");
1236 return -EBUSY;
1237 }
1238
1239 return -EINPROGRESS;
1240 done_unmap:
1241 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1242 card->tx_buf_list[wrindx] = NULL;
1243 if (reg->pfu_enabled)
1244 memset(desc2, 0, sizeof(*desc2));
1245 else
1246 memset(desc, 0, sizeof(*desc));
1247
1248 return ret;
1249 }
1250
1251 /*
1252 * This function handles received buffer ring and
1253 * dispatches packets to upper
1254 */
1255 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1256 {
1257 struct pcie_service_card *card = adapter->card;
1258 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1259 u32 wrptr, rd_index, tx_val;
1260 dma_addr_t buf_pa;
1261 int ret = 0;
1262 struct sk_buff *skb_tmp = NULL;
1263 struct mwifiex_pcie_buf_desc *desc;
1264 struct mwifiex_pfu_buf_desc *desc2;
1265
1266 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1267 mwifiex_pm_wakeup_card(adapter);
1268
1269 /* Read the RX ring Write pointer set by firmware */
1270 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1271 mwifiex_dbg(adapter, ERROR,
1272 "RECV DATA: failed to read reg->rx_wrptr\n");
1273 ret = -1;
1274 goto done;
1275 }
1276 card->rxbd_wrptr = wrptr;
1277
1278 while (((wrptr & reg->rx_mask) !=
1279 (card->rxbd_rdptr & reg->rx_mask)) ||
1280 ((wrptr & reg->rx_rollover_ind) ==
1281 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1282 struct sk_buff *skb_data;
1283 u16 rx_len;
1284 __le16 pkt_len;
1285
1286 rd_index = card->rxbd_rdptr & reg->rx_mask;
1287 skb_data = card->rx_buf_list[rd_index];
1288
1289 /* If skb allocation was failed earlier for Rx packet,
1290 * rx_buf_list[rd_index] would have been left with a NULL.
1291 */
1292 if (!skb_data)
1293 return -ENOMEM;
1294
1295 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1296 card->rx_buf_list[rd_index] = NULL;
1297
1298 /* Get data length from interface header -
1299 * first 2 bytes for len, next 2 bytes is for type
1300 */
1301 pkt_len = *((__le16 *)skb_data->data);
1302 rx_len = le16_to_cpu(pkt_len);
1303 if (WARN_ON(rx_len <= INTF_HEADER_LEN ||
1304 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1305 mwifiex_dbg(adapter, ERROR,
1306 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1307 rx_len, card->rxbd_rdptr, wrptr);
1308 dev_kfree_skb_any(skb_data);
1309 } else {
1310 skb_put(skb_data, rx_len);
1311 mwifiex_dbg(adapter, DATA,
1312 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1313 card->rxbd_rdptr, wrptr, rx_len);
1314 skb_pull(skb_data, INTF_HEADER_LEN);
1315 if (adapter->rx_work_enabled) {
1316 skb_queue_tail(&adapter->rx_data_q, skb_data);
1317 adapter->data_received = true;
1318 atomic_inc(&adapter->rx_pending);
1319 } else {
1320 mwifiex_handle_rx_packet(adapter, skb_data);
1321 }
1322 }
1323
1324 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1325 GFP_KERNEL | GFP_DMA);
1326 if (!skb_tmp) {
1327 mwifiex_dbg(adapter, ERROR,
1328 "Unable to allocate skb.\n");
1329 return -ENOMEM;
1330 }
1331
1332 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1333 MWIFIEX_RX_DATA_BUF_SIZE,
1334 PCI_DMA_FROMDEVICE))
1335 return -1;
1336
1337 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1338
1339 mwifiex_dbg(adapter, INFO,
1340 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1341 skb_tmp, rd_index);
1342 card->rx_buf_list[rd_index] = skb_tmp;
1343
1344 if (reg->pfu_enabled) {
1345 desc2 = card->rxbd_ring[rd_index];
1346 desc2->paddr = buf_pa;
1347 desc2->len = skb_tmp->len;
1348 desc2->frag_len = skb_tmp->len;
1349 desc2->offset = 0;
1350 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1351 } else {
1352 desc = card->rxbd_ring[rd_index];
1353 desc->paddr = buf_pa;
1354 desc->len = skb_tmp->len;
1355 desc->flags = 0;
1356 }
1357
1358 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1359 MWIFIEX_MAX_TXRX_BD) {
1360 card->rxbd_rdptr = ((card->rxbd_rdptr &
1361 reg->rx_rollover_ind) ^
1362 reg->rx_rollover_ind);
1363 }
1364 mwifiex_dbg(adapter, DATA,
1365 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1366 card->rxbd_rdptr, wrptr);
1367
1368 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1369 /* Write the RX ring read pointer in to reg->rx_rdptr */
1370 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1371 card->rxbd_rdptr | tx_val)) {
1372 mwifiex_dbg(adapter, DATA,
1373 "RECV DATA: failed to write reg->rx_rdptr\n");
1374 ret = -1;
1375 goto done;
1376 }
1377
1378 /* Read the RX ring Write pointer set by firmware */
1379 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1380 mwifiex_dbg(adapter, ERROR,
1381 "RECV DATA: failed to read reg->rx_wrptr\n");
1382 ret = -1;
1383 goto done;
1384 }
1385 mwifiex_dbg(adapter, DATA,
1386 "info: RECV DATA: Rcvd packet from fw successfully\n");
1387 card->rxbd_wrptr = wrptr;
1388 }
1389
1390 done:
1391 return ret;
1392 }
1393
1394 /*
1395 * This function downloads the boot command to device
1396 */
1397 static int
1398 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1399 {
1400 dma_addr_t buf_pa;
1401 struct pcie_service_card *card = adapter->card;
1402 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1403
1404 if (!(skb->data && skb->len)) {
1405 mwifiex_dbg(adapter, ERROR,
1406 "Invalid parameter in %s <%p. len %d>\n",
1407 __func__, skb->data, skb->len);
1408 return -1;
1409 }
1410
1411 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1412 return -1;
1413
1414 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1415
1416 /* Write the lower 32bits of the physical address to low command
1417 * address scratch register
1418 */
1419 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1420 mwifiex_dbg(adapter, ERROR,
1421 "%s: failed to write download command to boot code.\n",
1422 __func__);
1423 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1424 return -1;
1425 }
1426
1427 /* Write the upper 32bits of the physical address to high command
1428 * address scratch register
1429 */
1430 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1431 (u32)((u64)buf_pa >> 32))) {
1432 mwifiex_dbg(adapter, ERROR,
1433 "%s: failed to write download command to boot code.\n",
1434 __func__);
1435 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1436 return -1;
1437 }
1438
1439 /* Write the command length to cmd_size scratch register */
1440 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1441 mwifiex_dbg(adapter, ERROR,
1442 "%s: failed to write command len to cmd_size scratch reg\n",
1443 __func__);
1444 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1445 return -1;
1446 }
1447
1448 /* Ring the door bell */
1449 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1450 CPU_INTR_DOOR_BELL)) {
1451 mwifiex_dbg(adapter, ERROR,
1452 "%s: failed to assert door-bell intr\n", __func__);
1453 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1454 return -1;
1455 }
1456
1457 return 0;
1458 }
1459
1460 /* This function init rx port in firmware which in turn enables to receive data
1461 * from device before transmitting any packet.
1462 */
1463 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1464 {
1465 struct pcie_service_card *card = adapter->card;
1466 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1467 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1468
1469 /* Write the RX ring read pointer in to reg->rx_rdptr */
1470 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1471 tx_wrap)) {
1472 mwifiex_dbg(adapter, ERROR,
1473 "RECV DATA: failed to write reg->rx_rdptr\n");
1474 return -1;
1475 }
1476 return 0;
1477 }
1478
1479 /* This function downloads commands to the device
1480 */
1481 static int
1482 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1483 {
1484 struct pcie_service_card *card = adapter->card;
1485 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1486 int ret = 0;
1487 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1488 u8 *payload = (u8 *)skb->data;
1489
1490 if (!(skb->data && skb->len)) {
1491 mwifiex_dbg(adapter, ERROR,
1492 "Invalid parameter in %s <%p, %#x>\n",
1493 __func__, skb->data, skb->len);
1494 return -1;
1495 }
1496
1497 /* Make sure a command response buffer is available */
1498 if (!card->cmdrsp_buf) {
1499 mwifiex_dbg(adapter, ERROR,
1500 "No response buffer available, send command failed\n");
1501 return -EBUSY;
1502 }
1503
1504 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1505 mwifiex_pm_wakeup_card(adapter);
1506
1507 adapter->cmd_sent = true;
1508
1509 *(__le16 *)&payload[0] = cpu_to_le16((u16)skb->len);
1510 *(__le16 *)&payload[2] = cpu_to_le16(MWIFIEX_TYPE_CMD);
1511
1512 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1513 return -1;
1514
1515 card->cmd_buf = skb;
1516
1517 /* To send a command, the driver will:
1518 1. Write the 64bit physical address of the data buffer to
1519 cmd response address low + cmd response address high
1520 2. Ring the door bell (i.e. set the door bell interrupt)
1521
1522 In response to door bell interrupt, the firmware will perform
1523 the DMA of the command packet (first header to obtain the total
1524 length and then rest of the command).
1525 */
1526
1527 if (card->cmdrsp_buf) {
1528 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1529 /* Write the lower 32bits of the cmdrsp buffer physical
1530 address */
1531 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1532 (u32)cmdrsp_buf_pa)) {
1533 mwifiex_dbg(adapter, ERROR,
1534 "Failed to write download cmd to boot code.\n");
1535 ret = -1;
1536 goto done;
1537 }
1538 /* Write the upper 32bits of the cmdrsp buffer physical
1539 address */
1540 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1541 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1542 mwifiex_dbg(adapter, ERROR,
1543 "Failed to write download cmd to boot code.\n");
1544 ret = -1;
1545 goto done;
1546 }
1547 }
1548
1549 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1550 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1551 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1552 (u32)cmd_buf_pa)) {
1553 mwifiex_dbg(adapter, ERROR,
1554 "Failed to write download cmd to boot code.\n");
1555 ret = -1;
1556 goto done;
1557 }
1558 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1559 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1560 (u32)((u64)cmd_buf_pa >> 32))) {
1561 mwifiex_dbg(adapter, ERROR,
1562 "Failed to write download cmd to boot code.\n");
1563 ret = -1;
1564 goto done;
1565 }
1566
1567 /* Write the command length to reg->cmd_size */
1568 if (mwifiex_write_reg(adapter, reg->cmd_size,
1569 card->cmd_buf->len)) {
1570 mwifiex_dbg(adapter, ERROR,
1571 "Failed to write cmd len to reg->cmd_size\n");
1572 ret = -1;
1573 goto done;
1574 }
1575
1576 /* Ring the door bell */
1577 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1578 CPU_INTR_DOOR_BELL)) {
1579 mwifiex_dbg(adapter, ERROR,
1580 "Failed to assert door-bell intr\n");
1581 ret = -1;
1582 goto done;
1583 }
1584
1585 done:
1586 if (ret)
1587 adapter->cmd_sent = false;
1588
1589 return 0;
1590 }
1591
1592 /*
1593 * This function handles command complete interrupt
1594 */
1595 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1596 {
1597 struct pcie_service_card *card = adapter->card;
1598 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1599 struct sk_buff *skb = card->cmdrsp_buf;
1600 int count = 0;
1601 u16 rx_len;
1602 __le16 pkt_len;
1603
1604 mwifiex_dbg(adapter, CMD,
1605 "info: Rx CMD Response\n");
1606
1607 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1608
1609 /* Unmap the command as a response has been received. */
1610 if (card->cmd_buf) {
1611 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1612 PCI_DMA_TODEVICE);
1613 card->cmd_buf = NULL;
1614 }
1615
1616 pkt_len = *((__le16 *)skb->data);
1617 rx_len = le16_to_cpu(pkt_len);
1618 skb_trim(skb, rx_len);
1619 skb_pull(skb, INTF_HEADER_LEN);
1620
1621 if (!adapter->curr_cmd) {
1622 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1623 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1624 skb->len);
1625 mwifiex_pcie_enable_host_int(adapter);
1626 if (mwifiex_write_reg(adapter,
1627 PCIE_CPU_INT_EVENT,
1628 CPU_INTR_SLEEP_CFM_DONE)) {
1629 mwifiex_dbg(adapter, ERROR,
1630 "Write register failed\n");
1631 return -1;
1632 }
1633 mwifiex_delay_for_sleep_cookie(adapter,
1634 MWIFIEX_MAX_DELAY_COUNT);
1635 while (reg->sleep_cookie && (count++ < 10) &&
1636 mwifiex_pcie_ok_to_access_hw(adapter))
1637 usleep_range(50, 60);
1638 } else {
1639 mwifiex_dbg(adapter, ERROR,
1640 "There is no command but got cmdrsp\n");
1641 }
1642 memcpy(adapter->upld_buf, skb->data,
1643 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1644 skb_push(skb, INTF_HEADER_LEN);
1645 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1646 PCI_DMA_FROMDEVICE))
1647 return -1;
1648 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1649 adapter->curr_cmd->resp_skb = skb;
1650 adapter->cmd_resp_received = true;
1651 /* Take the pointer and set it to CMD node and will
1652 return in the response complete callback */
1653 card->cmdrsp_buf = NULL;
1654
1655 /* Clear the cmd-rsp buffer address in scratch registers. This
1656 will prevent firmware from writing to the same response
1657 buffer again. */
1658 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1659 mwifiex_dbg(adapter, ERROR,
1660 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1661 return -1;
1662 }
1663 /* Write the upper 32bits of the cmdrsp buffer physical
1664 address */
1665 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1666 mwifiex_dbg(adapter, ERROR,
1667 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1668 return -1;
1669 }
1670 }
1671
1672 return 0;
1673 }
1674
1675 /*
1676 * Command Response processing complete handler
1677 */
1678 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1679 struct sk_buff *skb)
1680 {
1681 struct pcie_service_card *card = adapter->card;
1682
1683 if (skb) {
1684 card->cmdrsp_buf = skb;
1685 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1686 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1687 PCI_DMA_FROMDEVICE))
1688 return -1;
1689 }
1690
1691 return 0;
1692 }
1693
1694 /*
1695 * This function handles firmware event ready interrupt
1696 */
1697 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1698 {
1699 struct pcie_service_card *card = adapter->card;
1700 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1701 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1702 u32 wrptr, event;
1703 struct mwifiex_evt_buf_desc *desc;
1704
1705 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1706 mwifiex_pm_wakeup_card(adapter);
1707
1708 if (adapter->event_received) {
1709 mwifiex_dbg(adapter, EVENT,
1710 "info: Event being processed,\t"
1711 "do not process this interrupt just yet\n");
1712 return 0;
1713 }
1714
1715 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1716 mwifiex_dbg(adapter, ERROR,
1717 "info: Invalid read pointer...\n");
1718 return -1;
1719 }
1720
1721 /* Read the event ring write pointer set by firmware */
1722 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1723 mwifiex_dbg(adapter, ERROR,
1724 "EventReady: failed to read reg->evt_wrptr\n");
1725 return -1;
1726 }
1727
1728 mwifiex_dbg(adapter, EVENT,
1729 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1730 card->evtbd_rdptr, wrptr);
1731 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1732 & MWIFIEX_EVTBD_MASK)) ||
1733 ((wrptr & reg->evt_rollover_ind) ==
1734 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1735 struct sk_buff *skb_cmd;
1736 __le16 data_len = 0;
1737 u16 evt_len;
1738
1739 mwifiex_dbg(adapter, INFO,
1740 "info: Read Index: %d\n", rdptr);
1741 skb_cmd = card->evt_buf_list[rdptr];
1742 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1743
1744 /* Take the pointer and set it to event pointer in adapter
1745 and will return back after event handling callback */
1746 card->evt_buf_list[rdptr] = NULL;
1747 desc = card->evtbd_ring[rdptr];
1748 memset(desc, 0, sizeof(*desc));
1749
1750 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1751 adapter->event_cause = event;
1752 /* The first 4bytes will be the event transfer header
1753 len is 2 bytes followed by type which is 2 bytes */
1754 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1755 evt_len = le16_to_cpu(data_len);
1756 skb_trim(skb_cmd, evt_len);
1757 skb_pull(skb_cmd, INTF_HEADER_LEN);
1758 mwifiex_dbg(adapter, EVENT,
1759 "info: Event length: %d\n", evt_len);
1760
1761 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1762 memcpy(adapter->event_body, skb_cmd->data +
1763 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1764 MWIFIEX_EVENT_HEADER_LEN);
1765
1766 adapter->event_received = true;
1767 adapter->event_skb = skb_cmd;
1768
1769 /* Do not update the event read pointer here, wait till the
1770 buffer is released. This is just to make things simpler,
1771 we need to find a better method of managing these buffers.
1772 */
1773 } else {
1774 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1775 CPU_INTR_EVENT_DONE)) {
1776 mwifiex_dbg(adapter, ERROR,
1777 "Write register failed\n");
1778 return -1;
1779 }
1780 }
1781
1782 return 0;
1783 }
1784
1785 /*
1786 * Event processing complete handler
1787 */
1788 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1789 struct sk_buff *skb)
1790 {
1791 struct pcie_service_card *card = adapter->card;
1792 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1793 int ret = 0;
1794 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1795 u32 wrptr;
1796 struct mwifiex_evt_buf_desc *desc;
1797
1798 if (!skb)
1799 return 0;
1800
1801 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1802 mwifiex_dbg(adapter, ERROR,
1803 "event_complete: Invalid rdptr 0x%x\n",
1804 rdptr);
1805 return -EINVAL;
1806 }
1807
1808 /* Read the event ring write pointer set by firmware */
1809 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1810 mwifiex_dbg(adapter, ERROR,
1811 "event_complete: failed to read reg->evt_wrptr\n");
1812 return -1;
1813 }
1814
1815 if (!card->evt_buf_list[rdptr]) {
1816 skb_push(skb, INTF_HEADER_LEN);
1817 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1818 if (mwifiex_map_pci_memory(adapter, skb,
1819 MAX_EVENT_SIZE,
1820 PCI_DMA_FROMDEVICE))
1821 return -1;
1822 card->evt_buf_list[rdptr] = skb;
1823 desc = card->evtbd_ring[rdptr];
1824 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1825 desc->len = (u16)skb->len;
1826 desc->flags = 0;
1827 skb = NULL;
1828 } else {
1829 mwifiex_dbg(adapter, ERROR,
1830 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1831 rdptr, card->evt_buf_list[rdptr], skb);
1832 }
1833
1834 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1835 card->evtbd_rdptr = ((card->evtbd_rdptr &
1836 reg->evt_rollover_ind) ^
1837 reg->evt_rollover_ind);
1838 }
1839
1840 mwifiex_dbg(adapter, EVENT,
1841 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1842 card->evtbd_rdptr, wrptr);
1843
1844 /* Write the event ring read pointer in to reg->evt_rdptr */
1845 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1846 card->evtbd_rdptr)) {
1847 mwifiex_dbg(adapter, ERROR,
1848 "event_complete: failed to read reg->evt_rdptr\n");
1849 return -1;
1850 }
1851
1852 mwifiex_dbg(adapter, EVENT,
1853 "info: Check Events Again\n");
1854 ret = mwifiex_pcie_process_event_ready(adapter);
1855
1856 return ret;
1857 }
1858
1859 /*
1860 * This function downloads the firmware to the card.
1861 *
1862 * Firmware is downloaded to the card in blocks. Every block download
1863 * is tested for CRC errors, and retried a number of times before
1864 * returning failure.
1865 */
1866 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1867 struct mwifiex_fw_image *fw)
1868 {
1869 int ret;
1870 u8 *firmware = fw->fw_buf;
1871 u32 firmware_len = fw->fw_len;
1872 u32 offset = 0;
1873 struct sk_buff *skb;
1874 u32 txlen, tx_blocks = 0, tries, len;
1875 u32 block_retry_cnt = 0;
1876 struct pcie_service_card *card = adapter->card;
1877 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1878
1879 if (!firmware || !firmware_len) {
1880 mwifiex_dbg(adapter, ERROR,
1881 "No firmware image found! Terminating download\n");
1882 return -1;
1883 }
1884
1885 mwifiex_dbg(adapter, INFO,
1886 "info: Downloading FW image (%d bytes)\n",
1887 firmware_len);
1888
1889 if (mwifiex_pcie_disable_host_int(adapter)) {
1890 mwifiex_dbg(adapter, ERROR,
1891 "%s: Disabling interrupts failed.\n", __func__);
1892 return -1;
1893 }
1894
1895 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1896 if (!skb) {
1897 ret = -ENOMEM;
1898 goto done;
1899 }
1900
1901 /* Perform firmware data transfer */
1902 do {
1903 u32 ireg_intr = 0;
1904
1905 /* More data? */
1906 if (offset >= firmware_len)
1907 break;
1908
1909 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1910 ret = mwifiex_read_reg(adapter, reg->cmd_size,
1911 &len);
1912 if (ret) {
1913 mwifiex_dbg(adapter, FATAL,
1914 "Failed reading len from boot code\n");
1915 goto done;
1916 }
1917 if (len)
1918 break;
1919 usleep_range(10, 20);
1920 }
1921
1922 if (!len) {
1923 break;
1924 } else if (len > MWIFIEX_UPLD_SIZE) {
1925 mwifiex_dbg(adapter, ERROR,
1926 "FW download failure @ %d, invalid length %d\n",
1927 offset, len);
1928 ret = -1;
1929 goto done;
1930 }
1931
1932 txlen = len;
1933
1934 if (len & BIT(0)) {
1935 block_retry_cnt++;
1936 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1937 mwifiex_dbg(adapter, ERROR,
1938 "FW download failure @ %d, over max\t"
1939 "retry count\n", offset);
1940 ret = -1;
1941 goto done;
1942 }
1943 mwifiex_dbg(adapter, ERROR,
1944 "FW CRC error indicated by the\t"
1945 "helper: len = 0x%04X, txlen = %d\n",
1946 len, txlen);
1947 len &= ~BIT(0);
1948 /* Setting this to 0 to resend from same offset */
1949 txlen = 0;
1950 } else {
1951 block_retry_cnt = 0;
1952 /* Set blocksize to transfer - checking for
1953 last block */
1954 if (firmware_len - offset < txlen)
1955 txlen = firmware_len - offset;
1956
1957 mwifiex_dbg(adapter, INFO, ".");
1958
1959 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
1960 card->pcie.blksz_fw_dl;
1961
1962 /* Copy payload to buffer */
1963 memmove(skb->data, &firmware[offset], txlen);
1964 }
1965
1966 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1967 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
1968
1969 /* Send the boot command to device */
1970 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
1971 mwifiex_dbg(adapter, ERROR,
1972 "Failed to send firmware download command\n");
1973 ret = -1;
1974 goto done;
1975 }
1976
1977 /* Wait for the command done interrupt */
1978 do {
1979 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1980 &ireg_intr)) {
1981 mwifiex_dbg(adapter, ERROR,
1982 "%s: Failed to read\t"
1983 "interrupt status during fw dnld.\n",
1984 __func__);
1985 mwifiex_unmap_pci_memory(adapter, skb,
1986 PCI_DMA_TODEVICE);
1987 ret = -1;
1988 goto done;
1989 }
1990 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1991 CPU_INTR_DOOR_BELL);
1992
1993 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1994
1995 offset += txlen;
1996 } while (true);
1997
1998 mwifiex_dbg(adapter, MSG,
1999 "info: FW download over, size %d bytes\n", offset);
2000
2001 ret = 0;
2002
2003 done:
2004 dev_kfree_skb_any(skb);
2005 return ret;
2006 }
2007
2008 /*
2009 * This function checks the firmware status in card.
2010 *
2011 * The winner interface is also determined by this function.
2012 */
2013 static int
2014 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2015 {
2016 int ret = 0;
2017 u32 firmware_stat, winner_status;
2018 struct pcie_service_card *card = adapter->card;
2019 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2020 u32 tries;
2021
2022 /* Mask spurios interrupts */
2023 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2024 HOST_INTR_MASK)) {
2025 mwifiex_dbg(adapter, ERROR,
2026 "Write register failed\n");
2027 return -1;
2028 }
2029
2030 mwifiex_dbg(adapter, INFO,
2031 "Setting driver ready signature\n");
2032 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2033 FIRMWARE_READY_PCIE)) {
2034 mwifiex_dbg(adapter, ERROR,
2035 "Failed to write driver ready signature\n");
2036 return -1;
2037 }
2038
2039 /* Wait for firmware initialization event */
2040 for (tries = 0; tries < poll_num; tries++) {
2041 if (mwifiex_read_reg(adapter, reg->fw_status,
2042 &firmware_stat))
2043 ret = -1;
2044 else
2045 ret = 0;
2046 if (ret)
2047 continue;
2048 if (firmware_stat == FIRMWARE_READY_PCIE) {
2049 ret = 0;
2050 break;
2051 } else {
2052 msleep(100);
2053 ret = -1;
2054 }
2055 }
2056
2057 if (ret) {
2058 if (mwifiex_read_reg(adapter, reg->fw_status,
2059 &winner_status))
2060 ret = -1;
2061 else if (!winner_status) {
2062 mwifiex_dbg(adapter, INFO,
2063 "PCI-E is the winner\n");
2064 adapter->winner = 1;
2065 } else {
2066 mwifiex_dbg(adapter, ERROR,
2067 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
2068 ret, adapter->winner);
2069 }
2070 }
2071
2072 return ret;
2073 }
2074
2075 /*
2076 * This function reads the interrupt status from card.
2077 */
2078 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
2079 {
2080 u32 pcie_ireg;
2081 unsigned long flags;
2082
2083 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2084 return;
2085
2086 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
2087 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2088 return;
2089 }
2090
2091 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2092
2093 mwifiex_pcie_disable_host_int(adapter);
2094
2095 /* Clear the pending interrupts */
2096 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2097 ~pcie_ireg)) {
2098 mwifiex_dbg(adapter, ERROR,
2099 "Write register failed\n");
2100 return;
2101 }
2102 spin_lock_irqsave(&adapter->int_lock, flags);
2103 adapter->int_status |= pcie_ireg;
2104 spin_unlock_irqrestore(&adapter->int_lock, flags);
2105
2106 if (!adapter->pps_uapsd_mode &&
2107 adapter->ps_state == PS_STATE_SLEEP &&
2108 mwifiex_pcie_ok_to_access_hw(adapter)) {
2109 /* Potentially for PCIe we could get other
2110 * interrupts like shared. Don't change power
2111 * state until cookie is set */
2112 adapter->ps_state = PS_STATE_AWAKE;
2113 adapter->pm_wakeup_fw_try = false;
2114 del_timer(&adapter->wakeup_timer);
2115 }
2116 }
2117 }
2118
2119 /*
2120 * Interrupt handler for PCIe root port
2121 *
2122 * This function reads the interrupt status from firmware and assigns
2123 * the main process in workqueue which will handle the interrupt.
2124 */
2125 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2126 {
2127 struct pci_dev *pdev = (struct pci_dev *)context;
2128 struct pcie_service_card *card;
2129 struct mwifiex_adapter *adapter;
2130
2131 if (!pdev) {
2132 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
2133 goto exit;
2134 }
2135
2136 card = pci_get_drvdata(pdev);
2137 if (!card || !card->adapter) {
2138 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
2139 card ? card->adapter : NULL);
2140 goto exit;
2141 }
2142 adapter = card->adapter;
2143
2144 if (adapter->surprise_removed)
2145 goto exit;
2146
2147 mwifiex_interrupt_status(adapter);
2148 mwifiex_queue_main_work(adapter);
2149
2150 exit:
2151 return IRQ_HANDLED;
2152 }
2153
2154 /*
2155 * This function checks the current interrupt status.
2156 *
2157 * The following interrupts are checked and handled by this function -
2158 * - Data sent
2159 * - Command sent
2160 * - Command received
2161 * - Packets received
2162 * - Events received
2163 *
2164 * In case of Rx packets received, the packets are uploaded from card to
2165 * host and processed accordingly.
2166 */
2167 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2168 {
2169 int ret;
2170 u32 pcie_ireg;
2171 unsigned long flags;
2172
2173 spin_lock_irqsave(&adapter->int_lock, flags);
2174 /* Clear out unused interrupts */
2175 pcie_ireg = adapter->int_status;
2176 adapter->int_status = 0;
2177 spin_unlock_irqrestore(&adapter->int_lock, flags);
2178
2179 while (pcie_ireg & HOST_INTR_MASK) {
2180 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2181 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
2182 mwifiex_dbg(adapter, INTR,
2183 "info: TX DNLD Done\n");
2184 ret = mwifiex_pcie_send_data_complete(adapter);
2185 if (ret)
2186 return ret;
2187 }
2188 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2189 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
2190 mwifiex_dbg(adapter, INTR,
2191 "info: Rx DATA\n");
2192 ret = mwifiex_pcie_process_recv_data(adapter);
2193 if (ret)
2194 return ret;
2195 }
2196 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2197 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
2198 mwifiex_dbg(adapter, INTR,
2199 "info: Rx EVENT\n");
2200 ret = mwifiex_pcie_process_event_ready(adapter);
2201 if (ret)
2202 return ret;
2203 }
2204
2205 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2206 pcie_ireg &= ~HOST_INTR_CMD_DONE;
2207 if (adapter->cmd_sent) {
2208 mwifiex_dbg(adapter, INTR,
2209 "info: CMD sent Interrupt\n");
2210 adapter->cmd_sent = false;
2211 }
2212 /* Handle command response */
2213 ret = mwifiex_pcie_process_cmd_complete(adapter);
2214 if (ret)
2215 return ret;
2216 }
2217
2218 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2219 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2220 &pcie_ireg)) {
2221 mwifiex_dbg(adapter, ERROR,
2222 "Read register failed\n");
2223 return -1;
2224 }
2225
2226 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2227 if (mwifiex_write_reg(adapter,
2228 PCIE_HOST_INT_STATUS,
2229 ~pcie_ireg)) {
2230 mwifiex_dbg(adapter, ERROR,
2231 "Write register failed\n");
2232 return -1;
2233 }
2234 }
2235
2236 }
2237 }
2238 mwifiex_dbg(adapter, INTR,
2239 "info: cmd_sent=%d data_sent=%d\n",
2240 adapter->cmd_sent, adapter->data_sent);
2241 if (adapter->ps_state != PS_STATE_SLEEP)
2242 mwifiex_pcie_enable_host_int(adapter);
2243
2244 return 0;
2245 }
2246
2247 /*
2248 * This function downloads data from driver to card.
2249 *
2250 * Both commands and data packets are transferred to the card by this
2251 * function.
2252 *
2253 * This function adds the PCIE specific header to the front of the buffer
2254 * before transferring. The header contains the length of the packet and
2255 * the type. The firmware handles the packets based upon this set type.
2256 */
2257 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2258 struct sk_buff *skb,
2259 struct mwifiex_tx_param *tx_param)
2260 {
2261 if (!skb) {
2262 mwifiex_dbg(adapter, ERROR,
2263 "Passed NULL skb to %s\n", __func__);
2264 return -1;
2265 }
2266
2267 if (type == MWIFIEX_TYPE_DATA)
2268 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2269 else if (type == MWIFIEX_TYPE_CMD)
2270 return mwifiex_pcie_send_cmd(adapter, skb);
2271
2272 return 0;
2273 }
2274
2275 /* This function read/write firmware */
2276 static enum rdwr_status
2277 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2278 {
2279 int ret, tries;
2280 u8 ctrl_data;
2281 struct pcie_service_card *card = adapter->card;
2282 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2283
2284 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl, FW_DUMP_HOST_READY);
2285 if (ret) {
2286 mwifiex_dbg(adapter, ERROR,
2287 "PCIE write err\n");
2288 return RDWR_STATUS_FAILURE;
2289 }
2290
2291 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2292 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2293 if (ctrl_data == FW_DUMP_DONE)
2294 return RDWR_STATUS_SUCCESS;
2295 if (doneflag && ctrl_data == doneflag)
2296 return RDWR_STATUS_DONE;
2297 if (ctrl_data != FW_DUMP_HOST_READY) {
2298 mwifiex_dbg(adapter, WARN,
2299 "The ctrl reg was changed, re-try again!\n");
2300 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2301 FW_DUMP_HOST_READY);
2302 if (ret) {
2303 mwifiex_dbg(adapter, ERROR,
2304 "PCIE write err\n");
2305 return RDWR_STATUS_FAILURE;
2306 }
2307 }
2308 usleep_range(100, 200);
2309 }
2310
2311 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2312 return RDWR_STATUS_FAILURE;
2313 }
2314
2315 /* This function dump firmware memory to file */
2316 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2317 {
2318 struct pcie_service_card *card = adapter->card;
2319 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2320 unsigned int reg, reg_start, reg_end;
2321 u8 *dbg_ptr, *end_ptr, dump_num, idx, i, read_reg, doneflag = 0;
2322 enum rdwr_status stat;
2323 u32 memory_size;
2324 int ret;
2325
2326 if (!card->pcie.can_dump_fw)
2327 return;
2328
2329 for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) {
2330 struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
2331
2332 if (entry->mem_ptr) {
2333 vfree(entry->mem_ptr);
2334 entry->mem_ptr = NULL;
2335 }
2336 entry->mem_size = 0;
2337 }
2338
2339 mwifiex_dbg(adapter, DUMP, "== mwifiex firmware dump start ==\n");
2340
2341 /* Read the number of the memories which will dump */
2342 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2343 if (stat == RDWR_STATUS_FAILURE)
2344 return;
2345
2346 reg = creg->fw_dump_start;
2347 mwifiex_read_reg_byte(adapter, reg, &dump_num);
2348
2349 /* Read the length of every memory which will dump */
2350 for (idx = 0; idx < dump_num; idx++) {
2351 struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
2352
2353 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2354 if (stat == RDWR_STATUS_FAILURE)
2355 return;
2356
2357 memory_size = 0;
2358 reg = creg->fw_dump_start;
2359 for (i = 0; i < 4; i++) {
2360 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2361 memory_size |= (read_reg << (i * 8));
2362 reg++;
2363 }
2364
2365 if (memory_size == 0) {
2366 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2367 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2368 FW_DUMP_READ_DONE);
2369 if (ret) {
2370 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2371 return;
2372 }
2373 break;
2374 }
2375
2376 mwifiex_dbg(adapter, DUMP,
2377 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2378 entry->mem_ptr = vmalloc(memory_size + 1);
2379 entry->mem_size = memory_size;
2380 if (!entry->mem_ptr) {
2381 mwifiex_dbg(adapter, ERROR,
2382 "Vmalloc %s failed\n", entry->mem_name);
2383 return;
2384 }
2385 dbg_ptr = entry->mem_ptr;
2386 end_ptr = dbg_ptr + memory_size;
2387
2388 doneflag = entry->done_flag;
2389 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2390 entry->mem_name);
2391
2392 do {
2393 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2394 if (RDWR_STATUS_FAILURE == stat)
2395 return;
2396
2397 reg_start = creg->fw_dump_start;
2398 reg_end = creg->fw_dump_end;
2399 for (reg = reg_start; reg <= reg_end; reg++) {
2400 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2401 if (dbg_ptr < end_ptr) {
2402 dbg_ptr++;
2403 } else {
2404 mwifiex_dbg(adapter, ERROR,
2405 "Allocated buf not enough\n");
2406 return;
2407 }
2408 }
2409
2410 if (stat != RDWR_STATUS_DONE)
2411 continue;
2412
2413 mwifiex_dbg(adapter, DUMP,
2414 "%s done: size=0x%tx\n",
2415 entry->mem_name, dbg_ptr - entry->mem_ptr);
2416 break;
2417 } while (true);
2418 }
2419 mwifiex_dbg(adapter, DUMP, "== mwifiex firmware dump end ==\n");
2420 }
2421
2422 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2423 {
2424 mwifiex_drv_info_dump(adapter);
2425 mwifiex_pcie_fw_dump(adapter);
2426 mwifiex_upload_device_dump(adapter);
2427 }
2428
2429 static unsigned long iface_work_flags;
2430 static struct mwifiex_adapter *save_adapter;
2431 static void mwifiex_pcie_work(struct work_struct *work)
2432 {
2433 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2434 &iface_work_flags))
2435 mwifiex_pcie_device_dump_work(save_adapter);
2436 }
2437
2438 static DECLARE_WORK(pcie_work, mwifiex_pcie_work);
2439 /* This function dumps FW information */
2440 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2441 {
2442 save_adapter = adapter;
2443 if (test_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &iface_work_flags))
2444 return;
2445
2446 set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &iface_work_flags);
2447
2448 schedule_work(&pcie_work);
2449 }
2450
2451 /*
2452 * This function initializes the PCI-E host memory space, WCB rings, etc.
2453 *
2454 * The following initializations steps are followed -
2455 * - Allocate TXBD ring buffers
2456 * - Allocate RXBD ring buffers
2457 * - Allocate event BD ring buffers
2458 * - Allocate command response ring buffer
2459 * - Allocate sleep cookie buffer
2460 */
2461 static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
2462 {
2463 struct pcie_service_card *card = adapter->card;
2464 int ret;
2465 struct pci_dev *pdev = card->dev;
2466 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2467
2468 pci_set_drvdata(pdev, card);
2469
2470 ret = pci_enable_device(pdev);
2471 if (ret)
2472 goto err_enable_dev;
2473
2474 pci_set_master(pdev);
2475
2476 mwifiex_dbg(adapter, INFO,
2477 "try set_consistent_dma_mask(32)\n");
2478 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2479 if (ret) {
2480 mwifiex_dbg(adapter, ERROR,
2481 "set_dma_mask(32) failed\n");
2482 goto err_set_dma_mask;
2483 }
2484
2485 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2486 if (ret) {
2487 mwifiex_dbg(adapter, ERROR,
2488 "set_consistent_dma_mask(64) failed\n");
2489 goto err_set_dma_mask;
2490 }
2491
2492 ret = pci_request_region(pdev, 0, DRV_NAME);
2493 if (ret) {
2494 mwifiex_dbg(adapter, ERROR,
2495 "req_reg(0) error\n");
2496 goto err_req_region0;
2497 }
2498 card->pci_mmap = pci_iomap(pdev, 0, 0);
2499 if (!card->pci_mmap) {
2500 mwifiex_dbg(adapter, ERROR, "iomap(0) error\n");
2501 ret = -EIO;
2502 goto err_iomap0;
2503 }
2504 ret = pci_request_region(pdev, 2, DRV_NAME);
2505 if (ret) {
2506 mwifiex_dbg(adapter, ERROR, "req_reg(2) error\n");
2507 goto err_req_region2;
2508 }
2509 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2510 if (!card->pci_mmap1) {
2511 mwifiex_dbg(adapter, ERROR,
2512 "iomap(2) error\n");
2513 ret = -EIO;
2514 goto err_iomap2;
2515 }
2516
2517 mwifiex_dbg(adapter, INFO,
2518 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2519 card->pci_mmap, card->pci_mmap1);
2520
2521 card->cmdrsp_buf = NULL;
2522 ret = mwifiex_pcie_create_txbd_ring(adapter);
2523 if (ret)
2524 goto err_cre_txbd;
2525 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2526 if (ret)
2527 goto err_cre_rxbd;
2528 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2529 if (ret)
2530 goto err_cre_evtbd;
2531 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2532 if (ret)
2533 goto err_alloc_cmdbuf;
2534 if (reg->sleep_cookie) {
2535 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2536 if (ret)
2537 goto err_alloc_cookie;
2538 } else {
2539 card->sleep_cookie_vbase = NULL;
2540 }
2541 return ret;
2542
2543 err_alloc_cookie:
2544 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2545 err_alloc_cmdbuf:
2546 mwifiex_pcie_delete_evtbd_ring(adapter);
2547 err_cre_evtbd:
2548 mwifiex_pcie_delete_rxbd_ring(adapter);
2549 err_cre_rxbd:
2550 mwifiex_pcie_delete_txbd_ring(adapter);
2551 err_cre_txbd:
2552 pci_iounmap(pdev, card->pci_mmap1);
2553 err_iomap2:
2554 pci_release_region(pdev, 2);
2555 err_req_region2:
2556 pci_iounmap(pdev, card->pci_mmap);
2557 err_iomap0:
2558 pci_release_region(pdev, 0);
2559 err_req_region0:
2560 err_set_dma_mask:
2561 pci_disable_device(pdev);
2562 err_enable_dev:
2563 pci_set_drvdata(pdev, NULL);
2564 return ret;
2565 }
2566
2567 /*
2568 * This function cleans up the allocated card buffers.
2569 *
2570 * The following are freed by this function -
2571 * - TXBD ring buffers
2572 * - RXBD ring buffers
2573 * - Event BD ring buffers
2574 * - Command response ring buffer
2575 * - Sleep cookie buffer
2576 */
2577 static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
2578 {
2579 struct pcie_service_card *card = adapter->card;
2580 struct pci_dev *pdev = card->dev;
2581 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2582
2583 if (user_rmmod) {
2584 mwifiex_dbg(adapter, INFO,
2585 "Clearing driver ready signature\n");
2586 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
2587 mwifiex_dbg(adapter, ERROR,
2588 "Failed to write driver not-ready signature\n");
2589 }
2590
2591 if (pdev) {
2592 pci_iounmap(pdev, card->pci_mmap);
2593 pci_iounmap(pdev, card->pci_mmap1);
2594 pci_disable_device(pdev);
2595 pci_release_region(pdev, 2);
2596 pci_release_region(pdev, 0);
2597 pci_set_drvdata(pdev, NULL);
2598 }
2599 kfree(card);
2600 }
2601
2602 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
2603 {
2604 int ret;
2605 struct pcie_service_card *card = adapter->card;
2606 struct pci_dev *pdev = card->dev;
2607
2608 if (pci_enable_msi(pdev) != 0)
2609 pci_disable_msi(pdev);
2610 else
2611 card->msi_enable = 1;
2612
2613 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
2614
2615 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
2616 "MRVL_PCIE", pdev);
2617 if (ret) {
2618 pr_err("request_irq failed: ret=%d\n", ret);
2619 adapter->card = NULL;
2620 return -1;
2621 }
2622
2623 return 0;
2624 }
2625
2626 /*
2627 * This function registers the PCIE device.
2628 *
2629 * PCIE IRQ is claimed, block size is set and driver data is initialized.
2630 */
2631 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
2632 {
2633 struct pcie_service_card *card = adapter->card;
2634 struct pci_dev *pdev = card->dev;
2635
2636 /* save adapter pointer in card */
2637 card->adapter = adapter;
2638
2639 if (mwifiex_pcie_request_irq(adapter))
2640 return -1;
2641
2642 adapter->dev = &pdev->dev;
2643 adapter->tx_buf_size = card->pcie.tx_buf_size;
2644 adapter->mem_type_mapping_tbl = mem_type_mapping_tbl;
2645 adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl);
2646 strcpy(adapter->fw_name, card->pcie.firmware);
2647 adapter->ext_scan = card->pcie.can_ext_scan;
2648
2649 return 0;
2650 }
2651
2652 /*
2653 * This function unregisters the PCIE device.
2654 *
2655 * The PCIE IRQ is released, the function is disabled and driver
2656 * data is set to null.
2657 */
2658 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
2659 {
2660 struct pcie_service_card *card = adapter->card;
2661 const struct mwifiex_pcie_card_reg *reg;
2662
2663 if (card) {
2664 mwifiex_dbg(adapter, INFO,
2665 "%s(): calling free_irq()\n", __func__);
2666 free_irq(card->dev->irq, card->dev);
2667
2668 reg = card->pcie.reg;
2669 if (reg->sleep_cookie)
2670 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2671
2672 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2673 mwifiex_pcie_delete_evtbd_ring(adapter);
2674 mwifiex_pcie_delete_rxbd_ring(adapter);
2675 mwifiex_pcie_delete_txbd_ring(adapter);
2676 card->cmdrsp_buf = NULL;
2677 }
2678 }
2679
2680 static struct mwifiex_if_ops pcie_ops = {
2681 .init_if = mwifiex_pcie_init,
2682 .cleanup_if = mwifiex_pcie_cleanup,
2683 .check_fw_status = mwifiex_check_fw_status,
2684 .prog_fw = mwifiex_prog_fw_w_helper,
2685 .register_dev = mwifiex_register_dev,
2686 .unregister_dev = mwifiex_unregister_dev,
2687 .enable_int = mwifiex_pcie_enable_host_int,
2688 .process_int_status = mwifiex_process_int_status,
2689 .host_to_card = mwifiex_pcie_host_to_card,
2690 .wakeup = mwifiex_pm_wakeup_card,
2691 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
2692
2693 /* PCIE specific */
2694 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
2695 .event_complete = mwifiex_pcie_event_complete,
2696 .update_mp_end_port = NULL,
2697 .cleanup_mpa_buf = NULL,
2698 .init_fw_port = mwifiex_pcie_init_fw_port,
2699 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
2700 .device_dump = mwifiex_pcie_device_dump,
2701 };
2702
2703 /*
2704 * This function initializes the PCIE driver module.
2705 *
2706 * This initiates the semaphore and registers the device with
2707 * PCIE bus.
2708 */
2709 static int mwifiex_pcie_init_module(void)
2710 {
2711 int ret;
2712
2713 pr_debug("Marvell PCIe Driver\n");
2714
2715 sema_init(&add_remove_card_sem, 1);
2716
2717 /* Clear the flag in case user removes the card. */
2718 user_rmmod = 0;
2719
2720 ret = pci_register_driver(&mwifiex_pcie);
2721 if (ret)
2722 pr_err("Driver register failed!\n");
2723 else
2724 pr_debug("info: Driver registered successfully!\n");
2725
2726 return ret;
2727 }
2728
2729 /*
2730 * This function cleans up the PCIE driver.
2731 *
2732 * The following major steps are followed for cleanup -
2733 * - Resume the device if its suspended
2734 * - Disconnect the device if connected
2735 * - Shutdown the firmware
2736 * - Unregister the device from PCIE bus.
2737 */
2738 static void mwifiex_pcie_cleanup_module(void)
2739 {
2740 if (!down_interruptible(&add_remove_card_sem))
2741 up(&add_remove_card_sem);
2742
2743 /* Set the flag as user is removing this module. */
2744 user_rmmod = 1;
2745
2746 cancel_work_sync(&pcie_work);
2747 pci_unregister_driver(&mwifiex_pcie);
2748 }
2749
2750 module_init(mwifiex_pcie_init_module);
2751 module_exit(mwifiex_pcie_cleanup_module);
2752
2753 MODULE_AUTHOR("Marvell International Ltd.");
2754 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
2755 MODULE_VERSION(PCIE_VERSION);
2756 MODULE_LICENSE("GPL v2");
2757 MODULE_FIRMWARE(PCIE8766_DEFAULT_FW_NAME);
2758 MODULE_FIRMWARE(PCIE8897_DEFAULT_FW_NAME);
2759 MODULE_FIRMWARE(PCIE8997_DEFAULT_FW_NAME);
This page took 0.09428 seconds and 5 git commands to generate.