From: Zong-Zhe Yang 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 Signed-off-by: Ping-Ke Shih --- drivers/net/wireless/realtek/rtw89/core.h | 17 ++++++++++++----- drivers/net/wireless/realtek/rtw89/fw.c | 16 ++++++++++++++-- drivers/net/wireless/realtek/rtw89/fw.h | 2 ++ 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 94ba7e368880..4ba6452a7123 100644 --- a/drivers/net/wireless/realtek/rtw89/core.h +++ b/drivers/net/wireless/realtek/rtw89/core.h @@ -4516,8 +4516,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]; @@ -4614,12 +4615,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 { @@ -8048,8 +8050,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)) @@ -8058,7 +8062,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 01770a6a1f6f..95acf7caf08e 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -11626,6 +11626,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; } @@ -11640,7 +11646,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; } } @@ -11657,6 +11663,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; } @@ -11671,7 +11683,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 af126d15a1fb..5efa75f8c392 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.h +++ b/drivers/net/wireless/realtek/rtw89/fw.h @@ -5834,6 +5834,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 */ @@ -5841,6 +5842,7 @@ struct rtw89_fw_tx_shape_lmt_ru_entry { u8 band; u8 regd; u8 v; + u8 reg6_pwr; } __packed; const struct rtw89_rfe_parms * -- 2.25.1