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;