@@ -383,7 +383,6 @@ mt7915_init_wiphy(struct mt7915_phy *phy)
383
383
ieee80211_hw_set (hw , SUPPORTS_RX_DECAP_OFFLOAD );
384
384
ieee80211_hw_set (hw , SUPPORTS_MULTI_BSSID );
385
385
ieee80211_hw_set (hw , WANT_MONITOR_VIF );
386
- ieee80211_hw_set (hw , SUPPORTS_VHT_EXT_NSS_BW );
387
386
388
387
hw -> max_tx_fragments = 4 ;
389
388
@@ -396,26 +395,38 @@ mt7915_init_wiphy(struct mt7915_phy *phy)
396
395
}
397
396
398
397
if (phy -> mt76 -> cap .has_5ghz ) {
398
+ struct ieee80211_sta_vht_cap * vht_cap ;
399
+
400
+ vht_cap = & phy -> mt76 -> sband_5g .sband .vht_cap ;
399
401
phy -> mt76 -> sband_5g .sband .ht_cap .cap |=
400
402
IEEE80211_HT_CAP_LDPC_CODING |
401
403
IEEE80211_HT_CAP_MAX_AMSDU ;
402
404
phy -> mt76 -> sband_5g .sband .ht_cap .ampdu_density =
403
405
IEEE80211_HT_MPDU_DENSITY_4 ;
404
406
405
407
if (is_mt7915 (& dev -> mt76 )) {
406
- phy -> mt76 -> sband_5g . sband . vht_cap . cap |=
408
+ vht_cap -> cap |=
407
409
IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 |
408
410
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK ;
411
+
412
+ if (!dev -> dbdc_support )
413
+ vht_cap -> cap |=
414
+ IEEE80211_VHT_CAP_SHORT_GI_160 |
415
+ IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
416
+ FIELD_PREP (IEEE80211_VHT_CAP_EXT_NSS_BW_MASK , 1 );
409
417
} else {
410
- phy -> mt76 -> sband_5g . sband . vht_cap . cap |=
418
+ vht_cap -> cap |=
411
419
IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
412
420
IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK ;
413
421
414
422
/* mt7916 dbdc with 2g 2x2 bw40 and 5g 2x2 bw160c */
415
- phy -> mt76 -> sband_5g . sband . vht_cap . cap |=
423
+ vht_cap -> cap |=
416
424
IEEE80211_VHT_CAP_SHORT_GI_160 |
417
425
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ ;
418
426
}
427
+
428
+ if (!is_mt7915 (& dev -> mt76 ) || !dev -> dbdc_support )
429
+ ieee80211_hw_set (hw , SUPPORTS_VHT_EXT_NSS_BW );
419
430
}
420
431
421
432
mt76_set_stream_caps (phy -> mt76 , true);
@@ -841,9 +852,13 @@ mt7915_set_stream_he_txbf_caps(struct mt7915_phy *phy,
841
852
int sts = hweight8 (phy -> mt76 -> chainmask );
842
853
u8 c , sts_160 = sts ;
843
854
844
- /* mt7915 doesn't support bw160 */
845
- if (is_mt7915 (& dev -> mt76 ))
846
- sts_160 = 0 ;
855
+ /* Can do 1/2 of STS in 160Mhz mode for mt7915 */
856
+ if (is_mt7915 (& dev -> mt76 )) {
857
+ if (!dev -> dbdc_support )
858
+ sts_160 /= 2 ;
859
+ else
860
+ sts_160 = 0 ;
861
+ }
847
862
848
863
#ifdef CONFIG_MAC80211_MESH
849
864
if (vif == NL80211_IFTYPE_MESH_POINT )
@@ -944,10 +959,15 @@ mt7915_init_he_caps(struct mt7915_phy *phy, enum nl80211_band band,
944
959
int i , idx = 0 , nss = hweight8 (phy -> mt76 -> antenna_mask );
945
960
u16 mcs_map = 0 ;
946
961
u16 mcs_map_160 = 0 ;
947
- u8 nss_160 = nss ;
962
+ u8 nss_160 ;
948
963
949
- /* Can't do 160MHz with mt7915 */
950
- if (is_mt7915 (& dev -> mt76 ))
964
+ if (!is_mt7915 (& dev -> mt76 ))
965
+ nss_160 = nss ;
966
+ else if (!dev -> dbdc_support )
967
+ /* Can do 1/2 of NSS streams in 160Mhz mode for mt7915 */
968
+ nss_160 = nss / 2 ;
969
+ else
970
+ /* Can't do 160MHz with mt7915 dbdc */
951
971
nss_160 = 0 ;
952
972
953
973
for (i = 0 ; i < 8 ; i ++ ) {
0 commit comments