These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / staging / rtl8188eu / hal / hal_com.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 #include <osdep_service.h>
21 #include <drv_types.h>
22
23 #include <hal_intf.h>
24 #include <hal_com.h>
25 #include <rtl8188e_hal.h>
26
27 #define _HAL_INIT_C_
28
29 void dump_chip_info(struct HAL_VERSION  chip_vers)
30 {
31         uint cnt = 0;
32         char buf[128];
33
34         cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8188E_");
35         cnt += sprintf((buf+cnt), "%s_", IS_NORMAL_CHIP(chip_vers) ?
36                        "Normal_Chip" : "Test_Chip");
37         cnt += sprintf((buf+cnt), "%s_", IS_CHIP_VENDOR_TSMC(chip_vers) ?
38                        "TSMC" : "UMC");
39         if (IS_A_CUT(chip_vers))
40                 cnt += sprintf((buf+cnt), "A_CUT_");
41         else if (IS_B_CUT(chip_vers))
42                 cnt += sprintf((buf+cnt), "B_CUT_");
43         else if (IS_C_CUT(chip_vers))
44                 cnt += sprintf((buf+cnt), "C_CUT_");
45         else if (IS_D_CUT(chip_vers))
46                 cnt += sprintf((buf+cnt), "D_CUT_");
47         else if (IS_E_CUT(chip_vers))
48                 cnt += sprintf((buf+cnt), "E_CUT_");
49         else
50                 cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_",
51                                chip_vers.CUTVersion);
52         cnt += sprintf((buf+cnt), "1T1R_");
53         cnt += sprintf((buf+cnt), "RomVer(0)\n");
54
55         pr_info("%s", buf);
56 }
57
58 #define CHAN_PLAN_HW    0x80
59
60 u8 /* return the final channel plan decision */
61 hal_com_get_channel_plan(struct adapter *padapter, u8 hw_channel_plan,
62                          u8 sw_channel_plan, u8 def_channel_plan,
63                          bool load_fail)
64 {
65         u8 sw_cfg;
66         u8 chnlplan;
67
68         sw_cfg = true;
69         if (!load_fail) {
70                 if (!rtw_is_channel_plan_valid(sw_channel_plan))
71                         sw_cfg = false;
72                 if (hw_channel_plan & CHAN_PLAN_HW)
73                         sw_cfg = false;
74         }
75
76         if (sw_cfg)
77                 chnlplan = sw_channel_plan;
78         else
79                 chnlplan = hw_channel_plan & (~CHAN_PLAN_HW);
80
81         if (!rtw_is_channel_plan_valid(chnlplan))
82                 chnlplan = def_channel_plan;
83
84         return chnlplan;
85 }
86
87 u8 MRateToHwRate(u8 rate)
88 {
89         u8 ret = DESC_RATE1M;
90
91         switch (rate) {
92                 /*  CCK and OFDM non-HT rates */
93         case IEEE80211_CCK_RATE_1MB:
94                 ret = DESC_RATE1M;
95                 break;
96         case IEEE80211_CCK_RATE_2MB:
97                 ret = DESC_RATE2M;
98                 break;
99         case IEEE80211_CCK_RATE_5MB:
100                 ret = DESC_RATE5_5M;
101                 break;
102         case IEEE80211_CCK_RATE_11MB:
103                 ret = DESC_RATE11M;
104                 break;
105         case IEEE80211_OFDM_RATE_6MB:
106                 ret = DESC_RATE6M;
107                 break;
108         case IEEE80211_OFDM_RATE_9MB:
109                 ret = DESC_RATE9M;
110                 break;
111         case IEEE80211_OFDM_RATE_12MB:
112                 ret = DESC_RATE12M;
113                 break;
114         case IEEE80211_OFDM_RATE_18MB:
115                 ret = DESC_RATE18M;
116                 break;
117         case IEEE80211_OFDM_RATE_24MB:
118                 ret = DESC_RATE24M;
119                 break;
120         case IEEE80211_OFDM_RATE_36MB:
121                 ret = DESC_RATE36M;
122                 break;
123         case IEEE80211_OFDM_RATE_48MB:
124                 ret = DESC_RATE48M;
125                 break;
126         case IEEE80211_OFDM_RATE_54MB:
127                 ret = DESC_RATE54M;
128                 break;
129         default:
130                 break;
131         }
132         return ret;
133 }
134
135 void HalSetBrateCfg(struct adapter *adapt, u8 *brates, u16 *rate_cfg)
136 {
137         u8 i, is_brate, brate;
138
139         for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
140                 is_brate = brates[i] & IEEE80211_BASIC_RATE_MASK;
141                 brate = brates[i] & 0x7f;
142
143                 if (is_brate) {
144                         switch (brate) {
145                         case IEEE80211_CCK_RATE_1MB:
146                                 *rate_cfg |= RATE_1M;
147                                 break;
148                         case IEEE80211_CCK_RATE_2MB:
149                                 *rate_cfg |= RATE_2M;
150                                 break;
151                         case IEEE80211_CCK_RATE_5MB:
152                                 *rate_cfg |= RATE_5_5M;
153                                 break;
154                         case IEEE80211_CCK_RATE_11MB:
155                                 *rate_cfg |= RATE_11M;
156                                 break;
157                         case IEEE80211_OFDM_RATE_6MB:
158                                 *rate_cfg |= RATE_6M;
159                                 break;
160                         case IEEE80211_OFDM_RATE_9MB:
161                                 *rate_cfg |= RATE_9M;
162                                 break;
163                         case IEEE80211_OFDM_RATE_12MB:
164                                 *rate_cfg |= RATE_12M;
165                                 break;
166                         case IEEE80211_OFDM_RATE_18MB:
167                                 *rate_cfg |= RATE_18M;
168                                 break;
169                         case IEEE80211_OFDM_RATE_24MB:
170                                 *rate_cfg |= RATE_24M;
171                                 break;
172                         case IEEE80211_OFDM_RATE_36MB:
173                                 *rate_cfg |= RATE_36M;
174                                 break;
175                         case IEEE80211_OFDM_RATE_48MB:
176                                 *rate_cfg |= RATE_48M;
177                                 break;
178                         case IEEE80211_OFDM_RATE_54MB:
179                                 *rate_cfg |= RATE_54M;
180                                 break;
181                         }
182                 }
183         }
184 }
185
186 static void one_out_pipe(struct adapter *adapter)
187 {
188         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter);
189
190         pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
191         pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
192         pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */
193         pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
194
195         pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
196         pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
197         pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
198         pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
199 }
200
201 static void two_out_pipe(struct adapter *adapter, bool wifi_cfg)
202 {
203         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter);
204
205         if (wifi_cfg) { /* WMM */
206                 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
207                 /*  0,  1,  0,  1,   0,   0,   0,    0,    0}; */
208                 /* 0:H, 1:L */
209
210                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */
211                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
212                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
213                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
214
215                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
216                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
217                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
218                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
219
220         } else {/* typical setting */
221                 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
222                 /*  1,  1,  0,  0,   0,   0,   0,    0,    0}; */
223                 /* 0:H, 1:L */
224
225                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
226                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
227                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
228                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
229
230                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
231                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
232                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
233                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
234         }
235 }
236
237 static void three_out_pipe(struct adapter *adapter, bool wifi_cfg)
238 {
239         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter);
240
241         if (wifi_cfg) {/* for WMM */
242                 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
243                 /*  1,  2,  1,  0,   0,   0,   0,    0,    0}; */
244                 /* 0:H, 1:N, 2:L */
245
246                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
247                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
248                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
249                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
250
251                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
252                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
253                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
254                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
255
256         } else {/* typical setting */
257                 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
258                 /*  2,  2,  1,  0,   0,   0,   0,    0,    0}; */
259                 /* 0:H, 1:N, 2:L */
260
261                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
262                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
263                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
264                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */
265
266                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
267                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
268                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
269                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
270         }
271 }
272
273 bool Hal_MappingOutPipe(struct adapter *adapter, u8 numoutpipe)
274 {
275         struct registry_priv *pregistrypriv = &adapter->registrypriv;
276         bool  wifi_cfg = (pregistrypriv->wifi_spec) ? true : false;
277         bool result = true;
278
279         switch (numoutpipe) {
280         case 2:
281                 two_out_pipe(adapter, wifi_cfg);
282                 break;
283         case 3:
284                 three_out_pipe(adapter, wifi_cfg);
285                 break;
286         case 1:
287                 one_out_pipe(adapter);
288                 break;
289         default:
290                 result = false;
291                 break;
292         }
293         return result;
294 }
295
296 void hal_init_macaddr(struct adapter *adapter)
297 {
298         rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR,
299                           adapter->eeprompriv.mac_addr);
300 }