1 /*
2 * Marvell Wireless LAN device driver: PCIE specific handling
3 *
4 * Copyright (C) 2011-2014, 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
34 static struct mwifiex_if_ops pcie_ops;
35
36 static const struct of_device_id mwifiex_pcie_of_match_table[] = {
37 { .compatible = "pci11ab,2b42" },
38 { .compatible = "pci1b4b,2b42" },
39 { }
40 };
41
mwifiex_pcie_probe_of(struct device * dev)42 static int mwifiex_pcie_probe_of(struct device *dev)
43 {
44 if (!of_match_node(mwifiex_pcie_of_match_table, dev->of_node)) {
45 dev_err(dev, "required compatible string missing\n");
46 return -EINVAL;
47 }
48
49 return 0;
50 }
51
52 static void mwifiex_pcie_work(struct work_struct *work);
53
54 static int
mwifiex_map_pci_memory(struct mwifiex_adapter * adapter,struct sk_buff * skb,size_t size,int flags)55 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
56 size_t size, int flags)
57 {
58 struct pcie_service_card *card = adapter->card;
59 struct mwifiex_dma_mapping mapping;
60
61 mapping.addr = pci_map_single(card->dev, skb->data, size, flags);
62 if (pci_dma_mapping_error(card->dev, mapping.addr)) {
63 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
64 return -1;
65 }
66 mapping.len = size;
67 mwifiex_store_mapping(skb, &mapping);
68 return 0;
69 }
70
mwifiex_unmap_pci_memory(struct mwifiex_adapter * adapter,struct sk_buff * skb,int flags)71 static void mwifiex_unmap_pci_memory(struct mwifiex_adapter *adapter,
72 struct sk_buff *skb, int flags)
73 {
74 struct pcie_service_card *card = adapter->card;
75 struct mwifiex_dma_mapping mapping;
76
77 mwifiex_get_mapping(skb, &mapping);
78 pci_unmap_single(card->dev, mapping.addr, mapping.len, flags);
79 }
80
81 /*
82 * This function writes data into PCIE card register.
83 */
mwifiex_write_reg(struct mwifiex_adapter * adapter,int reg,u32 data)84 static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
85 {
86 struct pcie_service_card *card = adapter->card;
87
88 iowrite32(data, card->pci_mmap1 + reg);
89
90 return 0;
91 }
92
93 /* This function reads data from PCIE card register.
94 */
mwifiex_read_reg(struct mwifiex_adapter * adapter,int reg,u32 * data)95 static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
96 {
97 struct pcie_service_card *card = adapter->card;
98
99 *data = ioread32(card->pci_mmap1 + reg);
100 if (*data == 0xffffffff)
101 return 0xffffffff;
102
103 return 0;
104 }
105
106 /* This function reads u8 data from PCIE card register. */
mwifiex_read_reg_byte(struct mwifiex_adapter * adapter,int reg,u8 * data)107 static int mwifiex_read_reg_byte(struct mwifiex_adapter *adapter,
108 int reg, u8 *data)
109 {
110 struct pcie_service_card *card = adapter->card;
111
112 *data = ioread8(card->pci_mmap1 + reg);
113
114 return 0;
115 }
116
117 /*
118 * This function reads sleep cookie and checks if FW is ready
119 */
mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter * adapter)120 static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
121 {
122 u32 cookie_value;
123 struct pcie_service_card *card = adapter->card;
124 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
125
126 if (!reg->sleep_cookie)
127 return true;
128
129 if (card->sleep_cookie_vbase) {
130 cookie_value = get_unaligned_le32(card->sleep_cookie_vbase);
131 mwifiex_dbg(adapter, INFO,
132 "info: ACCESS_HW: sleep cookie=0x%x\n",
133 cookie_value);
134 if (cookie_value == FW_AWAKE_COOKIE)
135 return true;
136 }
137
138 return false;
139 }
140
141 #ifdef CONFIG_PM_SLEEP
142 /*
143 * Kernel needs to suspend all functions separately. Therefore all
144 * registered functions must have drivers with suspend and resume
145 * methods. Failing that the kernel simply removes the whole card.
146 *
147 * If already not suspended, this function allocates and sends a host
148 * sleep activate request to the firmware and turns off the traffic.
149 */
mwifiex_pcie_suspend(struct device * dev)150 static int mwifiex_pcie_suspend(struct device *dev)
151 {
152 struct mwifiex_adapter *adapter;
153 struct pcie_service_card *card;
154 struct pci_dev *pdev = to_pci_dev(dev);
155
156 card = pci_get_drvdata(pdev);
157
158 /* Might still be loading firmware */
159 wait_for_completion(&card->fw_done);
160
161 adapter = card->adapter;
162 if (!adapter) {
163 dev_err(dev, "adapter is not valid\n");
164 return 0;
165 }
166
167 mwifiex_enable_wake(adapter);
168
169 /* Enable the Host Sleep */
170 if (!mwifiex_enable_hs(adapter)) {
171 mwifiex_dbg(adapter, ERROR,
172 "cmd: failed to suspend\n");
173 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
174 mwifiex_disable_wake(adapter);
175 return -EFAULT;
176 }
177
178 flush_workqueue(adapter->workqueue);
179
180 /* Indicate device suspended */
181 set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
182 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
183
184 return 0;
185 }
186
187 /*
188 * Kernel needs to suspend all functions separately. Therefore all
189 * registered functions must have drivers with suspend and resume
190 * methods. Failing that the kernel simply removes the whole card.
191 *
192 * If already not resumed, this function turns on the traffic and
193 * sends a host sleep cancel request to the firmware.
194 */
mwifiex_pcie_resume(struct device * dev)195 static int mwifiex_pcie_resume(struct device *dev)
196 {
197 struct mwifiex_adapter *adapter;
198 struct pcie_service_card *card;
199 struct pci_dev *pdev = to_pci_dev(dev);
200
201 card = pci_get_drvdata(pdev);
202
203 if (!card->adapter) {
204 dev_err(dev, "adapter structure is not valid\n");
205 return 0;
206 }
207
208 adapter = card->adapter;
209
210 if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) {
211 mwifiex_dbg(adapter, WARN,
212 "Device already resumed\n");
213 return 0;
214 }
215
216 clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
217
218 mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
219 MWIFIEX_ASYNC_CMD);
220 mwifiex_disable_wake(adapter);
221
222 return 0;
223 }
224 #endif
225
226 /*
227 * This function probes an mwifiex device and registers it. It allocates
228 * the card structure, enables PCIE function number and initiates the
229 * device registration and initialization procedure by adding a logical
230 * interface.
231 */
mwifiex_pcie_probe(struct pci_dev * pdev,const struct pci_device_id * ent)232 static int mwifiex_pcie_probe(struct pci_dev *pdev,
233 const struct pci_device_id *ent)
234 {
235 struct pcie_service_card *card;
236 int ret;
237
238 pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
239 pdev->vendor, pdev->device, pdev->revision);
240
241 card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
242 if (!card)
243 return -ENOMEM;
244
245 init_completion(&card->fw_done);
246
247 card->dev = pdev;
248
249 if (ent->driver_data) {
250 struct mwifiex_pcie_device *data = (void *)ent->driver_data;
251 card->pcie.reg = data->reg;
252 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
253 card->pcie.tx_buf_size = data->tx_buf_size;
254 card->pcie.can_dump_fw = data->can_dump_fw;
255 card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl;
256 card->pcie.num_mem_types = data->num_mem_types;
257 card->pcie.can_ext_scan = data->can_ext_scan;
258 INIT_WORK(&card->work, mwifiex_pcie_work);
259 }
260
261 /* device tree node parsing and platform specific configuration*/
262 if (pdev->dev.of_node) {
263 ret = mwifiex_pcie_probe_of(&pdev->dev);
264 if (ret)
265 return ret;
266 }
267
268 if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
269 MWIFIEX_PCIE, &pdev->dev)) {
270 pr_err("%s failed\n", __func__);
271 return -1;
272 }
273
274 return 0;
275 }
276
277 /*
278 * This function removes the interface and frees up the card structure.
279 */
mwifiex_pcie_remove(struct pci_dev * pdev)280 static void mwifiex_pcie_remove(struct pci_dev *pdev)
281 {
282 struct pcie_service_card *card;
283 struct mwifiex_adapter *adapter;
284 struct mwifiex_private *priv;
285 const struct mwifiex_pcie_card_reg *reg;
286 u32 fw_status;
287 int ret;
288
289 card = pci_get_drvdata(pdev);
290
291 wait_for_completion(&card->fw_done);
292
293 adapter = card->adapter;
294 if (!adapter || !adapter->priv_num)
295 return;
296
297 reg = card->pcie.reg;
298 if (reg)
299 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
300 else
301 fw_status = -1;
302
303 if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) {
304 mwifiex_deauthenticate_all(adapter);
305
306 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
307
308 mwifiex_disable_auto_ds(priv);
309
310 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
311 }
312
313 mwifiex_remove_card(adapter);
314 }
315
mwifiex_pcie_shutdown(struct pci_dev * pdev)316 static void mwifiex_pcie_shutdown(struct pci_dev *pdev)
317 {
318 mwifiex_pcie_remove(pdev);
319
320 return;
321 }
322
mwifiex_pcie_coredump(struct device * dev)323 static void mwifiex_pcie_coredump(struct device *dev)
324 {
325 struct pci_dev *pdev;
326 struct pcie_service_card *card;
327
328 pdev = container_of(dev, struct pci_dev, dev);
329 card = pci_get_drvdata(pdev);
330
331 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
332 &card->work_flags))
333 schedule_work(&card->work);
334 }
335
336 static const struct pci_device_id mwifiex_ids[] = {
337 {
338 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
339 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
340 .driver_data = (unsigned long)&mwifiex_pcie8766,
341 },
342 {
343 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8897,
344 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
345 .driver_data = (unsigned long)&mwifiex_pcie8897,
346 },
347 {
348 PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
349 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
350 .driver_data = (unsigned long)&mwifiex_pcie8997,
351 },
352 {
353 PCIE_VENDOR_ID_V2_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8997,
354 PCI_ANY_ID, PCI_ANY_ID, 0, 0,
355 .driver_data = (unsigned long)&mwifiex_pcie8997,
356 },
357 {},
358 };
359
360 MODULE_DEVICE_TABLE(pci, mwifiex_ids);
361
362 /*
363 * Cleanup all software without cleaning anything related to PCIe and HW.
364 */
mwifiex_pcie_reset_prepare(struct pci_dev * pdev)365 static void mwifiex_pcie_reset_prepare(struct pci_dev *pdev)
366 {
367 struct pcie_service_card *card = pci_get_drvdata(pdev);
368 struct mwifiex_adapter *adapter = card->adapter;
369
370 if (!adapter) {
371 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
372 __func__);
373 return;
374 }
375
376 mwifiex_dbg(adapter, INFO,
377 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Pre-FLR\n",
378 __func__, pdev->vendor, pdev->device, pdev->revision);
379
380 mwifiex_shutdown_sw(adapter);
381 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
382 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
383 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
384 }
385
386 /*
387 * Kernel stores and restores PCIe function context before and after performing
388 * FLR respectively. Reconfigure the software and firmware including firmware
389 * redownload.
390 */
mwifiex_pcie_reset_done(struct pci_dev * pdev)391 static void mwifiex_pcie_reset_done(struct pci_dev *pdev)
392 {
393 struct pcie_service_card *card = pci_get_drvdata(pdev);
394 struct mwifiex_adapter *adapter = card->adapter;
395 int ret;
396
397 if (!adapter) {
398 dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
399 __func__);
400 return;
401 }
402
403 mwifiex_dbg(adapter, INFO,
404 "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Post-FLR\n",
405 __func__, pdev->vendor, pdev->device, pdev->revision);
406
407 ret = mwifiex_reinit_sw(adapter);
408 if (ret)
409 dev_err(&pdev->dev, "reinit failed: %d\n", ret);
410 else
411 mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
412 }
413
414 static const struct pci_error_handlers mwifiex_pcie_err_handler = {
415 .reset_prepare = mwifiex_pcie_reset_prepare,
416 .reset_done = mwifiex_pcie_reset_done,
417 };
418
419 #ifdef CONFIG_PM_SLEEP
420 /* Power Management Hooks */
421 static SIMPLE_DEV_PM_OPS(mwifiex_pcie_pm_ops, mwifiex_pcie_suspend,
422 mwifiex_pcie_resume);
423 #endif
424
425 /* PCI Device Driver */
426 static struct pci_driver __refdata mwifiex_pcie = {
427 .name = "mwifiex_pcie",
428 .id_table = mwifiex_ids,
429 .probe = mwifiex_pcie_probe,
430 .remove = mwifiex_pcie_remove,
431 .driver = {
432 .coredump = mwifiex_pcie_coredump,
433 #ifdef CONFIG_PM_SLEEP
434 .pm = &mwifiex_pcie_pm_ops,
435 #endif
436 },
437 .shutdown = mwifiex_pcie_shutdown,
438 .err_handler = &mwifiex_pcie_err_handler,
439 };
440
441 /*
442 * This function adds delay loop to ensure FW is awake before proceeding.
443 */
mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter * adapter)444 static void mwifiex_pcie_dev_wakeup_delay(struct mwifiex_adapter *adapter)
445 {
446 int i = 0;
447
448 while (mwifiex_pcie_ok_to_access_hw(adapter)) {
449 i++;
450 usleep_range(10, 20);
451 /* 50ms max wait */
452 if (i == 5000)
453 break;
454 }
455
456 return;
457 }
458
mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter * adapter,u32 max_delay_loop_cnt)459 static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
460 u32 max_delay_loop_cnt)
461 {
462 struct pcie_service_card *card = adapter->card;
463 u8 *buffer;
464 u32 sleep_cookie, count;
465 struct sk_buff *cmdrsp = card->cmdrsp_buf;
466
467 for (count = 0; count < max_delay_loop_cnt; count++) {
468 pci_dma_sync_single_for_cpu(card->dev,
469 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
470 sizeof(sleep_cookie),
471 PCI_DMA_FROMDEVICE);
472 buffer = cmdrsp->data;
473 sleep_cookie = get_unaligned_le32(buffer);
474
475 if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
476 mwifiex_dbg(adapter, INFO,
477 "sleep cookie found at count %d\n", count);
478 break;
479 }
480 pci_dma_sync_single_for_device(card->dev,
481 MWIFIEX_SKB_DMA_ADDR(cmdrsp),
482 sizeof(sleep_cookie),
483 PCI_DMA_FROMDEVICE);
484 usleep_range(20, 30);
485 }
486
487 if (count >= max_delay_loop_cnt)
488 mwifiex_dbg(adapter, INFO,
489 "max count reached while accessing sleep cookie\n");
490 }
491
492 /* This function wakes up the card by reading fw_status register. */
mwifiex_pm_wakeup_card(struct mwifiex_adapter * adapter)493 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
494 {
495 struct pcie_service_card *card = adapter->card;
496 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
497
498 mwifiex_dbg(adapter, EVENT,
499 "event: Wakeup device...\n");
500
501 if (reg->sleep_cookie)
502 mwifiex_pcie_dev_wakeup_delay(adapter);
503
504 /* Accessing fw_status register will wakeup device */
505 if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
506 mwifiex_dbg(adapter, ERROR,
507 "Writing fw_status register failed\n");
508 return -1;
509 }
510
511 if (reg->sleep_cookie) {
512 mwifiex_pcie_dev_wakeup_delay(adapter);
513 mwifiex_dbg(adapter, INFO,
514 "PCIE wakeup: Setting PS_STATE_AWAKE\n");
515 adapter->ps_state = PS_STATE_AWAKE;
516 }
517
518 return 0;
519 }
520
521 /*
522 * This function is called after the card has woken up.
523 *
524 * The card configuration register is reset.
525 */
mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter * adapter)526 static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
527 {
528 mwifiex_dbg(adapter, CMD,
529 "cmd: Wakeup device completed\n");
530
531 return 0;
532 }
533
534 /*
535 * This function disables the host interrupt.
536 *
537 * The host interrupt mask is read, the disable bit is reset and
538 * written back to the card host interrupt mask register.
539 */
mwifiex_pcie_disable_host_int(struct mwifiex_adapter * adapter)540 static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
541 {
542 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
543 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
544 0x00000000)) {
545 mwifiex_dbg(adapter, ERROR,
546 "Disable host interrupt failed\n");
547 return -1;
548 }
549 }
550
551 atomic_set(&adapter->tx_hw_pending, 0);
552 return 0;
553 }
554
mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter * adapter)555 static void mwifiex_pcie_disable_host_int_noerr(struct mwifiex_adapter *adapter)
556 {
557 WARN_ON(mwifiex_pcie_disable_host_int(adapter));
558 }
559
560 /*
561 * This function enables the host interrupt.
562 *
563 * The host interrupt enable mask is written to the card
564 * host interrupt mask register.
565 */
mwifiex_pcie_enable_host_int(struct mwifiex_adapter * adapter)566 static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
567 {
568 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
569 /* Simply write the mask to the register */
570 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
571 HOST_INTR_MASK)) {
572 mwifiex_dbg(adapter, ERROR,
573 "Enable host interrupt failed\n");
574 return -1;
575 }
576 }
577
578 return 0;
579 }
580
581 /*
582 * This function initializes TX buffer ring descriptors
583 */
mwifiex_init_txq_ring(struct mwifiex_adapter * adapter)584 static int mwifiex_init_txq_ring(struct mwifiex_adapter *adapter)
585 {
586 struct pcie_service_card *card = adapter->card;
587 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
588 struct mwifiex_pcie_buf_desc *desc;
589 struct mwifiex_pfu_buf_desc *desc2;
590 int i;
591
592 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
593 card->tx_buf_list[i] = NULL;
594 if (reg->pfu_enabled) {
595 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
596 (sizeof(*desc2) * i);
597 desc2 = card->txbd_ring[i];
598 memset(desc2, 0, sizeof(*desc2));
599 } else {
600 card->txbd_ring[i] = (void *)card->txbd_ring_vbase +
601 (sizeof(*desc) * i);
602 desc = card->txbd_ring[i];
603 memset(desc, 0, sizeof(*desc));
604 }
605 }
606
607 return 0;
608 }
609
610 /* This function initializes RX buffer ring descriptors. Each SKB is allocated
611 * here and after mapping PCI memory, its physical address is assigned to
612 * PCIE Rx buffer descriptor's physical address.
613 */
mwifiex_init_rxq_ring(struct mwifiex_adapter * adapter)614 static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
615 {
616 struct pcie_service_card *card = adapter->card;
617 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
618 struct sk_buff *skb;
619 struct mwifiex_pcie_buf_desc *desc;
620 struct mwifiex_pfu_buf_desc *desc2;
621 dma_addr_t buf_pa;
622 int i;
623
624 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
625 /* Allocate skb here so that firmware can DMA data from it */
626 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
627 GFP_KERNEL);
628 if (!skb) {
629 mwifiex_dbg(adapter, ERROR,
630 "Unable to allocate skb for RX ring.\n");
631 kfree(card->rxbd_ring_vbase);
632 return -ENOMEM;
633 }
634
635 if (mwifiex_map_pci_memory(adapter, skb,
636 MWIFIEX_RX_DATA_BUF_SIZE,
637 PCI_DMA_FROMDEVICE))
638 return -1;
639
640 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
641
642 mwifiex_dbg(adapter, INFO,
643 "info: RX ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
644 skb, skb->len, skb->data, (u32)buf_pa,
645 (u32)((u64)buf_pa >> 32));
646
647 card->rx_buf_list[i] = skb;
648 if (reg->pfu_enabled) {
649 card->rxbd_ring[i] = (void *)card->rxbd_ring_vbase +
650 (sizeof(*desc2) * i);
651 desc2 = card->rxbd_ring[i];
652 desc2->paddr = buf_pa;
653 desc2->len = (u16)skb->len;
654 desc2->frag_len = (u16)skb->len;
655 desc2->flags = reg->ring_flag_eop | reg->ring_flag_sop;
656 desc2->offset = 0;
657 } else {
658 card->rxbd_ring[i] = (void *)(card->rxbd_ring_vbase +
659 (sizeof(*desc) * i));
660 desc = card->rxbd_ring[i];
661 desc->paddr = buf_pa;
662 desc->len = (u16)skb->len;
663 desc->flags = 0;
664 }
665 }
666
667 return 0;
668 }
669
670 /* This function initializes event buffer ring descriptors. Each SKB is
671 * allocated here and after mapping PCI memory, its physical address is assigned
672 * to PCIE Rx buffer descriptor's physical address
673 */
mwifiex_pcie_init_evt_ring(struct mwifiex_adapter * adapter)674 static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
675 {
676 struct pcie_service_card *card = adapter->card;
677 struct mwifiex_evt_buf_desc *desc;
678 struct sk_buff *skb;
679 dma_addr_t buf_pa;
680 int i;
681
682 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
683 /* Allocate skb here so that firmware can DMA data from it */
684 skb = dev_alloc_skb(MAX_EVENT_SIZE);
685 if (!skb) {
686 mwifiex_dbg(adapter, ERROR,
687 "Unable to allocate skb for EVENT buf.\n");
688 kfree(card->evtbd_ring_vbase);
689 return -ENOMEM;
690 }
691 skb_put(skb, MAX_EVENT_SIZE);
692
693 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
694 PCI_DMA_FROMDEVICE))
695 return -1;
696
697 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
698
699 mwifiex_dbg(adapter, EVENT,
700 "info: EVT ring: skb=%p len=%d data=%p buf_pa=%#x:%x\n",
701 skb, skb->len, skb->data, (u32)buf_pa,
702 (u32)((u64)buf_pa >> 32));
703
704 card->evt_buf_list[i] = skb;
705 card->evtbd_ring[i] = (void *)(card->evtbd_ring_vbase +
706 (sizeof(*desc) * i));
707 desc = card->evtbd_ring[i];
708 desc->paddr = buf_pa;
709 desc->len = (u16)skb->len;
710 desc->flags = 0;
711 }
712
713 return 0;
714 }
715
716 /* This function cleans up TX buffer rings. If any of the buffer list has valid
717 * SKB address, associated SKB is freed.
718 */
mwifiex_cleanup_txq_ring(struct mwifiex_adapter * adapter)719 static void mwifiex_cleanup_txq_ring(struct mwifiex_adapter *adapter)
720 {
721 struct pcie_service_card *card = adapter->card;
722 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
723 struct sk_buff *skb;
724 struct mwifiex_pcie_buf_desc *desc;
725 struct mwifiex_pfu_buf_desc *desc2;
726 int i;
727
728 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
729 if (reg->pfu_enabled) {
730 desc2 = card->txbd_ring[i];
731 if (card->tx_buf_list[i]) {
732 skb = card->tx_buf_list[i];
733 mwifiex_unmap_pci_memory(adapter, skb,
734 PCI_DMA_TODEVICE);
735 dev_kfree_skb_any(skb);
736 }
737 memset(desc2, 0, sizeof(*desc2));
738 } else {
739 desc = card->txbd_ring[i];
740 if (card->tx_buf_list[i]) {
741 skb = card->tx_buf_list[i];
742 mwifiex_unmap_pci_memory(adapter, skb,
743 PCI_DMA_TODEVICE);
744 dev_kfree_skb_any(skb);
745 }
746 memset(desc, 0, sizeof(*desc));
747 }
748 card->tx_buf_list[i] = NULL;
749 }
750
751 atomic_set(&adapter->tx_hw_pending, 0);
752 return;
753 }
754
755 /* This function cleans up RX buffer rings. If any of the buffer list has valid
756 * SKB address, associated SKB is freed.
757 */
mwifiex_cleanup_rxq_ring(struct mwifiex_adapter * adapter)758 static void mwifiex_cleanup_rxq_ring(struct mwifiex_adapter *adapter)
759 {
760 struct pcie_service_card *card = adapter->card;
761 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
762 struct mwifiex_pcie_buf_desc *desc;
763 struct mwifiex_pfu_buf_desc *desc2;
764 struct sk_buff *skb;
765 int i;
766
767 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
768 if (reg->pfu_enabled) {
769 desc2 = card->rxbd_ring[i];
770 if (card->rx_buf_list[i]) {
771 skb = card->rx_buf_list[i];
772 mwifiex_unmap_pci_memory(adapter, skb,
773 PCI_DMA_FROMDEVICE);
774 dev_kfree_skb_any(skb);
775 }
776 memset(desc2, 0, sizeof(*desc2));
777 } else {
778 desc = card->rxbd_ring[i];
779 if (card->rx_buf_list[i]) {
780 skb = card->rx_buf_list[i];
781 mwifiex_unmap_pci_memory(adapter, skb,
782 PCI_DMA_FROMDEVICE);
783 dev_kfree_skb_any(skb);
784 }
785 memset(desc, 0, sizeof(*desc));
786 }
787 card->rx_buf_list[i] = NULL;
788 }
789
790 return;
791 }
792
793 /* This function cleans up event buffer rings. If any of the buffer list has
794 * valid SKB address, associated SKB is freed.
795 */
mwifiex_cleanup_evt_ring(struct mwifiex_adapter * adapter)796 static void mwifiex_cleanup_evt_ring(struct mwifiex_adapter *adapter)
797 {
798 struct pcie_service_card *card = adapter->card;
799 struct mwifiex_evt_buf_desc *desc;
800 struct sk_buff *skb;
801 int i;
802
803 for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
804 desc = card->evtbd_ring[i];
805 if (card->evt_buf_list[i]) {
806 skb = card->evt_buf_list[i];
807 mwifiex_unmap_pci_memory(adapter, skb,
808 PCI_DMA_FROMDEVICE);
809 dev_kfree_skb_any(skb);
810 }
811 card->evt_buf_list[i] = NULL;
812 memset(desc, 0, sizeof(*desc));
813 }
814
815 return;
816 }
817
818 /* This function creates buffer descriptor ring for TX
819 */
mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter * adapter)820 static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
821 {
822 struct pcie_service_card *card = adapter->card;
823 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
824
825 /*
826 * driver maintaines the write pointer and firmware maintaines the read
827 * pointer. The write pointer starts at 0 (zero) while the read pointer
828 * starts at zero with rollover bit set
829 */
830 card->txbd_wrptr = 0;
831
832 if (reg->pfu_enabled)
833 card->txbd_rdptr = 0;
834 else
835 card->txbd_rdptr |= reg->tx_rollover_ind;
836
837 /* allocate shared memory for the BD ring and divide the same in to
838 several descriptors */
839 if (reg->pfu_enabled)
840 card->txbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
841 MWIFIEX_MAX_TXRX_BD;
842 else
843 card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
844 MWIFIEX_MAX_TXRX_BD;
845
846 mwifiex_dbg(adapter, INFO,
847 "info: txbd_ring: Allocating %d bytes\n",
848 card->txbd_ring_size);
849 card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
850 card->txbd_ring_size,
851 &card->txbd_ring_pbase);
852 if (!card->txbd_ring_vbase) {
853 mwifiex_dbg(adapter, ERROR,
854 "allocate consistent memory (%d bytes) failed!\n",
855 card->txbd_ring_size);
856 return -ENOMEM;
857 }
858 mwifiex_dbg(adapter, DATA,
859 "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
860 card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
861 (u32)((u64)card->txbd_ring_pbase >> 32),
862 card->txbd_ring_size);
863
864 return mwifiex_init_txq_ring(adapter);
865 }
866
mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter * adapter)867 static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
868 {
869 struct pcie_service_card *card = adapter->card;
870 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
871
872 mwifiex_cleanup_txq_ring(adapter);
873
874 if (card->txbd_ring_vbase)
875 pci_free_consistent(card->dev, card->txbd_ring_size,
876 card->txbd_ring_vbase,
877 card->txbd_ring_pbase);
878 card->txbd_ring_size = 0;
879 card->txbd_wrptr = 0;
880 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
881 card->txbd_ring_vbase = NULL;
882 card->txbd_ring_pbase = 0;
883
884 return 0;
885 }
886
887 /*
888 * This function creates buffer descriptor ring for RX
889 */
mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter * adapter)890 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
891 {
892 struct pcie_service_card *card = adapter->card;
893 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
894
895 /*
896 * driver maintaines the read pointer and firmware maintaines the write
897 * pointer. The write pointer starts at 0 (zero) while the read pointer
898 * starts at zero with rollover bit set
899 */
900 card->rxbd_wrptr = 0;
901 card->rxbd_rdptr = reg->rx_rollover_ind;
902
903 if (reg->pfu_enabled)
904 card->rxbd_ring_size = sizeof(struct mwifiex_pfu_buf_desc) *
905 MWIFIEX_MAX_TXRX_BD;
906 else
907 card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
908 MWIFIEX_MAX_TXRX_BD;
909
910 mwifiex_dbg(adapter, INFO,
911 "info: rxbd_ring: Allocating %d bytes\n",
912 card->rxbd_ring_size);
913 card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
914 card->rxbd_ring_size,
915 &card->rxbd_ring_pbase);
916 if (!card->rxbd_ring_vbase) {
917 mwifiex_dbg(adapter, ERROR,
918 "allocate consistent memory (%d bytes) failed!\n",
919 card->rxbd_ring_size);
920 return -ENOMEM;
921 }
922
923 mwifiex_dbg(adapter, DATA,
924 "info: rxbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
925 card->rxbd_ring_vbase, (u32)card->rxbd_ring_pbase,
926 (u32)((u64)card->rxbd_ring_pbase >> 32),
927 card->rxbd_ring_size);
928
929 return mwifiex_init_rxq_ring(adapter);
930 }
931
932 /*
933 * This function deletes Buffer descriptor ring for RX
934 */
mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter * adapter)935 static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
936 {
937 struct pcie_service_card *card = adapter->card;
938 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
939
940 mwifiex_cleanup_rxq_ring(adapter);
941
942 if (card->rxbd_ring_vbase)
943 pci_free_consistent(card->dev, card->rxbd_ring_size,
944 card->rxbd_ring_vbase,
945 card->rxbd_ring_pbase);
946 card->rxbd_ring_size = 0;
947 card->rxbd_wrptr = 0;
948 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
949 card->rxbd_ring_vbase = NULL;
950 card->rxbd_ring_pbase = 0;
951
952 return 0;
953 }
954
955 /*
956 * This function creates buffer descriptor ring for Events
957 */
mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter * adapter)958 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
959 {
960 struct pcie_service_card *card = adapter->card;
961 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
962
963 /*
964 * driver maintaines the read pointer and firmware maintaines the write
965 * pointer. The write pointer starts at 0 (zero) while the read pointer
966 * starts at zero with rollover bit set
967 */
968 card->evtbd_wrptr = 0;
969 card->evtbd_rdptr = reg->evt_rollover_ind;
970
971 card->evtbd_ring_size = sizeof(struct mwifiex_evt_buf_desc) *
972 MWIFIEX_MAX_EVT_BD;
973
974 mwifiex_dbg(adapter, INFO,
975 "info: evtbd_ring: Allocating %d bytes\n",
976 card->evtbd_ring_size);
977 card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
978 card->evtbd_ring_size,
979 &card->evtbd_ring_pbase);
980 if (!card->evtbd_ring_vbase) {
981 mwifiex_dbg(adapter, ERROR,
982 "allocate consistent memory (%d bytes) failed!\n",
983 card->evtbd_ring_size);
984 return -ENOMEM;
985 }
986
987 mwifiex_dbg(adapter, EVENT,
988 "info: CMDRSP/EVT bd_ring - base: %p pbase: %#x:%x len: %#x\n",
989 card->evtbd_ring_vbase, (u32)card->evtbd_ring_pbase,
990 (u32)((u64)card->evtbd_ring_pbase >> 32),
991 card->evtbd_ring_size);
992
993 return mwifiex_pcie_init_evt_ring(adapter);
994 }
995
996 /*
997 * This function deletes Buffer descriptor ring for Events
998 */
mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter * adapter)999 static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
1000 {
1001 struct pcie_service_card *card = adapter->card;
1002 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1003
1004 mwifiex_cleanup_evt_ring(adapter);
1005
1006 if (card->evtbd_ring_vbase)
1007 pci_free_consistent(card->dev, card->evtbd_ring_size,
1008 card->evtbd_ring_vbase,
1009 card->evtbd_ring_pbase);
1010 card->evtbd_wrptr = 0;
1011 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
1012 card->evtbd_ring_size = 0;
1013 card->evtbd_ring_vbase = NULL;
1014 card->evtbd_ring_pbase = 0;
1015
1016 return 0;
1017 }
1018
1019 /*
1020 * This function allocates a buffer for CMDRSP
1021 */
mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter * adapter)1022 static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
1023 {
1024 struct pcie_service_card *card = adapter->card;
1025 struct sk_buff *skb;
1026
1027 /* Allocate memory for receiving command response data */
1028 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
1029 if (!skb) {
1030 mwifiex_dbg(adapter, ERROR,
1031 "Unable to allocate skb for command response data.\n");
1032 return -ENOMEM;
1033 }
1034 skb_put(skb, MWIFIEX_UPLD_SIZE);
1035 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1036 PCI_DMA_FROMDEVICE))
1037 return -1;
1038
1039 card->cmdrsp_buf = skb;
1040
1041 return 0;
1042 }
1043
1044 /*
1045 * This function deletes a buffer for CMDRSP
1046 */
mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter * adapter)1047 static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
1048 {
1049 struct pcie_service_card *card;
1050
1051 if (!adapter)
1052 return 0;
1053
1054 card = adapter->card;
1055
1056 if (card && card->cmdrsp_buf) {
1057 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1058 PCI_DMA_FROMDEVICE);
1059 dev_kfree_skb_any(card->cmdrsp_buf);
1060 card->cmdrsp_buf = NULL;
1061 }
1062
1063 if (card && card->cmd_buf) {
1064 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1065 PCI_DMA_TODEVICE);
1066 dev_kfree_skb_any(card->cmd_buf);
1067 card->cmd_buf = NULL;
1068 }
1069 return 0;
1070 }
1071
1072 /*
1073 * This function allocates a buffer for sleep cookie
1074 */
mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter * adapter)1075 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1076 {
1077 struct pcie_service_card *card = adapter->card;
1078 u32 tmp;
1079
1080 card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
1081 &card->sleep_cookie_pbase);
1082 if (!card->sleep_cookie_vbase) {
1083 mwifiex_dbg(adapter, ERROR,
1084 "pci_alloc_consistent failed!\n");
1085 return -ENOMEM;
1086 }
1087 /* Init val of Sleep Cookie */
1088 tmp = FW_AWAKE_COOKIE;
1089 put_unaligned(tmp, card->sleep_cookie_vbase);
1090
1091 mwifiex_dbg(adapter, INFO,
1092 "alloc_scook: sleep cookie=0x%x\n",
1093 get_unaligned(card->sleep_cookie_vbase));
1094
1095 return 0;
1096 }
1097
1098 /*
1099 * This function deletes buffer for sleep cookie
1100 */
mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter * adapter)1101 static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
1102 {
1103 struct pcie_service_card *card;
1104
1105 if (!adapter)
1106 return 0;
1107
1108 card = adapter->card;
1109
1110 if (card && card->sleep_cookie_vbase) {
1111 pci_free_consistent(card->dev, sizeof(u32),
1112 card->sleep_cookie_vbase,
1113 card->sleep_cookie_pbase);
1114 card->sleep_cookie_vbase = NULL;
1115 }
1116
1117 return 0;
1118 }
1119
1120 /* This function flushes the TX buffer descriptor ring
1121 * This function defined as handler is also called while cleaning TXRX
1122 * during disconnect/ bss stop.
1123 */
mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter * adapter)1124 static int mwifiex_clean_pcie_ring_buf(struct mwifiex_adapter *adapter)
1125 {
1126 struct pcie_service_card *card = adapter->card;
1127
1128 if (!mwifiex_pcie_txbd_empty(card, card->txbd_rdptr)) {
1129 card->txbd_flush = 1;
1130 /* write pointer already set at last send
1131 * send dnld-rdy intr again, wait for completion.
1132 */
1133 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1134 CPU_INTR_DNLD_RDY)) {
1135 mwifiex_dbg(adapter, ERROR,
1136 "failed to assert dnld-rdy interrupt.\n");
1137 return -1;
1138 }
1139 }
1140 return 0;
1141 }
1142
1143 /*
1144 * This function unmaps and frees downloaded data buffer
1145 */
mwifiex_pcie_send_data_complete(struct mwifiex_adapter * adapter)1146 static int mwifiex_pcie_send_data_complete(struct mwifiex_adapter *adapter)
1147 {
1148 struct sk_buff *skb;
1149 u32 wrdoneidx, rdptr, num_tx_buffs, unmap_count = 0;
1150 struct mwifiex_pcie_buf_desc *desc;
1151 struct mwifiex_pfu_buf_desc *desc2;
1152 struct pcie_service_card *card = adapter->card;
1153 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1154
1155 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1156 mwifiex_pm_wakeup_card(adapter);
1157
1158 /* Read the TX ring read pointer set by firmware */
1159 if (mwifiex_read_reg(adapter, reg->tx_rdptr, &rdptr)) {
1160 mwifiex_dbg(adapter, ERROR,
1161 "SEND COMP: failed to read reg->tx_rdptr\n");
1162 return -1;
1163 }
1164
1165 mwifiex_dbg(adapter, DATA,
1166 "SEND COMP: rdptr_prev=0x%x, rdptr=0x%x\n",
1167 card->txbd_rdptr, rdptr);
1168
1169 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1170 /* free from previous txbd_rdptr to current txbd_rdptr */
1171 while (((card->txbd_rdptr & reg->tx_mask) !=
1172 (rdptr & reg->tx_mask)) ||
1173 ((card->txbd_rdptr & reg->tx_rollover_ind) !=
1174 (rdptr & reg->tx_rollover_ind))) {
1175 wrdoneidx = (card->txbd_rdptr & reg->tx_mask) >>
1176 reg->tx_start_ptr;
1177
1178 skb = card->tx_buf_list[wrdoneidx];
1179
1180 if (skb) {
1181 mwifiex_dbg(adapter, DATA,
1182 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
1183 skb, wrdoneidx);
1184 mwifiex_unmap_pci_memory(adapter, skb,
1185 PCI_DMA_TODEVICE);
1186
1187 unmap_count++;
1188
1189 if (card->txbd_flush)
1190 mwifiex_write_data_complete(adapter, skb, 0,
1191 -1);
1192 else
1193 mwifiex_write_data_complete(adapter, skb, 0, 0);
1194 atomic_dec(&adapter->tx_hw_pending);
1195 }
1196
1197 card->tx_buf_list[wrdoneidx] = NULL;
1198
1199 if (reg->pfu_enabled) {
1200 desc2 = card->txbd_ring[wrdoneidx];
1201 memset(desc2, 0, sizeof(*desc2));
1202 } else {
1203 desc = card->txbd_ring[wrdoneidx];
1204 memset(desc, 0, sizeof(*desc));
1205 }
1206 switch (card->dev->device) {
1207 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1208 card->txbd_rdptr++;
1209 break;
1210 case PCIE_DEVICE_ID_MARVELL_88W8897:
1211 case PCIE_DEVICE_ID_MARVELL_88W8997:
1212 card->txbd_rdptr += reg->ring_tx_start_ptr;
1213 break;
1214 }
1215
1216
1217 if ((card->txbd_rdptr & reg->tx_mask) == num_tx_buffs)
1218 card->txbd_rdptr = ((card->txbd_rdptr &
1219 reg->tx_rollover_ind) ^
1220 reg->tx_rollover_ind);
1221 }
1222
1223 if (unmap_count)
1224 adapter->data_sent = false;
1225
1226 if (card->txbd_flush) {
1227 if (mwifiex_pcie_txbd_empty(card, card->txbd_rdptr))
1228 card->txbd_flush = 0;
1229 else
1230 mwifiex_clean_pcie_ring_buf(adapter);
1231 }
1232
1233 return 0;
1234 }
1235
1236 /* This function sends data buffer to device. First 4 bytes of payload
1237 * are filled with payload length and payload type. Then this payload
1238 * is mapped to PCI device memory. Tx ring pointers are advanced accordingly.
1239 * Download ready interrupt to FW is deffered if Tx ring is not full and
1240 * additional payload can be accomodated.
1241 * Caller must ensure tx_param parameter to this function is not NULL.
1242 */
1243 static int
mwifiex_pcie_send_data(struct mwifiex_adapter * adapter,struct sk_buff * skb,struct mwifiex_tx_param * tx_param)1244 mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
1245 struct mwifiex_tx_param *tx_param)
1246 {
1247 struct pcie_service_card *card = adapter->card;
1248 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1249 u32 wrindx, num_tx_buffs, rx_val;
1250 int ret;
1251 dma_addr_t buf_pa;
1252 struct mwifiex_pcie_buf_desc *desc = NULL;
1253 struct mwifiex_pfu_buf_desc *desc2 = NULL;
1254
1255 if (!(skb->data && skb->len)) {
1256 mwifiex_dbg(adapter, ERROR,
1257 "%s(): invalid parameter <%p, %#x>\n",
1258 __func__, skb->data, skb->len);
1259 return -1;
1260 }
1261
1262 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1263 mwifiex_pm_wakeup_card(adapter);
1264
1265 num_tx_buffs = MWIFIEX_MAX_TXRX_BD << reg->tx_start_ptr;
1266 mwifiex_dbg(adapter, DATA,
1267 "info: SEND DATA: <Rd: %#x, Wr: %#x>\n",
1268 card->txbd_rdptr, card->txbd_wrptr);
1269 if (mwifiex_pcie_txbd_not_full(card)) {
1270 u8 *payload;
1271
1272 adapter->data_sent = true;
1273 payload = skb->data;
1274 put_unaligned_le16((u16)skb->len, payload + 0);
1275 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
1276
1277 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1278 PCI_DMA_TODEVICE))
1279 return -1;
1280
1281 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
1282 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1283 card->tx_buf_list[wrindx] = skb;
1284 atomic_inc(&adapter->tx_hw_pending);
1285
1286 if (reg->pfu_enabled) {
1287 desc2 = card->txbd_ring[wrindx];
1288 desc2->paddr = buf_pa;
1289 desc2->len = (u16)skb->len;
1290 desc2->frag_len = (u16)skb->len;
1291 desc2->offset = 0;
1292 desc2->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1293 MWIFIEX_BD_FLAG_LAST_DESC;
1294 } else {
1295 desc = card->txbd_ring[wrindx];
1296 desc->paddr = buf_pa;
1297 desc->len = (u16)skb->len;
1298 desc->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
1299 MWIFIEX_BD_FLAG_LAST_DESC;
1300 }
1301
1302 switch (card->dev->device) {
1303 case PCIE_DEVICE_ID_MARVELL_88W8766P:
1304 card->txbd_wrptr++;
1305 break;
1306 case PCIE_DEVICE_ID_MARVELL_88W8897:
1307 case PCIE_DEVICE_ID_MARVELL_88W8997:
1308 card->txbd_wrptr += reg->ring_tx_start_ptr;
1309 break;
1310 }
1311
1312 if ((card->txbd_wrptr & reg->tx_mask) == num_tx_buffs)
1313 card->txbd_wrptr = ((card->txbd_wrptr &
1314 reg->tx_rollover_ind) ^
1315 reg->tx_rollover_ind);
1316
1317 rx_val = card->rxbd_rdptr & reg->rx_wrap_mask;
1318 /* Write the TX ring write pointer in to reg->tx_wrptr */
1319 if (mwifiex_write_reg(adapter, reg->tx_wrptr,
1320 card->txbd_wrptr | rx_val)) {
1321 mwifiex_dbg(adapter, ERROR,
1322 "SEND DATA: failed to write reg->tx_wrptr\n");
1323 ret = -1;
1324 goto done_unmap;
1325 }
1326 if ((mwifiex_pcie_txbd_not_full(card)) &&
1327 tx_param->next_pkt_len) {
1328 /* have more packets and TxBD still can hold more */
1329 mwifiex_dbg(adapter, DATA,
1330 "SEND DATA: delay dnld-rdy interrupt.\n");
1331 adapter->data_sent = false;
1332 } else {
1333 /* Send the TX ready interrupt */
1334 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1335 CPU_INTR_DNLD_RDY)) {
1336 mwifiex_dbg(adapter, ERROR,
1337 "SEND DATA: failed to assert dnld-rdy interrupt.\n");
1338 ret = -1;
1339 goto done_unmap;
1340 }
1341 }
1342 mwifiex_dbg(adapter, DATA,
1343 "info: SEND DATA: Updated <Rd: %#x, Wr:\t"
1344 "%#x> and sent packet to firmware successfully\n",
1345 card->txbd_rdptr, card->txbd_wrptr);
1346 } else {
1347 mwifiex_dbg(adapter, DATA,
1348 "info: TX Ring full, can't send packets to fw\n");
1349 adapter->data_sent = true;
1350 /* Send the TX ready interrupt */
1351 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1352 CPU_INTR_DNLD_RDY))
1353 mwifiex_dbg(adapter, ERROR,
1354 "SEND DATA: failed to assert door-bell intr\n");
1355 return -EBUSY;
1356 }
1357
1358 return -EINPROGRESS;
1359 done_unmap:
1360 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1361 card->tx_buf_list[wrindx] = NULL;
1362 atomic_dec(&adapter->tx_hw_pending);
1363 if (reg->pfu_enabled)
1364 memset(desc2, 0, sizeof(*desc2));
1365 else
1366 memset(desc, 0, sizeof(*desc));
1367
1368 return ret;
1369 }
1370
1371 /*
1372 * This function handles received buffer ring and
1373 * dispatches packets to upper
1374 */
mwifiex_pcie_process_recv_data(struct mwifiex_adapter * adapter)1375 static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1376 {
1377 struct pcie_service_card *card = adapter->card;
1378 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1379 u32 wrptr, rd_index, tx_val;
1380 dma_addr_t buf_pa;
1381 int ret = 0;
1382 struct sk_buff *skb_tmp = NULL;
1383 struct mwifiex_pcie_buf_desc *desc;
1384 struct mwifiex_pfu_buf_desc *desc2;
1385
1386 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1387 mwifiex_pm_wakeup_card(adapter);
1388
1389 /* Read the RX ring Write pointer set by firmware */
1390 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1391 mwifiex_dbg(adapter, ERROR,
1392 "RECV DATA: failed to read reg->rx_wrptr\n");
1393 ret = -1;
1394 goto done;
1395 }
1396 card->rxbd_wrptr = wrptr;
1397
1398 while (((wrptr & reg->rx_mask) !=
1399 (card->rxbd_rdptr & reg->rx_mask)) ||
1400 ((wrptr & reg->rx_rollover_ind) ==
1401 (card->rxbd_rdptr & reg->rx_rollover_ind))) {
1402 struct sk_buff *skb_data;
1403 u16 rx_len;
1404
1405 rd_index = card->rxbd_rdptr & reg->rx_mask;
1406 skb_data = card->rx_buf_list[rd_index];
1407
1408 /* If skb allocation was failed earlier for Rx packet,
1409 * rx_buf_list[rd_index] would have been left with a NULL.
1410 */
1411 if (!skb_data)
1412 return -ENOMEM;
1413
1414 mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1415 card->rx_buf_list[rd_index] = NULL;
1416
1417 /* Get data length from interface header -
1418 * first 2 bytes for len, next 2 bytes is for type
1419 */
1420 rx_len = get_unaligned_le16(skb_data->data);
1421 if (WARN_ON(rx_len <= adapter->intf_hdr_len ||
1422 rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
1423 mwifiex_dbg(adapter, ERROR,
1424 "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
1425 rx_len, card->rxbd_rdptr, wrptr);
1426 dev_kfree_skb_any(skb_data);
1427 } else {
1428 skb_put(skb_data, rx_len);
1429 mwifiex_dbg(adapter, DATA,
1430 "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
1431 card->rxbd_rdptr, wrptr, rx_len);
1432 skb_pull(skb_data, adapter->intf_hdr_len);
1433 if (adapter->rx_work_enabled) {
1434 skb_queue_tail(&adapter->rx_data_q, skb_data);
1435 adapter->data_received = true;
1436 atomic_inc(&adapter->rx_pending);
1437 } else {
1438 mwifiex_handle_rx_packet(adapter, skb_data);
1439 }
1440 }
1441
1442 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1443 GFP_KERNEL);
1444 if (!skb_tmp) {
1445 mwifiex_dbg(adapter, ERROR,
1446 "Unable to allocate skb.\n");
1447 return -ENOMEM;
1448 }
1449
1450 if (mwifiex_map_pci_memory(adapter, skb_tmp,
1451 MWIFIEX_RX_DATA_BUF_SIZE,
1452 PCI_DMA_FROMDEVICE))
1453 return -1;
1454
1455 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
1456
1457 mwifiex_dbg(adapter, INFO,
1458 "RECV DATA: Attach new sk_buff %p at rxbd_rdidx=%d\n",
1459 skb_tmp, rd_index);
1460 card->rx_buf_list[rd_index] = skb_tmp;
1461
1462 if (reg->pfu_enabled) {
1463 desc2 = card->rxbd_ring[rd_index];
1464 desc2->paddr = buf_pa;
1465 desc2->len = skb_tmp->len;
1466 desc2->frag_len = skb_tmp->len;
1467 desc2->offset = 0;
1468 desc2->flags = reg->ring_flag_sop | reg->ring_flag_eop;
1469 } else {
1470 desc = card->rxbd_ring[rd_index];
1471 desc->paddr = buf_pa;
1472 desc->len = skb_tmp->len;
1473 desc->flags = 0;
1474 }
1475
1476 if ((++card->rxbd_rdptr & reg->rx_mask) ==
1477 MWIFIEX_MAX_TXRX_BD) {
1478 card->rxbd_rdptr = ((card->rxbd_rdptr &
1479 reg->rx_rollover_ind) ^
1480 reg->rx_rollover_ind);
1481 }
1482 mwifiex_dbg(adapter, DATA,
1483 "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
1484 card->rxbd_rdptr, wrptr);
1485
1486 tx_val = card->txbd_wrptr & reg->tx_wrap_mask;
1487 /* Write the RX ring read pointer in to reg->rx_rdptr */
1488 if (mwifiex_write_reg(adapter, reg->rx_rdptr,
1489 card->rxbd_rdptr | tx_val)) {
1490 mwifiex_dbg(adapter, DATA,
1491 "RECV DATA: failed to write reg->rx_rdptr\n");
1492 ret = -1;
1493 goto done;
1494 }
1495
1496 /* Read the RX ring Write pointer set by firmware */
1497 if (mwifiex_read_reg(adapter, reg->rx_wrptr, &wrptr)) {
1498 mwifiex_dbg(adapter, ERROR,
1499 "RECV DATA: failed to read reg->rx_wrptr\n");
1500 ret = -1;
1501 goto done;
1502 }
1503 mwifiex_dbg(adapter, DATA,
1504 "info: RECV DATA: Rcvd packet from fw successfully\n");
1505 card->rxbd_wrptr = wrptr;
1506 }
1507
1508 done:
1509 return ret;
1510 }
1511
1512 /*
1513 * This function downloads the boot command to device
1514 */
1515 static int
mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter * adapter,struct sk_buff * skb)1516 mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1517 {
1518 dma_addr_t buf_pa;
1519 struct pcie_service_card *card = adapter->card;
1520 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1521
1522 if (!(skb->data && skb->len)) {
1523 mwifiex_dbg(adapter, ERROR,
1524 "Invalid parameter in %s <%p. len %d>\n",
1525 __func__, skb->data, skb->len);
1526 return -1;
1527 }
1528
1529 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1530 return -1;
1531
1532 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
1533
1534 /* Write the lower 32bits of the physical address to low command
1535 * address scratch register
1536 */
1537 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo, (u32)buf_pa)) {
1538 mwifiex_dbg(adapter, ERROR,
1539 "%s: failed to write download command to boot code.\n",
1540 __func__);
1541 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1542 return -1;
1543 }
1544
1545 /* Write the upper 32bits of the physical address to high command
1546 * address scratch register
1547 */
1548 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1549 (u32)((u64)buf_pa >> 32))) {
1550 mwifiex_dbg(adapter, ERROR,
1551 "%s: failed to write download command to boot code.\n",
1552 __func__);
1553 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1554 return -1;
1555 }
1556
1557 /* Write the command length to cmd_size scratch register */
1558 if (mwifiex_write_reg(adapter, reg->cmd_size, skb->len)) {
1559 mwifiex_dbg(adapter, ERROR,
1560 "%s: failed to write command len to cmd_size scratch reg\n",
1561 __func__);
1562 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1563 return -1;
1564 }
1565
1566 /* Ring the door bell */
1567 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1568 CPU_INTR_DOOR_BELL)) {
1569 mwifiex_dbg(adapter, ERROR,
1570 "%s: failed to assert door-bell intr\n", __func__);
1571 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1572 return -1;
1573 }
1574
1575 return 0;
1576 }
1577
1578 /* This function init rx port in firmware which in turn enables to receive data
1579 * from device before transmitting any packet.
1580 */
mwifiex_pcie_init_fw_port(struct mwifiex_adapter * adapter)1581 static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
1582 {
1583 struct pcie_service_card *card = adapter->card;
1584 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1585 int tx_wrap = card->txbd_wrptr & reg->tx_wrap_mask;
1586
1587 /* Write the RX ring read pointer in to reg->rx_rdptr */
1588 if (mwifiex_write_reg(adapter, reg->rx_rdptr, card->rxbd_rdptr |
1589 tx_wrap)) {
1590 mwifiex_dbg(adapter, ERROR,
1591 "RECV DATA: failed to write reg->rx_rdptr\n");
1592 return -1;
1593 }
1594 return 0;
1595 }
1596
1597 /* This function downloads commands to the device
1598 */
1599 static int
mwifiex_pcie_send_cmd(struct mwifiex_adapter * adapter,struct sk_buff * skb)1600 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
1601 {
1602 struct pcie_service_card *card = adapter->card;
1603 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1604 int ret = 0;
1605 dma_addr_t cmd_buf_pa, cmdrsp_buf_pa;
1606 u8 *payload = (u8 *)skb->data;
1607
1608 if (!(skb->data && skb->len)) {
1609 mwifiex_dbg(adapter, ERROR,
1610 "Invalid parameter in %s <%p, %#x>\n",
1611 __func__, skb->data, skb->len);
1612 return -1;
1613 }
1614
1615 /* Make sure a command response buffer is available */
1616 if (!card->cmdrsp_buf) {
1617 mwifiex_dbg(adapter, ERROR,
1618 "No response buffer available, send command failed\n");
1619 return -EBUSY;
1620 }
1621
1622 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1623 mwifiex_pm_wakeup_card(adapter);
1624
1625 adapter->cmd_sent = true;
1626
1627 put_unaligned_le16((u16)skb->len, &payload[0]);
1628 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
1629
1630 if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1631 return -1;
1632
1633 card->cmd_buf = skb;
1634 /*
1635 * Need to keep a reference, since core driver might free up this
1636 * buffer before we've unmapped it.
1637 */
1638 skb_get(skb);
1639
1640 /* To send a command, the driver will:
1641 1. Write the 64bit physical address of the data buffer to
1642 cmd response address low + cmd response address high
1643 2. Ring the door bell (i.e. set the door bell interrupt)
1644
1645 In response to door bell interrupt, the firmware will perform
1646 the DMA of the command packet (first header to obtain the total
1647 length and then rest of the command).
1648 */
1649
1650 if (card->cmdrsp_buf) {
1651 cmdrsp_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmdrsp_buf);
1652 /* Write the lower 32bits of the cmdrsp buffer physical
1653 address */
1654 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo,
1655 (u32)cmdrsp_buf_pa)) {
1656 mwifiex_dbg(adapter, ERROR,
1657 "Failed to write download cmd to boot code.\n");
1658 ret = -1;
1659 goto done;
1660 }
1661 /* Write the upper 32bits of the cmdrsp buffer physical
1662 address */
1663 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi,
1664 (u32)((u64)cmdrsp_buf_pa >> 32))) {
1665 mwifiex_dbg(adapter, ERROR,
1666 "Failed to write download cmd to boot code.\n");
1667 ret = -1;
1668 goto done;
1669 }
1670 }
1671
1672 cmd_buf_pa = MWIFIEX_SKB_DMA_ADDR(card->cmd_buf);
1673 /* Write the lower 32bits of the physical address to reg->cmd_addr_lo */
1674 if (mwifiex_write_reg(adapter, reg->cmd_addr_lo,
1675 (u32)cmd_buf_pa)) {
1676 mwifiex_dbg(adapter, ERROR,
1677 "Failed to write download cmd to boot code.\n");
1678 ret = -1;
1679 goto done;
1680 }
1681 /* Write the upper 32bits of the physical address to reg->cmd_addr_hi */
1682 if (mwifiex_write_reg(adapter, reg->cmd_addr_hi,
1683 (u32)((u64)cmd_buf_pa >> 32))) {
1684 mwifiex_dbg(adapter, ERROR,
1685 "Failed to write download cmd to boot code.\n");
1686 ret = -1;
1687 goto done;
1688 }
1689
1690 /* Write the command length to reg->cmd_size */
1691 if (mwifiex_write_reg(adapter, reg->cmd_size,
1692 card->cmd_buf->len)) {
1693 mwifiex_dbg(adapter, ERROR,
1694 "Failed to write cmd len to reg->cmd_size\n");
1695 ret = -1;
1696 goto done;
1697 }
1698
1699 /* Ring the door bell */
1700 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1701 CPU_INTR_DOOR_BELL)) {
1702 mwifiex_dbg(adapter, ERROR,
1703 "Failed to assert door-bell intr\n");
1704 ret = -1;
1705 goto done;
1706 }
1707
1708 done:
1709 if (ret)
1710 adapter->cmd_sent = false;
1711
1712 return 0;
1713 }
1714
1715 /*
1716 * This function handles command complete interrupt
1717 */
mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter * adapter)1718 static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
1719 {
1720 struct pcie_service_card *card = adapter->card;
1721 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1722 struct sk_buff *skb = card->cmdrsp_buf;
1723 int count = 0;
1724 u16 rx_len;
1725
1726 mwifiex_dbg(adapter, CMD,
1727 "info: Rx CMD Response\n");
1728
1729 if (adapter->curr_cmd)
1730 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1731 else
1732 pci_dma_sync_single_for_cpu(card->dev,
1733 MWIFIEX_SKB_DMA_ADDR(skb),
1734 MWIFIEX_UPLD_SIZE,
1735 PCI_DMA_FROMDEVICE);
1736
1737 /* Unmap the command as a response has been received. */
1738 if (card->cmd_buf) {
1739 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1740 PCI_DMA_TODEVICE);
1741 dev_kfree_skb_any(card->cmd_buf);
1742 card->cmd_buf = NULL;
1743 }
1744
1745 rx_len = get_unaligned_le16(skb->data);
1746 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
1747 skb_trim(skb, rx_len);
1748
1749 if (!adapter->curr_cmd) {
1750 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1751 pci_dma_sync_single_for_device(card->dev,
1752 MWIFIEX_SKB_DMA_ADDR(skb),
1753 MWIFIEX_SLEEP_COOKIE_SIZE,
1754 PCI_DMA_FROMDEVICE);
1755 if (mwifiex_write_reg(adapter,
1756 PCIE_CPU_INT_EVENT,
1757 CPU_INTR_SLEEP_CFM_DONE)) {
1758 mwifiex_dbg(adapter, ERROR,
1759 "Write register failed\n");
1760 return -1;
1761 }
1762 mwifiex_delay_for_sleep_cookie(adapter,
1763 MWIFIEX_MAX_DELAY_COUNT);
1764 mwifiex_unmap_pci_memory(adapter, skb,
1765 PCI_DMA_FROMDEVICE);
1766 skb_pull(skb, adapter->intf_hdr_len);
1767 while (reg->sleep_cookie && (count++ < 10) &&
1768 mwifiex_pcie_ok_to_access_hw(adapter))
1769 usleep_range(50, 60);
1770 mwifiex_pcie_enable_host_int(adapter);
1771 mwifiex_process_sleep_confirm_resp(adapter, skb->data,
1772 skb->len);
1773 } else {
1774 mwifiex_dbg(adapter, ERROR,
1775 "There is no command but got cmdrsp\n");
1776 }
1777 memcpy(adapter->upld_buf, skb->data,
1778 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
1779 skb_push(skb, adapter->intf_hdr_len);
1780 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1781 PCI_DMA_FROMDEVICE))
1782 return -1;
1783 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
1784 skb_pull(skb, adapter->intf_hdr_len);
1785 adapter->curr_cmd->resp_skb = skb;
1786 adapter->cmd_resp_received = true;
1787 /* Take the pointer and set it to CMD node and will
1788 return in the response complete callback */
1789 card->cmdrsp_buf = NULL;
1790
1791 /* Clear the cmd-rsp buffer address in scratch registers. This
1792 will prevent firmware from writing to the same response
1793 buffer again. */
1794 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_lo, 0)) {
1795 mwifiex_dbg(adapter, ERROR,
1796 "cmd_done: failed to clear cmd_rsp_addr_lo\n");
1797 return -1;
1798 }
1799 /* Write the upper 32bits of the cmdrsp buffer physical
1800 address */
1801 if (mwifiex_write_reg(adapter, reg->cmdrsp_addr_hi, 0)) {
1802 mwifiex_dbg(adapter, ERROR,
1803 "cmd_done: failed to clear cmd_rsp_addr_hi\n");
1804 return -1;
1805 }
1806 }
1807
1808 return 0;
1809 }
1810
1811 /*
1812 * Command Response processing complete handler
1813 */
mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter * adapter,struct sk_buff * skb)1814 static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
1815 struct sk_buff *skb)
1816 {
1817 struct pcie_service_card *card = adapter->card;
1818
1819 if (skb) {
1820 card->cmdrsp_buf = skb;
1821 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
1822 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1823 PCI_DMA_FROMDEVICE))
1824 return -1;
1825 }
1826
1827 return 0;
1828 }
1829
1830 /*
1831 * This function handles firmware event ready interrupt
1832 */
mwifiex_pcie_process_event_ready(struct mwifiex_adapter * adapter)1833 static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
1834 {
1835 struct pcie_service_card *card = adapter->card;
1836 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1837 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1838 u32 wrptr, event;
1839 struct mwifiex_evt_buf_desc *desc;
1840
1841 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1842 mwifiex_pm_wakeup_card(adapter);
1843
1844 if (adapter->event_received) {
1845 mwifiex_dbg(adapter, EVENT,
1846 "info: Event being processed,\t"
1847 "do not process this interrupt just yet\n");
1848 return 0;
1849 }
1850
1851 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1852 mwifiex_dbg(adapter, ERROR,
1853 "info: Invalid read pointer...\n");
1854 return -1;
1855 }
1856
1857 /* Read the event ring write pointer set by firmware */
1858 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1859 mwifiex_dbg(adapter, ERROR,
1860 "EventReady: failed to read reg->evt_wrptr\n");
1861 return -1;
1862 }
1863
1864 mwifiex_dbg(adapter, EVENT,
1865 "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
1866 card->evtbd_rdptr, wrptr);
1867 if (((wrptr & MWIFIEX_EVTBD_MASK) != (card->evtbd_rdptr
1868 & MWIFIEX_EVTBD_MASK)) ||
1869 ((wrptr & reg->evt_rollover_ind) ==
1870 (card->evtbd_rdptr & reg->evt_rollover_ind))) {
1871 struct sk_buff *skb_cmd;
1872 __le16 data_len = 0;
1873 u16 evt_len;
1874
1875 mwifiex_dbg(adapter, INFO,
1876 "info: Read Index: %d\n", rdptr);
1877 skb_cmd = card->evt_buf_list[rdptr];
1878 mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
1879
1880 /* Take the pointer and set it to event pointer in adapter
1881 and will return back after event handling callback */
1882 card->evt_buf_list[rdptr] = NULL;
1883 desc = card->evtbd_ring[rdptr];
1884 memset(desc, 0, sizeof(*desc));
1885
1886 event = get_unaligned_le32(
1887 &skb_cmd->data[adapter->intf_hdr_len]);
1888 adapter->event_cause = event;
1889 /* The first 4bytes will be the event transfer header
1890 len is 2 bytes followed by type which is 2 bytes */
1891 memcpy(&data_len, skb_cmd->data, sizeof(__le16));
1892 evt_len = le16_to_cpu(data_len);
1893 skb_trim(skb_cmd, evt_len);
1894 skb_pull(skb_cmd, adapter->intf_hdr_len);
1895 mwifiex_dbg(adapter, EVENT,
1896 "info: Event length: %d\n", evt_len);
1897
1898 if (evt_len > MWIFIEX_EVENT_HEADER_LEN &&
1899 evt_len < MAX_EVENT_SIZE)
1900 memcpy(adapter->event_body, skb_cmd->data +
1901 MWIFIEX_EVENT_HEADER_LEN, evt_len -
1902 MWIFIEX_EVENT_HEADER_LEN);
1903
1904 adapter->event_received = true;
1905 adapter->event_skb = skb_cmd;
1906
1907 /* Do not update the event read pointer here, wait till the
1908 buffer is released. This is just to make things simpler,
1909 we need to find a better method of managing these buffers.
1910 */
1911 } else {
1912 if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
1913 CPU_INTR_EVENT_DONE)) {
1914 mwifiex_dbg(adapter, ERROR,
1915 "Write register failed\n");
1916 return -1;
1917 }
1918 }
1919
1920 return 0;
1921 }
1922
1923 /*
1924 * Event processing complete handler
1925 */
mwifiex_pcie_event_complete(struct mwifiex_adapter * adapter,struct sk_buff * skb)1926 static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
1927 struct sk_buff *skb)
1928 {
1929 struct pcie_service_card *card = adapter->card;
1930 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
1931 int ret = 0;
1932 u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
1933 u32 wrptr;
1934 struct mwifiex_evt_buf_desc *desc;
1935
1936 if (!skb)
1937 return 0;
1938
1939 if (rdptr >= MWIFIEX_MAX_EVT_BD) {
1940 mwifiex_dbg(adapter, ERROR,
1941 "event_complete: Invalid rdptr 0x%x\n",
1942 rdptr);
1943 return -EINVAL;
1944 }
1945
1946 /* Read the event ring write pointer set by firmware */
1947 if (mwifiex_read_reg(adapter, reg->evt_wrptr, &wrptr)) {
1948 mwifiex_dbg(adapter, ERROR,
1949 "event_complete: failed to read reg->evt_wrptr\n");
1950 return -1;
1951 }
1952
1953 if (!card->evt_buf_list[rdptr]) {
1954 skb_push(skb, adapter->intf_hdr_len);
1955 skb_put(skb, MAX_EVENT_SIZE - skb->len);
1956 if (mwifiex_map_pci_memory(adapter, skb,
1957 MAX_EVENT_SIZE,
1958 PCI_DMA_FROMDEVICE))
1959 return -1;
1960 card->evt_buf_list[rdptr] = skb;
1961 desc = card->evtbd_ring[rdptr];
1962 desc->paddr = MWIFIEX_SKB_DMA_ADDR(skb);
1963 desc->len = (u16)skb->len;
1964 desc->flags = 0;
1965 skb = NULL;
1966 } else {
1967 mwifiex_dbg(adapter, ERROR,
1968 "info: ERROR: buf still valid at index %d, <%p, %p>\n",
1969 rdptr, card->evt_buf_list[rdptr], skb);
1970 }
1971
1972 if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
1973 card->evtbd_rdptr = ((card->evtbd_rdptr &
1974 reg->evt_rollover_ind) ^
1975 reg->evt_rollover_ind);
1976 }
1977
1978 mwifiex_dbg(adapter, EVENT,
1979 "info: Updated <Rd: 0x%x, Wr: 0x%x>",
1980 card->evtbd_rdptr, wrptr);
1981
1982 /* Write the event ring read pointer in to reg->evt_rdptr */
1983 if (mwifiex_write_reg(adapter, reg->evt_rdptr,
1984 card->evtbd_rdptr)) {
1985 mwifiex_dbg(adapter, ERROR,
1986 "event_complete: failed to read reg->evt_rdptr\n");
1987 return -1;
1988 }
1989
1990 mwifiex_dbg(adapter, EVENT,
1991 "info: Check Events Again\n");
1992 ret = mwifiex_pcie_process_event_ready(adapter);
1993
1994 return ret;
1995 }
1996
1997 /* Combo firmware image is a combination of
1998 * (1) combo crc heaer, start with CMD5
1999 * (2) bluetooth image, start with CMD7, end with CMD6, data wrapped in CMD1.
2000 * (3) wifi image.
2001 *
2002 * This function bypass the header and bluetooth part, return
2003 * the offset of tail wifi-only part. If the image is already wifi-only,
2004 * that is start with CMD1, return 0.
2005 */
2006
mwifiex_extract_wifi_fw(struct mwifiex_adapter * adapter,const void * firmware,u32 firmware_len)2007 static int mwifiex_extract_wifi_fw(struct mwifiex_adapter *adapter,
2008 const void *firmware, u32 firmware_len) {
2009 const struct mwifiex_fw_data *fwdata;
2010 u32 offset = 0, data_len, dnld_cmd;
2011 int ret = 0;
2012 bool cmd7_before = false, first_cmd = false;
2013
2014 while (1) {
2015 /* Check for integer and buffer overflow */
2016 if (offset + sizeof(fwdata->header) < sizeof(fwdata->header) ||
2017 offset + sizeof(fwdata->header) >= firmware_len) {
2018 mwifiex_dbg(adapter, ERROR,
2019 "extract wifi-only fw failure!\n");
2020 ret = -1;
2021 goto done;
2022 }
2023
2024 fwdata = firmware + offset;
2025 dnld_cmd = le32_to_cpu(fwdata->header.dnld_cmd);
2026 data_len = le32_to_cpu(fwdata->header.data_length);
2027
2028 /* Skip past header */
2029 offset += sizeof(fwdata->header);
2030
2031 switch (dnld_cmd) {
2032 case MWIFIEX_FW_DNLD_CMD_1:
2033 if (offset + data_len < data_len) {
2034 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2035 ret = -1;
2036 goto done;
2037 }
2038
2039 /* Image start with cmd1, already wifi-only firmware */
2040 if (!first_cmd) {
2041 mwifiex_dbg(adapter, MSG,
2042 "input wifi-only firmware\n");
2043 return 0;
2044 }
2045
2046 if (!cmd7_before) {
2047 mwifiex_dbg(adapter, ERROR,
2048 "no cmd7 before cmd1!\n");
2049 ret = -1;
2050 goto done;
2051 }
2052 offset += data_len;
2053 break;
2054 case MWIFIEX_FW_DNLD_CMD_5:
2055 first_cmd = true;
2056 /* Check for integer overflow */
2057 if (offset + data_len < data_len) {
2058 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2059 ret = -1;
2060 goto done;
2061 }
2062 offset += data_len;
2063 break;
2064 case MWIFIEX_FW_DNLD_CMD_6:
2065 first_cmd = true;
2066 /* Check for integer overflow */
2067 if (offset + data_len < data_len) {
2068 mwifiex_dbg(adapter, ERROR, "bad FW parse\n");
2069 ret = -1;
2070 goto done;
2071 }
2072 offset += data_len;
2073 if (offset >= firmware_len) {
2074 mwifiex_dbg(adapter, ERROR,
2075 "extract wifi-only fw failure!\n");
2076 ret = -1;
2077 } else {
2078 ret = offset;
2079 }
2080 goto done;
2081 case MWIFIEX_FW_DNLD_CMD_7:
2082 first_cmd = true;
2083 cmd7_before = true;
2084 break;
2085 default:
2086 mwifiex_dbg(adapter, ERROR, "unknown dnld_cmd %d\n",
2087 dnld_cmd);
2088 ret = -1;
2089 goto done;
2090 }
2091 }
2092
2093 done:
2094 return ret;
2095 }
2096
2097 /*
2098 * This function downloads the firmware to the card.
2099 *
2100 * Firmware is downloaded to the card in blocks. Every block download
2101 * is tested for CRC errors, and retried a number of times before
2102 * returning failure.
2103 */
mwifiex_prog_fw_w_helper(struct mwifiex_adapter * adapter,struct mwifiex_fw_image * fw)2104 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
2105 struct mwifiex_fw_image *fw)
2106 {
2107 int ret;
2108 u8 *firmware = fw->fw_buf;
2109 u32 firmware_len = fw->fw_len;
2110 u32 offset = 0;
2111 struct sk_buff *skb;
2112 u32 txlen, tx_blocks = 0, tries, len, val;
2113 u32 block_retry_cnt = 0;
2114 struct pcie_service_card *card = adapter->card;
2115 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2116
2117 if (!firmware || !firmware_len) {
2118 mwifiex_dbg(adapter, ERROR,
2119 "No firmware image found! Terminating download\n");
2120 return -1;
2121 }
2122
2123 mwifiex_dbg(adapter, INFO,
2124 "info: Downloading FW image (%d bytes)\n",
2125 firmware_len);
2126
2127 if (mwifiex_pcie_disable_host_int(adapter)) {
2128 mwifiex_dbg(adapter, ERROR,
2129 "%s: Disabling interrupts failed.\n", __func__);
2130 return -1;
2131 }
2132
2133 skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
2134 if (!skb) {
2135 ret = -ENOMEM;
2136 goto done;
2137 }
2138
2139 ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_13_REG, &val);
2140 if (ret) {
2141 mwifiex_dbg(adapter, FATAL, "Failed to read scratch register 13\n");
2142 goto done;
2143 }
2144
2145 /* PCIE FLR case: extract wifi part from combo firmware*/
2146 if (val == MWIFIEX_PCIE_FLR_HAPPENS) {
2147 ret = mwifiex_extract_wifi_fw(adapter, firmware, firmware_len);
2148 if (ret < 0) {
2149 mwifiex_dbg(adapter, ERROR, "Failed to extract wifi fw\n");
2150 goto done;
2151 }
2152 offset = ret;
2153 mwifiex_dbg(adapter, MSG,
2154 "info: dnld wifi firmware from %d bytes\n", offset);
2155 }
2156
2157 /* Perform firmware data transfer */
2158 do {
2159 u32 ireg_intr = 0;
2160
2161 /* More data? */
2162 if (offset >= firmware_len)
2163 break;
2164
2165 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2166 ret = mwifiex_read_reg(adapter, reg->cmd_size,
2167 &len);
2168 if (ret) {
2169 mwifiex_dbg(adapter, FATAL,
2170 "Failed reading len from boot code\n");
2171 goto done;
2172 }
2173 if (len)
2174 break;
2175 usleep_range(10, 20);
2176 }
2177
2178 if (!len) {
2179 break;
2180 } else if (len > MWIFIEX_UPLD_SIZE) {
2181 mwifiex_dbg(adapter, ERROR,
2182 "FW download failure @ %d, invalid length %d\n",
2183 offset, len);
2184 ret = -1;
2185 goto done;
2186 }
2187
2188 txlen = len;
2189
2190 if (len & BIT(0)) {
2191 block_retry_cnt++;
2192 if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
2193 mwifiex_dbg(adapter, ERROR,
2194 "FW download failure @ %d, over max\t"
2195 "retry count\n", offset);
2196 ret = -1;
2197 goto done;
2198 }
2199 mwifiex_dbg(adapter, ERROR,
2200 "FW CRC error indicated by the\t"
2201 "helper: len = 0x%04X, txlen = %d\n",
2202 len, txlen);
2203 len &= ~BIT(0);
2204 /* Setting this to 0 to resend from same offset */
2205 txlen = 0;
2206 } else {
2207 block_retry_cnt = 0;
2208 /* Set blocksize to transfer - checking for
2209 last block */
2210 if (firmware_len - offset < txlen)
2211 txlen = firmware_len - offset;
2212
2213 tx_blocks = (txlen + card->pcie.blksz_fw_dl - 1) /
2214 card->pcie.blksz_fw_dl;
2215
2216 /* Copy payload to buffer */
2217 memmove(skb->data, &firmware[offset], txlen);
2218 }
2219
2220 skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
2221 skb_trim(skb, tx_blocks * card->pcie.blksz_fw_dl);
2222
2223 /* Send the boot command to device */
2224 if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
2225 mwifiex_dbg(adapter, ERROR,
2226 "Failed to send firmware download command\n");
2227 ret = -1;
2228 goto done;
2229 }
2230
2231 /* Wait for the command done interrupt */
2232 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2233 if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
2234 &ireg_intr)) {
2235 mwifiex_dbg(adapter, ERROR,
2236 "%s: Failed to read\t"
2237 "interrupt status during fw dnld.\n",
2238 __func__);
2239 mwifiex_unmap_pci_memory(adapter, skb,
2240 PCI_DMA_TODEVICE);
2241 ret = -1;
2242 goto done;
2243 }
2244 if (!(ireg_intr & CPU_INTR_DOOR_BELL))
2245 break;
2246 usleep_range(10, 20);
2247 }
2248 if (ireg_intr & CPU_INTR_DOOR_BELL) {
2249 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
2250 __func__);
2251 mwifiex_unmap_pci_memory(adapter, skb,
2252 PCI_DMA_TODEVICE);
2253 ret = -1;
2254 goto done;
2255 }
2256
2257 mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
2258
2259 offset += txlen;
2260 } while (true);
2261
2262 mwifiex_dbg(adapter, MSG,
2263 "info: FW download over, size %d bytes\n", offset);
2264
2265 ret = 0;
2266
2267 done:
2268 dev_kfree_skb_any(skb);
2269 return ret;
2270 }
2271
2272 /*
2273 * This function checks the firmware status in card.
2274 */
2275 static int
mwifiex_check_fw_status(struct mwifiex_adapter * adapter,u32 poll_num)2276 mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
2277 {
2278 int ret = 0;
2279 u32 firmware_stat;
2280 struct pcie_service_card *card = adapter->card;
2281 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2282 u32 tries;
2283
2284 /* Mask spurios interrupts */
2285 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
2286 HOST_INTR_MASK)) {
2287 mwifiex_dbg(adapter, ERROR,
2288 "Write register failed\n");
2289 return -1;
2290 }
2291
2292 mwifiex_dbg(adapter, INFO,
2293 "Setting driver ready signature\n");
2294 if (mwifiex_write_reg(adapter, reg->drv_rdy,
2295 FIRMWARE_READY_PCIE)) {
2296 mwifiex_dbg(adapter, ERROR,
2297 "Failed to write driver ready signature\n");
2298 return -1;
2299 }
2300
2301 /* Wait for firmware initialization event */
2302 for (tries = 0; tries < poll_num; tries++) {
2303 if (mwifiex_read_reg(adapter, reg->fw_status,
2304 &firmware_stat))
2305 ret = -1;
2306 else
2307 ret = 0;
2308
2309 mwifiex_dbg(adapter, INFO, "Try %d if FW is ready <%d,%#x>",
2310 tries, ret, firmware_stat);
2311
2312 if (ret)
2313 continue;
2314 if (firmware_stat == FIRMWARE_READY_PCIE) {
2315 ret = 0;
2316 break;
2317 } else {
2318 msleep(100);
2319 ret = -1;
2320 }
2321 }
2322
2323 return ret;
2324 }
2325
2326 /* This function checks if WLAN is the winner.
2327 */
2328 static int
mwifiex_check_winner_status(struct mwifiex_adapter * adapter)2329 mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
2330 {
2331 u32 winner = 0;
2332 int ret = 0;
2333 struct pcie_service_card *card = adapter->card;
2334 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2335
2336 if (mwifiex_read_reg(adapter, reg->fw_status, &winner)) {
2337 ret = -1;
2338 } else if (!winner) {
2339 mwifiex_dbg(adapter, INFO, "PCI-E is the winner\n");
2340 adapter->winner = 1;
2341 } else {
2342 mwifiex_dbg(adapter, ERROR,
2343 "PCI-E is not the winner <%#x>", winner);
2344 }
2345
2346 return ret;
2347 }
2348
2349 /*
2350 * This function reads the interrupt status from card.
2351 */
mwifiex_interrupt_status(struct mwifiex_adapter * adapter,int msg_id)2352 static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter,
2353 int msg_id)
2354 {
2355 u32 pcie_ireg;
2356 unsigned long flags;
2357 struct pcie_service_card *card = adapter->card;
2358
2359 if (card->msi_enable) {
2360 spin_lock_irqsave(&adapter->int_lock, flags);
2361 adapter->int_status = 1;
2362 spin_unlock_irqrestore(&adapter->int_lock, flags);
2363 return;
2364 }
2365
2366 if (!mwifiex_pcie_ok_to_access_hw(adapter))
2367 return;
2368
2369 if (card->msix_enable && msg_id >= 0) {
2370 pcie_ireg = BIT(msg_id);
2371 } else {
2372 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2373 &pcie_ireg)) {
2374 mwifiex_dbg(adapter, ERROR, "Read register failed\n");
2375 return;
2376 }
2377
2378 if ((pcie_ireg == 0xFFFFFFFF) || !pcie_ireg)
2379 return;
2380
2381
2382 mwifiex_pcie_disable_host_int(adapter);
2383
2384 /* Clear the pending interrupts */
2385 if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
2386 ~pcie_ireg)) {
2387 mwifiex_dbg(adapter, ERROR,
2388 "Write register failed\n");
2389 return;
2390 }
2391 }
2392
2393 if (!adapter->pps_uapsd_mode &&
2394 adapter->ps_state == PS_STATE_SLEEP &&
2395 mwifiex_pcie_ok_to_access_hw(adapter)) {
2396 /* Potentially for PCIe we could get other
2397 * interrupts like shared. Don't change power
2398 * state until cookie is set
2399 */
2400 adapter->ps_state = PS_STATE_AWAKE;
2401 adapter->pm_wakeup_fw_try = false;
2402 del_timer(&adapter->wakeup_timer);
2403 }
2404
2405 spin_lock_irqsave(&adapter->int_lock, flags);
2406 adapter->int_status |= pcie_ireg;
2407 spin_unlock_irqrestore(&adapter->int_lock, flags);
2408 mwifiex_dbg(adapter, INTR, "ireg: 0x%08x\n", pcie_ireg);
2409 }
2410
2411 /*
2412 * Interrupt handler for PCIe root port
2413 *
2414 * This function reads the interrupt status from firmware and assigns
2415 * the main process in workqueue which will handle the interrupt.
2416 */
mwifiex_pcie_interrupt(int irq,void * context)2417 static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2418 {
2419 struct mwifiex_msix_context *ctx = context;
2420 struct pci_dev *pdev = ctx->dev;
2421 struct pcie_service_card *card;
2422 struct mwifiex_adapter *adapter;
2423
2424 card = pci_get_drvdata(pdev);
2425
2426 if (!card->adapter) {
2427 pr_err("info: %s: card=%p adapter=%p\n", __func__, card,
2428 card ? card->adapter : NULL);
2429 goto exit;
2430 }
2431 adapter = card->adapter;
2432
2433 if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags))
2434 goto exit;
2435
2436 if (card->msix_enable)
2437 mwifiex_interrupt_status(adapter, ctx->msg_id);
2438 else
2439 mwifiex_interrupt_status(adapter, -1);
2440
2441 mwifiex_queue_main_work(adapter);
2442
2443 exit:
2444 return IRQ_HANDLED;
2445 }
2446
2447 /*
2448 * This function checks the current interrupt status.
2449 *
2450 * The following interrupts are checked and handled by this function -
2451 * - Data sent
2452 * - Command sent
2453 * - Command received
2454 * - Packets received
2455 * - Events received
2456 *
2457 * In case of Rx packets received, the packets are uploaded from card to
2458 * host and processed accordingly.
2459 */
mwifiex_process_int_status(struct mwifiex_adapter * adapter)2460 static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
2461 {
2462 int ret;
2463 u32 pcie_ireg = 0;
2464 unsigned long flags;
2465 struct pcie_service_card *card = adapter->card;
2466
2467 spin_lock_irqsave(&adapter->int_lock, flags);
2468 if (!card->msi_enable) {
2469 /* Clear out unused interrupts */
2470 pcie_ireg = adapter->int_status;
2471 }
2472 adapter->int_status = 0;
2473 spin_unlock_irqrestore(&adapter->int_lock, flags);
2474
2475 if (card->msi_enable) {
2476 if (mwifiex_pcie_ok_to_access_hw(adapter)) {
2477 if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
2478 &pcie_ireg)) {
2479 mwifiex_dbg(adapter, ERROR,
2480 "Read register failed\n");
2481 return -1;
2482 }
2483
2484 if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
2485 if (mwifiex_write_reg(adapter,
2486 PCIE_HOST_INT_STATUS,
2487 ~pcie_ireg)) {
2488 mwifiex_dbg(adapter, ERROR,
2489 "Write register failed\n");
2490 return -1;
2491 }
2492 if (!adapter->pps_uapsd_mode &&
2493 adapter->ps_state == PS_STATE_SLEEP) {
2494 adapter->ps_state = PS_STATE_AWAKE;
2495 adapter->pm_wakeup_fw_try = false;
2496 del_timer(&adapter->wakeup_timer);
2497 }
2498 }
2499 }
2500 }
2501
2502 if (pcie_ireg & HOST_INTR_DNLD_DONE) {
2503 mwifiex_dbg(adapter, INTR, "info: TX DNLD Done\n");
2504 ret = mwifiex_pcie_send_data_complete(adapter);
2505 if (ret)
2506 return ret;
2507 }
2508 if (pcie_ireg & HOST_INTR_UPLD_RDY) {
2509 mwifiex_dbg(adapter, INTR, "info: Rx DATA\n");
2510 ret = mwifiex_pcie_process_recv_data(adapter);
2511 if (ret)
2512 return ret;
2513 }
2514 if (pcie_ireg & HOST_INTR_EVENT_RDY) {
2515 mwifiex_dbg(adapter, INTR, "info: Rx EVENT\n");
2516 ret = mwifiex_pcie_process_event_ready(adapter);
2517 if (ret)
2518 return ret;
2519 }
2520 if (pcie_ireg & HOST_INTR_CMD_DONE) {
2521 if (adapter->cmd_sent) {
2522 mwifiex_dbg(adapter, INTR,
2523 "info: CMD sent Interrupt\n");
2524 adapter->cmd_sent = false;
2525 }
2526 /* Handle command response */
2527 ret = mwifiex_pcie_process_cmd_complete(adapter);
2528 if (ret)
2529 return ret;
2530 }
2531
2532 mwifiex_dbg(adapter, INTR,
2533 "info: cmd_sent=%d data_sent=%d\n",
2534 adapter->cmd_sent, adapter->data_sent);
2535 if (!card->msi_enable && !card->msix_enable &&
2536 adapter->ps_state != PS_STATE_SLEEP)
2537 mwifiex_pcie_enable_host_int(adapter);
2538
2539 return 0;
2540 }
2541
2542 /*
2543 * This function downloads data from driver to card.
2544 *
2545 * Both commands and data packets are transferred to the card by this
2546 * function.
2547 *
2548 * This function adds the PCIE specific header to the front of the buffer
2549 * before transferring. The header contains the length of the packet and
2550 * the type. The firmware handles the packets based upon this set type.
2551 */
mwifiex_pcie_host_to_card(struct mwifiex_adapter * adapter,u8 type,struct sk_buff * skb,struct mwifiex_tx_param * tx_param)2552 static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
2553 struct sk_buff *skb,
2554 struct mwifiex_tx_param *tx_param)
2555 {
2556 if (!skb) {
2557 mwifiex_dbg(adapter, ERROR,
2558 "Passed NULL skb to %s\n", __func__);
2559 return -1;
2560 }
2561
2562 if (type == MWIFIEX_TYPE_DATA)
2563 return mwifiex_pcie_send_data(adapter, skb, tx_param);
2564 else if (type == MWIFIEX_TYPE_CMD)
2565 return mwifiex_pcie_send_cmd(adapter, skb);
2566
2567 return 0;
2568 }
2569
2570 /* Function to dump PCIE scratch registers in case of FW crash
2571 */
2572 static int
mwifiex_pcie_reg_dump(struct mwifiex_adapter * adapter,char * drv_buf)2573 mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
2574 {
2575 char *p = drv_buf;
2576 char buf[256], *ptr;
2577 int i;
2578 u32 value;
2579 struct pcie_service_card *card = adapter->card;
2580 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2581 int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
2582 PCIE_SCRATCH_14_REG,
2583 PCIE_SCRATCH_15_REG};
2584
2585 if (!p)
2586 return 0;
2587
2588 mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
2589
2590 if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
2591 mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
2592 return 0;
2593 }
2594
2595 ptr = buf;
2596 mwifiex_dbg(adapter, MSG, "pcie scratch register:");
2597 for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
2598 mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
2599 ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
2600 pcie_scratch_reg[i], value);
2601 }
2602
2603 mwifiex_dbg(adapter, MSG, "%s\n", buf);
2604 p += sprintf(p, "%s\n", buf);
2605
2606 mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
2607
2608 return p - drv_buf;
2609 }
2610
2611 /* This function read/write firmware */
2612 static enum rdwr_status
mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter * adapter,u8 doneflag)2613 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2614 {
2615 int ret, tries;
2616 u8 ctrl_data;
2617 u32 fw_status;
2618 struct pcie_service_card *card = adapter->card;
2619 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2620
2621 if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
2622 return RDWR_STATUS_FAILURE;
2623
2624 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2625 reg->fw_dump_host_ready);
2626 if (ret) {
2627 mwifiex_dbg(adapter, ERROR,
2628 "PCIE write err\n");
2629 return RDWR_STATUS_FAILURE;
2630 }
2631
2632 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
2633 mwifiex_read_reg_byte(adapter, reg->fw_dump_ctrl, &ctrl_data);
2634 if (ctrl_data == FW_DUMP_DONE)
2635 return RDWR_STATUS_SUCCESS;
2636 if (doneflag && ctrl_data == doneflag)
2637 return RDWR_STATUS_DONE;
2638 if (ctrl_data != reg->fw_dump_host_ready) {
2639 mwifiex_dbg(adapter, WARN,
2640 "The ctrl reg was changed, re-try again!\n");
2641 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2642 reg->fw_dump_host_ready);
2643 if (ret) {
2644 mwifiex_dbg(adapter, ERROR,
2645 "PCIE write err\n");
2646 return RDWR_STATUS_FAILURE;
2647 }
2648 }
2649 usleep_range(100, 200);
2650 }
2651
2652 mwifiex_dbg(adapter, ERROR, "Fail to pull ctrl_data\n");
2653 return RDWR_STATUS_FAILURE;
2654 }
2655
2656 /* This function dump firmware memory to file */
mwifiex_pcie_fw_dump(struct mwifiex_adapter * adapter)2657 static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2658 {
2659 struct pcie_service_card *card = adapter->card;
2660 const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
2661 unsigned int reg, reg_start, reg_end;
2662 u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
2663 u8 idx, i, read_reg, doneflag = 0;
2664 enum rdwr_status stat;
2665 u32 memory_size;
2666 int ret;
2667
2668 if (!card->pcie.can_dump_fw)
2669 return;
2670
2671 for (idx = 0; idx < adapter->num_mem_types; idx++) {
2672 struct memory_type_mapping *entry =
2673 &adapter->mem_type_mapping_tbl[idx];
2674
2675 if (entry->mem_ptr) {
2676 vfree(entry->mem_ptr);
2677 entry->mem_ptr = NULL;
2678 }
2679 entry->mem_size = 0;
2680 }
2681
2682 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
2683
2684 /* Read the number of the memories which will dump */
2685 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2686 if (stat == RDWR_STATUS_FAILURE)
2687 return;
2688
2689 reg = creg->fw_dump_start;
2690 mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
2691
2692 /* W8997 chipset firmware dump will be restore in single region*/
2693 if (fw_dump_num == 0)
2694 dump_num = 1;
2695 else
2696 dump_num = fw_dump_num;
2697
2698 /* Read the length of every memory which will dump */
2699 for (idx = 0; idx < dump_num; idx++) {
2700 struct memory_type_mapping *entry =
2701 &adapter->mem_type_mapping_tbl[idx];
2702 memory_size = 0;
2703 if (fw_dump_num != 0) {
2704 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2705 if (stat == RDWR_STATUS_FAILURE)
2706 return;
2707
2708 reg = creg->fw_dump_start;
2709 for (i = 0; i < 4; i++) {
2710 mwifiex_read_reg_byte(adapter, reg, &read_reg);
2711 memory_size |= (read_reg << (i * 8));
2712 reg++;
2713 }
2714 } else {
2715 memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
2716 }
2717
2718 if (memory_size == 0) {
2719 mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
2720 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2721 creg->fw_dump_read_done);
2722 if (ret) {
2723 mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
2724 return;
2725 }
2726 break;
2727 }
2728
2729 mwifiex_dbg(adapter, DUMP,
2730 "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
2731 entry->mem_ptr = vmalloc(memory_size + 1);
2732 entry->mem_size = memory_size;
2733 if (!entry->mem_ptr) {
2734 mwifiex_dbg(adapter, ERROR,
2735 "Vmalloc %s failed\n", entry->mem_name);
2736 return;
2737 }
2738 dbg_ptr = entry->mem_ptr;
2739 end_ptr = dbg_ptr + memory_size;
2740
2741 doneflag = entry->done_flag;
2742 mwifiex_dbg(adapter, DUMP, "Start %s output, please wait...\n",
2743 entry->mem_name);
2744
2745 do {
2746 stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
2747 if (RDWR_STATUS_FAILURE == stat)
2748 return;
2749
2750 reg_start = creg->fw_dump_start;
2751 reg_end = creg->fw_dump_end;
2752 for (reg = reg_start; reg <= reg_end; reg++) {
2753 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2754 if (dbg_ptr < end_ptr) {
2755 dbg_ptr++;
2756 continue;
2757 }
2758 mwifiex_dbg(adapter, ERROR,
2759 "pre-allocated buf not enough\n");
2760 tmp_ptr =
2761 vzalloc(memory_size + MWIFIEX_SIZE_4K);
2762 if (!tmp_ptr)
2763 return;
2764 memcpy(tmp_ptr, entry->mem_ptr, memory_size);
2765 vfree(entry->mem_ptr);
2766 entry->mem_ptr = tmp_ptr;
2767 tmp_ptr = NULL;
2768 dbg_ptr = entry->mem_ptr + memory_size;
2769 memory_size += MWIFIEX_SIZE_4K;
2770 end_ptr = entry->mem_ptr + memory_size;
2771 }
2772
2773 if (stat != RDWR_STATUS_DONE)
2774 continue;
2775
2776 mwifiex_dbg(adapter, DUMP,
2777 "%s done: size=0x%tx\n",
2778 entry->mem_name, dbg_ptr - entry->mem_ptr);
2779 break;
2780 } while (true);
2781 }
2782 mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
2783 }
2784
mwifiex_pcie_device_dump_work(struct mwifiex_adapter * adapter)2785 static void mwifiex_pcie_device_dump_work(struct mwifiex_adapter *adapter)
2786 {
2787 adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE);
2788 if (!adapter->devdump_data) {
2789 mwifiex_dbg(adapter, ERROR,
2790 "vzalloc devdump data failure!\n");
2791 return;
2792 }
2793
2794 mwifiex_drv_info_dump(adapter);
2795 mwifiex_pcie_fw_dump(adapter);
2796 mwifiex_prepare_fw_dump_info(adapter);
2797 mwifiex_upload_device_dump(adapter);
2798 }
2799
mwifiex_pcie_card_reset_work(struct mwifiex_adapter * adapter)2800 static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter)
2801 {
2802 struct pcie_service_card *card = adapter->card;
2803
2804 /* We can't afford to wait here; remove() might be waiting on us. If we
2805 * can't grab the device lock, maybe we'll get another chance later.
2806 */
2807 pci_try_reset_function(card->dev);
2808 }
2809
mwifiex_pcie_work(struct work_struct * work)2810 static void mwifiex_pcie_work(struct work_struct *work)
2811 {
2812 struct pcie_service_card *card =
2813 container_of(work, struct pcie_service_card, work);
2814
2815 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2816 &card->work_flags))
2817 mwifiex_pcie_device_dump_work(card->adapter);
2818 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2819 &card->work_flags))
2820 mwifiex_pcie_card_reset_work(card->adapter);
2821 }
2822
2823 /* This function dumps FW information */
mwifiex_pcie_device_dump(struct mwifiex_adapter * adapter)2824 static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter)
2825 {
2826 struct pcie_service_card *card = adapter->card;
2827
2828 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
2829 &card->work_flags))
2830 schedule_work(&card->work);
2831 }
2832
mwifiex_pcie_card_reset(struct mwifiex_adapter * adapter)2833 static void mwifiex_pcie_card_reset(struct mwifiex_adapter *adapter)
2834 {
2835 struct pcie_service_card *card = adapter->card;
2836
2837 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
2838 schedule_work(&card->work);
2839 }
2840
mwifiex_pcie_alloc_buffers(struct mwifiex_adapter * adapter)2841 static int mwifiex_pcie_alloc_buffers(struct mwifiex_adapter *adapter)
2842 {
2843 struct pcie_service_card *card = adapter->card;
2844 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2845 int ret;
2846
2847 card->cmdrsp_buf = NULL;
2848 ret = mwifiex_pcie_create_txbd_ring(adapter);
2849 if (ret) {
2850 mwifiex_dbg(adapter, ERROR, "Failed to create txbd ring\n");
2851 goto err_cre_txbd;
2852 }
2853
2854 ret = mwifiex_pcie_create_rxbd_ring(adapter);
2855 if (ret) {
2856 mwifiex_dbg(adapter, ERROR, "Failed to create rxbd ring\n");
2857 goto err_cre_rxbd;
2858 }
2859
2860 ret = mwifiex_pcie_create_evtbd_ring(adapter);
2861 if (ret) {
2862 mwifiex_dbg(adapter, ERROR, "Failed to create evtbd ring\n");
2863 goto err_cre_evtbd;
2864 }
2865
2866 ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
2867 if (ret) {
2868 mwifiex_dbg(adapter, ERROR, "Failed to allocate cmdbuf buffer\n");
2869 goto err_alloc_cmdbuf;
2870 }
2871
2872 if (reg->sleep_cookie) {
2873 ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
2874 if (ret) {
2875 mwifiex_dbg(adapter, ERROR, "Failed to allocate sleep_cookie buffer\n");
2876 goto err_alloc_cookie;
2877 }
2878 } else {
2879 card->sleep_cookie_vbase = NULL;
2880 }
2881
2882 return 0;
2883
2884 err_alloc_cookie:
2885 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2886 err_alloc_cmdbuf:
2887 mwifiex_pcie_delete_evtbd_ring(adapter);
2888 err_cre_evtbd:
2889 mwifiex_pcie_delete_rxbd_ring(adapter);
2890 err_cre_rxbd:
2891 mwifiex_pcie_delete_txbd_ring(adapter);
2892 err_cre_txbd:
2893 return ret;
2894 }
2895
mwifiex_pcie_free_buffers(struct mwifiex_adapter * adapter)2896 static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter)
2897 {
2898 struct pcie_service_card *card = adapter->card;
2899 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2900
2901 if (reg->sleep_cookie)
2902 mwifiex_pcie_delete_sleep_cookie_buf(adapter);
2903
2904 mwifiex_pcie_delete_cmdrsp_buf(adapter);
2905 mwifiex_pcie_delete_evtbd_ring(adapter);
2906 mwifiex_pcie_delete_rxbd_ring(adapter);
2907 mwifiex_pcie_delete_txbd_ring(adapter);
2908 }
2909
2910 /*
2911 * This function initializes the PCI-E host memory space, WCB rings, etc.
2912 */
mwifiex_init_pcie(struct mwifiex_adapter * adapter)2913 static int mwifiex_init_pcie(struct mwifiex_adapter *adapter)
2914 {
2915 struct pcie_service_card *card = adapter->card;
2916 int ret;
2917 struct pci_dev *pdev = card->dev;
2918
2919 pci_set_drvdata(pdev, card);
2920
2921 ret = pci_enable_device(pdev);
2922 if (ret)
2923 goto err_enable_dev;
2924
2925 pci_set_master(pdev);
2926
2927 pr_notice("try set_consistent_dma_mask(32)\n");
2928 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2929 if (ret) {
2930 pr_err("set_dma_mask(32) failed\n");
2931 goto err_set_dma_mask;
2932 }
2933
2934 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2935 if (ret) {
2936 pr_err("set_consistent_dma_mask(64) failed\n");
2937 goto err_set_dma_mask;
2938 }
2939
2940 ret = pci_request_region(pdev, 0, DRV_NAME);
2941 if (ret) {
2942 pr_err("req_reg(0) error\n");
2943 goto err_req_region0;
2944 }
2945 card->pci_mmap = pci_iomap(pdev, 0, 0);
2946 if (!card->pci_mmap) {
2947 pr_err("iomap(0) error\n");
2948 ret = -EIO;
2949 goto err_iomap0;
2950 }
2951 ret = pci_request_region(pdev, 2, DRV_NAME);
2952 if (ret) {
2953 pr_err("req_reg(2) error\n");
2954 goto err_req_region2;
2955 }
2956 card->pci_mmap1 = pci_iomap(pdev, 2, 0);
2957 if (!card->pci_mmap1) {
2958 pr_err("iomap(2) error\n");
2959 ret = -EIO;
2960 goto err_iomap2;
2961 }
2962
2963 pr_notice("PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
2964 card->pci_mmap, card->pci_mmap1);
2965
2966 ret = mwifiex_pcie_alloc_buffers(adapter);
2967 if (ret)
2968 goto err_alloc_buffers;
2969
2970 return 0;
2971
2972 err_alloc_buffers:
2973 pci_iounmap(pdev, card->pci_mmap1);
2974 err_iomap2:
2975 pci_release_region(pdev, 2);
2976 err_req_region2:
2977 pci_iounmap(pdev, card->pci_mmap);
2978 err_iomap0:
2979 pci_release_region(pdev, 0);
2980 err_req_region0:
2981 err_set_dma_mask:
2982 pci_disable_device(pdev);
2983 err_enable_dev:
2984 return ret;
2985 }
2986
2987 /*
2988 * This function cleans up the allocated card buffers.
2989 */
mwifiex_cleanup_pcie(struct mwifiex_adapter * adapter)2990 static void mwifiex_cleanup_pcie(struct mwifiex_adapter *adapter)
2991 {
2992 struct pcie_service_card *card = adapter->card;
2993 struct pci_dev *pdev = card->dev;
2994 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
2995 int ret;
2996 u32 fw_status;
2997
2998 cancel_work_sync(&card->work);
2999
3000 ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
3001 if (fw_status == FIRMWARE_READY_PCIE) {
3002 mwifiex_dbg(adapter, INFO,
3003 "Clearing driver ready signature\n");
3004 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3005 mwifiex_dbg(adapter, ERROR,
3006 "Failed to write driver not-ready signature\n");
3007 }
3008
3009 pci_disable_device(pdev);
3010
3011 pci_iounmap(pdev, card->pci_mmap);
3012 pci_iounmap(pdev, card->pci_mmap1);
3013 pci_release_region(pdev, 2);
3014 pci_release_region(pdev, 0);
3015
3016 mwifiex_pcie_free_buffers(adapter);
3017 }
3018
mwifiex_pcie_request_irq(struct mwifiex_adapter * adapter)3019 static int mwifiex_pcie_request_irq(struct mwifiex_adapter *adapter)
3020 {
3021 int ret, i, j;
3022 struct pcie_service_card *card = adapter->card;
3023 struct pci_dev *pdev = card->dev;
3024
3025 if (card->pcie.reg->msix_support) {
3026 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3027 card->msix_entries[i].entry = i;
3028 ret = pci_enable_msix_exact(pdev, card->msix_entries,
3029 MWIFIEX_NUM_MSIX_VECTORS);
3030 if (!ret) {
3031 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++) {
3032 card->msix_ctx[i].dev = pdev;
3033 card->msix_ctx[i].msg_id = i;
3034
3035 ret = request_irq(card->msix_entries[i].vector,
3036 mwifiex_pcie_interrupt, 0,
3037 "MWIFIEX_PCIE_MSIX",
3038 &card->msix_ctx[i]);
3039 if (ret)
3040 break;
3041 }
3042
3043 if (ret) {
3044 mwifiex_dbg(adapter, INFO, "request_irq fail: %d\n",
3045 ret);
3046 for (j = 0; j < i; j++)
3047 free_irq(card->msix_entries[j].vector,
3048 &card->msix_ctx[i]);
3049 pci_disable_msix(pdev);
3050 } else {
3051 mwifiex_dbg(adapter, MSG, "MSIx enabled!");
3052 card->msix_enable = 1;
3053 return 0;
3054 }
3055 }
3056 }
3057
3058 if (pci_enable_msi(pdev) != 0)
3059 pci_disable_msi(pdev);
3060 else
3061 card->msi_enable = 1;
3062
3063 mwifiex_dbg(adapter, INFO, "msi_enable = %d\n", card->msi_enable);
3064
3065 card->share_irq_ctx.dev = pdev;
3066 card->share_irq_ctx.msg_id = -1;
3067 ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
3068 "MRVL_PCIE", &card->share_irq_ctx);
3069 if (ret) {
3070 pr_err("request_irq failed: ret=%d\n", ret);
3071 return -1;
3072 }
3073
3074 return 0;
3075 }
3076
3077 /*
3078 * This function gets the firmware name for downloading by revision id
3079 *
3080 * Read revision id register to get revision id
3081 */
mwifiex_pcie_get_fw_name(struct mwifiex_adapter * adapter)3082 static void mwifiex_pcie_get_fw_name(struct mwifiex_adapter *adapter)
3083 {
3084 int revision_id = 0;
3085 int version, magic;
3086 struct pcie_service_card *card = adapter->card;
3087
3088 switch (card->dev->device) {
3089 case PCIE_DEVICE_ID_MARVELL_88W8766P:
3090 strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
3091 break;
3092 case PCIE_DEVICE_ID_MARVELL_88W8897:
3093 mwifiex_write_reg(adapter, 0x0c58, 0x80c00000);
3094 mwifiex_read_reg(adapter, 0x0c58, &revision_id);
3095 revision_id &= 0xff00;
3096 switch (revision_id) {
3097 case PCIE8897_A0:
3098 strcpy(adapter->fw_name, PCIE8897_A0_FW_NAME);
3099 break;
3100 case PCIE8897_B0:
3101 strcpy(adapter->fw_name, PCIE8897_B0_FW_NAME);
3102 break;
3103 default:
3104 strcpy(adapter->fw_name, PCIE8897_DEFAULT_FW_NAME);
3105
3106 break;
3107 }
3108 break;
3109 case PCIE_DEVICE_ID_MARVELL_88W8997:
3110 mwifiex_read_reg(adapter, 0x8, &revision_id);
3111 mwifiex_read_reg(adapter, 0x0cd0, &version);
3112 mwifiex_read_reg(adapter, 0x0cd4, &magic);
3113 revision_id &= 0xff;
3114 version &= 0x7;
3115 magic &= 0xff;
3116 if (revision_id == PCIE8997_A1 &&
3117 magic == CHIP_MAGIC_VALUE &&
3118 version == CHIP_VER_PCIEUART)
3119 strcpy(adapter->fw_name, PCIEUART8997_FW_NAME_V4);
3120 else
3121 strcpy(adapter->fw_name, PCIEUSB8997_FW_NAME_V4);
3122 break;
3123 default:
3124 break;
3125 }
3126 }
3127
3128 /*
3129 * This function registers the PCIE device.
3130 *
3131 * PCIE IRQ is claimed, block size is set and driver data is initialized.
3132 */
mwifiex_register_dev(struct mwifiex_adapter * adapter)3133 static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
3134 {
3135 struct pcie_service_card *card = adapter->card;
3136
3137 /* save adapter pointer in card */
3138 card->adapter = adapter;
3139
3140 if (mwifiex_pcie_request_irq(adapter))
3141 return -1;
3142
3143 adapter->tx_buf_size = card->pcie.tx_buf_size;
3144 adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
3145 adapter->num_mem_types = card->pcie.num_mem_types;
3146 adapter->ext_scan = card->pcie.can_ext_scan;
3147 mwifiex_pcie_get_fw_name(adapter);
3148
3149 return 0;
3150 }
3151
3152 /*
3153 * This function unregisters the PCIE device.
3154 *
3155 * The PCIE IRQ is released, the function is disabled and driver
3156 * data is set to null.
3157 */
mwifiex_unregister_dev(struct mwifiex_adapter * adapter)3158 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
3159 {
3160 struct pcie_service_card *card = adapter->card;
3161 struct pci_dev *pdev = card->dev;
3162 int i;
3163
3164 if (card->msix_enable) {
3165 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3166 synchronize_irq(card->msix_entries[i].vector);
3167
3168 for (i = 0; i < MWIFIEX_NUM_MSIX_VECTORS; i++)
3169 free_irq(card->msix_entries[i].vector,
3170 &card->msix_ctx[i]);
3171
3172 card->msix_enable = 0;
3173 pci_disable_msix(pdev);
3174 } else {
3175 mwifiex_dbg(adapter, INFO,
3176 "%s(): calling free_irq()\n", __func__);
3177 free_irq(card->dev->irq, &card->share_irq_ctx);
3178
3179 if (card->msi_enable)
3180 pci_disable_msi(pdev);
3181 }
3182 card->adapter = NULL;
3183 }
3184
3185 /*
3186 * This function initializes the PCI-E host memory space, WCB rings, etc.,
3187 * similar to mwifiex_init_pcie(), but without resetting PCI-E state.
3188 */
mwifiex_pcie_up_dev(struct mwifiex_adapter * adapter)3189 static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter)
3190 {
3191 struct pcie_service_card *card = adapter->card;
3192 struct pci_dev *pdev = card->dev;
3193
3194 /* tx_buf_size might be changed to 3584 by firmware during
3195 * data transfer, we should reset it to default size.
3196 */
3197 adapter->tx_buf_size = card->pcie.tx_buf_size;
3198
3199 mwifiex_pcie_alloc_buffers(adapter);
3200
3201 pci_set_master(pdev);
3202 }
3203
3204 /* This function cleans up the PCI-E host memory space. */
mwifiex_pcie_down_dev(struct mwifiex_adapter * adapter)3205 static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter)
3206 {
3207 struct pcie_service_card *card = adapter->card;
3208 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
3209 struct pci_dev *pdev = card->dev;
3210
3211 if (mwifiex_write_reg(adapter, reg->drv_rdy, 0x00000000))
3212 mwifiex_dbg(adapter, ERROR, "Failed to write driver not-ready signature\n");
3213
3214 pci_clear_master(pdev);
3215
3216 adapter->seq_num = 0;
3217
3218 mwifiex_pcie_free_buffers(adapter);
3219 }
3220
3221 static struct mwifiex_if_ops pcie_ops = {
3222 .init_if = mwifiex_init_pcie,
3223 .cleanup_if = mwifiex_cleanup_pcie,
3224 .check_fw_status = mwifiex_check_fw_status,
3225 .check_winner_status = mwifiex_check_winner_status,
3226 .prog_fw = mwifiex_prog_fw_w_helper,
3227 .register_dev = mwifiex_register_dev,
3228 .unregister_dev = mwifiex_unregister_dev,
3229 .enable_int = mwifiex_pcie_enable_host_int,
3230 .disable_int = mwifiex_pcie_disable_host_int_noerr,
3231 .process_int_status = mwifiex_process_int_status,
3232 .host_to_card = mwifiex_pcie_host_to_card,
3233 .wakeup = mwifiex_pm_wakeup_card,
3234 .wakeup_complete = mwifiex_pm_wakeup_card_complete,
3235
3236 /* PCIE specific */
3237 .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
3238 .event_complete = mwifiex_pcie_event_complete,
3239 .update_mp_end_port = NULL,
3240 .cleanup_mpa_buf = NULL,
3241 .init_fw_port = mwifiex_pcie_init_fw_port,
3242 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
3243 .card_reset = mwifiex_pcie_card_reset,
3244 .reg_dump = mwifiex_pcie_reg_dump,
3245 .device_dump = mwifiex_pcie_device_dump,
3246 .down_dev = mwifiex_pcie_down_dev,
3247 .up_dev = mwifiex_pcie_up_dev,
3248 };
3249
3250 module_pci_driver(mwifiex_pcie);
3251
3252 MODULE_AUTHOR("Marvell International Ltd.");
3253 MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
3254 MODULE_VERSION(PCIE_VERSION);
3255 MODULE_LICENSE("GPL v2");
3256