Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Ben Greear and committed by
Johannes Berg
0bb7ed42 100cb9ff

+76 -2
+76 -2
net/mac80211/debugfs_sta.c
··· 328 328 static ssize_t sta_vht_capa_read(struct file *file, char __user *userbuf, 329 329 size_t count, loff_t *ppos) 330 330 { 331 - char buf[128], *p = buf; 331 + char buf[512], *p = buf; 332 332 struct sta_info *sta = file->private_data; 333 333 struct ieee80211_sta_vht_cap *vhtc = &sta->sta.vht_cap; 334 334 335 335 p += scnprintf(p, sizeof(buf) + buf - p, "VHT %ssupported\n", 336 336 vhtc->vht_supported ? "" : "not "); 337 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 414 p += scnprintf(p, sizeof(buf)+buf-p, "RX MCS: %.4x\n", 341 415 le16_to_cpu(vhtc->vht_mcs.rx_mcs_map));