1 /* 2 * Copyright (c) 2008-2011 Atheros Communications Inc. 3 * Copyright (c) 2011 Neratec Solutions AG 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <linux/debugfs.h> 19 #include <linux/export.h> 20 21 #include "ath9k.h" 22 #include "dfs_debug.h" 23 24 #define ATH9K_DFS_STAT(s, p) \ 25 len += snprintf(buf + len, size - len, "%28s : %10u\n", s, \ 26 sc->debug.stats.dfs_stats.p); 27 28 static ssize_t read_file_dfs(struct file *file, char __user *user_buf, 29 size_t count, loff_t *ppos) 30 { 31 struct ath_softc *sc = file->private_data; 32 struct ath9k_hw_version *hw_ver = &sc->sc_ah->hw_version; 33 char *buf; 34 unsigned int len = 0, size = 8000; 35 ssize_t retval = 0; 36 37 buf = kzalloc(size, GFP_KERNEL); 38 if (buf == NULL) 39 return -ENOMEM; 40 41 len += snprintf(buf + len, size - len, "DFS support for " 42 "macVersion = 0x%x, macRev = 0x%x: %s\n", 43 hw_ver->macVersion, hw_ver->macRev, 44 (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_DFS) ? 45 "enabled" : "disabled"); 46 ATH9K_DFS_STAT("DFS pulses detected ", pulses_detected); 47 ATH9K_DFS_STAT("Datalen discards ", datalen_discards); 48 ATH9K_DFS_STAT("RSSI discards ", rssi_discards); 49 ATH9K_DFS_STAT("BW info discards ", bwinfo_discards); 50 ATH9K_DFS_STAT("Primary channel pulses ", pri_phy_errors); 51 ATH9K_DFS_STAT("Secondary channel pulses", ext_phy_errors); 52 ATH9K_DFS_STAT("Dual channel pulses ", dc_phy_errors); 53 54 if (len > size) 55 len = size; 56 57 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 58 kfree(buf); 59 60 return retval; 61 } 62 63 static const struct file_operations fops_dfs_stats = { 64 .read = read_file_dfs, 65 .open = simple_open, 66 .owner = THIS_MODULE, 67 .llseek = default_llseek, 68 }; 69 70 void ath9k_dfs_init_debug(struct ath_softc *sc) 71 { 72 debugfs_create_file("dfs_stats", S_IRUSR, 73 sc->debug.debugfs_phy, sc, &fops_dfs_stats); 74 } 75