diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8723ae/hw.c')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8723ae/hw.c | 70 | 
1 files changed, 47 insertions, 23 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c index 9a0c71c2e15..c333dfd116b 100644 --- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c @@ -449,6 +449,9 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		rtl8723ae_set_fw_joinbss_report_cmd(hw, (*(u8 *) val));  		break; } +	case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: +		rtl8723ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val)); +		break;  	case HW_VAR_AID:{  		u16 u2btmp;  		u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT); @@ -474,6 +477,39 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)  		if (btype_ibss == true)  			_rtl8723ae_resume_tx_beacon(hw);  		break; } +	case HW_VAR_FW_LPS_ACTION: { +		bool enter_fwlps = *((bool *)val); +		u8 rpwm_val, fw_pwrmode; +		bool fw_current_inps; + +		if (enter_fwlps) { +			rpwm_val = 0x02;	/* RF off */ +			fw_current_inps = true; +			rtlpriv->cfg->ops->set_hw_reg(hw, +					HW_VAR_FW_PSMODE_STATUS, +					(u8 *)(&fw_current_inps)); +			rtlpriv->cfg->ops->set_hw_reg(hw, +					HW_VAR_H2C_FW_PWRMODE, +					(u8 *)(&ppsc->fwctrl_psmode)); + +			rtlpriv->cfg->ops->set_hw_reg(hw, +					HW_VAR_SET_RPWM, +					(u8 *)(&rpwm_val)); +		} else { +			rpwm_val = 0x0C;	/* RF on */ +			fw_pwrmode = FW_PS_ACTIVE_MODE; +			fw_current_inps = false; +			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, +					(u8 *)(&rpwm_val)); +			rtlpriv->cfg->ops->set_hw_reg(hw, +					HW_VAR_H2C_FW_PWRMODE, +					(u8 *)(&fw_pwrmode)); + +			rtlpriv->cfg->ops->set_hw_reg(hw, +					HW_VAR_FW_PSMODE_STATUS, +					(u8 *)(&fw_current_inps)); +		} +		break; }  	default:  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,  			 "switch case not processed\n"); @@ -1379,7 +1415,7 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,  		}  		for (i = 0; i < 14; i++) { -			RTPRINT(rtlpriv, FINIT, INIT_TxPower, +			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  				"RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = "  				"[0x%x / 0x%x / 0x%x]\n", rf_path, i,  				rtlefuse->txpwrlevel_cck[rf_path][i], @@ -1420,10 +1456,10 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,  				    0xf0) >> 4);  			} -			RTPRINT(rtlpriv, FINIT, INIT_TxPower, +			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  				"RF-%d pwrgroup_ht20[%d] = 0x%x\n", rf_path, i,  				rtlefuse->pwrgroup_ht20[rf_path][i]); -			RTPRINT(rtlpriv, FINIT, INIT_TxPower, +			RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  				"RF-%d pwrgroup_ht40[%d] = 0x%x\n", rf_path, i,  				rtlefuse->pwrgroup_ht40[rf_path][i]);  		} @@ -1463,19 +1499,19 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,  	    rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][7];  	for (i = 0; i < 14; i++) -		RTPRINT(rtlpriv, FINIT, INIT_TxPower, +		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  			"RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i,  			rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]);  	for (i = 0; i < 14; i++) -		RTPRINT(rtlpriv, FINIT, INIT_TxPower, +		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  			"RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i,  			rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]);  	for (i = 0; i < 14; i++) -		RTPRINT(rtlpriv, FINIT, INIT_TxPower, +		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  			"RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i,  			rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]);  	for (i = 0; i < 14; i++) -		RTPRINT(rtlpriv, FINIT, INIT_TxPower, +		RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  			"RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i,  			rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]); @@ -1483,14 +1519,14 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,  		rtlefuse->eeprom_regulatory = (hwinfo[RF_OPTION1] & 0x7);  	else  		rtlefuse->eeprom_regulatory = 0; -	RTPRINT(rtlpriv, FINIT, INIT_TxPower, +	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  		"eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);  	if (!autoload_fail)  		rtlefuse->eeprom_tssi[RF90_PATH_A] = hwinfo[EEPROM_TSSI_A];  	else  		rtlefuse->eeprom_tssi[RF90_PATH_A] = EEPROM_DEFAULT_TSSI; -	RTPRINT(rtlpriv, FINIT, INIT_TxPower, +	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  		"TSSI_A = 0x%x, TSSI_B = 0x%x\n",  		rtlefuse->eeprom_tssi[RF90_PATH_A],  		rtlefuse->eeprom_tssi[RF90_PATH_B]); @@ -1505,7 +1541,7 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,  		rtlefuse->apk_thermalmeterignore = true;  	rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter; -	RTPRINT(rtlpriv, FINIT, INIT_TxPower, +	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,  		"thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);  } @@ -1713,19 +1749,7 @@ static void _rtl8723ae_hal_customized_behavior(struct ieee80211_hw *hw)  	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);  	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); -	switch (rtlhal->oem_id) { -	case RT_CID_819x_HP: -		pcipriv->ledctl.led_opendrain = true; -		break; -	case RT_CID_819x_Lenovo: -	case RT_CID_DEFAULT: -	case RT_CID_TOSHIBA: -	case RT_CID_CCX: -	case RT_CID_819x_Acer: -	case RT_CID_WHQL: -	default: -		break; -	} +	pcipriv->ledctl.led_opendrain = true;  	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,  		 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);  }  |