static void _rtl92ce_phy_set_rf_sleep(struct ieee80211_hw *hw) { u32 u4b_tmp; u8 delay = 5; struct rtl_priv *rtlpriv = rtl_priv(hw); rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00); rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40); u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK); while (u4b_tmp != 0 && delay > 0) { rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0); rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00); rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40); u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK); delay--; } if (delay == 0) { rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00); rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, ("Switch RF timeout !!!.\n")); return; } rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22); }
void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) { u8 tmpreg; u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal; struct rtl_priv *rtlpriv = rtl_priv(hw); tmpreg = rtl_read_byte(rtlpriv, 0xd03); if ((tmpreg & 0x70) != 0) rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F); else rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); if ((tmpreg & 0x70) != 0) { rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS); if (is2t) rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS); rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, (rf_a_mode & 0x8FFFF) | 0x10000); if (is2t) rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS, (rf_b_mode & 0x8FFFF) | 0x10000); } lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS); rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000); mdelay(100); if ((tmpreg & 0x70) != 0) { rtl_write_byte(rtlpriv, 0xd03, tmpreg); rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode); if (is2t) rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS, rf_b_mode); } else { rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); } }
static int rtl_proc_get_reg_rf_a(struct seq_file *m, void *v) { struct ieee80211_hw *hw = m->private; int i, n; int max = 0x40; for (n = 0; n <= max; ) { seq_printf(m, "\n%8.8x ", n); for (i = 0; i < 4 && n <= max; n += 1, i++) seq_printf(m, "%8.8x ", rtl_get_rfreg(hw, RF90_PATH_A, n, 0xffffffff)); } seq_puts(m, "\n"); return 0; }
static int rtl_proc_get_reg_rf_b(char *page, char **start, off_t offset, int count, int *eof, void *data) { struct ieee80211_hw *hw = data; int len = 0; int i, n; int max = 0x40; for (n = 0; n <= max; ) { len += snprintf(page + len, count - len, "\n%#8.8x ", n); for (i = 0; i < 4 && n <= max; n += 1, i++) len += snprintf(page + len, count - len, "%8.8x ",rtl_get_rfreg(hw, RF90_PATH_B, n, 0xffffffff)); } len += snprintf(page + len, count - len, "\n"); *eof = 1; return len; }
static void _rtl92s_dm_txpowertracking_callback_thermalmeter( struct ieee80211_hw *hw) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); u8 thermalvalue = 0; rtlpriv->dm.txpower_trackinginit = true; thermalvalue = (u8)rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0x1f); RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, ("Readback Thermal Meter = 0x%x pre thermal meter 0x%x " "eeprom_thermalmeter 0x%x\n", thermalvalue, rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter)); if (thermalvalue) { rtlpriv->dm.thermalvalue = thermalvalue; rtl92s_phy_set_fw_cmd(hw, FW_CMD_TXPWR_TRACK_THERMAL); } rtlpriv->dm.txpowercount = 0; }
static void _rtl92s_dm_txpowertracking_callback_thermalmeter( struct ieee80211_hw *hw ) { struct rtl_priv *rtlpriv = rtl_priv( hw ); struct rtl_efuse *rtlefuse = rtl_efuse( rtl_priv( hw ) ); u8 thermalvalue = 0; u32 fw_cmd = 0; rtlpriv->dm.txpower_trackinginit = true; thermalvalue = ( u8 )rtl_get_rfreg( hw, RF90_PATH_A, RF_T_METER, 0x1f ); RT_TRACE( rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermal meter 0x%x\n", thermalvalue, rtlpriv->dm.thermalvalue, rtlefuse->eeprom_thermalmeter ); if ( thermalvalue ) { rtlpriv->dm.thermalvalue = thermalvalue; if ( hal_get_firmwareversion( rtlpriv ) >= 0x35 ) { rtl92s_phy_set_fw_cmd( hw, FW_CMD_TXPWR_TRACK_THERMAL ); } else { fw_cmd = ( FW_TXPWR_TRACK_THERMAL | ( rtlpriv->efuse.thermalmeter[0] << 8 ) | ( thermalvalue << 16 ) ); RT_TRACE( rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "Write to FW Thermal Val = 0x%x\n", fw_cmd ); rtl_write_dword( rtlpriv, WFM5, fw_cmd ); rtl92s_phy_chk_fwcmd_iodone( hw ); } } rtlpriv->dm.txpowercount = 0; }