blob: f4fbad95d3e392fa7ce324566ed9d3634a075071 [file] [log] [blame]
Amitkumar Karward930fae2011-10-11 17:41:21 -07001/*
2 * Marvell Wireless LAN device driver: PCIE specific handling
3 *
4 * Copyright (C) 2011, 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
34static u8 user_rmmod;
35
36static struct mwifiex_if_ops pcie_ops;
37
38static struct semaphore add_remove_card_sem;
39static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter);
40static int mwifiex_pcie_resume(struct pci_dev *pdev);
41
42/*
43 * This function is called after skb allocation to update
44 * "skb->cb" with physical address of data pointer.
45 */
46static phys_addr_t *mwifiex_update_sk_buff_pa(struct sk_buff *skb)
47{
48 phys_addr_t *buf_pa = MWIFIEX_SKB_PACB(skb);
49
50 *buf_pa = (phys_addr_t)virt_to_phys(skb->data);
51
52 return buf_pa;
53}
54
55/*
56 * This function reads sleep cookie and checks if FW is ready
57 */
58static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
59{
60 u32 *cookie_addr;
61 struct pcie_service_card *card = adapter->card;
62
63 if (card->sleep_cookie) {
64 cookie_addr = (u32 *)card->sleep_cookie->data;
65 dev_dbg(adapter->dev, "info: ACCESS_HW: sleep cookie=0x%x\n",
66 *cookie_addr);
67 if (*cookie_addr == FW_AWAKE_COOKIE)
68 return true;
69 }
70
71 return false;
72}
73
74/*
75 * This function probes an mwifiex device and registers it. It allocates
76 * the card structure, enables PCIE function number and initiates the
77 * device registration and initialization procedure by adding a logical
78 * interface.
79 */
80static int mwifiex_pcie_probe(struct pci_dev *pdev,
81 const struct pci_device_id *ent)
82{
83 struct pcie_service_card *card;
84
85 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
86 pdev->vendor, pdev->device, pdev->revision);
87
88 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
Joe Perchese404dec2012-01-29 12:56:23 +000089 if (!card)
Amitkumar Karward930fae2011-10-11 17:41:21 -070090 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -070091
92 card->dev = pdev;
93
94 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
95 MWIFIEX_PCIE)) {
96 pr_err("%s failed\n", __func__);
97 kfree(card);
98 return -1;
99 }
100
101 return 0;
102}
103
104/*
105 * This function removes the interface and frees up the card structure.
106 */
107static void mwifiex_pcie_remove(struct pci_dev *pdev)
108{
109 struct pcie_service_card *card;
110 struct mwifiex_adapter *adapter;
111 int i;
112
113 card = pci_get_drvdata(pdev);
114 if (!card)
115 return;
116
117 adapter = card->adapter;
118 if (!adapter || !adapter->priv_num)
119 return;
120
121 if (user_rmmod) {
122#ifdef CONFIG_PM
123 if (adapter->is_suspended)
124 mwifiex_pcie_resume(pdev);
125#endif
126
127 for (i = 0; i < adapter->priv_num; i++)
128 if ((GET_BSS_ROLE(adapter->priv[i]) ==
129 MWIFIEX_BSS_ROLE_STA) &&
130 adapter->priv[i]->media_connected)
131 mwifiex_deauthenticate(adapter->priv[i], NULL);
132
133 mwifiex_disable_auto_ds(mwifiex_get_priv(adapter,
134 MWIFIEX_BSS_ROLE_ANY));
135
136 mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter,
137 MWIFIEX_BSS_ROLE_ANY),
138 MWIFIEX_FUNC_SHUTDOWN);
139 }
140
141 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
142 kfree(card);
143}
144
145/*
146 * Kernel needs to suspend all functions separately. Therefore all
147 * registered functions must have drivers with suspend and resume
148 * methods. Failing that the kernel simply removes the whole card.
149 *
150 * If already not suspended, this function allocates and sends a host
151 * sleep activate request to the firmware and turns off the traffic.
152 */
153static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
154{
155 struct mwifiex_adapter *adapter;
156 struct pcie_service_card *card;
157 int hs_actived, i;
158
159 if (pdev) {
160 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
161 if (!card || card->adapter) {
162 pr_err("Card or adapter structure is not valid\n");
163 return 0;
164 }
165 } else {
166 pr_err("PCIE device is not specified\n");
167 return 0;
168 }
169
170 adapter = card->adapter;
171
172 hs_actived = mwifiex_enable_hs(adapter);
173
174 /* Indicate device suspended */
175 adapter->is_suspended = true;
176
177 for (i = 0; i < adapter->priv_num; i++)
178 netif_carrier_off(adapter->priv[i]->netdev);
179
180 return 0;
181}
182
183/*
184 * Kernel needs to suspend all functions separately. Therefore all
185 * registered functions must have drivers with suspend and resume
186 * methods. Failing that the kernel simply removes the whole card.
187 *
188 * If already not resumed, this function turns on the traffic and
189 * sends a host sleep cancel request to the firmware.
190 */
191static int mwifiex_pcie_resume(struct pci_dev *pdev)
192{
193 struct mwifiex_adapter *adapter;
194 struct pcie_service_card *card;
195 int i;
196
197 if (pdev) {
198 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
199 if (!card || !card->adapter) {
200 pr_err("Card or adapter structure is not valid\n");
201 return 0;
202 }
203 } else {
204 pr_err("PCIE device is not specified\n");
205 return 0;
206 }
207
208 adapter = card->adapter;
209
210 if (!adapter->is_suspended) {
211 dev_warn(adapter->dev, "Device already resumed\n");
212 return 0;
213 }
214
215 adapter->is_suspended = false;
216
217 for (i = 0; i < adapter->priv_num; i++)
218 if (adapter->priv[i]->media_connected)
219 netif_carrier_on(adapter->priv[i]->netdev);
220
221 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
222 MWIFIEX_ASYNC_CMD);
223
224 return 0;
225}
226
227#define PCIE_VENDOR_ID_MARVELL (0x11ab)
228#define PCIE_DEVICE_ID_MARVELL_88W8766P (0x2b30)
229
230static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
231 {
232 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
233 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
234 },
235 {},
236};
237
238MODULE_DEVICE_TABLE(pci, mwifiex_ids);
239
240/* PCI Device Driver */
241static struct pci_driver __refdata mwifiex_pcie = {
242 .name = "mwifiex_pcie",
243 .id_table = mwifiex_ids,
244 .probe = mwifiex_pcie_probe,
245 .remove = mwifiex_pcie_remove,
246#ifdef CONFIG_PM
247 /* Power Management Hooks */
248 .suspend = mwifiex_pcie_suspend,
249 .resume = mwifiex_pcie_resume,
250#endif
251};
252
253/*
254 * This function writes data into PCIE card register.
255 */
256static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
257{
258 struct pcie_service_card *card = adapter->card;
259
260 iowrite32(data, card->pci_mmap1 + reg);
261
262 return 0;
263}
264
265/*
266 * This function reads data from PCIE card register.
267 */
268static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
269{
270 struct pcie_service_card *card = adapter->card;
271
272 *data = ioread32(card->pci_mmap1 + reg);
273
274 return 0;
275}
276
277/*
278 * This function wakes up the card.
279 *
280 * A host power up command is written to the card configuration
281 * register to wake up the card.
282 */
283static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
284{
285 int i = 0;
286
287 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
288 i++;
289 udelay(10);
290 /* 50ms max wait */
291 if (i == 50000)
292 break;
293 }
294
295 dev_dbg(adapter->dev, "event: Wakeup device...\n");
296
297 /* Enable interrupts or any chip access will wakeup device */
298 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK, HOST_INTR_MASK)) {
299 dev_warn(adapter->dev, "Enable host interrupt failed\n");
300 return -1;
301 }
302
303 dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
304 adapter->ps_state = PS_STATE_AWAKE;
305
306 return 0;
307}
308
309/*
310 * This function is called after the card has woken up.
311 *
312 * The card configuration register is reset.
313 */
314static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
315{
316 dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
317
318 return 0;
319}
320
321/*
322 * This function disables the host interrupt.
323 *
324 * The host interrupt mask is read, the disable bit is reset and
325 * written back to the card host interrupt mask register.
326 */
327static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
328{
329 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
330 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
331 0x00000000)) {
332 dev_warn(adapter->dev, "Disable host interrupt failed\n");
333 return -1;
334 }
335 }
336
337 return 0;
338}
339
340/*
341 * This function enables the host interrupt.
342 *
343 * The host interrupt enable mask is written to the card
344 * host interrupt mask register.
345 */
346static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
347{
348 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
349 /* Simply write the mask to the register */
350 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
351 HOST_INTR_MASK)) {
352 dev_warn(adapter->dev, "Enable host interrupt failed\n");
353 return -1;
354 }
355 }
356
357 return 0;
358}
359
360/*
361 * This function creates buffer descriptor ring for TX
362 */
363static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
364{
365 struct pcie_service_card *card = adapter->card;
366 struct sk_buff *skb;
367 int i;
368 phys_addr_t *buf_pa;
369
370 /*
371 * driver maintaines the write pointer and firmware maintaines the read
372 * pointer. The write pointer starts at 0 (zero) while the read pointer
373 * starts at zero with rollover bit set
374 */
375 card->txbd_wrptr = 0;
376 card->txbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
377
378 /* allocate shared memory for the BD ring and divide the same in to
379 several descriptors */
380 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
381 MWIFIEX_MAX_TXRX_BD;
382 dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
383 card->txbd_ring_size);
384 card->txbd_ring_vbase = kzalloc(card->txbd_ring_size, GFP_KERNEL);
385 if (!card->txbd_ring_vbase) {
386 dev_err(adapter->dev, "Unable to allocate buffer for txbd ring.\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800387 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700388 }
389 card->txbd_ring_pbase = virt_to_phys(card->txbd_ring_vbase);
390
391 dev_dbg(adapter->dev, "info: txbd_ring - base: %p, pbase: %#x:%x,"
392 "len: %x\n", card->txbd_ring_vbase,
393 (u32)card->txbd_ring_pbase,
394 (u32)((u64)card->txbd_ring_pbase >> 32),
395 card->txbd_ring_size);
396
397 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
398 card->txbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
399 (card->txbd_ring_vbase +
400 (sizeof(struct mwifiex_pcie_buf_desc) * i));
401
402 /* Allocate buffer here so that firmware can DMA data from it */
403 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
404 if (!skb) {
405 dev_err(adapter->dev, "Unable to allocate skb for TX ring.\n");
406 kfree(card->txbd_ring_vbase);
407 return -ENOMEM;
408 }
409 buf_pa = mwifiex_update_sk_buff_pa(skb);
410
411 skb_put(skb, MWIFIEX_RX_DATA_BUF_SIZE);
412 dev_dbg(adapter->dev, "info: TX ring: add new skb base: %p, "
413 "buf_base: %p, buf_pbase: %#x:%x, "
414 "buf_len: %#x\n", skb, skb->data,
415 (u32)*buf_pa, (u32)(((u64)*buf_pa >> 32)),
416 skb->len);
417
418 card->tx_buf_list[i] = skb;
419 card->txbd_ring[i]->paddr = *buf_pa;
420 card->txbd_ring[i]->len = (u16)skb->len;
421 card->txbd_ring[i]->flags = 0;
422 }
423
424 return 0;
425}
426
427static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
428{
429 struct pcie_service_card *card = adapter->card;
430 int i;
431
432 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
433 if (card->tx_buf_list[i])
434 dev_kfree_skb_any(card->tx_buf_list[i]);
435 card->tx_buf_list[i] = NULL;
436 card->txbd_ring[i]->paddr = 0;
437 card->txbd_ring[i]->len = 0;
438 card->txbd_ring[i]->flags = 0;
439 card->txbd_ring[i] = NULL;
440 }
441
442 kfree(card->txbd_ring_vbase);
443 card->txbd_ring_size = 0;
444 card->txbd_wrptr = 0;
445 card->txbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
446 card->txbd_ring_vbase = NULL;
447
448 return 0;
449}
450
451/*
452 * This function creates buffer descriptor ring for RX
453 */
454static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
455{
456 struct pcie_service_card *card = adapter->card;
457 struct sk_buff *skb;
458 int i;
459 phys_addr_t *buf_pa;
460
461 /*
462 * driver maintaines the read pointer and firmware maintaines the write
463 * pointer. The write pointer starts at 0 (zero) while the read pointer
464 * starts at zero with rollover bit set
465 */
466 card->rxbd_wrptr = 0;
467 card->rxbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
468
469 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
470 MWIFIEX_MAX_TXRX_BD;
471 dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
472 card->rxbd_ring_size);
473 card->rxbd_ring_vbase = kzalloc(card->rxbd_ring_size, GFP_KERNEL);
474 if (!card->rxbd_ring_vbase) {
475 dev_err(adapter->dev, "Unable to allocate buffer for "
476 "rxbd_ring.\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800477 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700478 }
479 card->rxbd_ring_pbase = virt_to_phys(card->rxbd_ring_vbase);
480
481 dev_dbg(adapter->dev, "info: rxbd_ring - base: %p, pbase: %#x:%x,"
482 "len: %#x\n", card->rxbd_ring_vbase,
483 (u32)card->rxbd_ring_pbase,
484 (u32)((u64)card->rxbd_ring_pbase >> 32),
485 card->rxbd_ring_size);
486
487 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
488 card->rxbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
489 (card->rxbd_ring_vbase +
490 (sizeof(struct mwifiex_pcie_buf_desc) * i));
491
492 /* Allocate skb here so that firmware can DMA data from it */
493 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
494 if (!skb) {
495 dev_err(adapter->dev, "Unable to allocate skb for RX ring.\n");
496 kfree(card->rxbd_ring_vbase);
497 return -ENOMEM;
498 }
499 buf_pa = mwifiex_update_sk_buff_pa(skb);
500 skb_put(skb, MWIFIEX_RX_DATA_BUF_SIZE);
501
502 dev_dbg(adapter->dev, "info: RX ring: add new skb base: %p, "
503 "buf_base: %p, buf_pbase: %#x:%x, "
504 "buf_len: %#x\n", skb, skb->data,
505 (u32)*buf_pa, (u32)((u64)*buf_pa >> 32),
506 skb->len);
507
508 card->rx_buf_list[i] = skb;
509 card->rxbd_ring[i]->paddr = *buf_pa;
510 card->rxbd_ring[i]->len = (u16)skb->len;
511 card->rxbd_ring[i]->flags = 0;
512 }
513
514 return 0;
515}
516
517/*
518 * This function deletes Buffer descriptor ring for RX
519 */
520static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
521{
522 struct pcie_service_card *card = adapter->card;
523 int i;
524
525 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
526 if (card->rx_buf_list[i])
527 dev_kfree_skb_any(card->rx_buf_list[i]);
528 card->rx_buf_list[i] = NULL;
529 card->rxbd_ring[i]->paddr = 0;
530 card->rxbd_ring[i]->len = 0;
531 card->rxbd_ring[i]->flags = 0;
532 card->rxbd_ring[i] = NULL;
533 }
534
535 kfree(card->rxbd_ring_vbase);
536 card->rxbd_ring_size = 0;
537 card->rxbd_wrptr = 0;
538 card->rxbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
539 card->rxbd_ring_vbase = NULL;
540
541 return 0;
542}
543
544/*
545 * This function creates buffer descriptor ring for Events
546 */
547static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
548{
549 struct pcie_service_card *card = adapter->card;
550 struct sk_buff *skb;
551 int i;
552 phys_addr_t *buf_pa;
553
554 /*
555 * driver maintaines the read pointer and firmware maintaines the write
556 * pointer. The write pointer starts at 0 (zero) while the read pointer
557 * starts at zero with rollover bit set
558 */
559 card->evtbd_wrptr = 0;
560 card->evtbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
561
562 card->evtbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
563 MWIFIEX_MAX_EVT_BD;
564 dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
565 card->evtbd_ring_size);
566 card->evtbd_ring_vbase = kzalloc(card->evtbd_ring_size, GFP_KERNEL);
567 if (!card->evtbd_ring_vbase) {
568 dev_err(adapter->dev, "Unable to allocate buffer. "
569 "Terminating download\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800570 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700571 }
572 card->evtbd_ring_pbase = virt_to_phys(card->evtbd_ring_vbase);
573
574 dev_dbg(adapter->dev, "info: CMDRSP/EVT bd_ring - base: %p, "
575 "pbase: %#x:%x, len: %#x\n", card->evtbd_ring_vbase,
576 (u32)card->evtbd_ring_pbase,
577 (u32)((u64)card->evtbd_ring_pbase >> 32),
578 card->evtbd_ring_size);
579
580 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
581 card->evtbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
582 (card->evtbd_ring_vbase +
583 (sizeof(struct mwifiex_pcie_buf_desc) * i));
584
585 /* Allocate skb here so that firmware can DMA data from it */
586 skb = dev_alloc_skb(MAX_EVENT_SIZE);
587 if (!skb) {
588 dev_err(adapter->dev, "Unable to allocate skb for EVENT buf.\n");
589 kfree(card->evtbd_ring_vbase);
590 return -ENOMEM;
591 }
592 buf_pa = mwifiex_update_sk_buff_pa(skb);
593 skb_put(skb, MAX_EVENT_SIZE);
594
595 dev_dbg(adapter->dev, "info: Evt ring: add new skb. base: %p, "
596 "buf_base: %p, buf_pbase: %#x:%x, "
597 "buf_len: %#x\n", skb, skb->data,
598 (u32)*buf_pa, (u32)((u64)*buf_pa >> 32),
599 skb->len);
600
601 card->evt_buf_list[i] = skb;
602 card->evtbd_ring[i]->paddr = *buf_pa;
603 card->evtbd_ring[i]->len = (u16)skb->len;
604 card->evtbd_ring[i]->flags = 0;
605 }
606
607 return 0;
608}
609
610/*
611 * This function deletes Buffer descriptor ring for Events
612 */
613static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
614{
615 struct pcie_service_card *card = adapter->card;
616 int i;
617
618 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
619 if (card->evt_buf_list[i])
620 dev_kfree_skb_any(card->evt_buf_list[i]);
621 card->evt_buf_list[i] = NULL;
622 card->evtbd_ring[i]->paddr = 0;
623 card->evtbd_ring[i]->len = 0;
624 card->evtbd_ring[i]->flags = 0;
625 card->evtbd_ring[i] = NULL;
626 }
627
628 kfree(card->evtbd_ring_vbase);
629 card->evtbd_wrptr = 0;
630 card->evtbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
631 card->evtbd_ring_size = 0;
632 card->evtbd_ring_vbase = NULL;
633
634 return 0;
635}
636
637/*
638 * This function allocates a buffer for CMDRSP
639 */
640static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
641{
642 struct pcie_service_card *card = adapter->card;
643 struct sk_buff *skb;
644
645 /* Allocate memory for receiving command response data */
646 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
647 if (!skb) {
648 dev_err(adapter->dev, "Unable to allocate skb for command "
649 "response data.\n");
650 return -ENOMEM;
651 }
652 mwifiex_update_sk_buff_pa(skb);
653 skb_put(skb, MWIFIEX_UPLD_SIZE);
654 card->cmdrsp_buf = skb;
655
656 skb = NULL;
657 /* Allocate memory for sending command to firmware */
658 skb = dev_alloc_skb(MWIFIEX_SIZE_OF_CMD_BUFFER);
659 if (!skb) {
660 dev_err(adapter->dev, "Unable to allocate skb for command "
661 "data.\n");
662 return -ENOMEM;
663 }
664 mwifiex_update_sk_buff_pa(skb);
665 skb_put(skb, MWIFIEX_SIZE_OF_CMD_BUFFER);
666 card->cmd_buf = skb;
667
668 return 0;
669}
670
671/*
672 * This function deletes a buffer for CMDRSP
673 */
674static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
675{
676 struct pcie_service_card *card;
677
678 if (!adapter)
679 return 0;
680
681 card = adapter->card;
682
683 if (card && card->cmdrsp_buf)
684 dev_kfree_skb_any(card->cmdrsp_buf);
685
686 if (card && card->cmd_buf)
687 dev_kfree_skb_any(card->cmd_buf);
688
689 return 0;
690}
691
692/*
693 * This function allocates a buffer for sleep cookie
694 */
695static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
696{
697 struct sk_buff *skb;
698 struct pcie_service_card *card = adapter->card;
699
700 /* Allocate memory for sleep cookie */
701 skb = dev_alloc_skb(sizeof(u32));
702 if (!skb) {
703 dev_err(adapter->dev, "Unable to allocate skb for sleep "
704 "cookie!\n");
705 return -ENOMEM;
706 }
707 mwifiex_update_sk_buff_pa(skb);
708 skb_put(skb, sizeof(u32));
709
710 /* Init val of Sleep Cookie */
711 *(u32 *)skb->data = FW_AWAKE_COOKIE;
712
713 dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
714 *((u32 *)skb->data));
715
716 /* Save the sleep cookie */
717 card->sleep_cookie = skb;
718
719 return 0;
720}
721
722/*
723 * This function deletes buffer for sleep cookie
724 */
725static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
726{
727 struct pcie_service_card *card;
728
729 if (!adapter)
730 return 0;
731
732 card = adapter->card;
733
734 if (card && card->sleep_cookie) {
735 dev_kfree_skb_any(card->sleep_cookie);
736 card->sleep_cookie = NULL;
737 }
738
739 return 0;
740}
741
742/*
743 * This function sends data buffer to device
744 */
745static int
746mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb)
747{
748 struct pcie_service_card *card = adapter->card;
749 u32 wrindx, rdptr;
750 phys_addr_t *buf_pa;
751 __le16 *tmp;
752
753 if (!mwifiex_pcie_ok_to_access_hw(adapter))
754 mwifiex_pm_wakeup_card(adapter);
755
756 /* Read the TX ring read pointer set by firmware */
757 if (mwifiex_read_reg(adapter, REG_TXBD_RDPTR, &rdptr)) {
758 dev_err(adapter->dev, "SEND DATA: failed to read "
759 "REG_TXBD_RDPTR\n");
760 return -1;
761 }
762
763 wrindx = card->txbd_wrptr & MWIFIEX_TXBD_MASK;
764
765 dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n", rdptr,
766 card->txbd_wrptr);
767 if (((card->txbd_wrptr & MWIFIEX_TXBD_MASK) !=
768 (rdptr & MWIFIEX_TXBD_MASK)) ||
769 ((card->txbd_wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) !=
770 (rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
771 struct sk_buff *skb_data;
772 u8 *payload;
773
774 adapter->data_sent = true;
775 skb_data = card->tx_buf_list[wrindx];
776 memcpy(skb_data->data, skb->data, skb->len);
777 payload = skb_data->data;
778 tmp = (__le16 *)&payload[0];
779 *tmp = cpu_to_le16((u16)skb->len);
780 tmp = (__le16 *)&payload[2];
781 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
782 skb_put(skb_data, MWIFIEX_RX_DATA_BUF_SIZE - skb_data->len);
783 skb_trim(skb_data, skb->len);
784 buf_pa = MWIFIEX_SKB_PACB(skb_data);
785 card->txbd_ring[wrindx]->paddr = *buf_pa;
786 card->txbd_ring[wrindx]->len = (u16)skb_data->len;
787 card->txbd_ring[wrindx]->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
788 MWIFIEX_BD_FLAG_LAST_DESC;
789
790 if ((++card->txbd_wrptr & MWIFIEX_TXBD_MASK) ==
791 MWIFIEX_MAX_TXRX_BD)
792 card->txbd_wrptr = ((card->txbd_wrptr &
793 MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
794 MWIFIEX_BD_FLAG_ROLLOVER_IND);
795
796 /* Write the TX ring write pointer in to REG_TXBD_WRPTR */
797 if (mwifiex_write_reg(adapter, REG_TXBD_WRPTR,
798 card->txbd_wrptr)) {
799 dev_err(adapter->dev, "SEND DATA: failed to write "
800 "REG_TXBD_WRPTR\n");
801 return 0;
802 }
803
804 /* Send the TX ready interrupt */
805 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
806 CPU_INTR_DNLD_RDY)) {
807 dev_err(adapter->dev, "SEND DATA: failed to assert "
808 "door-bell interrupt.\n");
809 return -1;
810 }
811 dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
812 "%#x> and sent packet to firmware "
813 "successfully\n", rdptr,
814 card->txbd_wrptr);
815 } else {
816 dev_dbg(adapter->dev, "info: TX Ring full, can't send anymore "
817 "packets to firmware\n");
818 adapter->data_sent = true;
819 /* Send the TX ready interrupt */
820 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
821 CPU_INTR_DNLD_RDY))
822 dev_err(adapter->dev, "SEND DATA: failed to assert "
823 "door-bell interrupt\n");
824 return -EBUSY;
825 }
826
827 return 0;
828}
829
830/*
831 * This function handles received buffer ring and
832 * dispatches packets to upper
833 */
834static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
835{
836 struct pcie_service_card *card = adapter->card;
837 u32 wrptr, rd_index;
838 int ret = 0;
839 struct sk_buff *skb_tmp = NULL;
840
841 /* Read the RX ring Write pointer set by firmware */
842 if (mwifiex_read_reg(adapter, REG_RXBD_WRPTR, &wrptr)) {
843 dev_err(adapter->dev, "RECV DATA: failed to read "
844 "REG_TXBD_RDPTR\n");
845 ret = -1;
846 goto done;
847 }
848
849 while (((wrptr & MWIFIEX_RXBD_MASK) !=
850 (card->rxbd_rdptr & MWIFIEX_RXBD_MASK)) ||
851 ((wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) ==
852 (card->rxbd_rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
853 struct sk_buff *skb_data;
854 u16 rx_len;
855
856 rd_index = card->rxbd_rdptr & MWIFIEX_RXBD_MASK;
857 skb_data = card->rx_buf_list[rd_index];
858
859 /* Get data length from interface header -
860 first byte is len, second byte is type */
861 rx_len = *((u16 *)skb_data->data);
862 dev_dbg(adapter->dev, "info: RECV DATA: Rd=%#x, Wr=%#x, "
863 "Len=%d\n", card->rxbd_rdptr, wrptr, rx_len);
864 skb_tmp = dev_alloc_skb(rx_len);
865 if (!skb_tmp) {
866 dev_dbg(adapter->dev, "info: Failed to alloc skb "
867 "for RX\n");
868 ret = -EBUSY;
869 goto done;
870 }
871
872 skb_put(skb_tmp, rx_len);
873
874 memcpy(skb_tmp->data, skb_data->data + INTF_HEADER_LEN, rx_len);
875 if ((++card->rxbd_rdptr & MWIFIEX_RXBD_MASK) ==
876 MWIFIEX_MAX_TXRX_BD) {
877 card->rxbd_rdptr = ((card->rxbd_rdptr &
878 MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
879 MWIFIEX_BD_FLAG_ROLLOVER_IND);
880 }
881 dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
882 card->rxbd_rdptr, wrptr);
883
884 /* Write the RX ring read pointer in to REG_RXBD_RDPTR */
885 if (mwifiex_write_reg(adapter, REG_RXBD_RDPTR,
886 card->rxbd_rdptr)) {
887 dev_err(adapter->dev, "RECV DATA: failed to "
888 "write REG_RXBD_RDPTR\n");
889 ret = -1;
890 goto done;
891 }
892
893 /* Read the RX ring Write pointer set by firmware */
894 if (mwifiex_read_reg(adapter, REG_RXBD_WRPTR, &wrptr)) {
895 dev_err(adapter->dev, "RECV DATA: failed to read "
896 "REG_TXBD_RDPTR\n");
897 ret = -1;
898 goto done;
899 }
900 dev_dbg(adapter->dev, "info: RECV DATA: Received packet from "
901 "firmware successfully\n");
902 mwifiex_handle_rx_packet(adapter, skb_tmp);
903 }
904
905done:
906 if (ret && skb_tmp)
907 dev_kfree_skb_any(skb_tmp);
908 return ret;
909}
910
911/*
912 * This function downloads the boot command to device
913 */
914static int
915mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
916{
917 phys_addr_t *buf_pa = MWIFIEX_SKB_PACB(skb);
918
919 if (!(skb->data && skb->len && *buf_pa)) {
920 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x:%x, "
921 "%x>\n", __func__, skb->data, skb->len,
922 (u32)*buf_pa, (u32)((u64)*buf_pa >> 32));
923 return -1;
924 }
925
926 /* Write the lower 32bits of the physical address to scratch
927 * register 0 */
928 if (mwifiex_write_reg(adapter, PCIE_SCRATCH_0_REG, (u32)*buf_pa)) {
929 dev_err(adapter->dev, "%s: failed to write download command "
930 "to boot code.\n", __func__);
931 return -1;
932 }
933
934 /* Write the upper 32bits of the physical address to scratch
935 * register 1 */
936 if (mwifiex_write_reg(adapter, PCIE_SCRATCH_1_REG,
937 (u32)((u64)*buf_pa >> 32))) {
938 dev_err(adapter->dev, "%s: failed to write download command "
939 "to boot code.\n", __func__);
940 return -1;
941 }
942
943 /* Write the command length to scratch register 2 */
944 if (mwifiex_write_reg(adapter, PCIE_SCRATCH_2_REG, skb->len)) {
945 dev_err(adapter->dev, "%s: failed to write command length to "
946 "scratch register 2\n", __func__);
947 return -1;
948 }
949
950 /* Ring the door bell */
951 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
952 CPU_INTR_DOOR_BELL)) {
953 dev_err(adapter->dev, "%s: failed to assert door-bell "
954 "interrupt.\n", __func__);
955 return -1;
956 }
957
958 return 0;
959}
960
961/*
962 * This function downloads commands to the device
963 */
964static int
965mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
966{
967 struct pcie_service_card *card = adapter->card;
968 int ret = 0;
969 phys_addr_t *cmd_buf_pa;
970 phys_addr_t *cmdrsp_buf_pa;
971
972 if (!(skb->data && skb->len)) {
973 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
974 __func__, skb->data, skb->len);
975 return -1;
976 }
977
978 /* Make sure a command response buffer is available */
979 if (!card->cmdrsp_buf) {
980 dev_err(adapter->dev, "No response buffer available, send "
981 "command failed\n");
982 return -EBUSY;
983 }
984
985 /* Make sure a command buffer is available */
986 if (!card->cmd_buf) {
987 dev_err(adapter->dev, "Command buffer not available\n");
988 return -EBUSY;
989 }
990
991 adapter->cmd_sent = true;
992 /* Copy the given skb in to DMA accessable shared buffer */
993 skb_put(card->cmd_buf, MWIFIEX_SIZE_OF_CMD_BUFFER - card->cmd_buf->len);
994 skb_trim(card->cmd_buf, skb->len);
995 memcpy(card->cmd_buf->data, skb->data, skb->len);
996
997 /* To send a command, the driver will:
998 1. Write the 64bit physical address of the data buffer to
999 SCRATCH1 + SCRATCH0
1000 2. Ring the door bell (i.e. set the door bell interrupt)
1001
1002 In response to door bell interrupt, the firmware will perform
1003 the DMA of the command packet (first header to obtain the total
1004 length and then rest of the command).
1005 */
1006
1007 if (card->cmdrsp_buf) {
1008 cmdrsp_buf_pa = MWIFIEX_SKB_PACB(card->cmdrsp_buf);
1009 /* Write the lower 32bits of the cmdrsp buffer physical
1010 address */
1011 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO,
1012 (u32)*cmdrsp_buf_pa)) {
1013 dev_err(adapter->dev, "Failed to write download command to boot code.\n");
1014 ret = -1;
1015 goto done;
1016 }
1017 /* Write the upper 32bits of the cmdrsp buffer physical
1018 address */
1019 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI,
1020 (u32)((u64)*cmdrsp_buf_pa >> 32))) {
1021 dev_err(adapter->dev, "Failed to write download command"
1022 " to boot code.\n");
1023 ret = -1;
1024 goto done;
1025 }
1026 }
1027
1028 cmd_buf_pa = MWIFIEX_SKB_PACB(card->cmd_buf);
1029 /* Write the lower 32bits of the physical address to REG_CMD_ADDR_LO */
1030 if (mwifiex_write_reg(adapter, REG_CMD_ADDR_LO,
1031 (u32)*cmd_buf_pa)) {
1032 dev_err(adapter->dev, "Failed to write download command "
1033 "to boot code.\n");
1034 ret = -1;
1035 goto done;
1036 }
1037 /* Write the upper 32bits of the physical address to REG_CMD_ADDR_HI */
1038 if (mwifiex_write_reg(adapter, REG_CMD_ADDR_HI,
1039 (u32)((u64)*cmd_buf_pa >> 32))) {
1040 dev_err(adapter->dev, "Failed to write download command "
1041 "to boot code.\n");
1042 ret = -1;
1043 goto done;
1044 }
1045
1046 /* Write the command length to REG_CMD_SIZE */
1047 if (mwifiex_write_reg(adapter, REG_CMD_SIZE,
1048 card->cmd_buf->len)) {
1049 dev_err(adapter->dev, "Failed to write command length to "
1050 "REG_CMD_SIZE\n");
1051 ret = -1;
1052 goto done;
1053 }
1054
1055 /* Ring the door bell */
1056 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1057 CPU_INTR_DOOR_BELL)) {
1058 dev_err(adapter->dev, "Failed to assert door-bell "
1059 "interrupt.\n");
1060 ret = -1;
1061 goto done;
1062 }
1063
1064done:
1065 if (ret)
1066 adapter->cmd_sent = false;
1067
1068 return 0;
1069}
1070
1071/*
1072 * This function handles command complete interrupt
1073 */
1074static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1075{
1076 struct pcie_service_card *card = adapter->card;
1077 int count = 0;
1078
1079 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1080
1081 if (!adapter->curr_cmd) {
1082 skb_pull(card->cmdrsp_buf, INTF_HEADER_LEN);
1083 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1084 mwifiex_process_sleep_confirm_resp(adapter,
1085 card->cmdrsp_buf->data,
1086 card->cmdrsp_buf->len);
1087 while (mwifiex_pcie_ok_to_access_hw(adapter) &&
1088 (count++ < 10))
1089 udelay(50);
1090 } else {
1091 dev_err(adapter->dev, "There is no command but "
1092 "got cmdrsp\n");
1093 }
1094 memcpy(adapter->upld_buf, card->cmdrsp_buf->data,
1095 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER,
1096 card->cmdrsp_buf->len));
1097 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1098 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1099 skb_pull(card->cmdrsp_buf, INTF_HEADER_LEN);
1100 adapter->curr_cmd->resp_skb = card->cmdrsp_buf;
1101 adapter->cmd_resp_received = true;
1102 /* Take the pointer and set it to CMD node and will
1103 return in the response complete callback */
1104 card->cmdrsp_buf = NULL;
1105
1106 /* Clear the cmd-rsp buffer address in scratch registers. This
1107 will prevent firmware from writing to the same response
1108 buffer again. */
1109 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO, 0)) {
1110 dev_err(adapter->dev, "cmd_done: failed to clear "
1111 "cmd_rsp address.\n");
1112 return -1;
1113 }
1114 /* Write the upper 32bits of the cmdrsp buffer physical
1115 address */
1116 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI, 0)) {
1117 dev_err(adapter->dev, "cmd_done: failed to clear "
1118 "cmd_rsp address.\n");
1119 return -1;
1120 }
1121 }
1122
1123 return 0;
1124}
1125
1126/*
1127 * Command Response processing complete handler
1128 */
1129static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1130 struct sk_buff *skb)
1131{
1132 struct pcie_service_card *card = adapter->card;
1133
1134 if (skb) {
1135 card->cmdrsp_buf = skb;
1136 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1137 }
1138
1139 return 0;
1140}
1141
1142/*
1143 * This function handles firmware event ready interrupt
1144 */
1145static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1146{
1147 struct pcie_service_card *card = adapter->card;
1148 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1149 u32 wrptr, event;
1150
1151 if (adapter->event_received) {
1152 dev_dbg(adapter->dev, "info: Event being processed, "\
1153 "do not process this interrupt just yet\n");
1154 return 0;
1155 }
1156
1157 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1158 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1159 return -1;
1160 }
1161
1162 /* Read the event ring write pointer set by firmware */
1163 if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
1164 dev_err(adapter->dev, "EventReady: failed to read REG_EVTBD_WRPTR\n");
1165 return -1;
1166 }
1167
1168 dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1169 card->evtbd_rdptr, wrptr);
1170 if (((wrptr & MWIFIEX_EVTBD_MASK) !=
1171 (card->evtbd_rdptr & MWIFIEX_EVTBD_MASK)) ||
1172 ((wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) ==
1173 (card->evtbd_rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
1174 struct sk_buff *skb_cmd;
1175 __le16 data_len = 0;
1176 u16 evt_len;
1177
1178 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1179 skb_cmd = card->evt_buf_list[rdptr];
1180 /* Take the pointer and set it to event pointer in adapter
1181 and will return back after event handling callback */
1182 card->evt_buf_list[rdptr] = NULL;
1183 card->evtbd_ring[rdptr]->paddr = 0;
1184 card->evtbd_ring[rdptr]->len = 0;
1185 card->evtbd_ring[rdptr]->flags = 0;
1186
1187 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1188 adapter->event_cause = event;
1189 /* The first 4bytes will be the event transfer header
1190 len is 2 bytes followed by type which is 2 bytes */
1191 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1192 evt_len = le16_to_cpu(data_len);
1193
1194 skb_pull(skb_cmd, INTF_HEADER_LEN);
1195 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1196
1197 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1198 memcpy(adapter->event_body, skb_cmd->data +
1199 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1200 MWIFIEX_EVENT_HEADER_LEN);
1201
1202 adapter->event_received = true;
1203 adapter->event_skb = skb_cmd;
1204
1205 /* Do not update the event read pointer here, wait till the
1206 buffer is released. This is just to make things simpler,
1207 we need to find a better method of managing these buffers.
1208 */
1209 }
1210
1211 return 0;
1212}
1213
1214/*
1215 * Event processing complete handler
1216 */
1217static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1218 struct sk_buff *skb)
1219{
1220 struct pcie_service_card *card = adapter->card;
1221 int ret = 0;
1222 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1223 u32 wrptr;
1224 phys_addr_t *buf_pa;
1225
1226 if (!skb)
1227 return 0;
1228
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001229 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001230 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
1231 rdptr);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001232 return -EINVAL;
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001233 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001234
1235 /* Read the event ring write pointer set by firmware */
1236 if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
1237 dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_WRPTR\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001238 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001239 }
1240
1241 if (!card->evt_buf_list[rdptr]) {
1242 skb_push(skb, INTF_HEADER_LEN);
1243 card->evt_buf_list[rdptr] = skb;
1244 buf_pa = MWIFIEX_SKB_PACB(skb);
1245 card->evtbd_ring[rdptr]->paddr = *buf_pa;
1246 card->evtbd_ring[rdptr]->len = (u16)skb->len;
1247 card->evtbd_ring[rdptr]->flags = 0;
1248 skb = NULL;
1249 } else {
1250 dev_dbg(adapter->dev, "info: ERROR: Buffer is still valid at "
1251 "index %d, <%p, %p>\n", rdptr,
1252 card->evt_buf_list[rdptr], skb);
1253 }
1254
1255 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1256 card->evtbd_rdptr = ((card->evtbd_rdptr &
1257 MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
1258 MWIFIEX_BD_FLAG_ROLLOVER_IND);
1259 }
1260
1261 dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1262 card->evtbd_rdptr, wrptr);
1263
1264 /* Write the event ring read pointer in to REG_EVTBD_RDPTR */
1265 if (mwifiex_write_reg(adapter, REG_EVTBD_RDPTR, card->evtbd_rdptr)) {
1266 dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_RDPTR\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001267 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001268 }
1269
Amitkumar Karward930fae2011-10-11 17:41:21 -07001270 dev_dbg(adapter->dev, "info: Check Events Again\n");
1271 ret = mwifiex_pcie_process_event_ready(adapter);
1272
1273 return ret;
1274}
1275
1276/*
1277 * This function downloads the firmware to the card.
1278 *
1279 * Firmware is downloaded to the card in blocks. Every block download
1280 * is tested for CRC errors, and retried a number of times before
1281 * returning failure.
1282 */
1283static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1284 struct mwifiex_fw_image *fw)
1285{
1286 int ret;
1287 u8 *firmware = fw->fw_buf;
1288 u32 firmware_len = fw->fw_len;
1289 u32 offset = 0;
1290 struct sk_buff *skb;
1291 u32 txlen, tx_blocks = 0, tries, len;
1292 u32 block_retry_cnt = 0;
1293
1294 if (!adapter) {
1295 pr_err("adapter structure is not valid\n");
1296 return -1;
1297 }
1298
1299 if (!firmware || !firmware_len) {
1300 dev_err(adapter->dev, "No firmware image found! "
1301 "Terminating download\n");
1302 return -1;
1303 }
1304
1305 dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
1306 firmware_len);
1307
1308 if (mwifiex_pcie_disable_host_int(adapter)) {
1309 dev_err(adapter->dev, "%s: Disabling interrupts"
1310 " failed.\n", __func__);
1311 return -1;
1312 }
1313
1314 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1315 if (!skb) {
1316 ret = -ENOMEM;
1317 goto done;
1318 }
1319 mwifiex_update_sk_buff_pa(skb);
1320
1321 /* Perform firmware data transfer */
1322 do {
1323 u32 ireg_intr = 0;
1324
1325 /* More data? */
1326 if (offset >= firmware_len)
1327 break;
1328
1329 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1330 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_2_REG,
1331 &len);
1332 if (ret) {
1333 dev_warn(adapter->dev, "Failed reading length from boot code\n");
1334 goto done;
1335 }
1336 if (len)
1337 break;
1338 udelay(10);
1339 }
1340
1341 if (!len) {
1342 break;
1343 } else if (len > MWIFIEX_UPLD_SIZE) {
1344 pr_err("FW download failure @ %d, invalid length %d\n",
1345 offset, len);
1346 ret = -1;
1347 goto done;
1348 }
1349
1350 txlen = len;
1351
1352 if (len & BIT(0)) {
1353 block_retry_cnt++;
1354 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1355 pr_err("FW download failure @ %d, over max "
1356 "retry count\n", offset);
1357 ret = -1;
1358 goto done;
1359 }
1360 dev_err(adapter->dev, "FW CRC error indicated by the "
1361 "helper: len = 0x%04X, txlen = "
1362 "%d\n", len, txlen);
1363 len &= ~BIT(0);
1364 /* Setting this to 0 to resend from same offset */
1365 txlen = 0;
1366 } else {
1367 block_retry_cnt = 0;
1368 /* Set blocksize to transfer - checking for
1369 last block */
1370 if (firmware_len - offset < txlen)
1371 txlen = firmware_len - offset;
1372
1373 dev_dbg(adapter->dev, ".");
1374
1375 tx_blocks =
1376 (txlen + MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD - 1) /
1377 MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD;
1378
1379 /* Copy payload to buffer */
1380 memmove(skb->data, &firmware[offset], txlen);
1381 }
1382
1383 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1384 skb_trim(skb, tx_blocks * MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD);
1385
1386 /* Send the boot command to device */
1387 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
1388 dev_err(adapter->dev, "Failed to send firmware download command\n");
1389 ret = -1;
1390 goto done;
1391 }
1392 /* Wait for the command done interrupt */
1393 do {
1394 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1395 &ireg_intr)) {
1396 dev_err(adapter->dev, "%s: Failed to read "
1397 "interrupt status during "
1398 "fw dnld.\n", __func__);
1399 ret = -1;
1400 goto done;
1401 }
1402 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1403 CPU_INTR_DOOR_BELL);
1404 offset += txlen;
1405 } while (true);
1406
1407 dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
1408 offset);
1409
1410 ret = 0;
1411
1412done:
1413 dev_kfree_skb_any(skb);
1414 return ret;
1415}
1416
1417/*
1418 * This function checks the firmware status in card.
1419 *
1420 * The winner interface is also determined by this function.
1421 */
1422static int
1423mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1424{
1425 int ret = 0;
1426 u32 firmware_stat, winner_status;
1427 u32 tries;
1428
1429 /* Mask spurios interrupts */
1430 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
1431 HOST_INTR_MASK)) {
1432 dev_warn(adapter->dev, "Write register failed\n");
1433 return -1;
1434 }
1435
1436 dev_dbg(adapter->dev, "Setting driver ready signature\n");
1437 if (mwifiex_write_reg(adapter, REG_DRV_READY, FIRMWARE_READY_PCIE)) {
1438 dev_err(adapter->dev, "Failed to write driver ready signature\n");
1439 return -1;
1440 }
1441
1442 /* Wait for firmware initialization event */
1443 for (tries = 0; tries < poll_num; tries++) {
1444 if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
1445 &firmware_stat))
1446 ret = -1;
1447 else
1448 ret = 0;
1449 if (ret)
1450 continue;
1451 if (firmware_stat == FIRMWARE_READY_PCIE) {
1452 ret = 0;
1453 break;
1454 } else {
1455 mdelay(100);
1456 ret = -1;
1457 }
1458 }
1459
1460 if (ret) {
1461 if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
1462 &winner_status))
1463 ret = -1;
1464 else if (!winner_status) {
1465 dev_err(adapter->dev, "PCI-E is the winner\n");
1466 adapter->winner = 1;
1467 ret = -1;
1468 } else {
1469 dev_err(adapter->dev, "PCI-E is not the winner <%#x, %d>, exit download\n",
1470 ret, adapter->winner);
1471 ret = 0;
1472 }
1473 }
1474
1475 return ret;
1476}
1477
1478/*
1479 * This function reads the interrupt status from card.
1480 */
1481static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
1482{
1483 u32 pcie_ireg;
1484 unsigned long flags;
1485
1486 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1487 return;
1488
1489 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
1490 dev_warn(adapter->dev, "Read register failed\n");
1491 return;
1492 }
1493
1494 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1495
1496 mwifiex_pcie_disable_host_int(adapter);
1497
1498 /* Clear the pending interrupts */
1499 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
1500 ~pcie_ireg)) {
1501 dev_warn(adapter->dev, "Write register failed\n");
1502 return;
1503 }
1504 spin_lock_irqsave(&adapter->int_lock, flags);
1505 adapter->int_status |= pcie_ireg;
1506 spin_unlock_irqrestore(&adapter->int_lock, flags);
1507
1508 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1509 if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
1510 (adapter->ps_state == PS_STATE_SLEEP)) {
1511 mwifiex_pcie_enable_host_int(adapter);
1512 if (mwifiex_write_reg(adapter,
1513 PCIE_CPU_INT_EVENT,
1514 CPU_INTR_SLEEP_CFM_DONE)) {
1515 dev_warn(adapter->dev, "Write register"
1516 " failed\n");
1517 return;
1518
1519 }
1520 }
1521 } else if (!adapter->pps_uapsd_mode &&
1522 adapter->ps_state == PS_STATE_SLEEP) {
1523 /* Potentially for PCIe we could get other
1524 * interrupts like shared. Don't change power
1525 * state until cookie is set */
1526 if (mwifiex_pcie_ok_to_access_hw(adapter))
1527 adapter->ps_state = PS_STATE_AWAKE;
1528 }
1529 }
1530}
1531
1532/*
1533 * Interrupt handler for PCIe root port
1534 *
1535 * This function reads the interrupt status from firmware and assigns
1536 * the main process in workqueue which will handle the interrupt.
1537 */
1538static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
1539{
1540 struct pci_dev *pdev = (struct pci_dev *)context;
1541 struct pcie_service_card *card;
1542 struct mwifiex_adapter *adapter;
1543
1544 if (!pdev) {
1545 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
1546 goto exit;
1547 }
1548
1549 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
1550 if (!card || !card->adapter) {
1551 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
1552 card ? card->adapter : NULL);
1553 goto exit;
1554 }
1555 adapter = card->adapter;
1556
1557 if (adapter->surprise_removed)
1558 goto exit;
1559
1560 mwifiex_interrupt_status(adapter);
1561 queue_work(adapter->workqueue, &adapter->main_work);
1562
1563exit:
1564 return IRQ_HANDLED;
1565}
1566
1567/*
1568 * This function checks the current interrupt status.
1569 *
1570 * The following interrupts are checked and handled by this function -
1571 * - Data sent
1572 * - Command sent
1573 * - Command received
1574 * - Packets received
1575 * - Events received
1576 *
1577 * In case of Rx packets received, the packets are uploaded from card to
1578 * host and processed accordingly.
1579 */
1580static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1581{
1582 int ret;
1583 u32 pcie_ireg = 0;
1584 unsigned long flags;
1585
1586 spin_lock_irqsave(&adapter->int_lock, flags);
1587 /* Clear out unused interrupts */
1588 adapter->int_status &= HOST_INTR_MASK;
1589 spin_unlock_irqrestore(&adapter->int_lock, flags);
1590
1591 while (adapter->int_status & HOST_INTR_MASK) {
1592 if (adapter->int_status & HOST_INTR_DNLD_DONE) {
1593 adapter->int_status &= ~HOST_INTR_DNLD_DONE;
1594 if (adapter->data_sent) {
1595 dev_dbg(adapter->dev, "info: DATA sent Interrupt\n");
1596 adapter->data_sent = false;
1597 }
1598 }
1599 if (adapter->int_status & HOST_INTR_UPLD_RDY) {
1600 adapter->int_status &= ~HOST_INTR_UPLD_RDY;
1601 dev_dbg(adapter->dev, "info: Rx DATA\n");
1602 ret = mwifiex_pcie_process_recv_data(adapter);
1603 if (ret)
1604 return ret;
1605 }
1606 if (adapter->int_status & HOST_INTR_EVENT_RDY) {
1607 adapter->int_status &= ~HOST_INTR_EVENT_RDY;
1608 dev_dbg(adapter->dev, "info: Rx EVENT\n");
1609 ret = mwifiex_pcie_process_event_ready(adapter);
1610 if (ret)
1611 return ret;
1612 }
1613
1614 if (adapter->int_status & HOST_INTR_CMD_DONE) {
1615 adapter->int_status &= ~HOST_INTR_CMD_DONE;
1616 if (adapter->cmd_sent) {
1617 dev_dbg(adapter->dev, "info: CMD sent Interrupt\n");
1618 adapter->cmd_sent = false;
1619 }
1620 /* Handle command response */
1621 ret = mwifiex_pcie_process_cmd_complete(adapter);
1622 if (ret)
1623 return ret;
1624 }
1625
1626 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1627 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
1628 &pcie_ireg)) {
1629 dev_warn(adapter->dev, "Read register failed\n");
1630 return -1;
1631 }
1632
1633 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1634 if (mwifiex_write_reg(adapter,
1635 PCIE_HOST_INT_STATUS, ~pcie_ireg)) {
1636 dev_warn(adapter->dev, "Write register"
1637 " failed\n");
1638 return -1;
1639 }
1640 adapter->int_status |= pcie_ireg;
1641 adapter->int_status &= HOST_INTR_MASK;
1642 }
1643
1644 }
1645 }
1646 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
1647 adapter->cmd_sent, adapter->data_sent);
1648 mwifiex_pcie_enable_host_int(adapter);
1649
1650 return 0;
1651}
1652
1653/*
1654 * This function downloads data from driver to card.
1655 *
1656 * Both commands and data packets are transferred to the card by this
1657 * function.
1658 *
1659 * This function adds the PCIE specific header to the front of the buffer
1660 * before transferring. The header contains the length of the packet and
1661 * the type. The firmware handles the packets based upon this set type.
1662 */
1663static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
1664 struct sk_buff *skb,
1665 struct mwifiex_tx_param *tx_param)
1666{
Dan Carpenterfa161cb72011-11-07 19:31:45 -08001667 if (!skb) {
1668 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001669 return -1;
1670 }
1671
1672 if (type == MWIFIEX_TYPE_DATA)
1673 return mwifiex_pcie_send_data(adapter, skb);
1674 else if (type == MWIFIEX_TYPE_CMD)
1675 return mwifiex_pcie_send_cmd(adapter, skb);
1676
1677 return 0;
1678}
1679
1680/*
1681 * This function initializes the PCI-E host memory space, WCB rings, etc.
1682 *
1683 * The following initializations steps are followed -
1684 * - Allocate TXBD ring buffers
1685 * - Allocate RXBD ring buffers
1686 * - Allocate event BD ring buffers
1687 * - Allocate command response ring buffer
1688 * - Allocate sleep cookie buffer
1689 */
1690static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
1691{
1692 struct pcie_service_card *card = adapter->card;
1693 int ret;
1694 struct pci_dev *pdev = card->dev;
1695
1696 pci_set_drvdata(pdev, card);
1697
1698 ret = pci_enable_device(pdev);
1699 if (ret)
1700 goto err_enable_dev;
1701
1702 pci_set_master(pdev);
1703
1704 dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
1705 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
1706 if (ret) {
1707 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
1708 goto err_set_dma_mask;
1709 }
1710
1711 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
1712 if (ret) {
1713 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
1714 goto err_set_dma_mask;
1715 }
1716
1717 ret = pci_request_region(pdev, 0, DRV_NAME);
1718 if (ret) {
1719 dev_err(adapter->dev, "req_reg(0) error\n");
1720 goto err_req_region0;
1721 }
1722 card->pci_mmap = pci_iomap(pdev, 0, 0);
1723 if (!card->pci_mmap) {
1724 dev_err(adapter->dev, "iomap(0) error\n");
1725 goto err_iomap0;
1726 }
1727 ret = pci_request_region(pdev, 2, DRV_NAME);
1728 if (ret) {
1729 dev_err(adapter->dev, "req_reg(2) error\n");
1730 goto err_req_region2;
1731 }
1732 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
1733 if (!card->pci_mmap1) {
1734 dev_err(adapter->dev, "iomap(2) error\n");
1735 goto err_iomap2;
1736 }
1737
1738 dev_dbg(adapter->dev, "PCI memory map Virt0: %p PCI memory map Virt2: "
1739 "%p\n", card->pci_mmap, card->pci_mmap1);
1740
1741 card->cmdrsp_buf = NULL;
1742 ret = mwifiex_pcie_create_txbd_ring(adapter);
1743 if (ret)
1744 goto err_cre_txbd;
1745 ret = mwifiex_pcie_create_rxbd_ring(adapter);
1746 if (ret)
1747 goto err_cre_rxbd;
1748 ret = mwifiex_pcie_create_evtbd_ring(adapter);
1749 if (ret)
1750 goto err_cre_evtbd;
1751 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
1752 if (ret)
1753 goto err_alloc_cmdbuf;
1754 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
1755 if (ret)
1756 goto err_alloc_cookie;
1757
1758 return ret;
1759
1760err_alloc_cookie:
1761 mwifiex_pcie_delete_cmdrsp_buf(adapter);
1762err_alloc_cmdbuf:
1763 mwifiex_pcie_delete_evtbd_ring(adapter);
1764err_cre_evtbd:
1765 mwifiex_pcie_delete_rxbd_ring(adapter);
1766err_cre_rxbd:
1767 mwifiex_pcie_delete_txbd_ring(adapter);
1768err_cre_txbd:
1769 pci_iounmap(pdev, card->pci_mmap1);
1770err_iomap2:
1771 pci_release_region(pdev, 2);
1772err_req_region2:
1773 pci_iounmap(pdev, card->pci_mmap);
1774err_iomap0:
1775 pci_release_region(pdev, 0);
1776err_req_region0:
1777err_set_dma_mask:
1778 pci_disable_device(pdev);
1779err_enable_dev:
1780 pci_set_drvdata(pdev, NULL);
1781 return ret;
1782}
1783
1784/*
1785 * This function cleans up the allocated card buffers.
1786 *
1787 * The following are freed by this function -
1788 * - TXBD ring buffers
1789 * - RXBD ring buffers
1790 * - Event BD ring buffers
1791 * - Command response ring buffer
1792 * - Sleep cookie buffer
1793 */
1794static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
1795{
1796 struct pcie_service_card *card = adapter->card;
1797 struct pci_dev *pdev = card->dev;
1798
1799 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
1800 mwifiex_pcie_delete_cmdrsp_buf(adapter);
1801 mwifiex_pcie_delete_evtbd_ring(adapter);
1802 mwifiex_pcie_delete_rxbd_ring(adapter);
1803 mwifiex_pcie_delete_txbd_ring(adapter);
1804 card->cmdrsp_buf = NULL;
1805
1806 dev_dbg(adapter->dev, "Clearing driver ready signature\n");
1807 if (user_rmmod) {
1808 if (mwifiex_write_reg(adapter, REG_DRV_READY, 0x00000000))
1809 dev_err(adapter->dev, "Failed to write driver not-ready signature\n");
1810 }
1811
1812 if (pdev) {
1813 pci_iounmap(pdev, card->pci_mmap);
1814 pci_iounmap(pdev, card->pci_mmap1);
1815
1816 pci_release_regions(pdev);
1817 pci_disable_device(pdev);
1818 pci_set_drvdata(pdev, NULL);
1819 }
1820}
1821
1822/*
1823 * This function registers the PCIE device.
1824 *
1825 * PCIE IRQ is claimed, block size is set and driver data is initialized.
1826 */
1827static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
1828{
1829 int ret;
1830 struct pcie_service_card *card = adapter->card;
1831 struct pci_dev *pdev = card->dev;
1832
1833 /* save adapter pointer in card */
1834 card->adapter = adapter;
1835
1836 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
1837 "MRVL_PCIE", pdev);
1838 if (ret) {
1839 pr_err("request_irq failed: ret=%d\n", ret);
1840 adapter->card = NULL;
1841 return -1;
1842 }
1843
1844 adapter->dev = &pdev->dev;
1845 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
1846
1847 return 0;
1848}
1849
1850/*
1851 * This function unregisters the PCIE device.
1852 *
1853 * The PCIE IRQ is released, the function is disabled and driver
1854 * data is set to null.
1855 */
1856static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
1857{
1858 struct pcie_service_card *card = adapter->card;
1859
1860 if (card) {
1861 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
1862 free_irq(card->dev->irq, card->dev);
1863 }
1864}
1865
1866static struct mwifiex_if_ops pcie_ops = {
1867 .init_if = mwifiex_pcie_init,
1868 .cleanup_if = mwifiex_pcie_cleanup,
1869 .check_fw_status = mwifiex_check_fw_status,
1870 .prog_fw = mwifiex_prog_fw_w_helper,
1871 .register_dev = mwifiex_register_dev,
1872 .unregister_dev = mwifiex_unregister_dev,
1873 .enable_int = mwifiex_pcie_enable_host_int,
1874 .process_int_status = mwifiex_process_int_status,
1875 .host_to_card = mwifiex_pcie_host_to_card,
1876 .wakeup = mwifiex_pm_wakeup_card,
1877 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
1878
1879 /* PCIE specific */
1880 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
1881 .event_complete = mwifiex_pcie_event_complete,
1882 .update_mp_end_port = NULL,
1883 .cleanup_mpa_buf = NULL,
1884};
1885
1886/*
1887 * This function initializes the PCIE driver module.
1888 *
1889 * This initiates the semaphore and registers the device with
1890 * PCIE bus.
1891 */
1892static int mwifiex_pcie_init_module(void)
1893{
1894 int ret;
1895
1896 pr_debug("Marvell 8766 PCIe Driver\n");
1897
1898 sema_init(&add_remove_card_sem, 1);
1899
1900 /* Clear the flag in case user removes the card. */
1901 user_rmmod = 0;
1902
1903 ret = pci_register_driver(&mwifiex_pcie);
1904 if (ret)
1905 pr_err("Driver register failed!\n");
1906 else
1907 pr_debug("info: Driver registered successfully!\n");
1908
1909 return ret;
1910}
1911
1912/*
1913 * This function cleans up the PCIE driver.
1914 *
1915 * The following major steps are followed for cleanup -
1916 * - Resume the device if its suspended
1917 * - Disconnect the device if connected
1918 * - Shutdown the firmware
1919 * - Unregister the device from PCIE bus.
1920 */
1921static void mwifiex_pcie_cleanup_module(void)
1922{
1923 if (!down_interruptible(&add_remove_card_sem))
1924 up(&add_remove_card_sem);
1925
1926 /* Set the flag as user is removing this module. */
1927 user_rmmod = 1;
1928
1929 pci_unregister_driver(&mwifiex_pcie);
1930}
1931
1932module_init(mwifiex_pcie_init_module);
1933module_exit(mwifiex_pcie_cleanup_module);
1934
1935MODULE_AUTHOR("Marvell International Ltd.");
1936MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
1937MODULE_VERSION(PCIE_VERSION);
1938MODULE_LICENSE("GPL v2");
1939MODULE_FIRMWARE("mrvl/pcie8766_uapsta.bin");