1
2
3
4#define _RTW_MP_IOCTL_C_
5
6#include "../include/osdep_service.h"
7#include "../include/drv_types.h"
8#include "../include/mlme_osdep.h"
9#include "../include/rtw_mp_ioctl.h"
10
11
12int rtl8188eu_oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
13{
14 int status = NDIS_STATUS_SUCCESS;
15 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
16
17 if (poid_par_priv->information_buf_len < sizeof(u8))
18 return NDIS_STATUS_INVALID_LENGTH;
19
20 if (poid_par_priv->type_of_oid == SET_OID) {
21 Adapter->registrypriv.wireless_mode = *(u8 *)poid_par_priv->information_buf;
22 } else if (poid_par_priv->type_of_oid == QUERY_OID) {
23 *(u8 *)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode;
24 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
25 } else {
26 status = NDIS_STATUS_NOT_ACCEPTED;
27 }
28
29 return status;
30}
31
32int rtl8188eu_oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
33{
34 struct bb_reg_param *pbbreg;
35 u16 offset;
36 u32 value;
37 int status = NDIS_STATUS_SUCCESS;
38 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
39
40 if (poid_par_priv->type_of_oid != SET_OID)
41 return NDIS_STATUS_NOT_ACCEPTED;
42
43 if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
44 return NDIS_STATUS_INVALID_LENGTH;
45
46 pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
47
48 offset = (u16)(pbbreg->offset) & 0xFFF;
49 if (offset < BB_REG_BASE_ADDR)
50 offset |= BB_REG_BASE_ADDR;
51
52 value = pbbreg->value;
53
54 _irqlevel_changed_(&oldirql, LOWER);
55 write_bbreg(Adapter, offset, 0xFFFFFFFF, value);
56 _irqlevel_changed_(&oldirql, RAISE);
57
58 return status;
59}
60
61int rtl8188eu_oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
62{
63 struct bb_reg_param *pbbreg;
64 u16 offset;
65 u32 value;
66 int status = NDIS_STATUS_SUCCESS;
67 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
68
69 if (poid_par_priv->type_of_oid != QUERY_OID)
70 return NDIS_STATUS_NOT_ACCEPTED;
71
72 if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
73 return NDIS_STATUS_INVALID_LENGTH;
74
75 pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
76
77 offset = (u16)(pbbreg->offset) & 0xFFF;
78 if (offset < BB_REG_BASE_ADDR)
79 offset |= BB_REG_BASE_ADDR;
80
81 _irqlevel_changed_(&oldirql, LOWER);
82 value = read_bbreg(Adapter, offset, 0xFFFFFFFF);
83 _irqlevel_changed_(&oldirql, RAISE);
84
85 pbbreg->value = value;
86 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
87
88 return status;
89}
90
91int rtl8188eu_oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
92{
93 struct rf_reg_param *pbbreg;
94 u8 path;
95 u8 offset;
96 u32 value;
97 int status = NDIS_STATUS_SUCCESS;
98 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
99
100 if (poid_par_priv->type_of_oid != SET_OID)
101 return NDIS_STATUS_NOT_ACCEPTED;
102
103 if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
104 return NDIS_STATUS_INVALID_LENGTH;
105
106 pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
107
108 if (pbbreg->path >= RF_PATH_MAX)
109 return NDIS_STATUS_NOT_ACCEPTED;
110 if (pbbreg->offset > 0xFF)
111 return NDIS_STATUS_NOT_ACCEPTED;
112 if (pbbreg->value > 0xFFFFF)
113 return NDIS_STATUS_NOT_ACCEPTED;
114
115 path = (u8)pbbreg->path;
116 offset = (u8)pbbreg->offset;
117 value = pbbreg->value;
118
119 _irqlevel_changed_(&oldirql, LOWER);
120 write_rfreg(Adapter, path, offset, value);
121 _irqlevel_changed_(&oldirql, RAISE);
122
123 return status;
124}
125
126int rtl8188eu_oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
127{
128 struct rf_reg_param *pbbreg;
129 u8 path;
130 u8 offset;
131 u32 value;
132 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
133 int status = NDIS_STATUS_SUCCESS;
134
135 if (poid_par_priv->type_of_oid != QUERY_OID)
136 return NDIS_STATUS_NOT_ACCEPTED;
137
138 if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
139 return NDIS_STATUS_INVALID_LENGTH;
140
141 pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
142
143 if (pbbreg->path >= RF_PATH_MAX)
144 return NDIS_STATUS_NOT_ACCEPTED;
145 if (pbbreg->offset > 0xFF)
146 return NDIS_STATUS_NOT_ACCEPTED;
147
148 path = (u8)pbbreg->path;
149 offset = (u8)pbbreg->offset;
150
151 _irqlevel_changed_(&oldirql, LOWER);
152 value = read_rfreg(Adapter, path, offset);
153 _irqlevel_changed_(&oldirql, RAISE);
154
155 pbbreg->value = value;
156
157 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
158
159 return status;
160}
161
162
163
164
165
166int rtl8188eu_oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv)
167{
168 u32 ratevalue;
169 int status = NDIS_STATUS_SUCCESS;
170 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
171
172 if (poid_par_priv->type_of_oid != SET_OID)
173 return NDIS_STATUS_NOT_ACCEPTED;
174
175 if (poid_par_priv->information_buf_len != sizeof(u32))
176 return NDIS_STATUS_INVALID_LENGTH;
177
178 ratevalue = *((u32 *)poid_par_priv->information_buf);
179 if (ratevalue >= MPT_RATE_LAST)
180 return NDIS_STATUS_INVALID_DATA;
181
182 Adapter->mppriv.rateidx = ratevalue;
183
184 _irqlevel_changed_(&oldirql, LOWER);
185 SetDataRate(Adapter);
186 _irqlevel_changed_(&oldirql, RAISE);
187
188 return status;
189}
190
191int rtl8188eu_oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv)
192{
193 u32 mode;
194 int status = NDIS_STATUS_SUCCESS;
195 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
196
197 if (Adapter->registrypriv.mp_mode == 0)
198 return NDIS_STATUS_NOT_ACCEPTED;
199
200 if (poid_par_priv->type_of_oid != SET_OID)
201 return NDIS_STATUS_NOT_ACCEPTED;
202
203 _irqlevel_changed_(&oldirql, LOWER);
204
205
206
207 mode = *((u32 *)poid_par_priv->information_buf);
208 Adapter->mppriv.mode = mode;
209
210 if (mp_start_test(Adapter) == _FAIL) {
211 status = NDIS_STATUS_NOT_ACCEPTED;
212 goto exit;
213 }
214
215exit:
216 _irqlevel_changed_(&oldirql, RAISE);
217
218 return status;
219}
220
221int rtl8188eu_oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv)
222{
223 int status = NDIS_STATUS_SUCCESS;
224 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
225
226 if (poid_par_priv->type_of_oid != SET_OID)
227 return NDIS_STATUS_NOT_ACCEPTED;
228
229 _irqlevel_changed_(&oldirql, LOWER);
230 mp_stop_test(Adapter);
231 _irqlevel_changed_(&oldirql, RAISE);
232
233 return status;
234}
235
236int rtl8188eu_oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv)
237{
238 u32 Channel;
239 int status = NDIS_STATUS_SUCCESS;
240 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
241
242 if (poid_par_priv->information_buf_len != sizeof(u32))
243 return NDIS_STATUS_INVALID_LENGTH;
244
245 if (poid_par_priv->type_of_oid == QUERY_OID) {
246 *((u32 *)poid_par_priv->information_buf) = Adapter->mppriv.channel;
247 return NDIS_STATUS_SUCCESS;
248 }
249
250 if (poid_par_priv->type_of_oid != SET_OID)
251 return NDIS_STATUS_NOT_ACCEPTED;
252
253 Channel = *((u32 *)poid_par_priv->information_buf);
254 if (Channel > 14)
255 return NDIS_STATUS_NOT_ACCEPTED;
256 Adapter->mppriv.channel = Channel;
257
258 _irqlevel_changed_(&oldirql, LOWER);
259 SetChannel(Adapter);
260 _irqlevel_changed_(&oldirql, RAISE);
261
262 return status;
263}
264
265int rtl8188eu_oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv)
266{
267 u16 bandwidth;
268 u16 channel_offset;
269 int status = NDIS_STATUS_SUCCESS;
270 struct adapter *padapter = (struct adapter *)(poid_par_priv->adapter_context);
271
272 if (poid_par_priv->type_of_oid != SET_OID)
273 return NDIS_STATUS_NOT_ACCEPTED;
274
275 if (poid_par_priv->information_buf_len < sizeof(u32))
276 return NDIS_STATUS_INVALID_LENGTH;
277
278 bandwidth = *((u32 *)poid_par_priv->information_buf);
279 channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
280
281 if (bandwidth != HT_CHANNEL_WIDTH_40)
282 bandwidth = HT_CHANNEL_WIDTH_20;
283 padapter->mppriv.bandwidth = (u8)bandwidth;
284 padapter->mppriv.prime_channel_offset = (u8)channel_offset;
285
286 _irqlevel_changed_(&oldirql, LOWER);
287 SetBandwidth(padapter);
288 _irqlevel_changed_(&oldirql, RAISE);
289
290 return status;
291}
292
293int rtl8188eu_oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv)
294{
295 u32 antenna;
296 int status = NDIS_STATUS_SUCCESS;
297 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
298
299 if (poid_par_priv->information_buf_len != sizeof(u32))
300 return NDIS_STATUS_INVALID_LENGTH;
301
302 if (poid_par_priv->type_of_oid == SET_OID) {
303 antenna = *(u32 *)poid_par_priv->information_buf;
304
305 Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16);
306 Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF);
307
308 _irqlevel_changed_(&oldirql, LOWER);
309 SetAntenna(Adapter);
310 _irqlevel_changed_(&oldirql, RAISE);
311 } else {
312 antenna = (Adapter->mppriv.antenna_tx << 16) | Adapter->mppriv.antenna_rx;
313 *(u32 *)poid_par_priv->information_buf = antenna;
314 }
315
316 return status;
317}
318
319int rtl8188eu_oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv)
320{
321 u32 tx_pwr_idx;
322 int status = NDIS_STATUS_SUCCESS;
323 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
324
325 if (poid_par_priv->type_of_oid != SET_OID)
326 return NDIS_STATUS_NOT_ACCEPTED;
327
328 if (poid_par_priv->information_buf_len != sizeof(u32))
329 return NDIS_STATUS_INVALID_LENGTH;
330
331 tx_pwr_idx = *((u32 *)poid_par_priv->information_buf);
332 if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE)
333 return NDIS_STATUS_NOT_ACCEPTED;
334
335 Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx;
336
337 _irqlevel_changed_(&oldirql, LOWER);
338 SetTxPower(Adapter);
339 _irqlevel_changed_(&oldirql, RAISE);
340
341 return status;
342}
343
344
345
346
347int rtl8188eu_oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)
348{
349 int status = NDIS_STATUS_SUCCESS;
350 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
351
352 if (poid_par_priv->type_of_oid != QUERY_OID) {
353 status = NDIS_STATUS_NOT_ACCEPTED;
354 return status;
355 }
356
357 if (poid_par_priv->information_buf_len == sizeof(u32)) {
358 *(u32 *)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount;
359 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
360 } else {
361 status = NDIS_STATUS_INVALID_LENGTH;
362 }
363
364 return status;
365}
366
367int rtl8188eu_oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
368{
369 int status = NDIS_STATUS_SUCCESS;
370 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
371
372 if (poid_par_priv->type_of_oid != QUERY_OID) {
373 status = NDIS_STATUS_NOT_ACCEPTED;
374 return status;
375 }
376 if (poid_par_priv->information_buf_len == sizeof(u32)) {
377 *(u32 *)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount;
378 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
379 } else {
380 status = NDIS_STATUS_INVALID_LENGTH;
381 }
382
383 return status;
384}
385
386int rtl8188eu_oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)
387{
388 int status = NDIS_STATUS_SUCCESS;
389 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
390
391 if (poid_par_priv->type_of_oid != QUERY_OID) {
392 status = NDIS_STATUS_NOT_ACCEPTED;
393 return status;
394 }
395 if (poid_par_priv->information_buf_len == sizeof(u32)) {
396 *(u32 *)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount;
397 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
398 } else {
399 status = NDIS_STATUS_INVALID_LENGTH;
400 }
401
402 return status;
403}
404
405
406int rtl8188eu_oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)
407{
408 int status = NDIS_STATUS_SUCCESS;
409 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
410
411 if (poid_par_priv->type_of_oid != SET_OID) {
412 status = NDIS_STATUS_NOT_ACCEPTED;
413 return status;
414 }
415
416 Adapter->mppriv.tx_pktcount = 0;
417
418 return status;
419}
420
421int rtl8188eu_oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
422{
423 int status = NDIS_STATUS_SUCCESS;
424 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
425
426 if (poid_par_priv->type_of_oid != SET_OID) {
427 status = NDIS_STATUS_NOT_ACCEPTED;
428 return status;
429 }
430
431 if (poid_par_priv->information_buf_len == sizeof(u32)) {
432 Adapter->mppriv.rx_pktcount = 0;
433 Adapter->mppriv.rx_crcerrpktcount = 0;
434 } else {
435 status = NDIS_STATUS_INVALID_LENGTH;
436 }
437
438 return status;
439}
440
441int rtl8188eu_oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv)
442{
443 int status = NDIS_STATUS_SUCCESS;
444 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
445
446 if (poid_par_priv->type_of_oid != SET_OID) {
447 status = NDIS_STATUS_NOT_ACCEPTED;
448 return status;
449 }
450
451 _irqlevel_changed_(&oldirql, LOWER);
452 ResetPhyRxPktCount(Adapter);
453 _irqlevel_changed_(&oldirql, RAISE);
454
455 return status;
456}
457
458int rtl8188eu_oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
459{
460 int status = NDIS_STATUS_SUCCESS;
461 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
462
463 if (poid_par_priv->type_of_oid != QUERY_OID)
464 return NDIS_STATUS_NOT_ACCEPTED;
465
466 if (poid_par_priv->information_buf_len != sizeof(u32))
467 return NDIS_STATUS_INVALID_LENGTH;
468
469 _irqlevel_changed_(&oldirql, LOWER);
470 *(u32 *)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter);
471 _irqlevel_changed_(&oldirql, RAISE);
472
473 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
474
475 return status;
476}
477
478int rtl8188eu_oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)
479{
480 int status = NDIS_STATUS_SUCCESS;
481 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
482
483 if (poid_par_priv->type_of_oid != QUERY_OID)
484 return NDIS_STATUS_NOT_ACCEPTED;
485
486 if (poid_par_priv->information_buf_len != sizeof(u32))
487 return NDIS_STATUS_INVALID_LENGTH;
488
489 _irqlevel_changed_(&oldirql, LOWER);
490 *(u32 *)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter);
491 _irqlevel_changed_(&oldirql, RAISE);
492
493 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
494
495 return status;
496}
497
498int rtl8188eu_oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv)
499{
500 u32 bStartTest;
501 int status = NDIS_STATUS_SUCCESS;
502 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
503
504 if (poid_par_priv->type_of_oid != SET_OID)
505 return NDIS_STATUS_NOT_ACCEPTED;
506
507 bStartTest = *((u32 *)poid_par_priv->information_buf);
508
509 _irqlevel_changed_(&oldirql, LOWER);
510 SetContinuousTx(Adapter, (u8)bStartTest);
511 if (bStartTest) {
512 struct mp_priv *pmp_priv = &Adapter->mppriv;
513 if (pmp_priv->tx.stop == 0) {
514 pmp_priv->tx.stop = 1;
515 DBG_88E("%s: pkt tx is running...\n", __func__);
516 msleep(5);
517 }
518 pmp_priv->tx.stop = 0;
519 pmp_priv->tx.count = 1;
520 SetPacketTx(Adapter);
521 }
522 _irqlevel_changed_(&oldirql, RAISE);
523
524 return status;
525}
526
527int rtl8188eu_oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv)
528{
529 u32 bStartTest;
530 int status = NDIS_STATUS_SUCCESS;
531 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
532
533 if (poid_par_priv->type_of_oid != SET_OID)
534 return NDIS_STATUS_NOT_ACCEPTED;
535
536 bStartTest = *((u32 *)poid_par_priv->information_buf);
537
538 _irqlevel_changed_(&oldirql, LOWER);
539 SetSingleCarrierTx(Adapter, (u8)bStartTest);
540 if (bStartTest) {
541 struct mp_priv *pmp_priv = &Adapter->mppriv;
542 if (pmp_priv->tx.stop == 0) {
543 pmp_priv->tx.stop = 1;
544 DBG_88E("%s: pkt tx is running...\n", __func__);
545 msleep(5);
546 }
547 pmp_priv->tx.stop = 0;
548 pmp_priv->tx.count = 1;
549 SetPacketTx(Adapter);
550 }
551 _irqlevel_changed_(&oldirql, RAISE);
552
553 return status;
554}
555
556int rtl8188eu_oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv)
557{
558 u32 bStartTest;
559 int status = NDIS_STATUS_SUCCESS;
560 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
561
562 if (poid_par_priv->type_of_oid != SET_OID)
563 return NDIS_STATUS_NOT_ACCEPTED;
564
565 bStartTest = *((u32 *)poid_par_priv->information_buf);
566
567 _irqlevel_changed_(&oldirql, LOWER);
568 SetCarrierSuppressionTx(Adapter, (u8)bStartTest);
569 if (bStartTest) {
570 struct mp_priv *pmp_priv = &Adapter->mppriv;
571 if (pmp_priv->tx.stop == 0) {
572 pmp_priv->tx.stop = 1;
573 DBG_88E("%s: pkt tx is running...\n", __func__);
574 msleep(5);
575 }
576 pmp_priv->tx.stop = 0;
577 pmp_priv->tx.count = 1;
578 SetPacketTx(Adapter);
579 }
580 _irqlevel_changed_(&oldirql, RAISE);
581
582 return status;
583}
584
585int rtl8188eu_oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv)
586{
587 u32 bStartTest;
588 int status = NDIS_STATUS_SUCCESS;
589 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
590
591 if (poid_par_priv->type_of_oid != SET_OID)
592 return NDIS_STATUS_NOT_ACCEPTED;
593
594 bStartTest = *((u32 *)poid_par_priv->information_buf);
595
596 _irqlevel_changed_(&oldirql, LOWER);
597 SetSingleToneTx(Adapter, (u8)bStartTest);
598 _irqlevel_changed_(&oldirql, RAISE);
599
600 return status;
601}
602
603int rtl8188eu_oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv)
604{
605 return 0;
606}
607
608int rtl8188eu_oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv)
609{
610 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
611 int status = NDIS_STATUS_SUCCESS;
612
613 if (poid_par_priv->type_of_oid != SET_OID)
614 return NDIS_STATUS_NOT_ACCEPTED;
615
616 _irqlevel_changed_(&oldirql, LOWER);
617 rtw_hal_set_hwreg(Adapter, HW_VAR_TRIGGER_GPIO_0, NULL);
618 _irqlevel_changed_(&oldirql, RAISE);
619
620 return status;
621}
622
623
624int rtl8188eu_oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv)
625{
626 return 0;
627}
628
629int rtl8188eu_oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv)
630{
631 struct mp_rw_reg *RegRWStruct;
632 u32 offset, width;
633 int status = NDIS_STATUS_SUCCESS;
634 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
635
636 if (poid_par_priv->type_of_oid != QUERY_OID)
637 return NDIS_STATUS_NOT_ACCEPTED;
638
639 RegRWStruct = (struct mp_rw_reg *)poid_par_priv->information_buf;
640 offset = RegRWStruct->offset;
641 width = RegRWStruct->width;
642
643 if (offset > 0xFFF)
644 return NDIS_STATUS_NOT_ACCEPTED;
645
646 _irqlevel_changed_(&oldirql, LOWER);
647
648 switch (width) {
649 case 1:
650 RegRWStruct->value = rtw_read8(Adapter, offset);
651 break;
652 case 2:
653 RegRWStruct->value = rtw_read16(Adapter, offset);
654 break;
655 default:
656 width = 4;
657 RegRWStruct->value = rtw_read32(Adapter, offset);
658 break;
659 }
660
661 _irqlevel_changed_(&oldirql, RAISE);
662
663 *poid_par_priv->bytes_rw = width;
664
665 return status;
666}
667
668int rtl8188eu_oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv)
669{
670 struct mp_rw_reg *RegRWStruct;
671 u32 offset, value;
672 int status = NDIS_STATUS_SUCCESS;
673 struct adapter *padapter = (struct adapter *)(poid_par_priv->adapter_context);
674
675 if (poid_par_priv->type_of_oid != SET_OID)
676 return NDIS_STATUS_NOT_ACCEPTED;
677
678 RegRWStruct = (struct mp_rw_reg *)poid_par_priv->information_buf;
679 offset = RegRWStruct->offset;
680 value = RegRWStruct->value;
681
682 if (offset > 0xFFF)
683 return NDIS_STATUS_NOT_ACCEPTED;
684
685 _irqlevel_changed_(&oldirql, LOWER);
686
687 switch (RegRWStruct->width) {
688 case 1:
689 if (value > 0xFF) {
690 status = NDIS_STATUS_NOT_ACCEPTED;
691 break;
692 }
693 rtw_write8(padapter, offset, (u8)value);
694 break;
695 case 2:
696 if (value > 0xFFFF) {
697 status = NDIS_STATUS_NOT_ACCEPTED;
698 break;
699 }
700 rtw_write16(padapter, offset, (u16)value);
701 break;
702 case 4:
703 rtw_write32(padapter, offset, value);
704 break;
705 default:
706 status = NDIS_STATUS_NOT_ACCEPTED;
707 break;
708 }
709
710 _irqlevel_changed_(&oldirql, RAISE);
711
712 return status;
713}
714
715int rtl8188eu_oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv)
716{
717 return 0;
718}
719
720int rtl8188eu_oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv)
721{
722 return 0;
723}
724
725int rtl8188eu_oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv)
726{
727 return 0;
728}
729
730
731int rtl8188eu_oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv)
732{
733 return 0;
734}
735
736
737int rtl8188eu_oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv)
738{
739 return 0;
740}
741
742int rtl8188eu_oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv)
743{
744 return 0;
745}
746
747int rtl8188eu_oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv)
748{
749 return 0;
750}
751
752int rtl8188eu_oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)
753{
754 return 0;
755}
756
757int rtl8188eu_oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)
758{
759 return 0;
760}
761
762int rtl8188eu_oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv)
763{
764 return 0;
765}
766
767int rtl8188eu_oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv)
768{
769 return 0;
770}
771
772int rtl8188eu_oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv)
773{
774 return 0;
775}
776
777int rtl8188eu_oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv)
778{
779 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
780
781 int status = NDIS_STATUS_SUCCESS;
782
783 if (poid_par_priv->type_of_oid != SET_OID)
784 return NDIS_STATUS_NOT_ACCEPTED;
785
786 _irqlevel_changed_(&oldirql, LOWER);
787
788 if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) != _SUCCESS)
789 status = NDIS_STATUS_NOT_ACCEPTED;
790
791 _irqlevel_changed_(&oldirql, RAISE);
792
793 return status;
794}
795
796int rtl8188eu_oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv)
797{
798 int status = NDIS_STATUS_SUCCESS;
799 u8 thermal = 0;
800 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
801
802 if (poid_par_priv->type_of_oid != QUERY_OID)
803 return NDIS_STATUS_NOT_ACCEPTED;
804
805 if (poid_par_priv->information_buf_len < sizeof(u32))
806 return NDIS_STATUS_INVALID_LENGTH;
807
808 _irqlevel_changed_(&oldirql, LOWER);
809 GetThermalMeter(Adapter, &thermal);
810 _irqlevel_changed_(&oldirql, RAISE);
811
812 *(u32 *)poid_par_priv->information_buf = (u32)thermal;
813 *poid_par_priv->bytes_rw = sizeof(u32);
814
815 return status;
816}
817
818int rtl8188eu_oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv)
819{
820 return 0;
821}
822
823int rtl8188eu_oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv)
824{
825 int status = NDIS_STATUS_SUCCESS;
826 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
827
828 if (poid_par_priv->information_buf_len < sizeof(u8))
829 return NDIS_STATUS_INVALID_LENGTH;
830
831 _irqlevel_changed_(&oldirql, LOWER);
832 if (poid_par_priv->type_of_oid == SET_OID) {
833 u8 enable;
834
835 enable = *(u8 *)poid_par_priv->information_buf;
836
837 SetPowerTracking(Adapter, enable);
838 } else {
839 GetPowerTracking(Adapter, (u8 *)poid_par_priv->information_buf);
840 }
841 _irqlevel_changed_(&oldirql, RAISE);
842
843 return status;
844}
845
846int rtl8188eu_oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv)
847{
848 return 0;
849}
850
851int rtl8188eu_oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
852{
853 return 0;
854}
855
856int rtl8188eu_oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
857{
858 return 0;
859}
860
861int rtl8188eu_oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv)
862{
863 return 0;
864}
865
866int rtl8188eu_oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv)
867{
868 return 0;
869}
870
871
872int rtl8188eu_oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv)
873{
874 return 0;
875}
876
877int rtl8188eu_oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv)
878{
879 return 0;
880}
881
882int rtl8188eu_oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv)
883{
884 return 0;
885}
886
887int rtl8188eu_oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv)
888{
889 return 0;
890}
891
892int rtl8188eu_oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)
893{
894 return NDIS_STATUS_SUCCESS;
895}
896
897int rtl8188eu_oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv)
898{
899 struct efuse_access_struct *pefuse;
900 u8 *data;
901 u16 addr = 0, cnts = 0, max_available_size = 0;
902 int status = NDIS_STATUS_SUCCESS;
903 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
904
905 if (poid_par_priv->type_of_oid != QUERY_OID)
906 return NDIS_STATUS_NOT_ACCEPTED;
907
908 if (poid_par_priv->information_buf_len < sizeof(struct efuse_access_struct))
909 return NDIS_STATUS_INVALID_LENGTH;
910
911 pefuse = (struct efuse_access_struct *)poid_par_priv->information_buf;
912 addr = pefuse->start_addr;
913 cnts = pefuse->cnts;
914 data = pefuse->data;
915
916 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false);
917
918 if ((addr + cnts) > max_available_size)
919 return NDIS_STATUS_NOT_ACCEPTED;
920
921 _irqlevel_changed_(&oldirql, LOWER);
922 if (rtw_efuse_access(Adapter, false, addr, cnts, data) == _FAIL)
923 status = NDIS_STATUS_FAILURE;
924 else
925 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
926 _irqlevel_changed_(&oldirql, RAISE);
927
928 return status;
929}
930
931int rtl8188eu_oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv)
932{
933 struct efuse_access_struct *pefuse;
934 u8 *data;
935 u16 addr = 0, cnts = 0, max_available_size = 0;
936 int status = NDIS_STATUS_SUCCESS;
937 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
938
939 if (poid_par_priv->type_of_oid != SET_OID)
940 return NDIS_STATUS_NOT_ACCEPTED;
941
942 pefuse = (struct efuse_access_struct *)poid_par_priv->information_buf;
943 addr = pefuse->start_addr;
944 cnts = pefuse->cnts;
945 data = pefuse->data;
946
947 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size, false);
948
949 if ((addr + cnts) > max_available_size)
950 return NDIS_STATUS_NOT_ACCEPTED;
951
952 _irqlevel_changed_(&oldirql, LOWER);
953 if (rtw_efuse_access(Adapter, true, addr, cnts, data) == _FAIL)
954 status = NDIS_STATUS_FAILURE;
955 _irqlevel_changed_(&oldirql, RAISE);
956
957 return status;
958}
959
960int rtl8188eu_oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv)
961{
962 struct pgpkt *ppgpkt;
963 int status = NDIS_STATUS_SUCCESS;
964 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
965
966 *poid_par_priv->bytes_rw = 0;
967
968 if (poid_par_priv->information_buf_len < sizeof(struct pgpkt *))
969 return NDIS_STATUS_INVALID_LENGTH;
970
971 ppgpkt = (struct pgpkt *)poid_par_priv->information_buf;
972
973 _irqlevel_changed_(&oldirql, LOWER);
974
975 if (poid_par_priv->type_of_oid == QUERY_OID) {
976 Efuse_PowerSwitch(Adapter, false, true);
977 if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, false))
978 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
979 else
980 status = NDIS_STATUS_FAILURE;
981 Efuse_PowerSwitch(Adapter, false, false);
982 } else {
983 Efuse_PowerSwitch(Adapter, true, true);
984 if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, false))
985 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
986 else
987 status = NDIS_STATUS_FAILURE;
988 Efuse_PowerSwitch(Adapter, true, false);
989 }
990
991 _irqlevel_changed_(&oldirql, RAISE);
992
993 return status;
994}
995
996int rtl8188eu_oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv)
997{
998 u16 size;
999 u8 ret;
1000 int status = NDIS_STATUS_SUCCESS;
1001 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
1002
1003 if (poid_par_priv->type_of_oid != QUERY_OID)
1004 return NDIS_STATUS_NOT_ACCEPTED;
1005
1006 if (poid_par_priv->information_buf_len < sizeof(u32))
1007 return NDIS_STATUS_INVALID_LENGTH;
1008
1009 _irqlevel_changed_(&oldirql, LOWER);
1010 ret = efuse_GetCurrentSize(Adapter, &size);
1011 _irqlevel_changed_(&oldirql, RAISE);
1012 if (ret == _SUCCESS) {
1013 *(u32 *)poid_par_priv->information_buf = size;
1014 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1015 } else {
1016 status = NDIS_STATUS_FAILURE;
1017 }
1018
1019 return status;
1020}
1021
1022int rtl8188eu_oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv)
1023{
1024 int status = NDIS_STATUS_SUCCESS;
1025 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
1026
1027 if (poid_par_priv->type_of_oid != QUERY_OID)
1028 return NDIS_STATUS_NOT_ACCEPTED;
1029
1030 if (poid_par_priv->information_buf_len < sizeof(u32))
1031 return NDIS_STATUS_INVALID_LENGTH;
1032
1033 *(u32 *)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter);
1034 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1035
1036 return status;
1037}
1038
1039int rtl8188eu_oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv)
1040{
1041 int status;
1042
1043 if (poid_par_priv->type_of_oid == QUERY_OID)
1044 status = rtl8188eu_oid_rt_pro_read_efuse_hdl(poid_par_priv);
1045 else
1046 status = rtl8188eu_oid_rt_pro_write_efuse_hdl(poid_par_priv);
1047
1048 return status;
1049}
1050
1051int rtl8188eu_oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv)
1052{
1053 u8 *data;
1054 int status = NDIS_STATUS_SUCCESS;
1055 struct adapter *Adapter = (struct adapter *)(poid_par_priv->adapter_context);
1056 u16 maplen = 0;
1057
1058 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&maplen, false);
1059
1060 *poid_par_priv->bytes_rw = 0;
1061
1062 if (poid_par_priv->information_buf_len < maplen)
1063 return NDIS_STATUS_INVALID_LENGTH;
1064
1065 data = (u8 *)poid_par_priv->information_buf;
1066
1067 _irqlevel_changed_(&oldirql, LOWER);
1068
1069 if (poid_par_priv->type_of_oid == QUERY_OID) {
1070 if (rtw_efuse_map_read(Adapter, 0, maplen, data) == _SUCCESS)
1071 *poid_par_priv->bytes_rw = maplen;
1072 else
1073 status = NDIS_STATUS_FAILURE;
1074 } else {
1075
1076 if (rtw_efuse_map_write(Adapter, 0, maplen, data) == _SUCCESS)
1077 *poid_par_priv->bytes_rw = maplen;
1078 else
1079 status = NDIS_STATUS_FAILURE;
1080 }
1081
1082 _irqlevel_changed_(&oldirql, RAISE);
1083
1084 return status;
1085}
1086
1087int rtl8188eu_oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv)
1088{
1089 int status = NDIS_STATUS_SUCCESS;
1090 return status;
1091}
1092
1093int rtl8188eu_oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)
1094{
1095 int status = NDIS_STATUS_SUCCESS;
1096
1097 if (poid_par_priv->type_of_oid != SET_OID)
1098 return NDIS_STATUS_NOT_ACCEPTED;
1099
1100 if (poid_par_priv->information_buf_len < sizeof(u8))
1101 return NDIS_STATUS_INVALID_LENGTH;
1102
1103 return status;
1104}
1105
1106int rtl8188eu_oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv)
1107{
1108 return 0;
1109}
1110
1111int rtl8188eu_oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv)
1112{
1113 return 0;
1114}
1115
1116int rtl8188eu_mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
1117{
1118 struct mp_xmit_parm *pparm;
1119 struct adapter *padapter;
1120 struct mp_priv *pmp_priv;
1121 struct pkt_attrib *pattrib;
1122
1123 pparm = (struct mp_xmit_parm *)poid_par_priv->information_buf;
1124 padapter = (struct adapter *)poid_par_priv->adapter_context;
1125 pmp_priv = &padapter->mppriv;
1126
1127 if (poid_par_priv->type_of_oid == QUERY_OID) {
1128 pparm->enable = !pmp_priv->tx.stop;
1129 pparm->count = pmp_priv->tx.sended;
1130 } else {
1131 if (pparm->enable == 0) {
1132 pmp_priv->tx.stop = 1;
1133 } else if (pmp_priv->tx.stop == 1) {
1134 pmp_priv->tx.stop = 0;
1135 pmp_priv->tx.count = pparm->count;
1136 pmp_priv->tx.payload = pparm->payload_type;
1137 pattrib = &pmp_priv->tx.attrib;
1138 pattrib->pktlen = pparm->length;
1139 memcpy(pattrib->dst, pparm->da, ETH_ALEN);
1140 SetPacketTx(padapter);
1141 } else {
1142 return NDIS_STATUS_FAILURE;
1143 }
1144 }
1145
1146 return NDIS_STATUS_SUCCESS;
1147}
1148
1149
1150int rtl8188eu_oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv)
1151{
1152 int status = NDIS_STATUS_SUCCESS;
1153
1154 if (poid_par_priv->type_of_oid != SET_OID) {
1155 status = NDIS_STATUS_NOT_ACCEPTED;
1156 return status;
1157 }
1158
1159 _irqlevel_changed_(&oldirql, LOWER);
1160
1161
1162 _irqlevel_changed_(&oldirql, RAISE);
1163
1164 return status;
1165}
1166
1167int rtl8188eu_oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv)
1168{
1169 return 0;
1170}
1171