diff options
author | Arik Nemtsov <arik@wizery.com> | 2011-04-18 07:15:29 -0400 |
---|---|---|
committer | Luciano Coelho <coelho@ti.com> | 2011-05-02 03:31:34 -0400 |
commit | 2d66bee7fbd38d28e9ed12f45b8e9db8e6aa0c49 (patch) | |
tree | d69b536641788a79568cd6e67c93b79812ce7187 | |
parent | 7dece1c8e1044287287d44ac183a946333b55fc3 (diff) |
wl12xx: export driver state to debugfs
By reading the "driver_state" debugfs value we get all the important
state information from the wl12xx driver. This helps testing and
debugging, particularly in situations where the driver seems "stuck".
Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
-rw-r--r-- | drivers/net/wireless/wl12xx/debugfs.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/debugfs.c b/drivers/net/wireless/wl12xx/debugfs.c index a2b55e556714..b2f692babed7 100644 --- a/drivers/net/wireless/wl12xx/debugfs.c +++ b/drivers/net/wireless/wl12xx/debugfs.c | |||
@@ -310,6 +310,92 @@ static const struct file_operations start_recovery_ops = { | |||
310 | .llseek = default_llseek, | 310 | .llseek = default_llseek, |
311 | }; | 311 | }; |
312 | 312 | ||
313 | static ssize_t driver_state_read(struct file *file, char __user *user_buf, | ||
314 | size_t count, loff_t *ppos) | ||
315 | { | ||
316 | struct wl1271 *wl = file->private_data; | ||
317 | int res = 0; | ||
318 | char buf[1024]; | ||
319 | |||
320 | mutex_lock(&wl->mutex); | ||
321 | |||
322 | #define DRIVER_STATE_PRINT(x, fmt) \ | ||
323 | (res += scnprintf(buf + res, sizeof(buf) - res,\ | ||
324 | #x " = " fmt "\n", wl->x)) | ||
325 | |||
326 | #define DRIVER_STATE_PRINT_LONG(x) DRIVER_STATE_PRINT(x, "%ld") | ||
327 | #define DRIVER_STATE_PRINT_INT(x) DRIVER_STATE_PRINT(x, "%d") | ||
328 | #define DRIVER_STATE_PRINT_STR(x) DRIVER_STATE_PRINT(x, "%s") | ||
329 | #define DRIVER_STATE_PRINT_LHEX(x) DRIVER_STATE_PRINT(x, "0x%lx") | ||
330 | #define DRIVER_STATE_PRINT_HEX(x) DRIVER_STATE_PRINT(x, "0x%x") | ||
331 | |||
332 | DRIVER_STATE_PRINT_INT(tx_blocks_available); | ||
333 | DRIVER_STATE_PRINT_INT(tx_allocated_blocks); | ||
334 | DRIVER_STATE_PRINT_INT(tx_frames_cnt); | ||
335 | DRIVER_STATE_PRINT_LHEX(tx_frames_map[0]); | ||
336 | DRIVER_STATE_PRINT_INT(tx_queue_count); | ||
337 | DRIVER_STATE_PRINT_INT(tx_packets_count); | ||
338 | DRIVER_STATE_PRINT_INT(tx_results_count); | ||
339 | DRIVER_STATE_PRINT_LHEX(flags); | ||
340 | DRIVER_STATE_PRINT_INT(tx_blocks_freed[0]); | ||
341 | DRIVER_STATE_PRINT_INT(tx_blocks_freed[1]); | ||
342 | DRIVER_STATE_PRINT_INT(tx_blocks_freed[2]); | ||
343 | DRIVER_STATE_PRINT_INT(tx_blocks_freed[3]); | ||
344 | DRIVER_STATE_PRINT_INT(tx_security_last_seq); | ||
345 | DRIVER_STATE_PRINT_INT(rx_counter); | ||
346 | DRIVER_STATE_PRINT_INT(session_counter); | ||
347 | DRIVER_STATE_PRINT_INT(state); | ||
348 | DRIVER_STATE_PRINT_INT(bss_type); | ||
349 | DRIVER_STATE_PRINT_INT(channel); | ||
350 | DRIVER_STATE_PRINT_HEX(rate_set); | ||
351 | DRIVER_STATE_PRINT_HEX(basic_rate_set); | ||
352 | DRIVER_STATE_PRINT_HEX(basic_rate); | ||
353 | DRIVER_STATE_PRINT_INT(band); | ||
354 | DRIVER_STATE_PRINT_INT(beacon_int); | ||
355 | DRIVER_STATE_PRINT_INT(psm_entry_retry); | ||
356 | DRIVER_STATE_PRINT_INT(ps_poll_failures); | ||
357 | DRIVER_STATE_PRINT_HEX(filters); | ||
358 | DRIVER_STATE_PRINT_HEX(rx_config); | ||
359 | DRIVER_STATE_PRINT_HEX(rx_filter); | ||
360 | DRIVER_STATE_PRINT_INT(power_level); | ||
361 | DRIVER_STATE_PRINT_INT(rssi_thold); | ||
362 | DRIVER_STATE_PRINT_INT(last_rssi_event); | ||
363 | DRIVER_STATE_PRINT_INT(sg_enabled); | ||
364 | DRIVER_STATE_PRINT_INT(enable_11a); | ||
365 | DRIVER_STATE_PRINT_INT(noise); | ||
366 | DRIVER_STATE_PRINT_LHEX(ap_hlid_map[0]); | ||
367 | DRIVER_STATE_PRINT_INT(last_tx_hlid); | ||
368 | DRIVER_STATE_PRINT_INT(ba_support); | ||
369 | DRIVER_STATE_PRINT_HEX(ba_rx_bitmap); | ||
370 | DRIVER_STATE_PRINT_HEX(ap_fw_ps_map); | ||
371 | DRIVER_STATE_PRINT_LHEX(ap_ps_map); | ||
372 | DRIVER_STATE_PRINT_HEX(quirks); | ||
373 | DRIVER_STATE_PRINT_HEX(irq); | ||
374 | DRIVER_STATE_PRINT_HEX(ref_clock); | ||
375 | DRIVER_STATE_PRINT_HEX(tcxo_clock); | ||
376 | DRIVER_STATE_PRINT_HEX(hw_pg_ver); | ||
377 | DRIVER_STATE_PRINT_HEX(platform_quirks); | ||
378 | DRIVER_STATE_PRINT_HEX(chip.id); | ||
379 | DRIVER_STATE_PRINT_STR(chip.fw_ver_str); | ||
380 | |||
381 | #undef DRIVER_STATE_PRINT_INT | ||
382 | #undef DRIVER_STATE_PRINT_LONG | ||
383 | #undef DRIVER_STATE_PRINT_HEX | ||
384 | #undef DRIVER_STATE_PRINT_LHEX | ||
385 | #undef DRIVER_STATE_PRINT_STR | ||
386 | #undef DRIVER_STATE_PRINT | ||
387 | |||
388 | mutex_unlock(&wl->mutex); | ||
389 | |||
390 | return simple_read_from_buffer(user_buf, count, ppos, buf, res); | ||
391 | } | ||
392 | |||
393 | static const struct file_operations driver_state_ops = { | ||
394 | .read = driver_state_read, | ||
395 | .open = wl1271_open_file_generic, | ||
396 | .llseek = default_llseek, | ||
397 | }; | ||
398 | |||
313 | static ssize_t dtim_interval_read(struct file *file, char __user *user_buf, | 399 | static ssize_t dtim_interval_read(struct file *file, char __user *user_buf, |
314 | size_t count, loff_t *ppos) | 400 | size_t count, loff_t *ppos) |
315 | { | 401 | { |
@@ -549,6 +635,7 @@ static int wl1271_debugfs_add_files(struct wl1271 *wl, | |||
549 | 635 | ||
550 | DEBUGFS_ADD(gpio_power, rootdir); | 636 | DEBUGFS_ADD(gpio_power, rootdir); |
551 | DEBUGFS_ADD(start_recovery, rootdir); | 637 | DEBUGFS_ADD(start_recovery, rootdir); |
638 | DEBUGFS_ADD(driver_state, rootdir); | ||
552 | DEBUGFS_ADD(dtim_interval, rootdir); | 639 | DEBUGFS_ADD(dtim_interval, rootdir); |
553 | DEBUGFS_ADD(beacon_interval, rootdir); | 640 | DEBUGFS_ADD(beacon_interval, rootdir); |
554 | 641 | ||