1
2
3
4
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
16void 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
48u8 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
73u8 MRateToHwRate(u8 rate)
74{
75 u8 ret = DESC_RATE1M;
76
77 switch (rate) {
78
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
121void 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
172static 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];
177 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];
178 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];
179 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];
180
181 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];
182 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];
183 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];
184 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];
185}
186
187static 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
194
195
196
197
198 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];
199 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];
200 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];
201 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];
202
203 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];
204 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];
205 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];
206 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];
207 } else {
208
209
210
211
212
213
214 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];
215 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];
216 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];
217 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];
218
219 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];
220 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];
221 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];
222 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];
223 }
224}
225
226static 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
233
234
235
236
237 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];
238 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];
239 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];
240 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];
241
242 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];
243 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];
244 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];
245 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];
246 } else {
247
248
249
250
251
252
253 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];
254 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];
255 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];
256 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];
257
258 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];
259 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];
260 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];
261 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];
262 }
263}
264
265bool 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}
286