Commit 7cf674ff authored by Zong-Zhe Yang's avatar Zong-Zhe Yang Committed by Kalle Valo

wifi: rtw89: introduce entity mode and its recalculated prototype

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: default avatarZong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220809104952.61355-11-pkshih@realtek.com
parent a88b6cc4
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
*/ */
#include "chan.h" #include "chan.h"
#include "debug.h"
static enum rtw89_subband rtw89_get_subband_type(enum rtw89_band band, static enum rtw89_subband rtw89_get_subband_type(enum rtw89_band band,
u8 center_chan) u8 center_chan)
...@@ -154,3 +155,27 @@ void rtw89_entity_init(struct rtw89_dev *rtwdev) ...@@ -154,3 +155,27 @@ void rtw89_entity_init(struct rtw89_dev *rtwdev)
bitmap_zero(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY); bitmap_zero(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
rtw89_config_default_chandef(rtwdev); 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;
}
...@@ -21,6 +21,22 @@ static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev, bool active) ...@@ -21,6 +21,22 @@ static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev, bool active)
WRITE_ONCE(hal->entity_active, 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, void rtw89_chan_create(struct rtw89_chan *chan, u8 center_chan, u8 primary_chan,
enum rtw89_band band, enum rtw89_bandwidth bandwidth); enum rtw89_band band, enum rtw89_bandwidth bandwidth);
bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev, bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
...@@ -30,5 +46,6 @@ void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev, ...@@ -30,5 +46,6 @@ void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
enum rtw89_sub_entity_idx idx, enum rtw89_sub_entity_idx idx,
const struct cfg80211_chan_def *chandef); const struct cfg80211_chan_def *chandef);
void rtw89_entity_init(struct rtw89_dev *rtwdev); void rtw89_entity_init(struct rtw89_dev *rtwdev);
enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev);
#endif #endif
...@@ -295,51 +295,69 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev) ...@@ -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_chip_info *chip = rtwdev->chip;
const struct rtw89_chan *chan; 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; bool entity_active;
entity_active = rtw89_get_entity_state(rtwdev); entity_active = rtw89_get_entity_state(rtwdev);
if (!entity_active) if (!entity_active)
return; 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) 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) 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 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_chan chan;
struct rtw89_channel_help_params bak; struct rtw89_channel_help_params bak;
enum rtw89_entity_mode mode;
bool band_changed; bool band_changed;
bool entity_active; bool entity_active;
entity_active = rtw89_get_entity_state(rtwdev); 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); rtw89_get_channel_params(chandef, &chan);
if (WARN(chan.channel == 0, "Invalid channel\n")) if (WARN(chan.channel == 0, "Invalid channel\n"))
return; return;
band_changed = rtw89_assign_entity_chan(rtwdev, RTW89_SUB_ENTITY_0, &chan); band_changed = rtw89_assign_entity_chan(rtwdev, sub_entity_idx, &chan);
rtw89_set_entity_state(rtwdev, true);
rtw89_chip_set_channel_prepare(rtwdev, &bak, &chan, rtw89_chip_set_channel_prepare(rtwdev, &bak, &chan, mac_idx, phy_idx);
RTW89_MAC_0, RTW89_PHY_0);
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_core_set_chip_txpwr(rtwdev);
rtw89_chip_set_channel_done(rtwdev, &bak, &chan, rtw89_chip_set_channel_done(rtwdev, &bak, &chan, mac_idx, phy_idx);
RTW89_MAC_0, RTW89_PHY_0);
if (!entity_active || band_changed) { if (!entity_active || band_changed) {
rtw89_btc_ntfy_switch_band(rtwdev, RTW89_PHY_0, chan.band_type); rtw89_btc_ntfy_switch_band(rtwdev, phy_idx, chan.band_type);
rtw89_chip_rfk_band_changed(rtwdev, RTW89_PHY_0); rtw89_chip_rfk_band_changed(rtwdev, phy_idx);
} }
rtw89_set_entity_state(rtwdev, true);
} }
static enum rtw89_core_tx_type static enum rtw89_core_tx_type
......
...@@ -2623,6 +2623,10 @@ struct rtw89_sar_info { ...@@ -2623,6 +2623,10 @@ struct rtw89_sar_info {
}; };
}; };
enum rtw89_entity_mode {
RTW89_ENTITY_MODE_SCC,
};
struct rtw89_hal { struct rtw89_hal {
u32 rx_fltr; u32 rx_fltr;
u8 cv; u8 cv;
...@@ -2638,6 +2642,7 @@ struct rtw89_hal { ...@@ -2638,6 +2642,7 @@ struct rtw89_hal {
struct cfg80211_chan_def chandef[NUM_OF_RTW89_SUB_ENTITY]; struct cfg80211_chan_def chandef[NUM_OF_RTW89_SUB_ENTITY];
bool entity_active; bool entity_active;
enum rtw89_entity_mode entity_mode;
struct rtw89_chan chan[NUM_OF_RTW89_SUB_ENTITY]; struct rtw89_chan chan[NUM_OF_RTW89_SUB_ENTITY];
struct rtw89_chan_rcd chan_rcd[NUM_OF_RTW89_SUB_ENTITY]; struct rtw89_chan_rcd chan_rcd[NUM_OF_RTW89_SUB_ENTITY];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment