net: wireless: rockchip_wlan: add rtl8723cs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723cs / hal / phydm / phydm_kfree.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20
21 /*============================================================*/
22 /*include files*/
23 /*============================================================*/
24 #include "mp_precomp.h"
25 #include "phydm_precomp.h"
26
27
28 /*<YuChen, 150720> Add for KFree Feature Requested by RF David.*/
29 /*This is a phydm API*/
30
31 void
32 phydm_set_kfree_to_rf_8814a(
33         void            *p_dm_void,
34         u8              e_rf_path,
35         u8              data
36 )
37 {
38         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
39         struct odm_rf_calibration_structure     *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
40         boolean is_odd;
41
42         if ((data % 2) != 0) {  /*odd->positive*/
43                 data = data - 1;
44                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19), 1);
45                 is_odd = true;
46         } else {                /*even->negative*/
47                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19), 0);
48                 is_odd = false;
49         }
50         ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("phy_ConfigKFree8814A(): RF_0x55[19]= %d\n", is_odd));
51         switch (data) {
52         case 0:
53                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 0);
54                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 0);
55                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 0;
56                 break;
57         case 2:
58                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 1);
59                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 0);
60                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 0;
61                 break;
62         case 4:
63                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 0);
64                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 1);
65                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 1;
66                 break;
67         case 6:
68                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 1);
69                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 1);
70                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 1;
71                 break;
72         case 8:
73                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 0);
74                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 2);
75                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 2;
76                 break;
77         case 10:
78                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 1);
79                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 2);
80                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 2;
81                 break;
82         case 12:
83                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 0);
84                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 3);
85                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 3;
86                 break;
87         case 14:
88                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 1);
89                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 3);
90                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 3;
91                 break;
92         case 16:
93                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 0);
94                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 4);
95                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 4;
96                 break;
97         case 18:
98                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 1);
99                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 4);
100                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 4;
101                 break;
102         case 20:
103                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14), 0);
104                 odm_set_rf_reg(p_dm_odm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(17) | BIT(16) | BIT(15), 5);
105                 p_rf_calibrate_info->kfree_offset[e_rf_path] = 5;
106                 break;
107
108         default:
109                 break;
110         }
111
112         if (is_odd == false) {
113                 /*that means Kfree offset is negative, we need to record it.*/
114                 p_rf_calibrate_info->kfree_offset[e_rf_path] = (-1) * p_rf_calibrate_info->kfree_offset[e_rf_path];
115                 ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("phy_ConfigKFree8814A(): kfree_offset = %d\n", p_rf_calibrate_info->kfree_offset[e_rf_path]));
116         } else
117                 ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("phy_ConfigKFree8814A(): kfree_offset = %d\n", p_rf_calibrate_info->kfree_offset[e_rf_path]));
118
119 }
120
121
122 void
123 phydm_set_kfree_to_rf(
124         void            *p_dm_void,
125         u8              e_rf_path,
126         u8              data
127 )
128 {
129         struct PHY_DM_STRUCT    *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
130
131         if (p_dm_odm->support_ic_type & ODM_RTL8814A)
132                 phydm_set_kfree_to_rf_8814a(p_dm_odm, e_rf_path, data);
133 }
134
135 void
136 phydm_config_kfree(
137         void    *p_dm_void,
138         u8      channel_to_sw,
139         u8      *kfree_table
140 )
141 {
142         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
143         struct odm_rf_calibration_structure     *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
144         u8                      rfpath = 0, max_rf_path = 0;
145         u8                      channel_idx = 0;
146
147         if (p_dm_odm->support_ic_type & ODM_RTL8814A)
148                 max_rf_path = 4;        /*0~3*/
149         else if (p_dm_odm->support_ic_type & (ODM_RTL8812 | ODM_RTL8192E | ODM_RTL8822B))
150                 max_rf_path = 2;        /*0~1*/
151         else
152                 max_rf_path = 1;
153
154         ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("===>phy_ConfigKFree8814A()\n"));
155
156         if (p_rf_calibrate_info->reg_rf_kfree_enable == 2) {
157                 ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("phy_ConfigKFree8814A(): reg_rf_kfree_enable == 2, Disable\n"));
158                 return;
159         } else if (p_rf_calibrate_info->reg_rf_kfree_enable == 1 || p_rf_calibrate_info->reg_rf_kfree_enable == 0) {
160                 ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("phy_ConfigKFree8814A(): reg_rf_kfree_enable == true\n"));
161                 /*Make sure the targetval is defined*/
162                 if (((p_rf_calibrate_info->reg_rf_kfree_enable == 1) && (kfree_table[0] != 0xFF)) || (p_rf_calibrate_info->rf_kfree_enable == true)) {
163                         /*if kfree_table[0] == 0xff, means no Kfree*/
164                         if (*p_dm_odm->p_band_type == ODM_BAND_2_4G) {
165                                 if (channel_to_sw <= 14 && channel_to_sw >= 1)
166                                         channel_idx = PHYDM_2G;
167                         } else if (*p_dm_odm->p_band_type == ODM_BAND_5G) {
168                                 if (channel_to_sw >= 36 && channel_to_sw <= 48)
169                                         channel_idx = PHYDM_5GLB1;
170                                 if (channel_to_sw >= 52 && channel_to_sw <= 64)
171                                         channel_idx = PHYDM_5GLB2;
172                                 if (channel_to_sw >= 100 && channel_to_sw <= 120)
173                                         channel_idx = PHYDM_5GMB1;
174                                 if (channel_to_sw >= 124 && channel_to_sw <= 144)
175                                         channel_idx = PHYDM_5GMB2;
176                                 if (channel_to_sw >= 149 && channel_to_sw <= 177)
177                                         channel_idx = PHYDM_5GHB;
178                         }
179
180                         for (rfpath = ODM_RF_PATH_A;  rfpath < max_rf_path; rfpath++) {
181                                 ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("phydm_kfree(): PATH_%d: %#x\n", rfpath, kfree_table[channel_idx * max_rf_path + rfpath]));
182                                 phydm_set_kfree_to_rf(p_dm_odm, rfpath, kfree_table[channel_idx * max_rf_path + rfpath]);
183                         }
184                 } else {
185                         ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("phy_ConfigKFree8814A(): targetval not defined, Don't execute KFree Process.\n"));
186                         return;
187                 }
188         }
189         ODM_RT_TRACE(p_dm_odm, ODM_COMP_MP, ODM_DBG_LOUD, ("<===phy_ConfigKFree8814A()\n"));
190 }