wifi: mt76: mt7996: use hweight16 to get correct tx antenna
Subsystems (2)
Shayne Chen
reviewerPATCH 1/12 wifi: mt76: mt7996: use hweight16 to get correct tx antenna
From: Peter Chiu <[email protected]>
The chainmask is u16 so using hweight8 cannot get correct tx_ant. Without this patch, the tx_ant of band 2 would be -1 and lead to the following issue:
BUG: KASAN: stack-out-of-bounds in mt7996_mcu_add_sta+0x12e0/0x16e0 [mt7996e]
--- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +1 -1
@@ -1653,7 +1653,7 @@ mt7996_mcu_sta_bfer_tlv(struct mt7996_dev *dev, struct sk_buff *skb, {struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;struct mt7996_phy *phy = mvif->phy; -int tx_ant =hweight8 (phy->mt76->chainmask) -1 ; +int tx_ant =hweight16 (phy->mt76->chainmask) -1 ;struct sta_rec_bf *bf;struct tlv *tlv;static const u8 matrix[4 ][4 ] = {
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 2/12 wifi: mt76: mt7996: fix traffic delay when switching back to working channel
From: Peter Chiu <[email protected]>
During scanning, UNI_CHANNEL_RX_PATH tag is necessary for the firmware to properly stop and resume MAC TX queue. Without this tag, HW needs more time to resume traffic when switching back to working channel.
--- drivers/net/wireless/mediatek/mt76/mt7996/main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7996/main.c +4 -0
@@ -307,6 +307,10 @@ int mt7996_set_channel(struct mt7996_phy *phy)if (ret) goto out; + ret =mt7996_mcu_set_chan_info (phy,UNI_CHANNEL_RX_PATH ); +if (ret) + goto out; + ret =mt7996_dfs_init_radar_detector (phy);mt7996_mac_cca_stats_reset (phy);
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 3/12 wifi: mt76: mt7996: fix wmm set of station interface to 3
In reply to Shayne ChenFrom: Peter Chiu <[email protected]>
According to connac3 HW design, the WMM index of AP and STA interface should be 0 and 3, respectively.
--- drivers/net/wireless/mediatek/mt76/mt7996/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7996/main.c +1 -1
@@ -206,7 +206,7 @@ static int mt7996_add_interface(struct ieee80211_hw *hw, mvif->mt76.omac_idx = idx; mvif->phy = phy; mvif->mt76.band_idx = band_idx; - mvif->mt76.wmm_idx = vif->type !=NL80211_IFTYPE_AP ; + mvif->mt76.wmm_idx = vif->type ==NL80211_IFTYPE_AP ?0 :3 ; ret =mt7996_mcu_add_dev_info (phy, vif, true);if (ret)
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 5/12 wifi: mt76: mt7996: advertize beacon_int_min_gcd
In reply to Shayne ChenFrom: Peter Chiu <[email protected]>
Advertize beacon_int_min_gcd as 100 to allow setting different beacon intervals on different interfaces.
--- drivers/net/wireless/mediatek/mt76/mt7996/init.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/mediatek/mt76/mt7996/init.c +1 -0
@@ -42,6 +42,7 @@ static const struct ieee80211_iface_combination if_comb[] = { BIT(NL80211_CHAN_WIDTH_40) | BIT(NL80211_CHAN_WIDTH_80) | BIT(NL80211_CHAN_WIDTH_160), + .beacon_int_min_gcd = 100, } };
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 6/12 wifi: mt76: mt7996: fix HE and EHT beamforming capabilities
In reply to Shayne ChenFrom: Howard Hsu <[email protected]>
Fix HE and EHT beamforming capabilities for different bands and interface types.
--- .../net/wireless/mediatek/mt76/mt7996/init.c | 65 ++++++++++++------- 1 file changed, 43 insertions(+), 22 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7996/init.c +43 -22
@@ -1012,8 +1012,6 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy,return ; elem->phy_cap_info[3 ] |=IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER ; -if (vif ==NL80211_IFTYPE_AP ) - elem->phy_cap_info[4 ] |=IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER ; c =FIELD_PREP (IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK , sts - 1) |
@@ -1021,6 +1019,11 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy, sts - 1); elem->phy_cap_info[5 ] |= c; +if (vif !=NL80211_IFTYPE_AP ) +return ; + + elem->phy_cap_info[4 ] |=IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER ; + c =IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB ; elem->phy_cap_info[6 ] |= c;
@@ -1180,7 +1183,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,IEEE80211_EHT_MAC_CAP0_OM_CONTROL ; eht_cap_elem->phy_cap_info[0 ] = -IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ |IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE ;
@@ -1194,30 +1196,36 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,u8_encode_bits (u8_get_bits (val,GENMASK (2 ,1 )),IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK ) |u8_encode_bits (val, -IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK ) | -u8_encode_bits (val, -IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK ); +IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK ); eht_cap_elem->phy_cap_info[2 ] =u8_encode_bits (sts -1 ,IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK ) | -u8_encode_bits (sts -1 ,IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK ) | -u8_encode_bits (sts -1 ,IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK ); +u8_encode_bits (sts -1 ,IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK ); + +if (band ==NL80211_BAND_6GHZ ) { + eht_cap_elem->phy_cap_info[0 ] |= +IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ ; + + eht_cap_elem->phy_cap_info[1 ] |= +u8_encode_bits (val, +IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK ); + + eht_cap_elem->phy_cap_info[2 ] |= +u8_encode_bits (sts -1 , +IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK ); + } eht_cap_elem->phy_cap_info[3 ] =IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK | -IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK | -IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK | -IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK | -IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK ; +IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK ; eht_cap_elem->phy_cap_info[4 ] =u8_encode_bits (min_t (int, sts -1 ,2 ),IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK ); eht_cap_elem->phy_cap_info[5 ] = -IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |u8_encode_bits (IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US ,IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK ) | u8_encode_bits(u8_get_bits(0x11, GENMASK(1, 0)),
@@ -1231,14 +1239,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK) |u8_encode_bits (val,IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK ); - eht_cap_elem->phy_cap_info[7 ] = -IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | -IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | -IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | -IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | -IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | -IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ ; - val =u8_encode_bits (nss,IEEE80211_EHT_MCS_NSS_RX ) |u8_encode_bits (nss,IEEE80211_EHT_MCS_NSS_TX );#define SET_EHT_MAX_NSS (_bw, _val) do { \
@@ -1249,8 +1249,29 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,SET_EHT_MAX_NSS (80 , val);SET_EHT_MAX_NSS (160 , val); -SET_EHT_MAX_NSS (320 , val); +if (band ==NL80211_BAND_6GHZ ) +SET_EHT_MAX_NSS (320 , val);#undef SET_EHT_MAX_NSS + +if (iftype !=NL80211_IFTYPE_AP ) +return ; + + eht_cap_elem->phy_cap_info[3 ] |= +IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK | +IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK ; + + eht_cap_elem->phy_cap_info[7 ] = +IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | +IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | +IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | +IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ ; + +if (band !=NL80211_BAND_6GHZ ) +return ; + + eht_cap_elem->phy_cap_info[7 ] |= +IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | +IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ ; } static void
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 7/12 wifi: mt76: mt7996: set correct beamformee SS capability
In reply to Shayne ChenFrom: Howard Hsu <[email protected]>
According to IEEE P802.11be/D6.0 Table 9-417n, beamformee SS field stands for the maximum number of spatial streams that the STA can receive in an EHT sounding NDP minus 1, and the minimum value of this field is 3.
This value indicates the decoding capability of a beamformee, which is independent of current antenna settings. Correct the value for mt7996 and mt7992 chipsets based on their HW capability.
--- .../net/wireless/mediatek/mt76/mt7996/init.c | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7996/init.c +17 -6
@@ -942,8 +942,12 @@ void mt7996_set_stream_vht_txbf_caps(struct mt7996_phy *phy) cap = &phy->mt76->sband_5g.sband.vht_cap.cap; *cap |=IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | -IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE | -FIELD_PREP (IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK , sts -1 ); +IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE ; + +if (is_mt7996 (phy->mt76->dev)) + *cap |=FIELD_PREP (IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK ,3 ); +else + *cap |=FIELD_PREP (IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK ,4 ); *cap &= ~(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK | IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
@@ -988,9 +992,15 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy,IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO ; elem->phy_cap_info[2 ] |= c; - c =IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE | -IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 | -IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4 ; + c =IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE ; + +if (is_mt7996 (phy->mt76->dev)) + c |=IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 | +IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4 ; +else + c |=IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5 | +IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_5 ; + elem->phy_cap_info[4 ] |= c;/* do not support NG16 due to spec D4.0 changes subcarrier idx */
@@ -1187,7 +1197,8 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE ; - val =max_t (u8, sts -1 ,3 ); +/* Set the maximum capability regardless of the antenna configuration. */ + val =is_mt7992 (phy->mt76->dev) ?4 :3 ; eht_cap_elem->phy_cap_info[0 ] |=u8_encode_bits (u8_get_bits (val,BIT (0 )),IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK );
Signature · 1 line
2.39.2
Re: [PATCH 07/12] wifi: mt76: mt7996: set correct beamformee SS capability
Quoted 9 lines · Shayne Chen
From: Howard Hsu <[email protected]>
According to IEEE P802.11be/D6.0 Table 9-417n, beamformee SS field stands for the maximum number of spatial streams that the STA can receive in an EHT sounding NDP minus 1, and the minimum value of this field is 3.
This value indicates the decoding capability of a beamformee, which is independent of current antenna settings. Correct the value for mt7996 and mt7992 chipsets based on their HW capability.
I thought that if user sets a specific number of antennas, the code should act as if that were the number of physical antennas, so this change seems wrong to me.
What use-case is this patch attempting to fix?
Thanks,
Ben
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Shayne Chen (陳軒丞)
reviewerRe: [PATCH 07/12] wifi: mt76: mt7996: set correct beamformee SS capability
Quoted 15 lines · Ben Greear
External email : Please do not click links or open attachments until you have verified the sender or the content.
Quoted 3 lines · Shayne Chen
From: Howard Hsu <[email protected]>
According to IEEE P802.11be/D6.0 Table 9-417n, beamformee SS field
stands
Quoted 1 line
for the maximum number of spatial streams that the STA can receive
in an
Quoted 3 lines
EHT sounding NDP minus 1, and the minimum value of this field is 3.
This value indicates the decoding capability of a beamformee, which
is
Quoted 1 line
independent of current antenna settings. Correct the value for
Quoted 9 lines
mt7996
Quoted 1 line
and mt7992 chipsets based on their HW capability.
I thought that if user sets a specific number of antennas, the code should
act as if that were the number of physical antennas, so this change seems
wrong to me.
We used to think that this field depends on the antennas. However, we see that IEEE spec defines the minimum value of this field is 3, so we think what the field means is the "MAX HW decoding capability", no matter how many antennas that user currently configured.
For example, if user configures a beamformee with only 1 antenna, it is still abled to decode a "(RX)-1x4-(TX)" matrix from a beamformer.
Quoted 2 lines
What use-case is this patch attempting to fix?
We faced issues when doing some BF performance and cert tests.
Thanks,
Shayne
Quoted 3 lines
Thanks,
Ben
Shayne Chen
reviewerPATCH 8/12 wifi: mt76: mt7996: fix EHT beamforming capability check
In reply to Shayne ChenFrom: Howard Hsu <[email protected]>
If a VIF acts as a beamformer, it should check peer's beamformee capability, and vice versa.
--- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +2 -2
@@ -1429,10 +1429,10 @@ mt7996_is_ebf_supported(struct mt7996_phy *phy, struct ieee80211_vif *vif,if (bfee)return vif->bss_conf.eht_su_beamformee && -EHT_PHY (CAP0_SU_BEAMFORMEE , pe->phy_cap_info[0 ]); +EHT_PHY (CAP0_SU_BEAMFORMER , pe->phy_cap_info[0 ]);else return vif->bss_conf.eht_su_beamformer && -EHT_PHY (CAP0_SU_BEAMFORMER , pe->phy_cap_info[0 ]); +EHT_PHY (CAP0_SU_BEAMFORMEE , pe->phy_cap_info[0 ]); }if (sta->deflink.he_cap.has_he) {
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 9/12 wifi: mt76: mt7996: set correct value in beamforming mcu command for mt7992
In reply to Shayne ChenFrom: Howard Hsu <[email protected]>
Configure correct bf number and bitmap in beamforming mcu command for mt7992 chipsets, which only support dual-band.
--- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +3 -2
@@ -3923,8 +3923,9 @@ int mt7996_mcu_set_txbf(struct mt7996_dev *dev, u8 action) tlv =mt7996_mcu_add_uni_tlv (skb, action,sizeof (*req_mod_en)); req_mod_en = (struct bf_mod_en_ctrl *)tlv; - req_mod_en->bf_num =3 ; - req_mod_en->bf_bitmap =GENMASK (2 ,0 ); + req_mod_en->bf_num =mt7996_band_valid (dev,MT_BAND2 ) ?3 :2 ; + req_mod_en->bf_bitmap =mt7996_band_valid (dev,MT_BAND2 ) ? +GENMASK (2 ,0 ) :GENMASK (1 ,0 );break ; }default :
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 10/12 wifi: mt76: mt7996: fix handling mbss enable/disable
In reply to Shayne ChenFrom: Rex Lu <[email protected]>
When mbss was previously enabled, the TLV needs to be included when disabling it again, in order to clear the firmware state.
--- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +1 -1
@@ -822,7 +822,7 @@ mt7996_mcu_bss_mbssid_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,struct bss_info_uni_mbssid *mbssid;struct tlv *tlv; -if (!vif->bss_conf.bssid_indicator) +if (!vif->bss_conf.bssid_indicator && enable)return ; tlv =mt7996_mcu_add_uni_tlv (skb,UNI_BSS_INFO_11V_MBSSID ,sizeof (*mbssid));
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 11/12 wifi: mt76: connac: add IEEE 802.11 fragmentation support for mt7996
In reply to Shayne ChenFrom: Benjamin Lin <[email protected]>
Add fragment index into TXD.DW2 to support IEEE 802.11 fragmentation.
--- .../net/wireless/mediatek/mt76/mt76_connac3_mac.h | 7 +++++++ drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h +7 -0
@@ -197,6 +197,13 @@ enum tx_mgnt_type { MT_TX_ADDBA, }; +enum tx_frag_idx { +MT_TX_FRAG_NONE , +MT_TX_FRAG_FIRST , +MT_TX_FRAG_MID , +MT_TX_FRAG_LAST +}; +#define MT_CT_INFO_APPLY_TXD BIT(0)#define MT_CT_INFO_COPY_HOST_TXD_ALL BIT(1)#define MT_CT_INFO_MGMT_FRAME BIT(2)
drivers/net/wireless/mediatek/mt76/mt7996/mac.c +11 -2
@@ -746,7 +746,7 @@ mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi,struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb);bool multicast =is_multicast_ether_addr (hdr->addr1);u8 tid = skb->priority &IEEE80211_QOS_CTL_TID_MASK ; -__le16 fc = hdr->frame_control; +__le16 fc = hdr->frame_control, sc = hdr->seq_ctrl;u8 fc_type, fc_stype;u32 val;
@@ -780,6 +780,15 @@ mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi, val =FIELD_PREP (MT_TXD2_FRAME_TYPE , fc_type) |FIELD_PREP (MT_TXD2_SUB_TYPE , fc_stype); +if (ieee80211_has_morefrags (fc) &&ieee80211_is_first_frag (sc)) + val |=FIELD_PREP (MT_TXD2_FRAG ,MT_TX_FRAG_FIRST ); +else if (ieee80211_has_morefrags (fc) && !ieee80211_is_first_frag (sc)) + val |=FIELD_PREP (MT_TXD2_FRAG ,MT_TX_FRAG_MID ); +else if (!ieee80211_has_morefrags (fc) && !ieee80211_is_first_frag (sc)) + val |=FIELD_PREP (MT_TXD2_FRAG ,MT_TX_FRAG_LAST ); +else + val |=FIELD_PREP (MT_TXD2_FRAG ,MT_TX_FRAG_NONE ); + txwi[2 ] |=cpu_to_le32 (val); txwi[3 ] |=cpu_to_le32 (FIELD_PREP (MT_TXD3_BCM , multicast));
@@ -789,7 +798,7 @@ mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi, }if (info->flags &IEEE80211_TX_CTL_INJECTED ) { -u16 seqno =le16_to_cpu (hdr->seq_ctrl); +u16 seqno =le16_to_cpu (sc);if (ieee80211_is_back_req (hdr->frame_control)) {struct ieee80211_bar *bar;
Signature · 1 line
2.39.2
Shayne Chen
reviewerPATCH 12/12 wifi: mt76: mt7996: set IEEE80211_KEY_FLAG_GENERATE_MMIE for other ciphers
In reply to Shayne ChenFrom: Michael-CY Lee <[email protected]>
When beacon protection is enabled, FW checks MMIE tag & length in the beacon for every cipher mode. To pass the check, driver needs to set the key flag IEEE80211_KEY_GENERATE_MMIE to let mac80211 generate and initialize MMIE.
--- drivers/net/wireless/mediatek/mt76/mt7996/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7996/main.c +4 -4
@@ -364,14 +364,14 @@ static int mt7996_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,case WLAN_CIPHER_SUITE_SMS4 :break ;case WLAN_CIPHER_SUITE_AES_CMAC : - wcid_keyidx = &wcid->hw_key_idx2; - key->flags |=IEEE80211_KEY_FLAG_GENERATE_MMIE ; - fallthrough;case WLAN_CIPHER_SUITE_BIP_CMAC_256 :case WLAN_CIPHER_SUITE_BIP_GMAC_128 :case WLAN_CIPHER_SUITE_BIP_GMAC_256 : -if (key->keyidx ==6 || key->keyidx ==7 ) +if (key->keyidx ==6 || key->keyidx ==7 ) { + wcid_keyidx = &wcid->hw_key_idx2; + key->flags |=IEEE80211_KEY_FLAG_GENERATE_MMIE ;break ; + } fallthrough;case WLAN_CIPHER_SUITE_WEP40 :case WLAN_CIPHER_SUITE_WEP104 :
Signature · 1 line
2.39.2