GNU Linux-libre 5.10.153-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(u8 hw_channel_plan, u8 sw_channel_plan,
49                             u8 def_channel_plan, bool load_fail)
50 {
51         u8 sw_cfg;
52         u8 chnlplan;
53
54         sw_cfg = true;
55         if (!load_fail) {
56                 if (!rtw_is_channel_plan_valid(sw_channel_plan))
57                         sw_cfg = false;
58                 if (hw_channel_plan & CHAN_PLAN_HW)
59                         sw_cfg = false;
60         }
61
62         if (sw_cfg)
63                 chnlplan = sw_channel_plan;
64         else
65                 chnlplan = hw_channel_plan & (~CHAN_PLAN_HW);
66
67         if (!rtw_is_channel_plan_valid(chnlplan))
68                 chnlplan = def_channel_plan;
69
70         return chnlplan;
71 }
72
73 u8 MRateToHwRate(u8 rate)
74 {
75         u8 ret = DESC_RATE1M;
76
77         switch (rate) {
78                 /*  CCK and OFDM non-HT rates */
79         case IEEE80211_CCK_RATE_1MB:
80                 ret = DESC_RATE1M;
81                 break;
82         case IEEE80211_CCK_RATE_2MB:
83                 ret = DESC_RATE2M;
84                 break;
85         case IEEE80211_CCK_RATE_5MB:
86                 ret = DESC_RATE5_5M;
87                 break;
88         case IEEE80211_CCK_RATE_11MB:
89                 ret = DESC_RATE11M;
90                 break;
91         case IEEE80211_OFDM_RATE_6MB:
92                 ret = DESC_RATE6M;
93                 break;
94         case IEEE80211_OFDM_RATE_9MB:
95                 ret = DESC_RATE9M;
96                 break;
97         case IEEE80211_OFDM_RATE_12MB:
98                 ret = DESC_RATE12M;
99                 break;
100         case IEEE80211_OFDM_RATE_18MB:
101                 ret = DESC_RATE18M;
102                 break;
103         case IEEE80211_OFDM_RATE_24MB:
104                 ret = DESC_RATE24M;
105                 break;
106         case IEEE80211_OFDM_RATE_36MB:
107                 ret = DESC_RATE36M;
108                 break;
109         case IEEE80211_OFDM_RATE_48MB:
110                 ret = DESC_RATE48M;
111                 break;
112         case IEEE80211_OFDM_RATE_54MB:
113                 ret = DESC_RATE54M;
114                 break;
115         default:
116                 break;
117         }
118         return ret;
119 }
120
121 void hal_set_brate_cfg(u8 *brates, u16 *rate_cfg)
122 {
123         u8 i, is_brate, brate;
124
125         for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
126                 is_brate = brates[i] & IEEE80211_BASIC_RATE_MASK;
127                 brate = brates[i] & 0x7f;
128
129                 if (is_brate) {
130                         switch (brate) {
131                         case IEEE80211_CCK_RATE_1MB:
132                                 *rate_cfg |= RATE_1M;
133                                 break;
134                         case IEEE80211_CCK_RATE_2MB:
135                                 *rate_cfg |= RATE_2M;
136                                 break;
137                         case IEEE80211_CCK_RATE_5MB:
138                                 *rate_cfg |= RATE_5_5M;
139                                 break;
140                         case IEEE80211_CCK_RATE_11MB:
141                                 *rate_cfg |= RATE_11M;
142                                 break;
143                         case IEEE80211_OFDM_RATE_6MB:
144                                 *rate_cfg |= RATE_6M;
145                                 break;
146                         case IEEE80211_OFDM_RATE_9MB:
147                                 *rate_cfg |= RATE_9M;
148                                 break;
149                         case IEEE80211_OFDM_RATE_12MB:
150                                 *rate_cfg |= RATE_12M;
151                                 break;
152                         case IEEE80211_OFDM_RATE_18MB:
153                                 *rate_cfg |= RATE_18M;
154                                 break;
155                         case IEEE80211_OFDM_RATE_24MB:
156                                 *rate_cfg |= RATE_24M;
157                                 break;
158                         case IEEE80211_OFDM_RATE_36MB:
159                                 *rate_cfg |= RATE_36M;
160                                 break;
161                         case IEEE80211_OFDM_RATE_48MB:
162                                 *rate_cfg |= RATE_48M;
163                                 break;
164                         case IEEE80211_OFDM_RATE_54MB:
165                                 *rate_cfg |= RATE_54M;
166                                 break;
167                         }
168                 }
169         }
170 }
171
172 static void one_out_pipe(struct adapter *adapter)
173 {
174         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter);
175
176         pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
177         pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
178         pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */
179         pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
180
181         pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
182         pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
183         pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
184         pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
185 }
186
187 static void two_out_pipe(struct adapter *adapter, bool wifi_cfg)
188 {
189         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter);
190
191         if (wifi_cfg) {
192                 /*
193                  * WMM
194                  * BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA
195                  *  0,  1,  0,  1,   0,   0,   0,    0,    0
196                  * 0:H, 1:L
197                  */
198                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */
199                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
200                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
201                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
202
203                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
204                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
205                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
206                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
207         } else {
208                 /*
209                  * typical setting
210                  * BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA
211                  *  1,  1,  0,  0,   0,   0,   0,    0,    0
212                  * 0:H, 1:L
213                  */
214                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
215                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
216                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
217                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
218
219                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
220                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
221                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
222                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
223         }
224 }
225
226 static void three_out_pipe(struct adapter *adapter, bool wifi_cfg)
227 {
228         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(adapter);
229
230         if (wifi_cfg) {
231                 /*
232                  * for WMM
233                  * BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA
234                  *  1,  2,  1,  0,   0,   0,   0,    0,    0
235                  * 0:H, 1:N, 2:L
236                  */
237                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
238                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
239                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
240                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
241
242                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
243                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
244                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
245                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
246         } else {
247                 /*
248                  * typical setting
249                  * BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA
250                  *  2,  2,  1,  0,   0,   0,   0,    0,    0
251                  * 0:H, 1:N, 2:L
252                  */
253                 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
254                 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
255                 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
256                 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */
257
258                 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
259                 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
260                 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
261                 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
262         }
263 }
264
265 bool hal_mapping_out_pipe(struct adapter *adapter, u8 numoutpipe)
266 {
267         struct registry_priv *pregistrypriv = &adapter->registrypriv;
268         bool wifi_cfg = (pregistrypriv->wifi_spec) ? true : false;
269         bool result = true;
270
271         switch (numoutpipe) {
272         case 1:
273                 one_out_pipe(adapter);
274                 break;
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         default:
282                 result = false;
283         }
284         return result;
285 }