Skip to content

Commit edd77bb

Browse files
Ping-Ke ShihKalle Valo
authored andcommitted
wifi: rtw89: parse and print out RFK log from C2H events
RFK log events contains two types. One called RUN log is to reflect state during RFK is running, and it replies on formatted string loaded from firmware file, but print this type as plain hexadecimal only in this patch. The other is REPORT log that reflects the final result of a RFK, and each calibration has its own struct to carry many specific information. Signed-off-by: Ping-Ke Shih <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://msgid.link/[email protected]
1 parent 178b8e7 commit edd77bb

File tree

2 files changed

+241
-0
lines changed

2 files changed

+241
-0
lines changed

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3722,6 +3722,72 @@ struct rtw89_fw_h2c_rf_get_mccch {
37223722
__le32 current_band_type;
37233723
} __packed;
37243724

3725+
enum rtw89_rf_log_type {
3726+
RTW89_RF_RUN_LOG = 0,
3727+
RTW89_RF_RPT_LOG = 1,
3728+
};
3729+
3730+
struct rtw89_c2h_rf_log_hdr {
3731+
u8 type; /* enum rtw89_rf_log_type */
3732+
__le16 len;
3733+
u8 content[];
3734+
} __packed;
3735+
3736+
struct rtw89_c2h_rf_dpk_rpt_log {
3737+
u8 ver;
3738+
u8 idx[2];
3739+
u8 band[2];
3740+
u8 bw[2];
3741+
u8 ch[2];
3742+
u8 path_ok[2];
3743+
u8 txagc[2];
3744+
u8 ther[2];
3745+
u8 gs[2];
3746+
u8 dc_i[4];
3747+
u8 dc_q[4];
3748+
u8 corr_val[2];
3749+
u8 corr_idx[2];
3750+
u8 is_timeout[2];
3751+
u8 rxbb_ov[2];
3752+
u8 rsvd;
3753+
} __packed;
3754+
3755+
struct rtw89_c2h_rf_dack_rpt_log {
3756+
u8 fwdack_ver;
3757+
u8 fwdack_rpt_ver;
3758+
u8 msbk_d[2][2][16];
3759+
u8 dadck_d[2][2];
3760+
u8 cdack_d[2][2][2];
3761+
__le16 addck2_d[2][2][2];
3762+
u8 adgaink_d[2][2];
3763+
__le16 biask_d[2][2];
3764+
u8 addck_timeout;
3765+
u8 cdack_timeout;
3766+
u8 dadck_timeout;
3767+
u8 msbk_timeout;
3768+
u8 adgaink_timeout;
3769+
u8 dack_fail;
3770+
} __packed;
3771+
3772+
struct rtw89_c2h_rf_rxdck_rpt_log {
3773+
u8 ver;
3774+
u8 band[2];
3775+
u8 bw[2];
3776+
u8 ch[2];
3777+
u8 timeout[2];
3778+
} __packed;
3779+
3780+
struct rtw89_c2h_rf_txgapk_rpt_log {
3781+
__le32 r0x8010[2];
3782+
__le32 chk_cnt;
3783+
u8 track_d[2][17];
3784+
u8 power_d[2][17];
3785+
u8 is_txgapk_ok;
3786+
u8 chk_id;
3787+
u8 ver;
3788+
u8 rsv1;
3789+
} __packed;
3790+
37253791
#define RTW89_FW_RSVD_PLE_SIZE 0x800
37263792

37273793
#define RTW89_FW_BACKTRACE_INFO_SIZE 8

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

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2445,34 +2445,209 @@ void (* const rtw89_phy_c2h_ra_handler[])(struct rtw89_dev *rtwdev,
24452445
[RTW89_PHY_C2H_FUNC_TXSTS] = NULL,
24462446
};
24472447

2448+
static void rtw89_phy_c2h_rfk_rpt_log(struct rtw89_dev *rtwdev,
2449+
enum rtw89_phy_c2h_rfk_log_func func,
2450+
void *content, u16 len)
2451+
{
2452+
struct rtw89_c2h_rf_txgapk_rpt_log *txgapk;
2453+
struct rtw89_c2h_rf_rxdck_rpt_log *rxdck;
2454+
struct rtw89_c2h_rf_dack_rpt_log *dack;
2455+
struct rtw89_c2h_rf_dpk_rpt_log *dpk;
2456+
2457+
switch (func) {
2458+
case RTW89_PHY_C2H_RFK_LOG_FUNC_DPK:
2459+
if (len != sizeof(*dpk))
2460+
goto out;
2461+
2462+
dpk = content;
2463+
rtw89_debug(rtwdev, RTW89_DBG_RFK,
2464+
"DPK ver:%d idx:%2ph band:%2ph bw:%2ph ch:%2ph path:%2ph\n",
2465+
dpk->ver, dpk->idx, dpk->band, dpk->bw, dpk->ch, dpk->path_ok);
2466+
rtw89_debug(rtwdev, RTW89_DBG_RFK,
2467+
"DPK txagc:%2ph ther:%2ph gs:%2ph dc_i:%4ph dc_q:%4ph\n",
2468+
dpk->txagc, dpk->ther, dpk->gs, dpk->dc_i, dpk->dc_q);
2469+
rtw89_debug(rtwdev, RTW89_DBG_RFK,
2470+
"DPK corr_v:%2ph corr_i:%2ph to:%2ph ov:%2ph\n",
2471+
dpk->corr_val, dpk->corr_idx, dpk->is_timeout, dpk->rxbb_ov);
2472+
return;
2473+
case RTW89_PHY_C2H_RFK_LOG_FUNC_DACK:
2474+
if (len != sizeof(*dack))
2475+
goto out;
2476+
2477+
dack = content;
2478+
2479+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ver=0x%x 0x%x\n",
2480+
dack->fwdack_ver, dack->fwdack_rpt_ver);
2481+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 CDACK ic = [0x%x, 0x%x]\n",
2482+
dack->cdack_d[0][0][0], dack->cdack_d[0][0][1]);
2483+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 CDACK qc = [0x%x, 0x%x]\n",
2484+
dack->cdack_d[0][1][0], dack->cdack_d[0][1][1]);
2485+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 CDACK ic = [0x%x, 0x%x]\n",
2486+
dack->cdack_d[1][0][0], dack->cdack_d[1][0][1]);
2487+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 CDACK qc = [0x%x, 0x%x]\n",
2488+
dack->cdack_d[1][1][0], dack->cdack_d[1][1][1]);
2489+
2490+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADC_DCK ic = [0x%x, 0x%x]\n",
2491+
dack->addck2_d[0][0][0], dack->addck2_d[0][0][1]);
2492+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADC_DCK qc = [0x%x, 0x%x]\n",
2493+
dack->addck2_d[0][1][0], dack->addck2_d[0][1][1]);
2494+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADC_DCK ic = [0x%x, 0x%x]\n",
2495+
dack->addck2_d[1][0][0], dack->addck2_d[1][0][1]);
2496+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADC_DCK qc = [0x%x, 0x%x]\n",
2497+
dack->addck2_d[1][1][0], dack->addck2_d[1][1][1]);
2498+
2499+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADC_GAINK ic = 0x%x, qc = 0x%x\n",
2500+
dack->adgaink_d[0][0], dack->adgaink_d[0][1]);
2501+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADC_GAINK ic = 0x%x, qc = 0x%x\n",
2502+
dack->adgaink_d[1][0], dack->adgaink_d[1][1]);
2503+
2504+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n",
2505+
dack->dadck_d[0][0], dack->dadck_d[0][1]);
2506+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n",
2507+
dack->dadck_d[1][0], dack->dadck_d[1][1]);
2508+
2509+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 biask iqc = 0x%x\n",
2510+
dack->biask_d[0][0]);
2511+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 biask iqc = 0x%x\n",
2512+
dack->biask_d[1][0]);
2513+
2514+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic: %*ph\n",
2515+
(int)sizeof(dack->msbk_d[0][0]), dack->msbk_d[0][0]);
2516+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc: %*ph\n",
2517+
(int)sizeof(dack->msbk_d[0][1]), dack->msbk_d[0][1]);
2518+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic: %*ph\n",
2519+
(int)sizeof(dack->msbk_d[1][0]), dack->msbk_d[1][0]);
2520+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc: %*ph\n",
2521+
(int)sizeof(dack->msbk_d[1][1]), dack->msbk_d[1][1]);
2522+
return;
2523+
case RTW89_PHY_C2H_RFK_LOG_FUNC_RXDCK:
2524+
if (len != sizeof(*rxdck))
2525+
goto out;
2526+
2527+
rxdck = content;
2528+
rtw89_debug(rtwdev, RTW89_DBG_RFK,
2529+
"RXDCK ver:%d band:%2ph bw:%2ph ch:%2ph to:%2ph\n",
2530+
rxdck->ver, rxdck->band, rxdck->bw, rxdck->ch,
2531+
rxdck->timeout);
2532+
return;
2533+
case RTW89_PHY_C2H_RFK_LOG_FUNC_TXGAPK:
2534+
if (len != sizeof(*txgapk))
2535+
goto out;
2536+
2537+
txgapk = content;
2538+
rtw89_debug(rtwdev, RTW89_DBG_RFK,
2539+
"[TXGAPK]rpt r0x8010[0]=0x%x, r0x8010[1]=0x%x\n",
2540+
le32_to_cpu(txgapk->r0x8010[0]),
2541+
le32_to_cpu(txgapk->r0x8010[1]));
2542+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt chk_id = %d\n",
2543+
txgapk->chk_id);
2544+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt chk_cnt = %d\n",
2545+
le32_to_cpu(txgapk->chk_cnt));
2546+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt ver = 0x%x\n",
2547+
txgapk->ver);
2548+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt rsv1 = %d\n",
2549+
txgapk->rsv1);
2550+
2551+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt track_d[0] = %*ph\n",
2552+
(int)sizeof(txgapk->track_d[0]), txgapk->track_d[0]);
2553+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt power_d[0] = %*ph\n",
2554+
(int)sizeof(txgapk->power_d[0]), txgapk->power_d[0]);
2555+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt track_d[1] = %*ph\n",
2556+
(int)sizeof(txgapk->track_d[1]), txgapk->track_d[1]);
2557+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[TXGAPK]rpt power_d[1] = %*ph\n",
2558+
(int)sizeof(txgapk->power_d[1]), txgapk->power_d[1]);
2559+
return;
2560+
default:
2561+
break;
2562+
}
2563+
2564+
out:
2565+
rtw89_debug(rtwdev, RTW89_DBG_RFK,
2566+
"unexpected RFK func %d report log with length %d\n", func, len);
2567+
}
2568+
2569+
static void rtw89_phy_c2h_rfk_log(struct rtw89_dev *rtwdev, struct sk_buff *c2h,
2570+
u32 len, enum rtw89_phy_c2h_rfk_log_func func,
2571+
const char *rfk_name)
2572+
{
2573+
struct rtw89_c2h_hdr *c2h_hdr = (struct rtw89_c2h_hdr *)c2h->data;
2574+
struct rtw89_c2h_rf_log_hdr *log_hdr;
2575+
void *log_ptr = c2h_hdr;
2576+
u16 content_len;
2577+
u16 chunk_len;
2578+
2579+
if (!rtw89_debug_is_enabled(rtwdev, RTW89_DBG_RFK))
2580+
return;
2581+
2582+
log_ptr += sizeof(*c2h_hdr);
2583+
len -= sizeof(*c2h_hdr);
2584+
2585+
while (len > sizeof(*log_hdr)) {
2586+
log_hdr = log_ptr;
2587+
content_len = le16_to_cpu(log_hdr->len);
2588+
chunk_len = content_len + sizeof(*log_hdr);
2589+
2590+
if (chunk_len > len)
2591+
break;
2592+
2593+
switch (log_hdr->type) {
2594+
case RTW89_RF_RUN_LOG:
2595+
rtw89_debug(rtwdev, RTW89_DBG_RFK, "%s run: %*ph\n",
2596+
rfk_name, content_len, log_hdr->content);
2597+
break;
2598+
case RTW89_RF_RPT_LOG:
2599+
rtw89_phy_c2h_rfk_rpt_log(rtwdev, func,
2600+
log_hdr->content, content_len);
2601+
break;
2602+
default:
2603+
return;
2604+
}
2605+
2606+
log_ptr += chunk_len;
2607+
len -= chunk_len;
2608+
}
2609+
}
2610+
24482611
static void
24492612
rtw89_phy_c2h_rfk_log_iqk(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
24502613
{
2614+
rtw89_phy_c2h_rfk_log(rtwdev, c2h, len,
2615+
RTW89_PHY_C2H_RFK_LOG_FUNC_IQK, "IQK");
24512616
}
24522617

24532618
static void
24542619
rtw89_phy_c2h_rfk_log_dpk(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
24552620
{
2621+
rtw89_phy_c2h_rfk_log(rtwdev, c2h, len,
2622+
RTW89_PHY_C2H_RFK_LOG_FUNC_DPK, "DPK");
24562623
}
24572624

24582625
static void
24592626
rtw89_phy_c2h_rfk_log_dack(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
24602627
{
2628+
rtw89_phy_c2h_rfk_log(rtwdev, c2h, len,
2629+
RTW89_PHY_C2H_RFK_LOG_FUNC_DACK, "DACK");
24612630
}
24622631

24632632
static void
24642633
rtw89_phy_c2h_rfk_log_rxdck(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
24652634
{
2635+
rtw89_phy_c2h_rfk_log(rtwdev, c2h, len,
2636+
RTW89_PHY_C2H_RFK_LOG_FUNC_RXDCK, "RX_DCK");
24662637
}
24672638

24682639
static void
24692640
rtw89_phy_c2h_rfk_log_tssi(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
24702641
{
2642+
rtw89_phy_c2h_rfk_log(rtwdev, c2h, len,
2643+
RTW89_PHY_C2H_RFK_LOG_FUNC_TSSI, "TSSI");
24712644
}
24722645

24732646
static void
24742647
rtw89_phy_c2h_rfk_log_txgapk(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
24752648
{
2649+
rtw89_phy_c2h_rfk_log(rtwdev, c2h, len,
2650+
RTW89_PHY_C2H_RFK_LOG_FUNC_TXGAPK, "TXGAPK");
24762651
}
24772652

24782653
static

0 commit comments

Comments
 (0)