wifi: mt76: mt7996: disable rx header translation for BMC entry
authorShayne Chen <shayne.chen@mediatek.com>
Wed, 20 Mar 2024 11:09:10 +0000 (19:09 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 2 May 2024 10:44:51 +0000 (12:44 +0200)
When a BMC wtbl of station interface is correctly set with peer address,
HW will do rx header translation for broadcast data packets, which makes
mac80211 unable to find the corresponding ieee80211_sta and drop the
packets. To fix this, disable HW rx header translation for BMC entry.

Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c

index cfb5a7d348eb8f6b865106495e429677b1bf39eb..3aab42522ec51033e231651d4af3478b44a1f19b 100644 (file)
@@ -1778,10 +1778,10 @@ mt7996_mcu_sta_hdr_trans_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
        else
                hdr_trans->from_ds = true;
 
-       wcid = (struct mt76_wcid *)sta->drv_priv;
-       if (!wcid)
+       if (!sta)
                return;
 
+       wcid = (struct mt76_wcid *)sta->drv_priv;
        hdr_trans->dis_rx_hdr_tran = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
        if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
                hdr_trans->to_ds = true;
@@ -2154,6 +2154,9 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
        if (!enable)
                goto out;
 
+       /* starec hdr trans */
+       mt7996_mcu_sta_hdr_trans_tlv(dev, skb, vif, sta);
+
        /* tag order is in accordance with firmware dependency. */
        if (sta) {
                /* starec hdrt mode */
@@ -2178,8 +2181,6 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
                mt7996_mcu_sta_muru_tlv(dev, skb, vif, sta);
                /* starec bfee */
                mt7996_mcu_sta_bfee_tlv(dev, skb, vif, sta);
-               /* starec hdr trans */
-               mt7996_mcu_sta_hdr_trans_tlv(dev, skb, vif, sta);
        }
 
        ret = mt7996_mcu_add_group(dev, vif, sta);