diff options
author | Inbal Hacohen <Inbal.Hacohen@intel.com> | 2013-06-24 03:35:53 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-07-16 06:12:54 -0400 |
commit | 313b0a294f8cc92be4387186e8c9eef59c1c198a (patch) | |
tree | 9dbe54d71faba07afa0e28a522301df93f5f9f32 /drivers/net | |
parent | ad81f0545ef01ea651886dddac4bef6cec930092 (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.c | 67 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-io.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/internal.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/rx.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 67 |
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 | } |
168 | IWL_EXPORT_SYMBOL(iwl_clear_bits_prph); | 170 | IWL_EXPORT_SYMBOL(iwl_clear_bits_prph); |
171 | |||
172 | static 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 | |||
191 | int 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); |
78 | void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask); | 78 | void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask); |
79 | 79 | ||
80 | /* Error handling */ | ||
81 | int 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 | ******************************************************/ |
395 | int iwl_pcie_dump_fh(struct iwl_trans *trans, char **buf); | ||
396 | void iwl_pcie_dump_csr(struct iwl_trans *trans); | 395 | void 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 | ||
1036 | static 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 | |||
1055 | int 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 | |||
1101 | static const char *get_csr_string(int cmd) | 1036 | static 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); |