hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/drivers/net/wireless/marvell/mwifiex/pcie.c
....@@ -1,10 +1,10 @@
11 /*
2
- * Marvell Wireless LAN device driver: PCIE specific handling
2
+ * NXP Wireless LAN device driver: PCIE specific handling
33 *
4
- * Copyright (C) 2011-2014, Marvell International Ltd.
4
+ * Copyright 2011-2020 NXP
55 *
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
6
+ * This software file (the "File") is distributed by NXP
7
+ * under the terms of the GNU General Public License Version 2, June 1991
88 * (the "License"). You may use, redistribute and/or modify this File in
99 * accordance with the terms and conditions of the License, a copy of which
1010 * is available by writing to the Free Software Foundation, Inc.,
....@@ -17,6 +17,7 @@
1717 * this warranty disclaimer.
1818 */
1919
20
+#include <linux/iopoll.h>
2021 #include <linux/firmware.h>
2122
2223 #include "decl.h"
....@@ -33,7 +34,156 @@
3334
3435 static struct mwifiex_if_ops pcie_ops;
3536
36
-static const struct of_device_id mwifiex_pcie_of_match_table[] = {
37
+static const struct mwifiex_pcie_card_reg mwifiex_reg_8766 = {
38
+ .cmd_addr_lo = PCIE_SCRATCH_0_REG,
39
+ .cmd_addr_hi = PCIE_SCRATCH_1_REG,
40
+ .cmd_size = PCIE_SCRATCH_2_REG,
41
+ .fw_status = PCIE_SCRATCH_3_REG,
42
+ .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
43
+ .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
44
+ .tx_rdptr = PCIE_SCRATCH_6_REG,
45
+ .tx_wrptr = PCIE_SCRATCH_7_REG,
46
+ .rx_rdptr = PCIE_SCRATCH_8_REG,
47
+ .rx_wrptr = PCIE_SCRATCH_9_REG,
48
+ .evt_rdptr = PCIE_SCRATCH_10_REG,
49
+ .evt_wrptr = PCIE_SCRATCH_11_REG,
50
+ .drv_rdy = PCIE_SCRATCH_12_REG,
51
+ .tx_start_ptr = 0,
52
+ .tx_mask = MWIFIEX_TXBD_MASK,
53
+ .tx_wrap_mask = 0,
54
+ .rx_mask = MWIFIEX_RXBD_MASK,
55
+ .rx_wrap_mask = 0,
56
+ .tx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
57
+ .rx_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
58
+ .evt_rollover_ind = MWIFIEX_BD_FLAG_ROLLOVER_IND,
59
+ .ring_flag_sop = 0,
60
+ .ring_flag_eop = 0,
61
+ .ring_flag_xs_sop = 0,
62
+ .ring_flag_xs_eop = 0,
63
+ .ring_tx_start_ptr = 0,
64
+ .pfu_enabled = 0,
65
+ .sleep_cookie = 1,
66
+ .msix_support = 0,
67
+};
68
+
69
+static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = {
70
+ .cmd_addr_lo = PCIE_SCRATCH_0_REG,
71
+ .cmd_addr_hi = PCIE_SCRATCH_1_REG,
72
+ .cmd_size = PCIE_SCRATCH_2_REG,
73
+ .fw_status = PCIE_SCRATCH_3_REG,
74
+ .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
75
+ .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
76
+ .tx_rdptr = PCIE_RD_DATA_PTR_Q0_Q1,
77
+ .tx_wrptr = PCIE_WR_DATA_PTR_Q0_Q1,
78
+ .rx_rdptr = PCIE_WR_DATA_PTR_Q0_Q1,
79
+ .rx_wrptr = PCIE_RD_DATA_PTR_Q0_Q1,
80
+ .evt_rdptr = PCIE_SCRATCH_10_REG,
81
+ .evt_wrptr = PCIE_SCRATCH_11_REG,
82
+ .drv_rdy = PCIE_SCRATCH_12_REG,
83
+ .tx_start_ptr = 16,
84
+ .tx_mask = 0x03FF0000,
85
+ .tx_wrap_mask = 0x07FF0000,
86
+ .rx_mask = 0x000003FF,
87
+ .rx_wrap_mask = 0x000007FF,
88
+ .tx_rollover_ind = MWIFIEX_BD_FLAG_TX_ROLLOVER_IND,
89
+ .rx_rollover_ind = MWIFIEX_BD_FLAG_RX_ROLLOVER_IND,
90
+ .evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND,
91
+ .ring_flag_sop = MWIFIEX_BD_FLAG_SOP,
92
+ .ring_flag_eop = MWIFIEX_BD_FLAG_EOP,
93
+ .ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP,
94
+ .ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP,
95
+ .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
96
+ .pfu_enabled = 1,
97
+ .sleep_cookie = 0,
98
+ .fw_dump_ctrl = PCIE_SCRATCH_13_REG,
99
+ .fw_dump_start = PCIE_SCRATCH_14_REG,
100
+ .fw_dump_end = 0xcff,
101
+ .fw_dump_host_ready = 0xee,
102
+ .fw_dump_read_done = 0xfe,
103
+ .msix_support = 0,
104
+};
105
+
106
+static const struct mwifiex_pcie_card_reg mwifiex_reg_8997 = {
107
+ .cmd_addr_lo = PCIE_SCRATCH_0_REG,
108
+ .cmd_addr_hi = PCIE_SCRATCH_1_REG,
109
+ .cmd_size = PCIE_SCRATCH_2_REG,
110
+ .fw_status = PCIE_SCRATCH_3_REG,
111
+ .cmdrsp_addr_lo = PCIE_SCRATCH_4_REG,
112
+ .cmdrsp_addr_hi = PCIE_SCRATCH_5_REG,
113
+ .tx_rdptr = 0xC1A4,
114
+ .tx_wrptr = 0xC174,
115
+ .rx_rdptr = 0xC174,
116
+ .rx_wrptr = 0xC1A4,
117
+ .evt_rdptr = PCIE_SCRATCH_10_REG,
118
+ .evt_wrptr = PCIE_SCRATCH_11_REG,
119
+ .drv_rdy = PCIE_SCRATCH_12_REG,
120
+ .tx_start_ptr = 16,
121
+ .tx_mask = 0x0FFF0000,
122
+ .tx_wrap_mask = 0x1FFF0000,
123
+ .rx_mask = 0x00000FFF,
124
+ .rx_wrap_mask = 0x00001FFF,
125
+ .tx_rollover_ind = BIT(28),
126
+ .rx_rollover_ind = BIT(12),
127
+ .evt_rollover_ind = MWIFIEX_BD_FLAG_EVT_ROLLOVER_IND,
128
+ .ring_flag_sop = MWIFIEX_BD_FLAG_SOP,
129
+ .ring_flag_eop = MWIFIEX_BD_FLAG_EOP,
130
+ .ring_flag_xs_sop = MWIFIEX_BD_FLAG_XS_SOP,
131
+ .ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP,
132
+ .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
133
+ .pfu_enabled = 1,
134
+ .sleep_cookie = 0,
135
+ .fw_dump_ctrl = PCIE_SCRATCH_13_REG,
136
+ .fw_dump_start = PCIE_SCRATCH_14_REG,
137
+ .fw_dump_end = 0xcff,
138
+ .fw_dump_host_ready = 0xcc,
139
+ .fw_dump_read_done = 0xdd,
140
+ .msix_support = 0,
141
+};
142
+
143
+static struct memory_type_mapping mem_type_mapping_tbl_w8897[] = {
144
+ {"ITCM", NULL, 0, 0xF0},
145
+ {"DTCM", NULL, 0, 0xF1},
146
+ {"SQRAM", NULL, 0, 0xF2},
147
+ {"IRAM", NULL, 0, 0xF3},
148
+ {"APU", NULL, 0, 0xF4},
149
+ {"CIU", NULL, 0, 0xF5},
150
+ {"ICU", NULL, 0, 0xF6},
151
+ {"MAC", NULL, 0, 0xF7},
152
+};
153
+
154
+static struct memory_type_mapping mem_type_mapping_tbl_w8997[] = {
155
+ {"DUMP", NULL, 0, 0xDD},
156
+};
157
+
158
+static const struct mwifiex_pcie_device mwifiex_pcie8766 = {
159
+ .reg = &mwifiex_reg_8766,
160
+ .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
161
+ .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
162
+ .can_dump_fw = false,
163
+ .can_ext_scan = true,
164
+};
165
+
166
+static const struct mwifiex_pcie_device mwifiex_pcie8897 = {
167
+ .reg = &mwifiex_reg_8897,
168
+ .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
169
+ .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
170
+ .can_dump_fw = true,
171
+ .mem_type_mapping_tbl = mem_type_mapping_tbl_w8897,
172
+ .num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8897),
173
+ .can_ext_scan = true,
174
+};
175
+
176
+static const struct mwifiex_pcie_device mwifiex_pcie8997 = {
177
+ .reg = &mwifiex_reg_8997,
178
+ .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
179
+ .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
180
+ .can_dump_fw = true,
181
+ .mem_type_mapping_tbl = mem_type_mapping_tbl_w8997,
182
+ .num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8997),
183
+ .can_ext_scan = true,
184
+};
185
+
186
+static const struct of_device_id mwifiex_pcie_of_match_table[] __maybe_unused = {
37187 { .compatible = "pci11ab,2b42" },
38188 { .compatible = "pci1b4b,2b42" },
39189 { }
....@@ -50,6 +200,8 @@
50200 }
51201
52202 static void mwifiex_pcie_work(struct work_struct *work);
203
+static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter);
204
+static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter);
53205
54206 static int
55207 mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
....@@ -58,8 +210,8 @@
58210 struct pcie_service_card *card = adapter->card;
59211 struct mwifiex_dma_mapping mapping;
60212
61
- mapping.addr = pci_map_single(card->dev, skb->data, size, flags);
62
- if (pci_dma_mapping_error(card->dev, mapping.addr)) {
213
+ mapping.addr = dma_map_single(&card->dev->dev, skb->data, size, flags);
214
+ if (dma_mapping_error(&card->dev->dev, mapping.addr)) {
63215 mwifiex_dbg(adapter, ERROR, "failed to map pci memory!\n");
64216 return -1;
65217 }
....@@ -75,7 +227,7 @@
75227 struct mwifiex_dma_mapping mapping;
76228
77229 mwifiex_get_mapping(skb, &mapping);
78
- pci_unmap_single(card->dev, mapping.addr, mapping.len, flags);
230
+ dma_unmap_single(&card->dev->dev, mapping.addr, mapping.len, flags);
79231 }
80232
81233 /*
....@@ -150,10 +302,8 @@
150302 static int mwifiex_pcie_suspend(struct device *dev)
151303 {
152304 struct mwifiex_adapter *adapter;
153
- struct pcie_service_card *card;
154
- struct pci_dev *pdev = to_pci_dev(dev);
305
+ struct pcie_service_card *card = dev_get_drvdata(dev);
155306
156
- card = pci_get_drvdata(pdev);
157307
158308 /* Might still be loading firmware */
159309 wait_for_completion(&card->fw_done);
....@@ -195,10 +345,8 @@
195345 static int mwifiex_pcie_resume(struct device *dev)
196346 {
197347 struct mwifiex_adapter *adapter;
198
- struct pcie_service_card *card;
199
- struct pci_dev *pdev = to_pci_dev(dev);
348
+ struct pcie_service_card *card = dev_get_drvdata(dev);
200349
201
- card = pci_get_drvdata(pdev);
202350
203351 if (!card->adapter) {
204352 dev_err(dev, "adapter structure is not valid\n");
....@@ -469,10 +617,9 @@
469617 struct sk_buff *cmdrsp = card->cmdrsp_buf;
470618
471619 for (count = 0; count < max_delay_loop_cnt; count++) {
472
- pci_dma_sync_single_for_cpu(card->dev,
473
- MWIFIEX_SKB_DMA_ADDR(cmdrsp),
474
- sizeof(sleep_cookie),
475
- PCI_DMA_FROMDEVICE);
620
+ dma_sync_single_for_cpu(&card->dev->dev,
621
+ MWIFIEX_SKB_DMA_ADDR(cmdrsp),
622
+ sizeof(sleep_cookie), DMA_FROM_DEVICE);
476623 buffer = cmdrsp->data;
477624 sleep_cookie = get_unaligned_le32(buffer);
478625
....@@ -481,10 +628,10 @@
481628 "sleep cookie found at count %d\n", count);
482629 break;
483630 }
484
- pci_dma_sync_single_for_device(card->dev,
485
- MWIFIEX_SKB_DMA_ADDR(cmdrsp),
486
- sizeof(sleep_cookie),
487
- PCI_DMA_FROMDEVICE);
631
+ dma_sync_single_for_device(&card->dev->dev,
632
+ MWIFIEX_SKB_DMA_ADDR(cmdrsp),
633
+ sizeof(sleep_cookie),
634
+ DMA_FROM_DEVICE);
488635 usleep_range(20, 30);
489636 }
490637
....@@ -493,11 +640,15 @@
493640 "max count reached while accessing sleep cookie\n");
494641 }
495642
643
+#define N_WAKEUP_TRIES_SHORT_INTERVAL 15
644
+#define N_WAKEUP_TRIES_LONG_INTERVAL 35
645
+
496646 /* This function wakes up the card by reading fw_status register. */
497647 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
498648 {
499649 struct pcie_service_card *card = adapter->card;
500650 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
651
+ int retval;
501652
502653 mwifiex_dbg(adapter, EVENT,
503654 "event: Wakeup device...\n");
....@@ -505,11 +656,24 @@
505656 if (reg->sleep_cookie)
506657 mwifiex_pcie_dev_wakeup_delay(adapter);
507658
508
- /* Accessing fw_status register will wakeup device */
509
- if (mwifiex_write_reg(adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
510
- mwifiex_dbg(adapter, ERROR,
511
- "Writing fw_status register failed\n");
512
- return -1;
659
+ /* The 88W8897 PCIe+USB firmware (latest version 15.68.19.p21) sometimes
660
+ * appears to ignore or miss our wakeup request, so we continue trying
661
+ * until we receive an interrupt from the card.
662
+ */
663
+ if (read_poll_timeout(mwifiex_write_reg, retval,
664
+ READ_ONCE(adapter->int_status) != 0,
665
+ 500, 500 * N_WAKEUP_TRIES_SHORT_INTERVAL,
666
+ false,
667
+ adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
668
+ if (read_poll_timeout(mwifiex_write_reg, retval,
669
+ READ_ONCE(adapter->int_status) != 0,
670
+ 10000, 10000 * N_WAKEUP_TRIES_LONG_INTERVAL,
671
+ false,
672
+ adapter, reg->fw_status, FIRMWARE_READY_PCIE)) {
673
+ mwifiex_dbg(adapter, ERROR,
674
+ "Firmware didn't wake up\n");
675
+ return -EIO;
676
+ }
513677 }
514678
515679 if (reg->sleep_cookie) {
....@@ -632,14 +796,15 @@
632796 if (!skb) {
633797 mwifiex_dbg(adapter, ERROR,
634798 "Unable to allocate skb for RX ring.\n");
635
- kfree(card->rxbd_ring_vbase);
636799 return -ENOMEM;
637800 }
638801
639802 if (mwifiex_map_pci_memory(adapter, skb,
640803 MWIFIEX_RX_DATA_BUF_SIZE,
641
- PCI_DMA_FROMDEVICE))
642
- return -1;
804
+ DMA_FROM_DEVICE)) {
805
+ kfree_skb(skb);
806
+ return -ENOMEM;
807
+ }
643808
644809 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
645810
....@@ -689,16 +854,14 @@
689854 if (!skb) {
690855 mwifiex_dbg(adapter, ERROR,
691856 "Unable to allocate skb for EVENT buf.\n");
692
- kfree(card->evtbd_ring_vbase);
693857 return -ENOMEM;
694858 }
695859 skb_put(skb, MAX_EVENT_SIZE);
696860
697861 if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
698
- PCI_DMA_FROMDEVICE)) {
862
+ DMA_FROM_DEVICE)) {
699863 kfree_skb(skb);
700
- kfree(card->evtbd_ring_vbase);
701
- return -1;
864
+ return -ENOMEM;
702865 }
703866
704867 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
....@@ -738,7 +901,7 @@
738901 if (card->tx_buf_list[i]) {
739902 skb = card->tx_buf_list[i];
740903 mwifiex_unmap_pci_memory(adapter, skb,
741
- PCI_DMA_TODEVICE);
904
+ DMA_TO_DEVICE);
742905 dev_kfree_skb_any(skb);
743906 }
744907 memset(desc2, 0, sizeof(*desc2));
....@@ -747,7 +910,7 @@
747910 if (card->tx_buf_list[i]) {
748911 skb = card->tx_buf_list[i];
749912 mwifiex_unmap_pci_memory(adapter, skb,
750
- PCI_DMA_TODEVICE);
913
+ DMA_TO_DEVICE);
751914 dev_kfree_skb_any(skb);
752915 }
753916 memset(desc, 0, sizeof(*desc));
....@@ -777,7 +940,7 @@
777940 if (card->rx_buf_list[i]) {
778941 skb = card->rx_buf_list[i];
779942 mwifiex_unmap_pci_memory(adapter, skb,
780
- PCI_DMA_FROMDEVICE);
943
+ DMA_FROM_DEVICE);
781944 dev_kfree_skb_any(skb);
782945 }
783946 memset(desc2, 0, sizeof(*desc2));
....@@ -786,7 +949,7 @@
786949 if (card->rx_buf_list[i]) {
787950 skb = card->rx_buf_list[i];
788951 mwifiex_unmap_pci_memory(adapter, skb,
789
- PCI_DMA_FROMDEVICE);
952
+ DMA_FROM_DEVICE);
790953 dev_kfree_skb_any(skb);
791954 }
792955 memset(desc, 0, sizeof(*desc));
....@@ -812,7 +975,7 @@
812975 if (card->evt_buf_list[i]) {
813976 skb = card->evt_buf_list[i];
814977 mwifiex_unmap_pci_memory(adapter, skb,
815
- PCI_DMA_FROMDEVICE);
978
+ DMA_FROM_DEVICE);
816979 dev_kfree_skb_any(skb);
817980 }
818981 card->evt_buf_list[i] = NULL;
....@@ -853,18 +1016,20 @@
8531016 mwifiex_dbg(adapter, INFO,
8541017 "info: txbd_ring: Allocating %d bytes\n",
8551018 card->txbd_ring_size);
856
- card->txbd_ring_vbase = pci_alloc_consistent(card->dev,
857
- card->txbd_ring_size,
858
- &card->txbd_ring_pbase);
1019
+ card->txbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
1020
+ card->txbd_ring_size,
1021
+ &card->txbd_ring_pbase,
1022
+ GFP_KERNEL);
8591023 if (!card->txbd_ring_vbase) {
8601024 mwifiex_dbg(adapter, ERROR,
861
- "allocate consistent memory (%d bytes) failed!\n",
1025
+ "allocate coherent memory (%d bytes) failed!\n",
8621026 card->txbd_ring_size);
8631027 return -ENOMEM;
8641028 }
1029
+
8651030 mwifiex_dbg(adapter, DATA,
866
- "info: txbd_ring - base: %p, pbase: %#x:%x, len: %x\n",
867
- card->txbd_ring_vbase, (unsigned int)card->txbd_ring_pbase,
1031
+ "info: txbd_ring - base: %p, pbase: %#x:%x, len: %#x\n",
1032
+ card->txbd_ring_vbase, (u32)card->txbd_ring_pbase,
8681033 (u32)((u64)card->txbd_ring_pbase >> 32),
8691034 card->txbd_ring_size);
8701035
....@@ -879,9 +1044,9 @@
8791044 mwifiex_cleanup_txq_ring(adapter);
8801045
8811046 if (card->txbd_ring_vbase)
882
- pci_free_consistent(card->dev, card->txbd_ring_size,
883
- card->txbd_ring_vbase,
884
- card->txbd_ring_pbase);
1047
+ dma_free_coherent(&card->dev->dev, card->txbd_ring_size,
1048
+ card->txbd_ring_vbase,
1049
+ card->txbd_ring_pbase);
8851050 card->txbd_ring_size = 0;
8861051 card->txbd_wrptr = 0;
8871052 card->txbd_rdptr = 0 | reg->tx_rollover_ind;
....@@ -896,6 +1061,7 @@
8961061 */
8971062 static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
8981063 {
1064
+ int ret;
8991065 struct pcie_service_card *card = adapter->card;
9001066 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
9011067
....@@ -917,12 +1083,13 @@
9171083 mwifiex_dbg(adapter, INFO,
9181084 "info: rxbd_ring: Allocating %d bytes\n",
9191085 card->rxbd_ring_size);
920
- card->rxbd_ring_vbase = pci_alloc_consistent(card->dev,
921
- card->rxbd_ring_size,
922
- &card->rxbd_ring_pbase);
1086
+ card->rxbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
1087
+ card->rxbd_ring_size,
1088
+ &card->rxbd_ring_pbase,
1089
+ GFP_KERNEL);
9231090 if (!card->rxbd_ring_vbase) {
9241091 mwifiex_dbg(adapter, ERROR,
925
- "allocate consistent memory (%d bytes) failed!\n",
1092
+ "allocate coherent memory (%d bytes) failed!\n",
9261093 card->rxbd_ring_size);
9271094 return -ENOMEM;
9281095 }
....@@ -933,7 +1100,10 @@
9331100 (u32)((u64)card->rxbd_ring_pbase >> 32),
9341101 card->rxbd_ring_size);
9351102
936
- return mwifiex_init_rxq_ring(adapter);
1103
+ ret = mwifiex_init_rxq_ring(adapter);
1104
+ if (ret)
1105
+ mwifiex_pcie_delete_rxbd_ring(adapter);
1106
+ return ret;
9371107 }
9381108
9391109 /*
....@@ -947,9 +1117,9 @@
9471117 mwifiex_cleanup_rxq_ring(adapter);
9481118
9491119 if (card->rxbd_ring_vbase)
950
- pci_free_consistent(card->dev, card->rxbd_ring_size,
951
- card->rxbd_ring_vbase,
952
- card->rxbd_ring_pbase);
1120
+ dma_free_coherent(&card->dev->dev, card->rxbd_ring_size,
1121
+ card->rxbd_ring_vbase,
1122
+ card->rxbd_ring_pbase);
9531123 card->rxbd_ring_size = 0;
9541124 card->rxbd_wrptr = 0;
9551125 card->rxbd_rdptr = 0 | reg->rx_rollover_ind;
....@@ -964,6 +1134,7 @@
9641134 */
9651135 static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
9661136 {
1137
+ int ret;
9671138 struct pcie_service_card *card = adapter->card;
9681139 const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
9691140
....@@ -980,13 +1151,14 @@
9801151
9811152 mwifiex_dbg(adapter, INFO,
9821153 "info: evtbd_ring: Allocating %d bytes\n",
983
- card->evtbd_ring_size);
984
- card->evtbd_ring_vbase = pci_alloc_consistent(card->dev,
985
- card->evtbd_ring_size,
986
- &card->evtbd_ring_pbase);
1154
+ card->evtbd_ring_size);
1155
+ card->evtbd_ring_vbase = dma_alloc_coherent(&card->dev->dev,
1156
+ card->evtbd_ring_size,
1157
+ &card->evtbd_ring_pbase,
1158
+ GFP_KERNEL);
9871159 if (!card->evtbd_ring_vbase) {
9881160 mwifiex_dbg(adapter, ERROR,
989
- "allocate consistent memory (%d bytes) failed!\n",
1161
+ "allocate coherent memory (%d bytes) failed!\n",
9901162 card->evtbd_ring_size);
9911163 return -ENOMEM;
9921164 }
....@@ -997,7 +1169,10 @@
9971169 (u32)((u64)card->evtbd_ring_pbase >> 32),
9981170 card->evtbd_ring_size);
9991171
1000
- return mwifiex_pcie_init_evt_ring(adapter);
1172
+ ret = mwifiex_pcie_init_evt_ring(adapter);
1173
+ if (ret)
1174
+ mwifiex_pcie_delete_evtbd_ring(adapter);
1175
+ return ret;
10011176 }
10021177
10031178 /*
....@@ -1011,9 +1186,9 @@
10111186 mwifiex_cleanup_evt_ring(adapter);
10121187
10131188 if (card->evtbd_ring_vbase)
1014
- pci_free_consistent(card->dev, card->evtbd_ring_size,
1015
- card->evtbd_ring_vbase,
1016
- card->evtbd_ring_pbase);
1189
+ dma_free_coherent(&card->dev->dev, card->evtbd_ring_size,
1190
+ card->evtbd_ring_vbase,
1191
+ card->evtbd_ring_pbase);
10171192 card->evtbd_wrptr = 0;
10181193 card->evtbd_rdptr = 0 | reg->evt_rollover_ind;
10191194 card->evtbd_ring_size = 0;
....@@ -1040,7 +1215,7 @@
10401215 }
10411216 skb_put(skb, MWIFIEX_UPLD_SIZE);
10421217 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1043
- PCI_DMA_FROMDEVICE)) {
1218
+ DMA_FROM_DEVICE)) {
10441219 kfree_skb(skb);
10451220 return -1;
10461221 }
....@@ -1064,14 +1239,14 @@
10641239
10651240 if (card && card->cmdrsp_buf) {
10661241 mwifiex_unmap_pci_memory(adapter, card->cmdrsp_buf,
1067
- PCI_DMA_FROMDEVICE);
1242
+ DMA_FROM_DEVICE);
10681243 dev_kfree_skb_any(card->cmdrsp_buf);
10691244 card->cmdrsp_buf = NULL;
10701245 }
10711246
10721247 if (card && card->cmd_buf) {
10731248 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1074
- PCI_DMA_TODEVICE);
1249
+ DMA_TO_DEVICE);
10751250 dev_kfree_skb_any(card->cmd_buf);
10761251 card->cmd_buf = NULL;
10771252 }
....@@ -1086,11 +1261,13 @@
10861261 struct pcie_service_card *card = adapter->card;
10871262 u32 *cookie;
10881263
1089
- card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
1090
- &card->sleep_cookie_pbase);
1264
+ card->sleep_cookie_vbase = dma_alloc_coherent(&card->dev->dev,
1265
+ sizeof(u32),
1266
+ &card->sleep_cookie_pbase,
1267
+ GFP_KERNEL);
10911268 if (!card->sleep_cookie_vbase) {
10921269 mwifiex_dbg(adapter, ERROR,
1093
- "pci_alloc_consistent failed!\n");
1270
+ "dma_alloc_coherent failed!\n");
10941271 return -ENOMEM;
10951272 }
10961273 cookie = (u32 *)card->sleep_cookie_vbase;
....@@ -1115,9 +1292,9 @@
11151292 card = adapter->card;
11161293
11171294 if (card && card->sleep_cookie_vbase) {
1118
- pci_free_consistent(card->dev, sizeof(u32),
1119
- card->sleep_cookie_vbase,
1120
- card->sleep_cookie_pbase);
1295
+ dma_free_coherent(&card->dev->dev, sizeof(u32),
1296
+ card->sleep_cookie_vbase,
1297
+ card->sleep_cookie_pbase);
11211298 card->sleep_cookie_vbase = NULL;
11221299 }
11231300
....@@ -1189,7 +1366,7 @@
11891366 "SEND COMP: Detach skb %p at txbd_rdidx=%d\n",
11901367 skb, wrdoneidx);
11911368 mwifiex_unmap_pci_memory(adapter, skb,
1192
- PCI_DMA_TODEVICE);
1369
+ DMA_TO_DEVICE);
11931370
11941371 unmap_count++;
11951372
....@@ -1282,7 +1459,7 @@
12821459 put_unaligned_le16(MWIFIEX_TYPE_DATA, payload + 2);
12831460
12841461 if (mwifiex_map_pci_memory(adapter, skb, skb->len,
1285
- PCI_DMA_TODEVICE))
1462
+ DMA_TO_DEVICE))
12861463 return -1;
12871464
12881465 wrindx = (card->txbd_wrptr & reg->tx_mask) >> reg->tx_start_ptr;
....@@ -1372,7 +1549,7 @@
13721549
13731550 return -EINPROGRESS;
13741551 done_unmap:
1375
- mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1552
+ mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
13761553 card->tx_buf_list[wrindx] = NULL;
13771554 atomic_dec(&adapter->tx_hw_pending);
13781555 if (reg->pfu_enabled)
....@@ -1426,7 +1603,7 @@
14261603 if (!skb_data)
14271604 return -ENOMEM;
14281605
1429
- mwifiex_unmap_pci_memory(adapter, skb_data, PCI_DMA_FROMDEVICE);
1606
+ mwifiex_unmap_pci_memory(adapter, skb_data, DMA_FROM_DEVICE);
14301607 card->rx_buf_list[rd_index] = NULL;
14311608
14321609 /* Get data length from interface header -
....@@ -1464,7 +1641,7 @@
14641641
14651642 if (mwifiex_map_pci_memory(adapter, skb_tmp,
14661643 MWIFIEX_RX_DATA_BUF_SIZE,
1467
- PCI_DMA_FROMDEVICE))
1644
+ DMA_FROM_DEVICE))
14681645 return -1;
14691646
14701647 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb_tmp);
....@@ -1541,7 +1718,7 @@
15411718 return -1;
15421719 }
15431720
1544
- if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1721
+ if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
15451722 return -1;
15461723
15471724 buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
....@@ -1553,7 +1730,7 @@
15531730 mwifiex_dbg(adapter, ERROR,
15541731 "%s: failed to write download command to boot code.\n",
15551732 __func__);
1556
- mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1733
+ mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
15571734 return -1;
15581735 }
15591736
....@@ -1565,7 +1742,7 @@
15651742 mwifiex_dbg(adapter, ERROR,
15661743 "%s: failed to write download command to boot code.\n",
15671744 __func__);
1568
- mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1745
+ mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
15691746 return -1;
15701747 }
15711748
....@@ -1574,7 +1751,7 @@
15741751 mwifiex_dbg(adapter, ERROR,
15751752 "%s: failed to write command len to cmd_size scratch reg\n",
15761753 __func__);
1577
- mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1754
+ mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
15781755 return -1;
15791756 }
15801757
....@@ -1583,7 +1760,7 @@
15831760 CPU_INTR_DOOR_BELL)) {
15841761 mwifiex_dbg(adapter, ERROR,
15851762 "%s: failed to assert door-bell intr\n", __func__);
1586
- mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
1763
+ mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
15871764 return -1;
15881765 }
15891766
....@@ -1642,7 +1819,7 @@
16421819 put_unaligned_le16((u16)skb->len, &payload[0]);
16431820 put_unaligned_le16(MWIFIEX_TYPE_CMD, &payload[2]);
16441821
1645
- if (mwifiex_map_pci_memory(adapter, skb, skb->len, PCI_DMA_TODEVICE))
1822
+ if (mwifiex_map_pci_memory(adapter, skb, skb->len, DMA_TO_DEVICE))
16461823 return -1;
16471824
16481825 card->cmd_buf = skb;
....@@ -1742,17 +1919,16 @@
17421919 "info: Rx CMD Response\n");
17431920
17441921 if (adapter->curr_cmd)
1745
- mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
1922
+ mwifiex_unmap_pci_memory(adapter, skb, DMA_FROM_DEVICE);
17461923 else
1747
- pci_dma_sync_single_for_cpu(card->dev,
1748
- MWIFIEX_SKB_DMA_ADDR(skb),
1749
- MWIFIEX_UPLD_SIZE,
1750
- PCI_DMA_FROMDEVICE);
1924
+ dma_sync_single_for_cpu(&card->dev->dev,
1925
+ MWIFIEX_SKB_DMA_ADDR(skb),
1926
+ MWIFIEX_UPLD_SIZE, DMA_FROM_DEVICE);
17511927
17521928 /* Unmap the command as a response has been received. */
17531929 if (card->cmd_buf) {
17541930 mwifiex_unmap_pci_memory(adapter, card->cmd_buf,
1755
- PCI_DMA_TODEVICE);
1931
+ DMA_TO_DEVICE);
17561932 dev_kfree_skb_any(card->cmd_buf);
17571933 card->cmd_buf = NULL;
17581934 }
....@@ -1763,10 +1939,10 @@
17631939
17641940 if (!adapter->curr_cmd) {
17651941 if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
1766
- pci_dma_sync_single_for_device(card->dev,
1767
- MWIFIEX_SKB_DMA_ADDR(skb),
1768
- MWIFIEX_SLEEP_COOKIE_SIZE,
1769
- PCI_DMA_FROMDEVICE);
1942
+ dma_sync_single_for_device(&card->dev->dev,
1943
+ MWIFIEX_SKB_DMA_ADDR(skb),
1944
+ MWIFIEX_SLEEP_COOKIE_SIZE,
1945
+ DMA_FROM_DEVICE);
17701946 if (mwifiex_write_reg(adapter,
17711947 PCIE_CPU_INT_EVENT,
17721948 CPU_INTR_SLEEP_CFM_DONE)) {
....@@ -1777,7 +1953,7 @@
17771953 mwifiex_delay_for_sleep_cookie(adapter,
17781954 MWIFIEX_MAX_DELAY_COUNT);
17791955 mwifiex_unmap_pci_memory(adapter, skb,
1780
- PCI_DMA_FROMDEVICE);
1956
+ DMA_FROM_DEVICE);
17811957 skb_pull(skb, adapter->intf_hdr_len);
17821958 while (reg->sleep_cookie && (count++ < 10) &&
17831959 mwifiex_pcie_ok_to_access_hw(adapter))
....@@ -1793,7 +1969,7 @@
17931969 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len));
17941970 skb_push(skb, adapter->intf_hdr_len);
17951971 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1796
- PCI_DMA_FROMDEVICE))
1972
+ DMA_FROM_DEVICE))
17971973 return -1;
17981974 } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
17991975 skb_pull(skb, adapter->intf_hdr_len);
....@@ -1835,7 +2011,7 @@
18352011 card->cmdrsp_buf = skb;
18362012 skb_push(card->cmdrsp_buf, adapter->intf_hdr_len);
18372013 if (mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
1838
- PCI_DMA_FROMDEVICE))
2014
+ DMA_FROM_DEVICE))
18392015 return -1;
18402016 }
18412017
....@@ -1890,7 +2066,7 @@
18902066 mwifiex_dbg(adapter, INFO,
18912067 "info: Read Index: %d\n", rdptr);
18922068 skb_cmd = card->evt_buf_list[rdptr];
1893
- mwifiex_unmap_pci_memory(adapter, skb_cmd, PCI_DMA_FROMDEVICE);
2069
+ mwifiex_unmap_pci_memory(adapter, skb_cmd, DMA_FROM_DEVICE);
18942070
18952071 /* Take the pointer and set it to event pointer in adapter
18962072 and will return back after event handling callback */
....@@ -1970,7 +2146,7 @@
19702146 skb_put(skb, MAX_EVENT_SIZE - skb->len);
19712147 if (mwifiex_map_pci_memory(adapter, skb,
19722148 MAX_EVENT_SIZE,
1973
- PCI_DMA_FROMDEVICE))
2149
+ DMA_FROM_DEVICE))
19742150 return -1;
19752151 card->evt_buf_list[rdptr] = skb;
19762152 desc = card->evtbd_ring[rdptr];
....@@ -2252,7 +2428,7 @@
22522428 "interrupt status during fw dnld.\n",
22532429 __func__);
22542430 mwifiex_unmap_pci_memory(adapter, skb,
2255
- PCI_DMA_TODEVICE);
2431
+ DMA_TO_DEVICE);
22562432 ret = -1;
22572433 goto done;
22582434 }
....@@ -2264,12 +2440,12 @@
22642440 mwifiex_dbg(adapter, ERROR, "%s: Card failed to ACK download\n",
22652441 __func__);
22662442 mwifiex_unmap_pci_memory(adapter, skb,
2267
- PCI_DMA_TODEVICE);
2443
+ DMA_TO_DEVICE);
22682444 ret = -1;
22692445 goto done;
22702446 }
22712447
2272
- mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_TODEVICE);
2448
+ mwifiex_unmap_pci_memory(adapter, skb, DMA_TO_DEVICE);
22732449
22742450 offset += txlen;
22752451 } while (true);
....@@ -2939,16 +3115,9 @@
29393115
29403116 pci_set_master(pdev);
29413117
2942
- pr_notice("try set_consistent_dma_mask(32)\n");
2943
- ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
3118
+ ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
29443119 if (ret) {
2945
- pr_err("set_dma_mask(32) failed\n");
2946
- goto err_set_dma_mask;
2947
- }
2948
-
2949
- ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
2950
- if (ret) {
2951
- pr_err("set_consistent_dma_mask(64) failed\n");
3120
+ pr_err("dma_set_mask(32) failed: %d\n", ret);
29523121 goto err_set_dma_mask;
29533122 }
29543123
....@@ -2975,13 +3144,16 @@
29753144 goto err_iomap2;
29763145 }
29773146
2978
- pr_notice("PCI memory map Virt0: %p PCI memory map Virt2: %p\n",
3147
+ pr_notice("PCI memory map Virt0: %pK PCI memory map Virt2: %pK\n",
29793148 card->pci_mmap, card->pci_mmap1);
29803149
29813150 ret = mwifiex_pcie_alloc_buffers(adapter);
29823151 if (ret)
29833152 goto err_alloc_buffers;
29843153
3154
+ if (pdev->device == PCIE_DEVICE_ID_MARVELL_88W8897)
3155
+ adapter->ignore_btcoex_events = true;
3156
+
29853157 return 0;
29863158
29873159 err_alloc_buffers: