blob: 4a57eb45f9a85361206fa244874a1c908d2548a0 [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;
Amitkumar Karward930fae2011-10-11 17:41:21 -070039
Avinash Patilfc331462013-01-03 21:21:30 -080040static int
41mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
42 int size, int flags)
Amitkumar Karward930fae2011-10-11 17:41:21 -070043{
Avinash Patilfc331462013-01-03 21:21:30 -080044 struct pcie_service_card *card = adapter->card;
45 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -070046
Avinash Patilfc331462013-01-03 21:21:30 -080047 buf_pa = pci_map_single(card->dev, skb->data, size, flags);
48 if (pci_dma_mapping_error(card->dev, buf_pa)) {
49 dev_err(adapter->dev, "failed to map pci memory!\n");
50 return -1;
51 }
52 memcpy(skb->cb, &buf_pa, sizeof(dma_addr_t));
53 return 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -070054}
55
56/*
57 * This function reads sleep cookie and checks if FW is ready
58 */
59static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
60{
61 u32 *cookie_addr;
62 struct pcie_service_card *card = adapter->card;
Avinash Patil52301a82013-02-12 14:38:32 -080063 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
64
65 if (!reg->sleep_cookie)
66 return true;
Amitkumar Karward930fae2011-10-11 17:41:21 -070067
Avinash Patilfc331462013-01-03 21:21:30 -080068 if (card->sleep_cookie_vbase) {
69 cookie_addr = (u32 *)card->sleep_cookie_vbase;
Amitkumar Karward930fae2011-10-11 17:41:21 -070070 dev_dbg(adapter->dev, "info: ACCESS_HW: sleep cookie=0x%x\n",
71 *cookie_addr);
72 if (*cookie_addr == FW_AWAKE_COOKIE)
73 return true;
74 }
75
76 return false;
77}
78
Shuah Khan3266d732013-07-03 10:47:10 -060079#ifdef CONFIG_PM_SLEEP
Amitkumar Karward930fae2011-10-11 17:41:21 -070080/*
Bing Zhaofcca8d52013-03-04 16:27:53 -080081 * Kernel needs to suspend all functions separately. Therefore all
82 * registered functions must have drivers with suspend and resume
83 * methods. Failing that the kernel simply removes the whole card.
84 *
85 * If already not suspended, this function allocates and sends a host
86 * sleep activate request to the firmware and turns off the traffic.
87 */
Shuah Khan3266d732013-07-03 10:47:10 -060088static int mwifiex_pcie_suspend(struct device *dev)
Bing Zhaofcca8d52013-03-04 16:27:53 -080089{
90 struct mwifiex_adapter *adapter;
91 struct pcie_service_card *card;
92 int hs_actived;
Shuah Khan3266d732013-07-03 10:47:10 -060093 struct pci_dev *pdev = to_pci_dev(dev);
Bing Zhaofcca8d52013-03-04 16:27:53 -080094
95 if (pdev) {
96 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
97 if (!card || !card->adapter) {
98 pr_err("Card or adapter structure is not valid\n");
99 return 0;
100 }
101 } else {
102 pr_err("PCIE device is not specified\n");
103 return 0;
104 }
105
106 adapter = card->adapter;
107
108 hs_actived = mwifiex_enable_hs(adapter);
109
110 /* Indicate device suspended */
111 adapter->is_suspended = true;
112
113 return 0;
114}
115
116/*
117 * Kernel needs to suspend all functions separately. Therefore all
118 * registered functions must have drivers with suspend and resume
119 * methods. Failing that the kernel simply removes the whole card.
120 *
121 * If already not resumed, this function turns on the traffic and
122 * sends a host sleep cancel request to the firmware.
123 */
Shuah Khan3266d732013-07-03 10:47:10 -0600124static int mwifiex_pcie_resume(struct device *dev)
Bing Zhaofcca8d52013-03-04 16:27:53 -0800125{
126 struct mwifiex_adapter *adapter;
127 struct pcie_service_card *card;
Shuah Khan3266d732013-07-03 10:47:10 -0600128 struct pci_dev *pdev = to_pci_dev(dev);
Bing Zhaofcca8d52013-03-04 16:27:53 -0800129
130 if (pdev) {
131 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
132 if (!card || !card->adapter) {
133 pr_err("Card or adapter structure is not valid\n");
134 return 0;
135 }
136 } else {
137 pr_err("PCIE device is not specified\n");
138 return 0;
139 }
140
141 adapter = card->adapter;
142
143 if (!adapter->is_suspended) {
144 dev_warn(adapter->dev, "Device already resumed\n");
145 return 0;
146 }
147
148 adapter->is_suspended = false;
149
150 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
151 MWIFIEX_ASYNC_CMD);
152
153 return 0;
154}
Bing Zhao8509e822013-03-04 16:27:54 -0800155#endif
Bing Zhaofcca8d52013-03-04 16:27:53 -0800156
157/*
Amitkumar Karward930fae2011-10-11 17:41:21 -0700158 * This function probes an mwifiex device and registers it. It allocates
159 * the card structure, enables PCIE function number and initiates the
160 * device registration and initialization procedure by adding a logical
161 * interface.
162 */
163static int mwifiex_pcie_probe(struct pci_dev *pdev,
164 const struct pci_device_id *ent)
165{
166 struct pcie_service_card *card;
167
168 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700169 pdev->vendor, pdev->device, pdev->revision);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700170
171 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
Joe Perchese404dec2012-01-29 12:56:23 +0000172 if (!card)
Amitkumar Karward930fae2011-10-11 17:41:21 -0700173 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700174
175 card->dev = pdev;
176
Avinash Patildd04e6a2013-02-08 18:18:06 -0800177 if (ent->driver_data) {
178 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
179 card->pcie.firmware = data->firmware;
180 card->pcie.reg = data->reg;
181 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
182 }
183
Amitkumar Karward930fae2011-10-11 17:41:21 -0700184 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
185 MWIFIEX_PCIE)) {
186 pr_err("%s failed\n", __func__);
187 kfree(card);
188 return -1;
189 }
190
191 return 0;
192}
193
194/*
195 * This function removes the interface and frees up the card structure.
196 */
197static void mwifiex_pcie_remove(struct pci_dev *pdev)
198{
199 struct pcie_service_card *card;
200 struct mwifiex_adapter *adapter;
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700201 struct mwifiex_private *priv;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700202 int i;
203
204 card = pci_get_drvdata(pdev);
205 if (!card)
206 return;
207
208 adapter = card->adapter;
209 if (!adapter || !adapter->priv_num)
210 return;
211
Amitkumar Karwar59a4cc22012-04-09 20:06:57 -0700212 /* In case driver is removed when asynchronous FW load is in progress */
213 wait_for_completion(&adapter->fw_load);
214
Amitkumar Karward930fae2011-10-11 17:41:21 -0700215 if (user_rmmod) {
Shuah Khan3266d732013-07-03 10:47:10 -0600216#ifdef CONFIG_PM_SLEEP
Amitkumar Karward930fae2011-10-11 17:41:21 -0700217 if (adapter->is_suspended)
Shuah Khan3266d732013-07-03 10:47:10 -0600218 mwifiex_pcie_resume(&pdev->dev);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700219#endif
220
221 for (i = 0; i < adapter->priv_num; i++)
222 if ((GET_BSS_ROLE(adapter->priv[i]) ==
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700223 MWIFIEX_BSS_ROLE_STA) &&
224 adapter->priv[i]->media_connected)
Amitkumar Karward930fae2011-10-11 17:41:21 -0700225 mwifiex_deauthenticate(adapter->priv[i], NULL);
226
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700227 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700228
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700229 mwifiex_disable_auto_ds(priv);
230
231 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700232 }
233
234 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
235 kfree(card);
236}
237
Amitkumar Karward930fae2011-10-11 17:41:21 -0700238static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
239 {
240 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
241 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
Avinash Patildd04e6a2013-02-08 18:18:06 -0800242 .driver_data = (unsigned long) &mwifiex_pcie8766,
Amitkumar Karward930fae2011-10-11 17:41:21 -0700243 },
Avinash Patilca8f2112013-02-08 18:18:09 -0800244 {
245 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
246 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
247 .driver_data = (unsigned long) &mwifiex_pcie8897,
248 },
Amitkumar Karward930fae2011-10-11 17:41:21 -0700249 {},
250};
251
252MODULE_DEVICE_TABLE(pci, mwifiex_ids);
253
Shuah Khan3266d732013-07-03 10:47:10 -0600254#ifdef CONFIG_PM_SLEEP
255/* Power Management Hooks */
256static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
257 mwifiex_pcie_resume);
258#endif
259
Amitkumar Karward930fae2011-10-11 17:41:21 -0700260/* PCI Device Driver */
261static struct pci_driver __refdata mwifiex_pcie = {
262 .name = "mwifiex_pcie",
263 .id_table = mwifiex_ids,
264 .probe = mwifiex_pcie_probe,
265 .remove = mwifiex_pcie_remove,
Shuah Khan3266d732013-07-03 10:47:10 -0600266#ifdef CONFIG_PM_SLEEP
267 .driver = {
268 .pm = &mwifiex_pcie_pm_ops,
269 },
Amitkumar Karward930fae2011-10-11 17:41:21 -0700270#endif
271};
272
273/*
274 * This function writes data into PCIE card register.
275 */
276static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
277{
278 struct pcie_service_card *card = adapter->card;
279
280 iowrite32(data, card->pci_mmap1 + reg);
281
282 return 0;
283}
284
285/*
286 * This function reads data from PCIE card register.
287 */
288static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
289{
290 struct pcie_service_card *card = adapter->card;
291
292 *data = ioread32(card->pci_mmap1 + reg);
293
294 return 0;
295}
296
297/*
Avinash Patilc0880a22013-03-22 21:49:07 -0700298 * This function adds delay loop to ensure FW is awake before proceeding.
Amitkumar Karward930fae2011-10-11 17:41:21 -0700299 */
Avinash Patilc0880a22013-03-22 21:49:07 -0700300static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
Amitkumar Karward930fae2011-10-11 17:41:21 -0700301{
302 int i = 0;
303
Avinash Patilc0880a22013-03-22 21:49:07 -0700304 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
Amitkumar Karward930fae2011-10-11 17:41:21 -0700305 i++;
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -0700306 usleep_range(10, 20);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700307 /* 50ms max wait */
Avinash Patil3e7a4ff2013-02-25 16:01:34 -0800308 if (i == 5000)
Amitkumar Karward930fae2011-10-11 17:41:21 -0700309 break;
310 }
311
Avinash Patilc0880a22013-03-22 21:49:07 -0700312 return;
313}
314
315/* This function wakes up the card by reading fw_status register. */
316static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
317{
318 u32 fw_status;
319 struct pcie_service_card *card = adapter->card;
320 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
321
Amitkumar Karward930fae2011-10-11 17:41:21 -0700322 dev_dbg(adapter->dev, "event: Wakeup device...\n");
323
Avinash Patilc0880a22013-03-22 21:49:07 -0700324 if (reg->sleep_cookie)
325 mwifiex_pcie_dev_wakeup_delay(adapter);
326
327 /* Reading fw_status register will wakeup device */
328 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status)) {
329 dev_warn(adapter->dev, "Reading fw_status register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700330 return -1;
331 }
332
Avinash Patilc0880a22013-03-22 21:49:07 -0700333 if (reg->sleep_cookie) {
334 mwifiex_pcie_dev_wakeup_delay(adapter);
335 dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
336 adapter->ps_state = PS_STATE_AWAKE;
337 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700338
339 return 0;
340}
341
342/*
343 * This function is called after the card has woken up.
344 *
345 * The card configuration register is reset.
346 */
347static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
348{
349 dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
350
351 return 0;
352}
353
354/*
355 * This function disables the host interrupt.
356 *
357 * The host interrupt mask is read, the disable bit is reset and
358 * written back to the card host interrupt mask register.
359 */
360static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
361{
362 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
363 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
364 0x00000000)) {
365 dev_warn(adapter->dev, "Disable host interrupt failed\n");
366 return -1;
367 }
368 }
369
370 return 0;
371}
372
373/*
374 * This function enables the host interrupt.
375 *
376 * The host interrupt enable mask is written to the card
377 * host interrupt mask register.
378 */
379static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
380{
381 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
382 /* Simply write the mask to the register */
383 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
384 HOST_INTR_MASK)) {
385 dev_warn(adapter->dev, "Enable host interrupt failed\n");
386 return -1;
387 }
388 }
389
390 return 0;
391}
392
393/*
Avinash Patil07324842013-02-08 18:18:07 -0800394 * This function initializes TX buffer ring descriptors
395 */
396static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
397{
398 struct pcie_service_card *card = adapter->card;
Avinash Patilca8f2112013-02-08 18:18:09 -0800399 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patil07324842013-02-08 18:18:07 -0800400 struct mwifiex_pcie_buf_desc *desc;
Avinash Patilca8f2112013-02-08 18:18:09 -0800401 struct mwifiex_pfu_buf_desc *desc2;
Avinash Patil07324842013-02-08 18:18:07 -0800402 int i;
403
404 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
405 card->tx_buf_list[i] = NULL;
Avinash Patilca8f2112013-02-08 18:18:09 -0800406 if (reg->pfu_enabled) {
407 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
408 (sizeof(*desc2) * i);
409 desc2 = card->txbd_ring[i];
410 memset(desc2, 0, sizeof(*desc2));
411 } else {
412 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
413 (sizeof(*desc) * i);
414 desc = card->txbd_ring[i];
415 memset(desc, 0, sizeof(*desc));
416 }
Avinash Patil07324842013-02-08 18:18:07 -0800417 }
418
419 return 0;
420}
421
422/* This function initializes RX buffer ring descriptors. Each SKB is allocated
423 * here and after mapping PCI memory, its physical address is assigned to
424 * PCIE Rx buffer descriptor's physical address.
425 */
426static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
427{
428 struct pcie_service_card *card = adapter->card;
Avinash Patilca8f2112013-02-08 18:18:09 -0800429 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patil07324842013-02-08 18:18:07 -0800430 struct sk_buff *skb;
431 struct mwifiex_pcie_buf_desc *desc;
Avinash Patilca8f2112013-02-08 18:18:09 -0800432 struct mwifiex_pfu_buf_desc *desc2;
Avinash Patil07324842013-02-08 18:18:07 -0800433 dma_addr_t buf_pa;
434 int i;
435
436 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
437 /* Allocate skb here so that firmware can DMA data from it */
438 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
439 if (!skb) {
440 dev_err(adapter->dev,
441 "Unable to allocate skb for RX ring.\n");
442 kfree(card->rxbd_ring_vbase);
443 return -ENOMEM;
444 }
445
446 if (mwifiex_map_pci_memory(adapter, skb,
447 MWIFIEX_RX_DATA_BUF_SIZE,
448 PCI_DMA_FROMDEVICE))
449 return -1;
450
451 MWIFIEX_SKB_PACB(skb, &buf_pa);
452
453 dev_dbg(adapter->dev,
454 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
455 skb, skb->len, skb->data, (u32)buf_pa,
456 (u32)((u64)buf_pa >> 32));
457
458 card->rx_buf_list[i] = skb;
Avinash Patilca8f2112013-02-08 18:18:09 -0800459 if (reg->pfu_enabled) {
460 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
461 (sizeof(*desc2) * i);
462 desc2 = card->rxbd_ring[i];
463 desc2->paddr = buf_pa;
464 desc2->len = (u16)skb->len;
465 desc2->frag_len = (u16)skb->len;
466 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
467 desc2->offset = 0;
468 } else {
469 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
470 (sizeof(*desc) * i));
471 desc = card->rxbd_ring[i];
472 desc->paddr = buf_pa;
473 desc->len = (u16)skb->len;
474 desc->flags = 0;
475 }
Avinash Patil07324842013-02-08 18:18:07 -0800476 }
477
478 return 0;
479}
480
481/* This function initializes event buffer ring descriptors. Each SKB is
482 * allocated here and after mapping PCI memory, its physical address is assigned
483 * to PCIE Rx buffer descriptor's physical address
484 */
485static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
486{
487 struct pcie_service_card *card = adapter->card;
Avinash Patile05dc3e2013-02-08 18:18:08 -0800488 struct mwifiex_evt_buf_desc *desc;
Avinash Patil07324842013-02-08 18:18:07 -0800489 struct sk_buff *skb;
490 dma_addr_t buf_pa;
491 int i;
492
493 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
494 /* Allocate skb here so that firmware can DMA data from it */
495 skb = dev_alloc_skb(MAX_EVENT_SIZE);
496 if (!skb) {
497 dev_err(adapter->dev,
498 "Unable to allocate skb for EVENT buf.\n");
499 kfree(card->evtbd_ring_vbase);
500 return -ENOMEM;
501 }
502 skb_put(skb, MAX_EVENT_SIZE);
503
504 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
505 PCI_DMA_FROMDEVICE))
506 return -1;
507
508 MWIFIEX_SKB_PACB(skb, &buf_pa);
509
510 dev_dbg(adapter->dev,
511 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
512 skb, skb->len, skb->data, (u32)buf_pa,
513 (u32)((u64)buf_pa >> 32));
514
515 card->evt_buf_list[i] = skb;
516 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
517 (sizeof(*desc) * i));
Avinash Patil07324842013-02-08 18:18:07 -0800518 desc = card->evtbd_ring[i];
519 desc->paddr = buf_pa;
520 desc->len = (u16)skb->len;
521 desc->flags = 0;
522 }
523
524 return 0;
525}
526
527/* This function cleans up TX buffer rings. If any of the buffer list has valid
528 * SKB address, associated SKB is freed.
529 */
530static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
531{
532 struct pcie_service_card *card = adapter->card;
Avinash Patilca8f2112013-02-08 18:18:09 -0800533 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patil07324842013-02-08 18:18:07 -0800534 struct sk_buff *skb;
535 struct mwifiex_pcie_buf_desc *desc;
Avinash Patilca8f2112013-02-08 18:18:09 -0800536 struct mwifiex_pfu_buf_desc *desc2;
Avinash Patil07324842013-02-08 18:18:07 -0800537 int i;
538
539 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
Avinash Patilca8f2112013-02-08 18:18:09 -0800540 if (reg->pfu_enabled) {
541 desc2 = card->txbd_ring[i];
542 if (card->tx_buf_list[i]) {
543 skb = card->tx_buf_list[i];
544 pci_unmap_single(card->dev, desc2->paddr,
545 skb->len, PCI_DMA_TODEVICE);
546 dev_kfree_skb_any(skb);
547 }
548 memset(desc2, 0, sizeof(*desc2));
549 } else {
550 desc = card->txbd_ring[i];
551 if (card->tx_buf_list[i]) {
552 skb = card->tx_buf_list[i];
553 pci_unmap_single(card->dev, desc->paddr,
554 skb->len, PCI_DMA_TODEVICE);
555 dev_kfree_skb_any(skb);
556 }
557 memset(desc, 0, sizeof(*desc));
Avinash Patil07324842013-02-08 18:18:07 -0800558 }
559 card->tx_buf_list[i] = NULL;
Avinash Patil07324842013-02-08 18:18:07 -0800560 }
561
562 return;
563}
564
565/* This function cleans up RX buffer rings. If any of the buffer list has valid
566 * SKB address, associated SKB is freed.
567 */
568static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
569{
570 struct pcie_service_card *card = adapter->card;
Avinash Patilca8f2112013-02-08 18:18:09 -0800571 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patil07324842013-02-08 18:18:07 -0800572 struct mwifiex_pcie_buf_desc *desc;
Avinash Patilca8f2112013-02-08 18:18:09 -0800573 struct mwifiex_pfu_buf_desc *desc2;
Avinash Patil07324842013-02-08 18:18:07 -0800574 struct sk_buff *skb;
575 int i;
576
577 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
Avinash Patilca8f2112013-02-08 18:18:09 -0800578 if (reg->pfu_enabled) {
579 desc2 = card->rxbd_ring[i];
580 if (card->rx_buf_list[i]) {
581 skb = card->rx_buf_list[i];
582 pci_unmap_single(card->dev, desc2->paddr,
Avinash Patild033d3a2013-04-19 17:44:42 -0700583 skb->len, PCI_DMA_FROMDEVICE);
Avinash Patilca8f2112013-02-08 18:18:09 -0800584 dev_kfree_skb_any(skb);
585 }
586 memset(desc2, 0, sizeof(*desc2));
587 } else {
588 desc = card->rxbd_ring[i];
589 if (card->rx_buf_list[i]) {
590 skb = card->rx_buf_list[i];
591 pci_unmap_single(card->dev, desc->paddr,
Avinash Patild033d3a2013-04-19 17:44:42 -0700592 skb->len, PCI_DMA_FROMDEVICE);
Avinash Patilca8f2112013-02-08 18:18:09 -0800593 dev_kfree_skb_any(skb);
594 }
595 memset(desc, 0, sizeof(*desc));
Avinash Patil07324842013-02-08 18:18:07 -0800596 }
Avinash Patilca8f2112013-02-08 18:18:09 -0800597 card->rx_buf_list[i] = NULL;
Avinash Patil07324842013-02-08 18:18:07 -0800598 }
599
600 return;
601}
602
603/* This function cleans up event buffer rings. If any of the buffer list has
604 * valid SKB address, associated SKB is freed.
605 */
606static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
607{
608 struct pcie_service_card *card = adapter->card;
Avinash Patile05dc3e2013-02-08 18:18:08 -0800609 struct mwifiex_evt_buf_desc *desc;
Avinash Patil07324842013-02-08 18:18:07 -0800610 struct sk_buff *skb;
611 int i;
612
613 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
614 desc = card->evtbd_ring[i];
615 if (card->evt_buf_list[i]) {
616 skb = card->evt_buf_list[i];
617 pci_unmap_single(card->dev, desc->paddr, MAX_EVENT_SIZE,
618 PCI_DMA_FROMDEVICE);
619 dev_kfree_skb_any(skb);
620 }
621 card->evt_buf_list[i] = NULL;
622 memset(desc, 0, sizeof(*desc));
623 }
624
625 return;
626}
627
628/* This function creates buffer descriptor ring for TX
Amitkumar Karward930fae2011-10-11 17:41:21 -0700629 */
630static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
631{
632 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800633 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700634
635 /*
636 * driver maintaines the write pointer and firmware maintaines the read
637 * pointer. The write pointer starts at 0 (zero) while the read pointer
638 * starts at zero with rollover bit set
639 */
640 card->txbd_wrptr = 0;
Avinash Patilca8f2112013-02-08 18:18:09 -0800641
642 if (reg->pfu_enabled)
643 card->txbd_rdptr = 0;
644 else
645 card->txbd_rdptr |= reg->tx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700646
647 /* allocate shared memory for the BD ring and divide the same in to
648 several descriptors */
Avinash Patilca8f2112013-02-08 18:18:09 -0800649 if (reg->pfu_enabled)
650 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
651 MWIFIEX_MAX_TXRX_BD;
652 else
653 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
654 MWIFIEX_MAX_TXRX_BD;
655
Amitkumar Karward930fae2011-10-11 17:41:21 -0700656 dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700657 card->txbd_ring_size);
Avinash Patilfc331462013-01-03 21:21:30 -0800658 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
659 card->txbd_ring_size,
660 &card->txbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700661 if (!card->txbd_ring_vbase) {
Avinash Patilfc331462013-01-03 21:21:30 -0800662 dev_err(adapter->dev,
663 "allocate consistent memory (%d bytes) failed!\n",
664 card->txbd_ring_size);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800665 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700666 }
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700667 dev_dbg(adapter->dev,
668 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
Avinash Patilfc331462013-01-03 21:21:30 -0800669 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700670 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700671
Avinash Patil07324842013-02-08 18:18:07 -0800672 return mwifiex_init_txq_ring(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700673}
674
675static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
676{
677 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800678 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700679
Avinash Patil07324842013-02-08 18:18:07 -0800680 mwifiex_cleanup_txq_ring(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700681
Avinash Patilfc331462013-01-03 21:21:30 -0800682 if (card->txbd_ring_vbase)
683 pci_free_consistent(card->dev, card->txbd_ring_size,
684 card->txbd_ring_vbase,
685 card->txbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700686 card->txbd_ring_size = 0;
687 card->txbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800688 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700689 card->txbd_ring_vbase = NULL;
Avinash Patilfc331462013-01-03 21:21:30 -0800690 card->txbd_ring_pbase = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700691
692 return 0;
693}
694
695/*
696 * This function creates buffer descriptor ring for RX
697 */
698static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
699{
700 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800701 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700702
703 /*
704 * driver maintaines the read pointer and firmware maintaines the write
705 * pointer. The write pointer starts at 0 (zero) while the read pointer
706 * starts at zero with rollover bit set
707 */
708 card->rxbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800709 card->rxbd_rdptr = reg->rx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700710
Avinash Patilca8f2112013-02-08 18:18:09 -0800711 if (reg->pfu_enabled)
712 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
713 MWIFIEX_MAX_TXRX_BD;
714 else
715 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
716 MWIFIEX_MAX_TXRX_BD;
717
Amitkumar Karward930fae2011-10-11 17:41:21 -0700718 dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700719 card->rxbd_ring_size);
Avinash Patilfc331462013-01-03 21:21:30 -0800720 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
721 card->rxbd_ring_size,
722 &card->rxbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700723 if (!card->rxbd_ring_vbase) {
Avinash Patilfc331462013-01-03 21:21:30 -0800724 dev_err(adapter->dev,
725 "allocate consistent memory (%d bytes) failed!\n",
726 card->rxbd_ring_size);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800727 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700728 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700729
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700730 dev_dbg(adapter->dev,
731 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
732 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
733 (u32)((u64)card->rxbd_ring_pbase >> 32),
734 card->rxbd_ring_size);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700735
Avinash Patil07324842013-02-08 18:18:07 -0800736 return mwifiex_init_rxq_ring(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700737}
738
739/*
740 * This function deletes Buffer descriptor ring for RX
741 */
742static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
743{
744 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800745 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700746
Avinash Patil07324842013-02-08 18:18:07 -0800747 mwifiex_cleanup_rxq_ring(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700748
Avinash Patilfc331462013-01-03 21:21:30 -0800749 if (card->rxbd_ring_vbase)
750 pci_free_consistent(card->dev, card->rxbd_ring_size,
751 card->rxbd_ring_vbase,
752 card->rxbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700753 card->rxbd_ring_size = 0;
754 card->rxbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800755 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700756 card->rxbd_ring_vbase = NULL;
Avinash Patilfc331462013-01-03 21:21:30 -0800757 card->rxbd_ring_pbase = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700758
759 return 0;
760}
761
762/*
763 * This function creates buffer descriptor ring for Events
764 */
765static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
766{
767 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800768 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700769
770 /*
771 * driver maintaines the read pointer and firmware maintaines the write
772 * pointer. The write pointer starts at 0 (zero) while the read pointer
773 * starts at zero with rollover bit set
774 */
775 card->evtbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800776 card->evtbd_rdptr = reg->evt_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700777
Avinash Patile05dc3e2013-02-08 18:18:08 -0800778 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
Avinash Patilca8f2112013-02-08 18:18:09 -0800779 MWIFIEX_MAX_EVT_BD;
780
Amitkumar Karward930fae2011-10-11 17:41:21 -0700781 dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700782 card->evtbd_ring_size);
Avinash Patilfc331462013-01-03 21:21:30 -0800783 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
784 card->evtbd_ring_size,
785 &card->evtbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700786 if (!card->evtbd_ring_vbase) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700787 dev_err(adapter->dev,
Avinash Patilfc331462013-01-03 21:21:30 -0800788 "allocate consistent memory (%d bytes) failed!\n",
789 card->evtbd_ring_size);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800790 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700791 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700792
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700793 dev_dbg(adapter->dev,
794 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
795 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
796 (u32)((u64)card->evtbd_ring_pbase >> 32),
797 card->evtbd_ring_size);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700798
Avinash Patil07324842013-02-08 18:18:07 -0800799 return mwifiex_pcie_init_evt_ring(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700800}
801
802/*
803 * This function deletes Buffer descriptor ring for Events
804 */
805static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
806{
807 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800808 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700809
Avinash Patil07324842013-02-08 18:18:07 -0800810 mwifiex_cleanup_evt_ring(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700811
Avinash Patilfc331462013-01-03 21:21:30 -0800812 if (card->evtbd_ring_vbase)
813 pci_free_consistent(card->dev, card->evtbd_ring_size,
814 card->evtbd_ring_vbase,
815 card->evtbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700816 card->evtbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800817 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700818 card->evtbd_ring_size = 0;
819 card->evtbd_ring_vbase = NULL;
Avinash Patilfc331462013-01-03 21:21:30 -0800820 card->evtbd_ring_pbase = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700821
822 return 0;
823}
824
825/*
826 * This function allocates a buffer for CMDRSP
827 */
828static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
829{
830 struct pcie_service_card *card = adapter->card;
831 struct sk_buff *skb;
832
833 /* Allocate memory for receiving command response data */
834 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
835 if (!skb) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700836 dev_err(adapter->dev,
837 "Unable to allocate skb for command response data.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700838 return -ENOMEM;
839 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700840 skb_put(skb, MWIFIEX_UPLD_SIZE);
Avinash Patilfc331462013-01-03 21:21:30 -0800841 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
842 PCI_DMA_FROMDEVICE))
843 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700844
Avinash Patilfc331462013-01-03 21:21:30 -0800845 card->cmdrsp_buf = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700846
847 return 0;
848}
849
850/*
851 * This function deletes a buffer for CMDRSP
852 */
853static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
854{
855 struct pcie_service_card *card;
Avinash Patilfc331462013-01-03 21:21:30 -0800856 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700857
858 if (!adapter)
859 return 0;
860
861 card = adapter->card;
862
Avinash Patilfc331462013-01-03 21:21:30 -0800863 if (card && card->cmdrsp_buf) {
864 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &buf_pa);
865 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
866 PCI_DMA_FROMDEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700867 dev_kfree_skb_any(card->cmdrsp_buf);
Avinash Patilfc331462013-01-03 21:21:30 -0800868 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700869
Avinash Patilfc331462013-01-03 21:21:30 -0800870 if (card && card->cmd_buf) {
871 MWIFIEX_SKB_PACB(card->cmd_buf, &buf_pa);
Yogesh Ashok Powar7af1ce02013-04-23 16:49:50 -0700872 pci_unmap_single(card->dev, buf_pa, card->cmd_buf->len,
Avinash Patilfc331462013-01-03 21:21:30 -0800873 PCI_DMA_TODEVICE);
Avinash Patilfc331462013-01-03 21:21:30 -0800874 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700875 return 0;
876}
877
878/*
879 * This function allocates a buffer for sleep cookie
880 */
881static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
882{
Amitkumar Karward930fae2011-10-11 17:41:21 -0700883 struct pcie_service_card *card = adapter->card;
884
Avinash Patilfc331462013-01-03 21:21:30 -0800885 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
886 &card->sleep_cookie_pbase);
887 if (!card->sleep_cookie_vbase) {
888 dev_err(adapter->dev, "pci_alloc_consistent failed!\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700889 return -ENOMEM;
890 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700891 /* Init val of Sleep Cookie */
Avinash Patilfc331462013-01-03 21:21:30 -0800892 *(u32 *)card->sleep_cookie_vbase = FW_AWAKE_COOKIE;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700893
894 dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
Avinash Patilfc331462013-01-03 21:21:30 -0800895 *((u32 *)card->sleep_cookie_vbase));
Amitkumar Karward930fae2011-10-11 17:41:21 -0700896
897 return 0;
898}
899
900/*
901 * This function deletes buffer for sleep cookie
902 */
903static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
904{
905 struct pcie_service_card *card;
906
907 if (!adapter)
908 return 0;
909
910 card = adapter->card;
911
Avinash Patilfc331462013-01-03 21:21:30 -0800912 if (card && card->sleep_cookie_vbase) {
913 pci_free_consistent(card->dev, sizeof(u32),
914 card->sleep_cookie_vbase,
915 card->sleep_cookie_pbase);
916 card->sleep_cookie_vbase = NULL;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700917 }
918
919 return 0;
920}
921
Avinash Patilfbd7e7a2013-01-03 21:21:31 -0800922/* This function flushes the TX buffer descriptor ring
923 * This function defined as handler is also called while cleaning TXRX
924 * during disconnect/ bss stop.
925 */
926static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
927{
928 struct pcie_service_card *card = adapter->card;
Avinash Patilfbd7e7a2013-01-03 21:21:31 -0800929
Avinash Patil48f4d912013-02-20 21:12:58 -0800930 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
Avinash Patilfbd7e7a2013-01-03 21:21:31 -0800931 card->txbd_flush = 1;
932 /* write pointer already set at last send
933 * send dnld-rdy intr again, wait for completion.
934 */
935 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
936 CPU_INTR_DNLD_RDY)) {
937 dev_err(adapter->dev,
938 "failed to assert dnld-rdy interrupt.\n");
939 return -1;
940 }
941 }
942 return 0;
943}
944
Amitkumar Karward930fae2011-10-11 17:41:21 -0700945/*
Avinash Patile7f767a2013-01-03 21:21:32 -0800946 * This function unmaps and frees downloaded data buffer
Amitkumar Karward930fae2011-10-11 17:41:21 -0700947 */
Avinash Patile7f767a2013-01-03 21:21:32 -0800948static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
Amitkumar Karward930fae2011-10-11 17:41:21 -0700949{
Avinash Patile7f767a2013-01-03 21:21:32 -0800950 struct sk_buff *skb;
951 dma_addr_t buf_pa;
Avinash Patilca8f2112013-02-08 18:18:09 -0800952 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
Avinash Patile05dc3e2013-02-08 18:18:08 -0800953 struct mwifiex_pcie_buf_desc *desc;
Avinash Patilca8f2112013-02-08 18:18:09 -0800954 struct mwifiex_pfu_buf_desc *desc2;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700955 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800956 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700957
958 if (!mwifiex_pcie_ok_to_access_hw(adapter))
959 mwifiex_pm_wakeup_card(adapter);
960
961 /* Read the TX ring read pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -0800962 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700963 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -0800964 "SEND COMP: failed to read reg->tx_rdptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700965 return -1;
966 }
967
Avinash Patile7f767a2013-01-03 21:21:32 -0800968 dev_dbg(adapter->dev, "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
969 card->txbd_rdptr, rdptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700970
Avinash Patilca8f2112013-02-08 18:18:09 -0800971 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
Avinash Patile7f767a2013-01-03 21:21:32 -0800972 /* free from previous txbd_rdptr to current txbd_rdptr */
Avinash Patildd04e6a2013-02-08 18:18:06 -0800973 while (((card->txbd_rdptr & reg->tx_mask) !=
974 (rdptr & reg->tx_mask)) ||
975 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
976 (rdptr & reg->tx_rollover_ind))) {
Avinash Patilca8f2112013-02-08 18:18:09 -0800977 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
978 reg->tx_start_ptr;
Avinash Patile7f767a2013-01-03 21:21:32 -0800979
980 skb = card->tx_buf_list[wrdoneidx];
981 if (skb) {
982 dev_dbg(adapter->dev,
983 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
984 skb, wrdoneidx);
985 MWIFIEX_SKB_PACB(skb, &buf_pa);
986 pci_unmap_single(card->dev, buf_pa, skb->len,
987 PCI_DMA_TODEVICE);
988
989 unmap_count++;
990
991 if (card->txbd_flush)
992 mwifiex_write_data_complete(adapter, skb, 0,
993 -1);
994 else
995 mwifiex_write_data_complete(adapter, skb, 0, 0);
996 }
997
998 card->tx_buf_list[wrdoneidx] = NULL;
Avinash Patilca8f2112013-02-08 18:18:09 -0800999
1000 if (reg->pfu_enabled) {
1001 desc2 = (void *)card->txbd_ring[wrdoneidx];
1002 memset(desc2, 0, sizeof(*desc2));
1003 } else {
1004 desc = card->txbd_ring[wrdoneidx];
1005 memset(desc, 0, sizeof(*desc));
1006 }
1007 switch (card->dev->device) {
1008 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1009 card->txbd_rdptr++;
1010 break;
1011 case PCIE_DEVICE_ID_MARVELL_88W8897:
1012 card->txbd_rdptr += reg->ring_tx_start_ptr;
1013 break;
1014 }
1015
Avinash Patile7f767a2013-01-03 21:21:32 -08001016
Avinash Patildd04e6a2013-02-08 18:18:06 -08001017 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
Avinash Patile7f767a2013-01-03 21:21:32 -08001018 card->txbd_rdptr = ((card->txbd_rdptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -08001019 reg->tx_rollover_ind) ^
1020 reg->tx_rollover_ind);
Avinash Patile7f767a2013-01-03 21:21:32 -08001021 }
1022
1023 if (unmap_count)
1024 adapter->data_sent = false;
1025
1026 if (card->txbd_flush) {
Avinash Patil3d482032013-02-15 21:37:54 -08001027 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
Avinash Patile7f767a2013-01-03 21:21:32 -08001028 card->txbd_flush = 0;
1029 else
1030 mwifiex_clean_pcie_ring_buf(adapter);
1031 }
1032
1033 return 0;
1034}
1035
1036/* This function sends data buffer to device. First 4 bytes of payload
1037 * are filled with payload length and payload type. Then this payload
1038 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1039 * Download ready interrupt to FW is deffered if Tx ring is not full and
1040 * additional payload can be accomodated.
1041 */
1042static int
1043mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1044 struct mwifiex_tx_param *tx_param)
1045{
1046 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001047 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilca8f2112013-02-08 18:18:09 -08001048 u32 wrindx, num_tx_buffs, rx_val;
Avinash Patile7f767a2013-01-03 21:21:32 -08001049 int ret;
1050 dma_addr_t buf_pa;
Bing Zhao99310782013-03-04 16:27:55 -08001051 struct mwifiex_pcie_buf_desc *desc = NULL;
1052 struct mwifiex_pfu_buf_desc *desc2 = NULL;
Avinash Patile7f767a2013-01-03 21:21:32 -08001053 __le16 *tmp;
1054
1055 if (!(skb->data && skb->len)) {
1056 dev_err(adapter->dev, "%s(): invalid parameter <%p, %#x>\n",
1057 __func__, skb->data, skb->len);
1058 return -1;
1059 }
1060
1061 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1062 mwifiex_pm_wakeup_card(adapter);
1063
Avinash Patilca8f2112013-02-08 18:18:09 -08001064 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
Avinash Patile7f767a2013-01-03 21:21:32 -08001065 dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1066 card->txbd_rdptr, card->txbd_wrptr);
1067 if (mwifiex_pcie_txbd_not_full(card)) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001068 u8 *payload;
1069
1070 adapter->data_sent = true;
Avinash Patile7f767a2013-01-03 21:21:32 -08001071 payload = skb->data;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001072 tmp = (__le16 *)&payload[0];
1073 *tmp = cpu_to_le16((u16)skb->len);
1074 tmp = (__le16 *)&payload[2];
1075 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
Avinash Patile7f767a2013-01-03 21:21:32 -08001076
1077 if (mwifiex_map_pci_memory(adapter, skb, skb->len ,
1078 PCI_DMA_TODEVICE))
1079 return -1;
1080
Avinash Patilca8f2112013-02-08 18:18:09 -08001081 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
Avinash Patile7f767a2013-01-03 21:21:32 -08001082 MWIFIEX_SKB_PACB(skb, &buf_pa);
1083 card->tx_buf_list[wrindx] = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001084
Avinash Patilca8f2112013-02-08 18:18:09 -08001085 if (reg->pfu_enabled) {
1086 desc2 = (void *)card->txbd_ring[wrindx];
1087 desc2->paddr = buf_pa;
1088 desc2->len = (u16)skb->len;
1089 desc2->frag_len = (u16)skb->len;
1090 desc2->offset = 0;
1091 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1092 MWIFIEX_BD_FLAG_LAST_DESC;
1093 } else {
1094 desc = card->txbd_ring[wrindx];
1095 desc->paddr = buf_pa;
1096 desc->len = (u16)skb->len;
1097 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1098 MWIFIEX_BD_FLAG_LAST_DESC;
1099 }
1100
1101 switch (card->dev->device) {
1102 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1103 card->txbd_wrptr++;
1104 break;
1105 case PCIE_DEVICE_ID_MARVELL_88W8897:
1106 card->txbd_wrptr += reg->ring_tx_start_ptr;
1107 break;
1108 }
1109
1110 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
Amitkumar Karward930fae2011-10-11 17:41:21 -07001111 card->txbd_wrptr = ((card->txbd_wrptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -08001112 reg->tx_rollover_ind) ^
1113 reg->tx_rollover_ind);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001114
Avinash Patilca8f2112013-02-08 18:18:09 -08001115 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001116 /* Write the TX ring write pointer in to reg->tx_wrptr */
1117 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
Avinash Patilca8f2112013-02-08 18:18:09 -08001118 card->txbd_wrptr | rx_val)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001119 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001120 "SEND DATA: failed to write reg->tx_wrptr\n");
Avinash Patile7f767a2013-01-03 21:21:32 -08001121 ret = -1;
1122 goto done_unmap;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001123 }
Avinash Patile7f767a2013-01-03 21:21:32 -08001124 if ((mwifiex_pcie_txbd_not_full(card)) &&
1125 tx_param->next_pkt_len) {
1126 /* have more packets and TxBD still can hold more */
1127 dev_dbg(adapter->dev,
1128 "SEND DATA: delay dnld-rdy interrupt.\n");
1129 adapter->data_sent = false;
1130 } else {
1131 /* Send the TX ready interrupt */
1132 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1133 CPU_INTR_DNLD_RDY)) {
1134 dev_err(adapter->dev,
1135 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1136 ret = -1;
1137 goto done_unmap;
1138 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001139 }
1140 dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001141 "%#x> and sent packet to firmware successfully\n",
Avinash Patile7f767a2013-01-03 21:21:32 -08001142 card->txbd_rdptr, card->txbd_wrptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001143 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001144 dev_dbg(adapter->dev,
1145 "info: TX Ring full, can't send packets to fw\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001146 adapter->data_sent = true;
1147 /* Send the TX ready interrupt */
1148 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1149 CPU_INTR_DNLD_RDY))
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001150 dev_err(adapter->dev,
1151 "SEND DATA: failed to assert door-bell intr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001152 return -EBUSY;
1153 }
1154
Avinash Patile7f767a2013-01-03 21:21:32 -08001155 return -EINPROGRESS;
1156done_unmap:
1157 MWIFIEX_SKB_PACB(skb, &buf_pa);
1158 pci_unmap_single(card->dev, buf_pa, skb->len, PCI_DMA_TODEVICE);
1159 card->tx_buf_list[wrindx] = NULL;
Avinash Patilca8f2112013-02-08 18:18:09 -08001160 if (reg->pfu_enabled)
1161 memset(desc2, 0, sizeof(*desc2));
1162 else
1163 memset(desc, 0, sizeof(*desc));
1164
Avinash Patile7f767a2013-01-03 21:21:32 -08001165 return ret;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001166}
1167
1168/*
1169 * This function handles received buffer ring and
1170 * dispatches packets to upper
1171 */
1172static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1173{
1174 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001175 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilca8f2112013-02-08 18:18:09 -08001176 u32 wrptr, rd_index, tx_val;
Avinash Patile7f767a2013-01-03 21:21:32 -08001177 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001178 int ret = 0;
1179 struct sk_buff *skb_tmp = NULL;
Avinash Patile05dc3e2013-02-08 18:18:08 -08001180 struct mwifiex_pcie_buf_desc *desc;
Avinash Patilca8f2112013-02-08 18:18:09 -08001181 struct mwifiex_pfu_buf_desc *desc2;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001182
Avinash Patile7f767a2013-01-03 21:21:32 -08001183 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1184 mwifiex_pm_wakeup_card(adapter);
1185
Amitkumar Karward930fae2011-10-11 17:41:21 -07001186 /* Read the RX ring Write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001187 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001188 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001189 "RECV DATA: failed to read reg->rx_wrptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001190 ret = -1;
1191 goto done;
1192 }
Avinash Patile7f767a2013-01-03 21:21:32 -08001193 card->rxbd_wrptr = wrptr;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001194
Avinash Patildd04e6a2013-02-08 18:18:06 -08001195 while (((wrptr & reg->rx_mask) !=
1196 (card->rxbd_rdptr & reg->rx_mask)) ||
1197 ((wrptr & reg->rx_rollover_ind) ==
1198 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001199 struct sk_buff *skb_data;
1200 u16 rx_len;
Avinash Patile7f767a2013-01-03 21:21:32 -08001201 __le16 pkt_len;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001202
Avinash Patildd04e6a2013-02-08 18:18:06 -08001203 rd_index = card->rxbd_rdptr & reg->rx_mask;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001204 skb_data = card->rx_buf_list[rd_index];
1205
Avinash Patile7f767a2013-01-03 21:21:32 -08001206 MWIFIEX_SKB_PACB(skb_data, &buf_pa);
1207 pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE,
1208 PCI_DMA_FROMDEVICE);
1209 card->rx_buf_list[rd_index] = NULL;
1210
Amitkumar Karward930fae2011-10-11 17:41:21 -07001211 /* Get data length from interface header -
Avinash Patile7f767a2013-01-03 21:21:32 -08001212 * first 2 bytes for len, next 2 bytes is for type
1213 */
1214 pkt_len = *((__le16 *)skb_data->data);
1215 rx_len = le16_to_cpu(pkt_len);
1216 skb_put(skb_data, rx_len);
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001217 dev_dbg(adapter->dev,
1218 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1219 card->rxbd_rdptr, wrptr, rx_len);
Avinash Patile7f767a2013-01-03 21:21:32 -08001220 skb_pull(skb_data, INTF_HEADER_LEN);
1221 mwifiex_handle_rx_packet(adapter, skb_data);
1222
1223 skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001224 if (!skb_tmp) {
Avinash Patile7f767a2013-01-03 21:21:32 -08001225 dev_err(adapter->dev,
1226 "Unable to allocate skb.\n");
1227 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001228 }
1229
Avinash Patile7f767a2013-01-03 21:21:32 -08001230 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1231 MWIFIEX_RX_DATA_BUF_SIZE,
1232 PCI_DMA_FROMDEVICE))
1233 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001234
Avinash Patile7f767a2013-01-03 21:21:32 -08001235 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
1236
1237 dev_dbg(adapter->dev,
1238 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1239 skb_tmp, rd_index);
1240 card->rx_buf_list[rd_index] = skb_tmp;
Avinash Patilca8f2112013-02-08 18:18:09 -08001241
1242 if (reg->pfu_enabled) {
1243 desc2 = (void *)card->rxbd_ring[rd_index];
1244 desc2->paddr = buf_pa;
1245 desc2->len = skb_tmp->len;
1246 desc2->frag_len = skb_tmp->len;
1247 desc2->offset = 0;
1248 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1249 } else {
1250 desc = card->rxbd_ring[rd_index];
1251 desc->paddr = buf_pa;
1252 desc->len = skb_tmp->len;
1253 desc->flags = 0;
1254 }
Avinash Patile7f767a2013-01-03 21:21:32 -08001255
Avinash Patildd04e6a2013-02-08 18:18:06 -08001256 if ((++card->rxbd_rdptr & reg->rx_mask) ==
Amitkumar Karward930fae2011-10-11 17:41:21 -07001257 MWIFIEX_MAX_TXRX_BD) {
1258 card->rxbd_rdptr = ((card->rxbd_rdptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -08001259 reg->rx_rollover_ind) ^
1260 reg->rx_rollover_ind);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001261 }
1262 dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001263 card->rxbd_rdptr, wrptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001264
Avinash Patilca8f2112013-02-08 18:18:09 -08001265 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001266 /* Write the RX ring read pointer in to reg->rx_rdptr */
1267 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
Avinash Patilca8f2112013-02-08 18:18:09 -08001268 card->rxbd_rdptr | tx_val)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001269 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001270 "RECV DATA: failed to write reg->rx_rdptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001271 ret = -1;
1272 goto done;
1273 }
1274
1275 /* Read the RX ring Write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001276 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001277 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001278 "RECV DATA: failed to read reg->rx_wrptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001279 ret = -1;
1280 goto done;
1281 }
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001282 dev_dbg(adapter->dev,
1283 "info: RECV DATA: Rcvd packet from fw successfully\n");
Avinash Patile7f767a2013-01-03 21:21:32 -08001284 card->rxbd_wrptr = wrptr;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001285 }
1286
1287done:
Amitkumar Karward930fae2011-10-11 17:41:21 -07001288 return ret;
1289}
1290
1291/*
1292 * This function downloads the boot command to device
1293 */
1294static int
1295mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1296{
Avinash Patilfc331462013-01-03 21:21:30 -08001297 dma_addr_t buf_pa;
1298 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001299 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001300
Avinash Patilfc331462013-01-03 21:21:30 -08001301 if (!(skb->data && skb->len)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001302 dev_err(adapter->dev,
Avinash Patilfc331462013-01-03 21:21:30 -08001303 "Invalid parameter in %s <%p. len %d>\n",
1304 __func__, skb->data, skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001305 return -1;
1306 }
1307
Avinash Patilfc331462013-01-03 21:21:30 -08001308 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1309 return -1;
1310
1311 MWIFIEX_SKB_PACB(skb, &buf_pa);
1312
Avinash Patildd04e6a2013-02-08 18:18:06 -08001313 /* Write the lower 32bits of the physical address to low command
1314 * address scratch register
1315 */
1316 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001317 dev_err(adapter->dev,
1318 "%s: failed to write download command to boot code.\n",
1319 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001320 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1321 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001322 return -1;
1323 }
1324
Avinash Patildd04e6a2013-02-08 18:18:06 -08001325 /* Write the upper 32bits of the physical address to high command
1326 * address scratch register
1327 */
1328 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
Avinash Patilfc331462013-01-03 21:21:30 -08001329 (u32)((u64)buf_pa >> 32))) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001330 dev_err(adapter->dev,
1331 "%s: failed to write download command to boot code.\n",
1332 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001333 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1334 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001335 return -1;
1336 }
1337
Avinash Patildd04e6a2013-02-08 18:18:06 -08001338 /* Write the command length to cmd_size scratch register */
1339 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001340 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001341 "%s: failed to write command len to cmd_size scratch reg\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001342 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001343 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1344 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001345 return -1;
1346 }
1347
1348 /* Ring the door bell */
1349 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1350 CPU_INTR_DOOR_BELL)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001351 dev_err(adapter->dev,
1352 "%s: failed to assert door-bell intr\n", __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001353 pci_unmap_single(card->dev, buf_pa,
1354 MWIFIEX_UPLD_SIZE, PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001355 return -1;
1356 }
1357
1358 return 0;
1359}
1360
Avinash Patilc6d1d872013-01-03 21:21:29 -08001361/* This function init rx port in firmware which in turn enables to receive data
1362 * from device before transmitting any packet.
1363 */
1364static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1365{
1366 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001367 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilca8f2112013-02-08 18:18:09 -08001368 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
Avinash Patilc6d1d872013-01-03 21:21:29 -08001369
Avinash Patildd04e6a2013-02-08 18:18:06 -08001370 /* Write the RX ring read pointer in to reg->rx_rdptr */
Avinash Patilca8f2112013-02-08 18:18:09 -08001371 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1372 tx_wrap)) {
Avinash Patilc6d1d872013-01-03 21:21:29 -08001373 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001374 "RECV DATA: failed to write reg->rx_rdptr\n");
Avinash Patilc6d1d872013-01-03 21:21:29 -08001375 return -1;
1376 }
1377 return 0;
1378}
1379
1380/* This function downloads commands to the device
Amitkumar Karward930fae2011-10-11 17:41:21 -07001381 */
1382static int
1383mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1384{
1385 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001386 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001387 int ret = 0;
Avinash Patilfc331462013-01-03 21:21:30 -08001388 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1389 u8 *payload = (u8 *)skb->data;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001390
1391 if (!(skb->data && skb->len)) {
1392 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001393 __func__, skb->data, skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001394 return -1;
1395 }
1396
1397 /* Make sure a command response buffer is available */
1398 if (!card->cmdrsp_buf) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001399 dev_err(adapter->dev,
1400 "No response buffer available, send command failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001401 return -EBUSY;
1402 }
1403
Avinash Patilfc331462013-01-03 21:21:30 -08001404 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1405 mwifiex_pm_wakeup_card(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001406
1407 adapter->cmd_sent = true;
Avinash Patilfc331462013-01-03 21:21:30 -08001408
1409 *(__le16 *)&payload[0] = cpu_to_le16((u16)skb->len);
1410 *(__le16 *)&payload[2] = cpu_to_le16(MWIFIEX_TYPE_CMD);
1411
1412 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1413 return -1;
1414
1415 card->cmd_buf = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001416
1417 /* To send a command, the driver will:
1418 1. Write the 64bit physical address of the data buffer to
Avinash Patildd04e6a2013-02-08 18:18:06 -08001419 cmd response address low + cmd response address high
Amitkumar Karward930fae2011-10-11 17:41:21 -07001420 2. Ring the door bell (i.e. set the door bell interrupt)
1421
1422 In response to door bell interrupt, the firmware will perform
1423 the DMA of the command packet (first header to obtain the total
1424 length and then rest of the command).
1425 */
1426
1427 if (card->cmdrsp_buf) {
Avinash Patilfc331462013-01-03 21:21:30 -08001428 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &cmdrsp_buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001429 /* Write the lower 32bits of the cmdrsp buffer physical
1430 address */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001431 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
Avinash Patilfc331462013-01-03 21:21:30 -08001432 (u32)cmdrsp_buf_pa)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001433 dev_err(adapter->dev,
1434 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001435 ret = -1;
1436 goto done;
1437 }
1438 /* Write the upper 32bits of the cmdrsp buffer physical
1439 address */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001440 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
Avinash Patilfc331462013-01-03 21:21:30 -08001441 (u32)((u64)cmdrsp_buf_pa >> 32))) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001442 dev_err(adapter->dev,
1443 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001444 ret = -1;
1445 goto done;
1446 }
1447 }
1448
Avinash Patilfc331462013-01-03 21:21:30 -08001449 MWIFIEX_SKB_PACB(card->cmd_buf, &cmd_buf_pa);
Avinash Patildd04e6a2013-02-08 18:18:06 -08001450 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1451 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1452 (u32)cmd_buf_pa)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001453 dev_err(adapter->dev,
1454 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001455 ret = -1;
1456 goto done;
1457 }
Avinash Patildd04e6a2013-02-08 18:18:06 -08001458 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1459 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
Avinash Patilfc331462013-01-03 21:21:30 -08001460 (u32)((u64)cmd_buf_pa >> 32))) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001461 dev_err(adapter->dev,
1462 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001463 ret = -1;
1464 goto done;
1465 }
1466
Avinash Patildd04e6a2013-02-08 18:18:06 -08001467 /* Write the command length to reg->cmd_size */
1468 if (mwifiex_write_reg(adapter, reg->cmd_size,
1469 card->cmd_buf->len)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001470 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001471 "Failed to write cmd len to reg->cmd_size\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001472 ret = -1;
1473 goto done;
1474 }
1475
1476 /* Ring the door bell */
1477 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1478 CPU_INTR_DOOR_BELL)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001479 dev_err(adapter->dev,
1480 "Failed to assert door-bell intr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001481 ret = -1;
1482 goto done;
1483 }
1484
1485done:
1486 if (ret)
1487 adapter->cmd_sent = false;
1488
1489 return 0;
1490}
1491
1492/*
1493 * This function handles command complete interrupt
1494 */
1495static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1496{
1497 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001498 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001499 struct sk_buff *skb = card->cmdrsp_buf;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001500 int count = 0;
Avinash Patilfc331462013-01-03 21:21:30 -08001501 u16 rx_len;
1502 __le16 pkt_len;
1503 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001504
1505 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1506
Avinash Patilfc331462013-01-03 21:21:30 -08001507 MWIFIEX_SKB_PACB(skb, &buf_pa);
1508 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1509 PCI_DMA_FROMDEVICE);
1510
1511 pkt_len = *((__le16 *)skb->data);
1512 rx_len = le16_to_cpu(pkt_len);
1513 skb_trim(skb, rx_len);
1514 skb_pull(skb, INTF_HEADER_LEN);
1515
Amitkumar Karward930fae2011-10-11 17:41:21 -07001516 if (!adapter->curr_cmd) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001517 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001518 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1519 skb->len);
Avinash Patil52301a82013-02-12 14:38:32 -08001520 while (reg->sleep_cookie && (count++ < 10) &&
1521 mwifiex_pcie_ok_to_access_hw(adapter))
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -07001522 usleep_range(50, 60);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001523 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001524 dev_err(adapter->dev,
1525 "There is no command but got cmdrsp\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001526 }
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001527 memcpy(adapter->upld_buf, skb->data,
1528 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
Avinash Patil0f49d642013-03-20 17:56:23 -07001529 skb_push(skb, INTF_HEADER_LEN);
Avinash Patilfc331462013-01-03 21:21:30 -08001530 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1531 PCI_DMA_FROMDEVICE))
1532 return -1;
1533
1534 MWIFIEX_SKB_PACB(skb, &buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001535 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001536 adapter->curr_cmd->resp_skb = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001537 adapter->cmd_resp_received = true;
1538 /* Take the pointer and set it to CMD node and will
1539 return in the response complete callback */
1540 card->cmdrsp_buf = NULL;
1541
1542 /* Clear the cmd-rsp buffer address in scratch registers. This
1543 will prevent firmware from writing to the same response
1544 buffer again. */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001545 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001546 dev_err(adapter->dev,
1547 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001548 return -1;
1549 }
1550 /* Write the upper 32bits of the cmdrsp buffer physical
1551 address */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001552 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001553 dev_err(adapter->dev,
1554 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001555 return -1;
1556 }
1557 }
1558
1559 return 0;
1560}
1561
1562/*
1563 * Command Response processing complete handler
1564 */
1565static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1566 struct sk_buff *skb)
1567{
1568 struct pcie_service_card *card = adapter->card;
Avinash Patilfc331462013-01-03 21:21:30 -08001569 dma_addr_t buf_pa;
1570 struct sk_buff *skb_tmp;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001571
1572 if (skb) {
1573 card->cmdrsp_buf = skb;
1574 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
Avinash Patilfc331462013-01-03 21:21:30 -08001575 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1576 PCI_DMA_FROMDEVICE))
1577 return -1;
1578 }
1579
1580 skb_tmp = card->cmd_buf;
1581 if (skb_tmp) {
1582 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
Yogesh Ashok Powar7af1ce02013-04-23 16:49:50 -07001583 pci_unmap_single(card->dev, buf_pa, skb_tmp->len,
Avinash Patilfc331462013-01-03 21:21:30 -08001584 PCI_DMA_FROMDEVICE);
1585 card->cmd_buf = NULL;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001586 }
1587
1588 return 0;
1589}
1590
1591/*
1592 * This function handles firmware event ready interrupt
1593 */
1594static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1595{
1596 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001597 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001598 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1599 u32 wrptr, event;
Avinash Patilfc331462013-01-03 21:21:30 -08001600 dma_addr_t buf_pa;
Avinash Patile05dc3e2013-02-08 18:18:08 -08001601 struct mwifiex_evt_buf_desc *desc;
Avinash Patilfc331462013-01-03 21:21:30 -08001602
1603 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1604 mwifiex_pm_wakeup_card(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001605
1606 if (adapter->event_received) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001607 dev_dbg(adapter->dev, "info: Event being processed, "
1608 "do not process this interrupt just yet\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001609 return 0;
1610 }
1611
1612 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1613 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1614 return -1;
1615 }
1616
1617 /* Read the event ring write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001618 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001619 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001620 "EventReady: failed to read reg->evt_wrptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001621 return -1;
1622 }
1623
1624 dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001625 card->evtbd_rdptr, wrptr);
1626 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1627 & MWIFIEX_EVTBD_MASK)) ||
Avinash Patildd04e6a2013-02-08 18:18:06 -08001628 ((wrptr & reg->evt_rollover_ind) ==
1629 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001630 struct sk_buff *skb_cmd;
1631 __le16 data_len = 0;
1632 u16 evt_len;
1633
1634 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1635 skb_cmd = card->evt_buf_list[rdptr];
Avinash Patilfc331462013-01-03 21:21:30 -08001636 MWIFIEX_SKB_PACB(skb_cmd, &buf_pa);
1637 pci_unmap_single(card->dev, buf_pa, MAX_EVENT_SIZE,
1638 PCI_DMA_FROMDEVICE);
1639
Amitkumar Karward930fae2011-10-11 17:41:21 -07001640 /* Take the pointer and set it to event pointer in adapter
1641 and will return back after event handling callback */
1642 card->evt_buf_list[rdptr] = NULL;
Avinash Patile05dc3e2013-02-08 18:18:08 -08001643 desc = card->evtbd_ring[rdptr];
1644 memset(desc, 0, sizeof(*desc));
Amitkumar Karward930fae2011-10-11 17:41:21 -07001645
1646 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1647 adapter->event_cause = event;
1648 /* The first 4bytes will be the event transfer header
1649 len is 2 bytes followed by type which is 2 bytes */
1650 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1651 evt_len = le16_to_cpu(data_len);
1652
1653 skb_pull(skb_cmd, INTF_HEADER_LEN);
1654 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1655
1656 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1657 memcpy(adapter->event_body, skb_cmd->data +
1658 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1659 MWIFIEX_EVENT_HEADER_LEN);
1660
1661 adapter->event_received = true;
1662 adapter->event_skb = skb_cmd;
1663
1664 /* Do not update the event read pointer here, wait till the
1665 buffer is released. This is just to make things simpler,
1666 we need to find a better method of managing these buffers.
1667 */
1668 }
1669
1670 return 0;
1671}
1672
1673/*
1674 * Event processing complete handler
1675 */
1676static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1677 struct sk_buff *skb)
1678{
1679 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001680 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001681 int ret = 0;
1682 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1683 u32 wrptr;
Avinash Patilfc331462013-01-03 21:21:30 -08001684 dma_addr_t buf_pa;
Avinash Patile05dc3e2013-02-08 18:18:08 -08001685 struct mwifiex_evt_buf_desc *desc;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001686
1687 if (!skb)
1688 return 0;
1689
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001690 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001691 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001692 rdptr);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001693 return -EINVAL;
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001694 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001695
1696 /* Read the event ring write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001697 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001698 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001699 "event_complete: failed to read reg->evt_wrptr\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001700 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001701 }
1702
1703 if (!card->evt_buf_list[rdptr]) {
1704 skb_push(skb, INTF_HEADER_LEN);
Avinash Patilfc331462013-01-03 21:21:30 -08001705 if (mwifiex_map_pci_memory(adapter, skb,
1706 MAX_EVENT_SIZE,
1707 PCI_DMA_FROMDEVICE))
1708 return -1;
1709 MWIFIEX_SKB_PACB(skb, &buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001710 card->evt_buf_list[rdptr] = skb;
Avinash Patilfc331462013-01-03 21:21:30 -08001711 MWIFIEX_SKB_PACB(skb, &buf_pa);
Avinash Patile05dc3e2013-02-08 18:18:08 -08001712 desc = card->evtbd_ring[rdptr];
1713 desc->paddr = buf_pa;
1714 desc->len = (u16)skb->len;
1715 desc->flags = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001716 skb = NULL;
1717 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001718 dev_dbg(adapter->dev,
1719 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1720 rdptr, card->evt_buf_list[rdptr], skb);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001721 }
1722
1723 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1724 card->evtbd_rdptr = ((card->evtbd_rdptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -08001725 reg->evt_rollover_ind) ^
1726 reg->evt_rollover_ind);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001727 }
1728
1729 dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001730 card->evtbd_rdptr, wrptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001731
Avinash Patildd04e6a2013-02-08 18:18:06 -08001732 /* Write the event ring read pointer in to reg->evt_rdptr */
1733 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1734 card->evtbd_rdptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001735 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001736 "event_complete: failed to read reg->evt_rdptr\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001737 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001738 }
1739
Amitkumar Karward930fae2011-10-11 17:41:21 -07001740 dev_dbg(adapter->dev, "info: Check Events Again\n");
1741 ret = mwifiex_pcie_process_event_ready(adapter);
1742
1743 return ret;
1744}
1745
1746/*
1747 * This function downloads the firmware to the card.
1748 *
1749 * Firmware is downloaded to the card in blocks. Every block download
1750 * is tested for CRC errors, and retried a number of times before
1751 * returning failure.
1752 */
1753static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1754 struct mwifiex_fw_image *fw)
1755{
1756 int ret;
1757 u8 *firmware = fw->fw_buf;
1758 u32 firmware_len = fw->fw_len;
1759 u32 offset = 0;
1760 struct sk_buff *skb;
1761 u32 txlen, tx_blocks = 0, tries, len;
1762 u32 block_retry_cnt = 0;
Avinash Patilfc331462013-01-03 21:21:30 -08001763 dma_addr_t buf_pa;
1764 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001765 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001766
1767 if (!firmware || !firmware_len) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001768 dev_err(adapter->dev,
1769 "No firmware image found! Terminating download\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001770 return -1;
1771 }
1772
1773 dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001774 firmware_len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001775
1776 if (mwifiex_pcie_disable_host_int(adapter)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001777 dev_err(adapter->dev,
1778 "%s: Disabling interrupts failed.\n", __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001779 return -1;
1780 }
1781
1782 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1783 if (!skb) {
1784 ret = -ENOMEM;
1785 goto done;
1786 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001787
1788 /* Perform firmware data transfer */
1789 do {
1790 u32 ireg_intr = 0;
1791
1792 /* More data? */
1793 if (offset >= firmware_len)
1794 break;
1795
1796 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
Avinash Patildd04e6a2013-02-08 18:18:06 -08001797 ret = mwifiex_read_reg(adapter, reg->cmd_size,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001798 &len);
1799 if (ret) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001800 dev_warn(adapter->dev,
1801 "Failed reading len from boot code\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001802 goto done;
1803 }
1804 if (len)
1805 break;
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -07001806 usleep_range(10, 20);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001807 }
1808
1809 if (!len) {
1810 break;
1811 } else if (len > MWIFIEX_UPLD_SIZE) {
1812 pr_err("FW download failure @ %d, invalid length %d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001813 offset, len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001814 ret = -1;
1815 goto done;
1816 }
1817
1818 txlen = len;
1819
1820 if (len & BIT(0)) {
1821 block_retry_cnt++;
1822 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1823 pr_err("FW download failure @ %d, over max "
1824 "retry count\n", offset);
1825 ret = -1;
1826 goto done;
1827 }
1828 dev_err(adapter->dev, "FW CRC error indicated by the "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001829 "helper: len = 0x%04X, txlen = %d\n",
1830 len, txlen);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001831 len &= ~BIT(0);
1832 /* Setting this to 0 to resend from same offset */
1833 txlen = 0;
1834 } else {
1835 block_retry_cnt = 0;
1836 /* Set blocksize to transfer - checking for
1837 last block */
1838 if (firmware_len - offset < txlen)
1839 txlen = firmware_len - offset;
1840
1841 dev_dbg(adapter->dev, ".");
1842
Avinash Patildd04e6a2013-02-08 18:18:06 -08001843 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
1844 card->pcie.blksz_fw_dl;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001845
1846 /* Copy payload to buffer */
1847 memmove(skb->data, &firmware[offset], txlen);
1848 }
1849
1850 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
Avinash Patildd04e6a2013-02-08 18:18:06 -08001851 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001852
1853 /* Send the boot command to device */
1854 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001855 dev_err(adapter->dev,
1856 "Failed to send firmware download command\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001857 ret = -1;
1858 goto done;
1859 }
Avinash Patilfc331462013-01-03 21:21:30 -08001860
1861 MWIFIEX_SKB_PACB(skb, &buf_pa);
1862
Amitkumar Karward930fae2011-10-11 17:41:21 -07001863 /* Wait for the command done interrupt */
1864 do {
1865 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1866 &ireg_intr)) {
1867 dev_err(adapter->dev, "%s: Failed to read "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001868 "interrupt status during fw dnld.\n",
1869 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001870 pci_unmap_single(card->dev, buf_pa, skb->len,
1871 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001872 ret = -1;
1873 goto done;
1874 }
1875 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1876 CPU_INTR_DOOR_BELL);
Avinash Patilfc331462013-01-03 21:21:30 -08001877
1878 pci_unmap_single(card->dev, buf_pa, skb->len,
1879 PCI_DMA_TODEVICE);
1880
Amitkumar Karward930fae2011-10-11 17:41:21 -07001881 offset += txlen;
1882 } while (true);
1883
1884 dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001885 offset);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001886
1887 ret = 0;
1888
1889done:
1890 dev_kfree_skb_any(skb);
1891 return ret;
1892}
1893
1894/*
1895 * This function checks the firmware status in card.
1896 *
1897 * The winner interface is also determined by this function.
1898 */
1899static int
1900mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1901{
1902 int ret = 0;
1903 u32 firmware_stat, winner_status;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001904 struct pcie_service_card *card = adapter->card;
1905 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001906 u32 tries;
1907
1908 /* Mask spurios interrupts */
1909 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001910 HOST_INTR_MASK)) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001911 dev_warn(adapter->dev, "Write register failed\n");
1912 return -1;
1913 }
1914
1915 dev_dbg(adapter->dev, "Setting driver ready signature\n");
Avinash Patildd04e6a2013-02-08 18:18:06 -08001916 if (mwifiex_write_reg(adapter, reg->drv_rdy,
1917 FIRMWARE_READY_PCIE)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001918 dev_err(adapter->dev,
1919 "Failed to write driver ready signature\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001920 return -1;
1921 }
1922
1923 /* Wait for firmware initialization event */
1924 for (tries = 0; tries < poll_num; tries++) {
Avinash Patildd04e6a2013-02-08 18:18:06 -08001925 if (mwifiex_read_reg(adapter, reg->fw_status,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001926 &firmware_stat))
1927 ret = -1;
1928 else
1929 ret = 0;
1930 if (ret)
1931 continue;
1932 if (firmware_stat == FIRMWARE_READY_PCIE) {
1933 ret = 0;
1934 break;
1935 } else {
1936 mdelay(100);
1937 ret = -1;
1938 }
1939 }
1940
1941 if (ret) {
Avinash Patildd04e6a2013-02-08 18:18:06 -08001942 if (mwifiex_read_reg(adapter, reg->fw_status,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001943 &winner_status))
1944 ret = -1;
1945 else if (!winner_status) {
1946 dev_err(adapter->dev, "PCI-E is the winner\n");
1947 adapter->winner = 1;
1948 ret = -1;
1949 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001950 dev_err(adapter->dev,
1951 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
1952 ret, adapter->winner);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001953 ret = 0;
1954 }
1955 }
1956
1957 return ret;
1958}
1959
1960/*
1961 * This function reads the interrupt status from card.
1962 */
1963static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
1964{
1965 u32 pcie_ireg;
1966 unsigned long flags;
1967
1968 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1969 return;
1970
1971 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
1972 dev_warn(adapter->dev, "Read register failed\n");
1973 return;
1974 }
1975
1976 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1977
1978 mwifiex_pcie_disable_host_int(adapter);
1979
1980 /* Clear the pending interrupts */
1981 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
1982 ~pcie_ireg)) {
1983 dev_warn(adapter->dev, "Write register failed\n");
1984 return;
1985 }
1986 spin_lock_irqsave(&adapter->int_lock, flags);
1987 adapter->int_status |= pcie_ireg;
1988 spin_unlock_irqrestore(&adapter->int_lock, flags);
1989
1990 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1991 if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
1992 (adapter->ps_state == PS_STATE_SLEEP)) {
1993 mwifiex_pcie_enable_host_int(adapter);
1994 if (mwifiex_write_reg(adapter,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001995 PCIE_CPU_INT_EVENT,
1996 CPU_INTR_SLEEP_CFM_DONE)
1997 ) {
1998 dev_warn(adapter->dev,
1999 "Write register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07002000 return;
2001
2002 }
2003 }
2004 } else if (!adapter->pps_uapsd_mode &&
Avinash Patilc24d9922013-03-22 21:49:06 -07002005 adapter->ps_state == PS_STATE_SLEEP &&
2006 mwifiex_pcie_ok_to_access_hw(adapter)) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07002007 /* Potentially for PCIe we could get other
2008 * interrupts like shared. Don't change power
2009 * state until cookie is set */
Avinash Patilc24d9922013-03-22 21:49:06 -07002010 adapter->ps_state = PS_STATE_AWAKE;
2011 adapter->pm_wakeup_fw_try = false;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002012 }
2013 }
2014}
2015
2016/*
2017 * Interrupt handler for PCIe root port
2018 *
2019 * This function reads the interrupt status from firmware and assigns
2020 * the main process in workqueue which will handle the interrupt.
2021 */
2022static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2023{
2024 struct pci_dev *pdev = (struct pci_dev *)context;
2025 struct pcie_service_card *card;
2026 struct mwifiex_adapter *adapter;
2027
2028 if (!pdev) {
2029 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
2030 goto exit;
2031 }
2032
2033 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
2034 if (!card || !card->adapter) {
2035 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002036 card ? card->adapter : NULL);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002037 goto exit;
2038 }
2039 adapter = card->adapter;
2040
2041 if (adapter->surprise_removed)
2042 goto exit;
2043
2044 mwifiex_interrupt_status(adapter);
2045 queue_work(adapter->workqueue, &adapter->main_work);
2046
2047exit:
2048 return IRQ_HANDLED;
2049}
2050
2051/*
2052 * This function checks the current interrupt status.
2053 *
2054 * The following interrupts are checked and handled by this function -
2055 * - Data sent
2056 * - Command sent
2057 * - Command received
2058 * - Packets received
2059 * - Events received
2060 *
2061 * In case of Rx packets received, the packets are uploaded from card to
2062 * host and processed accordingly.
2063 */
2064static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2065{
2066 int ret;
Avinash Patil659c4782013-01-03 21:21:28 -08002067 u32 pcie_ireg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002068 unsigned long flags;
2069
2070 spin_lock_irqsave(&adapter->int_lock, flags);
2071 /* Clear out unused interrupts */
Avinash Patil659c4782013-01-03 21:21:28 -08002072 pcie_ireg = adapter->int_status;
2073 adapter->int_status = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002074 spin_unlock_irqrestore(&adapter->int_lock, flags);
2075
Avinash Patil659c4782013-01-03 21:21:28 -08002076 while (pcie_ireg & HOST_INTR_MASK) {
2077 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2078 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
Avinash Patile7f767a2013-01-03 21:21:32 -08002079 dev_dbg(adapter->dev, "info: TX DNLD Done\n");
2080 ret = mwifiex_pcie_send_data_complete(adapter);
2081 if (ret)
2082 return ret;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002083 }
Avinash Patil659c4782013-01-03 21:21:28 -08002084 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2085 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002086 dev_dbg(adapter->dev, "info: Rx DATA\n");
2087 ret = mwifiex_pcie_process_recv_data(adapter);
2088 if (ret)
2089 return ret;
2090 }
Avinash Patil659c4782013-01-03 21:21:28 -08002091 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2092 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002093 dev_dbg(adapter->dev, "info: Rx EVENT\n");
2094 ret = mwifiex_pcie_process_event_ready(adapter);
2095 if (ret)
2096 return ret;
2097 }
2098
Avinash Patil659c4782013-01-03 21:21:28 -08002099 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2100 pcie_ireg &= ~HOST_INTR_CMD_DONE;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002101 if (adapter->cmd_sent) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002102 dev_dbg(adapter->dev,
2103 "info: CMD sent Interrupt\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07002104 adapter->cmd_sent = false;
2105 }
2106 /* Handle command response */
2107 ret = mwifiex_pcie_process_cmd_complete(adapter);
2108 if (ret)
2109 return ret;
2110 }
2111
2112 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2113 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2114 &pcie_ireg)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002115 dev_warn(adapter->dev,
2116 "Read register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07002117 return -1;
2118 }
2119
2120 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2121 if (mwifiex_write_reg(adapter,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002122 PCIE_HOST_INT_STATUS,
2123 ~pcie_ireg)) {
2124 dev_warn(adapter->dev,
2125 "Write register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07002126 return -1;
2127 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07002128 }
2129
2130 }
2131 }
2132 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002133 adapter->cmd_sent, adapter->data_sent);
Avinash Patilb2fda1f2013-03-22 21:49:05 -07002134 if (adapter->ps_state != PS_STATE_SLEEP)
2135 mwifiex_pcie_enable_host_int(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002136
2137 return 0;
2138}
2139
2140/*
2141 * This function downloads data from driver to card.
2142 *
2143 * Both commands and data packets are transferred to the card by this
2144 * function.
2145 *
2146 * This function adds the PCIE specific header to the front of the buffer
2147 * before transferring. The header contains the length of the packet and
2148 * the type. The firmware handles the packets based upon this set type.
2149 */
2150static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2151 struct sk_buff *skb,
2152 struct mwifiex_tx_param *tx_param)
2153{
Dan Carpenterfa161cb2011-11-07 19:31:45 -08002154 if (!skb) {
2155 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002156 return -1;
2157 }
2158
2159 if (type == MWIFIEX_TYPE_DATA)
Avinash Patile7f767a2013-01-03 21:21:32 -08002160 return mwifiex_pcie_send_data(adapter, skb, tx_param);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002161 else if (type == MWIFIEX_TYPE_CMD)
2162 return mwifiex_pcie_send_cmd(adapter, skb);
2163
2164 return 0;
2165}
2166
2167/*
2168 * This function initializes the PCI-E host memory space, WCB rings, etc.
2169 *
2170 * The following initializations steps are followed -
2171 * - Allocate TXBD ring buffers
2172 * - Allocate RXBD ring buffers
2173 * - Allocate event BD ring buffers
2174 * - Allocate command response ring buffer
2175 * - Allocate sleep cookie buffer
2176 */
2177static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
2178{
2179 struct pcie_service_card *card = adapter->card;
2180 int ret;
2181 struct pci_dev *pdev = card->dev;
Avinash Patil52301a82013-02-12 14:38:32 -08002182 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002183
2184 pci_set_drvdata(pdev, card);
2185
2186 ret = pci_enable_device(pdev);
2187 if (ret)
2188 goto err_enable_dev;
2189
2190 pci_set_master(pdev);
2191
2192 dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
2193 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2194 if (ret) {
2195 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
2196 goto err_set_dma_mask;
2197 }
2198
2199 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2200 if (ret) {
2201 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
2202 goto err_set_dma_mask;
2203 }
2204
2205 ret = pci_request_region(pdev, 0, DRV_NAME);
2206 if (ret) {
2207 dev_err(adapter->dev, "req_reg(0) error\n");
2208 goto err_req_region0;
2209 }
2210 card->pci_mmap = pci_iomap(pdev, 0, 0);
2211 if (!card->pci_mmap) {
2212 dev_err(adapter->dev, "iomap(0) error\n");
Alexey Khoroshilov32207122013-01-26 00:56:03 +04002213 ret = -EIO;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002214 goto err_iomap0;
2215 }
2216 ret = pci_request_region(pdev, 2, DRV_NAME);
2217 if (ret) {
2218 dev_err(adapter->dev, "req_reg(2) error\n");
2219 goto err_req_region2;
2220 }
2221 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2222 if (!card->pci_mmap1) {
2223 dev_err(adapter->dev, "iomap(2) error\n");
Alexey Khoroshilov32207122013-01-26 00:56:03 +04002224 ret = -EIO;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002225 goto err_iomap2;
2226 }
2227
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002228 dev_dbg(adapter->dev,
2229 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2230 card->pci_mmap, card->pci_mmap1);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002231
2232 card->cmdrsp_buf = NULL;
2233 ret = mwifiex_pcie_create_txbd_ring(adapter);
2234 if (ret)
2235 goto err_cre_txbd;
2236 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2237 if (ret)
2238 goto err_cre_rxbd;
2239 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2240 if (ret)
2241 goto err_cre_evtbd;
2242 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2243 if (ret)
2244 goto err_alloc_cmdbuf;
Avinash Patil52301a82013-02-12 14:38:32 -08002245 if (reg->sleep_cookie) {
2246 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2247 if (ret)
2248 goto err_alloc_cookie;
2249 } else {
2250 card->sleep_cookie_vbase = NULL;
2251 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07002252 return ret;
2253
2254err_alloc_cookie:
2255 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2256err_alloc_cmdbuf:
2257 mwifiex_pcie_delete_evtbd_ring(adapter);
2258err_cre_evtbd:
2259 mwifiex_pcie_delete_rxbd_ring(adapter);
2260err_cre_rxbd:
2261 mwifiex_pcie_delete_txbd_ring(adapter);
2262err_cre_txbd:
2263 pci_iounmap(pdev, card->pci_mmap1);
2264err_iomap2:
2265 pci_release_region(pdev, 2);
2266err_req_region2:
2267 pci_iounmap(pdev, card->pci_mmap);
2268err_iomap0:
2269 pci_release_region(pdev, 0);
2270err_req_region0:
2271err_set_dma_mask:
2272 pci_disable_device(pdev);
2273err_enable_dev:
2274 pci_set_drvdata(pdev, NULL);
2275 return ret;
2276}
2277
2278/*
2279 * This function cleans up the allocated card buffers.
2280 *
2281 * The following are freed by this function -
2282 * - TXBD ring buffers
2283 * - RXBD ring buffers
2284 * - Event BD ring buffers
2285 * - Command response ring buffer
2286 * - Sleep cookie buffer
2287 */
2288static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
2289{
2290 struct pcie_service_card *card = adapter->card;
2291 struct pci_dev *pdev = card->dev;
Avinash Patildd04e6a2013-02-08 18:18:06 -08002292 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002293
Amitkumar Karward930fae2011-10-11 17:41:21 -07002294 if (user_rmmod) {
Avinash Patilfc331462013-01-03 21:21:30 -08002295 dev_dbg(adapter->dev, "Clearing driver ready signature\n");
Avinash Patildd04e6a2013-02-08 18:18:06 -08002296 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002297 dev_err(adapter->dev,
2298 "Failed to write driver not-ready signature\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07002299 }
2300
2301 if (pdev) {
2302 pci_iounmap(pdev, card->pci_mmap);
2303 pci_iounmap(pdev, card->pci_mmap1);
Yogesh Ashok Powar5b0d9b22013-04-23 16:49:48 -07002304 pci_disable_device(pdev);
Yogesh Ashok Powarc380aaf2013-04-23 16:49:47 -07002305 pci_release_region(pdev, 2);
2306 pci_release_region(pdev, 0);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002307 pci_set_drvdata(pdev, NULL);
2308 }
2309}
2310
2311/*
2312 * This function registers the PCIE device.
2313 *
2314 * PCIE IRQ is claimed, block size is set and driver data is initialized.
2315 */
2316static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
2317{
2318 int ret;
2319 struct pcie_service_card *card = adapter->card;
2320 struct pci_dev *pdev = card->dev;
2321
2322 /* save adapter pointer in card */
2323 card->adapter = adapter;
2324
2325 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
2326 "MRVL_PCIE", pdev);
2327 if (ret) {
2328 pr_err("request_irq failed: ret=%d\n", ret);
2329 adapter->card = NULL;
2330 return -1;
2331 }
2332
2333 adapter->dev = &pdev->dev;
Avinash Patildd04e6a2013-02-08 18:18:06 -08002334 strcpy(adapter->fw_name, card->pcie.firmware);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002335
2336 return 0;
2337}
2338
2339/*
2340 * This function unregisters the PCIE device.
2341 *
2342 * The PCIE IRQ is released, the function is disabled and driver
2343 * data is set to null.
2344 */
2345static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
2346{
2347 struct pcie_service_card *card = adapter->card;
Avinash Patil52301a82013-02-12 14:38:32 -08002348 const struct mwifiex_pcie_card_reg *reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002349
2350 if (card) {
2351 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
2352 free_irq(card->dev->irq, card->dev);
Avinash Patilfc331462013-01-03 21:21:30 -08002353
Avinash Patil52301a82013-02-12 14:38:32 -08002354 reg = card->pcie.reg;
2355 if (reg->sleep_cookie)
2356 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2357
Avinash Patilfc331462013-01-03 21:21:30 -08002358 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2359 mwifiex_pcie_delete_evtbd_ring(adapter);
2360 mwifiex_pcie_delete_rxbd_ring(adapter);
2361 mwifiex_pcie_delete_txbd_ring(adapter);
2362 card->cmdrsp_buf = NULL;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002363 }
2364}
2365
2366static struct mwifiex_if_ops pcie_ops = {
2367 .init_if = mwifiex_pcie_init,
2368 .cleanup_if = mwifiex_pcie_cleanup,
2369 .check_fw_status = mwifiex_check_fw_status,
2370 .prog_fw = mwifiex_prog_fw_w_helper,
2371 .register_dev = mwifiex_register_dev,
2372 .unregister_dev = mwifiex_unregister_dev,
2373 .enable_int = mwifiex_pcie_enable_host_int,
2374 .process_int_status = mwifiex_process_int_status,
2375 .host_to_card = mwifiex_pcie_host_to_card,
2376 .wakeup = mwifiex_pm_wakeup_card,
2377 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
2378
2379 /* PCIE specific */
2380 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
2381 .event_complete = mwifiex_pcie_event_complete,
2382 .update_mp_end_port = NULL,
2383 .cleanup_mpa_buf = NULL,
Avinash Patilc6d1d872013-01-03 21:21:29 -08002384 .init_fw_port = mwifiex_pcie_init_fw_port,
Avinash Patilfbd7e7a2013-01-03 21:21:31 -08002385 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
Amitkumar Karward930fae2011-10-11 17:41:21 -07002386};
2387
2388/*
2389 * This function initializes the PCIE driver module.
2390 *
2391 * This initiates the semaphore and registers the device with
2392 * PCIE bus.
2393 */
2394static int mwifiex_pcie_init_module(void)
2395{
2396 int ret;
2397
Avinash Patilca8f2112013-02-08 18:18:09 -08002398 pr_debug("Marvell PCIe Driver\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07002399
2400 sema_init(&add_remove_card_sem, 1);
2401
2402 /* Clear the flag in case user removes the card. */
2403 user_rmmod = 0;
2404
2405 ret = pci_register_driver(&mwifiex_pcie);
2406 if (ret)
2407 pr_err("Driver register failed!\n");
2408 else
2409 pr_debug("info: Driver registered successfully!\n");
2410
2411 return ret;
2412}
2413
2414/*
2415 * This function cleans up the PCIE driver.
2416 *
2417 * The following major steps are followed for cleanup -
2418 * - Resume the device if its suspended
2419 * - Disconnect the device if connected
2420 * - Shutdown the firmware
2421 * - Unregister the device from PCIE bus.
2422 */
2423static void mwifiex_pcie_cleanup_module(void)
2424{
2425 if (!down_interruptible(&add_remove_card_sem))
2426 up(&add_remove_card_sem);
2427
2428 /* Set the flag as user is removing this module. */
2429 user_rmmod = 1;
2430
2431 pci_unregister_driver(&mwifiex_pcie);
2432}
2433
2434module_init(mwifiex_pcie_init_module);
2435module_exit(mwifiex_pcie_cleanup_module);
2436
2437MODULE_AUTHOR("Marvell International Ltd.");
2438MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
2439MODULE_VERSION(PCIE_VERSION);
2440MODULE_LICENSE("GPL v2");
Avinash Patilca8f2112013-02-08 18:18:09 -08002441MODULE_FIRMWARE(PCIE8766_DEFAULT_FW_NAME);
2442MODULE_FIRMWARE(PCIE8897_DEFAULT_FW_NAME);