blob: 191c6825a6b6b2be559f03b0e5ad34357db70a28 [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
Avinash Patilc6d1d872013-01-03 21:21:29 -0800969/* This function init rx port in firmware which in turn enables to receive data
970 * from device before transmitting any packet.
971 */
972static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
973{
974 struct pcie_service_card *card = adapter->card;
975
976 /* Write the RX ring read pointer in to REG_RXBD_RDPTR */
977 if (mwifiex_write_reg(adapter, REG_RXBD_RDPTR, card->rxbd_rdptr | 0)) {
978 dev_err(adapter->dev,
979 "RECV DATA: failed to write REG_RXBD_RDPTR\n");
980 return -1;
981 }
982 return 0;
983}
984
985/* This function downloads commands to the device
Amitkumar Karward930fae2011-10-11 17:41:21 -0700986 */
987static int
988mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
989{
990 struct pcie_service_card *card = adapter->card;
991 int ret = 0;
992 phys_addr_t *cmd_buf_pa;
993 phys_addr_t *cmdrsp_buf_pa;
994
995 if (!(skb->data && skb->len)) {
996 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700997 __func__, skb->data, skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700998 return -1;
999 }
1000
1001 /* Make sure a command response buffer is available */
1002 if (!card->cmdrsp_buf) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001003 dev_err(adapter->dev,
1004 "No response buffer available, send command failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001005 return -EBUSY;
1006 }
1007
1008 /* Make sure a command buffer is available */
1009 if (!card->cmd_buf) {
1010 dev_err(adapter->dev, "Command buffer not available\n");
1011 return -EBUSY;
1012 }
1013
1014 adapter->cmd_sent = true;
1015 /* Copy the given skb in to DMA accessable shared buffer */
1016 skb_put(card->cmd_buf, MWIFIEX_SIZE_OF_CMD_BUFFER - card->cmd_buf->len);
1017 skb_trim(card->cmd_buf, skb->len);
1018 memcpy(card->cmd_buf->data, skb->data, skb->len);
1019
1020 /* To send a command, the driver will:
1021 1. Write the 64bit physical address of the data buffer to
1022 SCRATCH1 + SCRATCH0
1023 2. Ring the door bell (i.e. set the door bell interrupt)
1024
1025 In response to door bell interrupt, the firmware will perform
1026 the DMA of the command packet (first header to obtain the total
1027 length and then rest of the command).
1028 */
1029
1030 if (card->cmdrsp_buf) {
1031 cmdrsp_buf_pa = MWIFIEX_SKB_PACB(card->cmdrsp_buf);
1032 /* Write the lower 32bits of the cmdrsp buffer physical
1033 address */
1034 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001035 (u32)*cmdrsp_buf_pa)) {
1036 dev_err(adapter->dev,
1037 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001038 ret = -1;
1039 goto done;
1040 }
1041 /* Write the upper 32bits of the cmdrsp buffer physical
1042 address */
1043 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001044 (u32)((u64)*cmdrsp_buf_pa >> 32))) {
1045 dev_err(adapter->dev,
1046 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001047 ret = -1;
1048 goto done;
1049 }
1050 }
1051
1052 cmd_buf_pa = MWIFIEX_SKB_PACB(card->cmd_buf);
1053 /* Write the lower 32bits of the physical address to REG_CMD_ADDR_LO */
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001054 if (mwifiex_write_reg(adapter, REG_CMD_ADDR_LO, (u32)*cmd_buf_pa)) {
1055 dev_err(adapter->dev,
1056 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001057 ret = -1;
1058 goto done;
1059 }
1060 /* Write the upper 32bits of the physical address to REG_CMD_ADDR_HI */
1061 if (mwifiex_write_reg(adapter, REG_CMD_ADDR_HI,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001062 (u32)((u64)*cmd_buf_pa >> 32))) {
1063 dev_err(adapter->dev,
1064 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001065 ret = -1;
1066 goto done;
1067 }
1068
1069 /* Write the command length to REG_CMD_SIZE */
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001070 if (mwifiex_write_reg(adapter, REG_CMD_SIZE, card->cmd_buf->len)) {
1071 dev_err(adapter->dev,
1072 "Failed to write cmd len to REG_CMD_SIZE\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001073 ret = -1;
1074 goto done;
1075 }
1076
1077 /* Ring the door bell */
1078 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1079 CPU_INTR_DOOR_BELL)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001080 dev_err(adapter->dev,
1081 "Failed to assert door-bell intr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001082 ret = -1;
1083 goto done;
1084 }
1085
1086done:
1087 if (ret)
1088 adapter->cmd_sent = false;
1089
1090 return 0;
1091}
1092
1093/*
1094 * This function handles command complete interrupt
1095 */
1096static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1097{
1098 struct pcie_service_card *card = adapter->card;
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001099 struct sk_buff *skb = card->cmdrsp_buf;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001100 int count = 0;
1101
1102 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1103
1104 if (!adapter->curr_cmd) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001105 skb_pull(skb, INTF_HEADER_LEN);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001106 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001107 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1108 skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001109 while (mwifiex_pcie_ok_to_access_hw(adapter) &&
1110 (count++ < 10))
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -07001111 usleep_range(50, 60);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001112 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001113 dev_err(adapter->dev,
1114 "There is no command but got cmdrsp\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001115 }
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001116 memcpy(adapter->upld_buf, skb->data,
1117 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1118 skb_push(skb, INTF_HEADER_LEN);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001119 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001120 skb_pull(skb, INTF_HEADER_LEN);
1121 adapter->curr_cmd->resp_skb = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001122 adapter->cmd_resp_received = true;
1123 /* Take the pointer and set it to CMD node and will
1124 return in the response complete callback */
1125 card->cmdrsp_buf = NULL;
1126
1127 /* Clear the cmd-rsp buffer address in scratch registers. This
1128 will prevent firmware from writing to the same response
1129 buffer again. */
1130 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO, 0)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001131 dev_err(adapter->dev,
1132 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001133 return -1;
1134 }
1135 /* Write the upper 32bits of the cmdrsp buffer physical
1136 address */
1137 if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI, 0)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001138 dev_err(adapter->dev,
1139 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001140 return -1;
1141 }
1142 }
1143
1144 return 0;
1145}
1146
1147/*
1148 * Command Response processing complete handler
1149 */
1150static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1151 struct sk_buff *skb)
1152{
1153 struct pcie_service_card *card = adapter->card;
1154
1155 if (skb) {
1156 card->cmdrsp_buf = skb;
1157 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
1158 }
1159
1160 return 0;
1161}
1162
1163/*
1164 * This function handles firmware event ready interrupt
1165 */
1166static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1167{
1168 struct pcie_service_card *card = adapter->card;
1169 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1170 u32 wrptr, event;
1171
1172 if (adapter->event_received) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001173 dev_dbg(adapter->dev, "info: Event being processed, "
1174 "do not process this interrupt just yet\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001175 return 0;
1176 }
1177
1178 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1179 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1180 return -1;
1181 }
1182
1183 /* Read the event ring write pointer set by firmware */
1184 if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001185 dev_err(adapter->dev,
1186 "EventReady: failed to read REG_EVTBD_WRPTR\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001187 return -1;
1188 }
1189
1190 dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001191 card->evtbd_rdptr, wrptr);
1192 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1193 & MWIFIEX_EVTBD_MASK)) ||
Amitkumar Karward930fae2011-10-11 17:41:21 -07001194 ((wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) ==
1195 (card->evtbd_rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
1196 struct sk_buff *skb_cmd;
1197 __le16 data_len = 0;
1198 u16 evt_len;
1199
1200 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1201 skb_cmd = card->evt_buf_list[rdptr];
1202 /* Take the pointer and set it to event pointer in adapter
1203 and will return back after event handling callback */
1204 card->evt_buf_list[rdptr] = NULL;
1205 card->evtbd_ring[rdptr]->paddr = 0;
1206 card->evtbd_ring[rdptr]->len = 0;
1207 card->evtbd_ring[rdptr]->flags = 0;
1208
1209 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1210 adapter->event_cause = event;
1211 /* The first 4bytes will be the event transfer header
1212 len is 2 bytes followed by type which is 2 bytes */
1213 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1214 evt_len = le16_to_cpu(data_len);
1215
1216 skb_pull(skb_cmd, INTF_HEADER_LEN);
1217 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1218
1219 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1220 memcpy(adapter->event_body, skb_cmd->data +
1221 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1222 MWIFIEX_EVENT_HEADER_LEN);
1223
1224 adapter->event_received = true;
1225 adapter->event_skb = skb_cmd;
1226
1227 /* Do not update the event read pointer here, wait till the
1228 buffer is released. This is just to make things simpler,
1229 we need to find a better method of managing these buffers.
1230 */
1231 }
1232
1233 return 0;
1234}
1235
1236/*
1237 * Event processing complete handler
1238 */
1239static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1240 struct sk_buff *skb)
1241{
1242 struct pcie_service_card *card = adapter->card;
1243 int ret = 0;
1244 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1245 u32 wrptr;
1246 phys_addr_t *buf_pa;
1247
1248 if (!skb)
1249 return 0;
1250
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001251 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001252 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001253 rdptr);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001254 return -EINVAL;
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001255 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001256
1257 /* Read the event ring write pointer set by firmware */
1258 if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001259 dev_err(adapter->dev,
1260 "event_complete: failed to read REG_EVTBD_WRPTR\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001261 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001262 }
1263
1264 if (!card->evt_buf_list[rdptr]) {
1265 skb_push(skb, INTF_HEADER_LEN);
1266 card->evt_buf_list[rdptr] = skb;
1267 buf_pa = MWIFIEX_SKB_PACB(skb);
1268 card->evtbd_ring[rdptr]->paddr = *buf_pa;
1269 card->evtbd_ring[rdptr]->len = (u16)skb->len;
1270 card->evtbd_ring[rdptr]->flags = 0;
1271 skb = NULL;
1272 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001273 dev_dbg(adapter->dev,
1274 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1275 rdptr, card->evt_buf_list[rdptr], skb);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001276 }
1277
1278 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1279 card->evtbd_rdptr = ((card->evtbd_rdptr &
1280 MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
1281 MWIFIEX_BD_FLAG_ROLLOVER_IND);
1282 }
1283
1284 dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001285 card->evtbd_rdptr, wrptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001286
1287 /* Write the event ring read pointer in to REG_EVTBD_RDPTR */
1288 if (mwifiex_write_reg(adapter, REG_EVTBD_RDPTR, card->evtbd_rdptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001289 dev_err(adapter->dev,
1290 "event_complete: failed to read REG_EVTBD_RDPTR\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001291 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001292 }
1293
Amitkumar Karward930fae2011-10-11 17:41:21 -07001294 dev_dbg(adapter->dev, "info: Check Events Again\n");
1295 ret = mwifiex_pcie_process_event_ready(adapter);
1296
1297 return ret;
1298}
1299
1300/*
1301 * This function downloads the firmware to the card.
1302 *
1303 * Firmware is downloaded to the card in blocks. Every block download
1304 * is tested for CRC errors, and retried a number of times before
1305 * returning failure.
1306 */
1307static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1308 struct mwifiex_fw_image *fw)
1309{
1310 int ret;
1311 u8 *firmware = fw->fw_buf;
1312 u32 firmware_len = fw->fw_len;
1313 u32 offset = 0;
1314 struct sk_buff *skb;
1315 u32 txlen, tx_blocks = 0, tries, len;
1316 u32 block_retry_cnt = 0;
1317
1318 if (!adapter) {
1319 pr_err("adapter structure is not valid\n");
1320 return -1;
1321 }
1322
1323 if (!firmware || !firmware_len) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001324 dev_err(adapter->dev,
1325 "No firmware image found! Terminating download\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001326 return -1;
1327 }
1328
1329 dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001330 firmware_len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001331
1332 if (mwifiex_pcie_disable_host_int(adapter)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001333 dev_err(adapter->dev,
1334 "%s: Disabling interrupts failed.\n", __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001335 return -1;
1336 }
1337
1338 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1339 if (!skb) {
1340 ret = -ENOMEM;
1341 goto done;
1342 }
1343 mwifiex_update_sk_buff_pa(skb);
1344
1345 /* Perform firmware data transfer */
1346 do {
1347 u32 ireg_intr = 0;
1348
1349 /* More data? */
1350 if (offset >= firmware_len)
1351 break;
1352
1353 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
1354 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_2_REG,
1355 &len);
1356 if (ret) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001357 dev_warn(adapter->dev,
1358 "Failed reading len from boot code\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001359 goto done;
1360 }
1361 if (len)
1362 break;
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -07001363 usleep_range(10, 20);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001364 }
1365
1366 if (!len) {
1367 break;
1368 } else if (len > MWIFIEX_UPLD_SIZE) {
1369 pr_err("FW download failure @ %d, invalid length %d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001370 offset, len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001371 ret = -1;
1372 goto done;
1373 }
1374
1375 txlen = len;
1376
1377 if (len & BIT(0)) {
1378 block_retry_cnt++;
1379 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1380 pr_err("FW download failure @ %d, over max "
1381 "retry count\n", offset);
1382 ret = -1;
1383 goto done;
1384 }
1385 dev_err(adapter->dev, "FW CRC error indicated by the "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001386 "helper: len = 0x%04X, txlen = %d\n",
1387 len, txlen);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001388 len &= ~BIT(0);
1389 /* Setting this to 0 to resend from same offset */
1390 txlen = 0;
1391 } else {
1392 block_retry_cnt = 0;
1393 /* Set blocksize to transfer - checking for
1394 last block */
1395 if (firmware_len - offset < txlen)
1396 txlen = firmware_len - offset;
1397
1398 dev_dbg(adapter->dev, ".");
1399
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001400 tx_blocks = (txlen +
1401 MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD - 1) /
1402 MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001403
1404 /* Copy payload to buffer */
1405 memmove(skb->data, &firmware[offset], txlen);
1406 }
1407
1408 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1409 skb_trim(skb, tx_blocks * MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD);
1410
1411 /* Send the boot command to device */
1412 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001413 dev_err(adapter->dev,
1414 "Failed to send firmware download command\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001415 ret = -1;
1416 goto done;
1417 }
1418 /* Wait for the command done interrupt */
1419 do {
1420 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1421 &ireg_intr)) {
1422 dev_err(adapter->dev, "%s: Failed to read "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001423 "interrupt status during fw dnld.\n",
1424 __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001425 ret = -1;
1426 goto done;
1427 }
1428 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1429 CPU_INTR_DOOR_BELL);
1430 offset += txlen;
1431 } while (true);
1432
1433 dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001434 offset);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001435
1436 ret = 0;
1437
1438done:
1439 dev_kfree_skb_any(skb);
1440 return ret;
1441}
1442
1443/*
1444 * This function checks the firmware status in card.
1445 *
1446 * The winner interface is also determined by this function.
1447 */
1448static int
1449mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1450{
1451 int ret = 0;
1452 u32 firmware_stat, winner_status;
1453 u32 tries;
1454
1455 /* Mask spurios interrupts */
1456 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001457 HOST_INTR_MASK)) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001458 dev_warn(adapter->dev, "Write register failed\n");
1459 return -1;
1460 }
1461
1462 dev_dbg(adapter->dev, "Setting driver ready signature\n");
1463 if (mwifiex_write_reg(adapter, REG_DRV_READY, FIRMWARE_READY_PCIE)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001464 dev_err(adapter->dev,
1465 "Failed to write driver ready signature\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001466 return -1;
1467 }
1468
1469 /* Wait for firmware initialization event */
1470 for (tries = 0; tries < poll_num; tries++) {
1471 if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
1472 &firmware_stat))
1473 ret = -1;
1474 else
1475 ret = 0;
1476 if (ret)
1477 continue;
1478 if (firmware_stat == FIRMWARE_READY_PCIE) {
1479 ret = 0;
1480 break;
1481 } else {
1482 mdelay(100);
1483 ret = -1;
1484 }
1485 }
1486
1487 if (ret) {
1488 if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
1489 &winner_status))
1490 ret = -1;
1491 else if (!winner_status) {
1492 dev_err(adapter->dev, "PCI-E is the winner\n");
1493 adapter->winner = 1;
1494 ret = -1;
1495 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001496 dev_err(adapter->dev,
1497 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
1498 ret, adapter->winner);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001499 ret = 0;
1500 }
1501 }
1502
1503 return ret;
1504}
1505
1506/*
1507 * This function reads the interrupt status from card.
1508 */
1509static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
1510{
1511 u32 pcie_ireg;
1512 unsigned long flags;
1513
1514 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1515 return;
1516
1517 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
1518 dev_warn(adapter->dev, "Read register failed\n");
1519 return;
1520 }
1521
1522 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1523
1524 mwifiex_pcie_disable_host_int(adapter);
1525
1526 /* Clear the pending interrupts */
1527 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
1528 ~pcie_ireg)) {
1529 dev_warn(adapter->dev, "Write register failed\n");
1530 return;
1531 }
1532 spin_lock_irqsave(&adapter->int_lock, flags);
1533 adapter->int_status |= pcie_ireg;
1534 spin_unlock_irqrestore(&adapter->int_lock, flags);
1535
1536 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1537 if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
1538 (adapter->ps_state == PS_STATE_SLEEP)) {
1539 mwifiex_pcie_enable_host_int(adapter);
1540 if (mwifiex_write_reg(adapter,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001541 PCIE_CPU_INT_EVENT,
1542 CPU_INTR_SLEEP_CFM_DONE)
1543 ) {
1544 dev_warn(adapter->dev,
1545 "Write register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001546 return;
1547
1548 }
1549 }
1550 } else if (!adapter->pps_uapsd_mode &&
1551 adapter->ps_state == PS_STATE_SLEEP) {
1552 /* Potentially for PCIe we could get other
1553 * interrupts like shared. Don't change power
1554 * state until cookie is set */
1555 if (mwifiex_pcie_ok_to_access_hw(adapter))
1556 adapter->ps_state = PS_STATE_AWAKE;
1557 }
1558 }
1559}
1560
1561/*
1562 * Interrupt handler for PCIe root port
1563 *
1564 * This function reads the interrupt status from firmware and assigns
1565 * the main process in workqueue which will handle the interrupt.
1566 */
1567static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
1568{
1569 struct pci_dev *pdev = (struct pci_dev *)context;
1570 struct pcie_service_card *card;
1571 struct mwifiex_adapter *adapter;
1572
1573 if (!pdev) {
1574 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
1575 goto exit;
1576 }
1577
1578 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
1579 if (!card || !card->adapter) {
1580 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001581 card ? card->adapter : NULL);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001582 goto exit;
1583 }
1584 adapter = card->adapter;
1585
1586 if (adapter->surprise_removed)
1587 goto exit;
1588
1589 mwifiex_interrupt_status(adapter);
1590 queue_work(adapter->workqueue, &adapter->main_work);
1591
1592exit:
1593 return IRQ_HANDLED;
1594}
1595
1596/*
1597 * This function checks the current interrupt status.
1598 *
1599 * The following interrupts are checked and handled by this function -
1600 * - Data sent
1601 * - Command sent
1602 * - Command received
1603 * - Packets received
1604 * - Events received
1605 *
1606 * In case of Rx packets received, the packets are uploaded from card to
1607 * host and processed accordingly.
1608 */
1609static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1610{
1611 int ret;
Avinash Patil659c4782013-01-03 21:21:28 -08001612 u32 pcie_ireg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001613 unsigned long flags;
1614
1615 spin_lock_irqsave(&adapter->int_lock, flags);
1616 /* Clear out unused interrupts */
Avinash Patil659c4782013-01-03 21:21:28 -08001617 pcie_ireg = adapter->int_status;
1618 adapter->int_status = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001619 spin_unlock_irqrestore(&adapter->int_lock, flags);
1620
Avinash Patil659c4782013-01-03 21:21:28 -08001621 while (pcie_ireg & HOST_INTR_MASK) {
1622 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
1623 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001624 if (adapter->data_sent) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001625 dev_dbg(adapter->dev, "info: DATA sent intr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001626 adapter->data_sent = false;
1627 }
1628 }
Avinash Patil659c4782013-01-03 21:21:28 -08001629 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
1630 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001631 dev_dbg(adapter->dev, "info: Rx DATA\n");
1632 ret = mwifiex_pcie_process_recv_data(adapter);
1633 if (ret)
1634 return ret;
1635 }
Avinash Patil659c4782013-01-03 21:21:28 -08001636 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
1637 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001638 dev_dbg(adapter->dev, "info: Rx EVENT\n");
1639 ret = mwifiex_pcie_process_event_ready(adapter);
1640 if (ret)
1641 return ret;
1642 }
1643
Avinash Patil659c4782013-01-03 21:21:28 -08001644 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1645 pcie_ireg &= ~HOST_INTR_CMD_DONE;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001646 if (adapter->cmd_sent) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001647 dev_dbg(adapter->dev,
1648 "info: CMD sent Interrupt\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001649 adapter->cmd_sent = false;
1650 }
1651 /* Handle command response */
1652 ret = mwifiex_pcie_process_cmd_complete(adapter);
1653 if (ret)
1654 return ret;
1655 }
1656
1657 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1658 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
1659 &pcie_ireg)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001660 dev_warn(adapter->dev,
1661 "Read register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001662 return -1;
1663 }
1664
1665 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1666 if (mwifiex_write_reg(adapter,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001667 PCIE_HOST_INT_STATUS,
1668 ~pcie_ireg)) {
1669 dev_warn(adapter->dev,
1670 "Write register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001671 return -1;
1672 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001673 }
1674
1675 }
1676 }
1677 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001678 adapter->cmd_sent, adapter->data_sent);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001679 mwifiex_pcie_enable_host_int(adapter);
1680
1681 return 0;
1682}
1683
1684/*
1685 * This function downloads data from driver to card.
1686 *
1687 * Both commands and data packets are transferred to the card by this
1688 * function.
1689 *
1690 * This function adds the PCIE specific header to the front of the buffer
1691 * before transferring. The header contains the length of the packet and
1692 * the type. The firmware handles the packets based upon this set type.
1693 */
1694static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
1695 struct sk_buff *skb,
1696 struct mwifiex_tx_param *tx_param)
1697{
Dan Carpenterfa161cb72011-11-07 19:31:45 -08001698 if (!skb) {
1699 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001700 return -1;
1701 }
1702
1703 if (type == MWIFIEX_TYPE_DATA)
1704 return mwifiex_pcie_send_data(adapter, skb);
1705 else if (type == MWIFIEX_TYPE_CMD)
1706 return mwifiex_pcie_send_cmd(adapter, skb);
1707
1708 return 0;
1709}
1710
1711/*
1712 * This function initializes the PCI-E host memory space, WCB rings, etc.
1713 *
1714 * The following initializations steps are followed -
1715 * - Allocate TXBD ring buffers
1716 * - Allocate RXBD ring buffers
1717 * - Allocate event BD ring buffers
1718 * - Allocate command response ring buffer
1719 * - Allocate sleep cookie buffer
1720 */
1721static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
1722{
1723 struct pcie_service_card *card = adapter->card;
1724 int ret;
1725 struct pci_dev *pdev = card->dev;
1726
1727 pci_set_drvdata(pdev, card);
1728
1729 ret = pci_enable_device(pdev);
1730 if (ret)
1731 goto err_enable_dev;
1732
1733 pci_set_master(pdev);
1734
1735 dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
1736 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
1737 if (ret) {
1738 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
1739 goto err_set_dma_mask;
1740 }
1741
1742 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
1743 if (ret) {
1744 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
1745 goto err_set_dma_mask;
1746 }
1747
1748 ret = pci_request_region(pdev, 0, DRV_NAME);
1749 if (ret) {
1750 dev_err(adapter->dev, "req_reg(0) error\n");
1751 goto err_req_region0;
1752 }
1753 card->pci_mmap = pci_iomap(pdev, 0, 0);
1754 if (!card->pci_mmap) {
1755 dev_err(adapter->dev, "iomap(0) error\n");
1756 goto err_iomap0;
1757 }
1758 ret = pci_request_region(pdev, 2, DRV_NAME);
1759 if (ret) {
1760 dev_err(adapter->dev, "req_reg(2) error\n");
1761 goto err_req_region2;
1762 }
1763 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
1764 if (!card->pci_mmap1) {
1765 dev_err(adapter->dev, "iomap(2) error\n");
1766 goto err_iomap2;
1767 }
1768
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001769 dev_dbg(adapter->dev,
1770 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
1771 card->pci_mmap, card->pci_mmap1);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001772
1773 card->cmdrsp_buf = NULL;
1774 ret = mwifiex_pcie_create_txbd_ring(adapter);
1775 if (ret)
1776 goto err_cre_txbd;
1777 ret = mwifiex_pcie_create_rxbd_ring(adapter);
1778 if (ret)
1779 goto err_cre_rxbd;
1780 ret = mwifiex_pcie_create_evtbd_ring(adapter);
1781 if (ret)
1782 goto err_cre_evtbd;
1783 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
1784 if (ret)
1785 goto err_alloc_cmdbuf;
1786 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
1787 if (ret)
1788 goto err_alloc_cookie;
1789
1790 return ret;
1791
1792err_alloc_cookie:
1793 mwifiex_pcie_delete_cmdrsp_buf(adapter);
1794err_alloc_cmdbuf:
1795 mwifiex_pcie_delete_evtbd_ring(adapter);
1796err_cre_evtbd:
1797 mwifiex_pcie_delete_rxbd_ring(adapter);
1798err_cre_rxbd:
1799 mwifiex_pcie_delete_txbd_ring(adapter);
1800err_cre_txbd:
1801 pci_iounmap(pdev, card->pci_mmap1);
1802err_iomap2:
1803 pci_release_region(pdev, 2);
1804err_req_region2:
1805 pci_iounmap(pdev, card->pci_mmap);
1806err_iomap0:
1807 pci_release_region(pdev, 0);
1808err_req_region0:
1809err_set_dma_mask:
1810 pci_disable_device(pdev);
1811err_enable_dev:
1812 pci_set_drvdata(pdev, NULL);
1813 return ret;
1814}
1815
1816/*
1817 * This function cleans up the allocated card buffers.
1818 *
1819 * The following are freed by this function -
1820 * - TXBD ring buffers
1821 * - RXBD ring buffers
1822 * - Event BD ring buffers
1823 * - Command response ring buffer
1824 * - Sleep cookie buffer
1825 */
1826static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
1827{
1828 struct pcie_service_card *card = adapter->card;
1829 struct pci_dev *pdev = card->dev;
1830
1831 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
1832 mwifiex_pcie_delete_cmdrsp_buf(adapter);
1833 mwifiex_pcie_delete_evtbd_ring(adapter);
1834 mwifiex_pcie_delete_rxbd_ring(adapter);
1835 mwifiex_pcie_delete_txbd_ring(adapter);
1836 card->cmdrsp_buf = NULL;
1837
1838 dev_dbg(adapter->dev, "Clearing driver ready signature\n");
1839 if (user_rmmod) {
1840 if (mwifiex_write_reg(adapter, REG_DRV_READY, 0x00000000))
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001841 dev_err(adapter->dev,
1842 "Failed to write driver not-ready signature\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001843 }
1844
1845 if (pdev) {
1846 pci_iounmap(pdev, card->pci_mmap);
1847 pci_iounmap(pdev, card->pci_mmap1);
1848
1849 pci_release_regions(pdev);
1850 pci_disable_device(pdev);
1851 pci_set_drvdata(pdev, NULL);
1852 }
1853}
1854
1855/*
1856 * This function registers the PCIE device.
1857 *
1858 * PCIE IRQ is claimed, block size is set and driver data is initialized.
1859 */
1860static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
1861{
1862 int ret;
1863 struct pcie_service_card *card = adapter->card;
1864 struct pci_dev *pdev = card->dev;
1865
1866 /* save adapter pointer in card */
1867 card->adapter = adapter;
1868
1869 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
1870 "MRVL_PCIE", pdev);
1871 if (ret) {
1872 pr_err("request_irq failed: ret=%d\n", ret);
1873 adapter->card = NULL;
1874 return -1;
1875 }
1876
1877 adapter->dev = &pdev->dev;
1878 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
1879
1880 return 0;
1881}
1882
1883/*
1884 * This function unregisters the PCIE device.
1885 *
1886 * The PCIE IRQ is released, the function is disabled and driver
1887 * data is set to null.
1888 */
1889static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
1890{
1891 struct pcie_service_card *card = adapter->card;
1892
1893 if (card) {
1894 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
1895 free_irq(card->dev->irq, card->dev);
1896 }
1897}
1898
1899static struct mwifiex_if_ops pcie_ops = {
1900 .init_if = mwifiex_pcie_init,
1901 .cleanup_if = mwifiex_pcie_cleanup,
1902 .check_fw_status = mwifiex_check_fw_status,
1903 .prog_fw = mwifiex_prog_fw_w_helper,
1904 .register_dev = mwifiex_register_dev,
1905 .unregister_dev = mwifiex_unregister_dev,
1906 .enable_int = mwifiex_pcie_enable_host_int,
1907 .process_int_status = mwifiex_process_int_status,
1908 .host_to_card = mwifiex_pcie_host_to_card,
1909 .wakeup = mwifiex_pm_wakeup_card,
1910 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
1911
1912 /* PCIE specific */
1913 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
1914 .event_complete = mwifiex_pcie_event_complete,
1915 .update_mp_end_port = NULL,
1916 .cleanup_mpa_buf = NULL,
Avinash Patilc6d1d872013-01-03 21:21:29 -08001917 .init_fw_port = mwifiex_pcie_init_fw_port,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001918};
1919
1920/*
1921 * This function initializes the PCIE driver module.
1922 *
1923 * This initiates the semaphore and registers the device with
1924 * PCIE bus.
1925 */
1926static int mwifiex_pcie_init_module(void)
1927{
1928 int ret;
1929
1930 pr_debug("Marvell 8766 PCIe Driver\n");
1931
1932 sema_init(&add_remove_card_sem, 1);
1933
1934 /* Clear the flag in case user removes the card. */
1935 user_rmmod = 0;
1936
1937 ret = pci_register_driver(&mwifiex_pcie);
1938 if (ret)
1939 pr_err("Driver register failed!\n");
1940 else
1941 pr_debug("info: Driver registered successfully!\n");
1942
1943 return ret;
1944}
1945
1946/*
1947 * This function cleans up the PCIE driver.
1948 *
1949 * The following major steps are followed for cleanup -
1950 * - Resume the device if its suspended
1951 * - Disconnect the device if connected
1952 * - Shutdown the firmware
1953 * - Unregister the device from PCIE bus.
1954 */
1955static void mwifiex_pcie_cleanup_module(void)
1956{
1957 if (!down_interruptible(&add_remove_card_sem))
1958 up(&add_remove_card_sem);
1959
1960 /* Set the flag as user is removing this module. */
1961 user_rmmod = 1;
1962
1963 pci_unregister_driver(&mwifiex_pcie);
1964}
1965
1966module_init(mwifiex_pcie_init_module);
1967module_exit(mwifiex_pcie_cleanup_module);
1968
1969MODULE_AUTHOR("Marvell International Ltd.");
1970MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
1971MODULE_VERSION(PCIE_VERSION);
1972MODULE_LICENSE("GPL v2");
1973MODULE_FIRMWARE("mrvl/pcie8766_uapsta.bin");