[PATCH v3] ath10k: fix crash in recent 3.5.3 9984 firmware due wrong handling of peer_bw_rxnss_override parameter
kbuild test robot
lkp at intel.com
Fri Apr 27 12:09:45 PDT 2018
Hi Sebastian,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on ath6kl/ath-next]
[also build test WARNING on v4.17-rc2 next-20180426]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/s-gottschall-dd-wrt-com/ath10k-fix-crash-in-recent-3-5-3-9984-firmware-due-wrong-handling-of-peer_bw_rxnss_override-parameter/20180427-234051
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git ath-next
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All warnings (new ones prefixed by >>):
drivers/net/wireless/ath/ath10k/mac.c: In function 'ath10k_peer_assoc_h_vht':
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11A' not handled in switch [-Wswitch]
switch(arg->peer_phymode) {
^~~~~~
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11G' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11B' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11GONLY' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11NA_HT20' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11NG_HT20' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11NA_HT40' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11NG_HT40' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11AC_VHT20' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11AC_VHT40' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11AC_VHT80' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11AC_VHT20_2G' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11AC_VHT40_2G' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_11AC_VHT80_2G' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_UNKNOWN' not handled in switch [-Wswitch]
>> drivers/net/wireless/ath/ath10k/mac.c:2534:3: warning: enumeration value 'MODE_MAX' not handled in switch [-Wswitch]
vim +/MODE_11A +2534 drivers/net/wireless/ath/ath10k/mac.c
2457
2458 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
2459 struct ieee80211_vif *vif,
2460 struct ieee80211_sta *sta,
2461 struct wmi_peer_assoc_complete_arg *arg)
2462 {
2463 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
2464 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2465 struct cfg80211_chan_def def;
2466 enum nl80211_band band;
2467 const u16 *vht_mcs_mask;
2468 u8 ampdu_factor;
2469 u8 max_nss, vht_mcs;
2470 int i;
2471
2472 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2473 return;
2474
2475 if (!vht_cap->vht_supported)
2476 return;
2477
2478 band = def.chan->band;
2479 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2480
2481 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2482 return;
2483
2484 arg->peer_flags |= ar->wmi.peer_flags->vht;
2485
2486 if (def.chan->band == NL80211_BAND_2GHZ)
2487 arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
2488
2489 arg->peer_vht_caps = vht_cap->cap;
2490
2491 ampdu_factor = (vht_cap->cap &
2492 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2493 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2494
2495 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2496 * zero in VHT IE. Using it would result in degraded throughput.
2497 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2498 * it if VHT max_mpdu is smaller.
2499 */
2500 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2501 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2502 ampdu_factor)) - 1);
2503
2504 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2505 arg->peer_flags |= ar->wmi.peer_flags->bw80;
2506
2507 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
2508 arg->peer_flags |= ar->wmi.peer_flags->bw160;
2509
2510 /* Calculate peer NSS capability from VHT capabilities if STA
2511 * supports VHT.
2512 */
2513 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2514 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2515 (2 * i) & 3;
2516
2517 if ((vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED) &&
2518 vht_mcs_mask[i])
2519 max_nss = i + 1;
2520 }
2521 arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2522 arg->peer_vht_rates.rx_max_rate =
2523 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2524 arg->peer_vht_rates.rx_mcs_set =
2525 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2526 arg->peer_vht_rates.tx_max_rate =
2527 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2528 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2529 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2530 arg->peer_bw_rxnss_override = 0;
2531
2532 if (arg->peer_num_spatial_streams) {
2533 /* in case if peer is connected with vht160 or vht80+80, we need to properly adjust rxnss parameters */
> 2534 switch(arg->peer_phymode) {
2535 case MODE_11AC_VHT80_80:
2536 arg->peer_bw_rxnss_override = BW_NSS_FWCONF_80_80(arg->peer_num_spatial_streams);
2537 /* fall through */
2538 case MODE_11AC_VHT160:
2539 arg->peer_bw_rxnss_override |= BW_NSS_FWCONF_160(arg->peer_num_spatial_streams);
2540 break;
2541 }
2542 }
2543
2544 /* in case peer has no nss properties for some reasons, we set local nss to minimum (1x1) to avoid a
2545 * firmware assert / crash. this applies only to VHT160 or VHT80+80 and is a WAR for clients breaking
2546 * the spec.
2547 */
2548
2549 if (!arg->peer_num_spatial_streams && (arg->peer_phymode == MODE_11AC_VHT80_80 || arg->peer_phymode == MODE_11AC_VHT160)) {
2550 arg->peer_bw_rxnss_override = BW_NSS_FWCONF_MAP_ENABLE;
2551 }
2552
2553 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
2554 sta->addr, arg->peer_max_mpdu, arg->peer_flags);
2555 }
2556
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 62884 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/ath10k/attachments/20180428/8bf6530c/attachment-0001.gz>
More information about the ath10k
mailing list