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