|
@@ -1505,6 +1505,136 @@ static int iwl_trans_pcie_check_stuck_queue(struct iwl_trans *trans, int cnt)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static const char *get_fh_string(int cmd)
|
|
|
|
+{
|
|
|
|
+ switch (cmd) {
|
|
|
|
+ IWL_CMD(FH_RSCSR_CHNL0_STTS_WPTR_REG);
|
|
|
|
+ IWL_CMD(FH_RSCSR_CHNL0_RBDCB_BASE_REG);
|
|
|
|
+ IWL_CMD(FH_RSCSR_CHNL0_WPTR);
|
|
|
|
+ IWL_CMD(FH_MEM_RCSR_CHNL0_CONFIG_REG);
|
|
|
|
+ IWL_CMD(FH_MEM_RSSR_SHARED_CTRL_REG);
|
|
|
|
+ IWL_CMD(FH_MEM_RSSR_RX_STATUS_REG);
|
|
|
|
+ IWL_CMD(FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV);
|
|
|
|
+ IWL_CMD(FH_TSSR_TX_STATUS_REG);
|
|
|
|
+ IWL_CMD(FH_TSSR_TX_ERROR_REG);
|
|
|
|
+ default:
|
|
|
|
+ return "UNKNOWN";
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
|
|
|
+ int pos = 0;
|
|
|
|
+ size_t bufsz = 0;
|
|
|
|
+#endif
|
|
|
|
+ static const u32 fh_tbl[] = {
|
|
|
|
+ FH_RSCSR_CHNL0_STTS_WPTR_REG,
|
|
|
|
+ FH_RSCSR_CHNL0_RBDCB_BASE_REG,
|
|
|
|
+ FH_RSCSR_CHNL0_WPTR,
|
|
|
|
+ FH_MEM_RCSR_CHNL0_CONFIG_REG,
|
|
|
|
+ FH_MEM_RSSR_SHARED_CTRL_REG,
|
|
|
|
+ FH_MEM_RSSR_RX_STATUS_REG,
|
|
|
|
+ FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV,
|
|
|
|
+ FH_TSSR_TX_STATUS_REG,
|
|
|
|
+ FH_TSSR_TX_ERROR_REG
|
|
|
|
+ };
|
|
|
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
|
|
|
+ if (display) {
|
|
|
|
+ bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40;
|
|
|
|
+ *buf = kmalloc(bufsz, GFP_KERNEL);
|
|
|
|
+ if (!*buf)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+ pos += scnprintf(*buf + pos, bufsz - pos,
|
|
|
|
+ "FH register values:\n");
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) {
|
|
|
|
+ pos += scnprintf(*buf + pos, bufsz - pos,
|
|
|
|
+ " %34s: 0X%08x\n",
|
|
|
|
+ get_fh_string(fh_tbl[i]),
|
|
|
|
+ iwl_read_direct32(bus(trans), fh_tbl[i]));
|
|
|
|
+ }
|
|
|
|
+ return pos;
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+ IWL_ERR(trans, "FH register values:\n");
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) {
|
|
|
|
+ IWL_ERR(trans, " %34s: 0X%08x\n",
|
|
|
|
+ get_fh_string(fh_tbl[i]),
|
|
|
|
+ iwl_read_direct32(bus(trans), fh_tbl[i]));
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const char *get_csr_string(int cmd)
|
|
|
|
+{
|
|
|
|
+ switch (cmd) {
|
|
|
|
+ IWL_CMD(CSR_HW_IF_CONFIG_REG);
|
|
|
|
+ IWL_CMD(CSR_INT_COALESCING);
|
|
|
|
+ IWL_CMD(CSR_INT);
|
|
|
|
+ IWL_CMD(CSR_INT_MASK);
|
|
|
|
+ IWL_CMD(CSR_FH_INT_STATUS);
|
|
|
|
+ IWL_CMD(CSR_GPIO_IN);
|
|
|
|
+ IWL_CMD(CSR_RESET);
|
|
|
|
+ IWL_CMD(CSR_GP_CNTRL);
|
|
|
|
+ IWL_CMD(CSR_HW_REV);
|
|
|
|
+ IWL_CMD(CSR_EEPROM_REG);
|
|
|
|
+ IWL_CMD(CSR_EEPROM_GP);
|
|
|
|
+ IWL_CMD(CSR_OTP_GP_REG);
|
|
|
|
+ IWL_CMD(CSR_GIO_REG);
|
|
|
|
+ IWL_CMD(CSR_GP_UCODE_REG);
|
|
|
|
+ IWL_CMD(CSR_GP_DRIVER_REG);
|
|
|
|
+ IWL_CMD(CSR_UCODE_DRV_GP1);
|
|
|
|
+ IWL_CMD(CSR_UCODE_DRV_GP2);
|
|
|
|
+ IWL_CMD(CSR_LED_REG);
|
|
|
|
+ IWL_CMD(CSR_DRAM_INT_TBL_REG);
|
|
|
|
+ IWL_CMD(CSR_GIO_CHICKEN_BITS);
|
|
|
|
+ IWL_CMD(CSR_ANA_PLL_CFG);
|
|
|
|
+ IWL_CMD(CSR_HW_REV_WA_REG);
|
|
|
|
+ IWL_CMD(CSR_DBG_HPET_MEM_REG);
|
|
|
|
+ default:
|
|
|
|
+ return "UNKNOWN";
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void iwl_dump_csr(struct iwl_trans *trans)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+ static const u32 csr_tbl[] = {
|
|
|
|
+ CSR_HW_IF_CONFIG_REG,
|
|
|
|
+ CSR_INT_COALESCING,
|
|
|
|
+ CSR_INT,
|
|
|
|
+ CSR_INT_MASK,
|
|
|
|
+ CSR_FH_INT_STATUS,
|
|
|
|
+ CSR_GPIO_IN,
|
|
|
|
+ CSR_RESET,
|
|
|
|
+ CSR_GP_CNTRL,
|
|
|
|
+ CSR_HW_REV,
|
|
|
|
+ CSR_EEPROM_REG,
|
|
|
|
+ CSR_EEPROM_GP,
|
|
|
|
+ CSR_OTP_GP_REG,
|
|
|
|
+ CSR_GIO_REG,
|
|
|
|
+ CSR_GP_UCODE_REG,
|
|
|
|
+ CSR_GP_DRIVER_REG,
|
|
|
|
+ CSR_UCODE_DRV_GP1,
|
|
|
|
+ CSR_UCODE_DRV_GP2,
|
|
|
|
+ CSR_LED_REG,
|
|
|
|
+ CSR_DRAM_INT_TBL_REG,
|
|
|
|
+ CSR_GIO_CHICKEN_BITS,
|
|
|
|
+ CSR_ANA_PLL_CFG,
|
|
|
|
+ CSR_HW_REV_WA_REG,
|
|
|
|
+ CSR_DBG_HPET_MEM_REG
|
|
|
|
+ };
|
|
|
|
+ IWL_ERR(trans, "CSR values:\n");
|
|
|
|
+ IWL_ERR(trans, "(2nd byte of CSR_INT_COALESCING is "
|
|
|
|
+ "CSR_INT_PERIODIC_REG)\n");
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(csr_tbl); i++) {
|
|
|
|
+ IWL_ERR(trans, " %25s: 0X%08x\n",
|
|
|
|
+ get_csr_string(csr_tbl[i]),
|
|
|
|
+ iwl_read32(bus(trans), csr_tbl[i]));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
|
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
|
/* create and remove of files */
|
|
/* create and remove of files */
|
|
#define DEBUGFS_ADD_FILE(name, parent, mode) do { \
|
|
#define DEBUGFS_ADD_FILE(name, parent, mode) do { \
|
|
@@ -1752,75 +1882,6 @@ static ssize_t iwl_dbgfs_interrupt_write(struct file *file,
|
|
return count;
|
|
return count;
|
|
}
|
|
}
|
|
|
|
|
|
-static const char *get_csr_string(int cmd)
|
|
|
|
-{
|
|
|
|
- switch (cmd) {
|
|
|
|
- IWL_CMD(CSR_HW_IF_CONFIG_REG);
|
|
|
|
- IWL_CMD(CSR_INT_COALESCING);
|
|
|
|
- IWL_CMD(CSR_INT);
|
|
|
|
- IWL_CMD(CSR_INT_MASK);
|
|
|
|
- IWL_CMD(CSR_FH_INT_STATUS);
|
|
|
|
- IWL_CMD(CSR_GPIO_IN);
|
|
|
|
- IWL_CMD(CSR_RESET);
|
|
|
|
- IWL_CMD(CSR_GP_CNTRL);
|
|
|
|
- IWL_CMD(CSR_HW_REV);
|
|
|
|
- IWL_CMD(CSR_EEPROM_REG);
|
|
|
|
- IWL_CMD(CSR_EEPROM_GP);
|
|
|
|
- IWL_CMD(CSR_OTP_GP_REG);
|
|
|
|
- IWL_CMD(CSR_GIO_REG);
|
|
|
|
- IWL_CMD(CSR_GP_UCODE_REG);
|
|
|
|
- IWL_CMD(CSR_GP_DRIVER_REG);
|
|
|
|
- IWL_CMD(CSR_UCODE_DRV_GP1);
|
|
|
|
- IWL_CMD(CSR_UCODE_DRV_GP2);
|
|
|
|
- IWL_CMD(CSR_LED_REG);
|
|
|
|
- IWL_CMD(CSR_DRAM_INT_TBL_REG);
|
|
|
|
- IWL_CMD(CSR_GIO_CHICKEN_BITS);
|
|
|
|
- IWL_CMD(CSR_ANA_PLL_CFG);
|
|
|
|
- IWL_CMD(CSR_HW_REV_WA_REG);
|
|
|
|
- IWL_CMD(CSR_DBG_HPET_MEM_REG);
|
|
|
|
- default:
|
|
|
|
- return "UNKNOWN";
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void iwl_dump_csr(struct iwl_trans *trans)
|
|
|
|
-{
|
|
|
|
- int i;
|
|
|
|
- static const u32 csr_tbl[] = {
|
|
|
|
- CSR_HW_IF_CONFIG_REG,
|
|
|
|
- CSR_INT_COALESCING,
|
|
|
|
- CSR_INT,
|
|
|
|
- CSR_INT_MASK,
|
|
|
|
- CSR_FH_INT_STATUS,
|
|
|
|
- CSR_GPIO_IN,
|
|
|
|
- CSR_RESET,
|
|
|
|
- CSR_GP_CNTRL,
|
|
|
|
- CSR_HW_REV,
|
|
|
|
- CSR_EEPROM_REG,
|
|
|
|
- CSR_EEPROM_GP,
|
|
|
|
- CSR_OTP_GP_REG,
|
|
|
|
- CSR_GIO_REG,
|
|
|
|
- CSR_GP_UCODE_REG,
|
|
|
|
- CSR_GP_DRIVER_REG,
|
|
|
|
- CSR_UCODE_DRV_GP1,
|
|
|
|
- CSR_UCODE_DRV_GP2,
|
|
|
|
- CSR_LED_REG,
|
|
|
|
- CSR_DRAM_INT_TBL_REG,
|
|
|
|
- CSR_GIO_CHICKEN_BITS,
|
|
|
|
- CSR_ANA_PLL_CFG,
|
|
|
|
- CSR_HW_REV_WA_REG,
|
|
|
|
- CSR_DBG_HPET_MEM_REG
|
|
|
|
- };
|
|
|
|
- IWL_ERR(trans, "CSR values:\n");
|
|
|
|
- IWL_ERR(trans, "(2nd byte of CSR_INT_COALESCING is "
|
|
|
|
- "CSR_INT_PERIODIC_REG)\n");
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(csr_tbl); i++) {
|
|
|
|
- IWL_ERR(trans, " %25s: 0X%08x\n",
|
|
|
|
- get_csr_string(csr_tbl[i]),
|
|
|
|
- iwl_read32(bus(trans), csr_tbl[i]));
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static ssize_t iwl_dbgfs_csr_write(struct file *file,
|
|
static ssize_t iwl_dbgfs_csr_write(struct file *file,
|
|
const char __user *user_buf,
|
|
const char __user *user_buf,
|
|
size_t count, loff_t *ppos)
|
|
size_t count, loff_t *ppos)
|
|
@@ -1842,67 +1903,6 @@ static ssize_t iwl_dbgfs_csr_write(struct file *file,
|
|
return count;
|
|
return count;
|
|
}
|
|
}
|
|
|
|
|
|
-static const char *get_fh_string(int cmd)
|
|
|
|
-{
|
|
|
|
- switch (cmd) {
|
|
|
|
- IWL_CMD(FH_RSCSR_CHNL0_STTS_WPTR_REG);
|
|
|
|
- IWL_CMD(FH_RSCSR_CHNL0_RBDCB_BASE_REG);
|
|
|
|
- IWL_CMD(FH_RSCSR_CHNL0_WPTR);
|
|
|
|
- IWL_CMD(FH_MEM_RCSR_CHNL0_CONFIG_REG);
|
|
|
|
- IWL_CMD(FH_MEM_RSSR_SHARED_CTRL_REG);
|
|
|
|
- IWL_CMD(FH_MEM_RSSR_RX_STATUS_REG);
|
|
|
|
- IWL_CMD(FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV);
|
|
|
|
- IWL_CMD(FH_TSSR_TX_STATUS_REG);
|
|
|
|
- IWL_CMD(FH_TSSR_TX_ERROR_REG);
|
|
|
|
- default:
|
|
|
|
- return "UNKNOWN";
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display)
|
|
|
|
-{
|
|
|
|
- int i;
|
|
|
|
-#ifdef CONFIG_IWLWIFI_DEBUG
|
|
|
|
- int pos = 0;
|
|
|
|
- size_t bufsz = 0;
|
|
|
|
-#endif
|
|
|
|
- static const u32 fh_tbl[] = {
|
|
|
|
- FH_RSCSR_CHNL0_STTS_WPTR_REG,
|
|
|
|
- FH_RSCSR_CHNL0_RBDCB_BASE_REG,
|
|
|
|
- FH_RSCSR_CHNL0_WPTR,
|
|
|
|
- FH_MEM_RCSR_CHNL0_CONFIG_REG,
|
|
|
|
- FH_MEM_RSSR_SHARED_CTRL_REG,
|
|
|
|
- FH_MEM_RSSR_RX_STATUS_REG,
|
|
|
|
- FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV,
|
|
|
|
- FH_TSSR_TX_STATUS_REG,
|
|
|
|
- FH_TSSR_TX_ERROR_REG
|
|
|
|
- };
|
|
|
|
-#ifdef CONFIG_IWLWIFI_DEBUG
|
|
|
|
- if (display) {
|
|
|
|
- bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40;
|
|
|
|
- *buf = kmalloc(bufsz, GFP_KERNEL);
|
|
|
|
- if (!*buf)
|
|
|
|
- return -ENOMEM;
|
|
|
|
- pos += scnprintf(*buf + pos, bufsz - pos,
|
|
|
|
- "FH register values:\n");
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) {
|
|
|
|
- pos += scnprintf(*buf + pos, bufsz - pos,
|
|
|
|
- " %34s: 0X%08x\n",
|
|
|
|
- get_fh_string(fh_tbl[i]),
|
|
|
|
- iwl_read_direct32(bus(trans), fh_tbl[i]));
|
|
|
|
- }
|
|
|
|
- return pos;
|
|
|
|
- }
|
|
|
|
-#endif
|
|
|
|
- IWL_ERR(trans, "FH register values:\n");
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) {
|
|
|
|
- IWL_ERR(trans, " %34s: 0X%08x\n",
|
|
|
|
- get_fh_string(fh_tbl[i]),
|
|
|
|
- iwl_read_direct32(bus(trans), fh_tbl[i]));
|
|
|
|
- }
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static ssize_t iwl_dbgfs_fh_reg_read(struct file *file,
|
|
static ssize_t iwl_dbgfs_fh_reg_read(struct file *file,
|
|
char __user *user_buf,
|
|
char __user *user_buf,
|
|
size_t count, loff_t *ppos)
|
|
size_t count, loff_t *ppos)
|