net: wireless: rockchip_wlan: add rtl8723cs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723cs / core / rtw_ioctl_rtl.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #define  _RTW_IOCTL_RTL_C_
21
22 #include <drv_types.h>
23
24 #ifdef CONFIG_MP_INCLUDED
25         #include <rtw_mp_ioctl.h>
26 #endif
27
28 struct oid_obj_priv oid_rtl_seg_01_01[] = {
29         {1, &oid_null_function},                                                                                /* 0x80 */
30         {1, &oid_null_function},                                                                                /* 0x81 */
31         {1, &oid_null_function},                                                                                /* 0x82 */
32         {1, &oid_null_function},                                                                                /* 0x83 */ /* OID_RT_SET_SNIFFER_MODE */
33         {1, &oid_rt_get_signal_quality_hdl},                                                    /* 0x84 */
34         {1, &oid_rt_get_small_packet_crc_hdl},                                          /* 0x85 */
35         {1, &oid_rt_get_middle_packet_crc_hdl},                                         /* 0x86 */
36         {1, &oid_rt_get_large_packet_crc_hdl},                                          /* 0x87 */
37         {1, &oid_rt_get_tx_retry_hdl},                                                          /* 0x88 */
38         {1, &oid_rt_get_rx_retry_hdl},                                                          /* 0x89 */
39         {1, &oid_rt_pro_set_fw_dig_state_hdl},                                          /* 0x8A */
40         {1, &oid_rt_pro_set_fw_ra_state_hdl}    ,                                               /* 0x8B */
41         {1, &oid_null_function},                                                                                /* 0x8C */
42         {1, &oid_null_function},                                                                                /* 0x8D */
43         {1, &oid_null_function},                                                                                /* 0x8E */
44         {1, &oid_null_function},                                                                                /* 0x8F */
45         {1, &oid_rt_get_rx_total_packet_hdl},                                                   /* 0x90 */
46         {1, &oid_rt_get_tx_beacon_ok_hdl},                                                      /* 0x91 */
47         {1, &oid_rt_get_tx_beacon_err_hdl},                                                     /* 0x92 */
48         {1, &oid_rt_get_rx_icv_err_hdl},                                                                /* 0x93 */
49         {1, &oid_rt_set_encryption_algorithm_hdl},                                      /* 0x94 */
50         {1, &oid_null_function},                                                                                /* 0x95 */
51         {1, &oid_rt_get_preamble_mode_hdl},                                                     /* 0x96 */
52         {1, &oid_null_function},                                                                                /* 0x97 */
53         {1, &oid_rt_get_ap_ip_hdl},                                                                     /* 0x98 */
54         {1, &oid_rt_get_channelplan_hdl},                                                       /* 0x99  */
55         {1, &oid_rt_set_preamble_mode_hdl},                                                     /* 0x9A */
56         {1, &oid_rt_set_bcn_intvl_hdl},                                                         /* 0x9B */
57         {1, &oid_null_function},                                                                                /* 0x9C */
58         {1, &oid_rt_dedicate_probe_hdl},                                                                /* 0x9D */
59         {1, &oid_null_function},                                                                                /* 0x9E */
60         {1, &oid_null_function},                                                                                /* 0x9F */
61         {1, &oid_null_function},                                                                                /* 0xA0 */
62         {1, &oid_null_function},                                                                                /* 0xA1 */
63         {1, &oid_null_function},                                                                                /* 0xA2 */
64         {1, &oid_null_function},                                                                                /* 0xA3 */
65         {1, &oid_null_function},                                                                                /* 0xA4 */
66         {1, &oid_null_function},                                                                                /* 0xA5 */
67         {1, &oid_null_function},                                                                                /* 0xA6 */
68         {1, &oid_rt_get_total_tx_bytes_hdl},                                                    /* 0xA7 */
69         {1, &oid_rt_get_total_rx_bytes_hdl},                                                    /* 0xA8 */
70         {1, &oid_rt_current_tx_power_level_hdl},                                                /* 0xA9  */
71         {1, &oid_rt_get_enc_key_mismatch_count_hdl},                            /* 0xAA */
72         {1, &oid_rt_get_enc_key_match_count_hdl},                                       /* 0xAB */
73         {1, &oid_rt_get_channel_hdl},                                                           /* 0xAC */
74         {1, &oid_rt_set_channelplan_hdl},                                                               /* 0xAD */
75         {1, &oid_rt_get_hardware_radio_off_hdl},                                                /* 0xAE */
76         {1, &oid_null_function},                                                                                /* 0xAF */
77         {1, &oid_null_function},                                                                                /* 0xB0 */
78         {1, &oid_null_function},                                                                                /* 0xB1 */
79         {1, &oid_null_function},                                                                                /* 0xB2 */
80         {1, &oid_null_function},                                                                                /* 0xB3 */
81         {1, &oid_rt_get_key_mismatch_hdl},                                                      /* 0xB4 */
82         {1, &oid_null_function},                                                                                /* 0xB5 */
83         {1, &oid_null_function},                                                                                /* 0xB6 */
84         {1, &oid_null_function},                                                                                /* 0xB7 */
85         {1, &oid_null_function},                                                                                /* 0xB8 */
86         {1, &oid_null_function},                                                                                /* 0xB9  */
87         {1, &oid_null_function},                                                                                /* 0xBA */
88         {1, &oid_rt_supported_wireless_mode_hdl},                                       /* 0xBB */
89         {1, &oid_rt_get_channel_list_hdl},                                                      /* 0xBC */
90         {1, &oid_rt_get_scan_in_progress_hdl},                                          /* 0xBD */
91         {1, &oid_null_function},                                                                                /* 0xBE */
92         {1, &oid_null_function},                                                                                /* 0xBF */
93         {1, &oid_null_function},                                                                                /* 0xC0 */
94         {1, &oid_rt_forced_data_rate_hdl},                                                      /* 0xC1 */
95         {1, &oid_rt_wireless_mode_for_scan_list_hdl},                                   /* 0xC2 */
96         {1, &oid_rt_get_bss_wireless_mode_hdl},                                         /* 0xC3 */
97         {1, &oid_rt_scan_with_magic_packet_hdl},                                        /* 0xC4 */
98         {1, &oid_null_function},                                                                                /* 0xC5 */
99         {1, &oid_null_function},                                                                                /* 0xC6 */
100         {1, &oid_null_function},                                                                                /* 0xC7 */
101         {1, &oid_null_function},                                                                                /* 0xC8 */
102         {1, &oid_null_function},                                                                                /* 0xC9  */
103         {1, &oid_null_function},                                                                                /* 0xCA */
104         {1, &oid_null_function},                                                                                /* 0xCB */
105         {1, &oid_null_function},                                                                                /* 0xCC */
106         {1, &oid_null_function},                                                                                /* 0xCD */
107         {1, &oid_null_function},                                                                                /* 0xCE */
108         {1, &oid_null_function},                                                                                /* 0xCF */
109
110 };
111
112 struct oid_obj_priv oid_rtl_seg_01_03[] = {
113         {1, &oid_rt_ap_get_associated_station_list_hdl},                                /* 0x00 */
114         {1, &oid_null_function},                                                                                /* 0x01 */
115         {1, &oid_rt_ap_switch_into_ap_mode_hdl},                                        /* 0x02 */
116         {1, &oid_null_function},                                                                                /* 0x03 */
117         {1, &oid_rt_ap_supported_hdl},                                                          /* 0x04 */
118         {1, &oid_rt_ap_set_passphrase_hdl},                                                     /* 0x05 */
119
120 };
121
122 struct oid_obj_priv oid_rtl_seg_01_11[] = {
123         {1, &oid_null_function},                                        /* 0xC0 OID_RT_PRO_RX_FILTER     */
124         {1, &oid_null_function},                                        /* 0xC1 OID_CE_USB_WRITE_REGISTRY */
125         {1, &oid_null_function},                                        /* 0xC2 OID_CE_USB_READ_REGISTRY */
126         {1, &oid_null_function},                                        /* 0xC3 OID_RT_PRO_SET_INITIAL_GAIN */
127         {1, &oid_null_function},                                        /* 0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE */
128         {1, &oid_null_function},                                        /* 0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE */
129         {1, &oid_null_function},                                        /* 0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP */
130         {1, &oid_null_function},                                        /* 0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP */
131         {1, &oid_rt_pro_rf_write_registry_hdl}, /* 0xC8  */
132         {1, &oid_rt_pro_rf_read_registry_hdl},  /* 0xC9  */
133         {1, &oid_null_function}                                 /* 0xCA OID_RT_PRO_QUERY_RF_TYPE */
134
135 };
136
137 struct oid_obj_priv oid_rtl_seg_03_00[] = {
138         {1, &oid_null_function},                                                                                /* 0x00 */
139         {1, &oid_rt_get_connect_state_hdl},                                                     /* 0x01 */
140         {1, &oid_null_function},                                                                                /* 0x02 */
141         {1, &oid_null_function},                                                                                /* 0x03 */
142         {1, &oid_rt_set_default_key_id_hdl},                                                    /* 0x04 */
143
144
145 };
146
147
148 /* **************  oid_rtl_seg_01_01 section start ************** */
149
150 NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv *poid_par_priv)
151 {
152         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
153 #if 0
154         PADAPTER                Adapter = (PADAPTER)(poid_par_priv->adapter_context);
155         _irqL                   oldirql;
156
157
158         if (poid_par_priv->type_of_oid != SET_OID) {
159                 status = NDIS_STATUS_NOT_ACCEPTED;
160                 return status;
161         }
162
163         _irqlevel_changed_(&oldirql, LOWER);
164         if (poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) {
165                 /* DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));       */
166                 if (!rtw_setfwdig_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf)))
167                         status = NDIS_STATUS_NOT_ACCEPTED;
168
169         } else
170                 status = NDIS_STATUS_NOT_ACCEPTED;
171         _irqlevel_changed_(&oldirql, RAISE);
172 #endif
173         return status;
174 }
175 /* ----------------------------------------------------------------------------- */
176 NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv *poid_par_priv)
177 {
178
179         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
180 #if 0
181         PADAPTER                Adapter = (PADAPTER)(poid_par_priv->adapter_context);
182         _irqL                   oldirql;
183
184         if (poid_par_priv->type_of_oid != SET_OID) {
185                 status = NDIS_STATUS_NOT_ACCEPTED;
186                 return status;
187         }
188
189
190         _irqlevel_changed_(&oldirql, LOWER);
191
192         if (poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) {
193                 /* DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));        */
194                 if (!rtw_setfwra_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf)))
195                         status = NDIS_STATUS_NOT_ACCEPTED;
196
197         } else
198                 status = NDIS_STATUS_NOT_ACCEPTED;
199         _irqlevel_changed_(&oldirql, RAISE);
200 #endif
201         return status;
202 }
203 /* ----------------------------------------------------------------------------- */
204 NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv)
205 {
206         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
207         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
208
209         /* DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl\n")); */
210         if (poid_par_priv->type_of_oid != QUERY_OID) {
211                 status = NDIS_STATUS_NOT_ACCEPTED;
212                 return status;
213         }
214
215 #if 0
216         if (pMgntInfo->mAssoc || pMgntInfo->mIbss) {
217                 ulInfo = pAdapter->RxStats.SignalQuality;
218                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
219         } else {
220                 ulInfo = 0xffffffff; /* It stands for -1 in 4-byte integer. */
221         }
222         break;
223 #endif
224
225         return status;
226 }
227
228 /* ------------------------------------------------------------------------------ */
229
230 NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
231 {
232         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
233         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
234
235         if (poid_par_priv->type_of_oid != QUERY_OID) {
236                 status = NDIS_STATUS_NOT_ACCEPTED;
237                 return status;
238         }
239
240         if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
241                 *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr;
242                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
243         } else
244                 status = NDIS_STATUS_INVALID_LENGTH;
245
246         return status;
247 }
248 /* ------------------------------------------------------------------------------ */
249 NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
250 {
251         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
252         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
253
254         if (poid_par_priv->type_of_oid != QUERY_OID) {
255                 status = NDIS_STATUS_NOT_ACCEPTED;
256                 return status;
257         }
258
259         if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
260                 *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr;
261                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
262         } else
263                 status = NDIS_STATUS_INVALID_LENGTH;
264
265
266         return status;
267 }
268 /* ------------------------------------------------------------------------------ */
269 NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
270 {
271         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
272         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
273
274         if (poid_par_priv->type_of_oid != QUERY_OID) {
275                 status = NDIS_STATUS_NOT_ACCEPTED;
276                 return status;
277         }
278
279         if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
280                 *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr;
281                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
282         } else
283                 status = NDIS_STATUS_INVALID_LENGTH;
284
285
286         return status;
287 }
288
289 /* ------------------------------------------------------------------------------ */
290 NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv)
291 {
292         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
293         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
294
295         if (poid_par_priv->type_of_oid != QUERY_OID) {
296                 status = NDIS_STATUS_NOT_ACCEPTED;
297                 return status;
298         }
299
300         return status;
301 }
302 NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv)
303 {
304         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
305         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
306
307         if (poid_par_priv->type_of_oid != QUERY_OID) {
308                 status = NDIS_STATUS_NOT_ACCEPTED;
309                 return status;
310         }
311         *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
312         return status;
313 }
314 /* ------------------------------------------------------------------------------ */
315 NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv)
316 {
317         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
318         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
319
320         if (poid_par_priv->type_of_oid != QUERY_OID) {
321                 status = NDIS_STATUS_NOT_ACCEPTED;
322                 return status;
323         }
324         if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
325                 *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop;
326                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
327         } else
328                 status = NDIS_STATUS_INVALID_LENGTH;
329
330
331         return status;
332 }
333 /* ------------------------------------------------------------------------------ */
334 NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv)
335 {
336         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
337         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
338
339         if (poid_par_priv->type_of_oid != QUERY_OID) {
340                 status = NDIS_STATUS_NOT_ACCEPTED;
341                 return status;
342         }
343
344         return status;
345 }
346 NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv)
347 {
348         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
349         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
350
351         if (poid_par_priv->type_of_oid != QUERY_OID) {
352                 status = NDIS_STATUS_NOT_ACCEPTED;
353                 return status;
354         }
355
356         return status;
357 }
358 /* ------------------------------------------------------------------------------ */
359 NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv)
360 {
361         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
362         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
363
364         if (poid_par_priv->type_of_oid != QUERY_OID) {
365                 status = NDIS_STATUS_NOT_ACCEPTED;
366                 return status;
367         }
368         if (poid_par_priv->information_buf_len >= sizeof(u32)) {
369                 /* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */
370                 *(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err;
371                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
372         } else
373                 status = NDIS_STATUS_INVALID_LENGTH ;
374
375
376         return status;
377 }
378 /* ------------------------------------------------------------------------------ */
379 NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv *poid_par_priv)
380 {
381         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
382         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
383
384         if (poid_par_priv->type_of_oid != SET_OID) {
385                 status = NDIS_STATUS_NOT_ACCEPTED;
386                 return status;
387         }
388
389         return status;
390 }
391 /* ------------------------------------------------------------------------------ */
392 NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
393 {
394         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
395         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
396         ULONG                   preamblemode = 0 ;
397
398         if (poid_par_priv->type_of_oid != QUERY_OID) {
399                 status = NDIS_STATUS_NOT_ACCEPTED;
400                 return status;
401         }
402         if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
403                 if (padapter->registrypriv.preamble == PREAMBLE_LONG)
404                         preamblemode = 0;
405                 else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
406                         preamblemode = 1;
407                 else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
408                         preamblemode = 2;
409
410
411                 *(ULONG *)poid_par_priv->information_buf = preamblemode ;
412                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
413         } else
414                 status = NDIS_STATUS_INVALID_LENGTH ;
415         return status;
416 }
417 /* ------------------------------------------------------------------------------ */
418 NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv)
419 {
420         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
421         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
422
423         if (poid_par_priv->type_of_oid != QUERY_OID) {
424                 status = NDIS_STATUS_NOT_ACCEPTED;
425                 return status;
426         }
427
428         return status;
429 }
430
431 NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
432 {
433         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
434         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
435
436         if (poid_par_priv->type_of_oid != QUERY_OID) {
437                 status = NDIS_STATUS_NOT_ACCEPTED;
438                 return status;
439         }
440         *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
441         *(u16 *)poid_par_priv->information_buf = padapter->mlmepriv.ChannelPlan ;
442
443         return status;
444 }
445 NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv *poid_par_priv)
446 {
447         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
448         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
449
450         if (poid_par_priv->type_of_oid != SET_OID) {
451                 status = NDIS_STATUS_NOT_ACCEPTED;
452                 return status;
453         }
454
455         padapter->mlmepriv.ChannelPlan  = *(u16 *)poid_par_priv->information_buf ;
456
457         return status;
458 }
459 /* ------------------------------------------------------------------------------ */
460 NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
461 {
462         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
463         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
464         ULONG                   preamblemode = 0;
465         if (poid_par_priv->type_of_oid != SET_OID) {
466                 status = NDIS_STATUS_NOT_ACCEPTED;
467                 return status;
468         }
469
470         if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
471                 preamblemode = *(ULONG *)poid_par_priv->information_buf ;
472                 if (preamblemode == 0)
473                         padapter->registrypriv.preamble = PREAMBLE_LONG;
474                 else if (preamblemode == 1)
475                         padapter->registrypriv.preamble = PREAMBLE_AUTO;
476                 else if (preamblemode == 2)
477                         padapter->registrypriv.preamble = PREAMBLE_SHORT;
478
479                 *(ULONG *)poid_par_priv->information_buf = preamblemode ;
480                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
481         } else
482                 status = NDIS_STATUS_INVALID_LENGTH ;
483
484         return status;
485 }
486 /* ------------------------------------------------------------------------------ */
487 NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv)
488 {
489         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
490         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
491
492         if (poid_par_priv->type_of_oid != SET_OID) {
493                 status = NDIS_STATUS_NOT_ACCEPTED;
494                 return status;
495         }
496
497         return status;
498 }
499 NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv *poid_par_priv)
500 {
501         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
502         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
503
504         return status;
505 }
506 /* ------------------------------------------------------------------------------ */
507 NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv *poid_par_priv)
508 {
509         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
510         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
511
512         if (poid_par_priv->type_of_oid != QUERY_OID) {
513                 status = NDIS_STATUS_NOT_ACCEPTED;
514                 return status;
515         }
516         if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
517                 *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes;
518                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
519         } else
520                 status = NDIS_STATUS_INVALID_LENGTH ;
521
522
523         return status;
524 }
525 /* ------------------------------------------------------------------------------ */
526 NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv *poid_par_priv)
527 {
528         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
529         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
530
531         if (poid_par_priv->type_of_oid != QUERY_OID) {
532                 status = NDIS_STATUS_NOT_ACCEPTED;
533                 return status;
534         }
535         if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
536                 /* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */
537                 *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes;
538                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
539         } else
540                 status = NDIS_STATUS_INVALID_LENGTH ;
541         return status;
542 }
543 /* ------------------------------------------------------------------------------ */
544 NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv *poid_par_priv)
545 {
546         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
547         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
548
549         return status;
550 }
551 NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv *poid_par_priv)
552 {
553         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
554         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
555
556         if (poid_par_priv->type_of_oid != QUERY_OID) {
557                 status = NDIS_STATUS_NOT_ACCEPTED;
558                 return status;
559         }
560
561         return status;
562 }
563 NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv *poid_par_priv)
564 {
565         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
566         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
567
568         if (poid_par_priv->type_of_oid != QUERY_OID) {
569                 status = NDIS_STATUS_NOT_ACCEPTED;
570                 return status;
571         }
572
573         return status;
574 }
575 NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv)
576 {
577         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
578         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
579         struct  mlme_priv       *pmlmepriv = &padapter->mlmepriv;
580         NDIS_802_11_CONFIGURATION               *pnic_Config;
581
582         ULONG   channelnum;
583
584         if (poid_par_priv->type_of_oid != QUERY_OID) {
585                 status = NDIS_STATUS_NOT_ACCEPTED;
586                 return status;
587         }
588
589         if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||
590             (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
591                 pnic_Config = &pmlmepriv->cur_network.network.Configuration;
592         else
593                 pnic_Config = &padapter->registrypriv.dev_network.Configuration;
594
595         channelnum = pnic_Config->DSConfig;
596         *(ULONG *)poid_par_priv->information_buf = channelnum;
597
598         *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
599
600
601
602
603         return status;
604 }
605 NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv *poid_par_priv)
606 {
607         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
608         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
609
610         if (poid_par_priv->type_of_oid != QUERY_OID) {
611                 status = NDIS_STATUS_NOT_ACCEPTED;
612                 return status;
613         }
614
615         return status;
616 }
617 NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv)
618 {
619         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
620         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
621
622         if (poid_par_priv->type_of_oid != QUERY_OID) {
623                 status = NDIS_STATUS_NOT_ACCEPTED;
624                 return status;
625         }
626
627         return status;
628 }
629 NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
630 {
631         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
632         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
633         ULONG                   ulInfo = 0 ;
634         /* DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl\n"));   */
635         if (poid_par_priv->type_of_oid != QUERY_OID) {
636                 status = NDIS_STATUS_NOT_ACCEPTED;
637                 return status;
638         }
639         if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
640                 ulInfo |= 0x0100; /* WIRELESS_MODE_B */
641                 ulInfo |= 0x0200; /* WIRELESS_MODE_G */
642                 ulInfo |= 0x0400; /* WIRELESS_MODE_A */
643
644                 *(ULONG *) poid_par_priv->information_buf = ulInfo;
645                 /* DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo));        */
646                 *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
647         } else
648                 status = NDIS_STATUS_INVALID_LENGTH;
649
650         return status;
651 }
652 NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv)
653 {
654         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
655         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
656
657         if (poid_par_priv->type_of_oid != QUERY_OID) {
658                 status = NDIS_STATUS_NOT_ACCEPTED;
659                 return status;
660         }
661
662         return status;
663 }
664 NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv)
665 {
666         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
667         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
668
669         if (poid_par_priv->type_of_oid != QUERY_OID) {
670                 status = NDIS_STATUS_NOT_ACCEPTED;
671                 return status;
672         }
673
674         return status;
675 }
676
677
678 NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv)
679 {
680         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
681         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
682
683         return status;
684 }
685 NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv *poid_par_priv)
686 {
687         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
688         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
689
690         return status;
691 }
692 NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
693 {
694         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
695         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
696
697         if (poid_par_priv->type_of_oid != QUERY_OID) {
698                 status = NDIS_STATUS_NOT_ACCEPTED;
699                 return status;
700         }
701
702         return status;
703 }
704
705 NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv *poid_par_priv)
706 {
707         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
708         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
709
710         return status;
711 }
712 /* **************  oid_rtl_seg_01_01 section end ************** */
713
714 /* **************  oid_rtl_seg_01_03 section start ************** */
715 NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv *poid_par_priv)
716 {
717         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
718         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
719
720         if (poid_par_priv->type_of_oid != QUERY_OID) {
721                 status = NDIS_STATUS_NOT_ACCEPTED;
722                 return status;
723         }
724
725         return status;
726 }
727 NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv *poid_par_priv)
728 {
729         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
730         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
731
732         return status;
733 }
734 NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv)
735 {
736         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
737         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
738
739         return status;
740 }
741 NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv)
742 {
743         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
744         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
745
746         if (poid_par_priv->type_of_oid != SET_OID) {
747                 status = NDIS_STATUS_NOT_ACCEPTED;
748                 return status;
749         }
750
751         return status;
752 }
753
754 /* **************  oid_rtl_seg_01_03 section end ************** */
755
756 /* ****************  oid_rtl_seg_01_11   section start **************** */
757 NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv *poid_par_priv)
758 {
759         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
760         PADAPTER                Adapter = (PADAPTER)(poid_par_priv->adapter_context);
761         _irqL                   oldirql;
762         /* DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl\n")); */
763         if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */
764                 status = NDIS_STATUS_NOT_ACCEPTED;
765                 return status;
766         }
767
768         _irqlevel_changed_(&oldirql, LOWER);
769         if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) {
770                 /* RegOffsetValue       - The offset of RF register to write. */
771                 /* RegDataWidth - The data width of RF register to write. */
772                 /* RegDataValue - The value to write. */
773                 /* RegOffsetValue = *((unsigned long*)InformationBuffer); */
774                 /* RegDataWidth = *((unsigned long*)InformationBuffer+1);          */
775                 /* RegDataValue =  *((unsigned long*)InformationBuffer+2);       */
776                 if (!rtw_setrfreg_cmd(Adapter,
777                               *(unsigned char *)poid_par_priv->information_buf,
778                         (unsigned long)(*((unsigned long *)poid_par_priv->information_buf + 2))))
779                         status = NDIS_STATUS_NOT_ACCEPTED;
780
781         } else
782                 status = NDIS_STATUS_INVALID_LENGTH;
783         _irqlevel_changed_(&oldirql, RAISE);
784
785         return status;
786 }
787
788 /* ------------------------------------------------------------------------------ */
789 NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv)
790 {
791         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
792 #if 0
793         PADAPTER                Adapter = (PADAPTER)(poid_par_priv->adapter_context);
794         _irqL   oldirql;
795
796         /* DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl\n")); */
797         if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */
798                 status = NDIS_STATUS_NOT_ACCEPTED;
799                 return status;
800         }
801
802         _irqlevel_changed_(&oldirql, LOWER);
803         if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) {
804                 if (Adapter->mppriv.act_in_progress == _TRUE)
805                         status = NDIS_STATUS_NOT_ACCEPTED;
806                 else {
807                         /* init workparam */
808                         Adapter->mppriv.act_in_progress = _TRUE;
809                         Adapter->mppriv.workparam.bcompleted = _FALSE;
810                         Adapter->mppriv.workparam.act_type = MPT_READ_RF;
811                         Adapter->mppriv.workparam.io_offset = *(unsigned long *)poid_par_priv->information_buf;
812                         Adapter->mppriv.workparam.io_value = 0xcccccccc;
813
814                         /* RegOffsetValue       - The offset of RF register to read. */
815                         /* RegDataWidth - The data width of RF register to read. */
816                         /* RegDataValue - The value to read. */
817                         /* RegOffsetValue = *((unsigned long*)InformationBuffer); */
818                         /* RegDataWidth = *((unsigned long*)InformationBuffer+1);          */
819                         /* RegDataValue =  *((unsigned long*)InformationBuffer+2);                                         */
820                         if (!rtw_getrfreg_cmd(Adapter,
821                                 *(unsigned char *)poid_par_priv->information_buf,
822                                 (unsigned char *)&Adapter->mppriv.workparam.io_value))
823                                 status = NDIS_STATUS_NOT_ACCEPTED;
824                 }
825
826
827         } else
828                 status = NDIS_STATUS_INVALID_LENGTH;
829         _irqlevel_changed_(&oldirql, RAISE);
830 #endif
831         return status;
832 }
833
834 /* ****************  oid_rtl_seg_01_11   section end****************     */
835
836
837 /* **************  oid_rtl_seg_03_00 section start **************  */
838 enum _CONNECT_STATE_ {
839         CHECKINGSTATUS,
840         ASSOCIATED,
841         ADHOCMODE,
842         NOTASSOCIATED
843 };
844
845 NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv)
846 {
847         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
848         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
849
850         struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
851
852         ULONG ulInfo;
853
854         if (poid_par_priv->type_of_oid != QUERY_OID) {
855                 status = NDIS_STATUS_NOT_ACCEPTED;
856                 return status;
857         }
858
859         /* nStatus==0   CheckingStatus */
860         /* nStatus==1   Associated */
861         /* nStatus==2   AdHocMode */
862         /* nStatus==3   NotAssociated */
863
864         if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
865                 ulInfo = CHECKINGSTATUS;
866         else if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
867                 ulInfo = ASSOCIATED;
868         else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)
869                 ulInfo = ADHOCMODE;
870         else
871                 ulInfo = NOTASSOCIATED ;
872
873         *(ULONG *)poid_par_priv->information_buf = ulInfo;
874         *poid_par_priv->bytes_rw =  poid_par_priv->information_buf_len;
875
876 #if 0
877         /* Rearrange the order to let the UI still shows connection when scan is in progress */
878         if (pMgntInfo->mAssoc)
879                 ulInfo = 1;
880         else if (pMgntInfo->mIbss)
881                 ulInfo = 2;
882         else if (pMgntInfo->bScanInProgress)
883                 ulInfo = 0;
884         else
885                 ulInfo = 3;
886         ulInfoLen = sizeof(ULONG);
887 #endif
888
889         return status;
890 }
891
892 NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv)
893 {
894         NDIS_STATUS             status = NDIS_STATUS_SUCCESS;
895         PADAPTER                padapter = (PADAPTER)(poid_par_priv->adapter_context);
896
897         if (poid_par_priv->type_of_oid != SET_OID) {
898                 status = NDIS_STATUS_NOT_ACCEPTED;
899                 return status;
900         }
901
902         return status;
903 }
904 /* **************  oid_rtl_seg_03_00 section end **************  */