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