153 lines
		
	
	
	
		
			4.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			153 lines
		
	
	
	
		
			4.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /******************************************************************************
 | ||
|  |  * | ||
|  |  * Copyright(c) 2009-2014  Realtek Corporation. | ||
|  |  * | ||
|  |  * This program is free software; you can redistribute it and/or modify it | ||
|  |  * under the terms of version 2 of the GNU General Public License as | ||
|  |  * published by the Free Software Foundation. | ||
|  |  * | ||
|  |  * This program is distributed in the hope that it will be useful, but WITHOUT | ||
|  |  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
|  |  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | ||
|  |  * more details. | ||
|  |  * | ||
|  |  * The full GNU General Public License is included in this distribution in the | ||
|  |  * file called LICENSE. | ||
|  |  * | ||
|  |  * Contact Information: | ||
|  |  * wlanfae <wlanfae@realtek.com> | ||
|  |  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, | ||
|  |  * Hsinchu 300, Taiwan. | ||
|  |  * | ||
|  |  * Larry Finger <Larry.Finger@lwfinger.net> | ||
|  |  * | ||
|  |  *****************************************************************************/ | ||
|  | 
 | ||
|  | #include "../wifi.h"
 | ||
|  | #include "reg.h"
 | ||
|  | #include "def.h"
 | ||
|  | #include "phy.h"
 | ||
|  | #include "rf.h"
 | ||
|  | #include "dm.h"
 | ||
|  | 
 | ||
|  | static bool _rtl92ee_phy_rf6052_config_parafile(struct ieee80211_hw *hw); | ||
|  | 
 | ||
|  | void rtl92ee_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth) | ||
|  | { | ||
|  | 	struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
|  | 	struct rtl_phy *rtlphy = &rtlpriv->phy; | ||
|  | 
 | ||
|  | 	switch (bandwidth) { | ||
|  | 	case HT_CHANNEL_WIDTH_20: | ||
|  | 		rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] & | ||
|  | 					     0xfffff3ff) | BIT(10) | BIT(11)); | ||
|  | 		rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, | ||
|  | 			      rtlphy->rfreg_chnlval[0]); | ||
|  | 		rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK, | ||
|  | 			      rtlphy->rfreg_chnlval[0]); | ||
|  | 		break; | ||
|  | 	case HT_CHANNEL_WIDTH_20_40: | ||
|  | 		rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] & | ||
|  | 					     0xfffff3ff) | BIT(10)); | ||
|  | 		rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, | ||
|  | 			      rtlphy->rfreg_chnlval[0]); | ||
|  | 		rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK, | ||
|  | 			      rtlphy->rfreg_chnlval[0]); | ||
|  | 		break; | ||
|  | 	default: | ||
|  | 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | ||
|  | 			 "unknown bandwidth: %#X\n", bandwidth); | ||
|  | 		break; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | bool rtl92ee_phy_rf6052_config(struct ieee80211_hw *hw) | ||
|  | { | ||
|  | 	struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
|  | 	struct rtl_phy *rtlphy = &rtlpriv->phy; | ||
|  | 
 | ||
|  | 	if (rtlphy->rf_type == RF_1T1R) | ||
|  | 		rtlphy->num_total_rfpath = 1; | ||
|  | 	else | ||
|  | 		rtlphy->num_total_rfpath = 2; | ||
|  | 
 | ||
|  | 	return _rtl92ee_phy_rf6052_config_parafile(hw); | ||
|  | } | ||
|  | 
 | ||
|  | static bool _rtl92ee_phy_rf6052_config_parafile(struct ieee80211_hw *hw) | ||
|  | { | ||
|  | 	struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
|  | 	struct rtl_phy *rtlphy = &rtlpriv->phy; | ||
|  | 	u32 u4_regvalue = 0; | ||
|  | 	u8 rfpath; | ||
|  | 	bool rtstatus = true; | ||
|  | 	struct bb_reg_def *pphyreg; | ||
|  | 
 | ||
|  | 	for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) { | ||
|  | 		pphyreg = &rtlphy->phyreg_def[rfpath]; | ||
|  | 
 | ||
|  | 		switch (rfpath) { | ||
|  | 		case RF90_PATH_A: | ||
|  | 		case RF90_PATH_C: | ||
|  | 			u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs, | ||
|  | 						    BRFSI_RFENV); | ||
|  | 			break; | ||
|  | 		case RF90_PATH_B: | ||
|  | 		case RF90_PATH_D: | ||
|  | 			u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs, | ||
|  | 						    BRFSI_RFENV << 16); | ||
|  | 			break; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1); | ||
|  | 		udelay(1); | ||
|  | 
 | ||
|  | 		rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1); | ||
|  | 		udelay(1); | ||
|  | 
 | ||
|  | 		rtl_set_bbreg(hw, pphyreg->rfhssi_para2, | ||
|  | 			      B3WIREADDREAALENGTH, 0x0); | ||
|  | 		udelay(1); | ||
|  | 
 | ||
|  | 		rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0); | ||
|  | 		udelay(1); | ||
|  | 
 | ||
|  | 		switch (rfpath) { | ||
|  | 		case RF90_PATH_A: | ||
|  | 			rtstatus = rtl92ee_phy_config_rf_with_headerfile(hw, | ||
|  | 						       (enum radio_path)rfpath); | ||
|  | 			break; | ||
|  | 		case RF90_PATH_B: | ||
|  | 			rtstatus = rtl92ee_phy_config_rf_with_headerfile(hw, | ||
|  | 						       (enum radio_path)rfpath); | ||
|  | 			break; | ||
|  | 		case RF90_PATH_C: | ||
|  | 			break; | ||
|  | 		case RF90_PATH_D: | ||
|  | 			break; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		switch (rfpath) { | ||
|  | 		case RF90_PATH_A: | ||
|  | 		case RF90_PATH_C: | ||
|  | 			rtl_set_bbreg(hw, pphyreg->rfintfs, | ||
|  | 				      BRFSI_RFENV, u4_regvalue); | ||
|  | 			break; | ||
|  | 		case RF90_PATH_B: | ||
|  | 		case RF90_PATH_D: | ||
|  | 			rtl_set_bbreg(hw, pphyreg->rfintfs, | ||
|  | 				      BRFSI_RFENV << 16, u4_regvalue); | ||
|  | 			break; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (!rtstatus) { | ||
|  | 			RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, | ||
|  | 				 "Radio[%d] Fail!!", rfpath); | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n"); | ||
|  | 	return rtstatus; | ||
|  | } |