1 /******************************************************************************
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
27 ******************************************************************************/
29 #include "osdep_service.h"
30 #include "drv_types.h"
31 #include "mlme_osdep.h"
32 #include "rtl871x_mp.h"
33 #include "rtl871x_mp_ioctl.h"
35 uint
oid_null_function(struct oid_par_priv
*poid_par_priv
)
37 return NDIS_STATUS_SUCCESS
;
40 uint
oid_rt_wireless_mode_hdl(struct oid_par_priv
*poid_par_priv
)
42 uint status
= NDIS_STATUS_SUCCESS
;
43 struct _adapter
*Adapter
= (struct _adapter
*)
44 (poid_par_priv
->adapter_context
);
46 if (poid_par_priv
->type_of_oid
== SET_OID
) {
47 if (poid_par_priv
->information_buf_len
>= sizeof(u8
))
48 Adapter
->registrypriv
.wireless_mode
=
49 *(u8
*)poid_par_priv
->information_buf
;
51 status
= NDIS_STATUS_INVALID_LENGTH
;
52 } else if (poid_par_priv
->type_of_oid
== QUERY_OID
) {
53 if (poid_par_priv
->information_buf_len
>= sizeof(u8
)) {
54 *(u8
*)poid_par_priv
->information_buf
=
55 Adapter
->registrypriv
.wireless_mode
;
56 *poid_par_priv
->bytes_rw
=
57 poid_par_priv
->information_buf_len
;
59 status
= NDIS_STATUS_INVALID_LENGTH
;
61 status
= NDIS_STATUS_NOT_ACCEPTED
;
66 uint
oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv
*poid_par_priv
)
68 uint status
= NDIS_STATUS_SUCCESS
;
69 struct _adapter
*Adapter
= (struct _adapter
*)
70 (poid_par_priv
->adapter_context
);
71 struct bb_reg_param
*pbbreg
;
75 if (poid_par_priv
->type_of_oid
!= SET_OID
)
76 return NDIS_STATUS_NOT_ACCEPTED
;
77 if (poid_par_priv
->information_buf_len
< sizeof(struct bb_reg_param
))
78 return NDIS_STATUS_INVALID_LENGTH
;
79 pbbreg
= (struct bb_reg_param
*)(poid_par_priv
->information_buf
);
80 offset
= (u16
)(pbbreg
->offset
) & 0xFFF; /*0ffset :0x800~0xfff*/
81 if (offset
< BB_REG_BASE_ADDR
)
82 offset
|= BB_REG_BASE_ADDR
;
83 value
= pbbreg
->value
;
84 r8712_bb_reg_write(Adapter
, offset
, value
);
88 uint
oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv
*poid_par_priv
)
90 uint status
= NDIS_STATUS_SUCCESS
;
91 struct _adapter
*Adapter
= (struct _adapter
*)
92 (poid_par_priv
->adapter_context
);
93 struct bb_reg_param
*pbbreg
;
97 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
98 return NDIS_STATUS_NOT_ACCEPTED
;
99 if (poid_par_priv
->information_buf_len
< sizeof(struct bb_reg_param
))
100 return NDIS_STATUS_INVALID_LENGTH
;
101 pbbreg
= (struct bb_reg_param
*)(poid_par_priv
->information_buf
);
102 offset
= (u16
)(pbbreg
->offset
) & 0xFFF; /*0ffset :0x800~0xfff*/
103 if (offset
< BB_REG_BASE_ADDR
)
104 offset
|= BB_REG_BASE_ADDR
;
105 value
= r8712_bb_reg_read(Adapter
, offset
);
106 pbbreg
->value
= value
;
107 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
111 uint
oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv
*poid_par_priv
)
113 uint status
= NDIS_STATUS_SUCCESS
;
114 struct _adapter
*Adapter
= (struct _adapter
*)
115 (poid_par_priv
->adapter_context
);
116 struct rf_reg_param
*pbbreg
;
121 if (poid_par_priv
->type_of_oid
!= SET_OID
)
122 return NDIS_STATUS_NOT_ACCEPTED
;
123 if (poid_par_priv
->information_buf_len
< sizeof(struct rf_reg_param
))
124 return NDIS_STATUS_INVALID_LENGTH
;
125 pbbreg
= (struct rf_reg_param
*)(poid_par_priv
->information_buf
);
126 path
= (u8
)pbbreg
->path
;
127 if (path
> RF_PATH_B
)
128 return NDIS_STATUS_NOT_ACCEPTED
;
129 offset
= (u8
)pbbreg
->offset
;
130 value
= pbbreg
->value
;
131 r8712_rf_reg_write(Adapter
, path
, offset
, value
);
135 uint
oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv
*poid_par_priv
)
137 struct _adapter
*Adapter
= (struct _adapter
*)
138 (poid_par_priv
->adapter_context
);
139 uint status
= NDIS_STATUS_SUCCESS
;
140 struct rf_reg_param
*pbbreg
;
145 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
146 return NDIS_STATUS_NOT_ACCEPTED
;
147 if (poid_par_priv
->information_buf_len
< sizeof(struct rf_reg_param
))
148 return NDIS_STATUS_INVALID_LENGTH
;
149 pbbreg
= (struct rf_reg_param
*)(poid_par_priv
->information_buf
);
150 path
= (u8
)pbbreg
->path
;
151 if (path
> RF_PATH_B
) /* 1T2R path_a /path_b */
152 return NDIS_STATUS_NOT_ACCEPTED
;
153 offset
= (u8
)pbbreg
->offset
;
154 value
= r8712_rf_reg_read(Adapter
, path
, offset
);
155 pbbreg
->value
= value
;
156 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
160 /*This function initializes the DUT to the MP test mode*/
161 static int mp_start_test(struct _adapter
*padapter
)
163 struct mp_priv
*pmppriv
= &padapter
->mppriv
;
164 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
165 struct wlan_network
*tgt_network
= &pmlmepriv
->cur_network
;
166 struct ndis_wlan_bssid_ex bssid
;
167 struct sta_info
*psta
;
168 unsigned long length
;
172 /* 3 1. initialize a new struct ndis_wlan_bssid_ex */
173 memcpy(bssid
.MacAddress
, pmppriv
->network_macaddr
, ETH_ALEN
);
174 bssid
.Ssid
.SsidLength
= 16;
175 memcpy(bssid
.Ssid
.Ssid
, (unsigned char *)"mp_pseudo_adhoc",
176 bssid
.Ssid
.SsidLength
);
177 bssid
.InfrastructureMode
= Ndis802_11IBSS
;
178 bssid
.NetworkTypeInUse
= Ndis802_11DS
;
180 length
= r8712_get_ndis_wlan_bssid_ex_sz(&bssid
);
182 /*round up to multiple of 4 bytes.*/
183 bssid
.Length
= ((length
>> 2) + 1) << 2;
185 bssid
.Length
= length
;
186 spin_lock_irqsave(&pmlmepriv
->lock
, irqL
);
187 if (check_fwstate(pmlmepriv
, WIFI_MP_STATE
) == true)
188 goto end_of_mp_start_test
;
189 /*init mp_start_test status*/
190 pmppriv
->prev_fw_state
= get_fwstate(pmlmepriv
);
191 pmlmepriv
->fw_state
= WIFI_MP_STATE
;
192 if (pmppriv
->mode
== _LOOPBOOK_MODE_
)
193 set_fwstate(pmlmepriv
, WIFI_MP_LPBK_STATE
); /*append txdesc*/
194 set_fwstate(pmlmepriv
, _FW_UNDER_LINKING
);
195 /* 3 2. create a new psta for mp driver */
196 /* clear psta in the cur_network, if any */
197 psta
= r8712_get_stainfo(&padapter
->stapriv
,
198 tgt_network
->network
.MacAddress
);
200 r8712_free_stainfo(padapter
, psta
);
201 psta
= r8712_alloc_stainfo(&padapter
->stapriv
, bssid
.MacAddress
);
204 goto end_of_mp_start_test
;
206 /* 3 3. join psudo AdHoc */
207 tgt_network
->join_res
= 1;
208 tgt_network
->aid
= psta
->aid
= 1;
209 memcpy(&tgt_network
->network
, &bssid
, length
);
210 _clr_fwstate_(pmlmepriv
, _FW_UNDER_LINKING
);
211 r8712_os_indicate_connect(padapter
);
212 /* Set to LINKED STATE for MP TRX Testing */
213 set_fwstate(pmlmepriv
, _FW_LINKED
);
214 end_of_mp_start_test
:
215 spin_unlock_irqrestore(&pmlmepriv
->lock
, irqL
);
219 /*This function change the DUT from the MP test mode into normal mode */
220 static int mp_stop_test(struct _adapter
*padapter
)
222 struct mp_priv
*pmppriv
= &padapter
->mppriv
;
223 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
224 struct wlan_network
*tgt_network
= &pmlmepriv
->cur_network
;
225 struct sta_info
*psta
;
228 spin_lock_irqsave(&pmlmepriv
->lock
, irqL
);
229 if (check_fwstate(pmlmepriv
, WIFI_MP_STATE
) == false)
230 goto end_of_mp_stop_test
;
231 /* 3 1. disconnect psudo AdHoc */
232 r8712_os_indicate_disconnect(padapter
);
233 /* 3 2. clear psta used in mp test mode. */
234 psta
= r8712_get_stainfo(&padapter
->stapriv
,
235 tgt_network
->network
.MacAddress
);
237 r8712_free_stainfo(padapter
, psta
);
238 /* 3 3. return to normal state (default:station mode) */
239 pmlmepriv
->fw_state
= pmppriv
->prev_fw_state
; /* WIFI_STATION_STATE;*/
240 /*flush the cur_network*/
241 memset(tgt_network
, 0, sizeof(struct wlan_network
));
243 spin_unlock_irqrestore(&pmlmepriv
->lock
, irqL
);
247 int mp_start_joinbss(struct _adapter
*padapter
, struct ndis_802_11_ssid
*pssid
)
249 struct mp_priv
*pmppriv
= &padapter
->mppriv
;
250 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
251 unsigned char res
= _SUCCESS
;
253 if (check_fwstate(pmlmepriv
, WIFI_MP_STATE
) == false)
255 if (check_fwstate(pmlmepriv
, _FW_LINKED
) == false)
257 _clr_fwstate_(pmlmepriv
, _FW_LINKED
);
258 res
= r8712_setassocsta_cmd(padapter
, pmppriv
->network_macaddr
);
259 set_fwstate(pmlmepriv
, _FW_UNDER_LINKING
);
263 uint
oid_rt_pro_set_data_rate_hdl(struct oid_par_priv
266 struct _adapter
*Adapter
= (struct _adapter
*)
267 (poid_par_priv
->adapter_context
);
268 uint status
= NDIS_STATUS_SUCCESS
;
271 if (poid_par_priv
->type_of_oid
!= SET_OID
)
272 return NDIS_STATUS_NOT_ACCEPTED
;
273 if (poid_par_priv
->information_buf_len
!= sizeof(u32
))
274 return NDIS_STATUS_INVALID_LENGTH
;
275 ratevalue
= *((u32
*)poid_par_priv
->information_buf
);
276 if (ratevalue
>= MPT_RATE_LAST
)
277 return NDIS_STATUS_INVALID_DATA
;
278 Adapter
->mppriv
.curr_rateidx
= ratevalue
;
279 r8712_SetDataRate(Adapter
);
283 uint
oid_rt_pro_start_test_hdl(struct oid_par_priv
*poid_par_priv
)
285 struct _adapter
*Adapter
= (struct _adapter
*)
286 (poid_par_priv
->adapter_context
);
287 uint status
= NDIS_STATUS_SUCCESS
;
291 if (poid_par_priv
->type_of_oid
!= SET_OID
)
292 return NDIS_STATUS_NOT_ACCEPTED
;
293 mode
= *((u32
*)poid_par_priv
->information_buf
);
294 Adapter
->mppriv
.mode
= mode
;/* 1 for loopback*/
295 if (mp_start_test(Adapter
) == _FAIL
)
296 status
= NDIS_STATUS_NOT_ACCEPTED
;
297 r8712_write8(Adapter
, MSR
, 1); /* Link in ad hoc network, 0x1025004C */
298 r8712_write8(Adapter
, RCR
, 0); /* RCR : disable all pkt, 0x10250048 */
299 /* RCR disable Check BSSID, 0x1025004a */
300 r8712_write8(Adapter
, RCR
+2, 0x57);
301 /* disable RX filter map , mgt frames will put in RX FIFO 0 */
302 r8712_write16(Adapter
, RXFLTMAP0
, 0x0);
303 val8
= r8712_read8(Adapter
, EE_9346CR
);
304 if (!(val8
& _9356SEL
)) { /*boot from EFUSE*/
305 r8712_efuse_reg_init(Adapter
);
306 r8712_efuse_change_max_size(Adapter
);
307 r8712_efuse_reg_uninit(Adapter
);
312 uint
oid_rt_pro_stop_test_hdl(struct oid_par_priv
*poid_par_priv
)
314 struct _adapter
*Adapter
= (struct _adapter
*)
315 (poid_par_priv
->adapter_context
);
316 uint status
= NDIS_STATUS_SUCCESS
;
318 if (poid_par_priv
->type_of_oid
!= SET_OID
)
319 return NDIS_STATUS_NOT_ACCEPTED
;
320 if (mp_stop_test(Adapter
) == _FAIL
)
321 status
= NDIS_STATUS_NOT_ACCEPTED
;
325 uint
oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv
328 struct _adapter
*Adapter
= (struct _adapter
*)
329 (poid_par_priv
->adapter_context
);
330 uint status
= NDIS_STATUS_SUCCESS
;
333 if (poid_par_priv
->type_of_oid
!= SET_OID
)
334 return NDIS_STATUS_NOT_ACCEPTED
;
335 if (poid_par_priv
->information_buf_len
!= sizeof(u32
))
336 return NDIS_STATUS_INVALID_LENGTH
;
337 Channel
= *((u32
*)poid_par_priv
->information_buf
);
339 return NDIS_STATUS_NOT_ACCEPTED
;
340 Adapter
->mppriv
.curr_ch
= Channel
;
341 r8712_SetChannel(Adapter
);
345 uint
oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv
*poid_par_priv
)
347 struct _adapter
*Adapter
= (struct _adapter
*)
348 (poid_par_priv
->adapter_context
);
349 uint status
= NDIS_STATUS_SUCCESS
;
352 if (poid_par_priv
->type_of_oid
!= SET_OID
)
353 return NDIS_STATUS_NOT_ACCEPTED
;
354 if (poid_par_priv
->information_buf_len
!= sizeof(u32
))
355 return NDIS_STATUS_INVALID_LENGTH
;
356 antenna
= *((u32
*)poid_par_priv
->information_buf
);
357 Adapter
->mppriv
.antenna_tx
= (u16
)((antenna
& 0xFFFF0000) >> 16);
358 Adapter
->mppriv
.antenna_rx
= (u16
)(antenna
& 0x0000FFFF);
359 r8712_SwitchAntenna(Adapter
);
363 uint
oid_rt_pro_set_tx_power_control_hdl(
364 struct oid_par_priv
*poid_par_priv
)
366 struct _adapter
*Adapter
= (struct _adapter
*)
367 (poid_par_priv
->adapter_context
);
368 uint status
= NDIS_STATUS_SUCCESS
;
371 if (poid_par_priv
->type_of_oid
!= SET_OID
)
372 return NDIS_STATUS_NOT_ACCEPTED
;
373 if (poid_par_priv
->information_buf_len
!= sizeof(u32
))
374 return NDIS_STATUS_INVALID_LENGTH
;
375 tx_pwr_idx
= *((u32
*)poid_par_priv
->information_buf
);
376 if (tx_pwr_idx
> MAX_TX_PWR_INDEX_N_MODE
)
377 return NDIS_STATUS_NOT_ACCEPTED
;
378 Adapter
->mppriv
.curr_txpoweridx
= (u8
)tx_pwr_idx
;
379 r8712_SetTxPower(Adapter
);
383 uint
oid_rt_pro_query_tx_packet_sent_hdl(
384 struct oid_par_priv
*poid_par_priv
)
386 uint status
= NDIS_STATUS_SUCCESS
;
387 struct _adapter
*Adapter
= (struct _adapter
*)
388 (poid_par_priv
->adapter_context
);
390 if (poid_par_priv
->type_of_oid
!= QUERY_OID
) {
391 status
= NDIS_STATUS_NOT_ACCEPTED
;
394 if (poid_par_priv
->information_buf_len
== sizeof(u32
)) {
395 *(u32
*)poid_par_priv
->information_buf
=
396 Adapter
->mppriv
.tx_pktcount
;
397 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
399 status
= NDIS_STATUS_INVALID_LENGTH
;
403 uint
oid_rt_pro_query_rx_packet_received_hdl(
404 struct oid_par_priv
*poid_par_priv
)
406 uint status
= NDIS_STATUS_SUCCESS
;
407 struct _adapter
*Adapter
= (struct _adapter
*)
408 (poid_par_priv
->adapter_context
);
410 if (poid_par_priv
->type_of_oid
!= QUERY_OID
) {
411 status
= NDIS_STATUS_NOT_ACCEPTED
;
414 if (poid_par_priv
->information_buf_len
== sizeof(u32
)) {
415 *(u32
*)poid_par_priv
->information_buf
=
416 Adapter
->mppriv
.rx_pktcount
;
417 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
419 status
= NDIS_STATUS_INVALID_LENGTH
;
423 uint
oid_rt_pro_query_rx_packet_crc32_error_hdl(
424 struct oid_par_priv
*poid_par_priv
)
426 uint status
= NDIS_STATUS_SUCCESS
;
427 struct _adapter
*Adapter
= (struct _adapter
*)
428 (poid_par_priv
->adapter_context
);
430 if (poid_par_priv
->type_of_oid
!= QUERY_OID
) {
431 status
= NDIS_STATUS_NOT_ACCEPTED
;
434 if (poid_par_priv
->information_buf_len
== sizeof(u32
)) {
435 *(u32
*)poid_par_priv
->information_buf
=
436 Adapter
->mppriv
.rx_crcerrpktcount
;
437 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
439 status
= NDIS_STATUS_INVALID_LENGTH
;
443 uint
oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv
446 struct _adapter
*Adapter
= (struct _adapter
*)
447 (poid_par_priv
->adapter_context
);
449 if (poid_par_priv
->type_of_oid
!= SET_OID
)
450 return NDIS_STATUS_NOT_ACCEPTED
;
451 Adapter
->mppriv
.tx_pktcount
= 0;
452 return NDIS_STATUS_SUCCESS
;
455 uint
oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv
458 uint status
= NDIS_STATUS_SUCCESS
;
459 struct _adapter
*Adapter
= (struct _adapter
*)
460 (poid_par_priv
->adapter_context
);
462 if (poid_par_priv
->type_of_oid
!= SET_OID
)
463 return NDIS_STATUS_NOT_ACCEPTED
;
464 if (poid_par_priv
->information_buf_len
== sizeof(u32
)) {
465 Adapter
->mppriv
.rx_pktcount
= 0;
466 Adapter
->mppriv
.rx_crcerrpktcount
= 0;
468 status
= NDIS_STATUS_INVALID_LENGTH
;
472 uint
oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv
475 struct _adapter
*Adapter
= (struct _adapter
*)
476 (poid_par_priv
->adapter_context
);
478 if (poid_par_priv
->type_of_oid
!= SET_OID
)
479 return NDIS_STATUS_NOT_ACCEPTED
;
480 r8712_ResetPhyRxPktCount(Adapter
);
481 return NDIS_STATUS_SUCCESS
;
484 uint
oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv
487 struct _adapter
*Adapter
= (struct _adapter
*)
488 (poid_par_priv
->adapter_context
);
490 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
491 return NDIS_STATUS_NOT_ACCEPTED
;
492 if (poid_par_priv
->information_buf_len
!= sizeof(u32
))
493 return NDIS_STATUS_INVALID_LENGTH
;
494 *(u32
*)poid_par_priv
->information_buf
=
495 r8712_GetPhyRxPktReceived(Adapter
);
496 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
497 return NDIS_STATUS_SUCCESS
;
500 uint
oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv
503 struct _adapter
*Adapter
= (struct _adapter
*)
504 (poid_par_priv
->adapter_context
);
506 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
507 return NDIS_STATUS_NOT_ACCEPTED
;
508 if (poid_par_priv
->information_buf_len
!= sizeof(u32
))
509 return NDIS_STATUS_INVALID_LENGTH
;
510 *(u32
*)poid_par_priv
->information_buf
=
511 r8712_GetPhyRxPktCRC32Error(Adapter
);
512 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
513 return NDIS_STATUS_SUCCESS
;
516 uint
oid_rt_pro_set_modulation_hdl(struct oid_par_priv
519 struct _adapter
*Adapter
= (struct _adapter
*)
520 (poid_par_priv
->adapter_context
);
522 if (poid_par_priv
->type_of_oid
!= SET_OID
)
523 return NDIS_STATUS_NOT_ACCEPTED
;
525 Adapter
->mppriv
.curr_modem
= *((u8
*)poid_par_priv
->information_buf
);
526 return NDIS_STATUS_SUCCESS
;
529 uint
oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv
532 struct _adapter
*Adapter
= (struct _adapter
*)
533 (poid_par_priv
->adapter_context
);
536 if (poid_par_priv
->type_of_oid
!= SET_OID
)
537 return NDIS_STATUS_NOT_ACCEPTED
;
538 bStartTest
= *((u32
*)poid_par_priv
->information_buf
);
539 r8712_SetContinuousTx(Adapter
, (u8
)bStartTest
);
540 return NDIS_STATUS_SUCCESS
;
543 uint
oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv
546 struct _adapter
*Adapter
= (struct _adapter
*)
547 (poid_par_priv
->adapter_context
);
550 if (poid_par_priv
->type_of_oid
!= SET_OID
)
551 return NDIS_STATUS_NOT_ACCEPTED
;
552 bStartTest
= *((u32
*)poid_par_priv
->information_buf
);
553 r8712_SetSingleCarrierTx(Adapter
, (u8
)bStartTest
);
554 return NDIS_STATUS_SUCCESS
;
557 uint
oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv
560 struct _adapter
*Adapter
= (struct _adapter
*)
561 (poid_par_priv
->adapter_context
);
564 if (poid_par_priv
->type_of_oid
!= SET_OID
)
565 return NDIS_STATUS_NOT_ACCEPTED
;
566 bStartTest
= *((u32
*)poid_par_priv
->information_buf
);
567 r8712_SetCarrierSuppressionTx(Adapter
, (u8
)bStartTest
);
568 return NDIS_STATUS_SUCCESS
;
571 uint
oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv
574 struct _adapter
*Adapter
= (struct _adapter
*)
575 (poid_par_priv
->adapter_context
);
578 if (poid_par_priv
->type_of_oid
!= SET_OID
)
579 return NDIS_STATUS_NOT_ACCEPTED
;
580 bStartTest
= *((u32
*)poid_par_priv
->information_buf
);
581 r8712_SetSingleToneTx(Adapter
, (u8
)bStartTest
);
582 return NDIS_STATUS_SUCCESS
;
585 uint
oid_rt_pro8711_join_bss_hdl(struct oid_par_priv
*poid_par_priv
)
587 struct _adapter
*Adapter
= (struct _adapter
*)
588 (poid_par_priv
->adapter_context
);
589 uint status
= NDIS_STATUS_SUCCESS
;
590 struct ndis_802_11_ssid
*pssid
;
592 if (poid_par_priv
->type_of_oid
!= SET_OID
)
593 return NDIS_STATUS_NOT_ACCEPTED
;
594 *poid_par_priv
->bytes_needed
= (u32
)sizeof(struct ndis_802_11_ssid
);
595 *poid_par_priv
->bytes_rw
= 0;
596 if (poid_par_priv
->information_buf_len
< *poid_par_priv
->bytes_needed
)
597 return NDIS_STATUS_INVALID_LENGTH
;
598 pssid
= (struct ndis_802_11_ssid
*)poid_par_priv
->information_buf
;
599 if (mp_start_joinbss(Adapter
, pssid
) == _FAIL
)
600 status
= NDIS_STATUS_NOT_ACCEPTED
;
601 *poid_par_priv
->bytes_rw
= sizeof(struct ndis_802_11_ssid
);
605 uint
oid_rt_pro_read_register_hdl(struct oid_par_priv
608 struct _adapter
*Adapter
= (struct _adapter
*)
609 (poid_par_priv
->adapter_context
);
610 uint status
= NDIS_STATUS_SUCCESS
;
611 struct mp_rw_reg
*RegRWStruct
;
614 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
615 return NDIS_STATUS_NOT_ACCEPTED
;
616 RegRWStruct
= (struct mp_rw_reg
*)poid_par_priv
->information_buf
;
617 if ((RegRWStruct
->offset
>= 0x10250800) &&
618 (RegRWStruct
->offset
<= 0x10250FFF)) {
619 /*baseband register*/
620 /*0ffset :0x800~0xfff*/
621 offset
= (u16
)(RegRWStruct
->offset
) & 0xFFF;
622 RegRWStruct
->value
= r8712_bb_reg_read(Adapter
, offset
);
624 switch (RegRWStruct
->width
) {
626 RegRWStruct
->value
= r8712_read8(Adapter
,
627 RegRWStruct
->offset
);
630 RegRWStruct
->value
= r8712_read16(Adapter
,
631 RegRWStruct
->offset
);
634 RegRWStruct
->value
= r8712_read32(Adapter
,
635 RegRWStruct
->offset
);
638 status
= NDIS_STATUS_NOT_ACCEPTED
;
642 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
646 uint
oid_rt_pro_write_register_hdl(struct oid_par_priv
*poid_par_priv
)
648 struct _adapter
*Adapter
= (struct _adapter
*)
649 (poid_par_priv
->adapter_context
);
650 uint status
= NDIS_STATUS_SUCCESS
;
651 struct mp_rw_reg
*RegRWStruct
;
656 if (poid_par_priv
->type_of_oid
!= SET_OID
)
657 return NDIS_STATUS_NOT_ACCEPTED
;
658 RegRWStruct
= (struct mp_rw_reg
*)poid_par_priv
->information_buf
;
659 if ((RegRWStruct
->offset
>= 0x10250800) &&
660 (RegRWStruct
->offset
<= 0x10250FFF)) {
661 /*baseband register*/
662 offset
= (u16
)(RegRWStruct
->offset
) & 0xFFF;
663 value
= RegRWStruct
->value
;
664 switch (RegRWStruct
->width
) {
666 oldValue
= r8712_bb_reg_read(Adapter
, offset
);
667 oldValue
&= 0xFFFFFF00;
672 oldValue
= r8712_bb_reg_read(Adapter
, offset
);
673 oldValue
&= 0xFFFF0000;
678 r8712_bb_reg_write(Adapter
, offset
, value
);
680 switch (RegRWStruct
->width
) {
682 r8712_write8(Adapter
, RegRWStruct
->offset
,
683 (unsigned char)RegRWStruct
->value
);
686 r8712_write16(Adapter
, RegRWStruct
->offset
,
687 (unsigned short)RegRWStruct
->value
);
690 r8712_write32(Adapter
, RegRWStruct
->offset
,
691 (unsigned int)RegRWStruct
->value
);
694 status
= NDIS_STATUS_NOT_ACCEPTED
;
698 if ((status
== NDIS_STATUS_SUCCESS
) &&
699 (RegRWStruct
->offset
== HIMR
) &&
700 (RegRWStruct
->width
== 4))
701 Adapter
->ImrContent
= RegRWStruct
->value
;
706 uint
oid_rt_pro_burst_read_register_hdl(struct oid_par_priv
709 struct _adapter
*Adapter
= (struct _adapter
*)
710 (poid_par_priv
->adapter_context
);
711 struct burst_rw_reg
*pBstRwReg
;
713 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
714 return NDIS_STATUS_NOT_ACCEPTED
;
715 pBstRwReg
= (struct burst_rw_reg
*)poid_par_priv
->information_buf
;
716 r8712_read_mem(Adapter
, pBstRwReg
->offset
, (u32
)pBstRwReg
->len
,
718 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
719 return NDIS_STATUS_SUCCESS
;
722 uint
oid_rt_pro_burst_write_register_hdl(struct oid_par_priv
725 struct _adapter
*Adapter
= (struct _adapter
*)
726 (poid_par_priv
->adapter_context
);
727 struct burst_rw_reg
*pBstRwReg
;
729 if (poid_par_priv
->type_of_oid
!= SET_OID
)
730 return NDIS_STATUS_NOT_ACCEPTED
;
731 pBstRwReg
= (struct burst_rw_reg
*)poid_par_priv
->information_buf
;
732 r8712_write_mem(Adapter
, pBstRwReg
->offset
, (u32
)pBstRwReg
->len
,
734 return NDIS_STATUS_SUCCESS
;
737 uint
oid_rt_pro_write_txcmd_hdl(struct oid_par_priv
*poid_par_priv
)
739 return NDIS_STATUS_SUCCESS
;
742 uint
oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv
*poid_par_priv
)
744 struct _adapter
*Adapter
= (struct _adapter
*)
745 (poid_par_priv
->adapter_context
);
746 struct eeprom_rw_param
*pEEPROM
;
748 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
749 return NDIS_STATUS_NOT_ACCEPTED
;
750 pEEPROM
= (struct eeprom_rw_param
*)poid_par_priv
->information_buf
;
751 pEEPROM
->value
= r8712_eeprom_read16(Adapter
,
752 (u16
)(pEEPROM
->offset
>> 1));
753 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
754 return NDIS_STATUS_SUCCESS
;
757 uint
oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv
*poid_par_priv
)
759 struct _adapter
*Adapter
= (struct _adapter
*)
760 (poid_par_priv
->adapter_context
);
761 struct eeprom_rw_param
*pEEPROM
;
763 if (poid_par_priv
->type_of_oid
!= SET_OID
)
764 return NDIS_STATUS_NOT_ACCEPTED
;
765 pEEPROM
= (struct eeprom_rw_param
*)poid_par_priv
->information_buf
;
766 r8712_eeprom_write16(Adapter
, (u16
)(pEEPROM
->offset
>> 1),
768 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
769 return NDIS_STATUS_SUCCESS
;
772 uint
oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv
*poid_par_priv
)
774 struct _adapter
*Adapter
= (struct _adapter
*)
775 (poid_par_priv
->adapter_context
);
776 struct mp_wiparam
*pwi_param
;
778 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
779 return NDIS_STATUS_NOT_ACCEPTED
;
780 if (poid_par_priv
->information_buf_len
< sizeof(struct mp_wiparam
))
781 return NDIS_STATUS_INVALID_LENGTH
;
782 if (Adapter
->mppriv
.workparam
.bcompleted
== false)
783 return NDIS_STATUS_NOT_ACCEPTED
;
784 pwi_param
= (struct mp_wiparam
*)poid_par_priv
->information_buf
;
785 memcpy(pwi_param
, &Adapter
->mppriv
.workparam
,
786 sizeof(struct mp_wiparam
));
787 Adapter
->mppriv
.act_in_progress
= false;
788 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
789 return NDIS_STATUS_SUCCESS
;
792 uint
oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv
*poid_par_priv
)
794 struct _adapter
*Adapter
= (struct _adapter
*)
795 (poid_par_priv
->adapter_context
);
797 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
798 return NDIS_STATUS_NOT_ACCEPTED
;
799 if (poid_par_priv
->information_buf_len
< sizeof(uint
) * 2)
800 return NDIS_STATUS_INVALID_LENGTH
;
801 if (*(uint
*)poid_par_priv
->information_buf
== 1)
802 Adapter
->mppriv
.rx_pktloss
= 0;
803 *((uint
*)poid_par_priv
->information_buf
+1) =
804 Adapter
->mppriv
.rx_pktloss
;
805 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
806 return NDIS_STATUS_SUCCESS
;
809 uint
oid_rt_rd_attrib_mem_hdl(struct oid_par_priv
*poid_par_priv
)
811 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
812 return NDIS_STATUS_NOT_ACCEPTED
;
813 return NDIS_STATUS_SUCCESS
;
816 uint
oid_rt_wr_attrib_mem_hdl(struct oid_par_priv
*poid_par_priv
)
818 if (poid_par_priv
->type_of_oid
!= SET_OID
)
819 return NDIS_STATUS_NOT_ACCEPTED
;
820 return NDIS_STATUS_SUCCESS
;
823 uint
oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv
*poid_par_priv
)
825 struct _adapter
*Adapter
= (struct _adapter
*)
826 (poid_par_priv
->adapter_context
);
827 uint status
= NDIS_STATUS_SUCCESS
;
829 if (poid_par_priv
->type_of_oid
!= SET_OID
)
830 return NDIS_STATUS_NOT_ACCEPTED
;
831 if (r8712_setrfintfs_cmd(Adapter
, *(unsigned char *)
832 poid_par_priv
->information_buf
) == _FAIL
)
833 status
= NDIS_STATUS_NOT_ACCEPTED
;
837 uint
oid_rt_poll_rx_status_hdl(struct oid_par_priv
*poid_par_priv
)
839 struct _adapter
*Adapter
= (struct _adapter
*)
840 (poid_par_priv
->adapter_context
);
841 uint status
= NDIS_STATUS_SUCCESS
;
843 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
844 return NDIS_STATUS_NOT_ACCEPTED
;
845 memcpy(poid_par_priv
->information_buf
,
846 (unsigned char *)&Adapter
->mppriv
.rxstat
,
847 sizeof(struct recv_stat
));
848 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
852 uint
oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv
855 return NDIS_STATUS_SUCCESS
;
858 uint
oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv
861 struct _adapter
*Adapter
= (struct _adapter
*)
862 (poid_par_priv
->adapter_context
);
863 uint status
= NDIS_STATUS_SUCCESS
;
865 if (poid_par_priv
->type_of_oid
!= SET_OID
)
866 return NDIS_STATUS_NOT_ACCEPTED
;
867 if (r8712_setdatarate_cmd(Adapter
,
868 poid_par_priv
->information_buf
) != _SUCCESS
)
869 status
= NDIS_STATUS_NOT_ACCEPTED
;
873 uint
oid_rt_get_thermal_meter_hdl(struct oid_par_priv
*poid_par_priv
)
875 struct _adapter
*Adapter
= (struct _adapter
*)
876 (poid_par_priv
->adapter_context
);
877 uint status
= NDIS_STATUS_SUCCESS
;
879 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
880 return NDIS_STATUS_NOT_ACCEPTED
;
882 if (Adapter
->mppriv
.act_in_progress
== true)
883 return NDIS_STATUS_NOT_ACCEPTED
;
885 if (poid_par_priv
->information_buf_len
< sizeof(u8
))
886 return NDIS_STATUS_INVALID_LENGTH
;
888 Adapter
->mppriv
.act_in_progress
= true;
889 Adapter
->mppriv
.workparam
.bcompleted
= false;
890 Adapter
->mppriv
.workparam
.act_type
= MPT_GET_THERMAL_METER
;
891 Adapter
->mppriv
.workparam
.io_offset
= 0;
892 Adapter
->mppriv
.workparam
.io_value
= 0xFFFFFFFF;
893 r8712_GetThermalMeter(Adapter
, &Adapter
->mppriv
.workparam
.io_value
);
894 Adapter
->mppriv
.workparam
.bcompleted
= true;
895 Adapter
->mppriv
.act_in_progress
= false;
896 *(u32
*)poid_par_priv
->information_buf
=
897 Adapter
->mppriv
.workparam
.io_value
;
898 *poid_par_priv
->bytes_rw
= sizeof(u32
);
902 uint
oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv
905 struct _adapter
*Adapter
= (struct _adapter
*)
906 (poid_par_priv
->adapter_context
);
907 uint status
= NDIS_STATUS_SUCCESS
;
909 if (poid_par_priv
->type_of_oid
!= SET_OID
)
910 return NDIS_STATUS_NOT_ACCEPTED
;
911 if (poid_par_priv
->information_buf_len
< sizeof(u8
))
912 return NDIS_STATUS_INVALID_LENGTH
;
913 if (!r8712_setptm_cmd(Adapter
, *((u8
*)poid_par_priv
->information_buf
)))
914 status
= NDIS_STATUS_NOT_ACCEPTED
;
918 uint
oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv
*poid_par_priv
)
920 struct _adapter
*Adapter
= (struct _adapter
*)
921 (poid_par_priv
->adapter_context
);
922 u8 mpdatarate
[NumRates
] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff};
923 uint status
= NDIS_STATUS_SUCCESS
;
925 u8 datarates
[NumRates
];
928 if (poid_par_priv
->type_of_oid
!= SET_OID
)
929 return NDIS_STATUS_NOT_ACCEPTED
;
930 ratevalue
= *((u32
*)poid_par_priv
->information_buf
);
931 for (i
= 0; i
< NumRates
; i
++) {
932 if (ratevalue
== mpdatarate
[i
])
933 datarates
[i
] = mpdatarate
[i
];
937 if (r8712_setbasicrate_cmd(Adapter
, datarates
) != _SUCCESS
)
938 status
= NDIS_STATUS_NOT_ACCEPTED
;
942 uint
oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv
*poid_par_priv
)
944 struct _adapter
*Adapter
= (struct _adapter
*)
945 (poid_par_priv
->adapter_context
);
947 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
948 return NDIS_STATUS_NOT_ACCEPTED
;
949 if (poid_par_priv
->information_buf_len
< 8)
950 return NDIS_STATUS_INVALID_LENGTH
;
951 *poid_par_priv
->bytes_rw
= 8;
952 memcpy(poid_par_priv
->information_buf
,
953 &(Adapter
->pwrctrlpriv
.pwr_mode
), 8);
954 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
955 return NDIS_STATUS_SUCCESS
;
958 uint
oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv
*poid_par_priv
)
960 struct _adapter
*Adapter
= (struct _adapter
*)
961 (poid_par_priv
->adapter_context
);
962 uint pwr_mode
, smart_ps
;
964 if (poid_par_priv
->type_of_oid
!= SET_OID
)
965 return NDIS_STATUS_NOT_ACCEPTED
;
966 *poid_par_priv
->bytes_rw
= 0;
967 *poid_par_priv
->bytes_needed
= 8;
968 if (poid_par_priv
->information_buf_len
< 8)
969 return NDIS_STATUS_INVALID_LENGTH
;
970 pwr_mode
= *(uint
*)(poid_par_priv
->information_buf
);
971 smart_ps
= *(uint
*)((addr_t
)poid_par_priv
->information_buf
+ 4);
972 if (pwr_mode
!= Adapter
->pwrctrlpriv
.pwr_mode
|| smart_ps
!=
973 Adapter
->pwrctrlpriv
.smart_ps
)
974 r8712_set_ps_mode(Adapter
, pwr_mode
, smart_ps
);
975 *poid_par_priv
->bytes_rw
= 8;
976 return NDIS_STATUS_SUCCESS
;
979 uint
oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv
982 struct _adapter
*Adapter
= (struct _adapter
*)
983 (poid_par_priv
->adapter_context
);
984 uint status
= NDIS_STATUS_SUCCESS
;
985 struct setratable_parm
*prate_table
;
988 if (poid_par_priv
->type_of_oid
!= SET_OID
)
989 return NDIS_STATUS_NOT_ACCEPTED
;
990 *poid_par_priv
->bytes_needed
= sizeof(struct setratable_parm
);
991 if (poid_par_priv
->information_buf_len
<
992 sizeof(struct setratable_parm
))
993 return NDIS_STATUS_INVALID_LENGTH
;
994 prate_table
= (struct setratable_parm
*)poid_par_priv
->information_buf
;
995 res
= r8712_setrttbl_cmd(Adapter
, prate_table
);
997 status
= NDIS_STATUS_FAILURE
;
1001 uint
oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv
1004 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
1005 return NDIS_STATUS_NOT_ACCEPTED
;
1006 return NDIS_STATUS_SUCCESS
;
1009 uint
oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv
1012 struct _adapter
*Adapter
= (struct _adapter
*)
1013 (poid_par_priv
->adapter_context
);
1014 struct security_priv
*psecuritypriv
= &Adapter
->securitypriv
;
1015 enum ENCRY_CTRL_STATE encry_mode
= 0;
1017 *poid_par_priv
->bytes_needed
= sizeof(u8
);
1018 if (poid_par_priv
->information_buf_len
< *poid_par_priv
->bytes_needed
)
1019 return NDIS_STATUS_INVALID_LENGTH
;
1021 if (poid_par_priv
->type_of_oid
== SET_OID
) {
1022 encry_mode
= *((u8
*)poid_par_priv
->information_buf
);
1023 switch (encry_mode
) {
1025 psecuritypriv
->sw_decrypt
= false;
1026 psecuritypriv
->sw_encrypt
= false;
1029 psecuritypriv
->sw_decrypt
= true;
1030 psecuritypriv
->sw_encrypt
= true;
1032 case HW_ENCRY_SW_DECRY
:
1033 psecuritypriv
->sw_decrypt
= true;
1034 psecuritypriv
->sw_encrypt
= false;
1036 case SW_ENCRY_HW_DECRY
:
1037 psecuritypriv
->sw_decrypt
= false;
1038 psecuritypriv
->sw_encrypt
= true;
1042 if ((psecuritypriv
->sw_encrypt
== false) &&
1043 (psecuritypriv
->sw_decrypt
== false))
1044 encry_mode
= HW_CONTROL
;
1045 else if ((psecuritypriv
->sw_encrypt
== false) &&
1046 (psecuritypriv
->sw_decrypt
== true))
1047 encry_mode
= HW_ENCRY_SW_DECRY
;
1048 else if ((psecuritypriv
->sw_encrypt
== true) &&
1049 (psecuritypriv
->sw_decrypt
== false))
1050 encry_mode
= SW_ENCRY_HW_DECRY
;
1051 else if ((psecuritypriv
->sw_encrypt
== true) &&
1052 (psecuritypriv
->sw_decrypt
== true))
1053 encry_mode
= SW_CONTROL
;
1054 *(u8
*)poid_par_priv
->information_buf
= encry_mode
;
1055 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
1057 return NDIS_STATUS_SUCCESS
;
1059 /*----------------------------------------------------------------------*/
1060 uint
oid_rt_pro_add_sta_info_hdl(struct oid_par_priv
*poid_par_priv
)
1062 struct _adapter
*Adapter
= (struct _adapter
*)
1063 (poid_par_priv
->adapter_context
);
1065 uint status
= NDIS_STATUS_SUCCESS
;
1067 struct sta_info
*psta
= NULL
;
1071 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1072 return NDIS_STATUS_NOT_ACCEPTED
;
1074 *poid_par_priv
->bytes_needed
= ETH_ALEN
;
1075 if (poid_par_priv
->information_buf_len
< *poid_par_priv
->bytes_needed
)
1076 return NDIS_STATUS_INVALID_LENGTH
;
1077 macaddr
= (u8
*) poid_par_priv
->information_buf
;
1078 psta
= r8712_get_stainfo(&Adapter
->stapriv
, macaddr
);
1079 if (psta
== NULL
) { /* the sta in sta_info_queue => do nothing*/
1080 psta
= r8712_alloc_stainfo(&Adapter
->stapriv
, macaddr
);
1082 status
= NDIS_STATUS_FAILURE
;
1086 /*-------------------------------------------------------------------------*/
1087 uint
oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv
*poid_par_priv
)
1089 struct _adapter
*Adapter
= (struct _adapter
*)
1090 (poid_par_priv
->adapter_context
);
1093 uint status
= NDIS_STATUS_SUCCESS
;
1095 struct sta_info
*psta
= NULL
;
1099 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1100 return NDIS_STATUS_NOT_ACCEPTED
;
1102 *poid_par_priv
->bytes_needed
= ETH_ALEN
;
1103 if (poid_par_priv
->information_buf_len
< *poid_par_priv
->bytes_needed
)
1104 return NDIS_STATUS_INVALID_LENGTH
;
1106 macaddr
= (u8
*)poid_par_priv
->information_buf
;
1108 psta
= r8712_get_stainfo(&Adapter
->stapriv
, macaddr
);
1110 spin_lock_irqsave(&(Adapter
->stapriv
.sta_hash_lock
), irqL
);
1111 r8712_free_stainfo(Adapter
, psta
);
1112 spin_unlock_irqrestore(&(Adapter
->stapriv
.sta_hash_lock
), irqL
);
1117 /*--------------------------------------------------------------------------*/
1118 static u32
mp_query_drv_var(struct _adapter
*padapter
, u8 offset
, u32 var
)
1123 uint
oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv
*poid_par_priv
)
1125 struct _adapter
*Adapter
= (struct _adapter
*)
1126 (poid_par_priv
->adapter_context
);
1128 uint status
= NDIS_STATUS_SUCCESS
;
1130 struct DR_VARIABLE_STRUCT
*pdrv_var
;
1132 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
1133 return NDIS_STATUS_NOT_ACCEPTED
;
1134 *poid_par_priv
->bytes_needed
= sizeof(struct DR_VARIABLE_STRUCT
);
1135 if (poid_par_priv
->information_buf_len
< *poid_par_priv
->bytes_needed
)
1136 return NDIS_STATUS_INVALID_LENGTH
;
1137 pdrv_var
= (struct DR_VARIABLE_STRUCT
*)poid_par_priv
->information_buf
;
1138 pdrv_var
->variable
= mp_query_drv_var(Adapter
, pdrv_var
->offset
,
1139 pdrv_var
->variable
);
1140 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
1144 /*--------------------------------------------------------------------------*/
1145 uint
oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv
*poid_par_priv
)
1147 return NDIS_STATUS_SUCCESS
;
1149 /*------------------------------------------------------------------------*/
1150 uint
oid_rt_pro_read_efuse_hdl(struct oid_par_priv
*poid_par_priv
)
1152 struct _adapter
*Adapter
= (struct _adapter
*)
1153 (poid_par_priv
->adapter_context
);
1155 uint status
= NDIS_STATUS_SUCCESS
;
1157 struct EFUSE_ACCESS_STRUCT
*pefuse
;
1159 u16 addr
= 0, cnts
= 0;
1161 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
1162 return NDIS_STATUS_NOT_ACCEPTED
;
1163 if (poid_par_priv
->information_buf_len
<
1164 sizeof(struct EFUSE_ACCESS_STRUCT
))
1165 return NDIS_STATUS_INVALID_LENGTH
;
1166 pefuse
= (struct EFUSE_ACCESS_STRUCT
*)poid_par_priv
->information_buf
;
1167 addr
= pefuse
->start_addr
;
1168 cnts
= pefuse
->cnts
;
1169 data
= pefuse
->data
;
1170 memset(data
, 0xFF, cnts
);
1171 if ((addr
> 511) || (cnts
< 1) || (cnts
> 512) || (addr
+ cnts
) >
1173 return NDIS_STATUS_NOT_ACCEPTED
;
1174 if (r8712_efuse_access(Adapter
, true, addr
, cnts
, data
) == false)
1175 status
= NDIS_STATUS_FAILURE
;
1176 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
1179 /*------------------------------------------------------------------------*/
1180 uint
oid_rt_pro_write_efuse_hdl(struct oid_par_priv
*poid_par_priv
)
1182 struct _adapter
*Adapter
= (struct _adapter
*)
1183 (poid_par_priv
->adapter_context
);
1185 uint status
= NDIS_STATUS_SUCCESS
;
1187 struct EFUSE_ACCESS_STRUCT
*pefuse
;
1189 u16 addr
= 0, cnts
= 0;
1191 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1192 return NDIS_STATUS_NOT_ACCEPTED
;
1194 pefuse
= (struct EFUSE_ACCESS_STRUCT
*)poid_par_priv
->information_buf
;
1195 addr
= pefuse
->start_addr
;
1196 cnts
= pefuse
->cnts
;
1197 data
= pefuse
->data
;
1199 if ((addr
> 511) || (cnts
< 1) || (cnts
> 512) ||
1200 (addr
+ cnts
) > r8712_efuse_get_max_size(Adapter
))
1201 return NDIS_STATUS_NOT_ACCEPTED
;
1202 if (r8712_efuse_access(Adapter
, false, addr
, cnts
, data
) == false)
1203 status
= NDIS_STATUS_FAILURE
;
1206 /*----------------------------------------------------------------------*/
1207 uint
oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv
*poid_par_priv
)
1209 struct _adapter
*Adapter
= (struct _adapter
*)
1210 (poid_par_priv
->adapter_context
);
1211 uint status
= NDIS_STATUS_SUCCESS
;
1212 struct PGPKT_STRUCT
*ppgpkt
;
1214 *poid_par_priv
->bytes_rw
= 0;
1215 if (poid_par_priv
->information_buf_len
< sizeof(struct PGPKT_STRUCT
))
1216 return NDIS_STATUS_INVALID_LENGTH
;
1217 ppgpkt
= (struct PGPKT_STRUCT
*)poid_par_priv
->information_buf
;
1218 if (poid_par_priv
->type_of_oid
== QUERY_OID
) {
1219 if (r8712_efuse_pg_packet_read(Adapter
, ppgpkt
->offset
,
1220 ppgpkt
->data
) == true)
1221 *poid_par_priv
->bytes_rw
=
1222 poid_par_priv
->information_buf_len
;
1224 status
= NDIS_STATUS_FAILURE
;
1226 if (r8712_efuse_reg_init(Adapter
) == true) {
1227 if (r8712_efuse_pg_packet_write(Adapter
, ppgpkt
->offset
,
1228 ppgpkt
->word_en
, ppgpkt
->data
) == true)
1229 *poid_par_priv
->bytes_rw
=
1230 poid_par_priv
->information_buf_len
;
1232 status
= NDIS_STATUS_FAILURE
;
1233 r8712_efuse_reg_uninit(Adapter
);
1235 status
= NDIS_STATUS_FAILURE
;
1240 uint
oid_rt_get_efuse_current_size_hdl(struct oid_par_priv
1243 struct _adapter
*Adapter
= (struct _adapter
*)
1244 (poid_par_priv
->adapter_context
);
1245 uint status
= NDIS_STATUS_SUCCESS
;
1247 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
1248 return NDIS_STATUS_NOT_ACCEPTED
;
1249 if (poid_par_priv
->information_buf_len
< sizeof(int))
1250 return NDIS_STATUS_INVALID_LENGTH
;
1251 r8712_efuse_reg_init(Adapter
);
1252 *(int *)poid_par_priv
->information_buf
=
1253 r8712_efuse_get_current_size(Adapter
);
1254 r8712_efuse_reg_uninit(Adapter
);
1255 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
1259 uint
oid_rt_get_efuse_max_size_hdl(struct oid_par_priv
*poid_par_priv
)
1261 struct _adapter
*Adapter
= (struct _adapter
*)
1262 (poid_par_priv
->adapter_context
);
1263 uint status
= NDIS_STATUS_SUCCESS
;
1265 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
1266 return NDIS_STATUS_NOT_ACCEPTED
;
1267 if (poid_par_priv
->information_buf_len
< sizeof(u32
))
1268 return NDIS_STATUS_INVALID_LENGTH
;
1269 *(int *)poid_par_priv
->information_buf
=
1270 r8712_efuse_get_max_size(Adapter
);
1271 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
1275 uint
oid_rt_pro_efuse_hdl(struct oid_par_priv
*poid_par_priv
)
1277 uint status
= NDIS_STATUS_SUCCESS
;
1279 if (poid_par_priv
->type_of_oid
== QUERY_OID
)
1280 status
= oid_rt_pro_read_efuse_hdl(poid_par_priv
);
1282 status
= oid_rt_pro_write_efuse_hdl(poid_par_priv
);
1286 uint
oid_rt_pro_efuse_map_hdl(struct oid_par_priv
*poid_par_priv
)
1288 struct _adapter
*Adapter
= (struct _adapter
*)
1289 (poid_par_priv
->adapter_context
);
1290 uint status
= NDIS_STATUS_SUCCESS
;
1293 *poid_par_priv
->bytes_rw
= 0;
1294 if (poid_par_priv
->information_buf_len
< EFUSE_MAP_MAX_SIZE
)
1295 return NDIS_STATUS_INVALID_LENGTH
;
1296 data
= (u8
*)poid_par_priv
->information_buf
;
1297 if (poid_par_priv
->type_of_oid
== QUERY_OID
) {
1298 if (r8712_efuse_map_read(Adapter
, 0, EFUSE_MAP_MAX_SIZE
, data
))
1299 *poid_par_priv
->bytes_rw
= EFUSE_MAP_MAX_SIZE
;
1301 status
= NDIS_STATUS_FAILURE
;
1304 if (r8712_efuse_reg_init(Adapter
) == true) {
1305 if (r8712_efuse_map_write(Adapter
, 0,
1306 EFUSE_MAP_MAX_SIZE
, data
))
1307 *poid_par_priv
->bytes_rw
= EFUSE_MAP_MAX_SIZE
;
1309 status
= NDIS_STATUS_FAILURE
;
1310 r8712_efuse_reg_uninit(Adapter
);
1312 status
= NDIS_STATUS_FAILURE
;
1318 uint
oid_rt_set_bandwidth_hdl(struct oid_par_priv
*poid_par_priv
)
1320 struct _adapter
*Adapter
= (struct _adapter
*)
1321 (poid_par_priv
->adapter_context
);
1322 uint status
= NDIS_STATUS_SUCCESS
;
1325 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1326 return NDIS_STATUS_NOT_ACCEPTED
;
1327 if (poid_par_priv
->information_buf_len
< sizeof(u32
))
1328 return NDIS_STATUS_INVALID_LENGTH
;
1329 bandwidth
= *((u32
*)poid_par_priv
->information_buf
);/*4*/
1330 if (bandwidth
!= HT_CHANNEL_WIDTH_20
)
1331 bandwidth
= HT_CHANNEL_WIDTH_40
;
1332 Adapter
->mppriv
.curr_bandwidth
= (u8
)bandwidth
;
1333 r8712_SwitchBandwidth(Adapter
);
1337 uint
oid_rt_set_crystal_cap_hdl(struct oid_par_priv
*poid_par_priv
)
1339 struct _adapter
*Adapter
= (struct _adapter
*)
1340 (poid_par_priv
->adapter_context
);
1341 uint status
= NDIS_STATUS_SUCCESS
;
1342 u32 crystal_cap
= 0;
1344 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1345 return NDIS_STATUS_NOT_ACCEPTED
;
1346 if (poid_par_priv
->information_buf_len
< sizeof(u32
))
1347 return NDIS_STATUS_INVALID_LENGTH
;
1348 crystal_cap
= *((u32
*)poid_par_priv
->information_buf
);/*4*/
1349 if (crystal_cap
> 0xf)
1350 return NDIS_STATUS_NOT_ACCEPTED
;
1351 Adapter
->mppriv
.curr_crystalcap
= crystal_cap
;
1352 r8712_SetCrystalCap(Adapter
);
1356 uint
oid_rt_set_rx_packet_type_hdl(struct oid_par_priv
1359 struct _adapter
*Adapter
= (struct _adapter
*)
1360 (poid_par_priv
->adapter_context
);
1364 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1365 return NDIS_STATUS_NOT_ACCEPTED
;
1366 if (poid_par_priv
->information_buf_len
< sizeof(u8
))
1367 return NDIS_STATUS_INVALID_LENGTH
;
1368 rx_pkt_type
= *((u8
*)poid_par_priv
->information_buf
);/*4*/
1369 rcr_val32
= r8712_read32(Adapter
, RCR
);/*RCR = 0x10250048*/
1370 rcr_val32
&= ~(RCR_CBSSID
| RCR_AB
| RCR_AM
| RCR_APM
| RCR_AAP
);
1371 switch (rx_pkt_type
) {
1372 case RX_PKT_BROADCAST
:
1373 rcr_val32
|= (RCR_AB
| RCR_AM
| RCR_APM
| RCR_AAP
| RCR_ACRC32
);
1375 case RX_PKT_DEST_ADDR
:
1376 rcr_val32
|= (RCR_AB
| RCR_AM
| RCR_APM
| RCR_AAP
| RCR_ACRC32
);
1378 case RX_PKT_PHY_MATCH
:
1379 rcr_val32
|= (RCR_APM
|RCR_ACRC32
);
1382 rcr_val32
&= ~(RCR_AAP
|
1389 if (rx_pkt_type
== RX_PKT_DEST_ADDR
)
1390 Adapter
->mppriv
.check_mp_pkt
= 1;
1392 Adapter
->mppriv
.check_mp_pkt
= 0;
1393 r8712_write32(Adapter
, RCR
, rcr_val32
);
1394 return NDIS_STATUS_SUCCESS
;
1397 uint
oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv
1400 struct _adapter
*Adapter
= (struct _adapter
*)
1401 (poid_par_priv
->adapter_context
);
1404 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1405 return NDIS_STATUS_NOT_ACCEPTED
;
1406 if (poid_par_priv
->information_buf_len
< sizeof(u32
))
1407 return NDIS_STATUS_INVALID_LENGTH
;
1408 txagc
= *(u32
*)poid_par_priv
->information_buf
;
1409 r8712_SetTxAGCOffset(Adapter
, txagc
);
1410 return NDIS_STATUS_SUCCESS
;
1413 uint
oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv
1416 struct _adapter
*Adapter
= (struct _adapter
*)
1417 (poid_par_priv
->adapter_context
);
1418 uint status
= NDIS_STATUS_SUCCESS
;
1419 struct mlme_priv
*pmlmepriv
= &Adapter
->mlmepriv
;
1420 struct mp_priv
*pmppriv
= &Adapter
->mppriv
;
1423 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1424 return NDIS_STATUS_NOT_ACCEPTED
;
1426 if (poid_par_priv
->information_buf_len
< sizeof(u32
))
1427 return NDIS_STATUS_INVALID_LENGTH
;
1429 type
= *(u32
*)poid_par_priv
->information_buf
;
1431 if (_LOOPBOOK_MODE_
== type
) {
1432 pmppriv
->mode
= type
;
1433 set_fwstate(pmlmepriv
, WIFI_MP_LPBK_STATE
); /*append txdesc*/
1434 } else if (_2MAC_MODE_
== type
) {
1435 pmppriv
->mode
= type
;
1436 _clr_fwstate_(pmlmepriv
, WIFI_MP_LPBK_STATE
);
1438 status
= NDIS_STATUS_NOT_ACCEPTED
;
1441 /*--------------------------------------------------------------------------*/
1443 unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv
*poid_par_priv
)
1447 /*-------------------------------------------------------------------------*/
1448 uint
oid_rt_set_power_down_hdl(struct oid_par_priv
*poid_par_priv
)
1452 if (poid_par_priv
->type_of_oid
!= SET_OID
)
1453 return NDIS_STATUS_NOT_ACCEPTED
;
1454 bpwrup
= *(u8
*)poid_par_priv
->information_buf
;
1455 /*CALL the power_down function*/
1456 return NDIS_STATUS_SUCCESS
;
1459 /*-------------------------------------------------------------------------- */
1460 uint
oid_rt_get_power_mode_hdl(struct oid_par_priv
*poid_par_priv
)
1462 struct _adapter
*Adapter
= (struct _adapter
*)
1463 (poid_par_priv
->adapter_context
);
1465 if (poid_par_priv
->type_of_oid
!= QUERY_OID
)
1466 return NDIS_STATUS_NOT_ACCEPTED
;
1467 if (poid_par_priv
->information_buf_len
< sizeof(u32
))
1468 return NDIS_STATUS_INVALID_LENGTH
;
1469 *(int *)poid_par_priv
->information_buf
=
1470 Adapter
->registrypriv
.low_power
? POWER_LOW
: POWER_NORMAL
;
1471 *poid_par_priv
->bytes_rw
= poid_par_priv
->information_buf_len
;
1472 return NDIS_STATUS_SUCCESS
;