mm: compaction: ensure that the compaction free scanner does not move to the next...
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / staging / rtl8712 / rtl871x_mp_ioctl.c
blob5eb461b4a491387446b518982454fd024a36cf68
1 /******************************************************************************
2 * rtl871x_mp_ioctl.c
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
14 * more details.
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;
50 else
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;
58 } else
59 status = NDIS_STATUS_INVALID_LENGTH;
60 } else {
61 status = NDIS_STATUS_NOT_ACCEPTED;
63 return status;
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;
72 u16 offset;
73 u32 value;
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);
85 return status;
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;
94 u16 offset;
95 u32 value;
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;
108 return status;
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;
117 u8 path;
118 u8 offset;
119 u32 value;
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);
132 return status;
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;
141 u8 path;
142 u8 offset;
143 u32 value;
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;
157 return status;
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;
169 unsigned long irqL;
170 int res = _SUCCESS;
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;
179 bssid.IELength = 0;
180 length = r8712_get_ndis_wlan_bssid_ex_sz(&bssid);
181 if (length % 4) {
182 /*round up to multiple of 4 bytes.*/
183 bssid.Length = ((length >> 2) + 1) << 2;
184 } else
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);
199 if (psta)
200 r8712_free_stainfo(padapter, psta);
201 psta = r8712_alloc_stainfo(&padapter->stapriv, bssid.MacAddress);
202 if (psta == NULL) {
203 res = _FAIL;
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);
216 return res;
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;
226 unsigned long irqL;
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);
236 if (psta)
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));
242 end_of_mp_stop_test:
243 spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
244 return _SUCCESS;
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)
254 return _FAIL;
255 if (check_fwstate(pmlmepriv, _FW_LINKED) == false)
256 return _FAIL;
257 _clr_fwstate_(pmlmepriv, _FW_LINKED);
258 res = r8712_setassocsta_cmd(padapter, pmppriv->network_macaddr);
259 set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
260 return res;
263 uint oid_rt_pro_set_data_rate_hdl(struct oid_par_priv
264 *poid_par_priv)
266 struct _adapter *Adapter = (struct _adapter *)
267 (poid_par_priv->adapter_context);
268 uint status = NDIS_STATUS_SUCCESS;
269 u32 ratevalue;
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);
280 return status;
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;
288 u32 mode;
289 u8 val8;
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);
309 return status;
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;
322 return status;
325 uint oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv
326 *poid_par_priv)
328 struct _adapter *Adapter = (struct _adapter *)
329 (poid_par_priv->adapter_context);
330 uint status = NDIS_STATUS_SUCCESS;
331 u32 Channel;
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);
338 if (Channel > 14)
339 return NDIS_STATUS_NOT_ACCEPTED;
340 Adapter->mppriv.curr_ch = Channel;
341 r8712_SetChannel(Adapter);
342 return status;
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;
350 u32 antenna;
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);
360 return status;
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;
369 u32 tx_pwr_idx;
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);
380 return status;
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;
392 return status;
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;
398 } else
399 status = NDIS_STATUS_INVALID_LENGTH;
400 return status;
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;
412 return status;
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;
418 } else
419 status = NDIS_STATUS_INVALID_LENGTH;
420 return status;
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;
432 return status;
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;
438 } else
439 status = NDIS_STATUS_INVALID_LENGTH;
440 return status;
443 uint oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv
444 *poid_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
456 *poid_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;
467 } else
468 status = NDIS_STATUS_INVALID_LENGTH;
469 return status;
472 uint oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv
473 *poid_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
485 *poid_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
501 *poid_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
517 *poid_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
530 *poid_par_priv)
532 struct _adapter *Adapter = (struct _adapter *)
533 (poid_par_priv->adapter_context);
534 u32 bStartTest;
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
544 *poid_par_priv)
546 struct _adapter *Adapter = (struct _adapter *)
547 (poid_par_priv->adapter_context);
548 u32 bStartTest;
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
558 *poid_par_priv)
560 struct _adapter *Adapter = (struct _adapter *)
561 (poid_par_priv->adapter_context);
562 u32 bStartTest;
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
572 *poid_par_priv)
574 struct _adapter *Adapter = (struct _adapter *)
575 (poid_par_priv->adapter_context);
576 u32 bStartTest;
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);
602 return status;
605 uint oid_rt_pro_read_register_hdl(struct oid_par_priv
606 *poid_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;
612 u16 offset;
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);
623 } else {
624 switch (RegRWStruct->width) {
625 case 1:
626 RegRWStruct->value = r8712_read8(Adapter,
627 RegRWStruct->offset);
628 break;
629 case 2:
630 RegRWStruct->value = r8712_read16(Adapter,
631 RegRWStruct->offset);
632 break;
633 case 4:
634 RegRWStruct->value = r8712_read32(Adapter,
635 RegRWStruct->offset);
636 break;
637 default:
638 status = NDIS_STATUS_NOT_ACCEPTED;
639 break;
642 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
643 return status;
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;
652 u16 offset;
653 u32 value;
654 u32 oldValue = 0;
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) {
665 case 1:
666 oldValue = r8712_bb_reg_read(Adapter, offset);
667 oldValue &= 0xFFFFFF00;
668 value &= 0x000000FF;
669 value |= oldValue;
670 break;
671 case 2:
672 oldValue = r8712_bb_reg_read(Adapter, offset);
673 oldValue &= 0xFFFF0000;
674 value &= 0x0000FFFF;
675 value |= oldValue;
676 break;
678 r8712_bb_reg_write(Adapter, offset, value);
679 } else {
680 switch (RegRWStruct->width) {
681 case 1:
682 r8712_write8(Adapter, RegRWStruct->offset,
683 (unsigned char)RegRWStruct->value);
684 break;
685 case 2:
686 r8712_write16(Adapter, RegRWStruct->offset,
687 (unsigned short)RegRWStruct->value);
688 break;
689 case 4:
690 r8712_write32(Adapter, RegRWStruct->offset,
691 (unsigned int)RegRWStruct->value);
692 break;
693 default:
694 status = NDIS_STATUS_NOT_ACCEPTED;
695 break;
698 if ((status == NDIS_STATUS_SUCCESS) &&
699 (RegRWStruct->offset == HIMR) &&
700 (RegRWStruct->width == 4))
701 Adapter->ImrContent = RegRWStruct->value;
703 return status;
706 uint oid_rt_pro_burst_read_register_hdl(struct oid_par_priv
707 *poid_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,
717 pBstRwReg->Data);
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
723 *poid_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,
733 pBstRwReg->Data);
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),
767 pEEPROM->value);
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;
834 return status;
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;
849 return status;
852 uint oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv
853 *poid_par_priv)
855 return NDIS_STATUS_SUCCESS;
858 uint oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv
859 *poid_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;
870 return status;
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;
887 /*init workparam*/
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);
899 return status;
902 uint oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv
903 *poid_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;
915 return status;
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;
924 u32 ratevalue;
925 u8 datarates[NumRates];
926 int i;
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];
934 else
935 datarates[i] = 0xff;
937 if (r8712_setbasicrate_cmd(Adapter, datarates) != _SUCCESS)
938 status = NDIS_STATUS_NOT_ACCEPTED;
939 return status;
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
980 *poid_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;
986 u8 res;
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);
996 if (res == _FAIL)
997 status = NDIS_STATUS_FAILURE;
998 return status;
1001 uint oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv
1002 *poid_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
1010 *poid_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) {
1024 case HW_CONTROL:
1025 psecuritypriv->sw_decrypt = false;
1026 psecuritypriv->sw_encrypt = false;
1027 break;
1028 case SW_CONTROL:
1029 psecuritypriv->sw_decrypt = true;
1030 psecuritypriv->sw_encrypt = true;
1031 break;
1032 case HW_ENCRY_SW_DECRY:
1033 psecuritypriv->sw_decrypt = true;
1034 psecuritypriv->sw_encrypt = false;
1035 break;
1036 case SW_ENCRY_HW_DECRY:
1037 psecuritypriv->sw_decrypt = false;
1038 psecuritypriv->sw_encrypt = true;
1039 break;
1041 } else {
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;
1068 u8 *macaddr;
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);
1081 if (psta == NULL)
1082 status = NDIS_STATUS_FAILURE;
1084 return status;
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);
1092 unsigned long irqL;
1093 uint status = NDIS_STATUS_SUCCESS;
1095 struct sta_info *psta = NULL;
1096 u8 *macaddr;
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);
1109 if (psta != NULL) {
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);
1115 return status;
1117 /*--------------------------------------------------------------------------*/
1118 static u32 mp_query_drv_var(struct _adapter *padapter, u8 offset, u32 var)
1120 return 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;
1141 return status;
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;
1158 u8 *data;
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) >
1172 EFUSE_MAX_SIZE)
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;
1177 return status;
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;
1188 u8 *data;
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;
1204 return status;
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;
1223 else
1224 status = NDIS_STATUS_FAILURE;
1225 } else {
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;
1231 else
1232 status = NDIS_STATUS_FAILURE;
1233 r8712_efuse_reg_uninit(Adapter);
1234 } else
1235 status = NDIS_STATUS_FAILURE;
1237 return status;
1240 uint oid_rt_get_efuse_current_size_hdl(struct oid_par_priv
1241 *poid_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;
1256 return status;
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;
1272 return status;
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);
1281 else
1282 status = oid_rt_pro_write_efuse_hdl(poid_par_priv);
1283 return status;
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;
1291 u8 *data;
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;
1300 else
1301 status = NDIS_STATUS_FAILURE;
1302 } else {
1303 /* SET_OID */
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;
1308 else
1309 status = NDIS_STATUS_FAILURE;
1310 r8712_efuse_reg_uninit(Adapter);
1311 } else {
1312 status = NDIS_STATUS_FAILURE;
1315 return status;
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;
1323 u32 bandwidth;
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);
1334 return status;
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);
1353 return status;
1356 uint oid_rt_set_rx_packet_type_hdl(struct oid_par_priv
1357 *poid_par_priv)
1359 struct _adapter *Adapter = (struct _adapter *)
1360 (poid_par_priv->adapter_context);
1361 u8 rx_pkt_type;
1362 u32 rcr_val32;
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);
1374 break;
1375 case RX_PKT_DEST_ADDR:
1376 rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32);
1377 break;
1378 case RX_PKT_PHY_MATCH:
1379 rcr_val32 |= (RCR_APM|RCR_ACRC32);
1380 break;
1381 default:
1382 rcr_val32 &= ~(RCR_AAP |
1383 RCR_APM |
1384 RCR_AM |
1385 RCR_AB |
1386 RCR_ACRC32);
1387 break;
1389 if (rx_pkt_type == RX_PKT_DEST_ADDR)
1390 Adapter->mppriv.check_mp_pkt = 1;
1391 else
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
1398 *poid_par_priv)
1400 struct _adapter *Adapter = (struct _adapter *)
1401 (poid_par_priv->adapter_context);
1402 u32 txagc;
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
1414 *poid_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;
1421 u32 type;
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);
1437 } else
1438 status = NDIS_STATUS_NOT_ACCEPTED;
1439 return status;
1441 /*--------------------------------------------------------------------------*/
1442 /*Linux*/
1443 unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)
1445 return _SUCCESS;
1447 /*-------------------------------------------------------------------------*/
1448 uint oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv)
1450 u8 bpwrup;
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;