summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Greear <greearb@candelatech.com>2016-05-13 14:29:33 -0400
committerJohannes Berg <johannes.berg@intel.com>2016-05-31 07:07:54 -0400
commit0bb7ed426373cebf406ff3ae7b6d2344f2f4364c (patch)
treecf1ed8f2617df4893a3a68d61b3135891b0a3b05
parent100cb9ff40e0c9eba1d88e3c9c21e9670faeb896 (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.c78
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);
328static ssize_t sta_vht_capa_read(struct file *file, char __user *userbuf, 328static 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));