diff options
Diffstat (limited to 'net/mac80211/debugfs.c')
-rw-r--r-- | net/mac80211/debugfs.c | 83 |
1 files changed, 78 insertions, 5 deletions
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c index 2697a2fe608f..210b9b6fecd2 100644 --- a/net/mac80211/debugfs.c +++ b/net/mac80211/debugfs.c | |||
@@ -40,6 +40,10 @@ static const struct file_operations name## _ops = { \ | |||
40 | local->debugfs.name = debugfs_create_file(#name, 0400, phyd, \ | 40 | local->debugfs.name = debugfs_create_file(#name, 0400, phyd, \ |
41 | local, &name## _ops); | 41 | local, &name## _ops); |
42 | 42 | ||
43 | #define DEBUGFS_ADD_MODE(name, mode) \ | ||
44 | local->debugfs.name = debugfs_create_file(#name, mode, phyd, \ | ||
45 | local, &name## _ops); | ||
46 | |||
43 | #define DEBUGFS_DEL(name) \ | 47 | #define DEBUGFS_DEL(name) \ |
44 | debugfs_remove(local->debugfs.name); \ | 48 | debugfs_remove(local->debugfs.name); \ |
45 | local->debugfs.name = NULL; | 49 | local->debugfs.name = NULL; |
@@ -57,11 +61,80 @@ DEBUGFS_READONLY_FILE(long_retry_limit, 20, "%d", | |||
57 | local->hw.conf.long_frame_max_tx_count); | 61 | local->hw.conf.long_frame_max_tx_count); |
58 | DEBUGFS_READONLY_FILE(total_ps_buffered, 20, "%d", | 62 | DEBUGFS_READONLY_FILE(total_ps_buffered, 20, "%d", |
59 | local->total_ps_buffered); | 63 | local->total_ps_buffered); |
60 | DEBUGFS_READONLY_FILE(wep_iv, 20, "%#06x", | 64 | DEBUGFS_READONLY_FILE(wep_iv, 20, "%#08x", |
61 | local->wep_iv & 0xffffff); | 65 | local->wep_iv & 0xffffff); |
62 | DEBUGFS_READONLY_FILE(rate_ctrl_alg, 100, "%s", | 66 | DEBUGFS_READONLY_FILE(rate_ctrl_alg, 100, "%s", |
63 | local->rate_ctrl ? local->rate_ctrl->ops->name : "<unset>"); | 67 | local->rate_ctrl ? local->rate_ctrl->ops->name : "<unset>"); |
64 | 68 | ||
69 | static ssize_t tsf_read(struct file *file, char __user *user_buf, | ||
70 | size_t count, loff_t *ppos) | ||
71 | { | ||
72 | struct ieee80211_local *local = file->private_data; | ||
73 | u64 tsf = 0; | ||
74 | char buf[100]; | ||
75 | |||
76 | if (local->ops->get_tsf) | ||
77 | tsf = local->ops->get_tsf(local_to_hw(local)); | ||
78 | |||
79 | snprintf(buf, sizeof(buf), "0x%016llx\n", (unsigned long long) tsf); | ||
80 | |||
81 | return simple_read_from_buffer(user_buf, count, ppos, buf, 19); | ||
82 | } | ||
83 | |||
84 | static ssize_t tsf_write(struct file *file, | ||
85 | const char __user *user_buf, | ||
86 | size_t count, loff_t *ppos) | ||
87 | { | ||
88 | struct ieee80211_local *local = file->private_data; | ||
89 | unsigned long long tsf; | ||
90 | char buf[100]; | ||
91 | size_t len; | ||
92 | |||
93 | len = min(count, sizeof(buf) - 1); | ||
94 | if (copy_from_user(buf, user_buf, len)) | ||
95 | return -EFAULT; | ||
96 | buf[len] = '\0'; | ||
97 | |||
98 | if (strncmp(buf, "reset", 5) == 0) { | ||
99 | if (local->ops->reset_tsf) { | ||
100 | local->ops->reset_tsf(local_to_hw(local)); | ||
101 | printk(KERN_INFO "%s: debugfs reset TSF\n", wiphy_name(local->hw.wiphy)); | ||
102 | } | ||
103 | } else { | ||
104 | tsf = simple_strtoul(buf, NULL, 0); | ||
105 | if (local->ops->set_tsf) { | ||
106 | local->ops->set_tsf(local_to_hw(local), tsf); | ||
107 | printk(KERN_INFO "%s: debugfs set TSF to %#018llx\n", wiphy_name(local->hw.wiphy), tsf); | ||
108 | } | ||
109 | } | ||
110 | |||
111 | return count; | ||
112 | } | ||
113 | |||
114 | static const struct file_operations tsf_ops = { | ||
115 | .read = tsf_read, | ||
116 | .write = tsf_write, | ||
117 | .open = mac80211_open_file_generic | ||
118 | }; | ||
119 | |||
120 | static ssize_t reset_write(struct file *file, const char __user *user_buf, | ||
121 | size_t count, loff_t *ppos) | ||
122 | { | ||
123 | struct ieee80211_local *local = file->private_data; | ||
124 | |||
125 | rtnl_lock(); | ||
126 | __ieee80211_suspend(&local->hw); | ||
127 | __ieee80211_resume(&local->hw); | ||
128 | rtnl_unlock(); | ||
129 | |||
130 | return count; | ||
131 | } | ||
132 | |||
133 | static const struct file_operations reset_ops = { | ||
134 | .write = reset_write, | ||
135 | .open = mac80211_open_file_generic, | ||
136 | }; | ||
137 | |||
65 | /* statistics stuff */ | 138 | /* statistics stuff */ |
66 | 139 | ||
67 | #define DEBUGFS_STATS_FILE(name, buflen, fmt, value...) \ | 140 | #define DEBUGFS_STATS_FILE(name, buflen, fmt, value...) \ |
@@ -136,8 +209,6 @@ DEBUGFS_STATS_FILE(multicast_received_frame_count, 20, "%u", | |||
136 | local->dot11MulticastReceivedFrameCount); | 209 | local->dot11MulticastReceivedFrameCount); |
137 | DEBUGFS_STATS_FILE(transmitted_frame_count, 20, "%u", | 210 | DEBUGFS_STATS_FILE(transmitted_frame_count, 20, "%u", |
138 | local->dot11TransmittedFrameCount); | 211 | local->dot11TransmittedFrameCount); |
139 | DEBUGFS_STATS_FILE(wep_undecryptable_count, 20, "%u", | ||
140 | local->dot11WEPUndecryptableCount); | ||
141 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS | 212 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS |
142 | DEBUGFS_STATS_FILE(tx_handlers_drop, 20, "%u", | 213 | DEBUGFS_STATS_FILE(tx_handlers_drop, 20, "%u", |
143 | local->tx_handlers_drop); | 214 | local->tx_handlers_drop); |
@@ -204,6 +275,8 @@ void debugfs_hw_add(struct ieee80211_local *local) | |||
204 | DEBUGFS_ADD(long_retry_limit); | 275 | DEBUGFS_ADD(long_retry_limit); |
205 | DEBUGFS_ADD(total_ps_buffered); | 276 | DEBUGFS_ADD(total_ps_buffered); |
206 | DEBUGFS_ADD(wep_iv); | 277 | DEBUGFS_ADD(wep_iv); |
278 | DEBUGFS_ADD(tsf); | ||
279 | DEBUGFS_ADD_MODE(reset, 0200); | ||
207 | 280 | ||
208 | statsd = debugfs_create_dir("statistics", phyd); | 281 | statsd = debugfs_create_dir("statistics", phyd); |
209 | local->debugfs.statistics = statsd; | 282 | local->debugfs.statistics = statsd; |
@@ -221,7 +294,6 @@ void debugfs_hw_add(struct ieee80211_local *local) | |||
221 | DEBUGFS_STATS_ADD(received_fragment_count); | 294 | DEBUGFS_STATS_ADD(received_fragment_count); |
222 | DEBUGFS_STATS_ADD(multicast_received_frame_count); | 295 | DEBUGFS_STATS_ADD(multicast_received_frame_count); |
223 | DEBUGFS_STATS_ADD(transmitted_frame_count); | 296 | DEBUGFS_STATS_ADD(transmitted_frame_count); |
224 | DEBUGFS_STATS_ADD(wep_undecryptable_count); | ||
225 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS | 297 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS |
226 | DEBUGFS_STATS_ADD(tx_handlers_drop); | 298 | DEBUGFS_STATS_ADD(tx_handlers_drop); |
227 | DEBUGFS_STATS_ADD(tx_handlers_queued); | 299 | DEBUGFS_STATS_ADD(tx_handlers_queued); |
@@ -258,6 +330,8 @@ void debugfs_hw_del(struct ieee80211_local *local) | |||
258 | DEBUGFS_DEL(long_retry_limit); | 330 | DEBUGFS_DEL(long_retry_limit); |
259 | DEBUGFS_DEL(total_ps_buffered); | 331 | DEBUGFS_DEL(total_ps_buffered); |
260 | DEBUGFS_DEL(wep_iv); | 332 | DEBUGFS_DEL(wep_iv); |
333 | DEBUGFS_DEL(tsf); | ||
334 | DEBUGFS_DEL(reset); | ||
261 | 335 | ||
262 | DEBUGFS_STATS_DEL(transmitted_fragment_count); | 336 | DEBUGFS_STATS_DEL(transmitted_fragment_count); |
263 | DEBUGFS_STATS_DEL(multicast_transmitted_frame_count); | 337 | DEBUGFS_STATS_DEL(multicast_transmitted_frame_count); |
@@ -268,7 +342,6 @@ void debugfs_hw_del(struct ieee80211_local *local) | |||
268 | DEBUGFS_STATS_DEL(received_fragment_count); | 342 | DEBUGFS_STATS_DEL(received_fragment_count); |
269 | DEBUGFS_STATS_DEL(multicast_received_frame_count); | 343 | DEBUGFS_STATS_DEL(multicast_received_frame_count); |
270 | DEBUGFS_STATS_DEL(transmitted_frame_count); | 344 | DEBUGFS_STATS_DEL(transmitted_frame_count); |
271 | DEBUGFS_STATS_DEL(wep_undecryptable_count); | ||
272 | DEBUGFS_STATS_DEL(num_scans); | 345 | DEBUGFS_STATS_DEL(num_scans); |
273 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS | 346 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS |
274 | DEBUGFS_STATS_DEL(tx_handlers_drop); | 347 | DEBUGFS_STATS_DEL(tx_handlers_drop); |