forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 958e46acc8e900e8569dd467c1af9b8d2d019394
kernel/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
....@@ -5,10 +5,9 @@
55 *
66 * GPL LICENSE SUMMARY
77 *
8
- * Copyright(c) 2007 - 2015 Intel Corporation. All rights reserved.
98 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
109 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
11
- * Copyright(c) 2018 Intel Corporation
10
+ * Copyright(c) 2007 - 2015, 2018 - 2020 Intel Corporation
1211 *
1312 * This program is free software; you can redistribute it and/or modify
1413 * it under the terms of version 2 of the GNU General Public License as
....@@ -19,11 +18,6 @@
1918 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2019 * General Public License for more details.
2120 *
22
- * You should have received a copy of the GNU General Public License
23
- * along with this program; if not, write to the Free Software
24
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
25
- * USA
26
- *
2721 * The full GNU General Public License is included in this distribution
2822 * in the file called COPYING.
2923 *
....@@ -33,10 +27,9 @@
3327 *
3428 * BSD LICENSE
3529 *
36
- * Copyright(c) 2005 - 2015 Intel Corporation. All rights reserved.
3730 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
3831 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
39
- * Copyright(c) 2018 Intel Corporation
32
+ * Copyright(c) 2007 - 2015, 2018 - 2020 Intel Corporation
4033 * All rights reserved.
4134 *
4235 * Redistribution and use in source and binary forms, with or without
....@@ -67,15 +60,15 @@
6760 *
6861 *****************************************************************************/
6962 #include <linux/pci.h>
70
-#include <linux/pci-aspm.h>
7163 #include <linux/interrupt.h>
7264 #include <linux/debugfs.h>
7365 #include <linux/sched.h>
7466 #include <linux/bitops.h>
7567 #include <linux/gfp.h>
7668 #include <linux/vmalloc.h>
77
-#include <linux/pm_runtime.h>
7869 #include <linux/module.h>
70
+#include <linux/wait.h>
71
+#include <linux/seq_file.h>
7972
8073 #include "iwl-drv.h"
8174 #include "iwl-trans.h"
....@@ -85,17 +78,21 @@
8578 #include "iwl-agn-hw.h"
8679 #include "fw/error-dump.h"
8780 #include "fw/dbg.h"
81
+#include "fw/api/tx.h"
8882 #include "internal.h"
8983 #include "iwl-fh.h"
84
+#include "iwl-context-info-gen3.h"
9085
9186 /* extended range in FW SRAM */
9287 #define IWL_FW_MEM_EXTENDED_START 0x40000
9388 #define IWL_FW_MEM_EXTENDED_END 0x57FFF
9489
95
-static void iwl_trans_pcie_dump_regs(struct iwl_trans *trans)
90
+void iwl_trans_pcie_dump_regs(struct iwl_trans *trans)
9691 {
97
-#define PCI_DUMP_SIZE 64
98
-#define PREFIX_LEN 32
92
+#define PCI_DUMP_SIZE 352
93
+#define PCI_MEM_DUMP_SIZE 64
94
+#define PCI_PARENT_DUMP_SIZE 524
95
+#define PREFIX_LEN 32
9996 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
10097 struct pci_dev *pdev = trans_pcie->pci_dev;
10198 u32 i, pos, alloc_size, *ptr, *buf;
....@@ -106,11 +103,15 @@
106103
107104 /* Should be a multiple of 4 */
108105 BUILD_BUG_ON(PCI_DUMP_SIZE > 4096 || PCI_DUMP_SIZE & 0x3);
106
+ BUILD_BUG_ON(PCI_MEM_DUMP_SIZE > 4096 || PCI_MEM_DUMP_SIZE & 0x3);
107
+ BUILD_BUG_ON(PCI_PARENT_DUMP_SIZE > 4096 || PCI_PARENT_DUMP_SIZE & 0x3);
108
+
109109 /* Alloc a max size buffer */
110
- if (PCI_ERR_ROOT_ERR_SRC + 4 > PCI_DUMP_SIZE)
111
- alloc_size = PCI_ERR_ROOT_ERR_SRC + 4 + PREFIX_LEN;
112
- else
113
- alloc_size = PCI_DUMP_SIZE + PREFIX_LEN;
110
+ alloc_size = PCI_ERR_ROOT_ERR_SRC + 4 + PREFIX_LEN;
111
+ alloc_size = max_t(u32, alloc_size, PCI_DUMP_SIZE + PREFIX_LEN);
112
+ alloc_size = max_t(u32, alloc_size, PCI_MEM_DUMP_SIZE + PREFIX_LEN);
113
+ alloc_size = max_t(u32, alloc_size, PCI_PARENT_DUMP_SIZE + PREFIX_LEN);
114
+
114115 buf = kmalloc(alloc_size, GFP_ATOMIC);
115116 if (!buf)
116117 return;
....@@ -127,7 +128,7 @@
127128 print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
128129
129130 IWL_ERR(trans, "iwlwifi device memory mapped registers:\n");
130
- for (i = 0, ptr = buf; i < PCI_DUMP_SIZE; i += 4, ptr++)
131
+ for (i = 0, ptr = buf; i < PCI_MEM_DUMP_SIZE; i += 4, ptr++)
131132 *ptr = iwl_read32(trans, i);
132133 print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
133134
....@@ -150,7 +151,7 @@
150151
151152 IWL_ERR(trans, "iwlwifi parent port (%s) config registers:\n",
152153 pci_name(pdev));
153
- for (i = 0, ptr = buf; i < PCI_DUMP_SIZE; i += 4, ptr++)
154
+ for (i = 0, ptr = buf; i < PCI_PARENT_DUMP_SIZE; i += 4, ptr++)
154155 if (pci_read_config_dword(pdev, i, ptr))
155156 goto err_read;
156157 print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
....@@ -183,35 +184,66 @@
183184 static void iwl_trans_pcie_sw_reset(struct iwl_trans *trans)
184185 {
185186 /* Reset entire device - do controller reset (results in SHRD_HW_RST) */
186
- iwl_set_bit(trans, trans->cfg->csr->addr_sw_reset,
187
- BIT(trans->cfg->csr->flag_sw_reset));
187
+ iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
188188 usleep_range(5000, 6000);
189189 }
190190
191191 static void iwl_pcie_free_fw_monitor(struct iwl_trans *trans)
192192 {
193
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
193
+ struct iwl_dram_data *fw_mon = &trans->dbg.fw_mon;
194194
195
- if (!trans_pcie->fw_mon_page)
195
+ if (!fw_mon->size)
196196 return;
197197
198
- dma_unmap_page(trans->dev, trans_pcie->fw_mon_phys,
199
- trans_pcie->fw_mon_size, DMA_FROM_DEVICE);
200
- __free_pages(trans_pcie->fw_mon_page,
201
- get_order(trans_pcie->fw_mon_size));
202
- trans_pcie->fw_mon_page = NULL;
203
- trans_pcie->fw_mon_phys = 0;
204
- trans_pcie->fw_mon_size = 0;
198
+ dma_free_coherent(trans->dev, fw_mon->size, fw_mon->block,
199
+ fw_mon->physical);
200
+
201
+ fw_mon->block = NULL;
202
+ fw_mon->physical = 0;
203
+ fw_mon->size = 0;
204
+}
205
+
206
+static void iwl_pcie_alloc_fw_monitor_block(struct iwl_trans *trans,
207
+ u8 max_power, u8 min_power)
208
+{
209
+ struct iwl_dram_data *fw_mon = &trans->dbg.fw_mon;
210
+ void *block = NULL;
211
+ dma_addr_t physical = 0;
212
+ u32 size = 0;
213
+ u8 power;
214
+
215
+ if (fw_mon->size)
216
+ return;
217
+
218
+ for (power = max_power; power >= min_power; power--) {
219
+ size = BIT(power);
220
+ block = dma_alloc_coherent(trans->dev, size, &physical,
221
+ GFP_KERNEL | __GFP_NOWARN);
222
+ if (!block)
223
+ continue;
224
+
225
+ IWL_INFO(trans,
226
+ "Allocated 0x%08x bytes for firmware monitor.\n",
227
+ size);
228
+ break;
229
+ }
230
+
231
+ if (WARN_ON_ONCE(!block))
232
+ return;
233
+
234
+ if (power != max_power)
235
+ IWL_ERR(trans,
236
+ "Sorry - debug buffer is only %luK while you requested %luK\n",
237
+ (unsigned long)BIT(power - 10),
238
+ (unsigned long)BIT(max_power - 10));
239
+
240
+ fw_mon->block = block;
241
+ fw_mon->physical = physical;
242
+ fw_mon->size = size;
205243 }
206244
207245 void iwl_pcie_alloc_fw_monitor(struct iwl_trans *trans, u8 max_power)
208246 {
209
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
210
- struct page *page = NULL;
211
- dma_addr_t phys;
212
- u32 size = 0;
213
- u8 power;
214
-
215247 if (!max_power) {
216248 /* default max_power is maximum */
217249 max_power = 26;
....@@ -224,49 +256,10 @@
224256 max_power))
225257 return;
226258
227
- if (trans_pcie->fw_mon_page) {
228
- dma_sync_single_for_device(trans->dev, trans_pcie->fw_mon_phys,
229
- trans_pcie->fw_mon_size,
230
- DMA_FROM_DEVICE);
231
- return;
232
- }
233
-
234
- phys = 0;
235
- for (power = max_power; power >= 11; power--) {
236
- int order;
237
-
238
- size = BIT(power);
239
- order = get_order(size);
240
- page = alloc_pages(__GFP_COMP | __GFP_NOWARN | __GFP_ZERO,
241
- order);
242
- if (!page)
243
- continue;
244
-
245
- phys = dma_map_page(trans->dev, page, 0, PAGE_SIZE << order,
246
- DMA_FROM_DEVICE);
247
- if (dma_mapping_error(trans->dev, phys)) {
248
- __free_pages(page, order);
249
- page = NULL;
250
- continue;
251
- }
252
- IWL_INFO(trans,
253
- "Allocated 0x%08x bytes (order %d) for firmware monitor.\n",
254
- size, order);
255
- break;
256
- }
257
-
258
- if (WARN_ON_ONCE(!page))
259
+ if (trans->dbg.fw_mon.size)
259260 return;
260261
261
- if (power != max_power)
262
- IWL_ERR(trans,
263
- "Sorry - debug buffer is only %luK while you requested %luK\n",
264
- (unsigned long)BIT(power - 10),
265
- (unsigned long)BIT(max_power - 10));
266
-
267
- trans_pcie->fw_mon_page = page;
268
- trans_pcie->fw_mon_phys = phys;
269
- trans_pcie->fw_mon_size = size;
262
+ iwl_pcie_alloc_fw_monitor_block(trans, max_power, 11);
270263 }
271264
272265 static u32 iwl_trans_pcie_read_shr(struct iwl_trans *trans, u32 reg)
....@@ -308,18 +301,13 @@
308301 u16 cap;
309302
310303 /*
311
- * HW bug W/A for instability in PCIe bus L0S->L1 transition.
312
- * Check if BIOS (or OS) enabled L1-ASPM on this device.
313
- * If so (likely), disable L0S, so device moves directly L0->L1;
314
- * costs negligible amount of power savings.
315
- * If not (unlikely), enable L0S, so there is at least some
316
- * power savings, even without L1.
304
+ * L0S states have been found to be unstable with our devices
305
+ * and in newer hardware they are not officially supported at
306
+ * all, so we must always set the L0S_DISABLED bit.
317307 */
308
+ iwl_set_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_DISABLED);
309
+
318310 pcie_capability_read_word(trans_pcie->pci_dev, PCI_EXP_LNKCTL, &lctl);
319
- if (lctl & PCI_EXP_LNKCTL_ASPM_L1)
320
- iwl_set_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
321
- else
322
- iwl_clear_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
323311 trans->pm_support = !(lctl & PCI_EXP_LNKCTL_ASPM_L0S);
324312
325313 pcie_capability_read_word(trans_pcie->pci_dev, PCI_EXP_DEVCTL2, &cap);
....@@ -346,7 +334,7 @@
346334 */
347335
348336 /* Disable L0S exit timer (platform NMI Work/Around) */
349
- if (trans->cfg->device_family < IWL_DEVICE_FAMILY_8000)
337
+ if (trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_8000)
350338 iwl_set_bit(trans, CSR_GIO_CHICKEN_BITS,
351339 CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER);
352340
....@@ -370,29 +358,12 @@
370358 iwl_pcie_apm_config(trans);
371359
372360 /* Configure analog phase-lock-loop before activating to D0A */
373
- if (trans->cfg->base_params->pll_cfg)
361
+ if (trans->trans_cfg->base_params->pll_cfg)
374362 iwl_set_bit(trans, CSR_ANA_PLL_CFG, CSR50_ANA_PLL_CFG_VAL);
375363
376
- /*
377
- * Set "initialization complete" bit to move adapter from
378
- * D0U* --> D0A* (powered-up active) state.
379
- */
380
- iwl_set_bit(trans, CSR_GP_CNTRL,
381
- BIT(trans->cfg->csr->flag_init_done));
382
-
383
- /*
384
- * Wait for clock stabilization; once stabilized, access to
385
- * device-internal resources is supported, e.g. iwl_write_prph()
386
- * and accesses to uCode SRAM.
387
- */
388
- ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
389
- BIT(trans->cfg->csr->flag_mac_clock_ready),
390
- BIT(trans->cfg->csr->flag_mac_clock_ready),
391
- 25000);
392
- if (ret < 0) {
393
- IWL_ERR(trans, "Failed to init the card\n");
364
+ ret = iwl_finish_nic_init(trans, trans->trans_cfg);
365
+ if (ret)
394366 return ret;
395
- }
396367
397368 if (trans->cfg->host_interrupt_operation_mode) {
398369 /*
....@@ -462,23 +433,8 @@
462433
463434 iwl_trans_pcie_sw_reset(trans);
464435
465
- /*
466
- * Set "initialization complete" bit to move adapter from
467
- * D0U* --> D0A* (powered-up active) state.
468
- */
469
- iwl_set_bit(trans, CSR_GP_CNTRL,
470
- BIT(trans->cfg->csr->flag_init_done));
471
-
472
- /*
473
- * Wait for clock stabilization; once stabilized, access to
474
- * device-internal resources is possible.
475
- */
476
- ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
477
- BIT(trans->cfg->csr->flag_mac_clock_ready),
478
- BIT(trans->cfg->csr->flag_mac_clock_ready),
479
- 25000);
480
- if (WARN_ON(ret < 0)) {
481
- IWL_ERR(trans, "Access time out - failed to enable LP XTAL\n");
436
+ ret = iwl_finish_nic_init(trans, trans->trans_cfg);
437
+ if (WARN_ON(ret)) {
482438 /* Release XTAL ON request */
483439 __iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
484440 CSR_GP_CNTRL_REG_FLAG_XTAL_ON);
....@@ -526,8 +482,7 @@
526482 * Clear "initialization complete" bit to move adapter from
527483 * D0A* (powered-up Active) --> D0U* (Uninitialized) state.
528484 */
529
- iwl_clear_bit(trans, CSR_GP_CNTRL,
530
- BIT(trans->cfg->csr->flag_init_done));
485
+ iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
531486
532487 /* Activates XTAL resources monitor */
533488 __iwl_trans_pcie_set_bit(trans, CSR_MONITOR_CFG_REG,
....@@ -549,12 +504,11 @@
549504 int ret;
550505
551506 /* stop device's busmaster DMA activity */
552
- iwl_set_bit(trans, trans->cfg->csr->addr_sw_reset,
553
- BIT(trans->cfg->csr->flag_stop_master));
507
+ iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);
554508
555
- ret = iwl_poll_bit(trans, trans->cfg->csr->addr_sw_reset,
556
- BIT(trans->cfg->csr->flag_master_dis),
557
- BIT(trans->cfg->csr->flag_master_dis), 100);
509
+ ret = iwl_poll_bit(trans, CSR_RESET,
510
+ CSR_RESET_REG_FLAG_MASTER_DISABLED,
511
+ CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
558512 if (ret < 0)
559513 IWL_WARN(trans, "Master Disable Timed Out, 100 usec\n");
560514
....@@ -570,10 +524,11 @@
570524 iwl_pcie_apm_init(trans);
571525
572526 /* inform ME that we are leaving */
573
- if (trans->cfg->device_family == IWL_DEVICE_FAMILY_7000)
527
+ if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000)
574528 iwl_set_bits_prph(trans, APMG_PCIDEV_STT_REG,
575529 APMG_PCIDEV_STT_VAL_WAKE_ME);
576
- else if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000) {
530
+ else if (trans->trans_cfg->device_family >=
531
+ IWL_DEVICE_FAMILY_8000) {
577532 iwl_set_bit(trans, CSR_DBG_LINK_PWR_MGMT_REG,
578533 CSR_RESET_LINK_PWR_MGMT_DISABLED);
579534 iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
....@@ -602,8 +557,7 @@
602557 * Clear "initialization complete" bit to move adapter from
603558 * D0A* (powered-up Active) --> D0U* (Uninitialized) state.
604559 */
605
- iwl_clear_bit(trans, CSR_GP_CNTRL,
606
- BIT(trans->cfg->csr->flag_init_done));
560
+ iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
607561 }
608562
609563 static int iwl_pcie_nic_init(struct iwl_trans *trans)
....@@ -630,7 +584,7 @@
630584 if (iwl_pcie_tx_init(trans))
631585 return -ENOMEM;
632586
633
- if (trans->cfg->base_params->shadow_reg_enable) {
587
+ if (trans->trans_cfg->base_params->shadow_reg_enable) {
634588 /* enable shadow regs in HW */
635589 iwl_set_bit(trans, CSR_MAC_SHADOW_REG_CTRL, 0x800FFFFF);
636590 IWL_DEBUG_INFO(trans, "Enabling shadow registers in device\n");
....@@ -868,7 +822,7 @@
868822
869823 iwl_enable_interrupts(trans);
870824
871
- if (trans->cfg->use_tfh) {
825
+ if (trans->trans_cfg->use_tfh) {
872826 if (cpu == 1)
873827 iwl_write_prph(trans, UREG_UCODE_LOAD_STATUS,
874828 0xFFFF);
....@@ -928,11 +882,53 @@
928882 return 0;
929883 }
930884
885
+static void iwl_pcie_apply_destination_ini(struct iwl_trans *trans)
886
+{
887
+ enum iwl_fw_ini_allocation_id alloc_id = IWL_FW_INI_ALLOCATION_ID_DBGC1;
888
+ struct iwl_fw_ini_allocation_tlv *fw_mon_cfg =
889
+ &trans->dbg.fw_mon_cfg[alloc_id];
890
+ struct iwl_dram_data *frag;
891
+
892
+ if (!iwl_trans_dbg_ini_valid(trans))
893
+ return;
894
+
895
+ if (le32_to_cpu(fw_mon_cfg->buf_location) ==
896
+ IWL_FW_INI_LOCATION_SRAM_PATH) {
897
+ IWL_DEBUG_FW(trans, "WRT: Applying SMEM buffer destination\n");
898
+ /* set sram monitor by enabling bit 7 */
899
+ iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
900
+ CSR_HW_IF_CONFIG_REG_BIT_MONITOR_SRAM);
901
+
902
+ return;
903
+ }
904
+
905
+ if (le32_to_cpu(fw_mon_cfg->buf_location) !=
906
+ IWL_FW_INI_LOCATION_DRAM_PATH ||
907
+ !trans->dbg.fw_mon_ini[alloc_id].num_frags)
908
+ return;
909
+
910
+ frag = &trans->dbg.fw_mon_ini[alloc_id].frags[0];
911
+
912
+ IWL_DEBUG_FW(trans, "WRT: Applying DRAM destination (alloc_id=%u)\n",
913
+ alloc_id);
914
+
915
+ iwl_write_umac_prph(trans, MON_BUFF_BASE_ADDR_VER2,
916
+ frag->physical >> MON_BUFF_SHIFT_VER2);
917
+ iwl_write_umac_prph(trans, MON_BUFF_END_ADDR_VER2,
918
+ (frag->physical + frag->size - 256) >>
919
+ MON_BUFF_SHIFT_VER2);
920
+}
921
+
931922 void iwl_pcie_apply_destination(struct iwl_trans *trans)
932923 {
933
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
934
- const struct iwl_fw_dbg_dest_tlv_v1 *dest = trans->dbg_dest_tlv;
924
+ const struct iwl_fw_dbg_dest_tlv_v1 *dest = trans->dbg.dest_tlv;
925
+ const struct iwl_dram_data *fw_mon = &trans->dbg.fw_mon;
935926 int i;
927
+
928
+ if (iwl_trans_dbg_ini_valid(trans)) {
929
+ iwl_pcie_apply_destination_ini(trans);
930
+ return;
931
+ }
936932
937933 IWL_INFO(trans, "Applying debug destination %s\n",
938934 get_fw_dbg_mode_string(dest->monitor_mode));
....@@ -942,7 +938,7 @@
942938 else
943939 IWL_WARN(trans, "PCI should have external buffer debug\n");
944940
945
- for (i = 0; i < trans->dbg_dest_reg_num; i++) {
941
+ for (i = 0; i < trans->dbg.n_dest_reg; i++) {
946942 u32 addr = le32_to_cpu(dest->reg_ops[i].addr);
947943 u32 val = le32_to_cpu(dest->reg_ops[i].val);
948944
....@@ -981,26 +977,23 @@
981977 }
982978
983979 monitor:
984
- if (dest->monitor_mode == EXTERNAL_MODE && trans_pcie->fw_mon_size) {
980
+ if (dest->monitor_mode == EXTERNAL_MODE && fw_mon->size) {
985981 iwl_write_prph(trans, le32_to_cpu(dest->base_reg),
986
- trans_pcie->fw_mon_phys >> dest->base_shift);
987
- if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000)
982
+ fw_mon->physical >> dest->base_shift);
983
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_8000)
988984 iwl_write_prph(trans, le32_to_cpu(dest->end_reg),
989
- (trans_pcie->fw_mon_phys +
990
- trans_pcie->fw_mon_size - 256) >>
991
- dest->end_shift);
985
+ (fw_mon->physical + fw_mon->size -
986
+ 256) >> dest->end_shift);
992987 else
993988 iwl_write_prph(trans, le32_to_cpu(dest->end_reg),
994
- (trans_pcie->fw_mon_phys +
995
- trans_pcie->fw_mon_size) >>
996
- dest->end_shift);
989
+ (fw_mon->physical + fw_mon->size) >>
990
+ dest->end_shift);
997991 }
998992 }
999993
1000994 static int iwl_pcie_load_given_ucode(struct iwl_trans *trans,
1001995 const struct fw_img *image)
1002996 {
1003
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
1004997 int ret = 0;
1005998 int first_ucode_section;
1006999
....@@ -1025,21 +1018,8 @@
10251018 return ret;
10261019 }
10271020
1028
- /* supported for 7000 only for the moment */
1029
- if (iwlwifi_mod_params.fw_monitor &&
1030
- trans->cfg->device_family == IWL_DEVICE_FAMILY_7000) {
1031
- iwl_pcie_alloc_fw_monitor(trans, 0);
1032
-
1033
- if (trans_pcie->fw_mon_size) {
1034
- iwl_write_prph(trans, MON_BUFF_BASE_ADDR,
1035
- trans_pcie->fw_mon_phys >> 4);
1036
- iwl_write_prph(trans, MON_BUFF_END_ADDR,
1037
- (trans_pcie->fw_mon_phys +
1038
- trans_pcie->fw_mon_size) >> 4);
1039
- }
1040
- } else if (trans->dbg_dest_tlv) {
1021
+ if (iwl_pcie_dbg_on(trans))
10411022 iwl_pcie_apply_destination(trans);
1042
- }
10431023
10441024 iwl_enable_interrupts(trans);
10451025
....@@ -1058,7 +1038,7 @@
10581038 IWL_DEBUG_FW(trans, "working with %s CPU\n",
10591039 image->is_dual_cpus ? "Dual" : "Single");
10601040
1061
- if (trans->dbg_dest_tlv)
1041
+ if (iwl_pcie_dbg_on(trans))
10621042 iwl_pcie_apply_destination(trans);
10631043
10641044 IWL_DEBUG_POWER(trans, "Original WFPM value = 0x%08X\n",
....@@ -1123,6 +1103,7 @@
11231103 {MSIX_FH_INT_CAUSES_FH_ERR, CSR_MSIX_FH_INT_MASK_AD, 0x5},
11241104 {MSIX_HW_INT_CAUSES_REG_ALIVE, CSR_MSIX_HW_INT_MASK_AD, 0x10},
11251105 {MSIX_HW_INT_CAUSES_REG_WAKEUP, CSR_MSIX_HW_INT_MASK_AD, 0x11},
1106
+ {MSIX_HW_INT_CAUSES_REG_IML, CSR_MSIX_HW_INT_MASK_AD, 0x12},
11261107 {MSIX_HW_INT_CAUSES_REG_CT_KILL, CSR_MSIX_HW_INT_MASK_AD, 0x16},
11271108 {MSIX_HW_INT_CAUSES_REG_RF_KILL, CSR_MSIX_HW_INT_MASK_AD, 0x17},
11281109 {MSIX_HW_INT_CAUSES_REG_PERIODIC, CSR_MSIX_HW_INT_MASK_AD, 0x18},
....@@ -1133,30 +1114,12 @@
11331114 {MSIX_HW_INT_CAUSES_REG_HAP, CSR_MSIX_HW_INT_MASK_AD, 0x2E},
11341115 };
11351116
1136
-static struct iwl_causes_list causes_list_v2[] = {
1137
- {MSIX_FH_INT_CAUSES_D2S_CH0_NUM, CSR_MSIX_FH_INT_MASK_AD, 0},
1138
- {MSIX_FH_INT_CAUSES_D2S_CH1_NUM, CSR_MSIX_FH_INT_MASK_AD, 0x1},
1139
- {MSIX_FH_INT_CAUSES_S2D, CSR_MSIX_FH_INT_MASK_AD, 0x3},
1140
- {MSIX_FH_INT_CAUSES_FH_ERR, CSR_MSIX_FH_INT_MASK_AD, 0x5},
1141
- {MSIX_HW_INT_CAUSES_REG_ALIVE, CSR_MSIX_HW_INT_MASK_AD, 0x10},
1142
- {MSIX_HW_INT_CAUSES_REG_IPC, CSR_MSIX_HW_INT_MASK_AD, 0x11},
1143
- {MSIX_HW_INT_CAUSES_REG_SW_ERR_V2, CSR_MSIX_HW_INT_MASK_AD, 0x15},
1144
- {MSIX_HW_INT_CAUSES_REG_CT_KILL, CSR_MSIX_HW_INT_MASK_AD, 0x16},
1145
- {MSIX_HW_INT_CAUSES_REG_RF_KILL, CSR_MSIX_HW_INT_MASK_AD, 0x17},
1146
- {MSIX_HW_INT_CAUSES_REG_PERIODIC, CSR_MSIX_HW_INT_MASK_AD, 0x18},
1147
- {MSIX_HW_INT_CAUSES_REG_SCD, CSR_MSIX_HW_INT_MASK_AD, 0x2A},
1148
- {MSIX_HW_INT_CAUSES_REG_FH_TX, CSR_MSIX_HW_INT_MASK_AD, 0x2B},
1149
- {MSIX_HW_INT_CAUSES_REG_HW_ERR, CSR_MSIX_HW_INT_MASK_AD, 0x2D},
1150
- {MSIX_HW_INT_CAUSES_REG_HAP, CSR_MSIX_HW_INT_MASK_AD, 0x2E},
1151
-};
1152
-
11531117 static void iwl_pcie_map_non_rx_causes(struct iwl_trans *trans)
11541118 {
11551119 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
11561120 int val = trans_pcie->def_irq | MSIX_NON_AUTO_CLEAR_CAUSE;
1157
- int i, arr_size =
1158
- (trans->cfg->device_family < IWL_DEVICE_FAMILY_22560) ?
1159
- ARRAY_SIZE(causes_list) : ARRAY_SIZE(causes_list_v2);
1121
+ int i, arr_size = ARRAY_SIZE(causes_list);
1122
+ struct iwl_causes_list *causes = causes_list;
11601123
11611124 /*
11621125 * Access all non RX causes and map them to the default irq.
....@@ -1164,10 +1127,6 @@
11641127 * the first interrupt vector will serve non-RX and FBQ causes.
11651128 */
11661129 for (i = 0; i < arr_size; i++) {
1167
- struct iwl_causes_list *causes =
1168
- (trans->cfg->device_family < IWL_DEVICE_FAMILY_22560) ?
1169
- causes_list : causes_list_v2;
1170
-
11711130 iwl_write8(trans, CSR_MSIX_IVAR(causes[i].addr), val);
11721131 iwl_clear_bit(trans, causes[i].mask_reg,
11731132 causes[i].cause_num);
....@@ -1209,10 +1168,10 @@
12091168 struct iwl_trans *trans = trans_pcie->trans;
12101169
12111170 if (!trans_pcie->msix_enabled) {
1212
- if (trans->cfg->mq_rx_supported &&
1171
+ if (trans->trans_cfg->mq_rx_supported &&
12131172 test_bit(STATUS_DEVICE_ENABLED, &trans->status))
1214
- iwl_write_prph(trans, UREG_CHICK,
1215
- UREG_CHICK_MSI_ENABLE);
1173
+ iwl_write_umac_prph(trans, UREG_CHICK,
1174
+ UREG_CHICK_MSI_ENABLE);
12161175 return;
12171176 }
12181177 /*
....@@ -1221,7 +1180,7 @@
12211180 * prph.
12221181 */
12231182 if (test_bit(STATUS_DEVICE_ENABLED, &trans->status))
1224
- iwl_write_prph(trans, UREG_CHICK, UREG_CHICK_MSIX_ENABLE);
1183
+ iwl_write_umac_prph(trans, UREG_CHICK, UREG_CHICK_MSIX_ENABLE);
12251184
12261185 /*
12271186 * Each cause from the causes list above and the RX causes is
....@@ -1250,7 +1209,7 @@
12501209 trans_pcie->hw_mask = trans_pcie->hw_init_mask;
12511210 }
12521211
1253
-static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power)
1212
+static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans)
12541213 {
12551214 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
12561215
....@@ -1260,15 +1219,6 @@
12601219 return;
12611220
12621221 trans_pcie->is_down = true;
1263
-
1264
- /* Stop dbgc before stopping device */
1265
- if (trans->cfg->device_family == IWL_DEVICE_FAMILY_7000) {
1266
- iwl_set_bits_prph(trans, MON_BUFF_SAMPLE_CTL, 0x100);
1267
- } else {
1268
- iwl_write_prph(trans, DBGC_IN_SAMPLE, 0);
1269
- udelay(100);
1270
- iwl_write_prph(trans, DBGC_OUT_CTRL, 0);
1271
- }
12721222
12731223 /* tell the device to stop sending interrupts */
12741224 iwl_disable_interrupts(trans);
....@@ -1299,7 +1249,7 @@
12991249
13001250 /* Make sure (redundant) we've released our request to stay awake */
13011251 iwl_clear_bit(trans, CSR_GP_CNTRL,
1302
- BIT(trans->cfg->csr->flag_mac_access_req));
1252
+ CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
13031253
13041254 /* Stop the device, and put it in low power state */
13051255 iwl_pcie_apm_stop(trans, false);
....@@ -1425,7 +1375,7 @@
14251375 iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
14261376
14271377 /* Load the given image to the HW */
1428
- if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000)
1378
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_8000)
14291379 ret = iwl_pcie_load_given_ucode_8000(trans, fw);
14301380 else
14311381 ret = iwl_pcie_load_given_ucode(trans, fw);
....@@ -1475,7 +1425,7 @@
14751425 iwl_trans_pcie_rf_kill(trans, hw_rfkill);
14761426 }
14771427
1478
-static void iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power)
1428
+static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
14791429 {
14801430 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
14811431 bool was_in_rfkill;
....@@ -1483,7 +1433,7 @@
14831433 mutex_lock(&trans_pcie->mutex);
14841434 trans_pcie->opmode_down = true;
14851435 was_in_rfkill = test_bit(STATUS_RFKILL_OPMODE, &trans->status);
1486
- _iwl_trans_pcie_stop_device(trans, low_power);
1436
+ _iwl_trans_pcie_stop_device(trans);
14871437 iwl_trans_pcie_handle_stop_rfkill(trans, was_in_rfkill);
14881438 mutex_unlock(&trans_pcie->mutex);
14891439 }
....@@ -1498,22 +1448,16 @@
14981448 IWL_WARN(trans, "reporting RF_KILL (radio %s)\n",
14991449 state ? "disabled" : "enabled");
15001450 if (iwl_op_mode_hw_rf_kill(trans->op_mode, state)) {
1501
- if (trans->cfg->gen2)
1502
- _iwl_trans_pcie_gen2_stop_device(trans, true);
1451
+ if (trans->trans_cfg->gen2)
1452
+ _iwl_trans_pcie_gen2_stop_device(trans);
15031453 else
1504
- _iwl_trans_pcie_stop_device(trans, true);
1454
+ _iwl_trans_pcie_stop_device(trans);
15051455 }
15061456 }
15071457
1508
-static void iwl_trans_pcie_d3_suspend(struct iwl_trans *trans, bool test,
1509
- bool reset)
1458
+void iwl_pcie_d3_complete_suspend(struct iwl_trans *trans,
1459
+ bool test, bool reset)
15101460 {
1511
- if (!reset) {
1512
- /* Enable persistence mode to avoid reset */
1513
- iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
1514
- CSR_HW_IF_CONFIG_REG_PERSIST_MODE);
1515
- }
1516
-
15171461 iwl_disable_interrupts(trans);
15181462
15191463 /*
....@@ -1528,11 +1472,8 @@
15281472 iwl_pcie_synchronize_irqs(trans);
15291473
15301474 iwl_clear_bit(trans, CSR_GP_CNTRL,
1531
- BIT(trans->cfg->csr->flag_mac_access_req));
1532
- iwl_clear_bit(trans, CSR_GP_CNTRL,
1533
- BIT(trans->cfg->csr->flag_init_done));
1534
-
1535
- iwl_pcie_enable_rx_wake(trans, false);
1475
+ CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
1476
+ iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
15361477
15371478 if (reset) {
15381479 /*
....@@ -1546,6 +1487,38 @@
15461487 iwl_pcie_set_pwr(trans, true);
15471488 }
15481489
1490
+static int iwl_trans_pcie_d3_suspend(struct iwl_trans *trans, bool test,
1491
+ bool reset)
1492
+{
1493
+ int ret;
1494
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
1495
+
1496
+ if (!reset)
1497
+ /* Enable persistence mode to avoid reset */
1498
+ iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
1499
+ CSR_HW_IF_CONFIG_REG_PERSIST_MODE);
1500
+
1501
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
1502
+ iwl_write_umac_prph(trans, UREG_DOORBELL_TO_ISR6,
1503
+ UREG_DOORBELL_TO_ISR6_SUSPEND);
1504
+
1505
+ ret = wait_event_timeout(trans_pcie->sx_waitq,
1506
+ trans_pcie->sx_complete, 2 * HZ);
1507
+ /*
1508
+ * Invalidate it toward resume.
1509
+ */
1510
+ trans_pcie->sx_complete = false;
1511
+
1512
+ if (!ret) {
1513
+ IWL_ERR(trans, "Timeout entering D3\n");
1514
+ return -ETIMEDOUT;
1515
+ }
1516
+ }
1517
+ iwl_pcie_d3_complete_suspend(trans, test, reset);
1518
+
1519
+ return 0;
1520
+}
1521
+
15491522 static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
15501523 enum iwl_d3_status *status,
15511524 bool test, bool reset)
....@@ -1557,27 +1530,15 @@
15571530 if (test) {
15581531 iwl_enable_interrupts(trans);
15591532 *status = IWL_D3_STATUS_ALIVE;
1560
- return 0;
1533
+ goto out;
15611534 }
15621535
1563
- iwl_pcie_enable_rx_wake(trans, true);
1564
-
15651536 iwl_set_bit(trans, CSR_GP_CNTRL,
1566
- BIT(trans->cfg->csr->flag_mac_access_req));
1567
- iwl_set_bit(trans, CSR_GP_CNTRL,
1568
- BIT(trans->cfg->csr->flag_init_done));
1537
+ CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
15691538
1570
- if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000)
1571
- udelay(2);
1572
-
1573
- ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
1574
- BIT(trans->cfg->csr->flag_mac_clock_ready),
1575
- BIT(trans->cfg->csr->flag_mac_clock_ready),
1576
- 25000);
1577
- if (ret < 0) {
1578
- IWL_ERR(trans, "Failed to resume the device (mac ready)\n");
1539
+ ret = iwl_finish_nic_init(trans, trans->trans_cfg);
1540
+ if (ret)
15791541 return ret;
1580
- }
15811542
15821543 /*
15831544 * Reconfigure IVAR table in case of MSIX or reset ict table in
....@@ -1595,7 +1556,7 @@
15951556
15961557 if (!reset) {
15971558 iwl_clear_bit(trans, CSR_GP_CNTRL,
1598
- BIT(trans->cfg->csr->flag_mac_access_req));
1559
+ CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
15991560 } else {
16001561 iwl_trans_pcie_tx_reset(trans);
16011562
....@@ -1608,7 +1569,7 @@
16081569 }
16091570
16101571 IWL_DEBUG_POWER(trans, "WFPM value upon resume = 0x%08X\n",
1611
- iwl_read_prph(trans, WFPM_GP2));
1572
+ iwl_read_umac_prph(trans, WFPM_GP2));
16121573
16131574 val = iwl_read32(trans, CSR_RESET);
16141575 if (val & CSR_RESET_REG_FLAG_NEVO_RESET)
....@@ -1616,20 +1577,45 @@
16161577 else
16171578 *status = IWL_D3_STATUS_ALIVE;
16181579
1580
+out:
1581
+ if (*status == IWL_D3_STATUS_ALIVE &&
1582
+ trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
1583
+ trans_pcie->sx_complete = false;
1584
+ iwl_write_umac_prph(trans, UREG_DOORBELL_TO_ISR6,
1585
+ UREG_DOORBELL_TO_ISR6_RESUME);
1586
+
1587
+ ret = wait_event_timeout(trans_pcie->sx_waitq,
1588
+ trans_pcie->sx_complete, 2 * HZ);
1589
+ /*
1590
+ * Invalidate it toward next suspend.
1591
+ */
1592
+ trans_pcie->sx_complete = false;
1593
+
1594
+ if (!ret) {
1595
+ IWL_ERR(trans, "Timeout exiting D3\n");
1596
+ return -ETIMEDOUT;
1597
+ }
1598
+ }
16191599 return 0;
16201600 }
16211601
1622
-static void iwl_pcie_set_interrupt_capa(struct pci_dev *pdev,
1623
- struct iwl_trans *trans)
1602
+static void
1603
+iwl_pcie_set_interrupt_capa(struct pci_dev *pdev,
1604
+ struct iwl_trans *trans,
1605
+ const struct iwl_cfg_trans_params *cfg_trans)
16241606 {
16251607 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
16261608 int max_irqs, num_irqs, i, ret;
16271609 u16 pci_cmd;
1610
+ u32 max_rx_queues = IWL_MAX_RX_HW_QUEUES;
16281611
1629
- if (!trans->cfg->mq_rx_supported)
1612
+ if (!cfg_trans->mq_rx_supported)
16301613 goto enable_msi;
16311614
1632
- max_irqs = min_t(u32, num_online_cpus() + 2, IWL_MAX_RX_HW_QUEUES);
1615
+ if (cfg_trans->device_family <= IWL_DEVICE_FAMILY_9000)
1616
+ max_rx_queues = IWL_9000_MAX_RX_HW_QUEUES;
1617
+
1618
+ max_irqs = min_t(u32, num_online_cpus() + 2, max_rx_queues);
16331619 for (i = 0; i < max_irqs; i++)
16341620 trans_pcie->msix_entries[i].entry = i;
16351621
....@@ -1743,10 +1729,63 @@
17431729 return 0;
17441730 }
17451731
1746
-static int _iwl_trans_pcie_start_hw(struct iwl_trans *trans, bool low_power)
1732
+static int iwl_trans_pcie_clear_persistence_bit(struct iwl_trans *trans)
1733
+{
1734
+ u32 hpm, wprot;
1735
+
1736
+ switch (trans->trans_cfg->device_family) {
1737
+ case IWL_DEVICE_FAMILY_9000:
1738
+ wprot = PREG_PRPH_WPROT_9000;
1739
+ break;
1740
+ case IWL_DEVICE_FAMILY_22000:
1741
+ wprot = PREG_PRPH_WPROT_22000;
1742
+ break;
1743
+ default:
1744
+ return 0;
1745
+ }
1746
+
1747
+ hpm = iwl_read_umac_prph_no_grab(trans, HPM_DEBUG);
1748
+ if (hpm != 0xa5a5a5a0 && (hpm & PERSISTENCE_BIT)) {
1749
+ u32 wprot_val = iwl_read_umac_prph_no_grab(trans, wprot);
1750
+
1751
+ if (wprot_val & PREG_WFPM_ACCESS) {
1752
+ IWL_ERR(trans,
1753
+ "Error, can not clear persistence bit\n");
1754
+ return -EPERM;
1755
+ }
1756
+ iwl_write_umac_prph_no_grab(trans, HPM_DEBUG,
1757
+ hpm & ~PERSISTENCE_BIT);
1758
+ }
1759
+
1760
+ return 0;
1761
+}
1762
+
1763
+static int iwl_pcie_gen2_force_power_gating(struct iwl_trans *trans)
1764
+{
1765
+ int ret;
1766
+
1767
+ ret = iwl_finish_nic_init(trans, trans->trans_cfg);
1768
+ if (ret < 0)
1769
+ return ret;
1770
+
1771
+ iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG,
1772
+ HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE);
1773
+ udelay(20);
1774
+ iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG,
1775
+ HPM_HIPM_GEN_CFG_CR_PG_EN |
1776
+ HPM_HIPM_GEN_CFG_CR_SLP_EN);
1777
+ udelay(20);
1778
+ iwl_clear_bits_prph(trans, HPM_HIPM_GEN_CFG,
1779
+ HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE);
1780
+
1781
+ iwl_trans_pcie_sw_reset(trans);
1782
+
1783
+ return 0;
1784
+}
1785
+
1786
+static int _iwl_trans_pcie_start_hw(struct iwl_trans *trans)
17471787 {
17481788 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
1749
- u32 hpm;
17501789 int err;
17511790
17521791 lockdep_assert_held(&trans_pcie->mutex);
....@@ -1757,18 +1796,18 @@
17571796 return err;
17581797 }
17591798
1760
- hpm = iwl_trans_read_prph(trans, HPM_DEBUG);
1761
- if (hpm != 0xa5a5a5a0 && (hpm & PERSISTENCE_BIT)) {
1762
- if (iwl_trans_read_prph(trans, PREG_PRPH_WPROT_0) &
1763
- PREG_WFPM_ACCESS) {
1764
- IWL_ERR(trans,
1765
- "Error, can not clear persistence bit\n");
1766
- return -EPERM;
1767
- }
1768
- iwl_trans_write_prph(trans, HPM_DEBUG, hpm & ~PERSISTENCE_BIT);
1769
- }
1799
+ err = iwl_trans_pcie_clear_persistence_bit(trans);
1800
+ if (err)
1801
+ return err;
17701802
17711803 iwl_trans_pcie_sw_reset(trans);
1804
+
1805
+ if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 &&
1806
+ trans->trans_cfg->integrated) {
1807
+ err = iwl_pcie_gen2_force_power_gating(trans);
1808
+ if (err)
1809
+ return err;
1810
+ }
17721811
17731812 err = iwl_pcie_apm_init(trans);
17741813 if (err)
....@@ -1787,20 +1826,16 @@
17871826 /* ...rfkill can call stop_device and set it false if needed */
17881827 iwl_pcie_check_hw_rf_kill(trans);
17891828
1790
- /* Make sure we sync here, because we'll need full access later */
1791
- if (low_power)
1792
- pm_runtime_resume(trans->dev);
1793
-
17941829 return 0;
17951830 }
17961831
1797
-static int iwl_trans_pcie_start_hw(struct iwl_trans *trans, bool low_power)
1832
+static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
17981833 {
17991834 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
18001835 int ret;
18011836
18021837 mutex_lock(&trans_pcie->mutex);
1803
- ret = _iwl_trans_pcie_start_hw(trans, low_power);
1838
+ ret = _iwl_trans_pcie_start_hw(trans);
18041839 mutex_unlock(&trans_pcie->mutex);
18051840
18061841 return ret;
....@@ -1843,7 +1878,7 @@
18431878
18441879 static u32 iwl_trans_pcie_prph_msk(struct iwl_trans *trans)
18451880 {
1846
- if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560)
1881
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
18471882 return 0x00FFFFFF;
18481883 else
18491884 return 0x000FFFFF;
....@@ -1873,9 +1908,15 @@
18731908 {
18741909 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
18751910
1876
- trans_pcie->cmd_queue = trans_cfg->cmd_queue;
1877
- trans_pcie->cmd_fifo = trans_cfg->cmd_fifo;
1878
- trans_pcie->cmd_q_wdg_timeout = trans_cfg->cmd_q_wdg_timeout;
1911
+ /* free all first - we might be reconfigured for a different size */
1912
+ iwl_pcie_free_rbs_pool(trans);
1913
+
1914
+ trans->txqs.cmd.q_id = trans_cfg->cmd_queue;
1915
+ trans->txqs.cmd.fifo = trans_cfg->cmd_fifo;
1916
+ trans->txqs.cmd.wdg_timeout = trans_cfg->cmd_q_wdg_timeout;
1917
+ trans->txqs.page_offs = trans_cfg->cb_data_offs;
1918
+ trans->txqs.dev_cmd_offs = trans_cfg->cb_data_offs + sizeof(void *);
1919
+
18791920 if (WARN_ON(trans_cfg->n_no_reclaim_cmds > MAX_NO_RECLAIM_CMDS))
18801921 trans_pcie->n_no_reclaim_cmds = 0;
18811922 else
....@@ -1887,13 +1928,15 @@
18871928 trans_pcie->rx_buf_size = trans_cfg->rx_buf_size;
18881929 trans_pcie->rx_page_order =
18891930 iwl_trans_get_rb_size_order(trans_pcie->rx_buf_size);
1931
+ trans_pcie->rx_buf_bytes =
1932
+ iwl_trans_get_rb_size(trans_pcie->rx_buf_size);
1933
+ trans_pcie->supported_dma_mask = DMA_BIT_MASK(12);
1934
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
1935
+ trans_pcie->supported_dma_mask = DMA_BIT_MASK(11);
18901936
1891
- trans_pcie->bc_table_dword = trans_cfg->bc_table_dword;
1937
+ trans->txqs.bc_table_dword = trans_cfg->bc_table_dword;
18921938 trans_pcie->scd_set_active = trans_cfg->scd_set_active;
18931939 trans_pcie->sw_csum_tx = trans_cfg->sw_csum_tx;
1894
-
1895
- trans_pcie->page_offs = trans_cfg->cb_data_offs;
1896
- trans_pcie->dev_cmd_offs = trans_cfg->cb_data_offs + sizeof(void *);
18971940
18981941 trans->command_groups = trans_cfg->command_groups;
18991942 trans->command_groups_size = trans_cfg->command_groups_size;
....@@ -1914,8 +1957,8 @@
19141957
19151958 iwl_pcie_synchronize_irqs(trans);
19161959
1917
- if (trans->cfg->gen2)
1918
- iwl_pcie_gen2_tx_free(trans);
1960
+ if (trans->trans_cfg->gen2)
1961
+ iwl_txq_gen2_tx_free(trans);
19191962 else
19201963 iwl_pcie_tx_free(trans);
19211964 iwl_pcie_rx_free(trans);
....@@ -1939,15 +1982,11 @@
19391982
19401983 iwl_pcie_free_fw_monitor(trans);
19411984
1942
- for_each_possible_cpu(i) {
1943
- struct iwl_tso_hdr_page *p =
1944
- per_cpu_ptr(trans_pcie->tso_hdr_page, i);
1985
+ if (trans_pcie->pnvm_dram.size)
1986
+ dma_free_coherent(trans->dev, trans_pcie->pnvm_dram.size,
1987
+ trans_pcie->pnvm_dram.block,
1988
+ trans_pcie->pnvm_dram.physical);
19451989
1946
- if (p->page)
1947
- __free_page(p->page);
1948
- }
1949
-
1950
- free_percpu(trans_pcie->tso_hdr_page);
19511990 mutex_destroy(&trans_pcie->mutex);
19521991 iwl_trans_free(trans);
19531992 }
....@@ -1970,7 +2009,7 @@
19702009 struct iwl_trans_pcie_removal *removal =
19712010 container_of(wk, struct iwl_trans_pcie_removal, work);
19722011 struct pci_dev *pdev = removal->pdev;
1973
- char *prop[] = {"EVENT=INACCESSIBLE", NULL};
2012
+ static char *prop[] = {"EVENT=INACCESSIBLE", NULL};
19742013
19752014 dev_err(&pdev->dev, "Device gone - attempting removal\n");
19762015 kobject_uevent_env(&pdev->dev.kobj, KOBJ_CHANGE, prop);
....@@ -1989,15 +2028,15 @@
19892028 int ret;
19902029 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
19912030
1992
- spin_lock_irqsave(&trans_pcie->reg_lock, *flags);
2031
+ spin_lock_bh(&trans_pcie->reg_lock);
19932032
19942033 if (trans_pcie->cmd_hold_nic_awake)
19952034 goto out;
19962035
19972036 /* this bit wakes up the NIC */
19982037 __iwl_trans_pcie_set_bit(trans, CSR_GP_CNTRL,
1999
- BIT(trans->cfg->csr->flag_mac_access_req));
2000
- if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000)
2038
+ CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
2039
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_8000)
20012040 udelay(2);
20022041
20032042 /*
....@@ -2021,8 +2060,8 @@
20212060 * and do not save/restore SRAM when power cycling.
20222061 */
20232062 ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
2024
- BIT(trans->cfg->csr->flag_val_mac_access_en),
2025
- (BIT(trans->cfg->csr->flag_mac_clock_ready) |
2063
+ CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
2064
+ (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
20262065 CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
20272066 if (unlikely(ret < 0)) {
20282067 u32 cntrl = iwl_read32(trans, CSR_GP_CNTRL);
....@@ -2036,7 +2075,7 @@
20362075 if (iwlwifi_mod_params.remove_when_gone && cntrl == ~0U) {
20372076 struct iwl_trans_pcie_removal *removal;
20382077
2039
- if (trans_pcie->scheduled_for_removal)
2078
+ if (test_bit(STATUS_TRANS_DEAD, &trans->status))
20402079 goto err;
20412080
20422081 IWL_ERR(trans, "Device gone - scheduling removal!\n");
....@@ -2062,7 +2101,7 @@
20622101 * we don't need to clear this flag, because
20632102 * the trans will be freed and reallocated.
20642103 */
2065
- trans_pcie->scheduled_for_removal = true;
2104
+ set_bit(STATUS_TRANS_DEAD, &trans->status);
20662105
20672106 removal->pdev = to_pci_dev(trans->dev);
20682107 INIT_WORK(&removal->work, iwl_trans_pcie_removal_wk);
....@@ -2074,7 +2113,7 @@
20742113 }
20752114
20762115 err:
2077
- spin_unlock_irqrestore(&trans_pcie->reg_lock, *flags);
2116
+ spin_unlock_bh(&trans_pcie->reg_lock);
20782117 return false;
20792118 }
20802119
....@@ -2104,16 +2143,15 @@
21042143 goto out;
21052144
21062145 __iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
2107
- BIT(trans->cfg->csr->flag_mac_access_req));
2146
+ CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
21082147 /*
21092148 * Above we read the CSR_GP_CNTRL register, which will flush
21102149 * any previous writes, but we need the write that clears the
21112150 * MAC_ACCESS_REQ bit to be performed before any other writes
21122151 * scheduled on different CPUs (after we drop reg_lock).
21132152 */
2114
- mmiowb();
21152153 out:
2116
- spin_unlock_irqrestore(&trans_pcie->reg_lock, *flags);
2154
+ spin_unlock_bh(&trans_pcie->reg_lock);
21172155 }
21182156
21192157 static int iwl_trans_pcie_read_mem(struct iwl_trans *trans, u32 addr,
....@@ -2173,15 +2211,21 @@
21732211 return ret;
21742212 }
21752213
2214
+static int iwl_trans_pcie_read_config32(struct iwl_trans *trans, u32 ofs,
2215
+ u32 *val)
2216
+{
2217
+ return pci_read_config_dword(IWL_TRANS_GET_PCIE_TRANS(trans)->pci_dev,
2218
+ ofs, val);
2219
+}
2220
+
21762221 static void iwl_trans_pcie_freeze_txq_timer(struct iwl_trans *trans,
21772222 unsigned long txqs,
21782223 bool freeze)
21792224 {
2180
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
21812225 int queue;
21822226
21832227 for_each_set_bit(queue, &txqs, BITS_PER_LONG) {
2184
- struct iwl_txq *txq = trans_pcie->txq[queue];
2228
+ struct iwl_txq *txq = trans->txqs.txq[queue];
21852229 unsigned long now;
21862230
21872231 spin_lock_bh(&txq->lock);
....@@ -2229,13 +2273,12 @@
22292273
22302274 static void iwl_trans_pcie_block_txq_ptrs(struct iwl_trans *trans, bool block)
22312275 {
2232
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
22332276 int i;
22342277
2235
- for (i = 0; i < trans->cfg->base_params->num_of_queues; i++) {
2236
- struct iwl_txq *txq = trans_pcie->txq[i];
2278
+ for (i = 0; i < trans->trans_cfg->base_params->num_of_queues; i++) {
2279
+ struct iwl_txq *txq = trans->txqs.txq[i];
22372280
2238
- if (i == trans_pcie->cmd_queue)
2281
+ if (i == trans->txqs.cmd.q_id)
22392282 continue;
22402283
22412284 spin_lock_bh(&txq->lock);
....@@ -2256,36 +2299,6 @@
22562299
22572300 #define IWL_FLUSH_WAIT_MS 2000
22582301
2259
-void iwl_trans_pcie_log_scd_error(struct iwl_trans *trans, struct iwl_txq *txq)
2260
-{
2261
- u32 txq_id = txq->id;
2262
- u32 status;
2263
- bool active;
2264
- u8 fifo;
2265
-
2266
- if (trans->cfg->use_tfh) {
2267
- IWL_ERR(trans, "Queue %d is stuck %d %d\n", txq_id,
2268
- txq->read_ptr, txq->write_ptr);
2269
- /* TODO: access new SCD registers and dump them */
2270
- return;
2271
- }
2272
-
2273
- status = iwl_read_prph(trans, SCD_QUEUE_STATUS_BITS(txq_id));
2274
- fifo = (status >> SCD_QUEUE_STTS_REG_POS_TXF) & 0x7;
2275
- active = !!(status & BIT(SCD_QUEUE_STTS_REG_POS_ACTIVE));
2276
-
2277
- IWL_ERR(trans,
2278
- "Queue %d is %sactive on fifo %d and stuck for %u ms. SW [%d, %d] HW [%d, %d] FH TRB=0x0%x\n",
2279
- txq_id, active ? "" : "in", fifo,
2280
- jiffies_to_msecs(txq->wd_timeout),
2281
- txq->read_ptr, txq->write_ptr,
2282
- iwl_read_prph(trans, SCD_QUEUE_RDPTR(txq_id)) &
2283
- (trans->cfg->base_params->max_tfd_queue_size - 1),
2284
- iwl_read_prph(trans, SCD_QUEUE_WRPTR(txq_id)) &
2285
- (trans->cfg->base_params->max_tfd_queue_size - 1),
2286
- iwl_read_direct32(trans, FH_TX_TRB_REG(fifo)));
2287
-}
2288
-
22892302 static int iwl_trans_pcie_rxq_dma_data(struct iwl_trans *trans, int queue,
22902303 struct iwl_trans_rxq_dma_data *data)
22912304 {
....@@ -2304,34 +2317,57 @@
23042317
23052318 static int iwl_trans_pcie_wait_txq_empty(struct iwl_trans *trans, int txq_idx)
23062319 {
2307
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
23082320 struct iwl_txq *txq;
23092321 unsigned long now = jiffies;
2322
+ bool overflow_tx;
23102323 u8 wr_ptr;
23112324
2312
- if (!test_bit(txq_idx, trans_pcie->queue_used))
2325
+ /* Make sure the NIC is still alive in the bus */
2326
+ if (test_bit(STATUS_TRANS_DEAD, &trans->status))
2327
+ return -ENODEV;
2328
+
2329
+ if (!test_bit(txq_idx, trans->txqs.queue_used))
23132330 return -EINVAL;
23142331
23152332 IWL_DEBUG_TX_QUEUES(trans, "Emptying queue %d...\n", txq_idx);
2316
- txq = trans_pcie->txq[txq_idx];
2333
+ txq = trans->txqs.txq[txq_idx];
2334
+
2335
+ spin_lock_bh(&txq->lock);
2336
+ overflow_tx = txq->overflow_tx ||
2337
+ !skb_queue_empty(&txq->overflow_q);
2338
+ spin_unlock_bh(&txq->lock);
2339
+
23172340 wr_ptr = READ_ONCE(txq->write_ptr);
23182341
2319
- while (txq->read_ptr != READ_ONCE(txq->write_ptr) &&
2342
+ while ((txq->read_ptr != READ_ONCE(txq->write_ptr) ||
2343
+ overflow_tx) &&
23202344 !time_after(jiffies,
23212345 now + msecs_to_jiffies(IWL_FLUSH_WAIT_MS))) {
23222346 u8 write_ptr = READ_ONCE(txq->write_ptr);
23232347
2324
- if (WARN_ONCE(wr_ptr != write_ptr,
2348
+ /*
2349
+ * If write pointer moved during the wait, warn only
2350
+ * if the TX came from op mode. In case TX came from
2351
+ * trans layer (overflow TX) don't warn.
2352
+ */
2353
+ if (WARN_ONCE(wr_ptr != write_ptr && !overflow_tx,
23252354 "WR pointer moved while flushing %d -> %d\n",
23262355 wr_ptr, write_ptr))
23272356 return -ETIMEDOUT;
2357
+ wr_ptr = write_ptr;
2358
+
23282359 usleep_range(1000, 2000);
2360
+
2361
+ spin_lock_bh(&txq->lock);
2362
+ overflow_tx = txq->overflow_tx ||
2363
+ !skb_queue_empty(&txq->overflow_q);
2364
+ spin_unlock_bh(&txq->lock);
23292365 }
23302366
23312367 if (txq->read_ptr != txq->write_ptr) {
23322368 IWL_ERR(trans,
23332369 "fail to flush all tx fifo queues Q %d\n", txq_idx);
2334
- iwl_trans_pcie_log_scd_error(trans, txq);
2370
+ iwl_txq_log_scd_error(trans, txq);
23352371 return -ETIMEDOUT;
23362372 }
23372373
....@@ -2342,16 +2378,17 @@
23422378
23432379 static int iwl_trans_pcie_wait_txqs_empty(struct iwl_trans *trans, u32 txq_bm)
23442380 {
2345
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
23462381 int cnt;
23472382 int ret = 0;
23482383
23492384 /* waiting for all the tx frames complete might take a while */
2350
- for (cnt = 0; cnt < trans->cfg->base_params->num_of_queues; cnt++) {
2385
+ for (cnt = 0;
2386
+ cnt < trans->trans_cfg->base_params->num_of_queues;
2387
+ cnt++) {
23512388
2352
- if (cnt == trans_pcie->cmd_queue)
2389
+ if (cnt == trans->txqs.cmd.q_id)
23532390 continue;
2354
- if (!test_bit(cnt, trans_pcie->queue_used))
2391
+ if (!test_bit(cnt, trans->txqs.queue_used))
23552392 continue;
23562393 if (!(BIT(cnt) & txq_bm))
23572394 continue;
....@@ -2368,42 +2405,10 @@
23682405 u32 mask, u32 value)
23692406 {
23702407 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2371
- unsigned long flags;
23722408
2373
- spin_lock_irqsave(&trans_pcie->reg_lock, flags);
2409
+ spin_lock_bh(&trans_pcie->reg_lock);
23742410 __iwl_trans_pcie_set_bits_mask(trans, reg, mask, value);
2375
- spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
2376
-}
2377
-
2378
-static void iwl_trans_pcie_ref(struct iwl_trans *trans)
2379
-{
2380
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2381
-
2382
- if (iwlwifi_mod_params.d0i3_disable)
2383
- return;
2384
-
2385
- pm_runtime_get(&trans_pcie->pci_dev->dev);
2386
-
2387
-#ifdef CONFIG_PM
2388
- IWL_DEBUG_RPM(trans, "runtime usage count: %d\n",
2389
- atomic_read(&trans_pcie->pci_dev->dev.power.usage_count));
2390
-#endif /* CONFIG_PM */
2391
-}
2392
-
2393
-static void iwl_trans_pcie_unref(struct iwl_trans *trans)
2394
-{
2395
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2396
-
2397
- if (iwlwifi_mod_params.d0i3_disable)
2398
- return;
2399
-
2400
- pm_runtime_mark_last_busy(&trans_pcie->pci_dev->dev);
2401
- pm_runtime_put_autosuspend(&trans_pcie->pci_dev->dev);
2402
-
2403
-#ifdef CONFIG_PM
2404
- IWL_DEBUG_RPM(trans, "runtime usage count: %d\n",
2405
- atomic_read(&trans_pcie->pci_dev->dev.power.usage_count));
2406
-#endif /* CONFIG_PM */
2411
+ spin_unlock_bh(&trans_pcie->reg_lock);
24072412 }
24082413
24092414 static const char *get_csr_string(int cmd)
....@@ -2482,9 +2487,8 @@
24822487 #ifdef CONFIG_IWLWIFI_DEBUGFS
24832488 /* create and remove of files */
24842489 #define DEBUGFS_ADD_FILE(name, parent, mode) do { \
2485
- if (!debugfs_create_file(#name, mode, parent, trans, \
2486
- &iwl_dbgfs_##name##_ops)) \
2487
- goto err; \
2490
+ debugfs_create_file(#name, mode, parent, trans, \
2491
+ &iwl_dbgfs_##name##_ops); \
24882492 } while (0)
24892493
24902494 /* file operation */
....@@ -2510,41 +2514,94 @@
25102514 .llseek = generic_file_llseek, \
25112515 };
25122516
2513
-static ssize_t iwl_dbgfs_tx_queue_read(struct file *file,
2514
- char __user *user_buf,
2515
- size_t count, loff_t *ppos)
2517
+struct iwl_dbgfs_tx_queue_priv {
2518
+ struct iwl_trans *trans;
2519
+};
2520
+
2521
+struct iwl_dbgfs_tx_queue_state {
2522
+ loff_t pos;
2523
+};
2524
+
2525
+static void *iwl_dbgfs_tx_queue_seq_start(struct seq_file *seq, loff_t *pos)
25162526 {
2517
- struct iwl_trans *trans = file->private_data;
2518
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2519
- struct iwl_txq *txq;
2520
- char *buf;
2521
- int pos = 0;
2522
- int cnt;
2523
- int ret;
2524
- size_t bufsz;
2527
+ struct iwl_dbgfs_tx_queue_priv *priv = seq->private;
2528
+ struct iwl_dbgfs_tx_queue_state *state;
25252529
2526
- bufsz = sizeof(char) * 75 * trans->cfg->base_params->num_of_queues;
2530
+ if (*pos >= priv->trans->trans_cfg->base_params->num_of_queues)
2531
+ return NULL;
25272532
2528
- if (!trans_pcie->txq_memory)
2529
- return -EAGAIN;
2533
+ state = kmalloc(sizeof(*state), GFP_KERNEL);
2534
+ if (!state)
2535
+ return NULL;
2536
+ state->pos = *pos;
2537
+ return state;
2538
+}
25302539
2531
- buf = kzalloc(bufsz, GFP_KERNEL);
2532
- if (!buf)
2540
+static void *iwl_dbgfs_tx_queue_seq_next(struct seq_file *seq,
2541
+ void *v, loff_t *pos)
2542
+{
2543
+ struct iwl_dbgfs_tx_queue_priv *priv = seq->private;
2544
+ struct iwl_dbgfs_tx_queue_state *state = v;
2545
+
2546
+ *pos = ++state->pos;
2547
+
2548
+ if (*pos >= priv->trans->trans_cfg->base_params->num_of_queues)
2549
+ return NULL;
2550
+
2551
+ return state;
2552
+}
2553
+
2554
+static void iwl_dbgfs_tx_queue_seq_stop(struct seq_file *seq, void *v)
2555
+{
2556
+ kfree(v);
2557
+}
2558
+
2559
+static int iwl_dbgfs_tx_queue_seq_show(struct seq_file *seq, void *v)
2560
+{
2561
+ struct iwl_dbgfs_tx_queue_priv *priv = seq->private;
2562
+ struct iwl_dbgfs_tx_queue_state *state = v;
2563
+ struct iwl_trans *trans = priv->trans;
2564
+ struct iwl_txq *txq = trans->txqs.txq[state->pos];
2565
+
2566
+ seq_printf(seq, "hwq %.3u: used=%d stopped=%d ",
2567
+ (unsigned int)state->pos,
2568
+ !!test_bit(state->pos, trans->txqs.queue_used),
2569
+ !!test_bit(state->pos, trans->txqs.queue_stopped));
2570
+ if (txq)
2571
+ seq_printf(seq,
2572
+ "read=%u write=%u need_update=%d frozen=%d n_window=%d ampdu=%d",
2573
+ txq->read_ptr, txq->write_ptr,
2574
+ txq->need_update, txq->frozen,
2575
+ txq->n_window, txq->ampdu);
2576
+ else
2577
+ seq_puts(seq, "(unallocated)");
2578
+
2579
+ if (state->pos == trans->txqs.cmd.q_id)
2580
+ seq_puts(seq, " (HCMD)");
2581
+ seq_puts(seq, "\n");
2582
+
2583
+ return 0;
2584
+}
2585
+
2586
+static const struct seq_operations iwl_dbgfs_tx_queue_seq_ops = {
2587
+ .start = iwl_dbgfs_tx_queue_seq_start,
2588
+ .next = iwl_dbgfs_tx_queue_seq_next,
2589
+ .stop = iwl_dbgfs_tx_queue_seq_stop,
2590
+ .show = iwl_dbgfs_tx_queue_seq_show,
2591
+};
2592
+
2593
+static int iwl_dbgfs_tx_queue_open(struct inode *inode, struct file *filp)
2594
+{
2595
+ struct iwl_dbgfs_tx_queue_priv *priv;
2596
+
2597
+ priv = __seq_open_private(filp, &iwl_dbgfs_tx_queue_seq_ops,
2598
+ sizeof(*priv));
2599
+
2600
+ if (!priv)
25332601 return -ENOMEM;
25342602
2535
- for (cnt = 0; cnt < trans->cfg->base_params->num_of_queues; cnt++) {
2536
- txq = trans_pcie->txq[cnt];
2537
- pos += scnprintf(buf + pos, bufsz - pos,
2538
- "hwq %.2d: read=%u write=%u use=%d stop=%d need_update=%d frozen=%d%s\n",
2539
- cnt, txq->read_ptr, txq->write_ptr,
2540
- !!test_bit(cnt, trans_pcie->queue_used),
2541
- !!test_bit(cnt, trans_pcie->queue_stopped),
2542
- txq->need_update, txq->frozen,
2543
- (cnt == trans_pcie->cmd_queue ? " HCMD" : ""));
2544
- }
2545
- ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
2546
- kfree(buf);
2547
- return ret;
2603
+ priv->trans = inode->i_private;
2604
+ return 0;
25482605 }
25492606
25502607 static ssize_t iwl_dbgfs_rx_queue_read(struct file *file,
....@@ -2555,7 +2612,7 @@
25552612 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
25562613 char *buf;
25572614 int pos = 0, i, ret;
2558
- size_t bufsz = sizeof(buf);
2615
+ size_t bufsz;
25592616
25602617 bufsz = sizeof(char) * 121 * trans->num_rx_queues;
25612618
....@@ -2727,30 +2784,174 @@
27272784 {
27282785 struct iwl_trans *trans = file->private_data;
27292786 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2730
- bool old = trans_pcie->debug_rfkill;
2787
+ bool new_value;
27312788 int ret;
27322789
2733
- ret = kstrtobool_from_user(user_buf, count, &trans_pcie->debug_rfkill);
2790
+ ret = kstrtobool_from_user(user_buf, count, &new_value);
27342791 if (ret)
27352792 return ret;
2736
- if (old == trans_pcie->debug_rfkill)
2793
+ if (new_value == trans_pcie->debug_rfkill)
27372794 return count;
27382795 IWL_WARN(trans, "changing debug rfkill %d->%d\n",
2739
- old, trans_pcie->debug_rfkill);
2796
+ trans_pcie->debug_rfkill, new_value);
2797
+ trans_pcie->debug_rfkill = new_value;
27402798 iwl_pcie_handle_rfkill_irq(trans);
27412799
27422800 return count;
27432801 }
27442802
2803
+static int iwl_dbgfs_monitor_data_open(struct inode *inode,
2804
+ struct file *file)
2805
+{
2806
+ struct iwl_trans *trans = inode->i_private;
2807
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2808
+
2809
+ if (!trans->dbg.dest_tlv ||
2810
+ trans->dbg.dest_tlv->monitor_mode != EXTERNAL_MODE) {
2811
+ IWL_ERR(trans, "Debug destination is not set to DRAM\n");
2812
+ return -ENOENT;
2813
+ }
2814
+
2815
+ if (trans_pcie->fw_mon_data.state != IWL_FW_MON_DBGFS_STATE_CLOSED)
2816
+ return -EBUSY;
2817
+
2818
+ trans_pcie->fw_mon_data.state = IWL_FW_MON_DBGFS_STATE_OPEN;
2819
+ return simple_open(inode, file);
2820
+}
2821
+
2822
+static int iwl_dbgfs_monitor_data_release(struct inode *inode,
2823
+ struct file *file)
2824
+{
2825
+ struct iwl_trans_pcie *trans_pcie =
2826
+ IWL_TRANS_GET_PCIE_TRANS(inode->i_private);
2827
+
2828
+ if (trans_pcie->fw_mon_data.state == IWL_FW_MON_DBGFS_STATE_OPEN)
2829
+ trans_pcie->fw_mon_data.state = IWL_FW_MON_DBGFS_STATE_CLOSED;
2830
+ return 0;
2831
+}
2832
+
2833
+static bool iwl_write_to_user_buf(char __user *user_buf, ssize_t count,
2834
+ void *buf, ssize_t *size,
2835
+ ssize_t *bytes_copied)
2836
+{
2837
+ int buf_size_left = count - *bytes_copied;
2838
+
2839
+ buf_size_left = buf_size_left - (buf_size_left % sizeof(u32));
2840
+ if (*size > buf_size_left)
2841
+ *size = buf_size_left;
2842
+
2843
+ *size -= copy_to_user(user_buf, buf, *size);
2844
+ *bytes_copied += *size;
2845
+
2846
+ if (buf_size_left == *size)
2847
+ return true;
2848
+ return false;
2849
+}
2850
+
2851
+static ssize_t iwl_dbgfs_monitor_data_read(struct file *file,
2852
+ char __user *user_buf,
2853
+ size_t count, loff_t *ppos)
2854
+{
2855
+ struct iwl_trans *trans = file->private_data;
2856
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2857
+ void *cpu_addr = (void *)trans->dbg.fw_mon.block, *curr_buf;
2858
+ struct cont_rec *data = &trans_pcie->fw_mon_data;
2859
+ u32 write_ptr_addr, wrap_cnt_addr, write_ptr, wrap_cnt;
2860
+ ssize_t size, bytes_copied = 0;
2861
+ bool b_full;
2862
+
2863
+ if (trans->dbg.dest_tlv) {
2864
+ write_ptr_addr =
2865
+ le32_to_cpu(trans->dbg.dest_tlv->write_ptr_reg);
2866
+ wrap_cnt_addr = le32_to_cpu(trans->dbg.dest_tlv->wrap_count);
2867
+ } else {
2868
+ write_ptr_addr = MON_BUFF_WRPTR;
2869
+ wrap_cnt_addr = MON_BUFF_CYCLE_CNT;
2870
+ }
2871
+
2872
+ if (unlikely(!trans->dbg.rec_on))
2873
+ return 0;
2874
+
2875
+ mutex_lock(&data->mutex);
2876
+ if (data->state ==
2877
+ IWL_FW_MON_DBGFS_STATE_DISABLED) {
2878
+ mutex_unlock(&data->mutex);
2879
+ return 0;
2880
+ }
2881
+
2882
+ /* write_ptr position in bytes rather then DW */
2883
+ write_ptr = iwl_read_prph(trans, write_ptr_addr) * sizeof(u32);
2884
+ wrap_cnt = iwl_read_prph(trans, wrap_cnt_addr);
2885
+
2886
+ if (data->prev_wrap_cnt == wrap_cnt) {
2887
+ size = write_ptr - data->prev_wr_ptr;
2888
+ curr_buf = cpu_addr + data->prev_wr_ptr;
2889
+ b_full = iwl_write_to_user_buf(user_buf, count,
2890
+ curr_buf, &size,
2891
+ &bytes_copied);
2892
+ data->prev_wr_ptr += size;
2893
+
2894
+ } else if (data->prev_wrap_cnt == wrap_cnt - 1 &&
2895
+ write_ptr < data->prev_wr_ptr) {
2896
+ size = trans->dbg.fw_mon.size - data->prev_wr_ptr;
2897
+ curr_buf = cpu_addr + data->prev_wr_ptr;
2898
+ b_full = iwl_write_to_user_buf(user_buf, count,
2899
+ curr_buf, &size,
2900
+ &bytes_copied);
2901
+ data->prev_wr_ptr += size;
2902
+
2903
+ if (!b_full) {
2904
+ size = write_ptr;
2905
+ b_full = iwl_write_to_user_buf(user_buf, count,
2906
+ cpu_addr, &size,
2907
+ &bytes_copied);
2908
+ data->prev_wr_ptr = size;
2909
+ data->prev_wrap_cnt++;
2910
+ }
2911
+ } else {
2912
+ if (data->prev_wrap_cnt == wrap_cnt - 1 &&
2913
+ write_ptr > data->prev_wr_ptr)
2914
+ IWL_WARN(trans,
2915
+ "write pointer passed previous write pointer, start copying from the beginning\n");
2916
+ else if (!unlikely(data->prev_wrap_cnt == 0 &&
2917
+ data->prev_wr_ptr == 0))
2918
+ IWL_WARN(trans,
2919
+ "monitor data is out of sync, start copying from the beginning\n");
2920
+
2921
+ size = write_ptr;
2922
+ b_full = iwl_write_to_user_buf(user_buf, count,
2923
+ cpu_addr, &size,
2924
+ &bytes_copied);
2925
+ data->prev_wr_ptr = size;
2926
+ data->prev_wrap_cnt = wrap_cnt;
2927
+ }
2928
+
2929
+ mutex_unlock(&data->mutex);
2930
+
2931
+ return bytes_copied;
2932
+}
2933
+
27452934 DEBUGFS_READ_WRITE_FILE_OPS(interrupt);
27462935 DEBUGFS_READ_FILE_OPS(fh_reg);
27472936 DEBUGFS_READ_FILE_OPS(rx_queue);
2748
-DEBUGFS_READ_FILE_OPS(tx_queue);
27492937 DEBUGFS_WRITE_FILE_OPS(csr);
27502938 DEBUGFS_READ_WRITE_FILE_OPS(rfkill);
2939
+static const struct file_operations iwl_dbgfs_tx_queue_ops = {
2940
+ .owner = THIS_MODULE,
2941
+ .open = iwl_dbgfs_tx_queue_open,
2942
+ .read = seq_read,
2943
+ .llseek = seq_lseek,
2944
+ .release = seq_release_private,
2945
+};
2946
+
2947
+static const struct file_operations iwl_dbgfs_monitor_data_ops = {
2948
+ .read = iwl_dbgfs_monitor_data_read,
2949
+ .open = iwl_dbgfs_monitor_data_open,
2950
+ .release = iwl_dbgfs_monitor_data_release,
2951
+};
27512952
27522953 /* Create the debugfs files and directories */
2753
-int iwl_trans_pcie_dbgfs_register(struct iwl_trans *trans)
2954
+void iwl_trans_pcie_dbgfs_register(struct iwl_trans *trans)
27542955 {
27552956 struct dentry *dir = trans->dbgfs_dir;
27562957
....@@ -2760,22 +2961,27 @@
27602961 DEBUGFS_ADD_FILE(csr, dir, 0200);
27612962 DEBUGFS_ADD_FILE(fh_reg, dir, 0400);
27622963 DEBUGFS_ADD_FILE(rfkill, dir, 0600);
2763
- return 0;
2964
+ DEBUGFS_ADD_FILE(monitor_data, dir, 0400);
2965
+}
27642966
2765
-err:
2766
- IWL_ERR(trans, "failed to create the trans debugfs entry\n");
2767
- return -ENOMEM;
2967
+static void iwl_trans_pcie_debugfs_cleanup(struct iwl_trans *trans)
2968
+{
2969
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2970
+ struct cont_rec *data = &trans_pcie->fw_mon_data;
2971
+
2972
+ mutex_lock(&data->mutex);
2973
+ data->state = IWL_FW_MON_DBGFS_STATE_DISABLED;
2974
+ mutex_unlock(&data->mutex);
27682975 }
27692976 #endif /*CONFIG_IWLWIFI_DEBUGFS */
27702977
27712978 static u32 iwl_trans_pcie_get_cmdlen(struct iwl_trans *trans, void *tfd)
27722979 {
2773
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
27742980 u32 cmdlen = 0;
27752981 int i;
27762982
2777
- for (i = 0; i < trans_pcie->max_tbs; i++)
2778
- cmdlen += iwl_pcie_tfd_tb_get_len(trans, tfd, i);
2983
+ for (i = 0; i < trans->txqs.tfd.max_tbs; i++)
2984
+ cmdlen += iwl_txq_gen1_tfd_tb_get_len(trans, tfd, i);
27792985
27802986 return cmdlen;
27812987 }
....@@ -2785,7 +2991,7 @@
27852991 int allocated_rb_nums)
27862992 {
27872993 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2788
- int max_len = PAGE_SIZE << trans_pcie->rx_page_order;
2994
+ int max_len = trans_pcie->rx_buf_bytes;
27892995 /* Dump RBs is supported only for pre-9000 devices (1 queue) */
27902996 struct iwl_rxq *rxq = &trans_pcie->rxq[0];
27912997 u32 i, r, j, rb_len = 0;
....@@ -2811,9 +3017,9 @@
28113017 rb->index = cpu_to_le32(i);
28123018 memcpy(rb->data, page_address(rxb->page), max_len);
28133019 /* remap the page for the free benefit */
2814
- rxb->page_dma = dma_map_page(trans->dev, rxb->page, 0,
2815
- max_len,
2816
- DMA_FROM_DEVICE);
3020
+ rxb->page_dma = dma_map_page(trans->dev, rxb->page,
3021
+ rxb->offset, max_len,
3022
+ DMA_FROM_DEVICE);
28173023
28183024 *data = iwl_fw_error_next_data(*data);
28193025 }
....@@ -2858,12 +3064,13 @@
28583064 (*data)->len = cpu_to_le32(fh_regs_len);
28593065 val = (void *)(*data)->data;
28603066
2861
- if (!trans->cfg->gen2)
3067
+ if (!trans->trans_cfg->gen2)
28623068 for (i = FH_MEM_LOWER_BOUND; i < FH_MEM_UPPER_BOUND;
28633069 i += sizeof(u32))
28643070 *val++ = cpu_to_le32(iwl_trans_pcie_read32(trans, i));
28653071 else
2866
- for (i = FH_MEM_LOWER_BOUND_GEN2; i < FH_MEM_UPPER_BOUND_GEN2;
3072
+ for (i = iwl_umac_prph(trans, FH_MEM_LOWER_BOUND_GEN2);
3073
+ i < iwl_umac_prph(trans, FH_MEM_UPPER_BOUND_GEN2);
28673074 i += sizeof(u32))
28683075 *val++ = cpu_to_le32(iwl_trans_pcie_read_prph(trans,
28693076 i));
....@@ -2888,15 +3095,49 @@
28883095 if (!iwl_trans_grab_nic_access(trans, &flags))
28893096 return 0;
28903097
2891
- iwl_write_prph_no_grab(trans, MON_DMARB_RD_CTL_ADDR, 0x1);
3098
+ iwl_write_umac_prph_no_grab(trans, MON_DMARB_RD_CTL_ADDR, 0x1);
28923099 for (i = 0; i < buf_size_in_dwords; i++)
2893
- buffer[i] = iwl_read_prph_no_grab(trans,
2894
- MON_DMARB_RD_DATA_ADDR);
2895
- iwl_write_prph_no_grab(trans, MON_DMARB_RD_CTL_ADDR, 0x0);
3100
+ buffer[i] = iwl_read_umac_prph_no_grab(trans,
3101
+ MON_DMARB_RD_DATA_ADDR);
3102
+ iwl_write_umac_prph_no_grab(trans, MON_DMARB_RD_CTL_ADDR, 0x0);
28963103
28973104 iwl_trans_release_nic_access(trans, &flags);
28983105
28993106 return monitor_len;
3107
+}
3108
+
3109
+static void
3110
+iwl_trans_pcie_dump_pointers(struct iwl_trans *trans,
3111
+ struct iwl_fw_error_dump_fw_mon *fw_mon_data)
3112
+{
3113
+ u32 base, base_high, write_ptr, write_ptr_val, wrap_cnt;
3114
+
3115
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
3116
+ base = DBGC_CUR_DBGBUF_BASE_ADDR_LSB;
3117
+ base_high = DBGC_CUR_DBGBUF_BASE_ADDR_MSB;
3118
+ write_ptr = DBGC_CUR_DBGBUF_STATUS;
3119
+ wrap_cnt = DBGC_DBGBUF_WRAP_AROUND;
3120
+ } else if (trans->dbg.dest_tlv) {
3121
+ write_ptr = le32_to_cpu(trans->dbg.dest_tlv->write_ptr_reg);
3122
+ wrap_cnt = le32_to_cpu(trans->dbg.dest_tlv->wrap_count);
3123
+ base = le32_to_cpu(trans->dbg.dest_tlv->base_reg);
3124
+ } else {
3125
+ base = MON_BUFF_BASE_ADDR;
3126
+ write_ptr = MON_BUFF_WRPTR;
3127
+ wrap_cnt = MON_BUFF_CYCLE_CNT;
3128
+ }
3129
+
3130
+ write_ptr_val = iwl_read_prph(trans, write_ptr);
3131
+ fw_mon_data->fw_mon_cycle_cnt =
3132
+ cpu_to_le32(iwl_read_prph(trans, wrap_cnt));
3133
+ fw_mon_data->fw_mon_base_ptr =
3134
+ cpu_to_le32(iwl_read_prph(trans, base));
3135
+ if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
3136
+ fw_mon_data->fw_mon_base_high_ptr =
3137
+ cpu_to_le32(iwl_read_prph(trans, base_high));
3138
+ write_ptr_val &= DBGC_CUR_DBGBUF_STATUS_OFFSET_MSK;
3139
+ }
3140
+ fw_mon_data->fw_mon_wr_ptr = cpu_to_le32(write_ptr_val);
29003141 }
29013142
29023143 static u32
....@@ -2904,72 +3145,44 @@
29043145 struct iwl_fw_error_dump_data **data,
29053146 u32 monitor_len)
29063147 {
2907
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
3148
+ struct iwl_dram_data *fw_mon = &trans->dbg.fw_mon;
29083149 u32 len = 0;
29093150
2910
- if ((trans_pcie->fw_mon_page &&
2911
- trans->cfg->device_family == IWL_DEVICE_FAMILY_7000) ||
2912
- trans->dbg_dest_tlv) {
3151
+ if (trans->dbg.dest_tlv ||
3152
+ (fw_mon->size &&
3153
+ (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000 ||
3154
+ trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210))) {
29133155 struct iwl_fw_error_dump_fw_mon *fw_mon_data;
2914
- u32 base, write_ptr, wrap_cnt;
2915
-
2916
- /* If there was a dest TLV - use the values from there */
2917
- if (trans->dbg_dest_tlv) {
2918
- write_ptr =
2919
- le32_to_cpu(trans->dbg_dest_tlv->write_ptr_reg);
2920
- wrap_cnt = le32_to_cpu(trans->dbg_dest_tlv->wrap_count);
2921
- base = le32_to_cpu(trans->dbg_dest_tlv->base_reg);
2922
- } else {
2923
- base = MON_BUFF_BASE_ADDR;
2924
- write_ptr = MON_BUFF_WRPTR;
2925
- wrap_cnt = MON_BUFF_CYCLE_CNT;
2926
- }
29273156
29283157 (*data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_FW_MONITOR);
29293158 fw_mon_data = (void *)(*data)->data;
2930
- fw_mon_data->fw_mon_wr_ptr =
2931
- cpu_to_le32(iwl_read_prph(trans, write_ptr));
2932
- fw_mon_data->fw_mon_cycle_cnt =
2933
- cpu_to_le32(iwl_read_prph(trans, wrap_cnt));
2934
- fw_mon_data->fw_mon_base_ptr =
2935
- cpu_to_le32(iwl_read_prph(trans, base));
3159
+
3160
+ iwl_trans_pcie_dump_pointers(trans, fw_mon_data);
29363161
29373162 len += sizeof(**data) + sizeof(*fw_mon_data);
2938
- if (trans_pcie->fw_mon_page) {
2939
- /*
2940
- * The firmware is now asserted, it won't write anything
2941
- * to the buffer. CPU can take ownership to fetch the
2942
- * data. The buffer will be handed back to the device
2943
- * before the firmware will be restarted.
2944
- */
2945
- dma_sync_single_for_cpu(trans->dev,
2946
- trans_pcie->fw_mon_phys,
2947
- trans_pcie->fw_mon_size,
2948
- DMA_FROM_DEVICE);
2949
- memcpy(fw_mon_data->data,
2950
- page_address(trans_pcie->fw_mon_page),
2951
- trans_pcie->fw_mon_size);
2952
-
2953
- monitor_len = trans_pcie->fw_mon_size;
2954
- } else if (trans->dbg_dest_tlv->monitor_mode == SMEM_MODE) {
3163
+ if (fw_mon->size) {
3164
+ memcpy(fw_mon_data->data, fw_mon->block, fw_mon->size);
3165
+ monitor_len = fw_mon->size;
3166
+ } else if (trans->dbg.dest_tlv->monitor_mode == SMEM_MODE) {
3167
+ u32 base = le32_to_cpu(fw_mon_data->fw_mon_base_ptr);
29553168 /*
29563169 * Update pointers to reflect actual values after
29573170 * shifting
29583171 */
2959
- if (trans->dbg_dest_tlv->version) {
3172
+ if (trans->dbg.dest_tlv->version) {
29603173 base = (iwl_read_prph(trans, base) &
29613174 IWL_LDBG_M2S_BUF_BA_MSK) <<
2962
- trans->dbg_dest_tlv->base_shift;
3175
+ trans->dbg.dest_tlv->base_shift;
29633176 base *= IWL_M2S_UNIT_SIZE;
29643177 base += trans->cfg->smem_offset;
29653178 } else {
29663179 base = iwl_read_prph(trans, base) <<
2967
- trans->dbg_dest_tlv->base_shift;
3180
+ trans->dbg.dest_tlv->base_shift;
29683181 }
29693182
29703183 iwl_trans_read_mem(trans, base, fw_mon_data->data,
29713184 monitor_len / sizeof(u32));
2972
- } else if (trans->dbg_dest_tlv->monitor_mode == MARBH_MODE) {
3185
+ } else if (trans->dbg.dest_tlv->monitor_mode == MARBH_MODE) {
29733186 monitor_len =
29743187 iwl_trans_pci_dump_marbh_monitor(trans,
29753188 fw_mon_data,
....@@ -2986,97 +3199,93 @@
29863199 return len;
29873200 }
29883201
2989
-static struct iwl_trans_dump_data
2990
-*iwl_trans_pcie_dump_data(struct iwl_trans *trans,
2991
- const struct iwl_fw_dbg_trigger_tlv *trigger)
3202
+static int iwl_trans_get_fw_monitor_len(struct iwl_trans *trans, u32 *len)
29923203 {
2993
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
2994
- struct iwl_fw_error_dump_data *data;
2995
- struct iwl_txq *cmdq = trans_pcie->txq[trans_pcie->cmd_queue];
2996
- struct iwl_fw_error_dump_txcmd *txcmd;
2997
- struct iwl_trans_dump_data *dump_data;
2998
- u32 len, num_rbs = 0;
2999
- u32 monitor_len;
3000
- int i, ptr;
3001
- bool dump_rbs = test_bit(STATUS_FW_ERROR, &trans->status) &&
3002
- !trans->cfg->mq_rx_supported &&
3003
- trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_RB);
3204
+ if (trans->dbg.fw_mon.size) {
3205
+ *len += sizeof(struct iwl_fw_error_dump_data) +
3206
+ sizeof(struct iwl_fw_error_dump_fw_mon) +
3207
+ trans->dbg.fw_mon.size;
3208
+ return trans->dbg.fw_mon.size;
3209
+ } else if (trans->dbg.dest_tlv) {
3210
+ u32 base, end, cfg_reg, monitor_len;
30043211
3005
- /* transport dump header */
3006
- len = sizeof(*dump_data);
3007
-
3008
- /* host commands */
3009
- len += sizeof(*data) +
3010
- cmdq->n_window * (sizeof(*txcmd) + TFD_MAX_PAYLOAD_SIZE);
3011
-
3012
- /* FW monitor */
3013
- if (trans_pcie->fw_mon_page) {
3014
- len += sizeof(*data) + sizeof(struct iwl_fw_error_dump_fw_mon) +
3015
- trans_pcie->fw_mon_size;
3016
- monitor_len = trans_pcie->fw_mon_size;
3017
- } else if (trans->dbg_dest_tlv) {
3018
- u32 base, end, cfg_reg;
3019
-
3020
- if (trans->dbg_dest_tlv->version == 1) {
3021
- cfg_reg = le32_to_cpu(trans->dbg_dest_tlv->base_reg);
3212
+ if (trans->dbg.dest_tlv->version == 1) {
3213
+ cfg_reg = le32_to_cpu(trans->dbg.dest_tlv->base_reg);
30223214 cfg_reg = iwl_read_prph(trans, cfg_reg);
30233215 base = (cfg_reg & IWL_LDBG_M2S_BUF_BA_MSK) <<
3024
- trans->dbg_dest_tlv->base_shift;
3216
+ trans->dbg.dest_tlv->base_shift;
30253217 base *= IWL_M2S_UNIT_SIZE;
30263218 base += trans->cfg->smem_offset;
30273219
30283220 monitor_len =
30293221 (cfg_reg & IWL_LDBG_M2S_BUF_SIZE_MSK) >>
3030
- trans->dbg_dest_tlv->end_shift;
3222
+ trans->dbg.dest_tlv->end_shift;
30313223 monitor_len *= IWL_M2S_UNIT_SIZE;
30323224 } else {
3033
- base = le32_to_cpu(trans->dbg_dest_tlv->base_reg);
3034
- end = le32_to_cpu(trans->dbg_dest_tlv->end_reg);
3225
+ base = le32_to_cpu(trans->dbg.dest_tlv->base_reg);
3226
+ end = le32_to_cpu(trans->dbg.dest_tlv->end_reg);
30353227
30363228 base = iwl_read_prph(trans, base) <<
3037
- trans->dbg_dest_tlv->base_shift;
3229
+ trans->dbg.dest_tlv->base_shift;
30383230 end = iwl_read_prph(trans, end) <<
3039
- trans->dbg_dest_tlv->end_shift;
3231
+ trans->dbg.dest_tlv->end_shift;
30403232
30413233 /* Make "end" point to the actual end */
3042
- if (trans->cfg->device_family >=
3234
+ if (trans->trans_cfg->device_family >=
30433235 IWL_DEVICE_FAMILY_8000 ||
3044
- trans->dbg_dest_tlv->monitor_mode == MARBH_MODE)
3045
- end += (1 << trans->dbg_dest_tlv->end_shift);
3236
+ trans->dbg.dest_tlv->monitor_mode == MARBH_MODE)
3237
+ end += (1 << trans->dbg.dest_tlv->end_shift);
30463238 monitor_len = end - base;
30473239 }
3048
- len += sizeof(*data) + sizeof(struct iwl_fw_error_dump_fw_mon) +
3049
- monitor_len;
3050
- } else {
3051
- monitor_len = 0;
3240
+ *len += sizeof(struct iwl_fw_error_dump_data) +
3241
+ sizeof(struct iwl_fw_error_dump_fw_mon) +
3242
+ monitor_len;
3243
+ return monitor_len;
30523244 }
3245
+ return 0;
3246
+}
30533247
3054
- if (trigger && (trigger->mode & IWL_FW_DBG_TRIGGER_MONITOR_ONLY)) {
3055
- if (!(trans->dbg_dump_mask &
3056
- BIT(IWL_FW_ERROR_DUMP_FW_MONITOR)))
3057
- return NULL;
3248
+static struct iwl_trans_dump_data
3249
+*iwl_trans_pcie_dump_data(struct iwl_trans *trans,
3250
+ u32 dump_mask)
3251
+{
3252
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
3253
+ struct iwl_fw_error_dump_data *data;
3254
+ struct iwl_txq *cmdq = trans->txqs.txq[trans->txqs.cmd.q_id];
3255
+ struct iwl_fw_error_dump_txcmd *txcmd;
3256
+ struct iwl_trans_dump_data *dump_data;
3257
+ u32 len, num_rbs = 0, monitor_len = 0;
3258
+ int i, ptr;
3259
+ bool dump_rbs = test_bit(STATUS_FW_ERROR, &trans->status) &&
3260
+ !trans->trans_cfg->mq_rx_supported &&
3261
+ dump_mask & BIT(IWL_FW_ERROR_DUMP_RB);
30583262
3059
- dump_data = vzalloc(len);
3060
- if (!dump_data)
3061
- return NULL;
3263
+ if (!dump_mask)
3264
+ return NULL;
30623265
3063
- data = (void *)dump_data->data;
3064
- len = iwl_trans_pcie_dump_monitor(trans, &data, monitor_len);
3065
- dump_data->len = len;
3266
+ /* transport dump header */
3267
+ len = sizeof(*dump_data);
30663268
3067
- return dump_data;
3068
- }
3269
+ /* host commands */
3270
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_TXCMD) && cmdq)
3271
+ len += sizeof(*data) +
3272
+ cmdq->n_window * (sizeof(*txcmd) +
3273
+ TFD_MAX_PAYLOAD_SIZE);
3274
+
3275
+ /* FW monitor */
3276
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_FW_MONITOR))
3277
+ monitor_len = iwl_trans_get_fw_monitor_len(trans, &len);
30693278
30703279 /* CSR registers */
3071
- if (trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_CSR))
3280
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_CSR))
30723281 len += sizeof(*data) + IWL_CSR_TO_DUMP;
30733282
30743283 /* FH registers */
3075
- if (trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_FH_REGS)) {
3076
- if (trans->cfg->gen2)
3284
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_FH_REGS)) {
3285
+ if (trans->trans_cfg->gen2)
30773286 len += sizeof(*data) +
3078
- (FH_MEM_UPPER_BOUND_GEN2 -
3079
- FH_MEM_LOWER_BOUND_GEN2);
3287
+ (iwl_umac_prph(trans, FH_MEM_UPPER_BOUND_GEN2) -
3288
+ iwl_umac_prph(trans, FH_MEM_LOWER_BOUND_GEN2));
30803289 else
30813290 len += sizeof(*data) +
30823291 (FH_MEM_UPPER_BOUND -
....@@ -3097,12 +3306,11 @@
30973306 }
30983307
30993308 /* Paged memory for gen2 HW */
3100
- if (trans->cfg->gen2 &&
3101
- trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_PAGING))
3102
- for (i = 0; i < trans_pcie->init_dram.paging_cnt; i++)
3309
+ if (trans->trans_cfg->gen2 && dump_mask & BIT(IWL_FW_ERROR_DUMP_PAGING))
3310
+ for (i = 0; i < trans->init_dram.paging_cnt; i++)
31033311 len += sizeof(*data) +
31043312 sizeof(struct iwl_fw_error_dump_paging) +
3105
- trans_pcie->init_dram.paging[i].size;
3313
+ trans->init_dram.paging[i].size;
31063314
31073315 dump_data = vzalloc(len);
31083316 if (!dump_data)
....@@ -3111,20 +3319,26 @@
31113319 len = 0;
31123320 data = (void *)dump_data->data;
31133321
3114
- if (trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_TXCMD)) {
3115
- u16 tfd_size = trans_pcie->tfd_size;
3322
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_TXCMD) && cmdq) {
3323
+ u16 tfd_size = trans->txqs.tfd.size;
31163324
31173325 data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_TXCMD);
31183326 txcmd = (void *)data->data;
31193327 spin_lock_bh(&cmdq->lock);
31203328 ptr = cmdq->write_ptr;
31213329 for (i = 0; i < cmdq->n_window; i++) {
3122
- u8 idx = iwl_pcie_get_cmd_index(cmdq, ptr);
3330
+ u8 idx = iwl_txq_get_cmd_index(cmdq, ptr);
3331
+ u8 tfdidx;
31233332 u32 caplen, cmdlen;
31243333
3334
+ if (trans->trans_cfg->use_tfh)
3335
+ tfdidx = idx;
3336
+ else
3337
+ tfdidx = ptr;
3338
+
31253339 cmdlen = iwl_trans_pcie_get_cmdlen(trans,
3126
- cmdq->tfds +
3127
- tfd_size * ptr);
3340
+ (u8 *)cmdq->tfds +
3341
+ tfd_size * tfdidx);
31283342 caplen = min_t(u32, TFD_MAX_PAYLOAD_SIZE, cmdlen);
31293343
31303344 if (cmdlen) {
....@@ -3136,7 +3350,7 @@
31363350 txcmd = (void *)((u8 *)txcmd->data + caplen);
31373351 }
31383352
3139
- ptr = iwl_queue_dec_wrap(trans, ptr);
3353
+ ptr = iwl_txq_dec_wrap(trans, ptr);
31403354 }
31413355 spin_unlock_bh(&cmdq->lock);
31423356
....@@ -3145,36 +3359,32 @@
31453359 data = iwl_fw_error_next_data(data);
31463360 }
31473361
3148
- if (trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_CSR))
3362
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_CSR))
31493363 len += iwl_trans_pcie_dump_csr(trans, &data);
3150
- if (trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_FH_REGS))
3364
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_FH_REGS))
31513365 len += iwl_trans_pcie_fh_regs_dump(trans, &data);
31523366 if (dump_rbs)
31533367 len += iwl_trans_pcie_dump_rbs(trans, &data, num_rbs);
31543368
31553369 /* Paged memory for gen2 HW */
3156
- if (trans->cfg->gen2 &&
3157
- trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_PAGING)) {
3158
- for (i = 0; i < trans_pcie->init_dram.paging_cnt; i++) {
3370
+ if (trans->trans_cfg->gen2 &&
3371
+ dump_mask & BIT(IWL_FW_ERROR_DUMP_PAGING)) {
3372
+ for (i = 0; i < trans->init_dram.paging_cnt; i++) {
31593373 struct iwl_fw_error_dump_paging *paging;
3160
- dma_addr_t addr =
3161
- trans_pcie->init_dram.paging[i].physical;
3162
- u32 page_len = trans_pcie->init_dram.paging[i].size;
3374
+ u32 page_len = trans->init_dram.paging[i].size;
31633375
31643376 data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_PAGING);
31653377 data->len = cpu_to_le32(sizeof(*paging) + page_len);
31663378 paging = (void *)data->data;
31673379 paging->index = cpu_to_le32(i);
3168
- dma_sync_single_for_cpu(trans->dev, addr, page_len,
3169
- DMA_BIDIRECTIONAL);
31703380 memcpy(paging->data,
3171
- trans_pcie->init_dram.paging[i].block, page_len);
3381
+ trans->init_dram.paging[i].block, page_len);
31723382 data = iwl_fw_error_next_data(data);
31733383
31743384 len += sizeof(*data) + sizeof(*paging) + page_len;
31753385 }
31763386 }
3177
- if (trans->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_FW_MONITOR))
3387
+ if (dump_mask & BIT(IWL_FW_ERROR_DUMP_FW_MONITOR))
31783388 len += iwl_trans_pcie_dump_monitor(trans, &data, monitor_len);
31793389
31803390 dump_data->len = len;
....@@ -3185,18 +3395,11 @@
31853395 #ifdef CONFIG_PM_SLEEP
31863396 static int iwl_trans_pcie_suspend(struct iwl_trans *trans)
31873397 {
3188
- if (trans->runtime_pm_mode == IWL_PLAT_PM_MODE_D0I3 &&
3189
- (trans->system_pm_mode == IWL_PLAT_PM_MODE_D0I3))
3190
- return iwl_pci_fw_enter_d0i3(trans);
3191
-
31923398 return 0;
31933399 }
31943400
31953401 static void iwl_trans_pcie_resume(struct iwl_trans *trans)
31963402 {
3197
- if (trans->runtime_pm_mode == IWL_PLAT_PM_MODE_D0I3 &&
3198
- (trans->system_pm_mode == IWL_PLAT_PM_MODE_D0I3))
3199
- iwl_pci_fw_exit_d0i3(trans);
32003403 }
32013404 #endif /* CONFIG_PM_SLEEP */
32023405
....@@ -3209,18 +3412,17 @@
32093412 .write_prph = iwl_trans_pcie_write_prph, \
32103413 .read_mem = iwl_trans_pcie_read_mem, \
32113414 .write_mem = iwl_trans_pcie_write_mem, \
3415
+ .read_config32 = iwl_trans_pcie_read_config32, \
32123416 .configure = iwl_trans_pcie_configure, \
32133417 .set_pmi = iwl_trans_pcie_set_pmi, \
32143418 .sw_reset = iwl_trans_pcie_sw_reset, \
32153419 .grab_nic_access = iwl_trans_pcie_grab_nic_access, \
32163420 .release_nic_access = iwl_trans_pcie_release_nic_access, \
32173421 .set_bits_mask = iwl_trans_pcie_set_bits_mask, \
3218
- .ref = iwl_trans_pcie_ref, \
3219
- .unref = iwl_trans_pcie_unref, \
32203422 .dump_data = iwl_trans_pcie_dump_data, \
3221
- .dump_regs = iwl_trans_pcie_dump_regs, \
32223423 .d3_suspend = iwl_trans_pcie_d3_suspend, \
3223
- .d3_resume = iwl_trans_pcie_d3_resume
3424
+ .d3_resume = iwl_trans_pcie_d3_resume, \
3425
+ .sync_nmi = iwl_trans_pcie_sync_nmi
32243426
32253427 #ifdef CONFIG_PM_SLEEP
32263428 #define IWL_TRANS_PM_OPS \
....@@ -3252,6 +3454,9 @@
32523454
32533455 .freeze_txq_timer = iwl_trans_pcie_freeze_txq_timer,
32543456 .block_txq_ptrs = iwl_trans_pcie_block_txq_ptrs,
3457
+#ifdef CONFIG_IWLWIFI_DEBUGFS
3458
+ .debugfs_cleanup = iwl_trans_pcie_debugfs_cleanup,
3459
+#endif
32553460 };
32563461
32573462 static const struct iwl_trans_ops trans_ops_pcie_gen2 = {
....@@ -3264,33 +3469,39 @@
32643469
32653470 .send_cmd = iwl_trans_pcie_gen2_send_hcmd,
32663471
3267
- .tx = iwl_trans_pcie_gen2_tx,
3472
+ .tx = iwl_txq_gen2_tx,
32683473 .reclaim = iwl_trans_pcie_reclaim,
32693474
3270
- .txq_alloc = iwl_trans_pcie_dyn_txq_alloc,
3271
- .txq_free = iwl_trans_pcie_dyn_txq_free,
3475
+ .set_q_ptrs = iwl_trans_pcie_set_q_ptrs,
3476
+
3477
+ .txq_alloc = iwl_txq_dyn_alloc,
3478
+ .txq_free = iwl_txq_dyn_free,
32723479 .wait_txq_empty = iwl_trans_pcie_wait_txq_empty,
32733480 .rxq_dma_data = iwl_trans_pcie_rxq_dma_data,
3481
+ .set_pnvm = iwl_trans_pcie_ctx_info_gen3_set_pnvm,
3482
+#ifdef CONFIG_IWLWIFI_DEBUGFS
3483
+ .debugfs_cleanup = iwl_trans_pcie_debugfs_cleanup,
3484
+#endif
32743485 };
32753486
32763487 struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
3277
- const struct pci_device_id *ent,
3278
- const struct iwl_cfg *cfg)
3488
+ const struct pci_device_id *ent,
3489
+ const struct iwl_cfg_trans_params *cfg_trans)
32793490 {
32803491 struct iwl_trans_pcie *trans_pcie;
32813492 struct iwl_trans *trans;
32823493 int ret, addr_size;
3494
+ const struct iwl_trans_ops *ops = &trans_ops_pcie_gen2;
3495
+
3496
+ if (!cfg_trans->gen2)
3497
+ ops = &trans_ops_pcie;
32833498
32843499 ret = pcim_enable_device(pdev);
32853500 if (ret)
32863501 return ERR_PTR(ret);
32873502
3288
- if (cfg->gen2)
3289
- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie),
3290
- &pdev->dev, cfg, &trans_ops_pcie_gen2);
3291
- else
3292
- trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie),
3293
- &pdev->dev, cfg, &trans_ops_pcie);
3503
+ trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), &pdev->dev, ops,
3504
+ cfg_trans);
32943505 if (!trans)
32953506 return ERR_PTR(-ENOMEM);
32963507
....@@ -3300,6 +3511,7 @@
33003511 trans_pcie->opmode_down = true;
33013512 spin_lock_init(&trans_pcie->irq_lock);
33023513 spin_lock_init(&trans_pcie->reg_lock);
3514
+ spin_lock_init(&trans_pcie->alloc_page_lock);
33033515 mutex_init(&trans_pcie->mutex);
33043516 init_waitqueue_head(&trans_pcie->ucode_write_waitq);
33053517
....@@ -3311,14 +3523,9 @@
33113523 }
33123524 INIT_WORK(&trans_pcie->rba.rx_alloc, iwl_pcie_rx_allocator_work);
33133525
3314
- trans_pcie->tso_hdr_page = alloc_percpu(struct iwl_tso_hdr_page);
3315
- if (!trans_pcie->tso_hdr_page) {
3316
- ret = -ENOMEM;
3317
- goto out_no_pci;
3318
- }
3526
+ trans_pcie->debug_rfkill = -1;
33193527
3320
-
3321
- if (!cfg->base_params->pcie_l1_allowed) {
3528
+ if (!cfg_trans->base_params->pcie_l1_allowed) {
33223529 /*
33233530 * W/A - seems to solve weird behavior. We need to remove this
33243531 * if we don't want to stay in L1 all the time. This wastes a
....@@ -3329,19 +3536,11 @@
33293536 PCIE_LINK_STATE_CLKPM);
33303537 }
33313538
3332
- if (cfg->use_tfh) {
3333
- addr_size = 64;
3334
- trans_pcie->max_tbs = IWL_TFH_NUM_TBS;
3335
- trans_pcie->tfd_size = sizeof(struct iwl_tfh_tfd);
3336
- } else {
3337
- addr_size = 36;
3338
- trans_pcie->max_tbs = IWL_NUM_OF_TBS;
3339
- trans_pcie->tfd_size = sizeof(struct iwl_tfd);
3340
- }
3341
- trans->max_skb_frags = IWL_PCIE_MAX_FRAGS(trans_pcie);
3539
+ trans_pcie->def_rx_queue = 0;
33423540
33433541 pci_set_master(pdev);
33443542
3543
+ addr_size = trans->txqs.tfd.addr_size;
33453544 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(addr_size));
33463545 if (!ret)
33473546 ret = pci_set_consistent_dma_mask(pdev,
....@@ -3379,15 +3578,19 @@
33793578 iwl_disable_interrupts(trans);
33803579
33813580 trans->hw_rev = iwl_read32(trans, CSR_HW_REV);
3581
+ if (trans->hw_rev == 0xffffffff) {
3582
+ dev_err(&pdev->dev, "HW_REV=0xFFFFFFFF, PCI issues?\n");
3583
+ ret = -EIO;
3584
+ goto out_no_pci;
3585
+ }
3586
+
33823587 /*
33833588 * In the 8000 HW family the format of the 4 bytes of CSR_HW_REV have
33843589 * changed, and now the revision step also includes bit 0-1 (no more
33853590 * "dash" value). To keep hw_rev backwards compatible - we'll store it
33863591 * in the old format.
33873592 */
3388
- if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000) {
3389
- unsigned long flags;
3390
-
3593
+ if (cfg_trans->device_family >= IWL_DEVICE_FAMILY_8000) {
33913594 trans->hw_rev = (trans->hw_rev & 0xfff0) |
33923595 (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2);
33933596
....@@ -3401,89 +3604,15 @@
34013604 * in-order to recognize C step driver should read chip version
34023605 * id located at the AUX bus MISC address space.
34033606 */
3404
- iwl_set_bit(trans, CSR_GP_CNTRL,
3405
- BIT(trans->cfg->csr->flag_init_done));
3406
- udelay(2);
3407
-
3408
- ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
3409
- BIT(trans->cfg->csr->flag_mac_clock_ready),
3410
- BIT(trans->cfg->csr->flag_mac_clock_ready),
3411
- 25000);
3412
- if (ret < 0) {
3413
- IWL_DEBUG_INFO(trans, "Failed to wake up the nic\n");
3607
+ ret = iwl_finish_nic_init(trans, cfg_trans);
3608
+ if (ret)
34143609 goto out_no_pci;
3415
- }
34163610
3417
- if (iwl_trans_grab_nic_access(trans, &flags)) {
3418
- u32 hw_step;
3419
-
3420
- hw_step = iwl_read_prph_no_grab(trans, WFPM_CTRL_REG);
3421
- hw_step |= ENABLE_WFPM;
3422
- iwl_write_prph_no_grab(trans, WFPM_CTRL_REG, hw_step);
3423
- hw_step = iwl_read_prph_no_grab(trans, AUX_MISC_REG);
3424
- hw_step = (hw_step >> HW_STEP_LOCATION_BITS) & 0xF;
3425
- if (hw_step == 0x3)
3426
- trans->hw_rev = (trans->hw_rev & 0xFFFFFFF3) |
3427
- (SILICON_C_STEP << 2);
3428
- iwl_trans_release_nic_access(trans, &flags);
3429
- }
34303611 }
34313612
3432
- /*
3433
- * 9000-series integrated A-step has a problem with suspend/resume
3434
- * and sometimes even causes the whole platform to get stuck. This
3435
- * workaround makes the hardware not go into the problematic state.
3436
- */
3437
- if (trans->cfg->integrated &&
3438
- trans->cfg->device_family == IWL_DEVICE_FAMILY_9000 &&
3439
- CSR_HW_REV_STEP(trans->hw_rev) == SILICON_A_STEP)
3440
- iwl_set_bit(trans, CSR_HOST_CHICKEN,
3441
- CSR_HOST_CHICKEN_PM_IDLE_SRC_DIS_SB_PME);
3613
+ IWL_DEBUG_INFO(trans, "HW REV: 0x%0x\n", trans->hw_rev);
34423614
3443
-#if IS_ENABLED(CONFIG_IWLMVM)
3444
- trans->hw_rf_id = iwl_read32(trans, CSR_HW_RF_ID);
3445
-
3446
- if (cfg == &iwl22000_2ax_cfg_hr) {
3447
- if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
3448
- CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) {
3449
- trans->cfg = &iwl22000_2ax_cfg_hr;
3450
- } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
3451
- CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_JF)) {
3452
- trans->cfg = &iwl22000_2ax_cfg_jf;
3453
- } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
3454
- CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HRCDB)) {
3455
- IWL_ERR(trans, "RF ID HRCDB is not supported\n");
3456
- ret = -EINVAL;
3457
- goto out_no_pci;
3458
- } else {
3459
- IWL_ERR(trans, "Unrecognized RF ID 0x%08x\n",
3460
- CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id));
3461
- ret = -EINVAL;
3462
- goto out_no_pci;
3463
- }
3464
- } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
3465
- CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) {
3466
- u32 hw_status;
3467
-
3468
- hw_status = iwl_read_prph(trans, UMAG_GEN_HW_STATUS);
3469
- if (CSR_HW_RF_STEP(trans->hw_rf_id) == SILICON_B_STEP)
3470
- /*
3471
- * b step fw is the same for physical card and fpga
3472
- */
3473
- trans->cfg = &iwl22000_2ax_cfg_qnj_hr_b0;
3474
- else if ((hw_status & UMAG_GEN_HW_IS_FPGA) &&
3475
- CSR_HW_RF_STEP(trans->hw_rf_id) == SILICON_A_STEP) {
3476
- trans->cfg = &iwl22000_2ax_cfg_qnj_hr_a0_f0;
3477
- } else {
3478
- /*
3479
- * a step no FPGA
3480
- */
3481
- trans->cfg = &iwl22000_2ac_cfg_hr;
3482
- }
3483
- }
3484
-#endif
3485
-
3486
- iwl_pcie_set_interrupt_capa(pdev, trans);
3615
+ iwl_pcie_set_interrupt_capa(pdev, trans, cfg_trans);
34873616 trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
34883617 snprintf(trans->hw_id_str, sizeof(trans->hw_id_str),
34893618 "PCI ID: 0x%04X:0x%04X", pdev->device, pdev->subsystem_device);
....@@ -3491,7 +3620,8 @@
34913620 /* Initialize the wait queue for commands */
34923621 init_waitqueue_head(&trans_pcie->wait_command_queue);
34933622
3494
- init_waitqueue_head(&trans_pcie->d0i3_waitq);
3623
+ init_waitqueue_head(&trans_pcie->sx_waitq);
3624
+
34953625
34963626 if (trans_pcie->msix_enabled) {
34973627 ret = iwl_pcie_init_msix_handler(pdev, trans_pcie);
....@@ -3513,20 +3643,65 @@
35133643 trans_pcie->inta_mask = CSR_INI_SET_MASK;
35143644 }
35153645
3516
-#ifdef CONFIG_IWLWIFI_PCIE_RTPM
3517
- trans->runtime_pm_mode = IWL_PLAT_PM_MODE_D0I3;
3518
-#else
3519
- trans->runtime_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
3520
-#endif /* CONFIG_IWLWIFI_PCIE_RTPM */
3646
+#ifdef CONFIG_IWLWIFI_DEBUGFS
3647
+ trans_pcie->fw_mon_data.state = IWL_FW_MON_DBGFS_STATE_CLOSED;
3648
+ mutex_init(&trans_pcie->fw_mon_data.mutex);
3649
+#endif
3650
+
3651
+ iwl_dbg_tlv_init(trans);
35213652
35223653 return trans;
35233654
35243655 out_free_ict:
35253656 iwl_pcie_free_ict(trans);
35263657 out_no_pci:
3527
- free_percpu(trans_pcie->tso_hdr_page);
35283658 destroy_workqueue(trans_pcie->rba.alloc_wq);
35293659 out_free_trans:
35303660 iwl_trans_free(trans);
35313661 return ERR_PTR(ret);
35323662 }
3663
+
3664
+void iwl_trans_pcie_sync_nmi(struct iwl_trans *trans)
3665
+{
3666
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
3667
+ unsigned long timeout = jiffies + IWL_TRANS_NMI_TIMEOUT;
3668
+ bool interrupts_enabled = test_bit(STATUS_INT_ENABLED, &trans->status);
3669
+ u32 inta_addr, sw_err_bit;
3670
+
3671
+ if (trans_pcie->msix_enabled) {
3672
+ inta_addr = CSR_MSIX_HW_INT_CAUSES_AD;
3673
+ sw_err_bit = MSIX_HW_INT_CAUSES_REG_SW_ERR;
3674
+ } else {
3675
+ inta_addr = CSR_INT;
3676
+ sw_err_bit = CSR_INT_BIT_SW_ERR;
3677
+ }
3678
+
3679
+ /* if the interrupts were already disabled, there is no point in
3680
+ * calling iwl_disable_interrupts
3681
+ */
3682
+ if (interrupts_enabled)
3683
+ iwl_disable_interrupts(trans);
3684
+
3685
+ iwl_force_nmi(trans);
3686
+ while (time_after(timeout, jiffies)) {
3687
+ u32 inta_hw = iwl_read32(trans, inta_addr);
3688
+
3689
+ /* Error detected by uCode */
3690
+ if (inta_hw & sw_err_bit) {
3691
+ /* Clear causes register */
3692
+ iwl_write32(trans, inta_addr, inta_hw & sw_err_bit);
3693
+ break;
3694
+ }
3695
+
3696
+ mdelay(1);
3697
+ }
3698
+
3699
+ /* enable interrupts only if there were already enabled before this
3700
+ * function to avoid a case were the driver enable interrupts before
3701
+ * proper configurations were made
3702
+ */
3703
+ if (interrupts_enabled)
3704
+ iwl_enable_interrupts(trans);
3705
+
3706
+ iwl_trans_fw_error(trans);
3707
+}