wifi: rtw89: debug: add PMAC counter in bb_info

PMAC (Pseudo MAC) is a circuit within the baseband that can report
various packet-related counters through registers, such as TX ON,
TX EN, CCA, FA, CRC, etc. The driver periodically collects per
PHY PMAC counters in track_work and exposes them through the
bb_info debugfs for easier debugging.

The output of PMAC counter:

  == PMAC
  TX [CCK_TXEN, CCK_TXON, OFDM_TXEN, OFDM_TXON]: [0, 0, 17, 17]
  CRC  [CCK, OFDM, HT, VHT, HE, EHT, ALL, MPDU]
   ok: [0, 301, 0, 0, 5, 0, 306, 5]
  err: [0, 4, 0, 0, 0, 0, 4, 0]
  CCA [CCK, OFDM]: [0, 353]
  FA  [CCK, OFDM]: [0, 39]
  CCA spoofing [CCK, OFDM]: [0, 0]
  CCK SFD: 0, SIG_GG: 0
  OFDM Parity: 4, Rate: 2, LSIG_BRK_S: 0, LSIG_BRK_L: 7, SBD: 5
  AMPDU miss: 0

Signed-off-by: Kuan-Chung Chen <damon.chen@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20260429132625.1659182-5-pkshih@realtek.com
This commit is contained in:
Kuan-Chung Chen 2026-04-29 21:26:22 +08:00 committed by Ping-Ke Shih
parent 523d012f47
commit 3b851f36c3
11 changed files with 785 additions and 0 deletions

View File

@ -4487,6 +4487,54 @@ struct rtw89_edcca_regs {
u32 tx_collision_t2r_st_mask;
};
struct rtw89_pmac_regs {
struct rtw89_reg_def cck_txon;
struct rtw89_reg_def cck_txen;
struct rtw89_reg_def cck_cca;
struct rtw89_reg_def cck_sfd_gg;
struct rtw89_reg_def cck_sig_gg;
struct rtw89_reg_def cck_spoofing;
struct rtw89_reg_def cck_brk;
struct rtw89_reg_def brk;
struct rtw89_reg_def brk_option;
struct rtw89_reg_def search_fail;
struct rtw89_reg_def lsig_brk_s_th;
struct rtw89_reg_def lsig_brk_l_th;
struct rtw89_reg_def rxl_err_parity;
struct rtw89_reg_def rxl_err_rate;
struct rtw89_reg_def ofdm_cca;
struct rtw89_reg_def cca_spoofing;
struct rtw89_reg_def ampdu_miss;
struct rtw89_reg_def r1b_rx_rpt_rst;
struct rtw89_reg_def r1b_rr_sel;
struct rtw89_reg_def enable_all_cnt;
struct rtw89_reg_def rst_all_cnt;
u32 cck_crc32;
u32 cck_crc32_ok_mask;
u32 cck_crc32_fail_mask;
u32 ofdm_txon;
u32 ofdm_txon_mask;
u32 ofdm_txen_mask;
u32 l_crc;
u32 l_crc_ok_mask;
u32 l_crc_err_mask;
u32 ht_crc;
u32 ht_crc_ok_mask;
u32 ht_crc_err_mask;
u32 vht_crc;
u32 vht_crc_ok_mask;
u32 vht_crc_err_mask;
u32 he_crc;
u32 he_crc_ok_mask;
u32 he_crc_err_mask;
u32 eht_crc;
u32 eht_crc_ok_mask;
u32 eht_crc_err_mask;
u32 ampdu_crc;
u32 ampdu_crc_ok_mask;
u32 ampdu_crc_err_mask;
};
struct rtw89_phy_ul_tb_info {
bool dyn_tb_tri_en;
u8 def_if_bandedge;
@ -4682,6 +4730,7 @@ struct rtw89_chip_info {
struct rtw89_sb_regs btc_sb;
u32 dma_ch_mask;
const struct rtw89_edcca_regs *edcca_regs;
const struct rtw89_pmac_regs *pmac_regs;
const struct wiphy_wowlan_support *wowlan_stub;
const struct rtw89_xtal_info *xtal_info;
unsigned long default_quirks; /* bitmap of rtw89_quirks */
@ -5505,6 +5554,43 @@ struct rtw89_phy_ch_info {
u8 is_noisy;
};
struct rtw89_pmac_stat_info {
u32 cck_phy_txon;
u32 cck_mac_txen;
u32 ofdm_mac_txen;
u32 ofdm_phy_txon;
u32 cnt_ofdm_cca;
u32 cnt_cck_cca;
u32 cnt_cck_spoofing;
u32 cnt_ofdm_spoofing;
u32 cnt_ampdu_miss;
u32 cnt_ampdu_crc_error;
u32 cnt_ampdu_crc_ok;
u32 cnt_cck_crc32_error;
u32 cnt_cck_crc32_ok;
u32 cnt_ofdm_crc32_error;
u32 cnt_ofdm_crc32_ok;
u32 cnt_ht_crc32_error;
u32 cnt_ht_crc32_ok;
u32 cnt_vht_crc32_error;
u32 cnt_vht_crc32_ok;
u32 cnt_he_crc32_ok;
u32 cnt_he_crc32_error;
u32 cnt_eht_crc32_ok;
u32 cnt_eht_crc32_error;
u32 cnt_crc32_error_all;
u32 cnt_crc32_ok_all;
u32 cnt_sfd_gg;
u32 cnt_sig_gg;
u32 cnt_cck_fail;
u32 cnt_ofdm_fail;
u32 cnt_lsig_brk_s_th;
u32 cnt_lsig_brk_l_th;
u32 cnt_parity_fail;
u32 cnt_rate_illegal;
u32 cnt_sb_search_fail;
};
struct rtw89_agc_gaincode_set {
u8 lna_idx;
u8 tia_idx;
@ -6331,6 +6417,7 @@ struct rtw89_dev {
struct ewma_rssi bcn_rssi;
struct rtw89_pkt_stat cur_pkt_stat;
struct rtw89_pkt_stat last_pkt_stat;
struct rtw89_pmac_stat_info pmac_stat;
} bbs[RTW89_PHY_NUM];
struct wiphy_delayed_work track_work;

View File

@ -4141,10 +4141,43 @@ static ssize_t rtw89_debug_priv_phy_info_get(struct rtw89_dev *rtwdev,
static int rtw89_get_bb_stat(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb,
char *buf, size_t bufsz)
{
struct rtw89_pmac_stat_info *pmac = &bb->pmac_stat;
char *p = buf, *end = buf + bufsz;
p += scnprintf(p, end - p, "\n[PHY %u]\n", bb->phy_idx);
p += scnprintf(p, end - p, "== PMAC\n");
p += scnprintf(p, end - p,
"TX [CCK_TXEN, CCK_TXON, OFDM_TXEN, OFDM_TXON]: [%d, %d, %d, %d]\n",
pmac->cck_mac_txen, pmac->cck_phy_txon,
pmac->ofdm_mac_txen, pmac->ofdm_phy_txon);
p += scnprintf(p, end - p, "CRC [CCK, OFDM, HT, VHT, HE, EHT, ALL, MPDU]\n");
p += scnprintf(p, end - p, " ok: [%d, %d, %d, %d, %d, %d, %d, %d]\n",
pmac->cnt_cck_crc32_ok, pmac->cnt_ofdm_crc32_ok,
pmac->cnt_ht_crc32_ok, pmac->cnt_vht_crc32_ok,
pmac->cnt_he_crc32_ok, pmac->cnt_eht_crc32_ok,
pmac->cnt_crc32_ok_all, pmac->cnt_ampdu_crc_ok);
p += scnprintf(p, end - p, "err: [%d, %d, %d, %d, %d, %d, %d, %d]\n",
pmac->cnt_cck_crc32_error, pmac->cnt_ofdm_crc32_error,
pmac->cnt_ht_crc32_error, pmac->cnt_vht_crc32_error,
pmac->cnt_he_crc32_error, pmac->cnt_eht_crc32_error,
pmac->cnt_crc32_error_all, pmac->cnt_ampdu_crc_error);
p += scnprintf(p, end - p, "CCA [CCK, OFDM]: [%d, %d]\n",
pmac->cnt_cck_cca, pmac->cnt_ofdm_cca);
p += scnprintf(p, end - p, "FA [CCK, OFDM]: [%d, %d]\n",
pmac->cnt_cck_fail, pmac->cnt_ofdm_fail);
p += scnprintf(p, end - p, "CCA spoofing [CCK, OFDM]: [%d, %d]\n",
pmac->cnt_cck_spoofing, pmac->cnt_ofdm_spoofing);
p += scnprintf(p, end - p, "CCK SFD: %d, SIG_GG: %d\n",
pmac->cnt_sfd_gg, pmac->cnt_sig_gg);
p += scnprintf(p, end - p,
"OFDM Parity: %d, Rate: %d, LSIG_BRK_S: %d, LSIG_BRK_L: %d, SBD: %d\n",
pmac->cnt_parity_fail, pmac->cnt_rate_illegal,
pmac->cnt_lsig_brk_s_th, pmac->cnt_lsig_brk_l_th,
pmac->cnt_sb_search_fail);
p += scnprintf(p, end - p, "AMPDU miss: %d\n\n", pmac->cnt_ampdu_miss);
p += scnprintf(p, end - p, "== RSSI/RX Rate\n");
p += rtw89_get_rx_pkt_stat(rtwdev, bb, p, end - p);

View File

@ -5844,6 +5844,196 @@ static void rtw89_phy_stat_init(struct rtw89_dev *rtwdev)
rtwdev->hal.thermal_prot_lv = 0;
}
static void rtw89_phy_pmac_stat_reset(struct rtw89_dev *rtwdev,
struct rtw89_bb_ctx *bb, bool cck)
{
const struct rtw89_pmac_regs *regs = rtwdev->chip->pmac_regs;
if (cck) {
rtw89_phy_write32_clr(rtwdev, regs->r1b_rx_rpt_rst.addr,
regs->r1b_rx_rpt_rst.mask);
rtw89_phy_write32_set(rtwdev, regs->r1b_rx_rpt_rst.addr,
regs->r1b_rx_rpt_rst.mask);
}
rtw89_phy_write32_idx_set(rtwdev, regs->enable_all_cnt.addr,
regs->enable_all_cnt.mask, bb->phy_idx);
rtw89_phy_write32_idx_set(rtwdev, regs->rst_all_cnt.addr,
regs->rst_all_cnt.mask, bb->phy_idx);
rtw89_phy_write32_idx_clr(rtwdev, regs->rst_all_cnt.addr,
regs->rst_all_cnt.mask, bb->phy_idx);
}
static void rtw89_phy_pmac_stat_cck(struct rtw89_dev *rtwdev,
struct rtw89_bb_ctx *bb)
{
const struct rtw89_pmac_regs *regs = rtwdev->chip->pmac_regs;
struct rtw89_pmac_stat_info *pmac = &bb->pmac_stat;
const struct rtw89_chip_info *chip = rtwdev->chip;
u32 val;
pmac->cck_phy_txon =
rtw89_phy_read32_mask(rtwdev, regs->cck_txon.addr, regs->cck_txon.mask);
pmac->cck_mac_txen =
rtw89_phy_read32_mask(rtwdev, regs->cck_txen.addr, regs->cck_txen.mask);
if (chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev))
rtw89_phy_write32_mask(rtwdev, regs->r1b_rr_sel.addr,
regs->r1b_rr_sel.mask, 0x2);
if (bb->phy_idx == RTW89_PHY_1)
pmac->cnt_cck_cca =
rtw89_phy_read32_mask(rtwdev, regs->cck_cca.addr + 8,
regs->cck_cca.mask);
else
pmac->cnt_cck_cca =
rtw89_phy_read32_mask(rtwdev, regs->cck_cca.addr,
regs->cck_cca.mask);
if (chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev))
rtw89_phy_write32_mask(rtwdev, regs->r1b_rr_sel.addr,
regs->r1b_rr_sel.mask, 0x1);
if (bb->phy_idx == RTW89_PHY_1)
val = rtw89_phy_read32(rtwdev, regs->cck_crc32 + 8);
else
val = rtw89_phy_read32(rtwdev, regs->cck_crc32);
pmac->cnt_cck_crc32_ok = field_get(regs->cck_crc32_ok_mask, val);
pmac->cnt_cck_crc32_error = field_get(regs->cck_crc32_fail_mask, val);
pmac->cnt_sfd_gg =
rtw89_phy_read32_idx(rtwdev, regs->cck_sfd_gg.addr,
regs->cck_sfd_gg.mask, bb->phy_idx);
pmac->cnt_sig_gg =
rtw89_phy_read32_idx(rtwdev, regs->cck_sig_gg.addr,
regs->cck_sig_gg.mask, bb->phy_idx);
pmac->cnt_cck_spoofing =
rtw89_phy_read32_idx(rtwdev, regs->cck_spoofing.addr,
regs->cck_spoofing.mask, bb->phy_idx);
if (chip->chip_id == RTL8852A || rtw89_is_rtl885xb(rtwdev))
pmac->cnt_cck_fail =
pmac->cnt_cck_cca - pmac->cnt_cck_crc32_ok -
pmac->cnt_cck_crc32_error - pmac->cnt_cck_spoofing;
else
pmac->cnt_cck_fail =
rtw89_phy_read32_idx(rtwdev, regs->cck_brk.addr,
regs->cck_brk.mask, bb->phy_idx);
}
static void rtw89_phy_pmac_stat_ofdm(struct rtw89_dev *rtwdev,
struct rtw89_bb_ctx *bb)
{
const struct rtw89_pmac_regs *regs = rtwdev->chip->pmac_regs;
struct rtw89_pmac_stat_info *pmac = &bb->pmac_stat;
const struct rtw89_chip_info *chip = rtwdev->chip;
u32 val;
val = rtw89_phy_read32_idx(rtwdev, regs->ofdm_txon, MASKDWORD, bb->phy_idx);
pmac->ofdm_phy_txon = field_get(regs->ofdm_txon_mask, val);
pmac->ofdm_mac_txen = field_get(regs->ofdm_txen_mask, val);
val = rtw89_phy_read32_idx(rtwdev, regs->l_crc, MASKDWORD, bb->phy_idx);
pmac->cnt_ofdm_crc32_ok = field_get(regs->l_crc_ok_mask, val);
pmac->cnt_ofdm_crc32_error = field_get(regs->l_crc_err_mask, val);
val = rtw89_phy_read32_idx(rtwdev, regs->ht_crc, MASKDWORD, bb->phy_idx);
pmac->cnt_ht_crc32_ok = field_get(regs->ht_crc_ok_mask, val);
pmac->cnt_ht_crc32_error = field_get(regs->ht_crc_err_mask, val);
val = rtw89_phy_read32_idx(rtwdev, regs->vht_crc, MASKDWORD, bb->phy_idx);
pmac->cnt_vht_crc32_ok = field_get(regs->vht_crc_ok_mask, val);
pmac->cnt_vht_crc32_error = field_get(regs->vht_crc_err_mask, val);
val = rtw89_phy_read32_idx(rtwdev, regs->he_crc, MASKDWORD, bb->phy_idx);
pmac->cnt_he_crc32_ok = field_get(regs->he_crc_ok_mask, val);
pmac->cnt_he_crc32_error = field_get(regs->he_crc_err_mask, val);
if (chip->chip_gen == RTW89_CHIP_BE) {
val = rtw89_phy_read32_idx(rtwdev, regs->eht_crc,
MASKDWORD, bb->phy_idx);
pmac->cnt_eht_crc32_ok = field_get(regs->eht_crc_ok_mask, val);
pmac->cnt_eht_crc32_error = field_get(regs->eht_crc_err_mask, val);
}
val = rtw89_phy_read32_idx(rtwdev, regs->ampdu_crc, MASKDWORD, bb->phy_idx);
pmac->cnt_ampdu_crc_ok = field_get(regs->ampdu_crc_ok_mask, val);
pmac->cnt_ampdu_crc_error = field_get(regs->ampdu_crc_err_mask, val);
val = rtw89_phy_read32_idx(rtwdev, regs->brk.addr, regs->brk.mask, bb->phy_idx);
if (chip->chip_id == RTL8852C &&
rtw89_phy_read32_idx(rtwdev, regs->brk_option.addr,
regs->brk_option.mask, bb->phy_idx) == 1) {
u32 tmp = pmac->ofdm_phy_txon + pmac->cck_phy_txon;
val = (val > tmp) ? (val - tmp) : 0;
}
pmac->cnt_ofdm_fail = val;
pmac->cnt_sb_search_fail =
rtw89_phy_read32_idx(rtwdev, regs->search_fail.addr,
regs->search_fail.mask, bb->phy_idx);
pmac->cnt_lsig_brk_s_th =
rtw89_phy_read32_idx(rtwdev, regs->lsig_brk_s_th.addr,
regs->lsig_brk_s_th.mask, bb->phy_idx);
pmac->cnt_lsig_brk_l_th =
rtw89_phy_read32_idx(rtwdev, regs->lsig_brk_l_th.addr,
regs->lsig_brk_l_th.mask, bb->phy_idx);
pmac->cnt_parity_fail =
rtw89_phy_read32_idx(rtwdev, regs->rxl_err_parity.addr,
regs->rxl_err_parity.mask, bb->phy_idx);
pmac->cnt_rate_illegal =
rtw89_phy_read32_idx(rtwdev, regs->rxl_err_rate.addr,
regs->rxl_err_rate.mask, bb->phy_idx);
pmac->cnt_ofdm_cca =
rtw89_phy_read32_idx(rtwdev, regs->ofdm_cca.addr,
regs->ofdm_cca.mask, bb->phy_idx);
pmac->cnt_ofdm_spoofing =
rtw89_phy_read32_idx(rtwdev, regs->cca_spoofing.addr,
regs->cca_spoofing.mask, bb->phy_idx);
pmac->cnt_ampdu_miss =
rtw89_phy_read32_idx(rtwdev, regs->ampdu_miss.addr,
regs->ampdu_miss.mask, bb->phy_idx);
}
static void rtw89_phy_pmac_stat_update(struct rtw89_dev *rtwdev,
struct rtw89_bb_ctx *bb)
{
struct rtw89_pmac_stat_info *pmac = &bb->pmac_stat;
const struct rtw89_chip_info *chip = rtwdev->chip;
struct rtw89_entity_conf conf;
const struct rtw89_chan *chan;
bool cck;
rtw89_entity_get_conf(rtwdev, &conf);
chan = conf.chans[bb->phy_idx];
cck = chan->band_type == RTW89_BAND_2G;
if (cck)
rtw89_phy_pmac_stat_cck(rtwdev, bb);
rtw89_phy_pmac_stat_ofdm(rtwdev, bb);
pmac->cnt_crc32_error_all = pmac->cnt_he_crc32_error +
pmac->cnt_vht_crc32_error +
pmac->cnt_ht_crc32_error +
pmac->cnt_ofdm_crc32_error +
pmac->cnt_cck_crc32_error;
pmac->cnt_crc32_ok_all = pmac->cnt_he_crc32_ok +
pmac->cnt_vht_crc32_ok +
pmac->cnt_ht_crc32_ok +
pmac->cnt_ofdm_crc32_ok +
pmac->cnt_cck_crc32_ok;
if (chip->chip_gen == RTW89_CHIP_BE) {
pmac->cnt_crc32_error_all += pmac->cnt_eht_crc32_error;
pmac->cnt_crc32_ok_all += pmac->cnt_eht_crc32_ok;
}
rtw89_phy_pmac_stat_reset(rtwdev, bb, cck);
}
static void rtw89_phy_trigger_tx_count(struct rtw89_dev *rtwdev)
{
if (RTW89_CHK_FW_FEATURE(TX_HISTORY_V1, &rtwdev->fw))
@ -5854,10 +6044,15 @@ static void rtw89_phy_trigger_tx_count(struct rtw89_dev *rtwdev)
static void rtw89_phy_stat_update(struct rtw89_dev *rtwdev)
{
struct rtw89_bb_ctx *bb;
if (!rtwdev->phy_info.bb_stat_cfg.enable)
return;
rtw89_phy_trigger_tx_count(rtwdev);
rtw89_for_each_active_bb(rtwdev, bb)
rtw89_phy_pmac_stat_update(rtwdev, bb);
}
void rtw89_phy_stat_track(struct rtw89_dev *rtwdev)

View File

@ -8799,6 +8799,12 @@
#define R_P0_ANT_SW 0x0728
#define B_P0_HW_ANTSW_DIS_BY_GNT_BT BIT(12)
#define B_P0_TRSW_TX_EXTEND GENMASK(3, 0)
#define R_RST_ALL_CNT 0x0730
#define R_RST_ALL_CNT_BE4 0x20730
#define B_RST_ALL_CNT BIT(0)
#define R_ENABLE_ALL_CNT 0x0730
#define R_ENABLE_ALL_CNT_BE4 0x20730
#define B_ENABLE_ALL_CNT BIT(1)
#define R_MAC_PIN_SEL 0x0734
#define R_MAC_PIN_SEL_BE4 0x20734
#define B_CH_IDX_SEG0 GENMASK(23, 16)
@ -8949,6 +8955,8 @@
#define B_RXHT_MCS_LIMIT GENMASK(9, 8)
#define R_RXVHT_MCS_LIMIT 0x0D18
#define B_RXVHT_MCS_LIMIT GENMASK(22, 21)
#define R_BRK_OPT 0x0D44
#define B_BRK_OPT BIT(31)
#define R_P0_EN_SOUND_WO_NDP 0x0D7C
#define B_P0_EN_SOUND_WO_NDP BIT(1)
#define R_RXHE 0x0D80
@ -9004,6 +9012,21 @@
#define R_CFO_COMP_SEG0_L 0x1384
#define R_CFO_COMP_SEG0_H 0x1388
#define R_CFO_COMP_SEG0_CTRL 0x138C
#define R_CNT_CCKTXEN 0x1700
#define R_CNT_CCKTXEN_V1 0x2E00
#define R_CNT_CCKTXEN_BE4 0x2CF00
#define B_CNT_CCKTXEN GENMASK(31, 16)
#define R_CNT_CCKTXON 0x1704
#define R_CNT_CCKTXON_V1 0x2E04
#define R_CNT_CCKTXON_BE4 0x2CF04
#define B_CNT_CCKTXON GENMASK(15, 0)
#define R_CNT_CCK_CCA_P0 0x1710
#define R_CNT_CCK_CCA_P0_V1 0x2E10
#define B_CNT_CCK_CCA_P0 GENMASK(15, 0)
#define R_CNT_CCK_CRC32_P0 0x1714
#define R_CNT_CCK_CRC32_P0_V1 0x2E14
#define B_CNT_CCK_CRC32OK_P0 GENMASK(15, 0)
#define B_CNT_CCK_CRC32FAIL_P0 GENMASK(31, 16)
#define R_DBG32_D 0x1730
#define R_EDCCA_RPT_A 0x1738
#define R_EDCCA_RPT_B 0x173c
@ -9019,7 +9042,73 @@
#define B_SWSI_W_BUSY_V1 BIT(24)
#define B_SWSI_R_BUSY_V1 BIT(25)
#define B_SWSI_R_DATA_DONE_V1 BIT(26)
#define R_CNT_LSIG_BRK_S_TH 0x1A00
#define R_CNT_LSIG_BRK_S_TH_V1 0x0E00
#define R_CNT_LSIG_BRK_S_TH_BE4 0x20E00
#define B_CNT_LSIG_BRK_S_TH GENMASK(31, 16)
#define R_CNT_CCA_SPOOFING 0x1A00
#define R_CNT_CCA_SPOOFING_V1 0x0E00
#define R_CNT_CCA_SPOOFING_BE4 0x20E00
#define B_CNT_CCA_SPOOFING GENMASK(15, 0)
#define R_CNT_LSIG_BRK_L_TH 0x1A04
#define R_CNT_LSIG_BRK_L_TH_V1 0x0E04
#define R_CNT_LSIG_BRK_L_TH_BE4 0x20E04
#define B_CNT_LSIG_BRK_L_TH GENMASK(15, 0)
#define R_CNT_BRK 0x1A08
#define R_CNT_BRK_V1 0x0E08
#define R_CNT_BRK_BE4 0x20E08
#define B_CNT_BRK GENMASK(31, 16)
#define R_CNT_RXL_ERR_PARITY 0x1A0C
#define R_CNT_RXL_ERR_PARITY_V1 0x0E0C
#define R_CNT_RXL_ERR_PARITY_BE4 0x20E0C
#define B_CNT_RXL_ERR_PARITY GENMASK(31, 16)
#define R_CNT_RXL_ERR_RATE 0x1A10
#define R_CNT_RXL_ERR_RATE_V1 0x0E10
#define R_CNT_RXL_ERR_RATE_BE4 0x20E10
#define B_CNT_RXL_ERR_RATE GENMASK(15, 0)
#define R_CNT_SEARCH_FAIL 0x1A20
#define R_CNT_SEARCH_FAIL_V1 0x0E20
#define R_CNT_SEARCH_FAIL_BE4 0x20E20
#define B_CNT_SEARCH_FAIL GENMASK(31, 16)
#define R_CNT_OFDM_CCA 0x1A24
#define R_CNT_OFDM_CCA_V1 0x0E24
#define R_CNT_OFDM_CCA_BE4 0x20E24
#define B_CNT_OFDM_CCA GENMASK(15, 0)
#define R_TX_COUNTER 0x1A40
#define R_CNT_OFDMTXON 0x1A40
#define R_CNT_OFDMTXON_V1 0x0E40
#define R_CNT_OFDMTXON_BE4 0x20E40
#define B_CNT_OFDMTXON GENMASK(15, 0)
#define B_CNT_OFDMTXEN GENMASK(31, 16)
#define R_CNT_HE_CRC 0x1A58
#define R_CNT_HE_CRC_V1 0x0E58
#define R_CNT_HE_CRC_BE4 0x20E58
#define B_CNT_HE_CRC_OK GENMASK(15, 0)
#define B_CNT_HE_CRC_ERR GENMASK(31, 16)
#define R_CNT_VHT_CRC 0x1A5C
#define R_CNT_VHT_CRC_V1 0x0E5C
#define R_CNT_VHT_CRC_BE4 0x20E5C
#define B_CNT_VHT_CRC_OK GENMASK(15, 0)
#define B_CNT_VHT_CRC_ERR GENMASK(31, 16)
#define R_CNT_HT_CRC 0x1A60
#define R_CNT_HT_CRC_V1 0x0E60
#define R_CNT_HT_CRC_BE4 0x20E60
#define B_CNT_HT_CRC_OK GENMASK(15, 0)
#define B_CNT_HT_CRC_ERR GENMASK(31, 16)
#define R_CNT_L_CRC 0x1A64
#define R_CNT_L_CRC_V1 0x0E64
#define R_CNT_L_CRC_BE4 0x20E64
#define B_CNT_L_CRC_OK GENMASK(15, 0)
#define B_CNT_L_CRC_ERR GENMASK(31, 16)
#define R_CNT_AMPDU_MISS 0x1A7C
#define R_CNT_AMPDU_MISS_V1 0x0E7C
#define R_CNT_AMPDU_MISS_BE4 0x20E7C
#define B_CNT_AMPDU_MISS GENMASK(31, 16)
#define R_CNT_AMPDU_RX_CRC32 0x1A80
#define R_CNT_AMPDU_RX_CRC32_V1 0x0E80
#define R_CNT_AMPDU_RX_CRC32_BE4 0x20E80
#define B_CNT_AMPDU_RX_CRC32_OK GENMASK(15, 0)
#define B_CNT_AMPDU_RX_CRC32_ERR GENMASK(31, 16)
#define R_NHM_CNT0 0x1A88
#define B_NHM_CNT0_MSK GENMASK(15, 0)
#define B_NHM_CNT1_MSK GENMASK(31, 16)
@ -9137,12 +9226,41 @@
#define B_RXCCA_DIS_V1 BIT(0)
#define R_RXSC 0x237C
#define B_RXSC_EN BIT(0)
#define R_R1B_RR_SEL 0x2388
#define B_R1B_RR_SEL GENMASK(24, 23)
#define R_R1B_RX_RPT_RST 0x2388
#define R_R1B_RX_RPT_RST_V1 0x2340
#define R_R1B_RX_RPT_RST_BE 0x0540
#define R_R1B_RX_RPT_RST_BE4 0x20540
#define B_R1B_RX_RPT_RST BIT(15)
#define B_R1B_RX_RPT_RST_V1 BIT(7)
#define R_BRK_CNT 0x239C
#define R_BRK_CNT_V1 0x059C
#define R_BRK_CNT_BE4 0x2059C
#define B_BRK_CNT GENMASK(31, 16)
#define R_RX_RPL_OFST 0x23AC
#define B_RX_RPL_OFST_CCK_MASK GENMASK(6, 0)
#define R_RXSCOBC 0x23B0
#define B_RXSCOBC_TH GENMASK(18, 0)
#define R_RXSCOCCK 0x23B4
#define B_RXSCOCCK_TH GENMASK(18, 0)
#define R_SFD_GG_CNT 0x23E0
#define R_SFD_GG_CNT_V1 0x23A0
#define R_SFD_GG_CNT_V2 0x05A0
#define R_SFD_GG_CNT_BE4 0x205A0
#define B_SFD_GG_CNT GENMASK(15, 0)
#define R_SIG_GG_CNT 0x23E8
#define R_SIG_GG_CNT_V1 0x23AC
#define R_SIG_GG_CNT_V2 0x05AC
#define R_SIG_GG_CNT_BE4 0x205AC
#define B_SIG_GG_CNT GENMASK(15, 0)
#define B_SIG_GG_CNT_V1 GENMASK(15, 8)
#define R_SPOOF_CNT 0x23EC
#define R_SPOOF_CNT_V1 0x23A8
#define R_SPOOF_CNT_V2 0x05A8
#define R_SPOOF_CNT_BE4 0x205A8
#define B_SPOOF_CNT GENMASK(7, 0)
#define B_SPOOF_CNT_V1 GENMASK(31, 16)
#define R_P80_AT_HIGH_FREQ_RU_ALLOC 0x2410
#define B_P80_AT_HIGH_FREQ_RU_ALLOC_PHY1 BIT(14)
#define B_P80_AT_HIGH_FREQ_RU_ALLOC_PHY0 BIT(13)
@ -9179,6 +9297,10 @@
#define R_EDCCA_RPT_B_BE4_C1 0x2FE34
#define R_EDCCA_RPT_P1_A_BE 0x2E40
#define R_EDCCA_RPT_P1_B_BE 0x2E44
#define R_CNT_EHT_CRC 0x2F00
#define R_CNT_EHT_CRC_BE4 0x22F00
#define B_CNT_EHT_CRC_OK GENMASK(15, 0)
#define B_CNT_EHT_CRC_ERR GENMASK(31, 16)
#define R_S1_HW_SI_DIS 0x3200
#define B_S1_HW_SI_DIS_W_R_TRIG GENMASK(30, 28)
#define R_P1_RXCK 0x32A0
@ -10547,6 +10669,11 @@
#define R_IFS_T3_HIS_BE4 0x20F54
#define B_IFS_T3_HIS_BE4 GENMASK(15, 0)
#define B_IFS_T4_HIS_BE4 GENMASK(31, 16)
#define R_CNT_CCK_CCA_BE4 0x20FE8
#define B_CNT_CCK_CCA_BE4 GENMASK(15, 0)
#define R_CNT_CCK_CRC32_BE4 0x20FEC
#define B_CNT_CCK_CRC32OK_BE4 GENMASK(15, 0)
#define B_CNT_CCK_CRC32FAIL_BE4 GENMASK(31, 16)
#define R_TX_ERROR_SEL_BE4 0x21254
#define B_TX_ERROR_PSDU_BE4 BIT(11)

View File

@ -307,6 +307,54 @@ static const struct rtw89_edcca_regs rtw8851b_edcca_regs = {
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
static const struct rtw89_pmac_regs rtw8851b_pmac_regs = {
.cck_txon = {R_CNT_CCKTXON, B_CNT_CCKTXON},
.cck_txen = {R_CNT_CCKTXEN, B_CNT_CCKTXEN},
.cck_cca = {R_CNT_CCK_CCA_P0, B_CNT_CCK_CCA_P0},
.cck_sfd_gg = {R_SFD_GG_CNT, B_SFD_GG_CNT},
.cck_sig_gg = {R_SIG_GG_CNT, B_SIG_GG_CNT},
.cck_spoofing = {R_SPOOF_CNT, B_SPOOF_CNT},
.cck_brk = {},
.brk = {R_CNT_BRK, B_CNT_BRK},
.brk_option = {},
.search_fail = {R_CNT_SEARCH_FAIL, B_CNT_SEARCH_FAIL},
.lsig_brk_s_th = {R_CNT_LSIG_BRK_S_TH, B_CNT_LSIG_BRK_S_TH},
.lsig_brk_l_th = {R_CNT_LSIG_BRK_L_TH, B_CNT_LSIG_BRK_L_TH},
.rxl_err_parity = {R_CNT_RXL_ERR_PARITY, B_CNT_RXL_ERR_PARITY},
.rxl_err_rate = {R_CNT_RXL_ERR_RATE, B_CNT_RXL_ERR_RATE},
.ofdm_cca = {R_CNT_OFDM_CCA, B_CNT_OFDM_CCA},
.cca_spoofing = {R_CNT_CCA_SPOOFING, B_CNT_CCA_SPOOFING},
.ampdu_miss = {R_CNT_AMPDU_MISS, B_CNT_AMPDU_MISS},
.r1b_rx_rpt_rst = {R_R1B_RX_RPT_RST, B_R1B_RX_RPT_RST},
.r1b_rr_sel = {R_R1B_RR_SEL, B_R1B_RR_SEL},
.enable_all_cnt = {R_ENABLE_ALL_CNT, B_ENABLE_ALL_CNT},
.rst_all_cnt = {R_RST_ALL_CNT, B_RST_ALL_CNT},
.cck_crc32 = R_CNT_CCK_CRC32_P0,
.cck_crc32_ok_mask = B_CNT_CCK_CRC32OK_P0,
.cck_crc32_fail_mask = B_CNT_CCK_CRC32FAIL_P0,
.ofdm_txon = R_CNT_OFDMTXON,
.ofdm_txon_mask = B_CNT_OFDMTXON,
.ofdm_txen_mask = B_CNT_OFDMTXEN,
.l_crc = R_CNT_L_CRC,
.l_crc_ok_mask = B_CNT_L_CRC_OK,
.l_crc_err_mask = B_CNT_L_CRC_ERR,
.ht_crc = R_CNT_HT_CRC,
.ht_crc_ok_mask = B_CNT_HT_CRC_OK,
.ht_crc_err_mask = B_CNT_HT_CRC_ERR,
.vht_crc = R_CNT_VHT_CRC,
.vht_crc_ok_mask = B_CNT_VHT_CRC_OK,
.vht_crc_err_mask = B_CNT_VHT_CRC_ERR,
.he_crc = R_CNT_HE_CRC,
.he_crc_ok_mask = B_CNT_HE_CRC_OK,
.he_crc_err_mask = B_CNT_HE_CRC_ERR,
.eht_crc = 0,
.eht_crc_ok_mask = 0,
.eht_crc_err_mask = 0,
.ampdu_crc = R_CNT_AMPDU_RX_CRC32,
.ampdu_crc_ok_mask = B_CNT_AMPDU_RX_CRC32_OK,
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
static const struct rtw89_btc_rf_trx_para rtw89_btc_8851b_rf_ul[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
@ -2722,6 +2770,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
.edcca_regs = &rtw8851b_edcca_regs,
.pmac_regs = &rtw8851b_pmac_regs,
#ifdef CONFIG_PM
.wowlan_stub = &rtw_wowlan_stub_8851b,
#endif

View File

@ -621,6 +621,54 @@ static const struct rtw89_edcca_regs rtw8852a_edcca_regs = {
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
static const struct rtw89_pmac_regs rtw8852a_pmac_regs = {
.cck_txon = {R_CNT_CCKTXON, B_CNT_CCKTXON},
.cck_txen = {R_CNT_CCKTXEN, B_CNT_CCKTXEN},
.cck_cca = {R_CNT_CCK_CCA_P0, B_CNT_CCK_CCA_P0},
.cck_sfd_gg = {R_SFD_GG_CNT, B_SFD_GG_CNT},
.cck_sig_gg = {R_SIG_GG_CNT, B_SIG_GG_CNT},
.cck_spoofing = {R_SPOOF_CNT, B_SPOOF_CNT},
.cck_brk = {},
.brk = {R_CNT_BRK, B_CNT_BRK},
.brk_option = {},
.search_fail = {R_CNT_SEARCH_FAIL, B_CNT_SEARCH_FAIL},
.lsig_brk_s_th = {R_CNT_LSIG_BRK_S_TH, B_CNT_LSIG_BRK_S_TH},
.lsig_brk_l_th = {R_CNT_LSIG_BRK_L_TH, B_CNT_LSIG_BRK_L_TH},
.rxl_err_parity = {R_CNT_RXL_ERR_PARITY, B_CNT_RXL_ERR_PARITY},
.rxl_err_rate = {R_CNT_RXL_ERR_RATE, B_CNT_RXL_ERR_RATE},
.ofdm_cca = {R_CNT_OFDM_CCA, B_CNT_OFDM_CCA},
.cca_spoofing = {R_CNT_CCA_SPOOFING, B_CNT_CCA_SPOOFING},
.ampdu_miss = {R_CNT_AMPDU_MISS, B_CNT_AMPDU_MISS},
.r1b_rx_rpt_rst = {R_R1B_RX_RPT_RST, B_R1B_RX_RPT_RST},
.r1b_rr_sel = {R_R1B_RR_SEL, B_R1B_RR_SEL},
.enable_all_cnt = {R_ENABLE_ALL_CNT, B_ENABLE_ALL_CNT},
.rst_all_cnt = {R_RST_ALL_CNT, B_RST_ALL_CNT},
.cck_crc32 = R_CNT_CCK_CRC32_P0,
.cck_crc32_ok_mask = B_CNT_CCK_CRC32OK_P0,
.cck_crc32_fail_mask = B_CNT_CCK_CRC32FAIL_P0,
.ofdm_txon = R_CNT_OFDMTXON,
.ofdm_txon_mask = B_CNT_OFDMTXON,
.ofdm_txen_mask = B_CNT_OFDMTXEN,
.l_crc = R_CNT_L_CRC,
.l_crc_ok_mask = B_CNT_L_CRC_OK,
.l_crc_err_mask = B_CNT_L_CRC_ERR,
.ht_crc = R_CNT_HT_CRC,
.ht_crc_ok_mask = B_CNT_HT_CRC_OK,
.ht_crc_err_mask = B_CNT_HT_CRC_ERR,
.vht_crc = R_CNT_VHT_CRC,
.vht_crc_ok_mask = B_CNT_VHT_CRC_OK,
.vht_crc_err_mask = B_CNT_VHT_CRC_ERR,
.he_crc = R_CNT_HE_CRC,
.he_crc_ok_mask = B_CNT_HE_CRC_OK,
.he_crc_err_mask = B_CNT_HE_CRC_ERR,
.eht_crc = 0,
.eht_crc_ok_mask = 0,
.eht_crc_err_mask = 0,
.ampdu_crc = R_CNT_AMPDU_RX_CRC32,
.ampdu_crc_ok_mask = B_CNT_AMPDU_RX_CRC32_OK,
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
static void rtw8852a_efuse_parsing_tssi(struct rtw89_dev *rtwdev,
struct rtw8852a_efuse *map)
{
@ -2459,6 +2507,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
.btc_sb = {{{R_AX_SCOREBOARD, R_AX_SCOREBOARD},}},
.dma_ch_mask = 0,
.edcca_regs = &rtw8852a_edcca_regs,
.pmac_regs = &rtw8852a_pmac_regs,
#ifdef CONFIG_PM
.wowlan_stub = &rtw_wowlan_stub_8852a,
#endif

View File

@ -259,6 +259,54 @@ static const struct rtw89_edcca_regs rtw8852b_edcca_regs = {
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
static const struct rtw89_pmac_regs rtw8852b_pmac_regs = {
.cck_txon = {R_CNT_CCKTXON, B_CNT_CCKTXON},
.cck_txen = {R_CNT_CCKTXEN, B_CNT_CCKTXEN},
.cck_cca = {R_CNT_CCK_CCA_P0, B_CNT_CCK_CCA_P0},
.cck_sfd_gg = {R_SFD_GG_CNT, B_SFD_GG_CNT},
.cck_sig_gg = {R_SIG_GG_CNT, B_SIG_GG_CNT},
.cck_spoofing = {R_SPOOF_CNT, B_SPOOF_CNT},
.cck_brk = {},
.brk = {R_CNT_BRK, B_CNT_BRK},
.brk_option = {},
.search_fail = {R_CNT_SEARCH_FAIL, B_CNT_SEARCH_FAIL},
.lsig_brk_s_th = {R_CNT_LSIG_BRK_S_TH, B_CNT_LSIG_BRK_S_TH},
.lsig_brk_l_th = {R_CNT_LSIG_BRK_L_TH, B_CNT_LSIG_BRK_L_TH},
.rxl_err_parity = {R_CNT_RXL_ERR_PARITY, B_CNT_RXL_ERR_PARITY},
.rxl_err_rate = {R_CNT_RXL_ERR_RATE, B_CNT_RXL_ERR_RATE},
.ofdm_cca = {R_CNT_OFDM_CCA, B_CNT_OFDM_CCA},
.cca_spoofing = {R_CNT_CCA_SPOOFING, B_CNT_CCA_SPOOFING},
.ampdu_miss = {R_CNT_AMPDU_MISS, B_CNT_AMPDU_MISS},
.r1b_rx_rpt_rst = {R_R1B_RX_RPT_RST, B_R1B_RX_RPT_RST},
.r1b_rr_sel = {R_R1B_RR_SEL, B_R1B_RR_SEL},
.enable_all_cnt = {R_ENABLE_ALL_CNT, B_ENABLE_ALL_CNT},
.rst_all_cnt = {R_RST_ALL_CNT, B_RST_ALL_CNT},
.cck_crc32 = R_CNT_CCK_CRC32_P0,
.cck_crc32_ok_mask = B_CNT_CCK_CRC32OK_P0,
.cck_crc32_fail_mask = B_CNT_CCK_CRC32FAIL_P0,
.ofdm_txon = R_CNT_OFDMTXON,
.ofdm_txon_mask = B_CNT_OFDMTXON,
.ofdm_txen_mask = B_CNT_OFDMTXEN,
.l_crc = R_CNT_L_CRC,
.l_crc_ok_mask = B_CNT_L_CRC_OK,
.l_crc_err_mask = B_CNT_L_CRC_ERR,
.ht_crc = R_CNT_HT_CRC,
.ht_crc_ok_mask = B_CNT_HT_CRC_OK,
.ht_crc_err_mask = B_CNT_HT_CRC_ERR,
.vht_crc = R_CNT_VHT_CRC,
.vht_crc_ok_mask = B_CNT_VHT_CRC_OK,
.vht_crc_err_mask = B_CNT_VHT_CRC_ERR,
.he_crc = R_CNT_HE_CRC,
.he_crc_ok_mask = B_CNT_HE_CRC_OK,
.he_crc_err_mask = B_CNT_HE_CRC_ERR,
.eht_crc = 0,
.eht_crc_ok_mask = 0,
.eht_crc_err_mask = 0,
.ampdu_crc = R_CNT_AMPDU_RX_CRC32,
.ampdu_crc_ok_mask = B_CNT_AMPDU_RX_CRC32_OK,
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_ul[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
@ -1056,6 +1104,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
.edcca_regs = &rtw8852b_edcca_regs,
.pmac_regs = &rtw8852b_pmac_regs,
#ifdef CONFIG_PM
.wowlan_stub = &rtw_wowlan_stub_8852b,
#endif

View File

@ -202,6 +202,54 @@ static const struct rtw89_edcca_regs rtw8852bt_edcca_regs = {
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
static const struct rtw89_pmac_regs rtw8852bt_pmac_regs = {
.cck_txon = {R_CNT_CCKTXON, B_CNT_CCKTXON},
.cck_txen = {R_CNT_CCKTXEN, B_CNT_CCKTXEN},
.cck_cca = {R_CNT_CCK_CCA_P0, B_CNT_CCK_CCA_P0},
.cck_sfd_gg = {R_SFD_GG_CNT, B_SFD_GG_CNT},
.cck_sig_gg = {R_SIG_GG_CNT, B_SIG_GG_CNT},
.cck_spoofing = {R_SPOOF_CNT, B_SPOOF_CNT},
.cck_brk = {},
.brk = {R_CNT_BRK, B_CNT_BRK},
.brk_option = {},
.search_fail = {R_CNT_SEARCH_FAIL, B_CNT_SEARCH_FAIL},
.lsig_brk_s_th = {R_CNT_LSIG_BRK_S_TH, B_CNT_LSIG_BRK_S_TH},
.lsig_brk_l_th = {R_CNT_LSIG_BRK_L_TH, B_CNT_LSIG_BRK_L_TH},
.rxl_err_parity = {R_CNT_RXL_ERR_PARITY, B_CNT_RXL_ERR_PARITY},
.rxl_err_rate = {R_CNT_RXL_ERR_RATE, B_CNT_RXL_ERR_RATE},
.ofdm_cca = {R_CNT_OFDM_CCA, B_CNT_OFDM_CCA},
.cca_spoofing = {R_CNT_CCA_SPOOFING, B_CNT_CCA_SPOOFING},
.ampdu_miss = {R_CNT_AMPDU_MISS, B_CNT_AMPDU_MISS},
.r1b_rx_rpt_rst = {R_R1B_RX_RPT_RST, B_R1B_RX_RPT_RST},
.r1b_rr_sel = {R_R1B_RR_SEL, B_R1B_RR_SEL},
.enable_all_cnt = {R_ENABLE_ALL_CNT, B_ENABLE_ALL_CNT},
.rst_all_cnt = {R_RST_ALL_CNT, B_RST_ALL_CNT},
.cck_crc32 = R_CNT_CCK_CRC32_P0,
.cck_crc32_ok_mask = B_CNT_CCK_CRC32OK_P0,
.cck_crc32_fail_mask = B_CNT_CCK_CRC32FAIL_P0,
.ofdm_txon = R_CNT_OFDMTXON,
.ofdm_txon_mask = B_CNT_OFDMTXON,
.ofdm_txen_mask = B_CNT_OFDMTXEN,
.l_crc = R_CNT_L_CRC,
.l_crc_ok_mask = B_CNT_L_CRC_OK,
.l_crc_err_mask = B_CNT_L_CRC_ERR,
.ht_crc = R_CNT_HT_CRC,
.ht_crc_ok_mask = B_CNT_HT_CRC_OK,
.ht_crc_err_mask = B_CNT_HT_CRC_ERR,
.vht_crc = R_CNT_VHT_CRC,
.vht_crc_ok_mask = B_CNT_VHT_CRC_OK,
.vht_crc_err_mask = B_CNT_VHT_CRC_ERR,
.he_crc = R_CNT_HE_CRC,
.he_crc_ok_mask = B_CNT_HE_CRC_OK,
.he_crc_err_mask = B_CNT_HE_CRC_ERR,
.eht_crc = 0,
.eht_crc_ok_mask = 0,
.eht_crc_err_mask = 0,
.ampdu_crc = R_CNT_AMPDU_RX_CRC32,
.ampdu_crc_ok_mask = B_CNT_AMPDU_RX_CRC32_OK,
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_ul[] = {
{255, 0, 0, 7}, /* 0 -> original */
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
@ -893,6 +941,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
.edcca_regs = &rtw8852bt_edcca_regs,
.pmac_regs = &rtw8852bt_pmac_regs,
#ifdef CONFIG_PM
.wowlan_stub = &rtw_wowlan_stub_8852bt,
#endif

View File

@ -270,6 +270,54 @@ static const struct rtw89_edcca_regs rtw8852c_edcca_regs = {
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
static const struct rtw89_pmac_regs rtw8852c_pmac_regs = {
.cck_txon = {R_CNT_CCKTXON, B_CNT_CCKTXON},
.cck_txen = {R_CNT_CCKTXEN, B_CNT_CCKTXEN},
.cck_cca = {R_CNT_CCK_CCA_P0, B_CNT_CCK_CCA_P0},
.cck_sfd_gg = {R_SFD_GG_CNT_V1, B_SFD_GG_CNT},
.cck_sig_gg = {R_SIG_GG_CNT_V1, B_SIG_GG_CNT_V1},
.cck_spoofing = {R_SPOOF_CNT_V1, B_SPOOF_CNT_V1},
.cck_brk = {R_BRK_CNT, B_BRK_CNT},
.brk = {R_CNT_BRK, B_CNT_BRK},
.brk_option = {R_BRK_OPT, B_BRK_OPT},
.search_fail = {R_CNT_SEARCH_FAIL, B_CNT_SEARCH_FAIL},
.lsig_brk_s_th = {R_CNT_LSIG_BRK_S_TH, B_CNT_LSIG_BRK_S_TH},
.lsig_brk_l_th = {R_CNT_LSIG_BRK_L_TH, B_CNT_LSIG_BRK_L_TH},
.rxl_err_parity = {R_CNT_RXL_ERR_PARITY, B_CNT_RXL_ERR_PARITY},
.rxl_err_rate = {R_CNT_RXL_ERR_RATE, B_CNT_RXL_ERR_RATE},
.ofdm_cca = {R_CNT_OFDM_CCA, B_CNT_OFDM_CCA},
.cca_spoofing = {R_CNT_CCA_SPOOFING, B_CNT_CCA_SPOOFING},
.ampdu_miss = {R_CNT_AMPDU_MISS, B_CNT_AMPDU_MISS},
.r1b_rx_rpt_rst = {R_R1B_RX_RPT_RST_V1, B_R1B_RX_RPT_RST_V1},
.r1b_rr_sel = {},
.enable_all_cnt = {R_ENABLE_ALL_CNT, B_ENABLE_ALL_CNT},
.rst_all_cnt = {R_RST_ALL_CNT, B_RST_ALL_CNT},
.cck_crc32 = R_CNT_CCK_CRC32_P0,
.cck_crc32_ok_mask = B_CNT_CCK_CRC32OK_P0,
.cck_crc32_fail_mask = B_CNT_CCK_CRC32FAIL_P0,
.ofdm_txon = R_CNT_OFDMTXON,
.ofdm_txon_mask = B_CNT_OFDMTXON,
.ofdm_txen_mask = B_CNT_OFDMTXEN,
.l_crc = R_CNT_L_CRC,
.l_crc_ok_mask = B_CNT_L_CRC_OK,
.l_crc_err_mask = B_CNT_L_CRC_ERR,
.ht_crc = R_CNT_HT_CRC,
.ht_crc_ok_mask = B_CNT_HT_CRC_OK,
.ht_crc_err_mask = B_CNT_HT_CRC_ERR,
.vht_crc = R_CNT_VHT_CRC,
.vht_crc_ok_mask = B_CNT_VHT_CRC_OK,
.vht_crc_err_mask = B_CNT_VHT_CRC_ERR,
.he_crc = R_CNT_HE_CRC,
.he_crc_ok_mask = B_CNT_HE_CRC_OK,
.he_crc_err_mask = B_CNT_HE_CRC_ERR,
.eht_crc = 0,
.eht_crc_ok_mask = 0,
.eht_crc_err_mask = 0,
.ampdu_crc = R_CNT_AMPDU_RX_CRC32,
.ampdu_crc_ok_mask = B_CNT_AMPDU_RX_CRC32_OK,
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
static void rtw8852c_ctrl_btg_bt_rx(struct rtw89_dev *rtwdev, bool en,
enum rtw89_phy_idx phy_idx);
@ -3252,6 +3300,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
.btc_sb = {{{R_AX_SCOREBOARD, R_AX_SCOREBOARD},}},
.dma_ch_mask = 0,
.edcca_regs = &rtw8852c_edcca_regs,
.pmac_regs = &rtw8852c_pmac_regs,
#ifdef CONFIG_PM
.wowlan_stub = &rtw_wowlan_stub_8852c,
#endif

View File

@ -383,6 +383,54 @@ static const struct rtw89_edcca_regs rtw8922a_edcca_regs = {
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_BE_M,
};
static const struct rtw89_pmac_regs rtw8922a_pmac_regs = {
.cck_txon = {R_CNT_CCKTXON_V1, B_CNT_CCKTXON},
.cck_txen = {R_CNT_CCKTXEN_V1, B_CNT_CCKTXEN},
.cck_cca = {R_CNT_CCK_CCA_P0_V1, B_CNT_CCK_CCA_P0},
.cck_sfd_gg = {R_SFD_GG_CNT_V2, B_SFD_GG_CNT},
.cck_sig_gg = {R_SIG_GG_CNT_V2, B_SIG_GG_CNT_V1},
.cck_spoofing = {R_SPOOF_CNT_V2, B_SPOOF_CNT_V1},
.cck_brk = {R_BRK_CNT_V1, B_BRK_CNT},
.brk = {R_CNT_BRK_V1, B_CNT_BRK},
.brk_option = {},
.search_fail = {R_CNT_SEARCH_FAIL_V1, B_CNT_SEARCH_FAIL},
.lsig_brk_s_th = {R_CNT_LSIG_BRK_S_TH_V1, B_CNT_LSIG_BRK_S_TH},
.lsig_brk_l_th = {R_CNT_LSIG_BRK_L_TH_V1, B_CNT_LSIG_BRK_L_TH},
.rxl_err_parity = {R_CNT_RXL_ERR_PARITY_V1, B_CNT_RXL_ERR_PARITY},
.rxl_err_rate = {R_CNT_RXL_ERR_RATE_V1, B_CNT_RXL_ERR_RATE},
.ofdm_cca = {R_CNT_OFDM_CCA_V1, B_CNT_OFDM_CCA},
.cca_spoofing = {R_CNT_CCA_SPOOFING_V1, B_CNT_CCA_SPOOFING},
.ampdu_miss = {R_CNT_AMPDU_MISS_V1, B_CNT_AMPDU_MISS},
.r1b_rx_rpt_rst = {R_R1B_RX_RPT_RST_BE, B_R1B_RX_RPT_RST_V1},
.r1b_rr_sel = {},
.enable_all_cnt = {R_ENABLE_ALL_CNT, B_ENABLE_ALL_CNT},
.rst_all_cnt = {R_RST_ALL_CNT, B_RST_ALL_CNT},
.cck_crc32 = R_CNT_CCK_CRC32_P0_V1,
.cck_crc32_ok_mask = B_CNT_CCK_CRC32OK_P0,
.cck_crc32_fail_mask = B_CNT_CCK_CRC32FAIL_P0,
.ofdm_txon = R_CNT_OFDMTXON_V1,
.ofdm_txon_mask = B_CNT_OFDMTXON,
.ofdm_txen_mask = B_CNT_OFDMTXEN,
.l_crc = R_CNT_L_CRC_V1,
.l_crc_ok_mask = B_CNT_L_CRC_OK,
.l_crc_err_mask = B_CNT_L_CRC_ERR,
.ht_crc = R_CNT_HT_CRC_V1,
.ht_crc_ok_mask = B_CNT_HT_CRC_OK,
.ht_crc_err_mask = B_CNT_HT_CRC_ERR,
.vht_crc = R_CNT_VHT_CRC_V1,
.vht_crc_ok_mask = B_CNT_VHT_CRC_OK,
.vht_crc_err_mask = B_CNT_VHT_CRC_ERR,
.he_crc = R_CNT_HE_CRC_V1,
.he_crc_ok_mask = B_CNT_HE_CRC_OK,
.he_crc_err_mask = B_CNT_HE_CRC_ERR,
.eht_crc = R_CNT_EHT_CRC,
.eht_crc_ok_mask = B_CNT_EHT_CRC_OK,
.eht_crc_err_mask = B_CNT_EHT_CRC_ERR,
.ampdu_crc = R_CNT_AMPDU_RX_CRC32_V1,
.ampdu_crc_ok_mask = B_CNT_AMPDU_RX_CRC32_OK,
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
static const struct rtw89_efuse_block_cfg rtw8922a_efuse_blocks[] = {
[RTW89_EFUSE_BLOCK_SYS] = {.offset = 0x00000, .size = 0x310},
[RTW89_EFUSE_BLOCK_RF] = {.offset = 0x10000, .size = 0x240},
@ -3245,6 +3293,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
.btc_sb = {{{R_BE_SCOREBOARD, R_BE_SCOREBOARD},}},
.dma_ch_mask = 0,
.edcca_regs = &rtw8922a_edcca_regs,
.pmac_regs = &rtw8922a_pmac_regs,
#ifdef CONFIG_PM
.wowlan_stub = &rtw_wowlan_stub_8922a,
#endif

View File

@ -227,6 +227,54 @@ static const struct rtw89_edcca_regs rtw8922d_edcca_regs = {
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_BE_M,
};
static const struct rtw89_pmac_regs rtw8922d_pmac_regs = {
.cck_txon = {R_CNT_CCKTXON_BE4, B_CNT_CCKTXON},
.cck_txen = {R_CNT_CCKTXEN_BE4, B_CNT_CCKTXEN},
.cck_cca = {R_CNT_CCK_CCA_BE4, B_CNT_CCK_CCA_BE4},
.cck_sfd_gg = {R_SFD_GG_CNT_BE4, B_SFD_GG_CNT},
.cck_sig_gg = {R_SIG_GG_CNT_BE4, B_SIG_GG_CNT_V1},
.cck_spoofing = {R_SPOOF_CNT_BE4, B_SPOOF_CNT_V1},
.cck_brk = {R_BRK_CNT_BE4, B_BRK_CNT},
.brk = {R_CNT_BRK_BE4, B_CNT_BRK},
.brk_option = {},
.search_fail = {R_CNT_SEARCH_FAIL_BE4, B_CNT_SEARCH_FAIL},
.lsig_brk_s_th = {R_CNT_LSIG_BRK_S_TH_BE4, B_CNT_LSIG_BRK_S_TH},
.lsig_brk_l_th = {R_CNT_LSIG_BRK_L_TH_BE4, B_CNT_LSIG_BRK_L_TH},
.rxl_err_parity = {R_CNT_RXL_ERR_PARITY_BE4, B_CNT_RXL_ERR_PARITY},
.rxl_err_rate = {R_CNT_RXL_ERR_RATE_BE4, B_CNT_RXL_ERR_RATE},
.ofdm_cca = {R_CNT_OFDM_CCA_BE4, B_CNT_OFDM_CCA},
.cca_spoofing = {R_CNT_CCA_SPOOFING_BE4, B_CNT_CCA_SPOOFING},
.ampdu_miss = {R_CNT_AMPDU_MISS_BE4, B_CNT_AMPDU_MISS},
.r1b_rx_rpt_rst = {R_R1B_RX_RPT_RST_BE4, B_R1B_RX_RPT_RST_V1},
.r1b_rr_sel = {},
.enable_all_cnt = {R_ENABLE_ALL_CNT_BE4, B_ENABLE_ALL_CNT},
.rst_all_cnt = {R_RST_ALL_CNT_BE4, B_RST_ALL_CNT},
.cck_crc32 = R_CNT_CCK_CRC32_BE4,
.cck_crc32_ok_mask = B_CNT_CCK_CRC32OK_BE4,
.cck_crc32_fail_mask = B_CNT_CCK_CRC32FAIL_BE4,
.ofdm_txon = R_CNT_OFDMTXON_BE4,
.ofdm_txon_mask = B_CNT_OFDMTXON,
.ofdm_txen_mask = B_CNT_OFDMTXEN,
.l_crc = R_CNT_L_CRC_BE4,
.l_crc_ok_mask = B_CNT_L_CRC_OK,
.l_crc_err_mask = B_CNT_L_CRC_ERR,
.ht_crc = R_CNT_HT_CRC_BE4,
.ht_crc_ok_mask = B_CNT_HT_CRC_OK,
.ht_crc_err_mask = B_CNT_HT_CRC_ERR,
.vht_crc = R_CNT_VHT_CRC_BE4,
.vht_crc_ok_mask = B_CNT_VHT_CRC_OK,
.vht_crc_err_mask = B_CNT_VHT_CRC_ERR,
.he_crc = R_CNT_HE_CRC_BE4,
.he_crc_ok_mask = B_CNT_HE_CRC_OK,
.he_crc_err_mask = B_CNT_HE_CRC_ERR,
.eht_crc = R_CNT_EHT_CRC_BE4,
.eht_crc_ok_mask = B_CNT_EHT_CRC_OK,
.eht_crc_err_mask = B_CNT_EHT_CRC_ERR,
.ampdu_crc = R_CNT_AMPDU_RX_CRC32_BE4,
.ampdu_crc_ok_mask = B_CNT_AMPDU_RX_CRC32_OK,
.ampdu_crc_err_mask = B_CNT_AMPDU_RX_CRC32_ERR,
};
static const struct rtw89_efuse_block_cfg rtw8922d_efuse_blocks[] = {
[RTW89_EFUSE_BLOCK_SYS] = {.offset = 0x00000, .size = 0x310},
[RTW89_EFUSE_BLOCK_RF] = {.offset = 0x10000, .size = 0x240},
@ -3085,6 +3133,7 @@ const struct rtw89_chip_info rtw8922d_chip_info = {
BIT(RTW89_DMA_ACH5) | BIT(RTW89_DMA_ACH7) |
BIT(RTW89_DMA_B0HI) | BIT(RTW89_DMA_B1HI),
.edcca_regs = &rtw8922d_edcca_regs,
.pmac_regs = &rtw8922d_pmac_regs,
#ifdef CONFIG_PM
.wowlan_stub = &rtw_wowlan_stub_8922d,
#endif