wifi: rtw89: introduce entity mode and its recalculated prototype
authorZong-Zhe Yang <kevin_yang@realtek.com>
Tue, 9 Aug 2022 10:49:49 +0000 (18:49 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 2 Sep 2022 08:29:02 +0000 (11:29 +0300)
After supporting more than one channel, we need entity mode to decide
how to set current channel(s) on the sub-entities. This decision may
happen on set_channel() and rtw89_core_set_chip_txpwr().

For now, we support single one channel and use only first HW entry,
i.e. RTW89_SUB_ENTITY_0, RTW89_MAC_0, RTW89_PHY_0. Without something
unexpected, the entity mode should always be RTW89_ENT_MODE_SCC after
recalcated, where SCC means single channel concurrency. So, an assert
is added in set_channel() and rtw89_core_set_chip_txpwr().

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://lore.kernel.org/r/20220809104952.61355-11-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/chan.c
drivers/net/wireless/realtek/rtw89/chan.h
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h

index e0f1c89..02d31f7 100644 (file)
@@ -3,6 +3,7 @@
  */
 
 #include "chan.h"
+#include "debug.h"
 
 static enum rtw89_subband rtw89_get_subband_type(enum rtw89_band band,
                                                 u8 center_chan)
@@ -154,3 +155,27 @@ void rtw89_entity_init(struct rtw89_dev *rtwdev)
        bitmap_zero(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
        rtw89_config_default_chandef(rtwdev);
 }
+
+enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_hal *hal = &rtwdev->hal;
+       enum rtw89_entity_mode mode;
+       u8 weight;
+
+       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);
+               fallthrough;
+       case 0:
+               rtw89_config_default_chandef(rtwdev);
+               fallthrough;
+       case 1:
+               mode = RTW89_ENTITY_MODE_SCC;
+               break;
+       }
+
+       rtw89_set_entity_mode(rtwdev, mode);
+       return mode;
+}
index 9c714f0..6b2b5cc 100644 (file)
@@ -21,6 +21,22 @@ static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev, bool active)
        WRITE_ONCE(hal->entity_active, active);
 }
 
+static inline
+enum rtw89_entity_mode rtw89_get_entity_mode(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_hal *hal = &rtwdev->hal;
+
+       return READ_ONCE(hal->entity_mode);
+}
+
+static inline void rtw89_set_entity_mode(struct rtw89_dev *rtwdev,
+                                        enum rtw89_entity_mode mode)
+{
+       struct rtw89_hal *hal = &rtwdev->hal;
+
+       WRITE_ONCE(hal->entity_mode, mode);
+}
+
 void rtw89_chan_create(struct rtw89_chan *chan, u8 center_chan, u8 primary_chan,
                       enum rtw89_band band, enum rtw89_bandwidth bandwidth);
 bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
@@ -30,5 +46,6 @@ void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
                                 enum rtw89_sub_entity_idx idx,
                                 const struct cfg80211_chan_def *chandef);
 void rtw89_entity_init(struct rtw89_dev *rtwdev);
+enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev);
 
 #endif
index 04ba705..dea4280 100644 (file)
@@ -295,51 +295,69 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
 {
        const struct rtw89_chip_info *chip = rtwdev->chip;
        const struct rtw89_chan *chan;
+       enum rtw89_sub_entity_idx sub_entity_idx;
+       enum rtw89_phy_idx phy_idx;
+       enum rtw89_entity_mode mode;
        bool entity_active;
 
        entity_active = rtw89_get_entity_state(rtwdev);
        if (!entity_active)
                return;
 
-       chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       mode = rtw89_get_entity_mode(rtwdev);
+       if (WARN(mode != RTW89_ENTITY_MODE_SCC, "Invalid ent mode: %d\n", mode))
+               return;
+
+       sub_entity_idx = RTW89_SUB_ENTITY_0;
+       phy_idx = RTW89_PHY_0;
+       chan = rtw89_chan_get(rtwdev, sub_entity_idx);
        if (chip->ops->set_txpwr)
-               chip->ops->set_txpwr(rtwdev, chan, RTW89_PHY_0);
+               chip->ops->set_txpwr(rtwdev, chan, phy_idx);
 }
 
 void rtw89_set_channel(struct rtw89_dev *rtwdev)
 {
-       const struct cfg80211_chan_def *chandef =
-               rtw89_chandef_get(rtwdev, RTW89_SUB_ENTITY_0);
        const struct rtw89_chip_info *chip = rtwdev->chip;
+       const struct cfg80211_chan_def *chandef;
+       enum rtw89_sub_entity_idx sub_entity_idx;
+       enum rtw89_mac_idx mac_idx;
+       enum rtw89_phy_idx phy_idx;
        struct rtw89_chan chan;
        struct rtw89_channel_help_params bak;
+       enum rtw89_entity_mode mode;
        bool band_changed;
        bool entity_active;
 
        entity_active = rtw89_get_entity_state(rtwdev);
 
+       mode = rtw89_entity_recalc(rtwdev);
+       if (WARN(mode != RTW89_ENTITY_MODE_SCC, "Invalid ent mode: %d\n", mode))
+               return;
+
+       sub_entity_idx = RTW89_SUB_ENTITY_0;
+       mac_idx = RTW89_MAC_0;
+       phy_idx = RTW89_PHY_0;
+       chandef = rtw89_chandef_get(rtwdev, sub_entity_idx);
        rtw89_get_channel_params(chandef, &chan);
        if (WARN(chan.channel == 0, "Invalid channel\n"))
                return;
 
-       band_changed = rtw89_assign_entity_chan(rtwdev, RTW89_SUB_ENTITY_0, &chan);
-
-       rtw89_set_entity_state(rtwdev, true);
+       band_changed = rtw89_assign_entity_chan(rtwdev, sub_entity_idx, &chan);
 
-       rtw89_chip_set_channel_prepare(rtwdev, &bak, &chan,
-                                      RTW89_MAC_0, RTW89_PHY_0);
+       rtw89_chip_set_channel_prepare(rtwdev, &bak, &chan, mac_idx, phy_idx);
 
-       chip->ops->set_channel(rtwdev, &chan, RTW89_MAC_0, RTW89_PHY_0);
+       chip->ops->set_channel(rtwdev, &chan, mac_idx, phy_idx);
 
        rtw89_core_set_chip_txpwr(rtwdev);
 
-       rtw89_chip_set_channel_done(rtwdev, &bak, &chan,
-                                   RTW89_MAC_0, RTW89_PHY_0);
+       rtw89_chip_set_channel_done(rtwdev, &bak, &chan, mac_idx, phy_idx);
 
        if (!entity_active || band_changed) {
-               rtw89_btc_ntfy_switch_band(rtwdev, RTW89_PHY_0, chan.band_type);
-               rtw89_chip_rfk_band_changed(rtwdev, RTW89_PHY_0);
+               rtw89_btc_ntfy_switch_band(rtwdev, phy_idx, chan.band_type);
+               rtw89_chip_rfk_band_changed(rtwdev, phy_idx);
        }
+
+       rtw89_set_entity_state(rtwdev, true);
 }
 
 static enum rtw89_core_tx_type
index 3b6660d..96af628 100644 (file)
@@ -2623,6 +2623,10 @@ struct rtw89_sar_info {
        };
 };
 
+enum rtw89_entity_mode {
+       RTW89_ENTITY_MODE_SCC,
+};
+
 struct rtw89_hal {
        u32 rx_fltr;
        u8 cv;
@@ -2638,6 +2642,7 @@ struct rtw89_hal {
        struct cfg80211_chan_def chandef[NUM_OF_RTW89_SUB_ENTITY];
 
        bool entity_active;
+       enum rtw89_entity_mode entity_mode;
 
        struct rtw89_chan chan[NUM_OF_RTW89_SUB_ENTITY];
        struct rtw89_chan_rcd chan_rcd[NUM_OF_RTW89_SUB_ENTITY];