aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-io.c
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/wireless/iwlwifi/iwl-io.c
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/wireless/iwlwifi/iwl-io.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-io.c67
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}
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}