aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorInbal Hacohen <Inbal.Hacohen@intel.com>2013-06-24 03:35:53 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-07-16 06:12:54 -0400
commit313b0a294f8cc92be4387186e8c9eef59c1c198a (patch)
tree9dbe54d71faba07afa0e28a522301df93f5f9f32 /drivers/net
parentad81f0545ef01ea651886dddac4bef6cec930092 (diff)
iwlwifi: move dump_fh into common code
This means it can be shared for different transport layers in the future. Signed-off-by: Inbal Hacohen <Inbal.Hacohen@intel.com> Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-io.c67
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-io.h3
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/internal.h1
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/rx.c2
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c67
5 files changed, 72 insertions, 68 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.c b/drivers/net/wireless/iwlwifi/iwl-io.c
index 305c81f2c2b4..dfa4d2e3aaa2 100644
--- a/drivers/net/wireless/iwlwifi/iwl-io.c
+++ b/drivers/net/wireless/iwlwifi/iwl-io.c
@@ -33,6 +33,8 @@
33#include "iwl-io.h" 33#include "iwl-io.h"
34#include "iwl-csr.h" 34#include "iwl-csr.h"
35#include "iwl-debug.h" 35#include "iwl-debug.h"
36#include "iwl-fh.h"
37#include "iwl-csr.h"
36 38
37#define IWL_POLL_INTERVAL 10 /* microseconds */ 39#define IWL_POLL_INTERVAL 10 /* microseconds */
38 40
@@ -166,3 +168,68 @@ void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
166 } 168 }
167} 169}
168IWL_EXPORT_SYMBOL(iwl_clear_bits_prph); 170IWL_EXPORT_SYMBOL(iwl_clear_bits_prph);
171
172static const char *get_fh_string(int cmd)
173{
174#define IWL_CMD(x) case x: return #x
175 switch (cmd) {
176 IWL_CMD(FH_RSCSR_CHNL0_STTS_WPTR_REG);
177 IWL_CMD(FH_RSCSR_CHNL0_RBDCB_BASE_REG);
178 IWL_CMD(FH_RSCSR_CHNL0_WPTR);
179 IWL_CMD(FH_MEM_RCSR_CHNL0_CONFIG_REG);
180 IWL_CMD(FH_MEM_RSSR_SHARED_CTRL_REG);
181 IWL_CMD(FH_MEM_RSSR_RX_STATUS_REG);
182 IWL_CMD(FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV);
183 IWL_CMD(FH_TSSR_TX_STATUS_REG);
184 IWL_CMD(FH_TSSR_TX_ERROR_REG);
185 default:
186 return "UNKNOWN";
187 }
188#undef IWL_CMD
189}
190
191int iwl_dump_fh(struct iwl_trans *trans, char **buf)
192{
193 int i;
194 static const u32 fh_tbl[] = {
195 FH_RSCSR_CHNL0_STTS_WPTR_REG,
196 FH_RSCSR_CHNL0_RBDCB_BASE_REG,
197 FH_RSCSR_CHNL0_WPTR,
198 FH_MEM_RCSR_CHNL0_CONFIG_REG,
199 FH_MEM_RSSR_SHARED_CTRL_REG,
200 FH_MEM_RSSR_RX_STATUS_REG,
201 FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV,
202 FH_TSSR_TX_STATUS_REG,
203 FH_TSSR_TX_ERROR_REG
204 };
205
206#ifdef CONFIG_IWLWIFI_DEBUGFS
207 if (buf) {
208 int pos = 0;
209 size_t bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40;
210
211 *buf = kmalloc(bufsz, GFP_KERNEL);
212 if (!*buf)
213 return -ENOMEM;
214
215 pos += scnprintf(*buf + pos, bufsz - pos,
216 "FH register values:\n");
217
218 for (i = 0; i < ARRAY_SIZE(fh_tbl); i++)
219 pos += scnprintf(*buf + pos, bufsz - pos,
220 " %34s: 0X%08x\n",
221 get_fh_string(fh_tbl[i]),
222 iwl_read_direct32(trans, fh_tbl[i]));
223
224 return pos;
225 }
226#endif
227
228 IWL_ERR(trans, "FH register values:\n");
229 for (i = 0; i < ARRAY_SIZE(fh_tbl); i++)
230 IWL_ERR(trans, " %34s: 0X%08x\n",
231 get_fh_string(fh_tbl[i]),
232 iwl_read_direct32(trans, fh_tbl[i]));
233
234 return 0;
235}
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.h b/drivers/net/wireless/iwlwifi/iwl-io.h
index fd9f5b97fff3..63d10ec08dbc 100644
--- a/drivers/net/wireless/iwlwifi/iwl-io.h
+++ b/drivers/net/wireless/iwlwifi/iwl-io.h
@@ -77,4 +77,7 @@ void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 ofs,
77 u32 bits, u32 mask); 77 u32 bits, u32 mask);
78void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask); 78void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask);
79 79
80/* Error handling */
81int iwl_dump_fh(struct iwl_trans *trans, char **buf);
82
80#endif 83#endif
diff --git a/drivers/net/wireless/iwlwifi/pcie/internal.h b/drivers/net/wireless/iwlwifi/pcie/internal.h
index b654dcdd048a..fa22639b63c9 100644
--- a/drivers/net/wireless/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/iwlwifi/pcie/internal.h
@@ -392,7 +392,6 @@ void iwl_trans_pcie_tx_reset(struct iwl_trans *trans);
392/***************************************************** 392/*****************************************************
393* Error handling 393* Error handling
394******************************************************/ 394******************************************************/
395int iwl_pcie_dump_fh(struct iwl_trans *trans, char **buf);
396void iwl_pcie_dump_csr(struct iwl_trans *trans); 395void iwl_pcie_dump_csr(struct iwl_trans *trans);
397 396
398/***************************************************** 397/*****************************************************
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c
index fd848cd1583e..5fdb4eea146d 100644
--- a/drivers/net/wireless/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/rx.c
@@ -793,7 +793,7 @@ static void iwl_pcie_irq_handle_error(struct iwl_trans *trans)
793 } 793 }
794 794
795 iwl_pcie_dump_csr(trans); 795 iwl_pcie_dump_csr(trans);
796 iwl_pcie_dump_fh(trans, NULL); 796 iwl_dump_fh(trans, NULL);
797 797
798 set_bit(STATUS_FW_ERROR, &trans_pcie->status); 798 set_bit(STATUS_FW_ERROR, &trans_pcie->status);
799 clear_bit(STATUS_HCMD_ACTIVE, &trans_pcie->status); 799 clear_bit(STATUS_HCMD_ACTIVE, &trans_pcie->status);
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 826c15602c46..82194e8daee4 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -1033,71 +1033,6 @@ static void iwl_trans_pcie_set_bits_mask(struct iwl_trans *trans, u32 reg,
1033 spin_unlock_irqrestore(&trans_pcie->reg_lock, flags); 1033 spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
1034} 1034}
1035 1035
1036static const char *get_fh_string(int cmd)
1037{
1038#define IWL_CMD(x) case x: return #x
1039 switch (cmd) {
1040 IWL_CMD(FH_RSCSR_CHNL0_STTS_WPTR_REG);
1041 IWL_CMD(FH_RSCSR_CHNL0_RBDCB_BASE_REG);
1042 IWL_CMD(FH_RSCSR_CHNL0_WPTR);
1043 IWL_CMD(FH_MEM_RCSR_CHNL0_CONFIG_REG);
1044 IWL_CMD(FH_MEM_RSSR_SHARED_CTRL_REG);
1045 IWL_CMD(FH_MEM_RSSR_RX_STATUS_REG);
1046 IWL_CMD(FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV);
1047 IWL_CMD(FH_TSSR_TX_STATUS_REG);
1048 IWL_CMD(FH_TSSR_TX_ERROR_REG);
1049 default:
1050 return "UNKNOWN";
1051 }
1052#undef IWL_CMD
1053}
1054
1055int iwl_pcie_dump_fh(struct iwl_trans *trans, char **buf)
1056{
1057 int i;
1058 static const u32 fh_tbl[] = {
1059 FH_RSCSR_CHNL0_STTS_WPTR_REG,
1060 FH_RSCSR_CHNL0_RBDCB_BASE_REG,
1061 FH_RSCSR_CHNL0_WPTR,
1062 FH_MEM_RCSR_CHNL0_CONFIG_REG,
1063 FH_MEM_RSSR_SHARED_CTRL_REG,
1064 FH_MEM_RSSR_RX_STATUS_REG,
1065 FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV,
1066 FH_TSSR_TX_STATUS_REG,
1067 FH_TSSR_TX_ERROR_REG
1068 };
1069
1070#ifdef CONFIG_IWLWIFI_DEBUGFS
1071 if (buf) {
1072 int pos = 0;
1073 size_t bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40;
1074
1075 *buf = kmalloc(bufsz, GFP_KERNEL);
1076 if (!*buf)
1077 return -ENOMEM;
1078
1079 pos += scnprintf(*buf + pos, bufsz - pos,
1080 "FH register values:\n");
1081
1082 for (i = 0; i < ARRAY_SIZE(fh_tbl); i++)
1083 pos += scnprintf(*buf + pos, bufsz - pos,
1084 " %34s: 0X%08x\n",
1085 get_fh_string(fh_tbl[i]),
1086 iwl_read_direct32(trans, fh_tbl[i]));
1087
1088 return pos;
1089 }
1090#endif
1091
1092 IWL_ERR(trans, "FH register values:\n");
1093 for (i = 0; i < ARRAY_SIZE(fh_tbl); i++)
1094 IWL_ERR(trans, " %34s: 0X%08x\n",
1095 get_fh_string(fh_tbl[i]),
1096 iwl_read_direct32(trans, fh_tbl[i]));
1097
1098 return 0;
1099}
1100
1101static const char *get_csr_string(int cmd) 1036static const char *get_csr_string(int cmd)
1102{ 1037{
1103#define IWL_CMD(x) case x: return #x 1038#define IWL_CMD(x) case x: return #x
@@ -1390,7 +1325,7 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file,
1390 int pos = 0; 1325 int pos = 0;
1391 ssize_t ret = -EFAULT; 1326 ssize_t ret = -EFAULT;
1392 1327
1393 ret = pos = iwl_pcie_dump_fh(trans, &buf); 1328 ret = pos = iwl_dump_fh(trans, &buf);
1394 if (buf) { 1329 if (buf) {
1395 ret = simple_read_from_buffer(user_buf, 1330 ret = simple_read_from_buffer(user_buf,
1396 count, ppos, buf, pos); 1331 count, ppos, buf, pos);