diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/debugfs.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/debugfs.c | 242 |
1 files changed, 241 insertions, 1 deletions
diff --git a/drivers/net/wireless/wl12xx/debugfs.c b/drivers/net/wireless/wl12xx/debugfs.c index 8e75b09723b9..f1f8df9b6cd7 100644 --- a/drivers/net/wireless/wl12xx/debugfs.c +++ b/drivers/net/wireless/wl12xx/debugfs.c | |||
@@ -267,7 +267,7 @@ static ssize_t gpio_power_write(struct file *file, | |||
267 | } | 267 | } |
268 | buf[len] = '\0'; | 268 | buf[len] = '\0'; |
269 | 269 | ||
270 | ret = strict_strtoul(buf, 0, &value); | 270 | ret = kstrtoul(buf, 0, &value); |
271 | if (ret < 0) { | 271 | if (ret < 0) { |
272 | wl1271_warning("illegal value in gpio_power"); | 272 | wl1271_warning("illegal value in gpio_power"); |
273 | return -EINVAL; | 273 | return -EINVAL; |
@@ -291,6 +291,242 @@ static const struct file_operations gpio_power_ops = { | |||
291 | .llseek = default_llseek, | 291 | .llseek = default_llseek, |
292 | }; | 292 | }; |
293 | 293 | ||
294 | static ssize_t start_recovery_write(struct file *file, | ||
295 | const char __user *user_buf, | ||
296 | size_t count, loff_t *ppos) | ||
297 | { | ||
298 | struct wl1271 *wl = file->private_data; | ||
299 | |||
300 | mutex_lock(&wl->mutex); | ||
301 | ieee80211_queue_work(wl->hw, &wl->recovery_work); | ||
302 | mutex_unlock(&wl->mutex); | ||
303 | |||
304 | return count; | ||
305 | } | ||
306 | |||
307 | static const struct file_operations start_recovery_ops = { | ||
308 | .write = start_recovery_write, | ||
309 | .open = wl1271_open_file_generic, | ||
310 | .llseek = default_llseek, | ||
311 | }; | ||
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 | DRIVER_STATE_PRINT_INT(sched_scanning); | ||
381 | |||
382 | #undef DRIVER_STATE_PRINT_INT | ||
383 | #undef DRIVER_STATE_PRINT_LONG | ||
384 | #undef DRIVER_STATE_PRINT_HEX | ||
385 | #undef DRIVER_STATE_PRINT_LHEX | ||
386 | #undef DRIVER_STATE_PRINT_STR | ||
387 | #undef DRIVER_STATE_PRINT | ||
388 | |||
389 | mutex_unlock(&wl->mutex); | ||
390 | |||
391 | return simple_read_from_buffer(user_buf, count, ppos, buf, res); | ||
392 | } | ||
393 | |||
394 | static const struct file_operations driver_state_ops = { | ||
395 | .read = driver_state_read, | ||
396 | .open = wl1271_open_file_generic, | ||
397 | .llseek = default_llseek, | ||
398 | }; | ||
399 | |||
400 | static ssize_t dtim_interval_read(struct file *file, char __user *user_buf, | ||
401 | size_t count, loff_t *ppos) | ||
402 | { | ||
403 | struct wl1271 *wl = file->private_data; | ||
404 | u8 value; | ||
405 | |||
406 | if (wl->conf.conn.wake_up_event == CONF_WAKE_UP_EVENT_DTIM || | ||
407 | wl->conf.conn.wake_up_event == CONF_WAKE_UP_EVENT_N_DTIM) | ||
408 | value = wl->conf.conn.listen_interval; | ||
409 | else | ||
410 | value = 0; | ||
411 | |||
412 | return wl1271_format_buffer(user_buf, count, ppos, "%d\n", value); | ||
413 | } | ||
414 | |||
415 | static ssize_t dtim_interval_write(struct file *file, | ||
416 | const char __user *user_buf, | ||
417 | size_t count, loff_t *ppos) | ||
418 | { | ||
419 | struct wl1271 *wl = file->private_data; | ||
420 | char buf[10]; | ||
421 | size_t len; | ||
422 | unsigned long value; | ||
423 | int ret; | ||
424 | |||
425 | len = min(count, sizeof(buf) - 1); | ||
426 | if (copy_from_user(buf, user_buf, len)) | ||
427 | return -EFAULT; | ||
428 | buf[len] = '\0'; | ||
429 | |||
430 | ret = kstrtoul(buf, 0, &value); | ||
431 | if (ret < 0) { | ||
432 | wl1271_warning("illegal value for dtim_interval"); | ||
433 | return -EINVAL; | ||
434 | } | ||
435 | |||
436 | if (value < 1 || value > 10) { | ||
437 | wl1271_warning("dtim value is not in valid range"); | ||
438 | return -ERANGE; | ||
439 | } | ||
440 | |||
441 | mutex_lock(&wl->mutex); | ||
442 | |||
443 | wl->conf.conn.listen_interval = value; | ||
444 | /* for some reason there are different event types for 1 and >1 */ | ||
445 | if (value == 1) | ||
446 | wl->conf.conn.wake_up_event = CONF_WAKE_UP_EVENT_DTIM; | ||
447 | else | ||
448 | wl->conf.conn.wake_up_event = CONF_WAKE_UP_EVENT_N_DTIM; | ||
449 | |||
450 | /* | ||
451 | * we don't reconfigure ACX_WAKE_UP_CONDITIONS now, so it will only | ||
452 | * take effect on the next time we enter psm. | ||
453 | */ | ||
454 | mutex_unlock(&wl->mutex); | ||
455 | return count; | ||
456 | } | ||
457 | |||
458 | static const struct file_operations dtim_interval_ops = { | ||
459 | .read = dtim_interval_read, | ||
460 | .write = dtim_interval_write, | ||
461 | .open = wl1271_open_file_generic, | ||
462 | .llseek = default_llseek, | ||
463 | }; | ||
464 | |||
465 | static ssize_t beacon_interval_read(struct file *file, char __user *user_buf, | ||
466 | size_t count, loff_t *ppos) | ||
467 | { | ||
468 | struct wl1271 *wl = file->private_data; | ||
469 | u8 value; | ||
470 | |||
471 | if (wl->conf.conn.wake_up_event == CONF_WAKE_UP_EVENT_BEACON || | ||
472 | wl->conf.conn.wake_up_event == CONF_WAKE_UP_EVENT_N_BEACONS) | ||
473 | value = wl->conf.conn.listen_interval; | ||
474 | else | ||
475 | value = 0; | ||
476 | |||
477 | return wl1271_format_buffer(user_buf, count, ppos, "%d\n", value); | ||
478 | } | ||
479 | |||
480 | static ssize_t beacon_interval_write(struct file *file, | ||
481 | const char __user *user_buf, | ||
482 | size_t count, loff_t *ppos) | ||
483 | { | ||
484 | struct wl1271 *wl = file->private_data; | ||
485 | char buf[10]; | ||
486 | size_t len; | ||
487 | unsigned long value; | ||
488 | int ret; | ||
489 | |||
490 | len = min(count, sizeof(buf) - 1); | ||
491 | if (copy_from_user(buf, user_buf, len)) | ||
492 | return -EFAULT; | ||
493 | buf[len] = '\0'; | ||
494 | |||
495 | ret = kstrtoul(buf, 0, &value); | ||
496 | if (ret < 0) { | ||
497 | wl1271_warning("illegal value for beacon_interval"); | ||
498 | return -EINVAL; | ||
499 | } | ||
500 | |||
501 | if (value < 1 || value > 255) { | ||
502 | wl1271_warning("beacon interval value is not in valid range"); | ||
503 | return -ERANGE; | ||
504 | } | ||
505 | |||
506 | mutex_lock(&wl->mutex); | ||
507 | |||
508 | wl->conf.conn.listen_interval = value; | ||
509 | /* for some reason there are different event types for 1 and >1 */ | ||
510 | if (value == 1) | ||
511 | wl->conf.conn.wake_up_event = CONF_WAKE_UP_EVENT_BEACON; | ||
512 | else | ||
513 | wl->conf.conn.wake_up_event = CONF_WAKE_UP_EVENT_N_BEACONS; | ||
514 | |||
515 | /* | ||
516 | * we don't reconfigure ACX_WAKE_UP_CONDITIONS now, so it will only | ||
517 | * take effect on the next time we enter psm. | ||
518 | */ | ||
519 | mutex_unlock(&wl->mutex); | ||
520 | return count; | ||
521 | } | ||
522 | |||
523 | static const struct file_operations beacon_interval_ops = { | ||
524 | .read = beacon_interval_read, | ||
525 | .write = beacon_interval_write, | ||
526 | .open = wl1271_open_file_generic, | ||
527 | .llseek = default_llseek, | ||
528 | }; | ||
529 | |||
294 | static int wl1271_debugfs_add_files(struct wl1271 *wl, | 530 | static int wl1271_debugfs_add_files(struct wl1271 *wl, |
295 | struct dentry *rootdir) | 531 | struct dentry *rootdir) |
296 | { | 532 | { |
@@ -399,6 +635,10 @@ static int wl1271_debugfs_add_files(struct wl1271 *wl, | |||
399 | DEBUGFS_ADD(excessive_retries, rootdir); | 635 | DEBUGFS_ADD(excessive_retries, rootdir); |
400 | 636 | ||
401 | DEBUGFS_ADD(gpio_power, rootdir); | 637 | DEBUGFS_ADD(gpio_power, rootdir); |
638 | DEBUGFS_ADD(start_recovery, rootdir); | ||
639 | DEBUGFS_ADD(driver_state, rootdir); | ||
640 | DEBUGFS_ADD(dtim_interval, rootdir); | ||
641 | DEBUGFS_ADD(beacon_interval, rootdir); | ||
402 | 642 | ||
403 | return 0; | 643 | return 0; |
404 | 644 | ||