diff options
author | Ben Greear <greearb@candelatech.com> | 2016-05-13 14:29:33 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2016-05-31 07:07:54 -0400 |
commit | 0bb7ed426373cebf406ff3ae7b6d2344f2f4364c (patch) | |
tree | cf1ed8f2617df4893a3a68d61b3135891b0a3b05 | |
parent | 100cb9ff40e0c9eba1d88e3c9c21e9670faeb896 (diff) |
mac80211: add vht cap decode to debugfs
This makes it a lot easier to understand the capabilities used
by the station:
VHT supported
cap: 0x300819b2
MAX-MPDU-11454
80Mhz
RXLDPC
SHORT-GI-80
TXSTBC
RXSTBC_1
SU-BEAMFORMER-CAPABLE
SU-BEAMFORMEE-CAPABLE
BEAMFORMEE-STS: 0x0
SOUNDING-DIMENSIONS: 0x0
MU-BEAMFORMER-CAPABLE
MPDU-LENGTH-EXPONENT: 0x0
LINK-ADAPTATION-VHT-MRQ-MFB: 0x0
RX-ANTENNA-PATTERN
TX-ANTENNA-PATTERN
RX MCS: fffe
TX MCS: fffe
Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | net/mac80211/debugfs_sta.c | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index 33dfcbc2bf9c..fd334133ff45 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c | |||
@@ -328,14 +328,88 @@ STA_OPS(ht_capa); | |||
328 | static ssize_t sta_vht_capa_read(struct file *file, char __user *userbuf, | 328 | static ssize_t sta_vht_capa_read(struct file *file, char __user *userbuf, |
329 | size_t count, loff_t *ppos) | 329 | size_t count, loff_t *ppos) |
330 | { | 330 | { |
331 | char buf[128], *p = buf; | 331 | char buf[512], *p = buf; |
332 | struct sta_info *sta = file->private_data; | 332 | struct sta_info *sta = file->private_data; |
333 | struct ieee80211_sta_vht_cap *vhtc = &sta->sta.vht_cap; | 333 | struct ieee80211_sta_vht_cap *vhtc = &sta->sta.vht_cap; |
334 | 334 | ||
335 | p += scnprintf(p, sizeof(buf) + buf - p, "VHT %ssupported\n", | 335 | p += scnprintf(p, sizeof(buf) + buf - p, "VHT %ssupported\n", |
336 | vhtc->vht_supported ? "" : "not "); | 336 | vhtc->vht_supported ? "" : "not "); |
337 | if (vhtc->vht_supported) { | 337 | if (vhtc->vht_supported) { |
338 | p += scnprintf(p, sizeof(buf)+buf-p, "cap: %#.8x\n", vhtc->cap); | 338 | p += scnprintf(p, sizeof(buf) + buf - p, "cap: %#.8x\n", |
339 | vhtc->cap); | ||
340 | #define PFLAG(a, b) \ | ||
341 | do { \ | ||
342 | if (vhtc->cap & IEEE80211_VHT_CAP_ ## a) \ | ||
343 | p += scnprintf(p, sizeof(buf) + buf - p, \ | ||
344 | "\t\t%s\n", b); \ | ||
345 | } while (0) | ||
346 | |||
347 | switch (vhtc->cap & 0x3) { | ||
348 | case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895: | ||
349 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
350 | "\t\tMAX-MPDU-3895\n"); | ||
351 | break; | ||
352 | case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991: | ||
353 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
354 | "\t\tMAX-MPDU-7991\n"); | ||
355 | break; | ||
356 | case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454: | ||
357 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
358 | "\t\tMAX-MPDU-11454\n"); | ||
359 | break; | ||
360 | default: | ||
361 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
362 | "\t\tMAX-MPDU-UNKNOWN\n"); | ||
363 | }; | ||
364 | switch (vhtc->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) { | ||
365 | case 0: | ||
366 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
367 | "\t\t80Mhz\n"); | ||
368 | break; | ||
369 | case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ: | ||
370 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
371 | "\t\t160Mhz\n"); | ||
372 | break; | ||
373 | case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ: | ||
374 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
375 | "\t\t80+80Mhz\n"); | ||
376 | break; | ||
377 | default: | ||
378 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
379 | "\t\tUNKNOWN-MHZ: 0x%x\n", | ||
380 | (vhtc->cap >> 2) & 0x3); | ||
381 | }; | ||
382 | PFLAG(RXLDPC, "RXLDPC"); | ||
383 | PFLAG(SHORT_GI_80, "SHORT-GI-80"); | ||
384 | PFLAG(SHORT_GI_160, "SHORT-GI-160"); | ||
385 | PFLAG(TXSTBC, "TXSTBC"); | ||
386 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
387 | "\t\tRXSTBC_%d\n", (vhtc->cap >> 8) & 0x7); | ||
388 | PFLAG(SU_BEAMFORMER_CAPABLE, "SU-BEAMFORMER-CAPABLE"); | ||
389 | PFLAG(SU_BEAMFORMEE_CAPABLE, "SU-BEAMFORMEE-CAPABLE"); | ||
390 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
391 | "\t\tBEAMFORMEE-STS: 0x%x\n", | ||
392 | (vhtc->cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK) >> | ||
393 | IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT); | ||
394 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
395 | "\t\tSOUNDING-DIMENSIONS: 0x%x\n", | ||
396 | (vhtc->cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK) | ||
397 | >> IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT); | ||
398 | PFLAG(MU_BEAMFORMER_CAPABLE, "MU-BEAMFORMER-CAPABLE"); | ||
399 | PFLAG(MU_BEAMFORMEE_CAPABLE, "MU-BEAMFORMEE-CAPABLE"); | ||
400 | PFLAG(VHT_TXOP_PS, "TXOP-PS"); | ||
401 | PFLAG(HTC_VHT, "HTC-VHT"); | ||
402 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
403 | "\t\tMPDU-LENGTH-EXPONENT: 0x%x\n", | ||
404 | (vhtc->cap & IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >> | ||
405 | IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT); | ||
406 | PFLAG(VHT_LINK_ADAPTATION_VHT_UNSOL_MFB, | ||
407 | "LINK-ADAPTATION-VHT-UNSOL-MFB"); | ||
408 | p += scnprintf(p, sizeof(buf) + buf - p, | ||
409 | "\t\tLINK-ADAPTATION-VHT-MRQ-MFB: 0x%x\n", | ||
410 | (vhtc->cap & IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB) >> 26); | ||
411 | PFLAG(RX_ANTENNA_PATTERN, "RX-ANTENNA-PATTERN"); | ||
412 | PFLAG(TX_ANTENNA_PATTERN, "TX-ANTENNA-PATTERN"); | ||
339 | 413 | ||
340 | p += scnprintf(p, sizeof(buf)+buf-p, "RX MCS: %.4x\n", | 414 | p += scnprintf(p, sizeof(buf)+buf-p, "RX MCS: %.4x\n", |
341 | le16_to_cpu(vhtc->vht_mcs.rx_mcs_map)); | 415 | le16_to_cpu(vhtc->vht_mcs.rx_mcs_map)); |