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