phy.c (48ee4835b73c48590d05a54730dc8037ebd39d3b) phy.c (861e58c8fc6be0e1319525b5e9a27a0d2e776210)
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2/* Copyright(c) 2019-2020 Realtek Corporation
3 */
4
5#include "debug.h"
6#include "fw.h"
7#include "phy.h"
8#include "ps.h"

--- 554 unchanged lines hidden (view full) ---

563 }
564 break;
565 default:
566 break;
567 }
568
569 return txsc_idx;
570}
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2/* Copyright(c) 2019-2020 Realtek Corporation
3 */
4
5#include "debug.h"
6#include "fw.h"
7#include "phy.h"
8#include "ps.h"

--- 554 unchanged lines hidden (view full) ---

563 }
564 break;
565 default:
566 break;
567 }
568
569 return txsc_idx;
570}
571EXPORT_SYMBOL(rtw89_phy_get_txsc);
571
572u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
573 u32 addr, u32 mask)
574{
575 const struct rtw89_chip_info *chip = rtwdev->chip;
576 const u32 *base_addr = chip->rf_base_addr;
577 u32 val, direct_addr;
578

--- 388 unchanged lines hidden (view full) ---

967
968void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
969 u32 data, enum rtw89_phy_idx phy_idx)
970{
971 if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1)
972 addr += rtw89_phy0_phy1_offset(rtwdev, addr);
973 rtw89_phy_write32_mask(rtwdev, addr, mask, data);
974}
572
573u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
574 u32 addr, u32 mask)
575{
576 const struct rtw89_chip_info *chip = rtwdev->chip;
577 const u32 *base_addr = chip->rf_base_addr;
578 u32 val, direct_addr;
579

--- 388 unchanged lines hidden (view full) ---

968
969void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
970 u32 data, enum rtw89_phy_idx phy_idx)
971{
972 if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1)
973 addr += rtw89_phy0_phy1_offset(rtwdev, addr);
974 rtw89_phy_write32_mask(rtwdev, addr, mask, data);
975}
976EXPORT_SYMBOL(rtw89_phy_write32_idx);
975
976void rtw89_phy_set_phy_regs(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
977 u32 val)
978{
979 rtw89_phy_write32_idx(rtwdev, addr, mask, val, RTW89_PHY_0);
980
981 if (!rtwdev->dbcc_en)
982 return;

--- 7 unchanged lines hidden (view full) ---

990 const struct rtw89_reg3_def *reg3;
991 int i;
992
993 for (i = 0; i < tbl->size; i++) {
994 reg3 = &tbl->reg3[i];
995 rtw89_phy_write32_mask(rtwdev, reg3->addr, reg3->mask, reg3->data);
996 }
997}
977
978void rtw89_phy_set_phy_regs(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
979 u32 val)
980{
981 rtw89_phy_write32_idx(rtwdev, addr, mask, val, RTW89_PHY_0);
982
983 if (!rtwdev->dbcc_en)
984 return;

--- 7 unchanged lines hidden (view full) ---

992 const struct rtw89_reg3_def *reg3;
993 int i;
994
995 for (i = 0; i < tbl->size; i++) {
996 reg3 = &tbl->reg3[i];
997 rtw89_phy_write32_mask(rtwdev, reg3->addr, reg3->mask, reg3->data);
998 }
999}
1000EXPORT_SYMBOL(rtw89_phy_write_reg3_tbl);
998
999const u8 rtw89_rs_idx_max[] = {
1000 [RTW89_RS_CCK] = RTW89_RATE_CCK_MAX,
1001 [RTW89_RS_OFDM] = RTW89_RATE_OFDM_MAX,
1002 [RTW89_RS_MCS] = RTW89_RATE_MCS_MAX,
1003 [RTW89_RS_HEDCM] = RTW89_RATE_HEDCM_MAX,
1004 [RTW89_RS_OFFSET] = RTW89_RATE_OFFSET_MAX,
1005};
1001
1002const u8 rtw89_rs_idx_max[] = {
1003 [RTW89_RS_CCK] = RTW89_RATE_CCK_MAX,
1004 [RTW89_RS_OFDM] = RTW89_RATE_OFDM_MAX,
1005 [RTW89_RS_MCS] = RTW89_RATE_MCS_MAX,
1006 [RTW89_RS_HEDCM] = RTW89_RATE_HEDCM_MAX,
1007 [RTW89_RS_OFFSET] = RTW89_RATE_OFFSET_MAX,
1008};
1009EXPORT_SYMBOL(rtw89_rs_idx_max);
1006
1007const u8 rtw89_rs_nss_max[] = {
1008 [RTW89_RS_CCK] = 1,
1009 [RTW89_RS_OFDM] = 1,
1010 [RTW89_RS_MCS] = RTW89_NSS_MAX,
1011 [RTW89_RS_HEDCM] = RTW89_NSS_HEDCM_MAX,
1012 [RTW89_RS_OFFSET] = 1,
1013};
1010
1011const u8 rtw89_rs_nss_max[] = {
1012 [RTW89_RS_CCK] = 1,
1013 [RTW89_RS_OFDM] = 1,
1014 [RTW89_RS_MCS] = RTW89_NSS_MAX,
1015 [RTW89_RS_HEDCM] = RTW89_NSS_HEDCM_MAX,
1016 [RTW89_RS_OFFSET] = 1,
1017};
1018EXPORT_SYMBOL(rtw89_rs_nss_max);
1014
1015static const u8 _byr_of_rs[] = {
1016 [RTW89_RS_CCK] = offsetof(struct rtw89_txpwr_byrate, cck),
1017 [RTW89_RS_OFDM] = offsetof(struct rtw89_txpwr_byrate, ofdm),
1018 [RTW89_RS_MCS] = offsetof(struct rtw89_txpwr_byrate, mcs),
1019 [RTW89_RS_HEDCM] = offsetof(struct rtw89_txpwr_byrate, hedcm),
1020 [RTW89_RS_OFFSET] = offsetof(struct rtw89_txpwr_byrate, offset),
1021};

--- 17 unchanged lines hidden (view full) ---

1039 data = cfg->data;
1040
1041 for (i = 0; i < cfg->len; i++, data >>= 8) {
1042 idx = _byr_idx(cfg->rs, cfg->nss, (cfg->shf + i));
1043 byr[idx] = (s8)(data & 0xff);
1044 }
1045 }
1046}
1019
1020static const u8 _byr_of_rs[] = {
1021 [RTW89_RS_CCK] = offsetof(struct rtw89_txpwr_byrate, cck),
1022 [RTW89_RS_OFDM] = offsetof(struct rtw89_txpwr_byrate, ofdm),
1023 [RTW89_RS_MCS] = offsetof(struct rtw89_txpwr_byrate, mcs),
1024 [RTW89_RS_HEDCM] = offsetof(struct rtw89_txpwr_byrate, hedcm),
1025 [RTW89_RS_OFFSET] = offsetof(struct rtw89_txpwr_byrate, offset),
1026};

--- 17 unchanged lines hidden (view full) ---

1044 data = cfg->data;
1045
1046 for (i = 0; i < cfg->len; i++, data >>= 8) {
1047 idx = _byr_idx(cfg->rs, cfg->nss, (cfg->shf + i));
1048 byr[idx] = (s8)(data & 0xff);
1049 }
1050 }
1051}
1052EXPORT_SYMBOL(rtw89_phy_load_txpwr_byrate);
1047
1048#define _phy_txpwr_rf_to_mac(rtwdev, txpwr_rf) \
1049({ \
1050 const struct rtw89_chip_info *__c = (rtwdev)->chip; \
1051 (txpwr_rf) >> (__c->txpwr_factor_rf - __c->txpwr_factor_mac); \
1052})
1053
1054s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev,

--- 14 unchanged lines hidden (view full) ---

1069 return 0;
1070 }
1071
1072 byr = _byr_seek(rate_desc->rs, &rtwdev->byr[band]);
1073 idx = _byr_idx(rate_desc->rs, rate_desc->nss, rate_desc->idx);
1074
1075 return _phy_txpwr_rf_to_mac(rtwdev, byr[idx]);
1076}
1053
1054#define _phy_txpwr_rf_to_mac(rtwdev, txpwr_rf) \
1055({ \
1056 const struct rtw89_chip_info *__c = (rtwdev)->chip; \
1057 (txpwr_rf) >> (__c->txpwr_factor_rf - __c->txpwr_factor_mac); \
1058})
1059
1060s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev,

--- 14 unchanged lines hidden (view full) ---

1075 return 0;
1076 }
1077
1078 byr = _byr_seek(rate_desc->rs, &rtwdev->byr[band]);
1079 idx = _byr_idx(rate_desc->rs, rate_desc->nss, rate_desc->idx);
1080
1081 return _phy_txpwr_rf_to_mac(rtwdev, byr[idx]);
1082}
1083EXPORT_SYMBOL(rtw89_phy_read_txpwr_byrate);
1077
1078static u8 rtw89_channel_to_idx(struct rtw89_dev *rtwdev, u8 channel)
1079{
1080 switch (channel) {
1081 case 1 ... 14:
1082 return channel - 1;
1083 case 36 ... 64:
1084 return (channel - 36) / 2;

--- 34 unchanged lines hidden (view full) ---

1119 return 0;
1120 }
1121
1122 lmt = _phy_txpwr_rf_to_mac(rtwdev, lmt);
1123 sar = rtw89_query_sar(rtwdev);
1124
1125 return min(lmt, sar);
1126}
1084
1085static u8 rtw89_channel_to_idx(struct rtw89_dev *rtwdev, u8 channel)
1086{
1087 switch (channel) {
1088 case 1 ... 14:
1089 return channel - 1;
1090 case 36 ... 64:
1091 return (channel - 36) / 2;

--- 34 unchanged lines hidden (view full) ---

1126 return 0;
1127 }
1128
1129 lmt = _phy_txpwr_rf_to_mac(rtwdev, lmt);
1130 sar = rtw89_query_sar(rtwdev);
1131
1132 return min(lmt, sar);
1133}
1134EXPORT_SYMBOL(rtw89_phy_read_txpwr_limit);
1127
1128#define __fill_txpwr_limit_nonbf_bf(ptr, bw, ntx, rs, ch) \
1129 do { \
1130 u8 __i; \
1131 for (__i = 0; __i < RTW89_BF_NUM; __i++) \
1132 ptr[__i] = rtw89_phy_read_txpwr_limit(rtwdev, \
1133 bw, ntx, \
1134 rs, __i, \

--- 82 unchanged lines hidden (view full) ---

1217 case RTW89_CHANNEL_WIDTH_40:
1218 rtw89_phy_fill_txpwr_limit_40m(rtwdev, lmt, ntx, ch);
1219 break;
1220 case RTW89_CHANNEL_WIDTH_80:
1221 rtw89_phy_fill_txpwr_limit_80m(rtwdev, lmt, ntx, ch);
1222 break;
1223 }
1224}
1135
1136#define __fill_txpwr_limit_nonbf_bf(ptr, bw, ntx, rs, ch) \
1137 do { \
1138 u8 __i; \
1139 for (__i = 0; __i < RTW89_BF_NUM; __i++) \
1140 ptr[__i] = rtw89_phy_read_txpwr_limit(rtwdev, \
1141 bw, ntx, \
1142 rs, __i, \

--- 82 unchanged lines hidden (view full) ---

1225 case RTW89_CHANNEL_WIDTH_40:
1226 rtw89_phy_fill_txpwr_limit_40m(rtwdev, lmt, ntx, ch);
1227 break;
1228 case RTW89_CHANNEL_WIDTH_80:
1229 rtw89_phy_fill_txpwr_limit_80m(rtwdev, lmt, ntx, ch);
1230 break;
1231 }
1232}
1233EXPORT_SYMBOL(rtw89_phy_fill_txpwr_limit);
1225
1226static s8 rtw89_phy_read_txpwr_limit_ru(struct rtw89_dev *rtwdev,
1227 u8 ru, u8 ntx, u8 ch)
1228{
1229 const struct rtw89_chip_info *chip = rtwdev->chip;
1230 u8 ch_idx = rtw89_channel_to_idx(rtwdev, ch);
1231 u8 band = rtwdev->hal.current_band_type;
1232 u8 regd = rtw89_regd_get(rtwdev, band);

--- 102 unchanged lines hidden (view full) ---

1335 case RTW89_CHANNEL_WIDTH_40:
1336 rtw89_phy_fill_txpwr_limit_ru_40m(rtwdev, lmt_ru, ntx, ch);
1337 break;
1338 case RTW89_CHANNEL_WIDTH_80:
1339 rtw89_phy_fill_txpwr_limit_ru_80m(rtwdev, lmt_ru, ntx, ch);
1340 break;
1341 }
1342}
1234
1235static s8 rtw89_phy_read_txpwr_limit_ru(struct rtw89_dev *rtwdev,
1236 u8 ru, u8 ntx, u8 ch)
1237{
1238 const struct rtw89_chip_info *chip = rtwdev->chip;
1239 u8 ch_idx = rtw89_channel_to_idx(rtwdev, ch);
1240 u8 band = rtwdev->hal.current_band_type;
1241 u8 regd = rtw89_regd_get(rtwdev, band);

--- 102 unchanged lines hidden (view full) ---

1344 case RTW89_CHANNEL_WIDTH_40:
1345 rtw89_phy_fill_txpwr_limit_ru_40m(rtwdev, lmt_ru, ntx, ch);
1346 break;
1347 case RTW89_CHANNEL_WIDTH_80:
1348 rtw89_phy_fill_txpwr_limit_ru_80m(rtwdev, lmt_ru, ntx, ch);
1349 break;
1350 }
1351}
1352EXPORT_SYMBOL(rtw89_phy_fill_txpwr_limit_ru);
1343
1344struct rtw89_phy_iter_ra_data {
1345 struct rtw89_dev *rtwdev;
1346 struct sk_buff *c2h;
1347};
1348
1349static void rtw89_phy_c2h_ra_rpt_iter(void *data, struct ieee80211_sta *sta)
1350{

--- 1646 unchanged lines hidden ---
1353
1354struct rtw89_phy_iter_ra_data {
1355 struct rtw89_dev *rtwdev;
1356 struct sk_buff *c2h;
1357};
1358
1359static void rtw89_phy_c2h_ra_rpt_iter(void *data, struct ieee80211_sta *sta)
1360{

--- 1646 unchanged lines hidden ---