drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c- Extension
.c- Size
- 52041 bytes
- Lines
- 1739
- 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
linux/export.hdm_common.hphy_common.h../pci.h../base.h../core.h
Detected Declarations
function dm_restorepowerindexfunction dm_writepowerindexfunction dm_savepowerindexfunction rtl92c_dm_initial_gain_min_pwdbfunction rtl92c_dm_false_alarm_counter_statisticsfunction rtl92c_dm_ctrl_initgain_by_fafunction rtl92c_dm_ctrl_initgain_by_rssifunction rtl92c_dm_initial_gain_multi_stafunction rtl92c_dm_initial_gain_stafunction rtl92c_dm_cck_packet_detection_threshfunction rtl92c_dm_ctrl_initgain_by_twoportfunction rtl92c_dm_digfunction rtl92c_dm_init_dynamic_txpowerfunction rtl92c_dm_write_digfunction rtl92c_dm_pwdb_monitorfunction rtl92c_dm_init_edca_turbofunction rtl92c_dm_check_edca_turbofunction rtl92c_dm_txpower_tracking_callback_thermalmeterfunction rtl92c_dm_initialize_txpower_tracking_thermalmeterfunction rtl92c_dm_initialize_txpower_trackingfunction rtl92c_dm_txpower_tracking_directcallfunction rtl92c_dm_check_txpower_tracking_thermal_meterfunction rtl92c_dm_check_txpower_trackingfunction rtl92c_dm_init_rate_adaptive_maskfunction rtl92c_dm_init_dynamic_bb_powersavingfunction rtl92c_dm_rf_savingfunction rtl92c_dm_dynamic_bb_powersavingfunction rtl92c_dm_initfunction rtl92c_dm_dynamic_txpowerfunction rtl92c_dm_watchdogfunction rtl92c_bt_rssi_state_changefunction rtl92c_bt_state_changefunction statefunction rtl92c_bt_wifi_connect_changefunction rtl92c_bt_set_normalfunction rtl92c_bt_ant_isolationfunction rtl92c_check_bt_changefunction rtl92c_dm_bt_coexistexport dm_restorepowerindexexport dm_writepowerindexexport dm_savepowerindexexport rtl92c_dm_write_digexport rtl92c_dm_init_edca_turboexport rtl92c_dm_check_txpower_trackingexport rtl92c_dm_init_rate_adaptive_maskexport rtl92c_dm_rf_savingexport rtl92c_dm_initexport rtl92c_dm_watchdog
Annotated Snippet
if (digtable->forbidden_igi < digtable->cur_igvalue) {
digtable->forbidden_igi = digtable->cur_igvalue;
digtable->large_fa_hit = 1;
}
if (digtable->large_fa_hit >= 3) {
if ((digtable->forbidden_igi + 1) >
digtable->rx_gain_max)
digtable->rx_gain_min = digtable->rx_gain_max;
else
digtable->rx_gain_min = (digtable->forbidden_igi + 1);
digtable->recover_cnt = 3600; /* 3600=2hr */
}
} else {
/* Recovery mechanism for IGI lower bound */
if (digtable->recover_cnt != 0) {
digtable->recover_cnt--;
} else {
if (digtable->large_fa_hit == 0) {
if ((digtable->forbidden_igi-1) < DM_DIG_MIN) {
digtable->forbidden_igi = DM_DIG_MIN;
digtable->rx_gain_min = DM_DIG_MIN;
} else {
digtable->forbidden_igi--;
digtable->rx_gain_min = digtable->forbidden_igi + 1;
}
} else if (digtable->large_fa_hit == 3) {
digtable->large_fa_hit = 0;
}
}
}
if (rtlpriv->falsealm_cnt.cnt_all < 250) {
isbt = rtl_read_byte(rtlpriv, 0x4fd) & 0x01;
if (!isbt) {
if (rtlpriv->falsealm_cnt.cnt_all >
digtable->fa_lowthresh) {
if ((digtable->back_val - 2) <
digtable->back_range_min)
digtable->back_val = digtable->back_range_min;
else
digtable->back_val -= 2;
} else if (rtlpriv->falsealm_cnt.cnt_all <
digtable->fa_lowthresh) {
if ((digtable->back_val + 2) >
digtable->back_range_max)
digtable->back_val = digtable->back_range_max;
else
digtable->back_val += 2;
}
} else {
digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
}
} else {
/* Adjust initial gain by false alarm */
if (rtlpriv->falsealm_cnt.cnt_all > 1000)
digtable->cur_igvalue = digtable->pre_igvalue + 2;
else if (rtlpriv->falsealm_cnt.cnt_all > 750)
digtable->cur_igvalue = digtable->pre_igvalue + 1;
else if (rtlpriv->falsealm_cnt.cnt_all < 500)
digtable->cur_igvalue = digtable->pre_igvalue - 1;
}
/* Check initial gain by upper/lower bound */
if (digtable->cur_igvalue > digtable->rx_gain_max)
digtable->cur_igvalue = digtable->rx_gain_max;
if (digtable->cur_igvalue < digtable->rx_gain_min)
digtable->cur_igvalue = digtable->rx_gain_min;
rtl92c_dm_write_dig(hw);
}
static void rtl92c_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
{
static u8 initialized; /* initialized to false */
struct rtl_priv *rtlpriv = rtl_priv(hw);
struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
long rssi_strength = rtlpriv->dm.entry_min_undec_sm_pwdb;
bool multi_sta = false;
if (mac->opmode == NL80211_IFTYPE_ADHOC)
multi_sta = true;
if (!multi_sta ||
dm_digtable->cursta_cstate == DIG_STA_DISCONNECT) {
initialized = false;
dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
return;
Annotation
- Immediate include surface: `linux/export.h`, `dm_common.h`, `phy_common.h`, `../pci.h`, `../base.h`, `../core.h`.
- Detected declarations: `function dm_restorepowerindex`, `function dm_writepowerindex`, `function dm_savepowerindex`, `function rtl92c_dm_initial_gain_min_pwdb`, `function rtl92c_dm_false_alarm_counter_statistics`, `function rtl92c_dm_ctrl_initgain_by_fa`, `function rtl92c_dm_ctrl_initgain_by_rssi`, `function rtl92c_dm_initial_gain_multi_sta`, `function rtl92c_dm_initial_gain_sta`, `function rtl92c_dm_cck_packet_detection_thresh`.
- 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.