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