summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZong-Zhe Yang <kevin_yang@realtek.com>2026-07-12 11:45:04 +0800
committerPing-Ke Shih <pkshih@realtek.com>2026-07-17 11:16:44 +0800
commitb4eaac15cbb4ae90130bdde9952d2e50deeb40c3 (patch)
tree3387f4deb624ee4af536b4131fa57aa8087a8165
parent7054b03136e4bd5645d12cbd8d93b15afae4b8be (diff)
downloadlinux-next-b4eaac15cbb4ae90130bdde9952d2e50deeb40c3.tar.gz
linux-next-b4eaac15cbb4ae90130bdde9952d2e50deeb40c3.zip
wifi: rtw89: extend tx shape format for regulatory 6 GHz power type
Even under the same regulation, TX shape may need different settings for different 6 GHz power types. So, add one more dimension for that. Because TX shape parameters are not quite large, the 2/5/6 GHz sections are not divided into different structures. So, the 2/5 GHz sections will also get the new dimension. To 2/5 GHz sections, fill the TX shape settings with RTW89_REG_6GHZ_POWER_DFLT (0) field. Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Link: https://patch.msgid.link/20260712034506.53209-7-pkshih@realtek.com
-rw-r--r--drivers/net/wireless/realtek/rtw89/core.h17
-rw-r--r--drivers/net/wireless/realtek/rtw89/fw.c16
-rw-r--r--drivers/net/wireless/realtek/rtw89/fw.h2
3 files changed, 28 insertions, 7 deletions
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 45e77d84f3b8..1ecaa14b790e 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -4921,8 +4921,9 @@ struct rtw89_txpwr_rule_6ghz {
};
struct rtw89_tx_shape {
- const u8 (*lmt)[RTW89_BAND_NUM][RTW89_RS_TX_SHAPE_NUM][RTW89_REGD_NUM];
- const u8 (*lmt_ru)[RTW89_BAND_NUM][RTW89_REGD_NUM];
+ const u8 (*lmt)[RTW89_BAND_NUM][RTW89_RS_TX_SHAPE_NUM][RTW89_REGD_NUM]
+ [NUM_OF_RTW89_REG_6GHZ_POWER];
+ const u8 (*lmt_ru)[RTW89_BAND_NUM][RTW89_REGD_NUM][NUM_OF_RTW89_REG_6GHZ_POWER];
const u8 (*lmt_v0)[RTW89_BAND_NUM][RTW89_RS_TX_SHAPE_NUM][RTW89_REGD_NUM];
const u8 (*lmt_ru_v0)[RTW89_BAND_NUM][RTW89_REGD_NUM];
@@ -5019,12 +5020,13 @@ struct rtw89_txpwr_lmt_ru_6ghz_data {
struct rtw89_tx_shape_lmt_data {
struct rtw89_txpwr_conf conf;
- u8 v[RTW89_BAND_NUM][RTW89_RS_TX_SHAPE_NUM][RTW89_REGD_NUM];
+ u8 v[RTW89_BAND_NUM][RTW89_RS_TX_SHAPE_NUM][RTW89_REGD_NUM]
+ [NUM_OF_RTW89_REG_6GHZ_POWER];
};
struct rtw89_tx_shape_lmt_ru_data {
struct rtw89_txpwr_conf conf;
- u8 v[RTW89_BAND_NUM][RTW89_REGD_NUM];
+ u8 v[RTW89_BAND_NUM][RTW89_REGD_NUM][NUM_OF_RTW89_REG_6GHZ_POWER];
};
struct rtw89_rfe_data {
@@ -8454,8 +8456,10 @@ static inline u8 rtw89_regd_get(struct rtw89_dev *rtwdev, u8 band)
static inline u8 rtw89_get_tx_shape_idx(struct rtw89_dev *rtwdev, u8 band,
enum rtw89_rate_section rs)
{
+ struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms;
const struct rtw89_tx_shape *tx_shape = &rfe_parms->tx_shape;
+ u8 reg6_pwr = regulatory->reg_6ghz_power;
u8 regd = rtw89_regd_get(rtwdev, band);
if (unlikely(rs >= RTW89_RS_TX_SHAPE_NUM))
@@ -8464,7 +8468,10 @@ static inline u8 rtw89_get_tx_shape_idx(struct rtw89_dev *rtwdev, u8 band,
if (!tx_shape->lmt)
goto v0;
- return (*tx_shape->lmt)[band][rs][regd];
+ if (band != RTW89_BAND_6G)
+ reg6_pwr = RTW89_REG_6GHZ_POWER_DFLT;
+
+ return (*tx_shape->lmt)[band][rs][regd][reg6_pwr];
v0:
return (*tx_shape->lmt_v0)[band][rs][regd];
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index f290bcdd4fda..4df2ba5bfa44 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -11916,6 +11916,12 @@ fw_tx_shape_lmt_entry_valid(const struct rtw89_fw_tx_shape_lmt_entry *e,
if (e->regd >= RTW89_REGD_NUM)
return false;
+ /* ensure compatibility work with 2/5 GHz */
+ static_assert(RTW89_REG_6GHZ_POWER_DFLT == 0);
+
+ if (e->reg6_pwr >= NUM_OF_RTW89_REG_6GHZ_POWER)
+ return false;
+
return true;
}
@@ -11930,7 +11936,7 @@ void rtw89_fw_load_tx_shape_lmt(struct rtw89_tx_shape_lmt_data *data)
if (!fw_tx_shape_lmt_entry_valid(&entry, cursor, conf))
continue;
- data->v[entry.band][entry.tx_shape_rs][entry.regd] = entry.v;
+ data->v[entry.band][entry.tx_shape_rs][entry.regd][entry.reg6_pwr] = entry.v;
}
}
@@ -11947,6 +11953,12 @@ fw_tx_shape_lmt_ru_entry_valid(const struct rtw89_fw_tx_shape_lmt_ru_entry *e,
if (e->regd >= RTW89_REGD_NUM)
return false;
+ /* ensure compatibility work with 2/5 GHz */
+ static_assert(RTW89_REG_6GHZ_POWER_DFLT == 0);
+
+ if (e->reg6_pwr >= NUM_OF_RTW89_REG_6GHZ_POWER)
+ return false;
+
return true;
}
@@ -11961,7 +11973,7 @@ void rtw89_fw_load_tx_shape_lmt_ru(struct rtw89_tx_shape_lmt_ru_data *data)
if (!fw_tx_shape_lmt_ru_entry_valid(&entry, cursor, conf))
continue;
- data->v[entry.band][entry.regd] = entry.v;
+ data->v[entry.band][entry.regd][entry.reg6_pwr] = entry.v;
}
}
diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h
index c6131778f6a2..166c4bc9c1d0 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.h
+++ b/drivers/net/wireless/realtek/rtw89/fw.h
@@ -5812,6 +5812,7 @@ struct rtw89_fw_tx_shape_lmt_entry {
u8 tx_shape_rs;
u8 regd;
u8 v;
+ u8 reg6_pwr;
} __packed;
/* must consider compatibility; don't insert new in the mid */
@@ -5819,6 +5820,7 @@ struct rtw89_fw_tx_shape_lmt_ru_entry {
u8 band;
u8 regd;
u8 v;
+ u8 reg6_pwr;
} __packed;
const struct rtw89_rfe_parms *