blob: 29c539b9424bca3f060d070d1654c7f1755e1bb0 [file] [log] [blame]
Amitkumar Karward930fae2011-10-11 17:41:21 -07001/*
2 * Marvell Wireless LAN device driver: PCIE specific handling
3 *
4 * Copyright (C) 2011, Marvell International Ltd.
5 *
6 * This software file (the "File") is distributed by Marvell International
7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8 * (the "License"). You may use, redistribute and/or modify this File in
9 * accordance with the terms and conditions of the License, a copy of which
10 * is available by writing to the Free Software Foundation, Inc.,
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
13 *
14 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
16 * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
17 * this warranty disclaimer.
18 */
19
20#include <linux/firmware.h>
21
22#include "decl.h"
23#include "ioctl.h"
24#include "util.h"
25#include "fw.h"
26#include "main.h"
27#include "wmm.h"
28#include "11n.h"
29#include "pcie.h"
30
31#define PCIE_VERSION "1.0"
32#define DRV_NAME "Marvell mwifiex PCIe"
33
34static u8 user_rmmod;
35
36static struct mwifiex_if_ops pcie_ops;
37
38static struct semaphore add_remove_card_sem;
39static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter);
40static int mwifiex_pcie_resume(struct pci_dev *pdev);
41
Avinash Patilfc331462013-01-03 21:21:30 -080042static int
43mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
44 int size, int flags)
Amitkumar Karward930fae2011-10-11 17:41:21 -070045{
Avinash Patilfc331462013-01-03 21:21:30 -080046 struct pcie_service_card *card = adapter->card;
47 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -070048
Avinash Patilfc331462013-01-03 21:21:30 -080049 buf_pa = pci_map_single(card->dev, skb->data, size, flags);
50 if (pci_dma_mapping_error(card->dev, buf_pa)) {
51 dev_err(adapter->dev, "failed to map pci memory!\n");
52 return -1;
53 }
54 memcpy(skb->cb, &buf_pa, sizeof(dma_addr_t));
55 return 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -070056}
57
58/*
59 * This function reads sleep cookie and checks if FW is ready
60 */
61static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
62{
63 u32 *cookie_addr;
64 struct pcie_service_card *card = adapter->card;
65
Avinash Patilfc331462013-01-03 21:21:30 -080066 if (card->sleep_cookie_vbase) {
67 cookie_addr = (u32 *)card->sleep_cookie_vbase;
Amitkumar Karward930fae2011-10-11 17:41:21 -070068 dev_dbg(adapter->dev, "info: ACCESS_HW: sleep cookie=0x%x\n",
69 *cookie_addr);
70 if (*cookie_addr == FW_AWAKE_COOKIE)
71 return true;
72 }
73
74 return false;
75}
76
77/*
78 * This function probes an mwifiex device and registers it. It allocates
79 * the card structure, enables PCIE function number and initiates the
80 * device registration and initialization procedure by adding a logical
81 * interface.
82 */
83static int mwifiex_pcie_probe(struct pci_dev *pdev,
84 const struct pci_device_id *ent)
85{
86 struct pcie_service_card *card;
87
88 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -070089 pdev->vendor, pdev->device, pdev->revision);
Amitkumar Karward930fae2011-10-11 17:41:21 -070090
91 card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
Joe Perchese404dec2012-01-29 12:56:23 +000092 if (!card)
Amitkumar Karward930fae2011-10-11 17:41:21 -070093 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -070094
95 card->dev = pdev;
96
Avinash Patildd04e6a2013-02-08 18:18:06 -080097 if (ent->driver_data) {
98 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
99 card->pcie.firmware = data->firmware;
100 card->pcie.reg = data->reg;
101 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
102 }
103
Amitkumar Karward930fae2011-10-11 17:41:21 -0700104 if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
105 MWIFIEX_PCIE)) {
106 pr_err("%s failed\n", __func__);
107 kfree(card);
108 return -1;
109 }
110
111 return 0;
112}
113
114/*
115 * This function removes the interface and frees up the card structure.
116 */
117static void mwifiex_pcie_remove(struct pci_dev *pdev)
118{
119 struct pcie_service_card *card;
120 struct mwifiex_adapter *adapter;
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700121 struct mwifiex_private *priv;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700122 int i;
123
124 card = pci_get_drvdata(pdev);
125 if (!card)
126 return;
127
128 adapter = card->adapter;
129 if (!adapter || !adapter->priv_num)
130 return;
131
Amitkumar Karwar59a4cc22012-04-09 20:06:57 -0700132 /* In case driver is removed when asynchronous FW load is in progress */
133 wait_for_completion(&adapter->fw_load);
134
Amitkumar Karward930fae2011-10-11 17:41:21 -0700135 if (user_rmmod) {
136#ifdef CONFIG_PM
137 if (adapter->is_suspended)
138 mwifiex_pcie_resume(pdev);
139#endif
140
141 for (i = 0; i < adapter->priv_num; i++)
142 if ((GET_BSS_ROLE(adapter->priv[i]) ==
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700143 MWIFIEX_BSS_ROLE_STA) &&
144 adapter->priv[i]->media_connected)
Amitkumar Karward930fae2011-10-11 17:41:21 -0700145 mwifiex_deauthenticate(adapter->priv[i], NULL);
146
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700147 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700148
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700149 mwifiex_disable_auto_ds(priv);
150
151 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700152 }
153
154 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
155 kfree(card);
156}
157
158/*
159 * Kernel needs to suspend all functions separately. Therefore all
160 * registered functions must have drivers with suspend and resume
161 * methods. Failing that the kernel simply removes the whole card.
162 *
163 * If already not suspended, this function allocates and sends a host
164 * sleep activate request to the firmware and turns off the traffic.
165 */
166static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
167{
168 struct mwifiex_adapter *adapter;
169 struct pcie_service_card *card;
170 int hs_actived, i;
171
172 if (pdev) {
173 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
Avinash Patil83f0c6d2013-01-21 21:04:10 -0800174 if (!card || !card->adapter) {
Amitkumar Karward930fae2011-10-11 17:41:21 -0700175 pr_err("Card or adapter structure is not valid\n");
176 return 0;
177 }
178 } else {
179 pr_err("PCIE device is not specified\n");
180 return 0;
181 }
182
183 adapter = card->adapter;
184
185 hs_actived = mwifiex_enable_hs(adapter);
186
187 /* Indicate device suspended */
188 adapter->is_suspended = true;
189
190 for (i = 0; i < adapter->priv_num; i++)
191 netif_carrier_off(adapter->priv[i]->netdev);
192
193 return 0;
194}
195
196/*
197 * Kernel needs to suspend all functions separately. Therefore all
198 * registered functions must have drivers with suspend and resume
199 * methods. Failing that the kernel simply removes the whole card.
200 *
201 * If already not resumed, this function turns on the traffic and
202 * sends a host sleep cancel request to the firmware.
203 */
204static int mwifiex_pcie_resume(struct pci_dev *pdev)
205{
206 struct mwifiex_adapter *adapter;
207 struct pcie_service_card *card;
208 int i;
209
210 if (pdev) {
211 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
212 if (!card || !card->adapter) {
213 pr_err("Card or adapter structure is not valid\n");
214 return 0;
215 }
216 } else {
217 pr_err("PCIE device is not specified\n");
218 return 0;
219 }
220
221 adapter = card->adapter;
222
223 if (!adapter->is_suspended) {
224 dev_warn(adapter->dev, "Device already resumed\n");
225 return 0;
226 }
227
228 adapter->is_suspended = false;
229
230 for (i = 0; i < adapter->priv_num; i++)
231 if (adapter->priv[i]->media_connected)
232 netif_carrier_on(adapter->priv[i]->netdev);
233
234 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700235 MWIFIEX_ASYNC_CMD);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700236
237 return 0;
238}
239
240#define PCIE_VENDOR_ID_MARVELL (0x11ab)
241#define PCIE_DEVICE_ID_MARVELL_88W8766P (0x2b30)
242
243static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
244 {
245 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
246 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
Avinash Patildd04e6a2013-02-08 18:18:06 -0800247 .driver_data = (unsigned long) &mwifiex_pcie8766,
Amitkumar Karward930fae2011-10-11 17:41:21 -0700248 },
249 {},
250};
251
252MODULE_DEVICE_TABLE(pci, mwifiex_ids);
253
254/* PCI Device Driver */
255static struct pci_driver __refdata mwifiex_pcie = {
256 .name = "mwifiex_pcie",
257 .id_table = mwifiex_ids,
258 .probe = mwifiex_pcie_probe,
259 .remove = mwifiex_pcie_remove,
260#ifdef CONFIG_PM
261 /* Power Management Hooks */
262 .suspend = mwifiex_pcie_suspend,
263 .resume = mwifiex_pcie_resume,
264#endif
265};
266
267/*
268 * This function writes data into PCIE card register.
269 */
270static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
271{
272 struct pcie_service_card *card = adapter->card;
273
274 iowrite32(data, card->pci_mmap1 + reg);
275
276 return 0;
277}
278
279/*
280 * This function reads data from PCIE card register.
281 */
282static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
283{
284 struct pcie_service_card *card = adapter->card;
285
286 *data = ioread32(card->pci_mmap1 + reg);
287
288 return 0;
289}
290
291/*
292 * This function wakes up the card.
293 *
294 * A host power up command is written to the card configuration
295 * register to wake up the card.
296 */
297static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
298{
299 int i = 0;
300
301 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
302 i++;
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -0700303 usleep_range(10, 20);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700304 /* 50ms max wait */
305 if (i == 50000)
306 break;
307 }
308
309 dev_dbg(adapter->dev, "event: Wakeup device...\n");
310
311 /* Enable interrupts or any chip access will wakeup device */
312 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK, HOST_INTR_MASK)) {
313 dev_warn(adapter->dev, "Enable host interrupt failed\n");
314 return -1;
315 }
316
317 dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
318 adapter->ps_state = PS_STATE_AWAKE;
319
320 return 0;
321}
322
323/*
324 * This function is called after the card has woken up.
325 *
326 * The card configuration register is reset.
327 */
328static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
329{
330 dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
331
332 return 0;
333}
334
335/*
336 * This function disables the host interrupt.
337 *
338 * The host interrupt mask is read, the disable bit is reset and
339 * written back to the card host interrupt mask register.
340 */
341static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
342{
343 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
344 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
345 0x00000000)) {
346 dev_warn(adapter->dev, "Disable host interrupt failed\n");
347 return -1;
348 }
349 }
350
351 return 0;
352}
353
354/*
355 * This function enables the host interrupt.
356 *
357 * The host interrupt enable mask is written to the card
358 * host interrupt mask register.
359 */
360static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
361{
362 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
363 /* Simply write the mask to the register */
364 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
365 HOST_INTR_MASK)) {
366 dev_warn(adapter->dev, "Enable host interrupt failed\n");
367 return -1;
368 }
369 }
370
371 return 0;
372}
373
374/*
375 * This function creates buffer descriptor ring for TX
376 */
377static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
378{
379 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800380 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700381 int i;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700382
383 /*
384 * driver maintaines the write pointer and firmware maintaines the read
385 * pointer. The write pointer starts at 0 (zero) while the read pointer
386 * starts at zero with rollover bit set
387 */
388 card->txbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800389 card->txbd_rdptr |= reg->tx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700390
391 /* allocate shared memory for the BD ring and divide the same in to
392 several descriptors */
393 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700394 MWIFIEX_MAX_TXRX_BD;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700395 dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700396 card->txbd_ring_size);
Avinash Patilfc331462013-01-03 21:21:30 -0800397 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
398 card->txbd_ring_size,
399 &card->txbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700400 if (!card->txbd_ring_vbase) {
Avinash Patilfc331462013-01-03 21:21:30 -0800401 dev_err(adapter->dev,
402 "allocate consistent memory (%d bytes) failed!\n",
403 card->txbd_ring_size);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800404 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700405 }
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700406 dev_dbg(adapter->dev,
407 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
Avinash Patilfc331462013-01-03 21:21:30 -0800408 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700409 (u32)((u64)card->txbd_ring_pbase >> 32), card->txbd_ring_size);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700410
411 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
412 card->txbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700413 (card->txbd_ring_vbase +
414 (sizeof(struct mwifiex_pcie_buf_desc)
415 * i));
Amitkumar Karward930fae2011-10-11 17:41:21 -0700416
Avinash Patilfc331462013-01-03 21:21:30 -0800417 card->tx_buf_list[i] = NULL;
418 card->txbd_ring[i]->paddr = 0;
419 card->txbd_ring[i]->len = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700420 card->txbd_ring[i]->flags = 0;
421 }
422
423 return 0;
424}
425
426static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
427{
428 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800429 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilfc331462013-01-03 21:21:30 -0800430 struct sk_buff *skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700431 int i;
432
433 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
Avinash Patilfc331462013-01-03 21:21:30 -0800434 if (card->tx_buf_list[i]) {
435 skb = card->tx_buf_list[i];
436 pci_unmap_single(card->dev, card->txbd_ring[i]->paddr,
437 skb->len, PCI_DMA_TODEVICE);
438 dev_kfree_skb_any(skb);
439 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700440 card->tx_buf_list[i] = NULL;
441 card->txbd_ring[i]->paddr = 0;
442 card->txbd_ring[i]->len = 0;
443 card->txbd_ring[i]->flags = 0;
444 card->txbd_ring[i] = NULL;
445 }
446
Avinash Patilfc331462013-01-03 21:21:30 -0800447 if (card->txbd_ring_vbase)
448 pci_free_consistent(card->dev, card->txbd_ring_size,
449 card->txbd_ring_vbase,
450 card->txbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700451 card->txbd_ring_size = 0;
452 card->txbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800453 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700454 card->txbd_ring_vbase = NULL;
Avinash Patilfc331462013-01-03 21:21:30 -0800455 card->txbd_ring_pbase = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700456
457 return 0;
458}
459
460/*
461 * This function creates buffer descriptor ring for RX
462 */
463static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
464{
465 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800466 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700467 struct sk_buff *skb;
468 int i;
Avinash Patilfc331462013-01-03 21:21:30 -0800469 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700470
471 /*
472 * driver maintaines the read pointer and firmware maintaines the write
473 * pointer. The write pointer starts at 0 (zero) while the read pointer
474 * starts at zero with rollover bit set
475 */
476 card->rxbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800477 card->rxbd_rdptr = reg->rx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700478
479 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700480 MWIFIEX_MAX_TXRX_BD;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700481 dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700482 card->rxbd_ring_size);
Avinash Patilfc331462013-01-03 21:21:30 -0800483 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
484 card->rxbd_ring_size,
485 &card->rxbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700486 if (!card->rxbd_ring_vbase) {
Avinash Patilfc331462013-01-03 21:21:30 -0800487 dev_err(adapter->dev,
488 "allocate consistent memory (%d bytes) failed!\n",
489 card->rxbd_ring_size);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800490 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700491 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700492
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700493 dev_dbg(adapter->dev,
494 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
495 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
496 (u32)((u64)card->rxbd_ring_pbase >> 32),
497 card->rxbd_ring_size);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700498
499 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
500 card->rxbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700501 (card->rxbd_ring_vbase +
502 (sizeof(struct mwifiex_pcie_buf_desc)
503 * i));
Amitkumar Karward930fae2011-10-11 17:41:21 -0700504
505 /* Allocate skb here so that firmware can DMA data from it */
506 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
507 if (!skb) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700508 dev_err(adapter->dev,
509 "Unable to allocate skb for RX ring.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700510 kfree(card->rxbd_ring_vbase);
511 return -ENOMEM;
512 }
Avinash Patilfc331462013-01-03 21:21:30 -0800513 if (mwifiex_map_pci_memory(adapter, skb,
514 MWIFIEX_RX_DATA_BUF_SIZE,
515 PCI_DMA_FROMDEVICE))
516 return -1;
517
518 MWIFIEX_SKB_PACB(skb, &buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700519
520 dev_dbg(adapter->dev, "info: RX ring: add new skb base: %p, "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700521 "buf_base: %p, buf_pbase: %#x:%x, buf_len: %#x\n",
Avinash Patilfc331462013-01-03 21:21:30 -0800522 skb, skb->data, (u32)buf_pa, (u32)((u64)buf_pa >> 32),
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700523 skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700524
525 card->rx_buf_list[i] = skb;
Avinash Patilfc331462013-01-03 21:21:30 -0800526 card->rxbd_ring[i]->paddr = buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700527 card->rxbd_ring[i]->len = (u16)skb->len;
528 card->rxbd_ring[i]->flags = 0;
529 }
530
531 return 0;
532}
533
534/*
535 * This function deletes Buffer descriptor ring for RX
536 */
537static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
538{
539 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800540 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilfc331462013-01-03 21:21:30 -0800541 struct sk_buff *skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700542 int i;
543
544 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
Avinash Patilfc331462013-01-03 21:21:30 -0800545 if (card->rx_buf_list[i]) {
546 skb = card->rx_buf_list[i];
547 pci_unmap_single(card->dev, card->rxbd_ring[i]->paddr ,
548 MWIFIEX_RX_DATA_BUF_SIZE,
549 PCI_DMA_FROMDEVICE);
550 dev_kfree_skb_any(skb);
551 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700552 card->rx_buf_list[i] = NULL;
553 card->rxbd_ring[i]->paddr = 0;
554 card->rxbd_ring[i]->len = 0;
555 card->rxbd_ring[i]->flags = 0;
556 card->rxbd_ring[i] = NULL;
557 }
558
Avinash Patilfc331462013-01-03 21:21:30 -0800559 if (card->rxbd_ring_vbase)
560 pci_free_consistent(card->dev, card->rxbd_ring_size,
561 card->rxbd_ring_vbase,
562 card->rxbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700563 card->rxbd_ring_size = 0;
564 card->rxbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800565 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700566 card->rxbd_ring_vbase = NULL;
Avinash Patilfc331462013-01-03 21:21:30 -0800567 card->rxbd_ring_pbase = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700568
569 return 0;
570}
571
572/*
573 * This function creates buffer descriptor ring for Events
574 */
575static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
576{
577 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800578 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700579 struct sk_buff *skb;
580 int i;
Avinash Patilfc331462013-01-03 21:21:30 -0800581 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700582
583 /*
584 * driver maintaines the read pointer and firmware maintaines the write
585 * pointer. The write pointer starts at 0 (zero) while the read pointer
586 * starts at zero with rollover bit set
587 */
588 card->evtbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800589 card->evtbd_rdptr = reg->evt_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700590
591 card->evtbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700592 MWIFIEX_MAX_EVT_BD;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700593 dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700594 card->evtbd_ring_size);
Avinash Patilfc331462013-01-03 21:21:30 -0800595 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
596 card->evtbd_ring_size,
597 &card->evtbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700598 if (!card->evtbd_ring_vbase) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700599 dev_err(adapter->dev,
Avinash Patilfc331462013-01-03 21:21:30 -0800600 "allocate consistent memory (%d bytes) failed!\n",
601 card->evtbd_ring_size);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -0800602 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700603 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700604
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700605 dev_dbg(adapter->dev,
606 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
607 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
608 (u32)((u64)card->evtbd_ring_pbase >> 32),
609 card->evtbd_ring_size);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700610
611 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
612 card->evtbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700613 (card->evtbd_ring_vbase +
614 (sizeof(struct mwifiex_pcie_buf_desc)
615 * i));
Amitkumar Karward930fae2011-10-11 17:41:21 -0700616
617 /* Allocate skb here so that firmware can DMA data from it */
618 skb = dev_alloc_skb(MAX_EVENT_SIZE);
619 if (!skb) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700620 dev_err(adapter->dev,
621 "Unable to allocate skb for EVENT buf.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700622 kfree(card->evtbd_ring_vbase);
623 return -ENOMEM;
624 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700625 skb_put(skb, MAX_EVENT_SIZE);
626
Avinash Patilfc331462013-01-03 21:21:30 -0800627 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
628 PCI_DMA_FROMDEVICE))
629 return -1;
630
631 MWIFIEX_SKB_PACB(skb, &buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700632 dev_dbg(adapter->dev, "info: Evt ring: add new skb. base: %p, "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700633 "buf_base: %p, buf_pbase: %#x:%x, buf_len: %#x\n",
Avinash Patilfc331462013-01-03 21:21:30 -0800634 skb, skb->data, (u32)buf_pa, (u32)((u64)buf_pa >> 32),
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700635 skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700636
637 card->evt_buf_list[i] = skb;
Avinash Patilfc331462013-01-03 21:21:30 -0800638 card->evtbd_ring[i]->paddr = buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700639 card->evtbd_ring[i]->len = (u16)skb->len;
640 card->evtbd_ring[i]->flags = 0;
641 }
642
643 return 0;
644}
645
646/*
647 * This function deletes Buffer descriptor ring for Events
648 */
649static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
650{
651 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800652 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilfc331462013-01-03 21:21:30 -0800653 struct sk_buff *skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700654 int i;
655
656 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
Avinash Patilfc331462013-01-03 21:21:30 -0800657 if (card->evt_buf_list[i]) {
658 skb = card->evt_buf_list[i];
659 pci_unmap_single(card->dev, card->evtbd_ring[i]->paddr,
660 MAX_EVENT_SIZE, PCI_DMA_FROMDEVICE);
661 dev_kfree_skb_any(skb);
662 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700663 card->evt_buf_list[i] = NULL;
664 card->evtbd_ring[i]->paddr = 0;
665 card->evtbd_ring[i]->len = 0;
666 card->evtbd_ring[i]->flags = 0;
667 card->evtbd_ring[i] = NULL;
668 }
669
Avinash Patilfc331462013-01-03 21:21:30 -0800670 if (card->evtbd_ring_vbase)
671 pci_free_consistent(card->dev, card->evtbd_ring_size,
672 card->evtbd_ring_vbase,
673 card->evtbd_ring_pbase);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700674 card->evtbd_wrptr = 0;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800675 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700676 card->evtbd_ring_size = 0;
677 card->evtbd_ring_vbase = NULL;
Avinash Patilfc331462013-01-03 21:21:30 -0800678 card->evtbd_ring_pbase = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700679
680 return 0;
681}
682
683/*
684 * This function allocates a buffer for CMDRSP
685 */
686static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
687{
688 struct pcie_service_card *card = adapter->card;
689 struct sk_buff *skb;
690
691 /* Allocate memory for receiving command response data */
692 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
693 if (!skb) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700694 dev_err(adapter->dev,
695 "Unable to allocate skb for command response data.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700696 return -ENOMEM;
697 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700698 skb_put(skb, MWIFIEX_UPLD_SIZE);
Avinash Patilfc331462013-01-03 21:21:30 -0800699 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
700 PCI_DMA_FROMDEVICE))
701 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700702
Avinash Patilfc331462013-01-03 21:21:30 -0800703 card->cmdrsp_buf = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700704
705 return 0;
706}
707
708/*
709 * This function deletes a buffer for CMDRSP
710 */
711static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
712{
713 struct pcie_service_card *card;
Avinash Patilfc331462013-01-03 21:21:30 -0800714 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700715
716 if (!adapter)
717 return 0;
718
719 card = adapter->card;
720
Avinash Patilfc331462013-01-03 21:21:30 -0800721 if (card && card->cmdrsp_buf) {
722 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &buf_pa);
723 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
724 PCI_DMA_FROMDEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700725 dev_kfree_skb_any(card->cmdrsp_buf);
Avinash Patilfc331462013-01-03 21:21:30 -0800726 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700727
Avinash Patilfc331462013-01-03 21:21:30 -0800728 if (card && card->cmd_buf) {
729 MWIFIEX_SKB_PACB(card->cmd_buf, &buf_pa);
730 pci_unmap_single(card->dev, buf_pa, MWIFIEX_SIZE_OF_CMD_BUFFER,
731 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700732 dev_kfree_skb_any(card->cmd_buf);
Avinash Patilfc331462013-01-03 21:21:30 -0800733 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700734 return 0;
735}
736
737/*
738 * This function allocates a buffer for sleep cookie
739 */
740static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
741{
Amitkumar Karward930fae2011-10-11 17:41:21 -0700742 struct pcie_service_card *card = adapter->card;
743
Avinash Patilfc331462013-01-03 21:21:30 -0800744 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
745 &card->sleep_cookie_pbase);
746 if (!card->sleep_cookie_vbase) {
747 dev_err(adapter->dev, "pci_alloc_consistent failed!\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700748 return -ENOMEM;
749 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700750 /* Init val of Sleep Cookie */
Avinash Patilfc331462013-01-03 21:21:30 -0800751 *(u32 *)card->sleep_cookie_vbase = FW_AWAKE_COOKIE;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700752
753 dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
Avinash Patilfc331462013-01-03 21:21:30 -0800754 *((u32 *)card->sleep_cookie_vbase));
Amitkumar Karward930fae2011-10-11 17:41:21 -0700755
756 return 0;
757}
758
759/*
760 * This function deletes buffer for sleep cookie
761 */
762static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
763{
764 struct pcie_service_card *card;
765
766 if (!adapter)
767 return 0;
768
769 card = adapter->card;
770
Avinash Patilfc331462013-01-03 21:21:30 -0800771 if (card && card->sleep_cookie_vbase) {
772 pci_free_consistent(card->dev, sizeof(u32),
773 card->sleep_cookie_vbase,
774 card->sleep_cookie_pbase);
775 card->sleep_cookie_vbase = NULL;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700776 }
777
778 return 0;
779}
780
Avinash Patilfbd7e7a2013-01-03 21:21:31 -0800781/* This function flushes the TX buffer descriptor ring
782 * This function defined as handler is also called while cleaning TXRX
783 * during disconnect/ bss stop.
784 */
785static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
786{
787 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800788 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilfbd7e7a2013-01-03 21:21:31 -0800789 u32 rdptr;
790
791 /* Read the TX ring read pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -0800792 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
Avinash Patilfbd7e7a2013-01-03 21:21:31 -0800793 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -0800794 "Flush TXBD: failed to read reg->tx_rdptr\n");
Avinash Patilfbd7e7a2013-01-03 21:21:31 -0800795 return -1;
796 }
797
798 if (!mwifiex_pcie_txbd_empty(card, rdptr)) {
799 card->txbd_flush = 1;
800 /* write pointer already set at last send
801 * send dnld-rdy intr again, wait for completion.
802 */
803 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
804 CPU_INTR_DNLD_RDY)) {
805 dev_err(adapter->dev,
806 "failed to assert dnld-rdy interrupt.\n");
807 return -1;
808 }
809 }
810 return 0;
811}
812
Amitkumar Karward930fae2011-10-11 17:41:21 -0700813/*
Avinash Patile7f767a2013-01-03 21:21:32 -0800814 * This function unmaps and frees downloaded data buffer
Amitkumar Karward930fae2011-10-11 17:41:21 -0700815 */
Avinash Patile7f767a2013-01-03 21:21:32 -0800816static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
Amitkumar Karward930fae2011-10-11 17:41:21 -0700817{
Avinash Patile7f767a2013-01-03 21:21:32 -0800818 const u32 num_tx_buffs = MWIFIEX_MAX_TXRX_BD;
819 struct sk_buff *skb;
820 dma_addr_t buf_pa;
821 u32 wrdoneidx, rdptr, unmap_count = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700822 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800823 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700824
825 if (!mwifiex_pcie_ok_to_access_hw(adapter))
826 mwifiex_pm_wakeup_card(adapter);
827
828 /* Read the TX ring read pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -0800829 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700830 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -0800831 "SEND COMP: failed to read reg->tx_rdptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700832 return -1;
833 }
834
Avinash Patile7f767a2013-01-03 21:21:32 -0800835 dev_dbg(adapter->dev, "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
836 card->txbd_rdptr, rdptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700837
Avinash Patile7f767a2013-01-03 21:21:32 -0800838 /* free from previous txbd_rdptr to current txbd_rdptr */
Avinash Patildd04e6a2013-02-08 18:18:06 -0800839 while (((card->txbd_rdptr & reg->tx_mask) !=
840 (rdptr & reg->tx_mask)) ||
841 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
842 (rdptr & reg->tx_rollover_ind))) {
843 wrdoneidx = card->txbd_rdptr & reg->tx_mask;
Avinash Patile7f767a2013-01-03 21:21:32 -0800844
845 skb = card->tx_buf_list[wrdoneidx];
846 if (skb) {
847 dev_dbg(adapter->dev,
848 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
849 skb, wrdoneidx);
850 MWIFIEX_SKB_PACB(skb, &buf_pa);
851 pci_unmap_single(card->dev, buf_pa, skb->len,
852 PCI_DMA_TODEVICE);
853
854 unmap_count++;
855
856 if (card->txbd_flush)
857 mwifiex_write_data_complete(adapter, skb, 0,
858 -1);
859 else
860 mwifiex_write_data_complete(adapter, skb, 0, 0);
861 }
862
863 card->tx_buf_list[wrdoneidx] = NULL;
864 card->txbd_ring[wrdoneidx]->paddr = 0;
Avinash Patil6ccea752013-01-22 16:29:03 -0800865 card->txbd_ring[wrdoneidx]->len = 0;
866 card->txbd_ring[wrdoneidx]->flags = 0;
Avinash Patile7f767a2013-01-03 21:21:32 -0800867 card->txbd_rdptr++;
868
Avinash Patildd04e6a2013-02-08 18:18:06 -0800869 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
Avinash Patile7f767a2013-01-03 21:21:32 -0800870 card->txbd_rdptr = ((card->txbd_rdptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -0800871 reg->tx_rollover_ind) ^
872 reg->tx_rollover_ind);
Avinash Patile7f767a2013-01-03 21:21:32 -0800873 }
874
875 if (unmap_count)
876 adapter->data_sent = false;
877
878 if (card->txbd_flush) {
Avinash Patildd04e6a2013-02-08 18:18:06 -0800879 if (((card->txbd_wrptr & reg->tx_mask) ==
880 (card->txbd_rdptr & reg->tx_mask)) &&
881 ((card->txbd_wrptr & reg->tx_rollover_ind) !=
882 (card->txbd_rdptr & reg->tx_rollover_ind)))
Avinash Patile7f767a2013-01-03 21:21:32 -0800883 card->txbd_flush = 0;
884 else
885 mwifiex_clean_pcie_ring_buf(adapter);
886 }
887
888 return 0;
889}
890
891/* This function sends data buffer to device. First 4 bytes of payload
892 * are filled with payload length and payload type. Then this payload
893 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
894 * Download ready interrupt to FW is deffered if Tx ring is not full and
895 * additional payload can be accomodated.
896 */
897static int
898mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
899 struct mwifiex_tx_param *tx_param)
900{
901 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -0800902 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patile7f767a2013-01-03 21:21:32 -0800903 u32 wrindx;
904 int ret;
905 dma_addr_t buf_pa;
906 __le16 *tmp;
907
908 if (!(skb->data && skb->len)) {
909 dev_err(adapter->dev, "%s(): invalid parameter <%p, %#x>\n",
910 __func__, skb->data, skb->len);
911 return -1;
912 }
913
914 if (!mwifiex_pcie_ok_to_access_hw(adapter))
915 mwifiex_pm_wakeup_card(adapter);
916
917 dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
918 card->txbd_rdptr, card->txbd_wrptr);
919 if (mwifiex_pcie_txbd_not_full(card)) {
Amitkumar Karward930fae2011-10-11 17:41:21 -0700920 u8 *payload;
921
922 adapter->data_sent = true;
Avinash Patile7f767a2013-01-03 21:21:32 -0800923 payload = skb->data;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700924 tmp = (__le16 *)&payload[0];
925 *tmp = cpu_to_le16((u16)skb->len);
926 tmp = (__le16 *)&payload[2];
927 *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
Avinash Patile7f767a2013-01-03 21:21:32 -0800928
929 if (mwifiex_map_pci_memory(adapter, skb, skb->len ,
930 PCI_DMA_TODEVICE))
931 return -1;
932
Avinash Patildd04e6a2013-02-08 18:18:06 -0800933 wrindx = card->txbd_wrptr & reg->tx_mask;
Avinash Patile7f767a2013-01-03 21:21:32 -0800934 MWIFIEX_SKB_PACB(skb, &buf_pa);
935 card->tx_buf_list[wrindx] = skb;
Avinash Patilfc331462013-01-03 21:21:30 -0800936 card->txbd_ring[wrindx]->paddr = buf_pa;
Avinash Patile7f767a2013-01-03 21:21:32 -0800937 card->txbd_ring[wrindx]->len = (u16)skb->len;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700938 card->txbd_ring[wrindx]->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
939 MWIFIEX_BD_FLAG_LAST_DESC;
940
Avinash Patildd04e6a2013-02-08 18:18:06 -0800941 if ((++card->txbd_wrptr & reg->tx_mask) ==
Amitkumar Karward930fae2011-10-11 17:41:21 -0700942 MWIFIEX_MAX_TXRX_BD)
943 card->txbd_wrptr = ((card->txbd_wrptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -0800944 reg->tx_rollover_ind) ^
945 reg->tx_rollover_ind);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700946
Avinash Patildd04e6a2013-02-08 18:18:06 -0800947 /* Write the TX ring write pointer in to reg->tx_wrptr */
948 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700949 card->txbd_wrptr)) {
950 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -0800951 "SEND DATA: failed to write reg->tx_wrptr\n");
Avinash Patile7f767a2013-01-03 21:21:32 -0800952 ret = -1;
953 goto done_unmap;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700954 }
Avinash Patile7f767a2013-01-03 21:21:32 -0800955 if ((mwifiex_pcie_txbd_not_full(card)) &&
956 tx_param->next_pkt_len) {
957 /* have more packets and TxBD still can hold more */
958 dev_dbg(adapter->dev,
959 "SEND DATA: delay dnld-rdy interrupt.\n");
960 adapter->data_sent = false;
961 } else {
962 /* Send the TX ready interrupt */
963 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
964 CPU_INTR_DNLD_RDY)) {
965 dev_err(adapter->dev,
966 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
967 ret = -1;
968 goto done_unmap;
969 }
Amitkumar Karward930fae2011-10-11 17:41:21 -0700970 }
971 dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700972 "%#x> and sent packet to firmware successfully\n",
Avinash Patile7f767a2013-01-03 21:21:32 -0800973 card->txbd_rdptr, card->txbd_wrptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -0700974 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700975 dev_dbg(adapter->dev,
976 "info: TX Ring full, can't send packets to fw\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700977 adapter->data_sent = true;
978 /* Send the TX ready interrupt */
979 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
980 CPU_INTR_DNLD_RDY))
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -0700981 dev_err(adapter->dev,
982 "SEND DATA: failed to assert door-bell intr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -0700983 return -EBUSY;
984 }
985
Avinash Patile7f767a2013-01-03 21:21:32 -0800986 return -EINPROGRESS;
987done_unmap:
988 MWIFIEX_SKB_PACB(skb, &buf_pa);
989 pci_unmap_single(card->dev, buf_pa, skb->len, PCI_DMA_TODEVICE);
990 card->tx_buf_list[wrindx] = NULL;
991 card->txbd_ring[wrindx]->paddr = 0;
992 card->txbd_ring[wrindx]->len = 0;
993 card->txbd_ring[wrindx]->flags = 0;
994 return ret;
Amitkumar Karward930fae2011-10-11 17:41:21 -0700995}
996
997/*
998 * This function handles received buffer ring and
999 * dispatches packets to upper
1000 */
1001static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1002{
1003 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001004 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001005 u32 wrptr, rd_index;
Avinash Patile7f767a2013-01-03 21:21:32 -08001006 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001007 int ret = 0;
1008 struct sk_buff *skb_tmp = NULL;
1009
Avinash Patile7f767a2013-01-03 21:21:32 -08001010 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1011 mwifiex_pm_wakeup_card(adapter);
1012
Amitkumar Karward930fae2011-10-11 17:41:21 -07001013 /* Read the RX ring Write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001014 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001015 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001016 "RECV DATA: failed to read reg->rx_wrptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001017 ret = -1;
1018 goto done;
1019 }
Avinash Patile7f767a2013-01-03 21:21:32 -08001020 card->rxbd_wrptr = wrptr;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001021
Avinash Patildd04e6a2013-02-08 18:18:06 -08001022 while (((wrptr & reg->rx_mask) !=
1023 (card->rxbd_rdptr & reg->rx_mask)) ||
1024 ((wrptr & reg->rx_rollover_ind) ==
1025 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001026 struct sk_buff *skb_data;
1027 u16 rx_len;
Avinash Patile7f767a2013-01-03 21:21:32 -08001028 __le16 pkt_len;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001029
Avinash Patildd04e6a2013-02-08 18:18:06 -08001030 rd_index = card->rxbd_rdptr & reg->rx_mask;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001031 skb_data = card->rx_buf_list[rd_index];
1032
Avinash Patile7f767a2013-01-03 21:21:32 -08001033 MWIFIEX_SKB_PACB(skb_data, &buf_pa);
1034 pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE,
1035 PCI_DMA_FROMDEVICE);
1036 card->rx_buf_list[rd_index] = NULL;
1037
Amitkumar Karward930fae2011-10-11 17:41:21 -07001038 /* Get data length from interface header -
Avinash Patile7f767a2013-01-03 21:21:32 -08001039 * first 2 bytes for len, next 2 bytes is for type
1040 */
1041 pkt_len = *((__le16 *)skb_data->data);
1042 rx_len = le16_to_cpu(pkt_len);
1043 skb_put(skb_data, rx_len);
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001044 dev_dbg(adapter->dev,
1045 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1046 card->rxbd_rdptr, wrptr, rx_len);
Avinash Patile7f767a2013-01-03 21:21:32 -08001047 skb_pull(skb_data, INTF_HEADER_LEN);
1048 mwifiex_handle_rx_packet(adapter, skb_data);
1049
1050 skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001051 if (!skb_tmp) {
Avinash Patile7f767a2013-01-03 21:21:32 -08001052 dev_err(adapter->dev,
1053 "Unable to allocate skb.\n");
1054 return -ENOMEM;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001055 }
1056
Avinash Patile7f767a2013-01-03 21:21:32 -08001057 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1058 MWIFIEX_RX_DATA_BUF_SIZE,
1059 PCI_DMA_FROMDEVICE))
1060 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001061
Avinash Patile7f767a2013-01-03 21:21:32 -08001062 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
1063
1064 dev_dbg(adapter->dev,
1065 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1066 skb_tmp, rd_index);
1067 card->rx_buf_list[rd_index] = skb_tmp;
1068 card->rxbd_ring[rd_index]->paddr = buf_pa;
1069 card->rxbd_ring[rd_index]->len = skb_tmp->len;
1070 card->rxbd_ring[rd_index]->flags = 0;
1071
Avinash Patildd04e6a2013-02-08 18:18:06 -08001072 if ((++card->rxbd_rdptr & reg->rx_mask) ==
Amitkumar Karward930fae2011-10-11 17:41:21 -07001073 MWIFIEX_MAX_TXRX_BD) {
1074 card->rxbd_rdptr = ((card->rxbd_rdptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -08001075 reg->rx_rollover_ind) ^
1076 reg->rx_rollover_ind);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001077 }
1078 dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001079 card->rxbd_rdptr, wrptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001080
Avinash Patildd04e6a2013-02-08 18:18:06 -08001081 /* Write the RX ring read pointer in to reg->rx_rdptr */
1082 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001083 card->rxbd_rdptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001084 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001085 "RECV DATA: failed to write reg->rx_rdptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001086 ret = -1;
1087 goto done;
1088 }
1089
1090 /* Read the RX ring Write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001091 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001092 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001093 "RECV DATA: failed to read reg->rx_wrptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001094 ret = -1;
1095 goto done;
1096 }
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001097 dev_dbg(adapter->dev,
1098 "info: RECV DATA: Rcvd packet from fw successfully\n");
Avinash Patile7f767a2013-01-03 21:21:32 -08001099 card->rxbd_wrptr = wrptr;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001100 }
1101
1102done:
Amitkumar Karward930fae2011-10-11 17:41:21 -07001103 return ret;
1104}
1105
1106/*
1107 * This function downloads the boot command to device
1108 */
1109static int
1110mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1111{
Avinash Patilfc331462013-01-03 21:21:30 -08001112 dma_addr_t buf_pa;
1113 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001114 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001115
Avinash Patilfc331462013-01-03 21:21:30 -08001116 if (!(skb->data && skb->len)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001117 dev_err(adapter->dev,
Avinash Patilfc331462013-01-03 21:21:30 -08001118 "Invalid parameter in %s <%p. len %d>\n",
1119 __func__, skb->data, skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001120 return -1;
1121 }
1122
Avinash Patilfc331462013-01-03 21:21:30 -08001123 if (mwifiex_map_pci_memory(adapter, skb, skb->len , PCI_DMA_TODEVICE))
1124 return -1;
1125
1126 MWIFIEX_SKB_PACB(skb, &buf_pa);
1127
Avinash Patildd04e6a2013-02-08 18:18:06 -08001128 /* Write the lower 32bits of the physical address to low command
1129 * address scratch register
1130 */
1131 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001132 dev_err(adapter->dev,
1133 "%s: failed to write download command to boot code.\n",
1134 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001135 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1136 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001137 return -1;
1138 }
1139
Avinash Patildd04e6a2013-02-08 18:18:06 -08001140 /* Write the upper 32bits of the physical address to high command
1141 * address scratch register
1142 */
1143 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
Avinash Patilfc331462013-01-03 21:21:30 -08001144 (u32)((u64)buf_pa >> 32))) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001145 dev_err(adapter->dev,
1146 "%s: failed to write download command to boot code.\n",
1147 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001148 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1149 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001150 return -1;
1151 }
1152
Avinash Patildd04e6a2013-02-08 18:18:06 -08001153 /* Write the command length to cmd_size scratch register */
1154 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001155 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001156 "%s: failed to write command len to cmd_size scratch reg\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001157 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001158 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1159 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001160 return -1;
1161 }
1162
1163 /* Ring the door bell */
1164 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1165 CPU_INTR_DOOR_BELL)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001166 dev_err(adapter->dev,
1167 "%s: failed to assert door-bell intr\n", __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001168 pci_unmap_single(card->dev, buf_pa,
1169 MWIFIEX_UPLD_SIZE, PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001170 return -1;
1171 }
1172
1173 return 0;
1174}
1175
Avinash Patilc6d1d872013-01-03 21:21:29 -08001176/* This function init rx port in firmware which in turn enables to receive data
1177 * from device before transmitting any packet.
1178 */
1179static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1180{
1181 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001182 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Avinash Patilc6d1d872013-01-03 21:21:29 -08001183
Avinash Patildd04e6a2013-02-08 18:18:06 -08001184 /* Write the RX ring read pointer in to reg->rx_rdptr */
1185 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr)) {
Avinash Patilc6d1d872013-01-03 21:21:29 -08001186 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001187 "RECV DATA: failed to write reg->rx_rdptr\n");
Avinash Patilc6d1d872013-01-03 21:21:29 -08001188 return -1;
1189 }
1190 return 0;
1191}
1192
1193/* This function downloads commands to the device
Amitkumar Karward930fae2011-10-11 17:41:21 -07001194 */
1195static int
1196mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1197{
1198 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001199 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001200 int ret = 0;
Avinash Patilfc331462013-01-03 21:21:30 -08001201 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1202 u8 *payload = (u8 *)skb->data;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001203
1204 if (!(skb->data && skb->len)) {
1205 dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001206 __func__, skb->data, skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001207 return -1;
1208 }
1209
1210 /* Make sure a command response buffer is available */
1211 if (!card->cmdrsp_buf) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001212 dev_err(adapter->dev,
1213 "No response buffer available, send command failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001214 return -EBUSY;
1215 }
1216
Avinash Patilfc331462013-01-03 21:21:30 -08001217 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1218 mwifiex_pm_wakeup_card(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001219
1220 adapter->cmd_sent = true;
Avinash Patilfc331462013-01-03 21:21:30 -08001221
1222 *(__le16 *)&payload[0] = cpu_to_le16((u16)skb->len);
1223 *(__le16 *)&payload[2] = cpu_to_le16(MWIFIEX_TYPE_CMD);
1224
1225 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1226 return -1;
1227
1228 card->cmd_buf = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001229
1230 /* To send a command, the driver will:
1231 1. Write the 64bit physical address of the data buffer to
Avinash Patildd04e6a2013-02-08 18:18:06 -08001232 cmd response address low + cmd response address high
Amitkumar Karward930fae2011-10-11 17:41:21 -07001233 2. Ring the door bell (i.e. set the door bell interrupt)
1234
1235 In response to door bell interrupt, the firmware will perform
1236 the DMA of the command packet (first header to obtain the total
1237 length and then rest of the command).
1238 */
1239
1240 if (card->cmdrsp_buf) {
Avinash Patilfc331462013-01-03 21:21:30 -08001241 MWIFIEX_SKB_PACB(card->cmdrsp_buf, &cmdrsp_buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001242 /* Write the lower 32bits of the cmdrsp buffer physical
1243 address */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001244 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
Avinash Patilfc331462013-01-03 21:21:30 -08001245 (u32)cmdrsp_buf_pa)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001246 dev_err(adapter->dev,
1247 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001248 ret = -1;
1249 goto done;
1250 }
1251 /* Write the upper 32bits of the cmdrsp buffer physical
1252 address */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001253 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
Avinash Patilfc331462013-01-03 21:21:30 -08001254 (u32)((u64)cmdrsp_buf_pa >> 32))) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001255 dev_err(adapter->dev,
1256 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001257 ret = -1;
1258 goto done;
1259 }
1260 }
1261
Avinash Patilfc331462013-01-03 21:21:30 -08001262 MWIFIEX_SKB_PACB(card->cmd_buf, &cmd_buf_pa);
Avinash Patildd04e6a2013-02-08 18:18:06 -08001263 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1264 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1265 (u32)cmd_buf_pa)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001266 dev_err(adapter->dev,
1267 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001268 ret = -1;
1269 goto done;
1270 }
Avinash Patildd04e6a2013-02-08 18:18:06 -08001271 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1272 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
Avinash Patilfc331462013-01-03 21:21:30 -08001273 (u32)((u64)cmd_buf_pa >> 32))) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001274 dev_err(adapter->dev,
1275 "Failed to write download cmd to boot code.\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001276 ret = -1;
1277 goto done;
1278 }
1279
Avinash Patildd04e6a2013-02-08 18:18:06 -08001280 /* Write the command length to reg->cmd_size */
1281 if (mwifiex_write_reg(adapter, reg->cmd_size,
1282 card->cmd_buf->len)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001283 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001284 "Failed to write cmd len to reg->cmd_size\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001285 ret = -1;
1286 goto done;
1287 }
1288
1289 /* Ring the door bell */
1290 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1291 CPU_INTR_DOOR_BELL)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001292 dev_err(adapter->dev,
1293 "Failed to assert door-bell intr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001294 ret = -1;
1295 goto done;
1296 }
1297
1298done:
1299 if (ret)
1300 adapter->cmd_sent = false;
1301
1302 return 0;
1303}
1304
1305/*
1306 * This function handles command complete interrupt
1307 */
1308static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1309{
1310 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001311 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001312 struct sk_buff *skb = card->cmdrsp_buf;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001313 int count = 0;
Avinash Patilfc331462013-01-03 21:21:30 -08001314 u16 rx_len;
1315 __le16 pkt_len;
1316 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001317
1318 dev_dbg(adapter->dev, "info: Rx CMD Response\n");
1319
Avinash Patilfc331462013-01-03 21:21:30 -08001320 MWIFIEX_SKB_PACB(skb, &buf_pa);
1321 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1322 PCI_DMA_FROMDEVICE);
1323
1324 pkt_len = *((__le16 *)skb->data);
1325 rx_len = le16_to_cpu(pkt_len);
1326 skb_trim(skb, rx_len);
1327 skb_pull(skb, INTF_HEADER_LEN);
1328
Amitkumar Karward930fae2011-10-11 17:41:21 -07001329 if (!adapter->curr_cmd) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001330 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001331 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1332 skb->len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001333 while (mwifiex_pcie_ok_to_access_hw(adapter) &&
1334 (count++ < 10))
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -07001335 usleep_range(50, 60);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001336 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001337 dev_err(adapter->dev,
1338 "There is no command but got cmdrsp\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001339 }
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001340 memcpy(adapter->upld_buf, skb->data,
1341 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
Avinash Patilfc331462013-01-03 21:21:30 -08001342 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1343 PCI_DMA_FROMDEVICE))
1344 return -1;
1345
1346 MWIFIEX_SKB_PACB(skb, &buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001347 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001348 adapter->curr_cmd->resp_skb = skb;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001349 adapter->cmd_resp_received = true;
1350 /* Take the pointer and set it to CMD node and will
1351 return in the response complete callback */
1352 card->cmdrsp_buf = NULL;
1353
1354 /* Clear the cmd-rsp buffer address in scratch registers. This
1355 will prevent firmware from writing to the same response
1356 buffer again. */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001357 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001358 dev_err(adapter->dev,
1359 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001360 return -1;
1361 }
1362 /* Write the upper 32bits of the cmdrsp buffer physical
1363 address */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001364 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001365 dev_err(adapter->dev,
1366 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001367 return -1;
1368 }
1369 }
1370
1371 return 0;
1372}
1373
1374/*
1375 * Command Response processing complete handler
1376 */
1377static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1378 struct sk_buff *skb)
1379{
1380 struct pcie_service_card *card = adapter->card;
Avinash Patilfc331462013-01-03 21:21:30 -08001381 dma_addr_t buf_pa;
1382 struct sk_buff *skb_tmp;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001383
1384 if (skb) {
1385 card->cmdrsp_buf = skb;
1386 skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
Avinash Patilfc331462013-01-03 21:21:30 -08001387 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1388 PCI_DMA_FROMDEVICE))
1389 return -1;
1390 }
1391
1392 skb_tmp = card->cmd_buf;
1393 if (skb_tmp) {
1394 MWIFIEX_SKB_PACB(skb_tmp, &buf_pa);
1395 pci_unmap_single(card->dev, buf_pa, MWIFIEX_UPLD_SIZE,
1396 PCI_DMA_FROMDEVICE);
1397 card->cmd_buf = NULL;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001398 }
1399
1400 return 0;
1401}
1402
1403/*
1404 * This function handles firmware event ready interrupt
1405 */
1406static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1407{
1408 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001409 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001410 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1411 u32 wrptr, event;
Avinash Patilfc331462013-01-03 21:21:30 -08001412 dma_addr_t buf_pa;
1413
1414 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1415 mwifiex_pm_wakeup_card(adapter);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001416
1417 if (adapter->event_received) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001418 dev_dbg(adapter->dev, "info: Event being processed, "
1419 "do not process this interrupt just yet\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001420 return 0;
1421 }
1422
1423 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1424 dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
1425 return -1;
1426 }
1427
1428 /* Read the event ring write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001429 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001430 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001431 "EventReady: failed to read reg->evt_wrptr\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001432 return -1;
1433 }
1434
1435 dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001436 card->evtbd_rdptr, wrptr);
1437 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1438 & MWIFIEX_EVTBD_MASK)) ||
Avinash Patildd04e6a2013-02-08 18:18:06 -08001439 ((wrptr & reg->evt_rollover_ind) ==
1440 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001441 struct sk_buff *skb_cmd;
1442 __le16 data_len = 0;
1443 u16 evt_len;
1444
1445 dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
1446 skb_cmd = card->evt_buf_list[rdptr];
Avinash Patilfc331462013-01-03 21:21:30 -08001447 MWIFIEX_SKB_PACB(skb_cmd, &buf_pa);
1448 pci_unmap_single(card->dev, buf_pa, MAX_EVENT_SIZE,
1449 PCI_DMA_FROMDEVICE);
1450
Amitkumar Karward930fae2011-10-11 17:41:21 -07001451 /* Take the pointer and set it to event pointer in adapter
1452 and will return back after event handling callback */
1453 card->evt_buf_list[rdptr] = NULL;
1454 card->evtbd_ring[rdptr]->paddr = 0;
1455 card->evtbd_ring[rdptr]->len = 0;
1456 card->evtbd_ring[rdptr]->flags = 0;
1457
1458 event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
1459 adapter->event_cause = event;
1460 /* The first 4bytes will be the event transfer header
1461 len is 2 bytes followed by type which is 2 bytes */
1462 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1463 evt_len = le16_to_cpu(data_len);
1464
1465 skb_pull(skb_cmd, INTF_HEADER_LEN);
1466 dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
1467
1468 if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
1469 memcpy(adapter->event_body, skb_cmd->data +
1470 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1471 MWIFIEX_EVENT_HEADER_LEN);
1472
1473 adapter->event_received = true;
1474 adapter->event_skb = skb_cmd;
1475
1476 /* Do not update the event read pointer here, wait till the
1477 buffer is released. This is just to make things simpler,
1478 we need to find a better method of managing these buffers.
1479 */
1480 }
1481
1482 return 0;
1483}
1484
1485/*
1486 * Event processing complete handler
1487 */
1488static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1489 struct sk_buff *skb)
1490{
1491 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001492 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001493 int ret = 0;
1494 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1495 u32 wrptr;
Avinash Patilfc331462013-01-03 21:21:30 -08001496 dma_addr_t buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001497
1498 if (!skb)
1499 return 0;
1500
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001501 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001502 dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001503 rdptr);
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001504 return -EINVAL;
Dan Carpenter1eb54c82011-11-07 19:31:47 -08001505 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001506
1507 /* Read the event ring write pointer set by firmware */
Avinash Patildd04e6a2013-02-08 18:18:06 -08001508 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001509 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001510 "event_complete: failed to read reg->evt_wrptr\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001511 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001512 }
1513
1514 if (!card->evt_buf_list[rdptr]) {
1515 skb_push(skb, INTF_HEADER_LEN);
Avinash Patilfc331462013-01-03 21:21:30 -08001516 if (mwifiex_map_pci_memory(adapter, skb,
1517 MAX_EVENT_SIZE,
1518 PCI_DMA_FROMDEVICE))
1519 return -1;
1520 MWIFIEX_SKB_PACB(skb, &buf_pa);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001521 card->evt_buf_list[rdptr] = skb;
Avinash Patilfc331462013-01-03 21:21:30 -08001522 MWIFIEX_SKB_PACB(skb, &buf_pa);
1523 card->evtbd_ring[rdptr]->paddr = buf_pa;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001524 card->evtbd_ring[rdptr]->len = (u16)skb->len;
1525 card->evtbd_ring[rdptr]->flags = 0;
1526 skb = NULL;
1527 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001528 dev_dbg(adapter->dev,
1529 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1530 rdptr, card->evt_buf_list[rdptr], skb);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001531 }
1532
1533 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1534 card->evtbd_rdptr = ((card->evtbd_rdptr &
Avinash Patildd04e6a2013-02-08 18:18:06 -08001535 reg->evt_rollover_ind) ^
1536 reg->evt_rollover_ind);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001537 }
1538
1539 dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001540 card->evtbd_rdptr, wrptr);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001541
Avinash Patildd04e6a2013-02-08 18:18:06 -08001542 /* Write the event ring read pointer in to reg->evt_rdptr */
1543 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1544 card->evtbd_rdptr)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001545 dev_err(adapter->dev,
Avinash Patildd04e6a2013-02-08 18:18:06 -08001546 "event_complete: failed to read reg->evt_rdptr\n");
Amitkumar Karwar8c53e422011-12-08 20:41:03 -08001547 return -1;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001548 }
1549
Amitkumar Karward930fae2011-10-11 17:41:21 -07001550 dev_dbg(adapter->dev, "info: Check Events Again\n");
1551 ret = mwifiex_pcie_process_event_ready(adapter);
1552
1553 return ret;
1554}
1555
1556/*
1557 * This function downloads the firmware to the card.
1558 *
1559 * Firmware is downloaded to the card in blocks. Every block download
1560 * is tested for CRC errors, and retried a number of times before
1561 * returning failure.
1562 */
1563static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
1564 struct mwifiex_fw_image *fw)
1565{
1566 int ret;
1567 u8 *firmware = fw->fw_buf;
1568 u32 firmware_len = fw->fw_len;
1569 u32 offset = 0;
1570 struct sk_buff *skb;
1571 u32 txlen, tx_blocks = 0, tries, len;
1572 u32 block_retry_cnt = 0;
Avinash Patilfc331462013-01-03 21:21:30 -08001573 dma_addr_t buf_pa;
1574 struct pcie_service_card *card = adapter->card;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001575 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001576
1577 if (!firmware || !firmware_len) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001578 dev_err(adapter->dev,
1579 "No firmware image found! Terminating download\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001580 return -1;
1581 }
1582
1583 dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001584 firmware_len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001585
1586 if (mwifiex_pcie_disable_host_int(adapter)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001587 dev_err(adapter->dev,
1588 "%s: Disabling interrupts failed.\n", __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001589 return -1;
1590 }
1591
1592 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1593 if (!skb) {
1594 ret = -ENOMEM;
1595 goto done;
1596 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001597
1598 /* Perform firmware data transfer */
1599 do {
1600 u32 ireg_intr = 0;
1601
1602 /* More data? */
1603 if (offset >= firmware_len)
1604 break;
1605
1606 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
Avinash Patildd04e6a2013-02-08 18:18:06 -08001607 ret = mwifiex_read_reg(adapter, reg->cmd_size,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001608 &len);
1609 if (ret) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001610 dev_warn(adapter->dev,
1611 "Failed reading len from boot code\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001612 goto done;
1613 }
1614 if (len)
1615 break;
Yogesh Ashok Poware7891ba2012-03-12 19:35:11 -07001616 usleep_range(10, 20);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001617 }
1618
1619 if (!len) {
1620 break;
1621 } else if (len > MWIFIEX_UPLD_SIZE) {
1622 pr_err("FW download failure @ %d, invalid length %d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001623 offset, len);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001624 ret = -1;
1625 goto done;
1626 }
1627
1628 txlen = len;
1629
1630 if (len & BIT(0)) {
1631 block_retry_cnt++;
1632 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
1633 pr_err("FW download failure @ %d, over max "
1634 "retry count\n", offset);
1635 ret = -1;
1636 goto done;
1637 }
1638 dev_err(adapter->dev, "FW CRC error indicated by the "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001639 "helper: len = 0x%04X, txlen = %d\n",
1640 len, txlen);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001641 len &= ~BIT(0);
1642 /* Setting this to 0 to resend from same offset */
1643 txlen = 0;
1644 } else {
1645 block_retry_cnt = 0;
1646 /* Set blocksize to transfer - checking for
1647 last block */
1648 if (firmware_len - offset < txlen)
1649 txlen = firmware_len - offset;
1650
1651 dev_dbg(adapter->dev, ".");
1652
Avinash Patildd04e6a2013-02-08 18:18:06 -08001653 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
1654 card->pcie.blksz_fw_dl;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001655
1656 /* Copy payload to buffer */
1657 memmove(skb->data, &firmware[offset], txlen);
1658 }
1659
1660 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
Avinash Patildd04e6a2013-02-08 18:18:06 -08001661 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001662
1663 /* Send the boot command to device */
1664 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001665 dev_err(adapter->dev,
1666 "Failed to send firmware download command\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001667 ret = -1;
1668 goto done;
1669 }
Avinash Patilfc331462013-01-03 21:21:30 -08001670
1671 MWIFIEX_SKB_PACB(skb, &buf_pa);
1672
Amitkumar Karward930fae2011-10-11 17:41:21 -07001673 /* Wait for the command done interrupt */
1674 do {
1675 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
1676 &ireg_intr)) {
1677 dev_err(adapter->dev, "%s: Failed to read "
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001678 "interrupt status during fw dnld.\n",
1679 __func__);
Avinash Patilfc331462013-01-03 21:21:30 -08001680 pci_unmap_single(card->dev, buf_pa, skb->len,
1681 PCI_DMA_TODEVICE);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001682 ret = -1;
1683 goto done;
1684 }
1685 } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
1686 CPU_INTR_DOOR_BELL);
Avinash Patilfc331462013-01-03 21:21:30 -08001687
1688 pci_unmap_single(card->dev, buf_pa, skb->len,
1689 PCI_DMA_TODEVICE);
1690
Amitkumar Karward930fae2011-10-11 17:41:21 -07001691 offset += txlen;
1692 } while (true);
1693
1694 dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001695 offset);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001696
1697 ret = 0;
1698
1699done:
1700 dev_kfree_skb_any(skb);
1701 return ret;
1702}
1703
1704/*
1705 * This function checks the firmware status in card.
1706 *
1707 * The winner interface is also determined by this function.
1708 */
1709static int
1710mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
1711{
1712 int ret = 0;
1713 u32 firmware_stat, winner_status;
Avinash Patildd04e6a2013-02-08 18:18:06 -08001714 struct pcie_service_card *card = adapter->card;
1715 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001716 u32 tries;
1717
1718 /* Mask spurios interrupts */
1719 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001720 HOST_INTR_MASK)) {
Amitkumar Karward930fae2011-10-11 17:41:21 -07001721 dev_warn(adapter->dev, "Write register failed\n");
1722 return -1;
1723 }
1724
1725 dev_dbg(adapter->dev, "Setting driver ready signature\n");
Avinash Patildd04e6a2013-02-08 18:18:06 -08001726 if (mwifiex_write_reg(adapter, reg->drv_rdy,
1727 FIRMWARE_READY_PCIE)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001728 dev_err(adapter->dev,
1729 "Failed to write driver ready signature\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001730 return -1;
1731 }
1732
1733 /* Wait for firmware initialization event */
1734 for (tries = 0; tries < poll_num; tries++) {
Avinash Patildd04e6a2013-02-08 18:18:06 -08001735 if (mwifiex_read_reg(adapter, reg->fw_status,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001736 &firmware_stat))
1737 ret = -1;
1738 else
1739 ret = 0;
1740 if (ret)
1741 continue;
1742 if (firmware_stat == FIRMWARE_READY_PCIE) {
1743 ret = 0;
1744 break;
1745 } else {
1746 mdelay(100);
1747 ret = -1;
1748 }
1749 }
1750
1751 if (ret) {
Avinash Patildd04e6a2013-02-08 18:18:06 -08001752 if (mwifiex_read_reg(adapter, reg->fw_status,
Amitkumar Karward930fae2011-10-11 17:41:21 -07001753 &winner_status))
1754 ret = -1;
1755 else if (!winner_status) {
1756 dev_err(adapter->dev, "PCI-E is the winner\n");
1757 adapter->winner = 1;
1758 ret = -1;
1759 } else {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001760 dev_err(adapter->dev,
1761 "PCI-E is not the winner <%#x,%d>, exit dnld\n",
1762 ret, adapter->winner);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001763 ret = 0;
1764 }
1765 }
1766
1767 return ret;
1768}
1769
1770/*
1771 * This function reads the interrupt status from card.
1772 */
1773static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
1774{
1775 u32 pcie_ireg;
1776 unsigned long flags;
1777
1778 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1779 return;
1780
1781 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
1782 dev_warn(adapter->dev, "Read register failed\n");
1783 return;
1784 }
1785
1786 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1787
1788 mwifiex_pcie_disable_host_int(adapter);
1789
1790 /* Clear the pending interrupts */
1791 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
1792 ~pcie_ireg)) {
1793 dev_warn(adapter->dev, "Write register failed\n");
1794 return;
1795 }
1796 spin_lock_irqsave(&adapter->int_lock, flags);
1797 adapter->int_status |= pcie_ireg;
1798 spin_unlock_irqrestore(&adapter->int_lock, flags);
1799
1800 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1801 if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
1802 (adapter->ps_state == PS_STATE_SLEEP)) {
1803 mwifiex_pcie_enable_host_int(adapter);
1804 if (mwifiex_write_reg(adapter,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001805 PCIE_CPU_INT_EVENT,
1806 CPU_INTR_SLEEP_CFM_DONE)
1807 ) {
1808 dev_warn(adapter->dev,
1809 "Write register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001810 return;
1811
1812 }
1813 }
1814 } else if (!adapter->pps_uapsd_mode &&
1815 adapter->ps_state == PS_STATE_SLEEP) {
1816 /* Potentially for PCIe we could get other
1817 * interrupts like shared. Don't change power
1818 * state until cookie is set */
1819 if (mwifiex_pcie_ok_to_access_hw(adapter))
1820 adapter->ps_state = PS_STATE_AWAKE;
1821 }
1822 }
1823}
1824
1825/*
1826 * Interrupt handler for PCIe root port
1827 *
1828 * This function reads the interrupt status from firmware and assigns
1829 * the main process in workqueue which will handle the interrupt.
1830 */
1831static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
1832{
1833 struct pci_dev *pdev = (struct pci_dev *)context;
1834 struct pcie_service_card *card;
1835 struct mwifiex_adapter *adapter;
1836
1837 if (!pdev) {
1838 pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
1839 goto exit;
1840 }
1841
1842 card = (struct pcie_service_card *) pci_get_drvdata(pdev);
1843 if (!card || !card->adapter) {
1844 pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001845 card ? card->adapter : NULL);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001846 goto exit;
1847 }
1848 adapter = card->adapter;
1849
1850 if (adapter->surprise_removed)
1851 goto exit;
1852
1853 mwifiex_interrupt_status(adapter);
1854 queue_work(adapter->workqueue, &adapter->main_work);
1855
1856exit:
1857 return IRQ_HANDLED;
1858}
1859
1860/*
1861 * This function checks the current interrupt status.
1862 *
1863 * The following interrupts are checked and handled by this function -
1864 * - Data sent
1865 * - Command sent
1866 * - Command received
1867 * - Packets received
1868 * - Events received
1869 *
1870 * In case of Rx packets received, the packets are uploaded from card to
1871 * host and processed accordingly.
1872 */
1873static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1874{
1875 int ret;
Avinash Patil659c4782013-01-03 21:21:28 -08001876 u32 pcie_ireg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001877 unsigned long flags;
1878
1879 spin_lock_irqsave(&adapter->int_lock, flags);
1880 /* Clear out unused interrupts */
Avinash Patil659c4782013-01-03 21:21:28 -08001881 pcie_ireg = adapter->int_status;
1882 adapter->int_status = 0;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001883 spin_unlock_irqrestore(&adapter->int_lock, flags);
1884
Avinash Patil659c4782013-01-03 21:21:28 -08001885 while (pcie_ireg & HOST_INTR_MASK) {
1886 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
1887 pcie_ireg &= ~HOST_INTR_DNLD_DONE;
Avinash Patile7f767a2013-01-03 21:21:32 -08001888 dev_dbg(adapter->dev, "info: TX DNLD Done\n");
1889 ret = mwifiex_pcie_send_data_complete(adapter);
1890 if (ret)
1891 return ret;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001892 }
Avinash Patil659c4782013-01-03 21:21:28 -08001893 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
1894 pcie_ireg &= ~HOST_INTR_UPLD_RDY;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001895 dev_dbg(adapter->dev, "info: Rx DATA\n");
1896 ret = mwifiex_pcie_process_recv_data(adapter);
1897 if (ret)
1898 return ret;
1899 }
Avinash Patil659c4782013-01-03 21:21:28 -08001900 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
1901 pcie_ireg &= ~HOST_INTR_EVENT_RDY;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001902 dev_dbg(adapter->dev, "info: Rx EVENT\n");
1903 ret = mwifiex_pcie_process_event_ready(adapter);
1904 if (ret)
1905 return ret;
1906 }
1907
Avinash Patil659c4782013-01-03 21:21:28 -08001908 if (pcie_ireg & HOST_INTR_CMD_DONE) {
1909 pcie_ireg &= ~HOST_INTR_CMD_DONE;
Amitkumar Karward930fae2011-10-11 17:41:21 -07001910 if (adapter->cmd_sent) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001911 dev_dbg(adapter->dev,
1912 "info: CMD sent Interrupt\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001913 adapter->cmd_sent = false;
1914 }
1915 /* Handle command response */
1916 ret = mwifiex_pcie_process_cmd_complete(adapter);
1917 if (ret)
1918 return ret;
1919 }
1920
1921 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1922 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
1923 &pcie_ireg)) {
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001924 dev_warn(adapter->dev,
1925 "Read register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001926 return -1;
1927 }
1928
1929 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
1930 if (mwifiex_write_reg(adapter,
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001931 PCIE_HOST_INT_STATUS,
1932 ~pcie_ireg)) {
1933 dev_warn(adapter->dev,
1934 "Write register failed\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07001935 return -1;
1936 }
Amitkumar Karward930fae2011-10-11 17:41:21 -07001937 }
1938
1939 }
1940 }
1941 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07001942 adapter->cmd_sent, adapter->data_sent);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001943 mwifiex_pcie_enable_host_int(adapter);
1944
1945 return 0;
1946}
1947
1948/*
1949 * This function downloads data from driver to card.
1950 *
1951 * Both commands and data packets are transferred to the card by this
1952 * function.
1953 *
1954 * This function adds the PCIE specific header to the front of the buffer
1955 * before transferring. The header contains the length of the packet and
1956 * the type. The firmware handles the packets based upon this set type.
1957 */
1958static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
1959 struct sk_buff *skb,
1960 struct mwifiex_tx_param *tx_param)
1961{
Dan Carpenterfa161cb2011-11-07 19:31:45 -08001962 if (!skb) {
1963 dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001964 return -1;
1965 }
1966
1967 if (type == MWIFIEX_TYPE_DATA)
Avinash Patile7f767a2013-01-03 21:21:32 -08001968 return mwifiex_pcie_send_data(adapter, skb, tx_param);
Amitkumar Karward930fae2011-10-11 17:41:21 -07001969 else if (type == MWIFIEX_TYPE_CMD)
1970 return mwifiex_pcie_send_cmd(adapter, skb);
1971
1972 return 0;
1973}
1974
1975/*
1976 * This function initializes the PCI-E host memory space, WCB rings, etc.
1977 *
1978 * The following initializations steps are followed -
1979 * - Allocate TXBD ring buffers
1980 * - Allocate RXBD ring buffers
1981 * - Allocate event BD ring buffers
1982 * - Allocate command response ring buffer
1983 * - Allocate sleep cookie buffer
1984 */
1985static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
1986{
1987 struct pcie_service_card *card = adapter->card;
1988 int ret;
1989 struct pci_dev *pdev = card->dev;
1990
1991 pci_set_drvdata(pdev, card);
1992
1993 ret = pci_enable_device(pdev);
1994 if (ret)
1995 goto err_enable_dev;
1996
1997 pci_set_master(pdev);
1998
1999 dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
2000 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2001 if (ret) {
2002 dev_err(adapter->dev, "set_dma_mask(32) failed\n");
2003 goto err_set_dma_mask;
2004 }
2005
2006 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2007 if (ret) {
2008 dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
2009 goto err_set_dma_mask;
2010 }
2011
2012 ret = pci_request_region(pdev, 0, DRV_NAME);
2013 if (ret) {
2014 dev_err(adapter->dev, "req_reg(0) error\n");
2015 goto err_req_region0;
2016 }
2017 card->pci_mmap = pci_iomap(pdev, 0, 0);
2018 if (!card->pci_mmap) {
2019 dev_err(adapter->dev, "iomap(0) error\n");
Alexey Khoroshilov32207122013-01-26 00:56:03 +04002020 ret = -EIO;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002021 goto err_iomap0;
2022 }
2023 ret = pci_request_region(pdev, 2, DRV_NAME);
2024 if (ret) {
2025 dev_err(adapter->dev, "req_reg(2) error\n");
2026 goto err_req_region2;
2027 }
2028 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2029 if (!card->pci_mmap1) {
2030 dev_err(adapter->dev, "iomap(2) error\n");
Alexey Khoroshilov32207122013-01-26 00:56:03 +04002031 ret = -EIO;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002032 goto err_iomap2;
2033 }
2034
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002035 dev_dbg(adapter->dev,
2036 "PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2037 card->pci_mmap, card->pci_mmap1);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002038
2039 card->cmdrsp_buf = NULL;
2040 ret = mwifiex_pcie_create_txbd_ring(adapter);
2041 if (ret)
2042 goto err_cre_txbd;
2043 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2044 if (ret)
2045 goto err_cre_rxbd;
2046 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2047 if (ret)
2048 goto err_cre_evtbd;
2049 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2050 if (ret)
2051 goto err_alloc_cmdbuf;
2052 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2053 if (ret)
2054 goto err_alloc_cookie;
2055
2056 return ret;
2057
2058err_alloc_cookie:
2059 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2060err_alloc_cmdbuf:
2061 mwifiex_pcie_delete_evtbd_ring(adapter);
2062err_cre_evtbd:
2063 mwifiex_pcie_delete_rxbd_ring(adapter);
2064err_cre_rxbd:
2065 mwifiex_pcie_delete_txbd_ring(adapter);
2066err_cre_txbd:
2067 pci_iounmap(pdev, card->pci_mmap1);
2068err_iomap2:
2069 pci_release_region(pdev, 2);
2070err_req_region2:
2071 pci_iounmap(pdev, card->pci_mmap);
2072err_iomap0:
2073 pci_release_region(pdev, 0);
2074err_req_region0:
2075err_set_dma_mask:
2076 pci_disable_device(pdev);
2077err_enable_dev:
2078 pci_set_drvdata(pdev, NULL);
2079 return ret;
2080}
2081
2082/*
2083 * This function cleans up the allocated card buffers.
2084 *
2085 * The following are freed by this function -
2086 * - TXBD ring buffers
2087 * - RXBD ring buffers
2088 * - Event BD ring buffers
2089 * - Command response ring buffer
2090 * - Sleep cookie buffer
2091 */
2092static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
2093{
2094 struct pcie_service_card *card = adapter->card;
2095 struct pci_dev *pdev = card->dev;
Avinash Patildd04e6a2013-02-08 18:18:06 -08002096 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002097
Amitkumar Karward930fae2011-10-11 17:41:21 -07002098 if (user_rmmod) {
Avinash Patilfc331462013-01-03 21:21:30 -08002099 dev_dbg(adapter->dev, "Clearing driver ready signature\n");
Avinash Patildd04e6a2013-02-08 18:18:06 -08002100 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
Yogesh Ashok Powarf57c1ed2012-03-13 19:22:37 -07002101 dev_err(adapter->dev,
2102 "Failed to write driver not-ready signature\n");
Amitkumar Karward930fae2011-10-11 17:41:21 -07002103 }
2104
2105 if (pdev) {
2106 pci_iounmap(pdev, card->pci_mmap);
2107 pci_iounmap(pdev, card->pci_mmap1);
2108
2109 pci_release_regions(pdev);
2110 pci_disable_device(pdev);
2111 pci_set_drvdata(pdev, NULL);
2112 }
2113}
2114
2115/*
2116 * This function registers the PCIE device.
2117 *
2118 * PCIE IRQ is claimed, block size is set and driver data is initialized.
2119 */
2120static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
2121{
2122 int ret;
2123 struct pcie_service_card *card = adapter->card;
2124 struct pci_dev *pdev = card->dev;
2125
2126 /* save adapter pointer in card */
2127 card->adapter = adapter;
2128
2129 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
2130 "MRVL_PCIE", pdev);
2131 if (ret) {
2132 pr_err("request_irq failed: ret=%d\n", ret);
2133 adapter->card = NULL;
2134 return -1;
2135 }
2136
2137 adapter->dev = &pdev->dev;
Avinash Patildd04e6a2013-02-08 18:18:06 -08002138 strcpy(adapter->fw_name, card->pcie.firmware);
Amitkumar Karward930fae2011-10-11 17:41:21 -07002139
2140 return 0;
2141}
2142
2143/*
2144 * This function unregisters the PCIE device.
2145 *
2146 * The PCIE IRQ is released, the function is disabled and driver
2147 * data is set to null.
2148 */
2149static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
2150{
2151 struct pcie_service_card *card = adapter->card;
2152
2153 if (card) {
2154 dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
2155 free_irq(card->dev->irq, card->dev);
Avinash Patilfc331462013-01-03 21:21:30 -08002156
2157 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2158 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2159 mwifiex_pcie_delete_evtbd_ring(adapter);
2160 mwifiex_pcie_delete_rxbd_ring(adapter);
2161 mwifiex_pcie_delete_txbd_ring(adapter);
2162 card->cmdrsp_buf = NULL;
Amitkumar Karward930fae2011-10-11 17:41:21 -07002163 }
2164}
2165
2166static struct mwifiex_if_ops pcie_ops = {
2167 .init_if = mwifiex_pcie_init,
2168 .cleanup_if = mwifiex_pcie_cleanup,
2169 .check_fw_status = mwifiex_check_fw_status,
2170 .prog_fw = mwifiex_prog_fw_w_helper,
2171 .register_dev = mwifiex_register_dev,
2172 .unregister_dev = mwifiex_unregister_dev,
2173 .enable_int = mwifiex_pcie_enable_host_int,
2174 .process_int_status = mwifiex_process_int_status,
2175 .host_to_card = mwifiex_pcie_host_to_card,
2176 .wakeup = mwifiex_pm_wakeup_card,
2177 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
2178
2179 /* PCIE specific */
2180 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
2181 .event_complete = mwifiex_pcie_event_complete,
2182 .update_mp_end_port = NULL,
2183 .cleanup_mpa_buf = NULL,
Avinash Patilc6d1d872013-01-03 21:21:29 -08002184 .init_fw_port = mwifiex_pcie_init_fw_port,
Avinash Patilfbd7e7a2013-01-03 21:21:31 -08002185 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
Amitkumar Karward930fae2011-10-11 17:41:21 -07002186};
2187
2188/*
2189 * This function initializes the PCIE driver module.
2190 *
2191 * This initiates the semaphore and registers the device with
2192 * PCIE bus.
2193 */
2194static int mwifiex_pcie_init_module(void)
2195{
2196 int ret;
2197
2198 pr_debug("Marvell 8766 PCIe Driver\n");
2199
2200 sema_init(&add_remove_card_sem, 1);
2201
2202 /* Clear the flag in case user removes the card. */
2203 user_rmmod = 0;
2204
2205 ret = pci_register_driver(&mwifiex_pcie);
2206 if (ret)
2207 pr_err("Driver register failed!\n");
2208 else
2209 pr_debug("info: Driver registered successfully!\n");
2210
2211 return ret;
2212}
2213
2214/*
2215 * This function cleans up the PCIE driver.
2216 *
2217 * The following major steps are followed for cleanup -
2218 * - Resume the device if its suspended
2219 * - Disconnect the device if connected
2220 * - Shutdown the firmware
2221 * - Unregister the device from PCIE bus.
2222 */
2223static void mwifiex_pcie_cleanup_module(void)
2224{
2225 if (!down_interruptible(&add_remove_card_sem))
2226 up(&add_remove_card_sem);
2227
2228 /* Set the flag as user is removing this module. */
2229 user_rmmod = 1;
2230
2231 pci_unregister_driver(&mwifiex_pcie);
2232}
2233
2234module_init(mwifiex_pcie_init_module);
2235module_exit(mwifiex_pcie_cleanup_module);
2236
2237MODULE_AUTHOR("Marvell International Ltd.");
2238MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
2239MODULE_VERSION(PCIE_VERSION);
2240MODULE_LICENSE("GPL v2");
2241MODULE_FIRMWARE("mrvl/pcie8766_uapsta.bin");