diff options
Diffstat (limited to 'net/mac80211/debugfs.c')
| -rw-r--r-- | net/mac80211/debugfs.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c index e4b54093d41b..637929b65ccc 100644 --- a/net/mac80211/debugfs.c +++ b/net/mac80211/debugfs.c | |||
| @@ -158,6 +158,130 @@ static const struct file_operations noack_ops = { | |||
| 158 | .open = mac80211_open_file_generic | 158 | .open = mac80211_open_file_generic |
| 159 | }; | 159 | }; |
| 160 | 160 | ||
| 161 | static ssize_t uapsd_queues_read(struct file *file, char __user *user_buf, | ||
| 162 | size_t count, loff_t *ppos) | ||
| 163 | { | ||
| 164 | struct ieee80211_local *local = file->private_data; | ||
| 165 | int res; | ||
| 166 | char buf[10]; | ||
| 167 | |||
| 168 | res = scnprintf(buf, sizeof(buf), "0x%x\n", local->uapsd_queues); | ||
| 169 | |||
| 170 | return simple_read_from_buffer(user_buf, count, ppos, buf, res); | ||
| 171 | } | ||
| 172 | |||
| 173 | static ssize_t uapsd_queues_write(struct file *file, | ||
| 174 | const char __user *user_buf, | ||
| 175 | size_t count, loff_t *ppos) | ||
| 176 | { | ||
| 177 | struct ieee80211_local *local = file->private_data; | ||
| 178 | unsigned long val; | ||
| 179 | char buf[10]; | ||
| 180 | size_t len; | ||
| 181 | int ret; | ||
| 182 | |||
| 183 | len = min(count, sizeof(buf) - 1); | ||
| 184 | if (copy_from_user(buf, user_buf, len)) | ||
| 185 | return -EFAULT; | ||
| 186 | buf[len] = '\0'; | ||
| 187 | |||
| 188 | ret = strict_strtoul(buf, 0, &val); | ||
| 189 | |||
| 190 | if (ret) | ||
| 191 | return -EINVAL; | ||
| 192 | |||
| 193 | if (val & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) | ||
| 194 | return -ERANGE; | ||
| 195 | |||
| 196 | local->uapsd_queues = val; | ||
| 197 | |||
| 198 | return count; | ||
| 199 | } | ||
| 200 | |||
| 201 | static const struct file_operations uapsd_queues_ops = { | ||
| 202 | .read = uapsd_queues_read, | ||
| 203 | .write = uapsd_queues_write, | ||
| 204 | .open = mac80211_open_file_generic | ||
| 205 | }; | ||
| 206 | |||
| 207 | static ssize_t uapsd_max_sp_len_read(struct file *file, char __user *user_buf, | ||
| 208 | size_t count, loff_t *ppos) | ||
| 209 | { | ||
| 210 | struct ieee80211_local *local = file->private_data; | ||
| 211 | int res; | ||
| 212 | char buf[10]; | ||
| 213 | |||
| 214 | res = scnprintf(buf, sizeof(buf), "0x%x\n", local->uapsd_max_sp_len); | ||
| 215 | |||
| 216 | return simple_read_from_buffer(user_buf, count, ppos, buf, res); | ||
| 217 | } | ||
| 218 | |||
| 219 | static ssize_t uapsd_max_sp_len_write(struct file *file, | ||
| 220 | const char __user *user_buf, | ||
| 221 | size_t count, loff_t *ppos) | ||
| 222 | { | ||
| 223 | struct ieee80211_local *local = file->private_data; | ||
| 224 | unsigned long val; | ||
| 225 | char buf[10]; | ||
| 226 | size_t len; | ||
| 227 | int ret; | ||
| 228 | |||
| 229 | len = min(count, sizeof(buf) - 1); | ||
| 230 | if (copy_from_user(buf, user_buf, len)) | ||
| 231 | return -EFAULT; | ||
| 232 | buf[len] = '\0'; | ||
| 233 | |||
| 234 | ret = strict_strtoul(buf, 0, &val); | ||
| 235 | |||
| 236 | if (ret) | ||
| 237 | return -EINVAL; | ||
| 238 | |||
| 239 | if (val & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) | ||
| 240 | return -ERANGE; | ||
| 241 | |||
| 242 | local->uapsd_max_sp_len = val; | ||
| 243 | |||
| 244 | return count; | ||
| 245 | } | ||
| 246 | |||
| 247 | static const struct file_operations uapsd_max_sp_len_ops = { | ||
| 248 | .read = uapsd_max_sp_len_read, | ||
| 249 | .write = uapsd_max_sp_len_write, | ||
| 250 | .open = mac80211_open_file_generic | ||
| 251 | }; | ||
| 252 | |||
| 253 | static ssize_t channel_type_read(struct file *file, char __user *user_buf, | ||
| 254 | size_t count, loff_t *ppos) | ||
| 255 | { | ||
| 256 | struct ieee80211_local *local = file->private_data; | ||
| 257 | const char *buf; | ||
| 258 | |||
| 259 | switch (local->hw.conf.channel_type) { | ||
| 260 | case NL80211_CHAN_NO_HT: | ||
| 261 | buf = "no ht\n"; | ||
| 262 | break; | ||
| 263 | case NL80211_CHAN_HT20: | ||
| 264 | buf = "ht20\n"; | ||
| 265 | break; | ||
| 266 | case NL80211_CHAN_HT40MINUS: | ||
| 267 | buf = "ht40-\n"; | ||
| 268 | break; | ||
| 269 | case NL80211_CHAN_HT40PLUS: | ||
| 270 | buf = "ht40+\n"; | ||
| 271 | break; | ||
| 272 | default: | ||
| 273 | buf = "???"; | ||
| 274 | break; | ||
| 275 | } | ||
| 276 | |||
| 277 | return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf)); | ||
| 278 | } | ||
| 279 | |||
| 280 | static const struct file_operations channel_type_ops = { | ||
| 281 | .read = channel_type_read, | ||
| 282 | .open = mac80211_open_file_generic | ||
| 283 | }; | ||
| 284 | |||
| 161 | static ssize_t queues_read(struct file *file, char __user *user_buf, | 285 | static ssize_t queues_read(struct file *file, char __user *user_buf, |
| 162 | size_t count, loff_t *ppos) | 286 | size_t count, loff_t *ppos) |
| 163 | { | 287 | { |
| @@ -314,6 +438,9 @@ void debugfs_hw_add(struct ieee80211_local *local) | |||
| 314 | DEBUGFS_ADD(queues); | 438 | DEBUGFS_ADD(queues); |
| 315 | DEBUGFS_ADD_MODE(reset, 0200); | 439 | DEBUGFS_ADD_MODE(reset, 0200); |
| 316 | DEBUGFS_ADD(noack); | 440 | DEBUGFS_ADD(noack); |
| 441 | DEBUGFS_ADD(uapsd_queues); | ||
| 442 | DEBUGFS_ADD(uapsd_max_sp_len); | ||
| 443 | DEBUGFS_ADD(channel_type); | ||
| 317 | 444 | ||
| 318 | statsd = debugfs_create_dir("statistics", phyd); | 445 | statsd = debugfs_create_dir("statistics", phyd); |
| 319 | 446 | ||
