drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c- Extension
.c- Size
- 58102 bytes
- Lines
- 1785
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
../wifi.h../base.h../pci.h../core.hreg.hdef.hphy.hdm.hfw.htrx.h
Detected Declarations
enum _power_dec_incfunction rtl88e_set_iqk_matrixfunction rtl88e_dm_txpower_track_adjustfunction dm_tx_pwr_track_set_pwrfunction rtl88e_dm_initial_gain_min_pwdbfunction rtl88e_dm_false_alarm_counter_statisticsfunction rtl88e_dm_cck_packet_detection_threshfunction rtl88e_dm_digfunction rtl88e_dm_init_dynamic_txpowerfunction rtl92c_dm_dynamic_txpowerfunction rtl88e_dm_write_digfunction rtl88e_dm_pwdb_monitorfunction rtl88e_dm_init_edca_turbofunction rtl88e_dm_check_edca_turbofunction dm_txpower_track_cb_thermfunction rtl88e_dm_init_txpower_trackingfunction rtl88e_dm_check_txpower_trackingfunction rtl88e_dm_init_rate_adaptive_maskfunction rtl88e_dm_refresh_rate_adaptive_maskfunction rtl92c_dm_init_dynamic_bb_powersavingfunction rtl88e_dm_update_rx_idle_antfunction rtl88e_dm_update_tx_antfunction rtl88e_dm_rx_hw_antena_div_initfunction rtl88e_dm_trx_hw_antenna_div_initfunction rtl88e_dm_fast_training_initfunction rtl88e_dm_antenna_div_initfunction rtl88e_dm_set_tx_ant_by_tx_infofunction rtl88e_dm_ant_sel_statisticsfunction rtl88e_dm_hw_ant_divfunction list_for_each_entryfunction rtl88e_set_next_mac_address_targetfunction list_for_each_entryfunction rtl88e_dm_fast_ant_trainingfunction rtl88e_dm_fast_antenna_training_callbackfunction rtl88e_dm_antenna_diversityfunction rtl88e_dm_initfunction rtl88e_dm_watchdog
Annotated Snippet
if (_del < thermal_threshold[_dir][_off]) { \
if (_off != 0) \
_off--; \
break; \
} \
} \
if (_off >= _size) \
_off = _size - 1; \
} while (0)
static void rtl88e_set_iqk_matrix(struct ieee80211_hw *hw,
u8 ofdm_index, u8 rfpath,
long iqk_result_x, long iqk_result_y)
{
long ele_a = 0, ele_d, ele_c = 0, value32;
ele_d = (ofdmswing_table[ofdm_index] & 0xFFC00000)>>22;
if (iqk_result_x != 0) {
if ((iqk_result_x & 0x00000200) != 0)
iqk_result_x = iqk_result_x | 0xFFFFFC00;
ele_a = ((iqk_result_x * ele_d)>>8)&0x000003FF;
if ((iqk_result_y & 0x00000200) != 0)
iqk_result_y = iqk_result_y | 0xFFFFFC00;
ele_c = ((iqk_result_y * ele_d)>>8)&0x000003FF;
switch (rfpath) {
case RF90_PATH_A:
value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
MASKDWORD, value32);
value32 = (ele_c & 0x000003C0) >> 6;
rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
value32);
value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
value32);
break;
case RF90_PATH_B:
value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
value32);
value32 = (ele_c & 0x000003C0) >> 6;
rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, value32);
value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
value32);
break;
default:
break;
}
} else {
switch (rfpath) {
case RF90_PATH_A:
rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
MASKDWORD, ofdmswing_table[ofdm_index]);
rtl_set_bbreg(hw, ROFDM0_XCTXAFE,
MASKH4BITS, 0x00);
rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
BIT(24), 0x00);
break;
case RF90_PATH_B:
rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
MASKDWORD, ofdmswing_table[ofdm_index]);
rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
MASKH4BITS, 0x00);
rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
BIT(28), 0x00);
break;
default:
break;
}
}
}
void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
u8 type, u8 *pdirection, u32 *poutwrite_val)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
u8 pwr_val = 0;
u8 cck_base = rtldm->swing_idx_cck_base;
u8 cck_val = rtldm->swing_idx_cck;
u8 ofdm_base = rtldm->swing_idx_ofdm_base[0];
u8 ofdm_val = rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A];
if (type == 0) {
if (ofdm_val <= ofdm_base) {
*pdirection = 1;
Annotation
- Immediate include surface: `../wifi.h`, `../base.h`, `../pci.h`, `../core.h`, `reg.h`, `def.h`, `phy.h`, `dm.h`.
- Detected declarations: `enum _power_dec_inc`, `function rtl88e_set_iqk_matrix`, `function rtl88e_dm_txpower_track_adjust`, `function dm_tx_pwr_track_set_pwr`, `function rtl88e_dm_initial_gain_min_pwdb`, `function rtl88e_dm_false_alarm_counter_statistics`, `function rtl88e_dm_cck_packet_detection_thresh`, `function rtl88e_dm_dig`, `function rtl88e_dm_init_dynamic_txpower`, `function rtl92c_dm_dynamic_txpower`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.