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/wireless/iwlwifi/iwl-io.c | |
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/wireless/iwlwifi/iwl-io.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-io.c | 67 |
1 files changed, 67 insertions, 0 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 | } | ||