wifi: rtw89: chan: tweak bitmap recalc ahead before MLO
authorZong-Zhe Yang <kevin_yang@realtek.com>
Tue, 6 Feb 2024 03:06:21 +0000 (11:06 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 12 Feb 2024 15:37:09 +0000 (17:37 +0200)
Originally, we just declared two sub-entity, and according to rolling
down mechanism, we ensured that index 0 contained sub-entity as long
as there are sub-entity. So, we could use for-loop after deciding the
last index.

But, we are preparing to expand num of sub-entity for MLO. Then, there
won't be just two sub-entity. And, there might be holes between two bits
in the bitmap. So, we cannot simply do for-loop as before. Instead, we
need to follow the set bits.

Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240206030624.23382-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/chan.c

index 11d46878f51ee8163a2ae73a06b8acf930633b22..6a666a92b59b0271622f05b4c756c1e05e39efc3 100644 (file)
@@ -214,31 +214,32 @@ void rtw89_entity_init(struct rtw89_dev *rtwdev)
 
 enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
 {
+       DECLARE_BITMAP(recalc_map, NUM_OF_RTW89_SUB_ENTITY) = {};
        struct rtw89_hal *hal = &rtwdev->hal;
        const struct cfg80211_chan_def *chandef;
        enum rtw89_entity_mode mode;
        struct rtw89_chan chan;
        u8 weight;
-       u8 last;
        u8 idx;
 
        lockdep_assert_held(&rtwdev->mutex);
 
+       bitmap_copy(recalc_map, hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
+
        weight = bitmap_weight(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
        switch (weight) {
        default:
                rtw89_warn(rtwdev, "unknown ent chan weight: %d\n", weight);
-               bitmap_zero(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
+               bitmap_zero(recalc_map, NUM_OF_RTW89_SUB_ENTITY);
                fallthrough;
        case 0:
                rtw89_config_default_chandef(rtwdev);
+               set_bit(RTW89_SUB_ENTITY_0, recalc_map);
                fallthrough;
        case 1:
-               last = RTW89_SUB_ENTITY_0;
                mode = RTW89_ENTITY_MODE_SCC;
                break;
        case 2:
-               last = RTW89_SUB_ENTITY_1;
                mode = rtw89_get_entity_mode(rtwdev);
                if (mode == RTW89_ENTITY_MODE_MCC)
                        break;
@@ -247,7 +248,7 @@ enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
                break;
        }
 
-       for (idx = 0; idx <= last; idx++) {
+       for_each_set_bit(idx, recalc_map, NUM_OF_RTW89_SUB_ENTITY) {
                chandef = rtw89_chandef_get(rtwdev, idx);
                rtw89_get_channel_params(chandef, &chan);
                if (chan.channel == 0) {