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
dump_chip_info(struct HAL_VERSION chip_vers)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 */
hal_com_get_channel_plan(struct adapter * padapter,u8 hw_channel_plan,u8 sw_channel_plan,u8 def_channel_plan,bool load_fail)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
MRateToHwRate(u8 rate)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
HalSetBrateCfg(struct adapter * adapt,u8 * brates,u16 * rate_cfg)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
one_out_pipe(struct adapter * adapter)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
two_out_pipe(struct adapter * adapter,bool wifi_cfg)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
three_out_pipe(struct adapter * adapter,bool wifi_cfg)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
Hal_MappingOutPipe(struct adapter * adapter,u8 numoutpipe)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
hal_init_macaddr(struct adapter * adapter)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 }
293