]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: handle entity active flag per PHY
authorZong-Zhe Yang <kevin_yang@realtek.com>
Wed, 25 Sep 2024 02:01:19 +0000 (10:01 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 1 Oct 2024 13:03:05 +0000 (21:03 +0800)
Originally, we have an active flag to record whether we have set PHY once.
After impending MLO support, there will be dual-PHY and they can be set
individually on Wi-Fi 7 chips. So, we now have active flag per PHY and
handle them individually.

Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240925020119.13170-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/chan.h
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/mac.c

index 4ed777ea5064859a78a4feaed44f25b6a0b76df9..74de13a2e7da900e5a9d9fc7d293c8cc930ddfc5 100644 (file)
@@ -43,18 +43,21 @@ struct rtw89_entity_weight {
        unsigned int active_roles;
 };
 
-static inline bool rtw89_get_entity_state(struct rtw89_dev *rtwdev)
+static inline bool rtw89_get_entity_state(struct rtw89_dev *rtwdev,
+                                         enum rtw89_phy_idx phy_idx)
 {
        struct rtw89_hal *hal = &rtwdev->hal;
 
-       return READ_ONCE(hal->entity_active);
+       return READ_ONCE(hal->entity_active[phy_idx]);
 }
 
-static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev, bool active)
+static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev,
+                                         enum rtw89_phy_idx phy_idx,
+                                         bool active)
 {
        struct rtw89_hal *hal = &rtwdev->hal;
 
-       WRITE_ONCE(hal->entity_active, active);
+       WRITE_ONCE(hal->entity_active[phy_idx], active);
 }
 
 static inline
index 6200755b5ce9e506d4861251a7b3e5abcdd54eb4..e5dc6d36245d1796db405cd3d5a5bf6ab4c682d0 100644 (file)
@@ -352,10 +352,6 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
        enum rtw89_entity_mode mode;
        bool entity_active;
 
-       entity_active = rtw89_get_entity_state(rtwdev);
-       if (!entity_active)
-               return;
-
        mode = rtw89_get_entity_mode(rtwdev);
        switch (mode) {
        case RTW89_ENTITY_MODE_SCC:
@@ -375,6 +371,11 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
                chanctx_idx = roc_idx;
 
        phy_idx = RTW89_PHY_0;
+
+       entity_active = rtw89_get_entity_state(rtwdev, phy_idx);
+       if (!entity_active)
+               return;
+
        chan = rtw89_chan_get(rtwdev, chanctx_idx);
        chip->ops->set_txpwr(rtwdev, chan, phy_idx);
 }
@@ -393,8 +394,6 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)
        enum rtw89_entity_mode mode;
        bool entity_active;
 
-       entity_active = rtw89_get_entity_state(rtwdev);
-
        mode = rtw89_entity_recalc(rtwdev);
        switch (mode) {
        case RTW89_ENTITY_MODE_SCC:
@@ -416,6 +415,8 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)
        mac_idx = RTW89_MAC_0;
        phy_idx = RTW89_PHY_0;
 
+       entity_active = rtw89_get_entity_state(rtwdev, phy_idx);
+
        chan = rtw89_chan_get(rtwdev, chanctx_idx);
        chan_rcd = rtw89_chan_rcd_get(rtwdev, chanctx_idx);
 
@@ -432,7 +433,7 @@ int rtw89_set_channel(struct rtw89_dev *rtwdev)
                rtw89_chip_rfk_band_changed(rtwdev, phy_idx, chan);
        }
 
-       rtw89_set_entity_state(rtwdev, true);
+       rtw89_set_entity_state(rtwdev, phy_idx, true);
        return 0;
 }
 
index f1f10b7b07318df89cab2afa82b068f9448548ed..598eee12339e76fa167283c7f6f408f500daa4d9 100644 (file)
@@ -4669,7 +4669,7 @@ struct rtw89_hal {
        struct rtw89_chanctx chanctx[NUM_OF_RTW89_CHANCTX];
        struct cfg80211_chan_def roc_chandef;
 
-       bool entity_active;
+       bool entity_active[RTW89_PHY_MAX];
        bool entity_pause;
        enum rtw89_entity_mode entity_mode;
 
index 6a0262e512ea4ced3acf66d7e98b29d1c982e799..b3f4170030870d575facb98050757bc98103d7bb 100644 (file)
@@ -1483,7 +1483,8 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
                clear_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags);
                clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags);
                rtw89_write8(rtwdev, R_AX_SCOREBOARD + 3, MAC_AX_NOTIFY_PWR_MAJOR);
-               rtw89_set_entity_state(rtwdev, false);
+               rtw89_set_entity_state(rtwdev, RTW89_PHY_0, false);
+               rtw89_set_entity_state(rtwdev, RTW89_PHY_1, false);
        }
 
        return 0;