Skip to content

Commit c7ccb24

Browse files
Ping-Ke ShihKalle Valo
authored andcommitted
wifi: rtw89: 8922a: read efuse content via efuse map struct from logic map
Define efuse map struct of RTW89_EFUSE_BLOCK_RF block, and read needed data from efuse logic map into driver. Also, with efuse power-on state, read MAC address via register interface according to HCI interface. Signed-off-by: Ping-Ke Shih <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent e102ff4 commit c7ccb24

File tree

2 files changed

+208
-0
lines changed

2 files changed

+208
-0
lines changed

drivers/net/wireless/realtek/rtw89/rtw8922a.c

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,155 @@ static const struct rtw89_efuse_block_cfg rtw8922a_efuse_blocks[] = {
2626
[RTW89_EFUSE_BLOCK_ADIE] = {.offset = 0x70000, .size = 0x10},
2727
};
2828

29+
static void rtw8922a_efuse_parsing_tssi(struct rtw89_dev *rtwdev,
30+
struct rtw8922a_efuse *map)
31+
{
32+
struct rtw8922a_tssi_offset *ofst[] = {&map->path_a_tssi, &map->path_b_tssi};
33+
u8 *bw40_1s_tssi_6g_ofst[] = {map->bw40_1s_tssi_6g_a, map->bw40_1s_tssi_6g_b};
34+
struct rtw89_tssi_info *tssi = &rtwdev->tssi;
35+
u8 i, j;
36+
37+
tssi->thermal[RF_PATH_A] = map->path_a_therm;
38+
tssi->thermal[RF_PATH_B] = map->path_b_therm;
39+
40+
for (i = 0; i < RF_PATH_NUM_8922A; i++) {
41+
memcpy(tssi->tssi_cck[i], ofst[i]->cck_tssi,
42+
sizeof(ofst[i]->cck_tssi));
43+
44+
for (j = 0; j < TSSI_CCK_CH_GROUP_NUM; j++)
45+
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
46+
"[TSSI][EFUSE] path=%d cck[%d]=0x%x\n",
47+
i, j, tssi->tssi_cck[i][j]);
48+
49+
memcpy(tssi->tssi_mcs[i], ofst[i]->bw40_tssi,
50+
sizeof(ofst[i]->bw40_tssi));
51+
memcpy(tssi->tssi_mcs[i] + TSSI_MCS_2G_CH_GROUP_NUM,
52+
ofst[i]->bw40_1s_tssi_5g, sizeof(ofst[i]->bw40_1s_tssi_5g));
53+
memcpy(tssi->tssi_6g_mcs[i], bw40_1s_tssi_6g_ofst[i],
54+
sizeof(tssi->tssi_6g_mcs[i]));
55+
56+
for (j = 0; j < TSSI_MCS_CH_GROUP_NUM; j++)
57+
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
58+
"[TSSI][EFUSE] path=%d mcs[%d]=0x%x\n",
59+
i, j, tssi->tssi_mcs[i][j]);
60+
}
61+
}
62+
63+
static void rtw8922a_efuse_parsing_gain_offset(struct rtw89_dev *rtwdev,
64+
struct rtw8922a_efuse *map)
65+
{
66+
struct rtw89_phy_efuse_gain *gain = &rtwdev->efuse_gain;
67+
bool all_0xff = true, all_0x00 = true;
68+
int i, j;
69+
u8 t;
70+
71+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_2G_CCK] = map->rx_gain_a._2g_cck;
72+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_2G_CCK] = map->rx_gain_b._2g_cck;
73+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_2G_OFDM] = map->rx_gain_a._2g_ofdm;
74+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_2G_OFDM] = map->rx_gain_b._2g_ofdm;
75+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_LOW] = map->rx_gain_a._5g_low;
76+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_LOW] = map->rx_gain_b._5g_low;
77+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_MID] = map->rx_gain_a._5g_mid;
78+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_MID] = map->rx_gain_b._5g_mid;
79+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_HIGH] = map->rx_gain_a._5g_high;
80+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_HIGH] = map->rx_gain_b._5g_high;
81+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_L0] = map->rx_gain_6g_a._6g_l0;
82+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_L0] = map->rx_gain_6g_b._6g_l0;
83+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_L1] = map->rx_gain_6g_a._6g_l1;
84+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_L1] = map->rx_gain_6g_b._6g_l1;
85+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_M0] = map->rx_gain_6g_a._6g_m0;
86+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_M0] = map->rx_gain_6g_b._6g_m0;
87+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_M1] = map->rx_gain_6g_a._6g_m1;
88+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_M1] = map->rx_gain_6g_b._6g_m1;
89+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_H0] = map->rx_gain_6g_a._6g_h0;
90+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_H0] = map->rx_gain_6g_b._6g_h0;
91+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_H1] = map->rx_gain_6g_a._6g_h1;
92+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_H1] = map->rx_gain_6g_b._6g_h1;
93+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_UH0] = map->rx_gain_6g_a._6g_uh0;
94+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_UH0] = map->rx_gain_6g_b._6g_uh0;
95+
gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_6G_UH1] = map->rx_gain_6g_a._6g_uh1;
96+
gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_6G_UH1] = map->rx_gain_6g_b._6g_uh1;
97+
98+
for (i = RF_PATH_A; i <= RF_PATH_B; i++)
99+
for (j = 0; j < RTW89_GAIN_OFFSET_NR; j++) {
100+
t = gain->offset[i][j];
101+
if (t != 0xff)
102+
all_0xff = false;
103+
if (t != 0x0)
104+
all_0x00 = false;
105+
106+
/* transform: sign-bit + U(7,2) to S(8,2) */
107+
if (t & 0x80)
108+
gain->offset[i][j] = (t ^ 0x7f) + 1;
109+
}
110+
111+
gain->offset_valid = !all_0xff && !all_0x00;
112+
}
113+
114+
static void rtw8922a_read_efuse_mac_addr(struct rtw89_dev *rtwdev, u32 addr)
115+
{
116+
struct rtw89_efuse *efuse = &rtwdev->efuse;
117+
u16 val;
118+
int i;
119+
120+
for (i = 0; i < ETH_ALEN; i += 2, addr += 2) {
121+
val = rtw89_read16(rtwdev, addr);
122+
efuse->addr[i] = val & 0xff;
123+
efuse->addr[i + 1] = val >> 8;
124+
}
125+
}
126+
127+
static int rtw8922a_read_efuse_pci_sdio(struct rtw89_dev *rtwdev, u8 *log_map)
128+
{
129+
struct rtw89_efuse *efuse = &rtwdev->efuse;
130+
131+
if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
132+
rtw8922a_read_efuse_mac_addr(rtwdev, 0x3104);
133+
else
134+
ether_addr_copy(efuse->addr, log_map + 0x001A);
135+
136+
return 0;
137+
}
138+
139+
static int rtw8922a_read_efuse_usb(struct rtw89_dev *rtwdev, u8 *log_map)
140+
{
141+
rtw8922a_read_efuse_mac_addr(rtwdev, 0x4078);
142+
143+
return 0;
144+
}
145+
146+
static int rtw8922a_read_efuse_rf(struct rtw89_dev *rtwdev, u8 *log_map)
147+
{
148+
struct rtw8922a_efuse *map = (struct rtw8922a_efuse *)log_map;
149+
struct rtw89_efuse *efuse = &rtwdev->efuse;
150+
151+
efuse->rfe_type = map->rfe_type;
152+
efuse->xtal_cap = map->xtal_k;
153+
efuse->country_code[0] = map->country_code[0];
154+
efuse->country_code[1] = map->country_code[1];
155+
rtw8922a_efuse_parsing_tssi(rtwdev, map);
156+
rtw8922a_efuse_parsing_gain_offset(rtwdev, map);
157+
158+
rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
159+
160+
return 0;
161+
}
162+
163+
static int rtw8922a_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
164+
enum rtw89_efuse_block block)
165+
{
166+
switch (block) {
167+
case RTW89_EFUSE_BLOCK_HCI_DIG_PCIE_SDIO:
168+
return rtw8922a_read_efuse_pci_sdio(rtwdev, log_map);
169+
case RTW89_EFUSE_BLOCK_HCI_DIG_USB:
170+
return rtw8922a_read_efuse_usb(rtwdev, log_map);
171+
case RTW89_EFUSE_BLOCK_RF:
172+
return rtw8922a_read_efuse_rf(rtwdev, log_map);
173+
default:
174+
return 0;
175+
}
176+
}
177+
29178
#ifdef CONFIG_PM
30179
static const struct wiphy_wowlan_support rtw_wowlan_stub_8922a = {
31180
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
@@ -36,6 +185,7 @@ static const struct wiphy_wowlan_support rtw_wowlan_stub_8922a = {
36185
#endif
37186

38187
static const struct rtw89_chip_ops rtw8922a_chip_ops = {
188+
.read_efuse = rtw8922a_read_efuse,
39189
};
40190

41191
const struct rtw89_chip_info rtw8922a_chip_info = {

drivers/net/wireless/realtek/rtw89/rtw8922a.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,64 @@
1010
#define RF_PATH_NUM_8922A 2
1111
#define BB_PATH_NUM_8922A 2
1212

13+
struct rtw8922a_tssi_offset {
14+
u8 cck_tssi[TSSI_CCK_CH_GROUP_NUM];
15+
u8 bw40_tssi[TSSI_MCS_2G_CH_GROUP_NUM];
16+
u8 rsvd[7];
17+
u8 bw40_1s_tssi_5g[TSSI_MCS_5G_CH_GROUP_NUM];
18+
u8 bw_diff_5g[10];
19+
} __packed;
20+
21+
struct rtw8922a_rx_gain {
22+
u8 _2g_ofdm;
23+
u8 _2g_cck;
24+
u8 _5g_low;
25+
u8 _5g_mid;
26+
u8 _5g_high;
27+
} __packed;
28+
29+
struct rtw8922a_rx_gain_6g {
30+
u8 _6g_l0;
31+
u8 _6g_l1;
32+
u8 _6g_m0;
33+
u8 _6g_m1;
34+
u8 _6g_h0;
35+
u8 _6g_h1;
36+
u8 _6g_uh0;
37+
u8 _6g_uh1;
38+
} __packed;
39+
40+
struct rtw8922a_efuse {
41+
u8 country_code[2];
42+
u8 rsvd[0xe];
43+
struct rtw8922a_tssi_offset path_a_tssi;
44+
struct rtw8922a_tssi_offset path_b_tssi;
45+
u8 rsvd1[0x54];
46+
u8 channel_plan;
47+
u8 xtal_k;
48+
u8 rsvd2[0x7];
49+
u8 board_info;
50+
u8 rsvd3[0x8];
51+
u8 rfe_type;
52+
u8 rsvd4[0x5];
53+
u8 path_a_therm;
54+
u8 path_b_therm;
55+
u8 rsvd5[0x2];
56+
struct rtw8922a_rx_gain rx_gain_a;
57+
struct rtw8922a_rx_gain rx_gain_b;
58+
u8 rsvd6[0x22];
59+
u8 bw40_1s_tssi_6g_a[TSSI_MCS_6G_CH_GROUP_NUM];
60+
u8 rsvd7[0xa];
61+
u8 bw40_1s_tssi_6g_b[TSSI_MCS_6G_CH_GROUP_NUM];
62+
u8 rsvd8[0xa];
63+
u8 bw40_1s_tssi_6g_c[TSSI_MCS_6G_CH_GROUP_NUM];
64+
u8 rsvd9[0xa];
65+
u8 bw40_1s_tssi_6g_d[TSSI_MCS_6G_CH_GROUP_NUM];
66+
u8 rsvd10[0xa];
67+
struct rtw8922a_rx_gain_6g rx_gain_6g_a;
68+
struct rtw8922a_rx_gain_6g rx_gain_6g_b;
69+
} __packed;
70+
1371
extern const struct rtw89_chip_info rtw8922a_chip_info;
1472

1573
#endif

0 commit comments

Comments
 (0)