]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: use separated function to set RX filter
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 13 Nov 2025 05:34:59 +0000 (13:34 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 18 Nov 2025 01:57:40 +0000 (09:57 +0800)
Normally use rtw89_write32_mask() with a consecutive bit mask, but mask of
RX filter B_AX_RX_FLTR_CFG_MASK is bits 31-22 and 15-0, which excludes bits
of B_AX_RX_MPDU_MAX_LEN_MASK (bits 21-16).

Though the original logic is well to set RX filter, change it to a separate
function to avoid the tricky design.

Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://patch.msgid.link/20251113053459.34995-1-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac80211.c

index 8078c9aa0ac89c9aa3ac416cf438ebf11c47fa1f..0824940c91aee1c1e880489f4b2d217ec96f8e61 100644 (file)
@@ -4173,12 +4173,10 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 
 void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
 {
-       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        struct ieee80211_hw *hw = rtwdev->hw;
        struct rtw89_roc *roc = &rtwvif->roc;
        struct rtw89_vif_link *rtwvif_link;
        struct rtw89_vif *tmp_vif;
-       u32 reg;
        int ret;
 
        lockdep_assert_wiphy(hw->wiphy);
@@ -4195,8 +4193,7 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
                return;
        }
 
-       reg = rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, rtwvif_link->mac_idx);
-       rtw89_write32_mask(rtwdev, reg, B_AX_RX_FLTR_CFG_MASK, rtwdev->hal.rx_fltr);
+       rtw89_mac_set_rx_fltr(rtwdev, rtwvif_link->mac_idx, rtwdev->hal.rx_fltr);
 
        roc->state = RTW89_ROC_IDLE;
        rtw89_config_roc_chandef(rtwdev, rtwvif_link, NULL);
index 18eab404885c1b7051b6a91e892f05b88acfed30..d50c35328363d4c8f98cc435bf0caa3860b6967f 100644 (file)
@@ -8103,7 +8103,6 @@ int rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
                        struct rtw89_vif_link *rtwvif_link,
                        struct ieee80211_scan_request *scan_req)
 {
-       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        enum rtw89_entity_mode mode = rtw89_get_entity_mode(rtwdev);
        struct cfg80211_scan_request *req = &scan_req->req;
        const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
@@ -8115,7 +8114,6 @@ int rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
        };
        u32 rx_fltr = rtwdev->hal.rx_fltr;
        u8 mac_addr[ETH_ALEN];
-       u32 reg;
        int ret;
 
        /* clone op and keep it during scan */
@@ -8155,8 +8153,7 @@ int rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
        rx_fltr &= ~B_AX_A_BC;
        rx_fltr &= ~B_AX_A_A1_MATCH;
 
-       reg = rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, rtwvif_link->mac_idx);
-       rtw89_write32_mask(rtwdev, reg, B_AX_RX_FLTR_CFG_MASK, rx_fltr);
+       rtw89_mac_set_rx_fltr(rtwdev, rtwvif_link->mac_idx, rx_fltr);
 
        rtw89_chanctx_pause(rtwdev, &pause_parm);
        rtw89_phy_dig_suspend(rtwdev);
@@ -8174,20 +8171,17 @@ struct rtw89_hw_scan_complete_cb_data {
 
 static int rtw89_hw_scan_complete_cb(struct rtw89_dev *rtwdev, void *data)
 {
-       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        enum rtw89_entity_mode mode = rtw89_get_entity_mode(rtwdev);
        struct rtw89_hw_scan_complete_cb_data *cb_data = data;
        struct rtw89_vif_link *rtwvif_link = cb_data->rtwvif_link;
        struct cfg80211_scan_info info = {
                .aborted = cb_data->aborted,
        };
-       u32 reg;
 
        if (!rtwvif_link)
                return -EINVAL;
 
-       reg = rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, rtwvif_link->mac_idx);
-       rtw89_write32_mask(rtwdev, reg, B_AX_RX_FLTR_CFG_MASK, rtwdev->hal.rx_fltr);
+       rtw89_mac_set_rx_fltr(rtwdev, rtwvif_link->mac_idx, rtwdev->hal.rx_fltr);
 
        rtw89_core_scan_complete(rtwdev, rtwvif_link, true);
        ieee80211_scan_completed(rtwdev->hw, &info);
index bde3791dd3309a10c13f58df72e75a0673576978..d78fbe73e365775326c9c4a8ad99bf3394950a19 100644 (file)
@@ -2543,6 +2543,20 @@ static int rtw89_mac_typ_fltr_opt_ax(struct rtw89_dev *rtwdev,
        return 0;
 }
 
+void rtw89_mac_set_rx_fltr(struct rtw89_dev *rtwdev, u8 mac_idx, u32 rx_fltr)
+{
+       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+       u32 reg;
+       u32 val;
+
+       reg = rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, mac_idx);
+
+       val = rtw89_read32(rtwdev, reg);
+       /* B_AX_RX_FLTR_CFG_MASK is not a consecutive bit mask */
+       val = (val & ~B_AX_RX_FLTR_CFG_MASK) | (rx_fltr & B_AX_RX_FLTR_CFG_MASK);
+       rtw89_write32(rtwdev, reg, val);
+}
+
 static int rx_fltr_init_ax(struct rtw89_dev *rtwdev, u8 mac_idx)
 {
        int ret, i;
index d203db444a3493e351210815a98f62c6680cef7b..0007229d675378a483cf5875d9e14fee327ab20c 100644 (file)
@@ -1340,6 +1340,7 @@ int rtw89_mac_cfg_ppdu_status_bands(struct rtw89_dev *rtwdev, bool enable)
        return rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_1, enable);
 }
 
+void rtw89_mac_set_rx_fltr(struct rtw89_dev *rtwdev, u8 mac_idx, u32 rx_fltr);
 void rtw89_mac_update_rts_threshold(struct rtw89_dev *rtwdev);
 void rtw89_mac_flush_txq(struct rtw89_dev *rtwdev, u32 queues, bool drop);
 int rtw89_mac_coex_init(struct rtw89_dev *rtwdev, const struct rtw89_mac_ax_coex *coex);
index 82598673ddec544dc8a0d539b8e705b2001fb700..f39ca1c2ed100f72c7a18ceaf7cf961955b3e917 100644 (file)
@@ -307,7 +307,6 @@ static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,
                                       u64 multicast)
 {
        struct rtw89_dev *rtwdev = hw->priv;
-       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        u32 rx_fltr;
 
        lockdep_assert_wiphy(hw->wiphy);
@@ -369,16 +368,10 @@ static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,
                rx_fltr &= ~B_AX_A_A1_MATCH;
        }
 
-       rtw89_write32_mask(rtwdev,
-                          rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
-                          B_AX_RX_FLTR_CFG_MASK,
-                          rx_fltr);
+       rtw89_mac_set_rx_fltr(rtwdev, RTW89_MAC_0, rx_fltr);
        if (!rtwdev->dbcc_en)
                return;
-       rtw89_write32_mask(rtwdev,
-                          rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_1),
-                          B_AX_RX_FLTR_CFG_MASK,
-                          rx_fltr);
+       rtw89_mac_set_rx_fltr(rtwdev, RTW89_MAC_1, rx_fltr);
 }
 
 static const u8 ac_to_fw_idx[IEEE80211_NUM_ACS] = {