1 /******************************************************************************
3 * Copyright(c) 2007 - 2017 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 *****************************************************************************/
15 #define _RTW_MP_IOCTL_C_
17 #include <drv_types.h>
18 #include <rtw_mp_ioctl.h>
19 #include "../hal/phydm/phydm_precomp.h"
21 /* **************** oid_rtl_seg_81_85 section start **************** */
22 NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
24 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
25 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
28 if (poid_par_priv->information_buf_len < sizeof(u8))
29 return NDIS_STATUS_INVALID_LENGTH;
31 if (poid_par_priv->type_of_oid == SET_OID)
32 Adapter->registrypriv.wireless_mode = *(u8 *)poid_par_priv->information_buf;
33 else if (poid_par_priv->type_of_oid == QUERY_OID) {
34 *(u8 *)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode;
35 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
37 status = NDIS_STATUS_NOT_ACCEPTED;
42 /* **************** oid_rtl_seg_81_87_80 section start **************** */
43 NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
48 struct bb_reg_param *pbbreg;
51 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
52 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
56 if (poid_par_priv->type_of_oid != SET_OID)
57 return NDIS_STATUS_NOT_ACCEPTED;
59 if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
60 return NDIS_STATUS_INVALID_LENGTH;
62 pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
64 offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */
65 if (offset < BB_REG_BASE_ADDR)
66 offset |= BB_REG_BASE_ADDR;
68 value = pbbreg->value;
71 _irqlevel_changed_(&oldirql, LOWER);
72 write_bbreg(Adapter, offset, 0xFFFFFFFF, value);
73 _irqlevel_changed_(&oldirql, RAISE);
78 /* ------------------------------------------------------------------------------ */
79 NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv)
84 struct bb_reg_param *pbbreg;
87 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
88 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
92 if (poid_par_priv->type_of_oid != QUERY_OID)
93 return NDIS_STATUS_NOT_ACCEPTED;
95 if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))
96 return NDIS_STATUS_INVALID_LENGTH;
98 pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);
100 offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */
101 if (offset < BB_REG_BASE_ADDR)
102 offset |= BB_REG_BASE_ADDR;
104 _irqlevel_changed_(&oldirql, LOWER);
105 value = read_bbreg(Adapter, offset, 0xFFFFFFFF);
106 _irqlevel_changed_(&oldirql, RAISE);
108 pbbreg->value = value;
109 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
114 /* ------------------------------------------------------------------------------ */
115 NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
117 #ifdef PLATFORM_OS_XP
120 struct rf_reg_param *pbbreg;
124 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
125 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
129 if (poid_par_priv->type_of_oid != SET_OID)
130 return NDIS_STATUS_NOT_ACCEPTED;
132 if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
133 return NDIS_STATUS_INVALID_LENGTH;
135 pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
137 if (pbbreg->path >= MAX_RF_PATH_NUMS)
138 return NDIS_STATUS_NOT_ACCEPTED;
139 if (pbbreg->offset > 0xFF)
140 return NDIS_STATUS_NOT_ACCEPTED;
141 if (pbbreg->value > 0xFFFFF)
142 return NDIS_STATUS_NOT_ACCEPTED;
144 path = (u8)pbbreg->path;
145 offset = (u8)pbbreg->offset;
146 value = pbbreg->value;
149 _irqlevel_changed_(&oldirql, LOWER);
150 write_rfreg(Adapter, path, offset, value);
151 _irqlevel_changed_(&oldirql, RAISE);
156 /* ------------------------------------------------------------------------------ */
157 NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv)
159 #ifdef PLATFORM_OS_XP
162 struct rf_reg_param *pbbreg;
166 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
167 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
171 if (poid_par_priv->type_of_oid != QUERY_OID)
172 return NDIS_STATUS_NOT_ACCEPTED;
174 if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))
175 return NDIS_STATUS_INVALID_LENGTH;
177 pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);
179 if (pbbreg->path >= MAX_RF_PATH_NUMS)
180 return NDIS_STATUS_NOT_ACCEPTED;
181 if (pbbreg->offset > 0xFF)
182 return NDIS_STATUS_NOT_ACCEPTED;
184 path = (u8)pbbreg->path;
185 offset = (u8)pbbreg->offset;
187 _irqlevel_changed_(&oldirql, LOWER);
188 value = read_rfreg(Adapter, path, offset);
189 _irqlevel_changed_(&oldirql, RAISE);
191 pbbreg->value = value;
193 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
199 /* **************** oid_rtl_seg_81_87_00 section end****************
200 * ------------------------------------------------------------------------------ */
202 /* **************** oid_rtl_seg_81_80_00 section start ****************
203 * ------------------------------------------------------------------------------ */
204 NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv)
206 #ifdef PLATFORM_OS_XP
209 u32 ratevalue;/* 4 */
210 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
211 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
215 if (poid_par_priv->type_of_oid != SET_OID)
216 return NDIS_STATUS_NOT_ACCEPTED;
218 if (poid_par_priv->information_buf_len != sizeof(u32))
219 return NDIS_STATUS_INVALID_LENGTH;
221 ratevalue = *((u32 *)poid_par_priv->information_buf); /* 4 */
222 if (ratevalue >= MPT_RATE_LAST)
223 return NDIS_STATUS_INVALID_DATA;
225 Adapter->mppriv.rateidx = ratevalue;
227 _irqlevel_changed_(&oldirql, LOWER);
228 SetDataRate(Adapter);
229 _irqlevel_changed_(&oldirql, RAISE);
234 /* ------------------------------------------------------------------------------ */
235 NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv)
237 #ifdef PLATFORM_OS_XP
241 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
242 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
246 if (Adapter->registrypriv.mp_mode == 0)
247 return NDIS_STATUS_NOT_ACCEPTED;
249 if (poid_par_priv->type_of_oid != SET_OID)
250 return NDIS_STATUS_NOT_ACCEPTED;
252 _irqlevel_changed_(&oldirql, LOWER);
254 /* IQCalibrateBcut(Adapter); */
256 mode = *((u32 *)poid_par_priv->information_buf);
257 Adapter->mppriv.mode = mode;/* 1 for loopback */
259 if (mp_start_test(Adapter) == _FAIL) {
260 status = NDIS_STATUS_NOT_ACCEPTED;
265 _irqlevel_changed_(&oldirql, RAISE);
271 /* ------------------------------------------------------------------------------ */
272 NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv)
274 #ifdef PLATFORM_OS_XP
277 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
278 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
282 if (poid_par_priv->type_of_oid != SET_OID)
283 return NDIS_STATUS_NOT_ACCEPTED;
285 _irqlevel_changed_(&oldirql, LOWER);
286 mp_stop_test(Adapter);
287 _irqlevel_changed_(&oldirql, RAISE);
293 /* ------------------------------------------------------------------------------ */
294 NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv)
296 #ifdef PLATFORM_OS_XP
300 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
301 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
305 if (poid_par_priv->information_buf_len != sizeof(u32))
306 return NDIS_STATUS_INVALID_LENGTH;
308 if (poid_par_priv->type_of_oid == QUERY_OID) {
309 *((u32 *)poid_par_priv->information_buf) = Adapter->mppriv.channel;
310 return NDIS_STATUS_SUCCESS;
313 if (poid_par_priv->type_of_oid != SET_OID)
314 return NDIS_STATUS_NOT_ACCEPTED;
316 Channel = *((u32 *)poid_par_priv->information_buf);
318 return NDIS_STATUS_NOT_ACCEPTED;
319 Adapter->mppriv.channel = Channel;
321 _irqlevel_changed_(&oldirql, LOWER);
323 _irqlevel_changed_(&oldirql, RAISE);
328 /* ------------------------------------------------------------------------------ */
329 NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv)
331 #ifdef PLATFORM_OS_XP
336 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
337 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
341 if (poid_par_priv->type_of_oid != SET_OID)
342 return NDIS_STATUS_NOT_ACCEPTED;
344 if (poid_par_priv->information_buf_len < sizeof(u32))
345 return NDIS_STATUS_INVALID_LENGTH;
347 bandwidth = *((u32 *)poid_par_priv->information_buf); /* 4 */
348 channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
350 if (bandwidth != CHANNEL_WIDTH_40)
351 bandwidth = CHANNEL_WIDTH_20;
352 padapter->mppriv.bandwidth = (u8)bandwidth;
353 padapter->mppriv.prime_channel_offset = (u8)channel_offset;
355 _irqlevel_changed_(&oldirql, LOWER);
356 SetBandwidth(padapter);
357 _irqlevel_changed_(&oldirql, RAISE);
363 /* ------------------------------------------------------------------------------ */
364 NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv)
366 #ifdef PLATFORM_OS_XP
370 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
371 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
375 if (poid_par_priv->information_buf_len != sizeof(u32))
376 return NDIS_STATUS_INVALID_LENGTH;
378 if (poid_par_priv->type_of_oid == SET_OID) {
379 antenna = *(u32 *)poid_par_priv->information_buf;
381 Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16);
382 Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF);
384 _irqlevel_changed_(&oldirql, LOWER);
386 _irqlevel_changed_(&oldirql, RAISE);
388 antenna = (Adapter->mppriv.antenna_tx << 16) | Adapter->mppriv.antenna_rx;
389 *(u32 *)poid_par_priv->information_buf = antenna;
396 NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv)
398 #ifdef PLATFORM_OS_XP
402 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
403 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
407 if (poid_par_priv->type_of_oid != SET_OID)
408 return NDIS_STATUS_NOT_ACCEPTED;
410 if (poid_par_priv->information_buf_len != sizeof(u32))
411 return NDIS_STATUS_INVALID_LENGTH;
413 tx_pwr_idx = *((u32 *)poid_par_priv->information_buf);
414 if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE)
415 return NDIS_STATUS_NOT_ACCEPTED;
417 Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx;
420 _irqlevel_changed_(&oldirql, LOWER);
422 _irqlevel_changed_(&oldirql, RAISE);
428 /* ------------------------------------------------------------------------------
429 * **************** oid_rtl_seg_81_80_20 section start ****************
430 * ------------------------------------------------------------------------------ */
431 NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)
433 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
434 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
437 if (poid_par_priv->type_of_oid != QUERY_OID) {
438 status = NDIS_STATUS_NOT_ACCEPTED;
442 if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
443 *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount;
444 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
446 status = NDIS_STATUS_INVALID_LENGTH;
451 /* ------------------------------------------------------------------------------ */
452 NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
454 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
455 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
458 if (poid_par_priv->type_of_oid != QUERY_OID) {
459 status = NDIS_STATUS_NOT_ACCEPTED;
462 if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
463 *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount;
464 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
466 status = NDIS_STATUS_INVALID_LENGTH;
471 /* ------------------------------------------------------------------------------ */
472 NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)
474 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
475 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
478 if (poid_par_priv->type_of_oid != QUERY_OID) {
479 status = NDIS_STATUS_NOT_ACCEPTED;
482 if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
483 *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount;
484 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
486 status = NDIS_STATUS_INVALID_LENGTH;
491 /* ------------------------------------------------------------------------------ */
493 NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)
495 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
496 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
499 if (poid_par_priv->type_of_oid != SET_OID) {
500 status = NDIS_STATUS_NOT_ACCEPTED;
504 Adapter->mppriv.tx_pktcount = 0;
509 /* ------------------------------------------------------------------------------ */
510 NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
512 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
513 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
516 if (poid_par_priv->type_of_oid != SET_OID) {
517 status = NDIS_STATUS_NOT_ACCEPTED;
521 if (poid_par_priv->information_buf_len == sizeof(ULONG)) {
522 Adapter->mppriv.rx_pktcount = 0;
523 Adapter->mppriv.rx_crcerrpktcount = 0;
525 status = NDIS_STATUS_INVALID_LENGTH;
530 /* ------------------------------------------------------------------------------ */
531 NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv)
533 #ifdef PLATFORM_OS_XP
536 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
537 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
540 if (poid_par_priv->type_of_oid != SET_OID) {
541 status = NDIS_STATUS_NOT_ACCEPTED;
545 _irqlevel_changed_(&oldirql, LOWER);
546 ResetPhyRxPktCount(Adapter);
547 _irqlevel_changed_(&oldirql, RAISE);
552 /* ------------------------------------------------------------------------------ */
553 NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)
555 #ifdef PLATFORM_OS_XP
558 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
559 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
563 if (poid_par_priv->type_of_oid != QUERY_OID)
564 return NDIS_STATUS_NOT_ACCEPTED;
566 if (poid_par_priv->information_buf_len != sizeof(ULONG))
567 return NDIS_STATUS_INVALID_LENGTH;
569 _irqlevel_changed_(&oldirql, LOWER);
570 *(ULONG *)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter);
571 _irqlevel_changed_(&oldirql, RAISE);
573 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
579 /* ------------------------------------------------------------------------------ */
580 NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)
582 #ifdef PLATFORM_OS_XP
585 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
586 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
590 if (poid_par_priv->type_of_oid != QUERY_OID)
591 return NDIS_STATUS_NOT_ACCEPTED;
594 if (poid_par_priv->information_buf_len != sizeof(ULONG))
595 return NDIS_STATUS_INVALID_LENGTH;
597 _irqlevel_changed_(&oldirql, LOWER);
598 *(ULONG *)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter);
599 _irqlevel_changed_(&oldirql, RAISE);
601 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
607 /* **************** oid_rtl_seg_81_80_20 section end **************** */
608 NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv)
610 #ifdef PLATFORM_OS_XP
614 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
615 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
619 if (poid_par_priv->type_of_oid != SET_OID)
620 return NDIS_STATUS_NOT_ACCEPTED;
622 bStartTest = *((u32 *)poid_par_priv->information_buf);
624 _irqlevel_changed_(&oldirql, LOWER);
625 SetContinuousTx(Adapter, (u8)bStartTest);
627 struct mp_priv *pmp_priv = &Adapter->mppriv;
628 if (pmp_priv->tx.stop == 0) {
629 pmp_priv->tx.stop = 1;
630 RTW_INFO("%s: pkt tx is running...\n", __func__);
633 pmp_priv->tx.stop = 0;
634 pmp_priv->tx.count = 1;
635 SetPacketTx(Adapter);
637 _irqlevel_changed_(&oldirql, RAISE);
643 NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv)
645 #ifdef PLATFORM_OS_XP
649 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
650 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
654 if (poid_par_priv->type_of_oid != SET_OID)
655 return NDIS_STATUS_NOT_ACCEPTED;
657 bStartTest = *((u32 *)poid_par_priv->information_buf);
659 _irqlevel_changed_(&oldirql, LOWER);
660 SetSingleCarrierTx(Adapter, (u8)bStartTest);
662 struct mp_priv *pmp_priv = &Adapter->mppriv;
663 if (pmp_priv->tx.stop == 0) {
664 pmp_priv->tx.stop = 1;
665 RTW_INFO("%s: pkt tx is running...\n", __func__);
668 pmp_priv->tx.stop = 0;
669 pmp_priv->tx.count = 1;
670 SetPacketTx(Adapter);
672 _irqlevel_changed_(&oldirql, RAISE);
678 NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv)
680 #ifdef PLATFORM_OS_XP
684 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
685 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
689 if (poid_par_priv->type_of_oid != SET_OID)
690 return NDIS_STATUS_NOT_ACCEPTED;
692 bStartTest = *((u32 *)poid_par_priv->information_buf);
694 _irqlevel_changed_(&oldirql, LOWER);
695 SetCarrierSuppressionTx(Adapter, (u8)bStartTest);
697 struct mp_priv *pmp_priv = &Adapter->mppriv;
698 if (pmp_priv->tx.stop == 0) {
699 pmp_priv->tx.stop = 1;
700 RTW_INFO("%s: pkt tx is running...\n", __func__);
703 pmp_priv->tx.stop = 0;
704 pmp_priv->tx.count = 1;
705 SetPacketTx(Adapter);
707 _irqlevel_changed_(&oldirql, RAISE);
713 NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv)
715 #ifdef PLATFORM_OS_XP
719 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
720 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
724 if (poid_par_priv->type_of_oid != SET_OID)
725 return NDIS_STATUS_NOT_ACCEPTED;
727 bStartTest = *((u32 *)poid_par_priv->information_buf);
729 _irqlevel_changed_(&oldirql, LOWER);
730 SetSingleToneTx(Adapter, (u8)bStartTest);
731 _irqlevel_changed_(&oldirql, RAISE);
737 NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv)
742 NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv)
744 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
746 #ifdef PLATFORM_OS_XP
749 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
751 if (poid_par_priv->type_of_oid != SET_OID)
752 return NDIS_STATUS_NOT_ACCEPTED;
754 _irqlevel_changed_(&oldirql, LOWER);
755 rtw_hal_set_hwreg(Adapter, HW_VAR_TRIGGER_GPIO_0, 0);
756 _irqlevel_changed_(&oldirql, RAISE);
761 /* **************** oid_rtl_seg_81_80_00 section end ****************
762 * ------------------------------------------------------------------------------ */
763 NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv)
766 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
768 #ifdef PLATFORM_OS_XP
771 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
773 PNDIS_802_11_SSID pssid;
776 if (poid_par_priv->type_of_oid != SET_OID)
777 return NDIS_STATUS_NOT_ACCEPTED;
779 *poid_par_priv->bytes_needed = (u32)sizeof(NDIS_802_11_SSID);
780 *poid_par_priv->bytes_rw = 0;
781 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
782 return NDIS_STATUS_INVALID_LENGTH;
784 pssid = (PNDIS_802_11_SSID)poid_par_priv->information_buf;
786 _irqlevel_changed_(&oldirql, LOWER);
788 if (mp_start_joinbss(Adapter, pssid) == _FAIL)
789 status = NDIS_STATUS_NOT_ACCEPTED;
791 _irqlevel_changed_(&oldirql, RAISE);
793 *poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID);
801 /* ------------------------------------------------------------------------------ */
802 NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv)
804 #ifdef PLATFORM_OS_XP
809 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
810 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
814 if (poid_par_priv->type_of_oid != QUERY_OID)
815 return NDIS_STATUS_NOT_ACCEPTED;
817 RegRWStruct = (pRW_Reg)poid_par_priv->information_buf;
818 offset = RegRWStruct->offset;
819 width = RegRWStruct->width;
822 return NDIS_STATUS_NOT_ACCEPTED;
824 _irqlevel_changed_(&oldirql, LOWER);
828 RegRWStruct->value = rtw_read8(Adapter, offset);
831 RegRWStruct->value = rtw_read16(Adapter, offset);
835 RegRWStruct->value = rtw_read32(Adapter, offset);
839 _irqlevel_changed_(&oldirql, RAISE);
841 *poid_par_priv->bytes_rw = width;
846 /* ------------------------------------------------------------------------------ */
847 NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv)
849 #ifdef PLATFORM_OS_XP
853 u32 offset, width, value;
854 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
855 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
859 if (poid_par_priv->type_of_oid != SET_OID)
860 return NDIS_STATUS_NOT_ACCEPTED;
862 RegRWStruct = (pRW_Reg)poid_par_priv->information_buf;
863 offset = RegRWStruct->offset;
864 width = RegRWStruct->width;
865 value = RegRWStruct->value;
868 return NDIS_STATUS_NOT_ACCEPTED;
870 _irqlevel_changed_(&oldirql, LOWER);
872 switch (RegRWStruct->width) {
875 status = NDIS_STATUS_NOT_ACCEPTED;
878 rtw_write8(padapter, offset, (u8)value);
881 if (value > 0xFFFF) {
882 status = NDIS_STATUS_NOT_ACCEPTED;
885 rtw_write16(padapter, offset, (u16)value);
888 rtw_write32(padapter, offset, value);
891 status = NDIS_STATUS_NOT_ACCEPTED;
895 _irqlevel_changed_(&oldirql, RAISE);
901 /* ------------------------------------------------------------------------------ */
902 NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv)
905 #ifdef PLATFORM_OS_XP
908 pBurst_RW_Reg pBstRwReg;
909 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
910 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
914 if (poid_par_priv->type_of_oid != QUERY_OID)
915 return NDIS_STATUS_NOT_ACCEPTED;
917 pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf;
919 _irqlevel_changed_(&oldirql, LOWER);
920 rtw_read_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data);
921 _irqlevel_changed_(&oldirql, RAISE);
923 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
932 /* ------------------------------------------------------------------------------ */
933 NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv)
936 #ifdef PLATFORM_OS_XP
939 pBurst_RW_Reg pBstRwReg;
940 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
941 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
945 if (poid_par_priv->type_of_oid != SET_OID)
946 return NDIS_STATUS_NOT_ACCEPTED;
948 pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf;
950 _irqlevel_changed_(&oldirql, LOWER);
951 rtw_write_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data);
952 _irqlevel_changed_(&oldirql, RAISE);
961 /* ------------------------------------------------------------------------------ */
962 NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv)
965 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
967 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
969 #ifdef PLATFORM_OS_XP
973 TX_CMD_Desc *TxCmd_Info;
976 if (poid_par_priv->type_of_oid != SET_OID)
977 return NDIS_STATUS_NOT_ACCEPTED;
980 TxCmd_Info = (TX_CMD_Desc *)poid_par_priv->information_buf;
983 _irqlevel_changed_(&oldirql, LOWER);
985 rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]);
986 rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]);
988 _irqlevel_changed_(&oldirql, RAISE);
998 /* ------------------------------------------------------------------------------ */
999 NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv)
1002 #ifdef PLATFORM_OS_XP
1005 pEEPROM_RWParam pEEPROM;
1006 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1007 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
1011 if (poid_par_priv->type_of_oid != QUERY_OID)
1012 return NDIS_STATUS_NOT_ACCEPTED;
1014 pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf;
1016 _irqlevel_changed_(&oldirql, LOWER);
1017 pEEPROM->value = eeprom_read16(padapter, (u16)(pEEPROM->offset >> 1));
1018 _irqlevel_changed_(&oldirql, RAISE);
1020 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1030 /* ------------------------------------------------------------------------------ */
1031 NDIS_STATUS oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv)
1034 #ifdef PLATFORM_OS_XP
1037 pEEPROM_RWParam pEEPROM;
1038 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1039 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
1043 if (poid_par_priv->type_of_oid != SET_OID)
1044 return NDIS_STATUS_NOT_ACCEPTED;
1046 pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf;
1048 _irqlevel_changed_(&oldirql, LOWER);
1049 eeprom_write16(padapter, (u16)(pEEPROM->offset >> 1), pEEPROM->value);
1050 _irqlevel_changed_(&oldirql, RAISE);
1052 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1060 /* ------------------------------------------------------------------------------ */
1061 NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv)
1064 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1066 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1068 struct mp_wiparam *pwi_param;
1071 if (poid_par_priv->type_of_oid != QUERY_OID)
1072 return NDIS_STATUS_NOT_ACCEPTED;
1074 if (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam))
1075 return NDIS_STATUS_INVALID_LENGTH;
1077 if (Adapter->mppriv.workparam.bcompleted == _FALSE)
1078 return NDIS_STATUS_NOT_ACCEPTED;
1080 pwi_param = (struct mp_wiparam *)poid_par_priv->information_buf;
1082 _rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam));
1083 Adapter->mppriv.act_in_progress = _FALSE;
1084 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1092 /* ------------------------------------------------------------------------------ */
1093 NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv)
1096 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1098 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1102 if (poid_par_priv->type_of_oid != QUERY_OID)
1103 return NDIS_STATUS_NOT_ACCEPTED;
1105 if (poid_par_priv->information_buf_len < sizeof(uint) * 2) {
1106 return NDIS_STATUS_INVALID_LENGTH;
1109 if (*(uint *)poid_par_priv->information_buf == 1) /* init==1 */
1110 Adapter->mppriv.rx_pktloss = 0;
1112 *((uint *)poid_par_priv->information_buf + 1) = Adapter->mppriv.rx_pktloss;
1113 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1121 /* ------------------------------------------------------------------------------ */
1122 NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)
1125 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1126 struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue;
1127 struct intf_hdl *pintfhdl = &pio_queue->intf;
1129 #ifdef PLATFORM_OS_XP
1132 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1134 #ifdef CONFIG_SDIO_HCI
1135 void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
1140 if (poid_par_priv->type_of_oid != QUERY_OID)
1141 return NDIS_STATUS_NOT_ACCEPTED;
1143 #ifdef CONFIG_SDIO_HCI
1144 _irqlevel_changed_(&oldirql, LOWER);
1146 u32 *plmem = (u32 *)poid_par_priv->information_buf + 2;
1147 _attrib_read = pintfhdl->io_ops._attrib_read;
1148 _attrib_read(pintfhdl, *((u32 *)poid_par_priv->information_buf),
1149 *((u32 *)poid_par_priv->information_buf + 1), (u8 *)plmem);
1150 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1152 _irqlevel_changed_(&oldirql, RAISE);
1161 /* ------------------------------------------------------------------------------ */
1162 NDIS_STATUS oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)
1165 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1166 struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue;
1167 struct intf_hdl *pintfhdl = &pio_queue->intf;
1169 #ifdef PLATFORM_OS_XP
1172 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1174 #ifdef CONFIG_SDIO_HCI
1175 void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
1179 if (poid_par_priv->type_of_oid != SET_OID)
1180 return NDIS_STATUS_NOT_ACCEPTED;
1182 #ifdef CONFIG_SDIO_HCI
1183 _irqlevel_changed_(&oldirql, LOWER);
1185 u32 *plmem = (u32 *)poid_par_priv->information_buf + 2;
1186 _attrib_write = pintfhdl->io_ops._attrib_write;
1187 _attrib_write(pintfhdl, *(u32 *)poid_par_priv->information_buf,
1188 *((u32 *)poid_par_priv->information_buf + 1), (u8 *)plmem);
1190 _irqlevel_changed_(&oldirql, RAISE);
1199 /* ------------------------------------------------------------------------------ */
1200 NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv)
1203 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1205 #ifdef PLATFORM_OS_XP
1208 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1212 if (poid_par_priv->type_of_oid != SET_OID)
1213 return NDIS_STATUS_NOT_ACCEPTED;
1215 _irqlevel_changed_(&oldirql, LOWER);
1217 if (rtw_setrfintfs_cmd(Adapter, *(unsigned char *)poid_par_priv->information_buf) == _FAIL)
1218 status = NDIS_STATUS_NOT_ACCEPTED;
1220 _irqlevel_changed_(&oldirql, RAISE);
1228 /* ------------------------------------------------------------------------------ */
1229 NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv)
1232 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1234 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1237 if (poid_par_priv->type_of_oid != QUERY_OID)
1238 return NDIS_STATUS_NOT_ACCEPTED;
1240 _rtw_memcpy(poid_par_priv->information_buf, (unsigned char *)&Adapter->mppriv.rxstat, sizeof(struct recv_stat));
1241 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1249 /* ------------------------------------------------------------------------------ */
1250 NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv)
1253 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1255 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1257 PCFG_DBG_MSG_STRUCT pdbg_msg;
1261 #if 0/*#ifdef CONFIG_DEBUG_RTL871X*/
1263 pdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf);
1265 if (poid_par_priv->type_of_oid == SET_OID) {
1267 GlobalDebugLevel = pdbg_msg->DebugLevel;
1268 GlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32;
1270 pdbg_msg->DebugLevel = GlobalDebugLevel;
1271 pdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32);
1272 pdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents;
1273 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1285 /* ------------------------------------------------------------------------------ */
1286 NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv)
1288 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1290 #ifdef PLATFORM_OS_XP
1293 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1297 if (poid_par_priv->type_of_oid != SET_OID)
1298 return NDIS_STATUS_NOT_ACCEPTED;
1300 _irqlevel_changed_(&oldirql, LOWER);
1302 if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) != _SUCCESS)
1303 status = NDIS_STATUS_NOT_ACCEPTED;
1305 _irqlevel_changed_(&oldirql, RAISE);
1310 /* ----------------------------------------------------------------------------- */
1311 NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv)
1313 #ifdef PLATFORM_OS_XP
1316 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1318 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1322 if (poid_par_priv->type_of_oid != QUERY_OID)
1323 return NDIS_STATUS_NOT_ACCEPTED;
1325 if (poid_par_priv->information_buf_len < sizeof(u32))
1326 return NDIS_STATUS_INVALID_LENGTH;
1328 _irqlevel_changed_(&oldirql, LOWER);
1329 GetThermalMeter(Adapter, &thermal);
1330 _irqlevel_changed_(&oldirql, RAISE);
1332 *(u32 *)poid_par_priv->information_buf = (u32)thermal;
1333 *poid_par_priv->bytes_rw = sizeof(u32);
1338 /* ----------------------------------------------------------------------------- */
1339 NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv)
1342 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1344 #ifdef PLATFORM_OS_XP
1347 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1351 if (poid_par_priv->type_of_oid != SET_OID)
1352 return NDIS_STATUS_NOT_ACCEPTED;
1354 if (Adapter->mppriv.act_in_progress == _TRUE)
1355 return NDIS_STATUS_NOT_ACCEPTED;
1357 if (poid_par_priv->information_buf_len < sizeof(u8))
1358 return NDIS_STATUS_INVALID_LENGTH;
1360 /* init workparam */
1361 Adapter->mppriv.act_in_progress = _TRUE;
1362 Adapter->mppriv.workparam.bcompleted = _FALSE;
1363 Adapter->mppriv.workparam.act_type = MPT_READ_TSSI;
1364 Adapter->mppriv.workparam.io_offset = 0;
1365 Adapter->mppriv.workparam.io_value = 0xFFFFFFFF;
1367 _irqlevel_changed_(&oldirql, LOWER);
1369 if (!rtw_gettssi_cmd(Adapter, 0, (u8 *)&Adapter->mppriv.workparam.io_value))
1370 status = NDIS_STATUS_NOT_ACCEPTED;
1372 _irqlevel_changed_(&oldirql, RAISE);
1380 /* ------------------------------------------------------------------------------ */
1381 NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv)
1383 #ifdef PLATFORM_OS_XP
1386 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1387 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1391 /* if (poid_par_priv->type_of_oid != SET_OID)
1392 * return NDIS_STATUS_NOT_ACCEPTED; */
1394 if (poid_par_priv->information_buf_len < sizeof(u8))
1395 return NDIS_STATUS_INVALID_LENGTH;
1397 _irqlevel_changed_(&oldirql, LOWER);
1398 if (poid_par_priv->type_of_oid == SET_OID) {
1401 enable = *(u8 *)poid_par_priv->information_buf;
1403 SetPowerTracking(Adapter, enable);
1405 GetPowerTracking(Adapter, (u8 *)poid_par_priv->information_buf);
1406 _irqlevel_changed_(&oldirql, RAISE);
1411 /* ----------------------------------------------------------------------------- */
1412 NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv)
1415 #ifdef PLATFORM_OS_XP
1419 u8 datarates[NumRates];
1421 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1422 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
1426 if (poid_par_priv->type_of_oid != SET_OID)
1427 return NDIS_STATUS_NOT_ACCEPTED;
1429 ratevalue = *((u32 *)poid_par_priv->information_buf);
1431 for (i = 0; i < NumRates; i++) {
1432 if (ratevalue == mpdatarate[i])
1433 datarates[i] = mpdatarate[i];
1435 datarates[i] = 0xff;
1438 _irqlevel_changed_(&oldirql, LOWER);
1440 if (rtw_setbasicrate_cmd(padapter, datarates) != _SUCCESS)
1441 status = NDIS_STATUS_NOT_ACCEPTED;
1443 _irqlevel_changed_(&oldirql, RAISE);
1452 /* ------------------------------------------------------------------------------ */
1453 NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
1456 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1458 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1461 if (poid_par_priv->type_of_oid != QUERY_OID)
1462 return NDIS_STATUS_NOT_ACCEPTED;
1464 if (poid_par_priv->information_buf_len < 8)
1465 return NDIS_STATUS_INVALID_LENGTH;
1467 *poid_par_priv->bytes_rw = 8;
1468 _rtw_memcpy(poid_par_priv->information_buf, &(adapter_to_pwrctl(Adapter)->pwr_mode), 8);
1469 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1478 /* ------------------------------------------------------------------------------ */
1479 NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv)
1482 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1484 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1486 uint pwr_mode, smart_ps;
1490 if (poid_par_priv->type_of_oid != SET_OID)
1491 return NDIS_STATUS_NOT_ACCEPTED;
1493 *poid_par_priv->bytes_rw = 0;
1494 *poid_par_priv->bytes_needed = 8;
1496 if (poid_par_priv->information_buf_len < 8)
1497 return NDIS_STATUS_INVALID_LENGTH;
1499 pwr_mode = *(uint *)(poid_par_priv->information_buf);
1500 smart_ps = *(uint *)((int)poid_par_priv->information_buf + 4);
1502 *poid_par_priv->bytes_rw = 8;
1510 /* ------------------------------------------------------------------------------ */
1511 NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv)
1514 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1516 #ifdef PLATFORM_OS_XP
1519 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1521 struct setratable_parm *prate_table;
1525 if (poid_par_priv->type_of_oid != SET_OID)
1526 return NDIS_STATUS_NOT_ACCEPTED;
1528 *poid_par_priv->bytes_needed = sizeof(struct setratable_parm);
1529 if (poid_par_priv->information_buf_len < sizeof(struct setratable_parm))
1530 return NDIS_STATUS_INVALID_LENGTH;
1532 prate_table = (struct setratable_parm *)poid_par_priv->information_buf;
1534 _irqlevel_changed_(&oldirql, LOWER);
1535 res = rtw_setrttbl_cmd(Adapter, prate_table);
1536 _irqlevel_changed_(&oldirql, RAISE);
1539 status = NDIS_STATUS_FAILURE;
1547 /* ------------------------------------------------------------------------------ */
1548 NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv)
1551 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1553 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1556 if (poid_par_priv->type_of_oid != QUERY_OID)
1557 return NDIS_STATUS_NOT_ACCEPTED;
1560 struct mp_wi_cntx *pmp_wi_cntx = &(Adapter->mppriv.wi_cntx);
1562 DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n"));
1564 if (pmp_wi_cntx->bmp_wi_progress == _TRUE) {
1565 DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n"));
1566 Status = NDIS_STATUS_NOT_ACCEPTED;
1569 pmp_wi_cntx->bmp_wi_progress = _TRUE;
1570 pmp_wi_cntx->param.bcompleted = _FALSE;
1571 pmp_wi_cntx->param.act_type = MPT_GET_RATE_TABLE;
1572 pmp_wi_cntx->param.io_offset = 0x0;
1573 pmp_wi_cntx->param.bytes_cnt = sizeof(struct getratable_rsp);
1574 pmp_wi_cntx->param.io_value = 0xffffffff;
1576 res = rtw_getrttbl_cmd(Adapter, (struct getratable_rsp *)pmp_wi_cntx->param.data);
1577 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1578 if (res != _SUCCESS)
1579 Status = NDIS_STATUS_NOT_ACCEPTED;
1581 DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n"));
1591 /* **************** oid_rtl_seg_87_12_00 section start **************** */
1592 NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv)
1595 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1596 struct security_priv *psecuritypriv = &Adapter->securitypriv;
1598 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1600 ENCRY_CTRL_STATE encry_mode;
1603 *poid_par_priv->bytes_needed = sizeof(u8);
1604 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1605 return NDIS_STATUS_INVALID_LENGTH;
1607 if (poid_par_priv->type_of_oid == SET_OID) {
1608 encry_mode = *((u8 *)poid_par_priv->information_buf);
1609 switch (encry_mode) {
1612 Adapter->registrypriv.software_decrypt = _FALSE;
1613 Adapter->registrypriv.software_encrypt = _FALSE;
1615 psecuritypriv->sw_decrypt = _FALSE;
1616 psecuritypriv->sw_encrypt = _FALSE;
1621 Adapter->registrypriv.software_decrypt = _TRUE;
1622 Adapter->registrypriv.software_encrypt = _TRUE;
1624 psecuritypriv->sw_decrypt = _TRUE;
1625 psecuritypriv->sw_encrypt = _TRUE;
1628 case HW_ENCRY_SW_DECRY:
1630 Adapter->registrypriv.software_decrypt = _TRUE;
1631 Adapter->registrypriv.software_encrypt = _FALSE;
1633 psecuritypriv->sw_decrypt = _TRUE;
1634 psecuritypriv->sw_encrypt = _FALSE;
1637 case SW_ENCRY_HW_DECRY:
1639 Adapter->registrypriv.software_decrypt = _FALSE;
1640 Adapter->registrypriv.software_encrypt = _TRUE;
1642 psecuritypriv->sw_decrypt = _FALSE;
1643 psecuritypriv->sw_encrypt = _TRUE;
1650 if (Adapter->registrypriv.software_encrypt == _FALSE) {
1651 if (Adapter->registrypriv.software_decrypt == _FALSE)
1652 encry_mode = HW_CONTROL;
1654 encry_mode = HW_ENCRY_SW_DECRY;
1656 if (Adapter->registrypriv.software_decrypt == _FALSE)
1657 encry_mode = SW_ENCRY_HW_DECRY;
1659 encry_mode = SW_CONTROL;
1663 if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE))
1664 encry_mode = HW_CONTROL;
1665 else if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _TRUE))
1666 encry_mode = HW_ENCRY_SW_DECRY;
1667 else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _FALSE))
1668 encry_mode = SW_ENCRY_HW_DECRY;
1669 else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE))
1670 encry_mode = SW_CONTROL;
1674 *(u8 *)poid_par_priv->information_buf = encry_mode;
1675 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1684 /* ------------------------------------------------------------------------------ */
1685 NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv)
1688 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1690 #ifdef PLATFORM_OS_XP
1693 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1695 struct sta_info *psta = NULL;
1699 if (poid_par_priv->type_of_oid != SET_OID)
1700 return NDIS_STATUS_NOT_ACCEPTED;
1702 *poid_par_priv->bytes_needed = ETH_ALEN;
1703 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1704 return NDIS_STATUS_INVALID_LENGTH;
1706 macaddr = (UCHAR *) poid_par_priv->information_buf ;
1709 _irqlevel_changed_(&oldirql, LOWER);
1711 psta = rtw_get_stainfo(&Adapter->stapriv, macaddr);
1713 if (psta == NULL) { /* the sta have been in sta_info_queue => do nothing */
1714 psta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr);
1717 status = NDIS_STATUS_FAILURE;
1721 _irqlevel_changed_(&oldirql, RAISE);
1728 /* ------------------------------------------------------------------------------ */
1729 NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv)
1732 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1734 #ifdef PLATFORM_OS_XP
1737 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1739 struct sta_info *psta = NULL;
1743 if (poid_par_priv->type_of_oid != SET_OID)
1744 return NDIS_STATUS_NOT_ACCEPTED;
1746 *poid_par_priv->bytes_needed = ETH_ALEN;
1747 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1748 return NDIS_STATUS_INVALID_LENGTH;
1750 macaddr = (UCHAR *) poid_par_priv->information_buf ;
1752 psta = rtw_get_stainfo(&Adapter->stapriv, macaddr);
1754 /* _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); */
1755 rtw_free_stainfo(Adapter, psta);
1756 /* _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); */
1764 /* ------------------------------------------------------------------------------ */
1766 static u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var)
1768 #ifdef CONFIG_SDIO_HCI
1772 tmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM);
1773 if (adapter_to_dvobj(padapter)->rxblknum != tmp_blk_num) {
1774 /* sd_recv_rxfifo(padapter); */
1779 if (offset <= 100) { /* For setting data rate and query data rate */
1780 if (offset == 100) { /* For query data rate */
1781 var = padapter->registrypriv.tx_rate;
1783 } else if (offset < 0x1d) { /* For setting data rate */
1784 padapter->registrypriv.tx_rate = offset;
1785 var = padapter->registrypriv.tx_rate;
1786 padapter->registrypriv.use_rate = _TRUE;
1787 } else { /* not use the data rate */
1788 padapter->registrypriv.use_rate = _FALSE;
1790 } else if (offset <= 110) { /* for setting debug level */
1791 if (offset == 110) { /* For query data rate */
1792 padapter->registrypriv.dbg_level = GlobalDebugLevel;
1793 var = padapter->registrypriv.dbg_level;
1794 } else if (offset < 110 && offset > 100) {
1795 padapter->registrypriv.dbg_level = GlobalDebugLevel = offset - 100;
1796 var = padapter->registrypriv.dbg_level;
1799 } else if (offset > 110 && offset < 116) {
1800 if (115 == offset) {
1804 adapter_to_dvobj(padapter)->tx_block_mode = 1;
1805 adapter_to_dvobj(padapter)->rx_block_mode = 1;
1808 adapter_to_dvobj(padapter)->tx_block_mode = 1;
1809 adapter_to_dvobj(padapter)->rx_block_mode = 0;
1812 adapter_to_dvobj(padapter)->tx_block_mode = 0;
1813 adapter_to_dvobj(padapter)->rx_block_mode = 1;
1816 adapter_to_dvobj(padapter)->tx_block_mode = 0;
1817 adapter_to_dvobj(padapter)->rx_block_mode = 0;
1826 } else if (offset >= 127) {
1830 chg_idx = offset - 0x80;
1831 tmp_dbg_comp = BIT(chg_idx);
1832 prnt_dbg_comp = padapter->registrypriv.dbg_component = GlobalDebugComponents;
1833 if (offset == 127) {
1834 /* prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; */
1835 var = (u32)(padapter->registrypriv.dbg_component);
1836 prnt_dbg_comp = GlobalDebugComponents;
1837 prnt_dbg_comp = GlobalDebugComponents = padapter->registrypriv.dbg_component;
1840 prnt_dbg_comp = GlobalDebugComponents;
1841 prnt_dbg_comp = GlobalDebugComponents = padapter->registrypriv.dbg_component;
1843 if (GlobalDebugComponents & tmp_dbg_comp) {
1844 /* this bit is already set, now clear it */
1845 GlobalDebugComponents = GlobalDebugComponents & (~tmp_dbg_comp);
1847 /* this bit is not set, now set it. */
1848 GlobalDebugComponents = GlobalDebugComponents | tmp_dbg_comp;
1850 prnt_dbg_comp = GlobalDebugComponents;
1852 var = (u32)(GlobalDebugComponents);
1853 /* GlobalDebugComponents=padapter->registrypriv.dbg_component; */
1864 NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv)
1867 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1869 #ifdef PLATFORM_OS_XP
1872 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1874 DR_VARIABLE_STRUCT *pdrv_var;
1877 if (poid_par_priv->type_of_oid != QUERY_OID)
1878 return NDIS_STATUS_NOT_ACCEPTED;
1880 *poid_par_priv->bytes_needed = sizeof(DR_VARIABLE_STRUCT);
1881 if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)
1882 return NDIS_STATUS_INVALID_LENGTH;
1885 pdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf;
1887 _irqlevel_changed_(&oldirql, LOWER);
1888 pdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset, pdrv_var->variable);
1889 _irqlevel_changed_(&oldirql, RAISE);
1891 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1899 /* ------------------------------------------------------------------------------ */
1900 NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)
1903 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1905 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1908 if (poid_par_priv->information_buf_len < sizeof(UCHAR)) {
1909 status = NDIS_STATUS_INVALID_LENGTH;
1910 *poid_par_priv->bytes_needed = sizeof(UCHAR);
1914 if (poid_par_priv->type_of_oid == SET_OID) {
1915 Adapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf;
1919 *(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status;
1920 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1923 /* *(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); */
1924 /* *(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); */
1928 return NDIS_STATUS_SUCCESS;
1930 /* ------------------------------------------------------------------------------ */
1931 NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv)
1933 #ifdef PLATFORM_OS_XP
1936 PEFUSE_ACCESS_STRUCT pefuse;
1938 u16 addr = 0, cnts = 0, max_available_size = 0;
1939 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1940 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1943 if (poid_par_priv->type_of_oid != QUERY_OID)
1944 return NDIS_STATUS_NOT_ACCEPTED;
1946 if (poid_par_priv->information_buf_len < sizeof(EFUSE_ACCESS_STRUCT))
1947 return NDIS_STATUS_INVALID_LENGTH;
1949 pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf;
1950 addr = pefuse->start_addr;
1951 cnts = pefuse->cnts;
1952 data = pefuse->data;
1955 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
1957 if ((addr + cnts) > max_available_size) {
1958 return NDIS_STATUS_NOT_ACCEPTED;
1961 _irqlevel_changed_(&oldirql, LOWER);
1962 if (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) {
1963 status = NDIS_STATUS_FAILURE;
1965 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1966 _irqlevel_changed_(&oldirql, RAISE);
1971 /* ------------------------------------------------------------------------------ */
1972 NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv)
1974 #ifdef PLATFORM_OS_XP
1977 PEFUSE_ACCESS_STRUCT pefuse;
1979 u16 addr = 0, cnts = 0, max_available_size = 0;
1980 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
1981 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
1985 if (poid_par_priv->type_of_oid != SET_OID)
1986 return NDIS_STATUS_NOT_ACCEPTED;
1988 pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf;
1989 addr = pefuse->start_addr;
1990 cnts = pefuse->cnts;
1991 data = pefuse->data;
1994 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
1996 if ((addr + cnts) > max_available_size) {
1997 return NDIS_STATUS_NOT_ACCEPTED;
2000 _irqlevel_changed_(&oldirql, LOWER);
2001 if (rtw_efuse_access(Adapter, _TRUE, addr, cnts, data) == _FAIL)
2002 status = NDIS_STATUS_FAILURE;
2003 _irqlevel_changed_(&oldirql, RAISE);
2008 /* ------------------------------------------------------------------------------ */
2009 NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv)
2011 #ifdef PLATFORM_OS_XP
2014 PPGPKT_STRUCT ppgpkt;
2015 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2016 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2020 *poid_par_priv->bytes_rw = 0;
2022 if (poid_par_priv->information_buf_len < sizeof(PGPKT_STRUCT))
2023 return NDIS_STATUS_INVALID_LENGTH;
2025 ppgpkt = (PPGPKT_STRUCT)poid_par_priv->information_buf;
2027 _irqlevel_changed_(&oldirql, LOWER);
2029 if (poid_par_priv->type_of_oid == QUERY_OID) {
2031 Efuse_PowerSwitch(Adapter, _FALSE, _TRUE);
2032 if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE)
2033 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2035 status = NDIS_STATUS_FAILURE;
2036 Efuse_PowerSwitch(Adapter, _FALSE, _FALSE);
2039 Efuse_PowerSwitch(Adapter, _TRUE, _TRUE);
2040 if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE)
2041 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2043 status = NDIS_STATUS_FAILURE;
2044 Efuse_PowerSwitch(Adapter, _TRUE, _FALSE);
2047 _irqlevel_changed_(&oldirql, RAISE);
2053 /* ------------------------------------------------------------------------------ */
2054 NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv)
2056 #ifdef PLATFORM_OS_XP
2061 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2062 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2065 if (poid_par_priv->type_of_oid != QUERY_OID)
2066 return NDIS_STATUS_NOT_ACCEPTED;
2068 if (poid_par_priv->information_buf_len < sizeof(u32))
2069 return NDIS_STATUS_INVALID_LENGTH;
2071 _irqlevel_changed_(&oldirql, LOWER);
2072 ret = efuse_GetCurrentSize(Adapter, &size);
2073 _irqlevel_changed_(&oldirql, RAISE);
2074 if (ret == _SUCCESS) {
2075 *(u32 *)poid_par_priv->information_buf = size;
2076 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2078 status = NDIS_STATUS_FAILURE;
2083 /* ------------------------------------------------------------------------------ */
2084 NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv)
2086 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2087 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2090 if (poid_par_priv->type_of_oid != QUERY_OID)
2091 return NDIS_STATUS_NOT_ACCEPTED;
2093 if (poid_par_priv->information_buf_len < sizeof(u32))
2094 return NDIS_STATUS_INVALID_LENGTH;
2096 *(u32 *)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter);
2097 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2103 /* ------------------------------------------------------------------------------ */
2104 NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv)
2110 if (poid_par_priv->type_of_oid == QUERY_OID)
2111 status = oid_rt_pro_read_efuse_hdl(poid_par_priv);
2113 status = oid_rt_pro_write_efuse_hdl(poid_par_priv);
2119 /* ------------------------------------------------------------------------------ */
2120 NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv)
2122 #ifdef PLATFORM_OS_XP
2126 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2127 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2132 EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
2134 *poid_par_priv->bytes_rw = 0;
2136 if (poid_par_priv->information_buf_len < mapLen)
2137 return NDIS_STATUS_INVALID_LENGTH;
2139 data = (u8 *)poid_par_priv->information_buf;
2141 _irqlevel_changed_(&oldirql, LOWER);
2143 if (poid_par_priv->type_of_oid == QUERY_OID) {
2145 if (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS)
2146 *poid_par_priv->bytes_rw = mapLen;
2148 status = NDIS_STATUS_FAILURE;
2153 if (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS)
2154 *poid_par_priv->bytes_rw = mapLen;
2156 status = NDIS_STATUS_FAILURE;
2160 _irqlevel_changed_(&oldirql, RAISE);
2167 NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv)
2169 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2171 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2173 #ifdef PLATFORM_OS_XP
2177 u32 crystal_cap = 0;
2180 if (poid_par_priv->type_of_oid != SET_OID)
2181 return NDIS_STATUS_NOT_ACCEPTED;
2183 if (poid_par_priv->information_buf_len < sizeof(u32))
2184 return NDIS_STATUS_INVALID_LENGTH;
2186 crystal_cap = *((u32 *)poid_par_priv->information_buf); /* 4 */
2187 if (crystal_cap > 0xf)
2188 return NDIS_STATUS_NOT_ACCEPTED;
2190 Adapter->mppriv.curr_crystalcap = crystal_cap;
2192 _irqlevel_changed_(&oldirql, LOWER);
2193 SetCrystalCap(Adapter);
2194 _irqlevel_changed_(&oldirql, RAISE);
2201 NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)
2203 #ifdef PLATFORM_OS_XP
2207 /* u32 rcr_val32; */
2208 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2209 /* PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); */
2213 if (poid_par_priv->type_of_oid != SET_OID)
2214 return NDIS_STATUS_NOT_ACCEPTED;
2216 if (poid_par_priv->information_buf_len < sizeof(u8))
2217 return NDIS_STATUS_INVALID_LENGTH;
2219 rx_pkt_type = *((u8 *)poid_par_priv->information_buf); /* 4 */
2222 _irqlevel_changed_(&oldirql, LOWER);
2224 rcr_val8 = rtw_read8(Adapter, 0x10250048);/* RCR */
2225 rcr_val8 &= ~(RCR_AB | RCR_AM | RCR_APM | RCR_AAP);
2227 if (rx_pkt_type == RX_PKT_BROADCAST)
2228 rcr_val8 |= (RCR_AB | RCR_ACRC32);
2229 else if (rx_pkt_type == RX_PKT_DEST_ADDR)
2230 rcr_val8 |= (RCR_AAP | RCR_AM | RCR_ACRC32);
2231 else if (rx_pkt_type == RX_PKT_PHY_MATCH)
2232 rcr_val8 |= (RCR_APM | RCR_ACRC32);
2234 rcr_val8 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32);
2235 rtw_write8(padapter, 0x10250048, rcr_val8);
2237 rcr_val32 = rtw_read32(padapter, RCR);/* RCR = 0x10250048 */
2238 rcr_val32 &= ~(RCR_CBSSID | RCR_AB | RCR_AM | RCR_APM | RCR_AAP);
2240 if (rx_pkt_type == RX_PKT_BROADCAST)
2241 rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32);
2242 else if (rx_pkt_type == RX_PKT_DEST_ADDR) {
2243 /* rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32); */
2244 rcr_val32 |= (RCR_CBSSID | RCR_APM | RCR_ACRC32);
2245 } else if (rx_pkt_type == RX_PKT_PHY_MATCH) {
2246 rcr_val32 |= (RCR_APM | RCR_ACRC32);
2247 /* rcr_val32 |= (RCR_AAP|RCR_ACRC32); */
2249 rcr_val32 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32);
2251 switch (rx_pkt_type) {
2252 case RX_PKT_BROADCAST:
2253 rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32);
2255 case RX_PKT_DEST_ADDR:
2256 rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32);
2258 case RX_PKT_PHY_MATCH:
2259 rcr_val32 |= (RCR_APM | RCR_ACRC32);
2262 rcr_val32 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32);
2266 if (rx_pkt_type == RX_PKT_DEST_ADDR)
2267 padapter->mppriv.check_mp_pkt = 1;
2269 padapter->mppriv.check_mp_pkt = 0;
2271 rtw_write32(padapter, RCR, rcr_val32);
2274 _irqlevel_changed_(&oldirql, RAISE);
2280 NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv)
2283 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2285 #ifdef PLATFORM_OS_XP
2288 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2293 if (poid_par_priv->type_of_oid != SET_OID)
2294 return NDIS_STATUS_NOT_ACCEPTED;
2296 if (poid_par_priv->information_buf_len < sizeof(u32))
2297 return NDIS_STATUS_INVALID_LENGTH;
2299 txagc = *(u32 *)poid_par_priv->information_buf;
2301 _irqlevel_changed_(&oldirql, LOWER);
2302 SetTxAGCOffset(Adapter, txagc);
2303 _irqlevel_changed_(&oldirql, RAISE);
2312 NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv)
2315 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2317 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2319 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
2320 struct mp_priv *pmppriv = &Adapter->mppriv;
2324 if (poid_par_priv->type_of_oid != SET_OID)
2325 return NDIS_STATUS_NOT_ACCEPTED;
2327 if (poid_par_priv->information_buf_len < sizeof(u32))
2328 return NDIS_STATUS_INVALID_LENGTH;
2330 type = *(u32 *)poid_par_priv->information_buf;
2332 if (_LOOPBOOK_MODE_ == type) {
2333 pmppriv->mode = type;
2334 set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); /* append txdesc */
2335 } else if (_2MAC_MODE_ == type) {
2336 pmppriv->mode = type;
2337 _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE);
2339 status = NDIS_STATUS_NOT_ACCEPTED;
2348 unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
2350 PMP_XMIT_PARM pparm;
2352 struct mp_priv *pmp_priv;
2353 struct pkt_attrib *pattrib;
2356 pparm = (PMP_XMIT_PARM)poid_par_priv->information_buf;
2357 padapter = (PADAPTER)poid_par_priv->adapter_context;
2358 pmp_priv = &padapter->mppriv;
2360 if (poid_par_priv->type_of_oid == QUERY_OID) {
2361 pparm->enable = !pmp_priv->tx.stop;
2362 pparm->count = pmp_priv->tx.sended;
2364 if (pparm->enable == 0)
2365 pmp_priv->tx.stop = 1;
2366 else if (pmp_priv->tx.stop == 1) {
2367 pmp_priv->tx.stop = 0;
2368 pmp_priv->tx.count = pparm->count;
2369 pmp_priv->tx.payload = pparm->payload_type;
2370 pattrib = &pmp_priv->tx.attrib;
2371 pattrib->pktlen = pparm->length;
2372 _rtw_memcpy(pattrib->dst, pparm->da, ETH_ALEN);
2373 SetPacketTx(padapter);
2375 return NDIS_STATUS_FAILURE;
2378 return NDIS_STATUS_SUCCESS;
2382 unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
2384 unsigned char *pframe, *pmp_pkt;
2385 struct ethhdr *pethhdr;
2386 struct pkt_attrib *pattrib;
2387 struct rtw_ieee80211_hdr *pwlanhdr;
2388 unsigned short *fctrl;
2389 int llc_sz, payload_len;
2390 struct mp_xmit_frame *pxframe = NULL;
2391 struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet *)param;
2392 u8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55};
2394 /* RTW_INFO("+mp_ioctl_xmit_packet_hdl\n"); */
2396 pxframe = alloc_mp_xmitframe(&padapter->mppriv);
2397 if (pxframe == NULL) {
2398 DEBUG_ERR(("Can't alloc pmpframe %d:%s\n", __LINE__, __FILE__));
2403 payload_len = pmp_xmitpkt->len - 14;
2404 pmp_pkt = (unsigned char *)pmp_xmitpkt->mem;
2405 pethhdr = (struct ethhdr *)pmp_pkt;
2407 /* RTW_INFO("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem); */
2409 /* RTW_INFO("pxframe=0x%x\n", (void*)pxframe); */
2410 /* RTW_INFO("pxframe->mem=0x%x\n", (void*)pxframe->mem); */
2412 /* update attribute */
2413 pattrib = &pxframe->attrib;
2414 memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib));
2415 pattrib->pktlen = pmp_xmitpkt->len;
2416 pattrib->ether_type = ntohs(pethhdr->h_proto);
2417 pattrib->hdrlen = 24;
2418 pattrib->nr_frags = 1;
2419 pattrib->priority = 0;
2420 #ifndef CONFIG_MP_LINUX
2421 if (IS_MCAST(pethhdr->h_dest))
2422 pattrib->mac_id = 4;
2424 pattrib->mac_id = 5;
2426 pattrib->mac_id = 5;
2430 memset(pxframe->mem, 0 , WLANHDR_OFFSET);
2431 pframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET;
2433 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2435 fctrl = &(pwlanhdr->frame_ctl);
2437 set_frame_sub_type(pframe, WIFI_DATA);
2439 _rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN);
2440 _rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN);
2442 _rtw_memcpy(pwlanhdr->addr3, addr3, ETH_ALEN);
2444 pwlanhdr->seq_ctl = 0;
2445 pframe += pattrib->hdrlen;
2447 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
2450 _rtw_memcpy(pframe, (void *)(pmp_pkt + 14), payload_len);
2452 pattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len;
2454 DEBUG_INFO(("issuing mp_xmit_frame, tx_len=%d, ether_type=0x%x\n", pattrib->last_txcmdsz, pattrib->ether_type));
2455 xmit_mp_frame(padapter, pxframe);
2460 /* ------------------------------------------------------------------------------ */
2461 NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv)
2463 #ifdef PLATFORM_OS_XP
2467 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2468 #ifdef PLATFORM_LINUX
2469 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2470 PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
2475 if (poid_par_priv->type_of_oid != SET_OID) {
2476 status = NDIS_STATUS_NOT_ACCEPTED;
2481 _irqlevel_changed_(&oldirql, LOWER);
2483 bpwrup = *(u8 *)poid_par_priv->information_buf;
2484 /* CALL the power_down function */
2485 #ifdef PLATFORM_LINUX
2486 #if defined(CONFIG_RTL8712) /* Linux MP insmod unknown symbol */
2487 dev_power_down(padapter, bpwrup);
2490 _irqlevel_changed_(&oldirql, RAISE);
2492 /* DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER. */
2493 /* Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value)); */
2498 /* ------------------------------------------------------------------------------ */
2499 NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv)
2502 NDIS_STATUS status = NDIS_STATUS_SUCCESS;
2503 PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
2504 /* #ifdef PLATFORM_OS_XP */
2509 if (poid_par_priv->type_of_oid != QUERY_OID) {
2510 status = NDIS_STATUS_NOT_ACCEPTED;
2513 if (poid_par_priv->information_buf_len < sizeof(u32)) {
2514 status = NDIS_STATUS_INVALID_LENGTH;
2519 /* _irqlevel_changed_(&oldirql, LOWER); */
2520 *(int *)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL;
2521 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2522 /* _irqlevel_changed_(&oldirql, RAISE); */