Commit 967439c7 authored by Zong-Zhe Yang's avatar Zong-Zhe Yang Committed by Kalle Valo

wifi: rtw89: rewrite decision on channel by entity state

We need to invoke the callback of the changed band at the first
set_channel() after every power-off. Originally, we forced the
channel to be 0 when doing power-off, and then determined things
by comparing channel with 0.

However, deciding on such things by channel might be confusing.
It's also confusing to use this kind of decision when we consider
multiple channels in the follow-up patches. So, another flag,
entity_active, is added ahead to HAL to deal with this.

Besides, we also need to check if entity is active when we set
TX power.
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-2-pkshih@realtek.com
parent 8d40a13b
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
* Copyright(c) 2020-2022 Realtek Corporation
*/
#ifndef __RTW89_CHAN_H__
#define __RTW89_CHAN_H__
#include "core.h"
static inline bool rtw89_get_entity_state(struct rtw89_dev *rtwdev)
{
struct rtw89_hal *hal = &rtwdev->hal;
return READ_ONCE(hal->entity_active);
}
static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev, bool active)
{
struct rtw89_hal *hal = &rtwdev->hal;
WRITE_ONCE(hal->entity_active, active);
}
#endif
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/udp.h> #include <linux/udp.h>
#include "cam.h" #include "cam.h"
#include "chan.h"
#include "coex.h" #include "coex.h"
#include "core.h" #include "core.h"
#include "efuse.h" #include "efuse.h"
...@@ -352,6 +353,19 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef, ...@@ -352,6 +353,19 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
chan_param->subband_type = subband; chan_param->subband_type = subband;
} }
void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
bool entity_active;
entity_active = rtw89_get_entity_state(rtwdev);
if (!entity_active)
return;
if (chip->ops->set_txpwr)
chip->ops->set_txpwr(rtwdev);
}
void rtw89_set_channel(struct rtw89_dev *rtwdev) void rtw89_set_channel(struct rtw89_dev *rtwdev)
{ {
struct ieee80211_hw *hw = rtwdev->hw; struct ieee80211_hw *hw = rtwdev->hw;
...@@ -361,6 +375,9 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev) ...@@ -361,6 +375,9 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev)
struct rtw89_channel_help_params bak; struct rtw89_channel_help_params bak;
u8 center_chan, bandwidth; u8 center_chan, bandwidth;
bool band_changed; bool band_changed;
bool entity_active;
entity_active = rtw89_get_entity_state(rtwdev);
rtw89_get_channel_params(&hw->conf.chandef, &ch_param); rtw89_get_channel_params(&hw->conf.chandef, &ch_param);
if (WARN(ch_param.center_chan == 0, "Invalid channel\n")) if (WARN(ch_param.center_chan == 0, "Invalid channel\n"))
...@@ -368,8 +385,7 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev) ...@@ -368,8 +385,7 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev)
center_chan = ch_param.center_chan; center_chan = ch_param.center_chan;
bandwidth = ch_param.bandwidth; bandwidth = ch_param.bandwidth;
band_changed = hal->current_band_type != ch_param.band_type || band_changed = hal->current_band_type != ch_param.band_type;
hal->current_channel == 0;
hal->current_band_width = bandwidth; hal->current_band_width = bandwidth;
hal->current_channel = center_chan; hal->current_channel = center_chan;
...@@ -380,15 +396,17 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev) ...@@ -380,15 +396,17 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev)
hal->current_band_type = ch_param.band_type; hal->current_band_type = ch_param.band_type;
hal->current_subband = ch_param.subband_type; hal->current_subband = ch_param.subband_type;
rtw89_set_entity_state(rtwdev, true);
rtw89_chip_set_channel_prepare(rtwdev, &bak); rtw89_chip_set_channel_prepare(rtwdev, &bak);
chip->ops->set_channel(rtwdev, &ch_param); chip->ops->set_channel(rtwdev, &ch_param);
rtw89_chip_set_txpwr(rtwdev); rtw89_core_set_chip_txpwr(rtwdev);
rtw89_chip_set_channel_done(rtwdev, &bak); rtw89_chip_set_channel_done(rtwdev, &bak);
if (band_changed) { if (!entity_active || band_changed) {
rtw89_btc_ntfy_switch_band(rtwdev, RTW89_PHY_0, hal->current_band_type); rtw89_btc_ntfy_switch_band(rtwdev, RTW89_PHY_0, hal->current_band_type);
rtw89_chip_rfk_band_changed(rtwdev); rtw89_chip_rfk_band_changed(rtwdev);
} }
......
...@@ -2617,6 +2617,8 @@ struct rtw89_hal { ...@@ -2617,6 +2617,8 @@ struct rtw89_hal {
u8 rx_nss; u8 rx_nss;
bool support_cckpd; bool support_cckpd;
bool support_igi; bool support_igi;
bool entity_active;
}; };
#define RTW89_MAX_MAC_ID_NUM 128 #define RTW89_MAX_MAC_ID_NUM 128
...@@ -3664,18 +3666,6 @@ static inline void rtw89_chip_set_txpwr_ctrl(struct rtw89_dev *rtwdev) ...@@ -3664,18 +3666,6 @@ static inline void rtw89_chip_set_txpwr_ctrl(struct rtw89_dev *rtwdev)
chip->ops->set_txpwr_ctrl(rtwdev); chip->ops->set_txpwr_ctrl(rtwdev);
} }
static inline void rtw89_chip_set_txpwr(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
u8 ch = rtwdev->hal.current_channel;
if (!ch)
return;
if (chip->ops->set_txpwr)
chip->ops->set_txpwr(rtwdev);
}
static inline void rtw89_chip_power_trim(struct rtw89_dev *rtwdev) static inline void rtw89_chip_power_trim(struct rtw89_dev *rtwdev)
{ {
const struct rtw89_chip_info *chip = rtwdev->chip; const struct rtw89_chip_info *chip = rtwdev->chip;
...@@ -3906,6 +3896,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev); ...@@ -3906,6 +3896,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev);
void rtw89_core_deinit(struct rtw89_dev *rtwdev); void rtw89_core_deinit(struct rtw89_dev *rtwdev);
int rtw89_core_register(struct rtw89_dev *rtwdev); int rtw89_core_register(struct rtw89_dev *rtwdev);
void rtw89_core_unregister(struct rtw89_dev *rtwdev); void rtw89_core_unregister(struct rtw89_dev *rtwdev);
void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev);
void rtw89_set_channel(struct rtw89_dev *rtwdev); void rtw89_set_channel(struct rtw89_dev *rtwdev);
u8 rtw89_core_acquire_bit_map(unsigned long *addr, unsigned long size); u8 rtw89_core_acquire_bit_map(unsigned long *addr, unsigned long size);
void rtw89_core_release_bit_map(unsigned long *addr, u8 bit); void rtw89_core_release_bit_map(unsigned long *addr, u8 bit);
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
*/ */
#include "cam.h" #include "cam.h"
#include "chan.h"
#include "debug.h" #include "debug.h"
#include "fw.h" #include "fw.h"
#include "mac.h" #include "mac.h"
...@@ -1081,7 +1082,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on) ...@@ -1081,7 +1082,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
const struct rtw89_chip_info *chip = rtwdev->chip; const struct rtw89_chip_info *chip = rtwdev->chip;
const struct rtw89_pwr_cfg * const *cfg_seq; const struct rtw89_pwr_cfg * const *cfg_seq;
int (*cfg_func)(struct rtw89_dev *rtwdev); int (*cfg_func)(struct rtw89_dev *rtwdev);
struct rtw89_hal *hal = &rtwdev->hal;
int ret; int ret;
u8 val; u8 val;
...@@ -1113,7 +1113,7 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on) ...@@ -1113,7 +1113,7 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
clear_bit(RTW89_FLAG_POWERON, rtwdev->flags); clear_bit(RTW89_FLAG_POWERON, rtwdev->flags);
clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags); clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags);
rtw89_write8(rtwdev, R_AX_SCOREBOARD + 3, MAC_AX_NOTIFY_PWR_MAJOR); rtw89_write8(rtwdev, R_AX_SCOREBOARD + 3, MAC_AX_NOTIFY_PWR_MAJOR);
hal->current_channel = 0; rtw89_set_entity_state(rtwdev, false);
} }
return 0; return 0;
......
...@@ -346,7 +346,7 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request ...@@ -346,7 +346,7 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request
rtw89_debug_regd(rtwdev, rtwdev->regd, "get from initiator %d, alpha2", rtw89_debug_regd(rtwdev, rtwdev->regd, "get from initiator %d, alpha2",
request->initiator); request->initiator);
rtw89_chip_set_txpwr(rtwdev); rtw89_core_set_chip_txpwr(rtwdev);
exit: exit:
mutex_unlock(&rtwdev->mutex); mutex_unlock(&rtwdev->mutex);
......
...@@ -228,7 +228,7 @@ static int rtw89_apply_sar_common(struct rtw89_dev *rtwdev, ...@@ -228,7 +228,7 @@ static int rtw89_apply_sar_common(struct rtw89_dev *rtwdev,
} }
rtw89_sar_set_src(rtwdev, RTW89_SAR_SOURCE_COMMON, cfg_common, sar); rtw89_sar_set_src(rtwdev, RTW89_SAR_SOURCE_COMMON, cfg_common, sar);
rtw89_chip_set_txpwr(rtwdev); rtw89_core_set_chip_txpwr(rtwdev);
exit: exit:
mutex_unlock(&rtwdev->mutex); mutex_unlock(&rtwdev->mutex);
......
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