drivers/net/wireless/realtek/rtw88/rtw8821c.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtw88/rtw8821c.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/realtek/rtw88/rtw8821c.c- Extension
.c- Size
- 63245 bytes
- Lines
- 2070
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
main.hcoex.hfw.htx.hrx.hphy.hrtw8821c.hrtw8821c_table.hmac.hreg.hdebug.hbf.hregd.h
Detected Declarations
enum rtw8821ce_rf_setfunction rtw8821ce_efuse_parsingfunction rtw8821cu_efuse_parsingfunction rtw8821cs_efuse_parsingfunction rtw8821c_read_efusefunction rtw8821c_get_swing_indexfunction rtw8821c_pwrtrack_initfunction rtw8821c_phy_bf_initfunction rtw8821c_phy_set_paramfunction rtw8821c_mac_initfunction rtw8821c_cfg_ldo25function rtw8821c_switch_rf_setfunction rtw8821c_set_channel_rffunction rtw8821c_set_channel_rxdfirfunction rtw8821c_cck_tx_filter_srrcfunction rtw8821c_set_channel_bbfunction rtw8821c_get_bb_swingfunction rtw8821c_set_channel_bb_swingfunction rtw8821c_set_channelfunction get_cck_rx_pwrfunction query_phy_status_page0function query_phy_status_page1function query_phy_statusfunction rtw8821c_set_tx_power_index_by_ratefunction rtw8821c_set_tx_power_indexfunction rtw8821c_false_alarm_statisticsfunction rtw8821c_do_iqkfunction rtw8821c_phy_calibrationfunction rtw8821c_coex_cfg_initfunction rtw8821c_coex_cfg_ant_switchfunction rtw8821c_coex_cfg_gnt_fixfunction rtw8821c_coex_cfg_rfe_typefunction rtw8821c_coex_cfg_wl_tx_powerfunction rtw8821c_coex_cfg_wl_rx_gainfunction rtw8821c_pwrtrack_set_pwrfunction rtw8821c_pwrtrack_setfunction rtw8821c_phy_pwrtrackfunction rtw8821c_pwr_trackfunction rtw8821c_bf_config_bfee_sufunction rtw8821c_bf_config_bfee_mufunction rtw8821c_bf_config_bfeefunction rtw8821c_phy_cck_pd_setfunction rtw8821c_led_setfunction rtw8821c_fill_txdesc_checksumexport rtw8821c_hw_spec
Annotated Snippet
if (rtw_regd_srrc(rtwdev)) {
rtw8821c_cck_tx_filter_srrc(rtwdev, channel, bw);
goto set_bw;
}
/* CCK TX filter parameters for default case */
if (channel == 14) {
rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c);
rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x00003667);
} else {
rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD,
hal->ch_param[0]);
rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD,
hal->ch_param[1] & MASKLWORD);
rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD,
hal->ch_param[2]);
}
} else if (channel > 35) {
rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1);
rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1);
rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0);
rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15);
if (channel >= 36 && channel <= 64)
rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x1);
else if (channel >= 100 && channel <= 144)
rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x2);
else if (channel >= 149)
rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x3);
if (channel >= 36 && channel <= 48)
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494);
else if (channel >= 52 && channel <= 64)
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453);
else if (channel >= 100 && channel <= 116)
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452);
else if (channel >= 118 && channel <= 177)
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
}
set_bw:
switch (bw) {
case RTW_CHANNEL_WIDTH_20:
default:
val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
val32 &= 0xffcffc00;
val32 |= 0x10010000;
rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
break;
case RTW_CHANNEL_WIDTH_40:
if (primary_ch_idx == 1)
rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
else
rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
val32 &= 0xff3ff300;
val32 |= 0x20020000 | ((primary_ch_idx & 0xf) << 2) |
RTW_CHANNEL_WIDTH_40;
rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
break;
case RTW_CHANNEL_WIDTH_80:
val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
val32 &= 0xfcffcf00;
val32 |= 0x40040000 | ((primary_ch_idx & 0xf) << 2) |
RTW_CHANNEL_WIDTH_80;
rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
break;
case RTW_CHANNEL_WIDTH_5:
val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
val32 &= 0xefcefc00;
val32 |= 0x200240;
rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
break;
case RTW_CHANNEL_WIDTH_10:
val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
val32 &= 0xefcefc00;
val32 |= 0x300380;
rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
Annotation
- Immediate include surface: `main.h`, `coex.h`, `fw.h`, `tx.h`, `rx.h`, `phy.h`, `rtw8821c.h`, `rtw8821c_table.h`.
- Detected declarations: `enum rtw8821ce_rf_set`, `function rtw8821ce_efuse_parsing`, `function rtw8821cu_efuse_parsing`, `function rtw8821cs_efuse_parsing`, `function rtw8821c_read_efuse`, `function rtw8821c_get_swing_index`, `function rtw8821c_pwrtrack_init`, `function rtw8821c_phy_bf_init`, `function rtw8821c_phy_set_param`, `function rtw8821c_mac_init`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.