xref: /openbmc/linux/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/rf.c (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
1647f21b1SLarry Finger // SPDX-License-Identifier: GPL-2.0
2647f21b1SLarry Finger /* Copyright(c) 2009-2014  Realtek Corporation.*/
3f1d2b4d3SLarry Finger 
4f1d2b4d3SLarry Finger #include "../wifi.h"
5f1d2b4d3SLarry Finger #include "reg.h"
6f1d2b4d3SLarry Finger #include "def.h"
7f1d2b4d3SLarry Finger #include "phy.h"
8f1d2b4d3SLarry Finger #include "rf.h"
9f1d2b4d3SLarry Finger #include "dm.h"
10f1d2b4d3SLarry Finger 
11f1d2b4d3SLarry Finger static bool _rtl92ee_phy_rf6052_config_parafile(struct ieee80211_hw *hw);
12f1d2b4d3SLarry Finger 
rtl92ee_phy_rf6052_set_bandwidth(struct ieee80211_hw * hw,u8 bandwidth)13f1d2b4d3SLarry Finger void rtl92ee_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
14f1d2b4d3SLarry Finger {
15f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
16f1d2b4d3SLarry Finger 	struct rtl_phy *rtlphy = &rtlpriv->phy;
17f1d2b4d3SLarry Finger 
18f1d2b4d3SLarry Finger 	switch (bandwidth) {
19f1d2b4d3SLarry Finger 	case HT_CHANNEL_WIDTH_20:
20f1d2b4d3SLarry Finger 		rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] &
21f1d2b4d3SLarry Finger 					     0xfffff3ff) | BIT(10) | BIT(11));
22f1d2b4d3SLarry Finger 		rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK,
23f1d2b4d3SLarry Finger 			      rtlphy->rfreg_chnlval[0]);
24f1d2b4d3SLarry Finger 		rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK,
25f1d2b4d3SLarry Finger 			      rtlphy->rfreg_chnlval[0]);
26f1d2b4d3SLarry Finger 		break;
27f1d2b4d3SLarry Finger 	case HT_CHANNEL_WIDTH_20_40:
28f1d2b4d3SLarry Finger 		rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] &
29f1d2b4d3SLarry Finger 					     0xfffff3ff) | BIT(10));
30f1d2b4d3SLarry Finger 		rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK,
31f1d2b4d3SLarry Finger 			      rtlphy->rfreg_chnlval[0]);
32f1d2b4d3SLarry Finger 		rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK,
33f1d2b4d3SLarry Finger 			      rtlphy->rfreg_chnlval[0]);
34f1d2b4d3SLarry Finger 		break;
35f1d2b4d3SLarry Finger 	default:
36a44f59d6SLarry Finger 		pr_err("unknown bandwidth: %#X\n", bandwidth);
37f1d2b4d3SLarry Finger 		break;
38f1d2b4d3SLarry Finger 	}
39f1d2b4d3SLarry Finger }
40f1d2b4d3SLarry Finger 
rtl92ee_phy_rf6052_config(struct ieee80211_hw * hw)41f1d2b4d3SLarry Finger bool rtl92ee_phy_rf6052_config(struct ieee80211_hw *hw)
42f1d2b4d3SLarry Finger {
43f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
44f1d2b4d3SLarry Finger 	struct rtl_phy *rtlphy = &rtlpriv->phy;
45f1d2b4d3SLarry Finger 
46f1d2b4d3SLarry Finger 	if (rtlphy->rf_type == RF_1T1R)
47f1d2b4d3SLarry Finger 		rtlphy->num_total_rfpath = 1;
48f1d2b4d3SLarry Finger 	else
49f1d2b4d3SLarry Finger 		rtlphy->num_total_rfpath = 2;
50f1d2b4d3SLarry Finger 
51f1d2b4d3SLarry Finger 	return _rtl92ee_phy_rf6052_config_parafile(hw);
52f1d2b4d3SLarry Finger }
53f1d2b4d3SLarry Finger 
_rtl92ee_phy_rf6052_config_parafile(struct ieee80211_hw * hw)54f1d2b4d3SLarry Finger static bool _rtl92ee_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
55f1d2b4d3SLarry Finger {
56f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
57f1d2b4d3SLarry Finger 	struct rtl_phy *rtlphy = &rtlpriv->phy;
58f1d2b4d3SLarry Finger 	u32 u4_regvalue = 0;
59f1d2b4d3SLarry Finger 	u8 rfpath;
60f1d2b4d3SLarry Finger 	bool rtstatus = true;
61f1d2b4d3SLarry Finger 	struct bb_reg_def *pphyreg;
62f1d2b4d3SLarry Finger 
63f1d2b4d3SLarry Finger 	for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
64f1d2b4d3SLarry Finger 		pphyreg = &rtlphy->phyreg_def[rfpath];
65f1d2b4d3SLarry Finger 
66f1d2b4d3SLarry Finger 		switch (rfpath) {
67f1d2b4d3SLarry Finger 		case RF90_PATH_A:
68f1d2b4d3SLarry Finger 		case RF90_PATH_C:
69f1d2b4d3SLarry Finger 			u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
70f1d2b4d3SLarry Finger 						    BRFSI_RFENV);
71f1d2b4d3SLarry Finger 			break;
72f1d2b4d3SLarry Finger 		case RF90_PATH_B:
73f1d2b4d3SLarry Finger 		case RF90_PATH_D:
74f1d2b4d3SLarry Finger 			u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
75f1d2b4d3SLarry Finger 						    BRFSI_RFENV << 16);
76f1d2b4d3SLarry Finger 			break;
77f1d2b4d3SLarry Finger 		}
78f1d2b4d3SLarry Finger 
79f1d2b4d3SLarry Finger 		rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
80f1d2b4d3SLarry Finger 		udelay(1);
81f1d2b4d3SLarry Finger 
82f1d2b4d3SLarry Finger 		rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
83f1d2b4d3SLarry Finger 		udelay(1);
84f1d2b4d3SLarry Finger 
85f1d2b4d3SLarry Finger 		rtl_set_bbreg(hw, pphyreg->rfhssi_para2,
86f1d2b4d3SLarry Finger 			      B3WIREADDREAALENGTH, 0x0);
87f1d2b4d3SLarry Finger 		udelay(1);
88f1d2b4d3SLarry Finger 
89f1d2b4d3SLarry Finger 		rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
90f1d2b4d3SLarry Finger 		udelay(1);
91f1d2b4d3SLarry Finger 
92f1d2b4d3SLarry Finger 		switch (rfpath) {
93f1d2b4d3SLarry Finger 		case RF90_PATH_A:
94f1d2b4d3SLarry Finger 			rtstatus = rtl92ee_phy_config_rf_with_headerfile(hw,
95f1d2b4d3SLarry Finger 						       (enum radio_path)rfpath);
96f1d2b4d3SLarry Finger 			break;
97f1d2b4d3SLarry Finger 		case RF90_PATH_B:
98f1d2b4d3SLarry Finger 			rtstatus = rtl92ee_phy_config_rf_with_headerfile(hw,
99f1d2b4d3SLarry Finger 						       (enum radio_path)rfpath);
100f1d2b4d3SLarry Finger 			break;
101f1d2b4d3SLarry Finger 		case RF90_PATH_C:
102f1d2b4d3SLarry Finger 			break;
103f1d2b4d3SLarry Finger 		case RF90_PATH_D:
104f1d2b4d3SLarry Finger 			break;
105f1d2b4d3SLarry Finger 		}
106f1d2b4d3SLarry Finger 
107f1d2b4d3SLarry Finger 		switch (rfpath) {
108f1d2b4d3SLarry Finger 		case RF90_PATH_A:
109f1d2b4d3SLarry Finger 		case RF90_PATH_C:
110f1d2b4d3SLarry Finger 			rtl_set_bbreg(hw, pphyreg->rfintfs,
111f1d2b4d3SLarry Finger 				      BRFSI_RFENV, u4_regvalue);
112f1d2b4d3SLarry Finger 			break;
113f1d2b4d3SLarry Finger 		case RF90_PATH_B:
114f1d2b4d3SLarry Finger 		case RF90_PATH_D:
115f1d2b4d3SLarry Finger 			rtl_set_bbreg(hw, pphyreg->rfintfs,
116f1d2b4d3SLarry Finger 				      BRFSI_RFENV << 16, u4_regvalue);
117f1d2b4d3SLarry Finger 			break;
118f1d2b4d3SLarry Finger 		}
119f1d2b4d3SLarry Finger 
120f1d2b4d3SLarry Finger 		if (!rtstatus) {
121*e24a2a87SLarry Finger 			rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1224713bd1cSJoe Perches 				"Radio[%d] Fail!!\n", rfpath);
123f1d2b4d3SLarry Finger 			return false;
124f1d2b4d3SLarry Finger 		}
125f1d2b4d3SLarry Finger 	}
126f1d2b4d3SLarry Finger 
127*e24a2a87SLarry Finger 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
128f1d2b4d3SLarry Finger 	return rtstatus;
129f1d2b4d3SLarry Finger }
130