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