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