mirror of
https://github.com/armbian/build.git
synced 2025-08-11 05:36:57 +02:00
* sunxi-6.0: update upstream megous patches to tag orange-pi-6.0-20221105-1830 * sunxi-6.0: rebase to v6.0.8 * sunxi-6.0: switch to v6.0.8
181 lines
6.5 KiB
Diff
181 lines
6.5 KiB
Diff
From 7169237fb40ddbbca1fd987879fc77a5e7136d68 Mon Sep 17 00:00:00 2001
|
|
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
|
Date: Tue, 9 Aug 2022 18:49:47 +0800
|
|
Subject: [PATCH 399/484] wifi: rtw89: concentrate chandef setting to stack
|
|
callback
|
|
|
|
Originally, we didn't support mac80211 chanctx, so it's expected that
|
|
ieee80211_hw::conf::chandef would be filled by mac80211. And then, we
|
|
could just query it whenever we need the current chandef.
|
|
|
|
However, we are planing to support mac80211 chanctx. After that, the
|
|
above assumption would be broken. So, we adjust a bit ahead to reduce
|
|
future works about mac80211 chanctx.
|
|
|
|
After this, we don't query ieee80211_hw::conf::chandef directly, and
|
|
we add a map, entity_map, to HAL to indicate which chandef came from
|
|
stack. And it will later be used to recalcate entity mode.
|
|
|
|
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-9-pkshih@realtek.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw89/chan.c | 20 +++++++++++++++++++
|
|
drivers/net/wireless/realtek/rtw89/chan.h | 3 +++
|
|
drivers/net/wireless/realtek/rtw89/core.c | 14 +++++++------
|
|
drivers/net/wireless/realtek/rtw89/core.h | 12 +++++++++++
|
|
drivers/net/wireless/realtek/rtw89/mac80211.c | 6 +++++-
|
|
5 files changed, 48 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/chan.c b/drivers/net/wireless/realtek/rtw89/chan.c
|
|
index 0bf27a344..a9f0133f8 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/chan.c
|
|
+++ b/drivers/net/wireless/realtek/rtw89/chan.c
|
|
@@ -118,3 +118,23 @@ bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
|
|
*chan = *new;
|
|
return band_changed;
|
|
}
|
|
+
|
|
+static void __rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
|
|
+ enum rtw89_sub_entity_idx idx,
|
|
+ const struct cfg80211_chan_def *chandef,
|
|
+ bool from_stack)
|
|
+{
|
|
+ struct rtw89_hal *hal = &rtwdev->hal;
|
|
+
|
|
+ hal->chandef[idx] = *chandef;
|
|
+
|
|
+ if (from_stack)
|
|
+ set_bit(idx, hal->entity_map);
|
|
+}
|
|
+
|
|
+void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
|
|
+ enum rtw89_sub_entity_idx idx,
|
|
+ const struct cfg80211_chan_def *chandef)
|
|
+{
|
|
+ __rtw89_config_entity_chandef(rtwdev, idx, chandef, true);
|
|
+}
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/chan.h b/drivers/net/wireless/realtek/rtw89/chan.h
|
|
index d39311a3d..b2022bb0a 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/chan.h
|
|
+++ b/drivers/net/wireless/realtek/rtw89/chan.h
|
|
@@ -26,5 +26,8 @@ void rtw89_chan_create(struct rtw89_chan *chan, u8 center_chan, u8 primary_chan,
|
|
bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
|
|
enum rtw89_sub_entity_idx idx,
|
|
const struct rtw89_chan *new);
|
|
+void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
|
|
+ enum rtw89_sub_entity_idx idx,
|
|
+ const struct cfg80211_chan_def *chandef);
|
|
|
|
#endif
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
|
|
index a807b53ae..58ca93776 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/core.c
|
|
+++ b/drivers/net/wireless/realtek/rtw89/core.c
|
|
@@ -225,7 +225,7 @@ static void rtw89_traffic_stats_accu(struct rtw89_dev *rtwdev,
|
|
}
|
|
}
|
|
|
|
-static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
|
|
+static void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
|
|
struct rtw89_chan *chan)
|
|
{
|
|
struct ieee80211_channel *channel = chandef->chan;
|
|
@@ -302,7 +302,8 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
|
|
|
|
void rtw89_set_channel(struct rtw89_dev *rtwdev)
|
|
{
|
|
- struct ieee80211_hw *hw = rtwdev->hw;
|
|
+ const struct cfg80211_chan_def *chandef =
|
|
+ rtw89_chandef_get(rtwdev, RTW89_SUB_ENTITY_0);
|
|
const struct rtw89_chip_info *chip = rtwdev->chip;
|
|
struct rtw89_chan chan;
|
|
struct rtw89_channel_help_params bak;
|
|
@@ -311,7 +312,7 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev)
|
|
|
|
entity_active = rtw89_get_entity_state(rtwdev);
|
|
|
|
- rtw89_get_channel_params(&hw->conf.chandef, &chan);
|
|
+ rtw89_get_channel_params(chandef, &chan);
|
|
if (WARN(chan.channel == 0, "Invalid channel\n"))
|
|
return;
|
|
|
|
@@ -1608,14 +1609,15 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,
|
|
struct rtw89_rx_desc_info *desc_info,
|
|
struct ieee80211_rx_status *rx_status)
|
|
{
|
|
- struct ieee80211_hw *hw = rtwdev->hw;
|
|
+ const struct cfg80211_chan_def *chandef =
|
|
+ rtw89_chandef_get(rtwdev, RTW89_SUB_ENTITY_0);
|
|
const struct rtw89_chan *cur = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
|
u16 data_rate;
|
|
u8 data_rate_mode;
|
|
|
|
/* currently using single PHY */
|
|
- rx_status->freq = hw->conf.chandef.chan->center_freq;
|
|
- rx_status->band = hw->conf.chandef.chan->band;
|
|
+ rx_status->freq = chandef->chan->center_freq;
|
|
+ rx_status->band = chandef->chan->band;
|
|
|
|
if (rtwdev->scanning &&
|
|
RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
|
|
index 808000c6d..afec9b035 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/core.h
|
|
+++ b/drivers/net/wireless/realtek/rtw89/core.h
|
|
@@ -2635,6 +2635,9 @@ struct rtw89_hal {
|
|
bool support_cckpd;
|
|
bool support_igi;
|
|
|
|
+ DECLARE_BITMAP(entity_map, NUM_OF_RTW89_SUB_ENTITY);
|
|
+ struct cfg80211_chan_def chandef[NUM_OF_RTW89_SUB_ENTITY];
|
|
+
|
|
bool entity_active;
|
|
|
|
struct rtw89_chan chan[NUM_OF_RTW89_SUB_ENTITY];
|
|
@@ -3630,6 +3633,15 @@ void rtw89_chip_set_channel_done(struct rtw89_dev *rtwdev,
|
|
mac_idx, phy_idx);
|
|
}
|
|
|
|
+static inline
|
|
+const struct cfg80211_chan_def *rtw89_chandef_get(struct rtw89_dev *rtwdev,
|
|
+ enum rtw89_sub_entity_idx idx)
|
|
+{
|
|
+ struct rtw89_hal *hal = &rtwdev->hal;
|
|
+
|
|
+ return &hal->chandef[idx];
|
|
+}
|
|
+
|
|
static inline
|
|
const struct rtw89_chan *rtw89_chan_get(struct rtw89_dev *rtwdev,
|
|
enum rtw89_sub_entity_idx idx)
|
|
diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c b/drivers/net/wireless/realtek/rtw89/mac80211.c
|
|
index ff645f890..5da50b2c4 100644
|
|
--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
|
|
+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
|
|
@@ -3,6 +3,7 @@
|
|
*/
|
|
|
|
#include "cam.h"
|
|
+#include "chan.h"
|
|
#include "coex.h"
|
|
#include "debug.h"
|
|
#include "fw.h"
|
|
@@ -85,8 +86,11 @@ static int rtw89_ops_config(struct ieee80211_hw *hw, u32 changed)
|
|
}
|
|
}
|
|
|
|
- if (changed & IEEE80211_CONF_CHANGE_CHANNEL)
|
|
+ if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
|
+ rtw89_config_entity_chandef(rtwdev, RTW89_SUB_ENTITY_0,
|
|
+ &hw->conf.chandef);
|
|
rtw89_set_channel(rtwdev);
|
|
+ }
|
|
|
|
if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
|
|
(hw->conf.flags & IEEE80211_CONF_IDLE))
|
|
--
|
|
2.35.3
|
|
|