Skip to content

Commit efde4f6

Browse files
Ping-Ke ShihKalle Valo
authored andcommitted
wifi: rtw89: add XTAL SI for WiFi 7 chips
The XTAL SI is a serial interface to indirectly access registers of analog hardware circuit. Since WiFi 7 chips use different registers, add a ops to access them via common functions. This patch doesn't change logic for existing chips. Signed-off-by: Ping-Ke Shih <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://msgid.link/[email protected]
1 parent f0536b0 commit efde4f6

File tree

4 files changed

+88
-6
lines changed

4 files changed

+88
-6
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5946,7 +5946,8 @@ int rtw89_mac_set_hw_muedca_ctrl(struct rtw89_dev *rtwdev,
59465946
return 0;
59475947
}
59485948

5949-
int rtw89_mac_write_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask)
5949+
static
5950+
int rtw89_mac_write_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask)
59505951
{
59515952
u32 val32;
59525953
int ret;
@@ -5968,9 +5969,9 @@ int rtw89_mac_write_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask
59685969

59695970
return 0;
59705971
}
5971-
EXPORT_SYMBOL(rtw89_mac_write_xtal_si);
59725972

5973-
int rtw89_mac_read_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
5973+
static
5974+
int rtw89_mac_read_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
59745975
{
59755976
u32 val32;
59765977
int ret;
@@ -5993,7 +5994,6 @@ int rtw89_mac_read_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
59935994

59945995
return 0;
59955996
}
5996-
EXPORT_SYMBOL(rtw89_mac_read_xtal_si);
59975997

59985998
static
59995999
void rtw89_mac_pkt_drop_sta(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta)
@@ -6127,6 +6127,9 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
61276127

61286128
.get_txpwr_cr = rtw89_mac_get_txpwr_cr_ax,
61296129

6130+
.write_xtal_si = rtw89_mac_write_xtal_si_ax,
6131+
.read_xtal_si = rtw89_mac_read_xtal_si_ax,
6132+
61306133
.dump_qta_lost = rtw89_mac_dump_qta_lost_ax,
61316134
.dump_err_status = rtw89_mac_dump_err_status_ax,
61326135

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,9 @@ struct rtw89_mac_gen_def {
935935
enum rtw89_phy_idx phy_idx,
936936
u32 reg_base, u32 *cr);
937937

938+
int (*write_xtal_si)(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask);
939+
int (*read_xtal_si)(struct rtw89_dev *rtwdev, u8 offset, u8 *val);
940+
938941
void (*dump_qta_lost)(struct rtw89_dev *rtwdev);
939942
void (*dump_err_status)(struct rtw89_dev *rtwdev,
940943
enum mac_ax_err_info err);
@@ -1296,8 +1299,22 @@ enum rtw89_mac_xtal_si_offset {
12961299
#define FULL_BIT_MASK GENMASK(7, 0)
12971300
};
12981301

1299-
int rtw89_mac_write_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask);
1300-
int rtw89_mac_read_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 *val);
1302+
static inline
1303+
int rtw89_mac_write_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask)
1304+
{
1305+
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
1306+
1307+
return mac->write_xtal_si(rtwdev, offset, val, mask);
1308+
}
1309+
1310+
static inline
1311+
int rtw89_mac_read_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
1312+
{
1313+
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
1314+
1315+
return mac->read_xtal_si(rtwdev, offset, val);
1316+
}
1317+
13011318
void rtw89_mac_pkt_drop_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
13021319
int rtw89_mac_typ_fltr_opt(struct rtw89_dev *rtwdev,
13031320
enum rtw89_machdr_frame_type type,

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,57 @@ static void rtw89_mac_dmac_func_pre_en_be(struct rtw89_dev *rtwdev)
348348
rtw89_write32_set(rtwdev, R_BE_DMAC_TABLE_CTRL, B_BE_DMAC_ADDR_MODE);
349349
}
350350

351+
static
352+
int rtw89_mac_write_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask)
353+
{
354+
u32 val32;
355+
int ret;
356+
357+
val32 = u32_encode_bits(offset, B_BE_WL_XTAL_SI_ADDR_MASK) |
358+
u32_encode_bits(val, B_BE_WL_XTAL_SI_DATA_MASK) |
359+
u32_encode_bits(mask, B_BE_WL_XTAL_SI_BITMASK_MASK) |
360+
u32_encode_bits(XTAL_SI_NORMAL_WRITE, B_BE_WL_XTAL_SI_MODE_MASK) |
361+
u32_encode_bits(0, B_BE_WL_XTAL_SI_CHIPID_MASK) |
362+
B_BE_WL_XTAL_SI_CMD_POLL;
363+
rtw89_write32(rtwdev, R_BE_WLAN_XTAL_SI_CTRL, val32);
364+
365+
ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_BE_WL_XTAL_SI_CMD_POLL),
366+
50, 50000, false, rtwdev, R_BE_WLAN_XTAL_SI_CTRL);
367+
if (ret) {
368+
rtw89_warn(rtwdev, "xtal si not ready(W): offset=%x val=%x mask=%x\n",
369+
offset, val, mask);
370+
return ret;
371+
}
372+
373+
return 0;
374+
}
375+
376+
static
377+
int rtw89_mac_read_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
378+
{
379+
u32 val32;
380+
int ret;
381+
382+
val32 = u32_encode_bits(offset, B_BE_WL_XTAL_SI_ADDR_MASK) |
383+
u32_encode_bits(0x0, B_BE_WL_XTAL_SI_DATA_MASK) |
384+
u32_encode_bits(0x0, B_BE_WL_XTAL_SI_BITMASK_MASK) |
385+
u32_encode_bits(XTAL_SI_NORMAL_READ, B_BE_WL_XTAL_SI_MODE_MASK) |
386+
u32_encode_bits(0, B_BE_WL_XTAL_SI_CHIPID_MASK) |
387+
B_BE_WL_XTAL_SI_CMD_POLL;
388+
rtw89_write32(rtwdev, R_BE_WLAN_XTAL_SI_CTRL, val32);
389+
390+
ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_BE_WL_XTAL_SI_CMD_POLL),
391+
50, 50000, false, rtwdev, R_BE_WLAN_XTAL_SI_CTRL);
392+
if (ret) {
393+
rtw89_warn(rtwdev, "xtal si not ready(R): offset=%x\n", offset);
394+
return ret;
395+
}
396+
397+
*val = rtw89_read8(rtwdev, R_BE_WLAN_XTAL_SI_CTRL + 1);
398+
399+
return 0;
400+
}
401+
351402
static void rtw89_mac_disable_cpu_be(struct rtw89_dev *rtwdev)
352403
{
353404
u32 val32;
@@ -1121,6 +1172,9 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
11211172

11221173
.get_txpwr_cr = rtw89_mac_get_txpwr_cr_be,
11231174

1175+
.write_xtal_si = rtw89_mac_write_xtal_si_be,
1176+
.read_xtal_si = rtw89_mac_read_xtal_si_be,
1177+
11241178
.dump_qta_lost = rtw89_mac_dump_qta_lost_be,
11251179
.dump_err_status = rtw89_mac_dump_err_status_be,
11261180

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4085,6 +4085,14 @@
40854085
#define R_BE_UDM2 0x01F8
40864086
#define B_BE_UDM2_EPC_RA_MASK GENMASK(31, 0)
40874087

4088+
#define R_BE_WLAN_XTAL_SI_CTRL 0x0270
4089+
#define B_BE_WL_XTAL_SI_CMD_POLL BIT(31)
4090+
#define B_BE_WL_XTAL_SI_CHIPID_MASK GENMASK(30, 28)
4091+
#define B_BE_WL_XTAL_SI_MODE_MASK GENMASK(25, 24)
4092+
#define B_BE_WL_XTAL_SI_BITMASK_MASK GENMASK(23, 16)
4093+
#define B_BE_WL_XTAL_SI_DATA_MASK GENMASK(15, 8)
4094+
#define B_BE_WL_XTAL_SI_ADDR_MASK GENMASK(7, 0)
4095+
40884096
#define R_BE_IC_PWR_STATE 0x03F0
40894097
#define B_BE_WHOLE_SYS_PWR_STE_MASK GENMASK(25, 16)
40904098
#define MAC_AX_SYS_ACT 0x220

0 commit comments

Comments
 (0)