rtl871x_ioctl_rtl.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. /******************************************************************************
  2. * rtl871x_ioctl_rtl.c
  3. *
  4. * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
  5. * Linux device driver for RTL8192SU
  6. *
  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.
  10. *
  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.
  15. *
  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
  19. *
  20. * Modifications for inclusion into the Linux staging tree are
  21. * Copyright(c) 2010 Larry Finger. All rights reserved.
  22. *
  23. * Contact information:
  24. * WLAN FAE <wlanfae@realtek.com>
  25. * Larry Finger <Larry.Finger@lwfinger.net>
  26. *
  27. ******************************************************************************/
  28. #define _RTL871X_IOCTL_RTL_C_
  29. #include <linux/rndis.h>
  30. #include "osdep_service.h"
  31. #include "drv_types.h"
  32. #include "wlan_bssdef.h"
  33. #include "wifi.h"
  34. #include "rtl871x_ioctl.h"
  35. #include "rtl871x_ioctl_set.h"
  36. #include "rtl871x_ioctl_rtl.h"
  37. #include "mp_custom_oid.h"
  38. #include "rtl871x_mp.h"
  39. #include "rtl871x_mp_ioctl.h"
  40. uint oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv)
  41. {
  42. if (poid_par_priv->type_of_oid != QUERY_OID)
  43. return RNDIS_STATUS_NOT_ACCEPTED;
  44. return RNDIS_STATUS_SUCCESS;
  45. }
  46. uint oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
  47. {
  48. struct _adapter *padapter = (struct _adapter *)
  49. (poid_par_priv->adapter_context);
  50. if (poid_par_priv->type_of_oid != QUERY_OID)
  51. return RNDIS_STATUS_NOT_ACCEPTED;
  52. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  53. *(u32 *)poid_par_priv->information_buf =
  54. padapter->recvpriv.rx_smallpacket_crcerr;
  55. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  56. } else {
  57. return RNDIS_STATUS_INVALID_LENGTH;
  58. }
  59. return RNDIS_STATUS_SUCCESS;
  60. }
  61. uint oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
  62. {
  63. struct _adapter *padapter = (struct _adapter *)
  64. (poid_par_priv->adapter_context);
  65. if (poid_par_priv->type_of_oid != QUERY_OID)
  66. return RNDIS_STATUS_NOT_ACCEPTED;
  67. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  68. *(u32 *)poid_par_priv->information_buf =
  69. padapter->recvpriv.rx_middlepacket_crcerr;
  70. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  71. } else {
  72. return RNDIS_STATUS_INVALID_LENGTH;
  73. }
  74. return RNDIS_STATUS_SUCCESS;
  75. }
  76. uint oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
  77. {
  78. struct _adapter *padapter = (struct _adapter *)
  79. (poid_par_priv->adapter_context);
  80. if (poid_par_priv->type_of_oid != QUERY_OID)
  81. return RNDIS_STATUS_NOT_ACCEPTED;
  82. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  83. *(u32 *)poid_par_priv->information_buf =
  84. padapter->recvpriv.rx_largepacket_crcerr;
  85. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  86. } else {
  87. return RNDIS_STATUS_INVALID_LENGTH;
  88. }
  89. return RNDIS_STATUS_SUCCESS;
  90. }
  91. uint oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv)
  92. {
  93. if (poid_par_priv->type_of_oid != QUERY_OID)
  94. return RNDIS_STATUS_NOT_ACCEPTED;
  95. return RNDIS_STATUS_SUCCESS;
  96. }
  97. uint oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv)
  98. {
  99. if (poid_par_priv->type_of_oid != QUERY_OID)
  100. return RNDIS_STATUS_NOT_ACCEPTED;
  101. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  102. return RNDIS_STATUS_SUCCESS;
  103. }
  104. uint oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv)
  105. {
  106. struct _adapter *padapter = (struct _adapter *)
  107. (poid_par_priv->adapter_context);
  108. if (poid_par_priv->type_of_oid != QUERY_OID)
  109. return RNDIS_STATUS_NOT_ACCEPTED;
  110. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  111. *(u32 *)poid_par_priv->information_buf =
  112. padapter->recvpriv.rx_pkts +
  113. padapter->recvpriv.rx_drop;
  114. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  115. } else {
  116. return RNDIS_STATUS_INVALID_LENGTH;
  117. }
  118. return RNDIS_STATUS_SUCCESS;
  119. }
  120. uint oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv)
  121. {
  122. if (poid_par_priv->type_of_oid != QUERY_OID)
  123. return RNDIS_STATUS_NOT_ACCEPTED;
  124. return RNDIS_STATUS_SUCCESS;
  125. }
  126. uint oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv)
  127. {
  128. if (poid_par_priv->type_of_oid != QUERY_OID)
  129. return RNDIS_STATUS_NOT_ACCEPTED;
  130. return RNDIS_STATUS_SUCCESS;
  131. }
  132. uint oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv)
  133. {
  134. struct _adapter *padapter = (struct _adapter *)
  135. (poid_par_priv->adapter_context);
  136. if (poid_par_priv->type_of_oid != QUERY_OID)
  137. return RNDIS_STATUS_NOT_ACCEPTED;
  138. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  139. *(uint *)poid_par_priv->information_buf =
  140. padapter->recvpriv.rx_icv_err;
  141. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  142. } else {
  143. return RNDIS_STATUS_INVALID_LENGTH;
  144. }
  145. return RNDIS_STATUS_SUCCESS;
  146. }
  147. uint oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv
  148. *poid_par_priv)
  149. {
  150. if (poid_par_priv->type_of_oid != SET_OID)
  151. return RNDIS_STATUS_NOT_ACCEPTED;
  152. return RNDIS_STATUS_SUCCESS;
  153. }
  154. uint oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
  155. {
  156. struct _adapter *padapter = (struct _adapter *)
  157. (poid_par_priv->adapter_context);
  158. u32 preamblemode = 0;
  159. if (poid_par_priv->type_of_oid != QUERY_OID)
  160. return RNDIS_STATUS_NOT_ACCEPTED;
  161. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  162. if (padapter->registrypriv.preamble == PREAMBLE_LONG)
  163. preamblemode = 0;
  164. else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
  165. preamblemode = 1;
  166. else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
  167. preamblemode = 2;
  168. *(u32 *)poid_par_priv->information_buf = preamblemode;
  169. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  170. } else {
  171. return RNDIS_STATUS_INVALID_LENGTH;
  172. }
  173. return RNDIS_STATUS_SUCCESS;
  174. }
  175. uint oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv)
  176. {
  177. if (poid_par_priv->type_of_oid != QUERY_OID)
  178. return RNDIS_STATUS_NOT_ACCEPTED;
  179. return RNDIS_STATUS_SUCCESS;
  180. }
  181. uint oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
  182. {
  183. struct _adapter *padapter = (struct _adapter *)
  184. (poid_par_priv->adapter_context);
  185. struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
  186. if (poid_par_priv->type_of_oid != QUERY_OID)
  187. return RNDIS_STATUS_NOT_ACCEPTED;
  188. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  189. *(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan;
  190. return RNDIS_STATUS_SUCCESS;
  191. }
  192. uint oid_rt_set_channelplan_hdl(struct oid_par_priv
  193. *poid_par_priv)
  194. {
  195. struct _adapter *padapter = (struct _adapter *)
  196. (poid_par_priv->adapter_context);
  197. struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
  198. if (poid_par_priv->type_of_oid != SET_OID)
  199. return RNDIS_STATUS_NOT_ACCEPTED;
  200. peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf;
  201. return RNDIS_STATUS_SUCCESS;
  202. }
  203. uint oid_rt_set_preamble_mode_hdl(struct oid_par_priv
  204. *poid_par_priv)
  205. {
  206. struct _adapter *padapter = (struct _adapter *)
  207. (poid_par_priv->adapter_context);
  208. u32 preamblemode = 0;
  209. if (poid_par_priv->type_of_oid != SET_OID)
  210. return RNDIS_STATUS_NOT_ACCEPTED;
  211. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  212. preamblemode = *(u32 *)poid_par_priv->information_buf;
  213. if (preamblemode == 0)
  214. padapter->registrypriv.preamble = PREAMBLE_LONG;
  215. else if (preamblemode == 1)
  216. padapter->registrypriv.preamble = PREAMBLE_AUTO;
  217. else if (preamblemode == 2)
  218. padapter->registrypriv.preamble = PREAMBLE_SHORT;
  219. *(u32 *)poid_par_priv->information_buf = preamblemode;
  220. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  221. } else {
  222. return RNDIS_STATUS_INVALID_LENGTH;
  223. }
  224. return RNDIS_STATUS_SUCCESS;
  225. }
  226. uint oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv)
  227. {
  228. if (poid_par_priv->type_of_oid != SET_OID)
  229. return RNDIS_STATUS_NOT_ACCEPTED;
  230. return RNDIS_STATUS_SUCCESS;
  231. }
  232. uint oid_rt_dedicate_probe_hdl(struct oid_par_priv
  233. *poid_par_priv)
  234. {
  235. return RNDIS_STATUS_SUCCESS;
  236. }
  237. uint oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv
  238. *poid_par_priv)
  239. {
  240. struct _adapter *padapter = (struct _adapter *)
  241. (poid_par_priv->adapter_context);
  242. if (poid_par_priv->type_of_oid != QUERY_OID)
  243. return RNDIS_STATUS_NOT_ACCEPTED;
  244. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  245. *(u32 *)poid_par_priv->information_buf =
  246. padapter->xmitpriv.tx_bytes;
  247. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  248. } else {
  249. return RNDIS_STATUS_INVALID_LENGTH;
  250. }
  251. return RNDIS_STATUS_SUCCESS;
  252. }
  253. uint oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv
  254. *poid_par_priv)
  255. {
  256. struct _adapter *padapter = (struct _adapter *)
  257. (poid_par_priv->adapter_context);
  258. if (poid_par_priv->type_of_oid != QUERY_OID)
  259. return RNDIS_STATUS_NOT_ACCEPTED;
  260. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  261. *(u32 *)poid_par_priv->information_buf =
  262. padapter->recvpriv.rx_bytes;
  263. *poid_par_priv->bytes_rw = poid_par_priv->
  264. information_buf_len;
  265. } else {
  266. return RNDIS_STATUS_INVALID_LENGTH;
  267. }
  268. return RNDIS_STATUS_SUCCESS;
  269. }
  270. uint oid_rt_current_tx_power_level_hdl(struct oid_par_priv
  271. *poid_par_priv)
  272. {
  273. return RNDIS_STATUS_SUCCESS;
  274. }
  275. uint oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv
  276. *poid_par_priv)
  277. {
  278. if (poid_par_priv->type_of_oid != QUERY_OID)
  279. return RNDIS_STATUS_NOT_ACCEPTED;
  280. return RNDIS_STATUS_SUCCESS;
  281. }
  282. uint oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv
  283. *poid_par_priv)
  284. {
  285. if (poid_par_priv->type_of_oid != QUERY_OID)
  286. return RNDIS_STATUS_NOT_ACCEPTED;
  287. return RNDIS_STATUS_SUCCESS;
  288. }
  289. uint oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv)
  290. {
  291. struct _adapter *padapter = (struct _adapter *)
  292. (poid_par_priv->adapter_context);
  293. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  294. struct NDIS_802_11_CONFIGURATION *pnic_Config;
  295. u32 channelnum;
  296. if (poid_par_priv->type_of_oid != QUERY_OID)
  297. return RNDIS_STATUS_NOT_ACCEPTED;
  298. if (check_fwstate(pmlmepriv, _FW_LINKED) ||
  299. check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))
  300. pnic_Config = &pmlmepriv->cur_network.network.Configuration;
  301. else
  302. pnic_Config = &padapter->registrypriv.dev_network.
  303. Configuration;
  304. channelnum = pnic_Config->DSConfig;
  305. *(u32 *)poid_par_priv->information_buf = channelnum;
  306. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  307. return RNDIS_STATUS_SUCCESS;
  308. }
  309. uint oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv
  310. *poid_par_priv)
  311. {
  312. if (poid_par_priv->type_of_oid != QUERY_OID)
  313. return RNDIS_STATUS_NOT_ACCEPTED;
  314. return RNDIS_STATUS_SUCCESS;
  315. }
  316. uint oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv)
  317. {
  318. if (poid_par_priv->type_of_oid != QUERY_OID)
  319. return RNDIS_STATUS_NOT_ACCEPTED;
  320. return RNDIS_STATUS_SUCCESS;
  321. }
  322. uint oid_rt_supported_wireless_mode_hdl(struct oid_par_priv
  323. *poid_par_priv)
  324. {
  325. u32 ulInfo = 0;
  326. if (poid_par_priv->type_of_oid != QUERY_OID)
  327. return RNDIS_STATUS_NOT_ACCEPTED;
  328. if (poid_par_priv->information_buf_len >= sizeof(u32)) {
  329. ulInfo |= 0x0100; /* WIRELESS_MODE_B */
  330. ulInfo |= 0x0200; /* WIRELESS_MODE_G */
  331. ulInfo |= 0x0400; /* WIRELESS_MODE_A */
  332. *(u32 *) poid_par_priv->information_buf = ulInfo;
  333. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  334. } else {
  335. return RNDIS_STATUS_INVALID_LENGTH;
  336. }
  337. return RNDIS_STATUS_SUCCESS;
  338. }
  339. uint oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv)
  340. {
  341. if (poid_par_priv->type_of_oid != QUERY_OID)
  342. return RNDIS_STATUS_NOT_ACCEPTED;
  343. return RNDIS_STATUS_SUCCESS;
  344. }
  345. uint oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv)
  346. {
  347. if (poid_par_priv->type_of_oid != QUERY_OID)
  348. return RNDIS_STATUS_NOT_ACCEPTED;
  349. return RNDIS_STATUS_SUCCESS;
  350. }
  351. uint oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv)
  352. {
  353. return RNDIS_STATUS_SUCCESS;
  354. }
  355. uint oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv
  356. *poid_par_priv)
  357. {
  358. return RNDIS_STATUS_SUCCESS;
  359. }
  360. uint oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv
  361. *poid_par_priv)
  362. {
  363. if (poid_par_priv->type_of_oid != QUERY_OID)
  364. return RNDIS_STATUS_NOT_ACCEPTED;
  365. return RNDIS_STATUS_SUCCESS;
  366. }
  367. uint oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv
  368. *poid_par_priv)
  369. {
  370. return RNDIS_STATUS_SUCCESS;
  371. }
  372. uint oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv
  373. *poid_par_priv)
  374. {
  375. if (poid_par_priv->type_of_oid != QUERY_OID)
  376. return RNDIS_STATUS_NOT_ACCEPTED;
  377. return RNDIS_STATUS_SUCCESS;
  378. }
  379. uint oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv*
  380. poid_par_priv)
  381. {
  382. return RNDIS_STATUS_SUCCESS;
  383. }
  384. uint oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv)
  385. {
  386. return RNDIS_STATUS_SUCCESS;
  387. }
  388. uint oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv)
  389. {
  390. if (poid_par_priv->type_of_oid != SET_OID)
  391. return RNDIS_STATUS_NOT_ACCEPTED;
  392. return RNDIS_STATUS_SUCCESS;
  393. }
  394. uint oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv*
  395. poid_par_priv)
  396. {
  397. uint status = RNDIS_STATUS_SUCCESS;
  398. struct _adapter *Adapter = (struct _adapter *)
  399. (poid_par_priv->adapter_context);
  400. if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
  401. return RNDIS_STATUS_NOT_ACCEPTED;
  402. if (poid_par_priv->information_buf_len ==
  403. (sizeof(unsigned long) * 3)) {
  404. if (!r8712_setrfreg_cmd(Adapter,
  405. *(unsigned char *)poid_par_priv->information_buf,
  406. (unsigned long)(*((unsigned long *)
  407. poid_par_priv->information_buf + 2))))
  408. status = RNDIS_STATUS_NOT_ACCEPTED;
  409. } else {
  410. status = RNDIS_STATUS_INVALID_LENGTH;
  411. }
  412. return status;
  413. }
  414. uint oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv)
  415. {
  416. uint status = RNDIS_STATUS_SUCCESS;
  417. struct _adapter *Adapter = (struct _adapter *)
  418. (poid_par_priv->adapter_context);
  419. if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
  420. return RNDIS_STATUS_NOT_ACCEPTED;
  421. if (poid_par_priv->information_buf_len == (sizeof(unsigned long) *
  422. 3)) {
  423. if (Adapter->mppriv.act_in_progress) {
  424. status = RNDIS_STATUS_NOT_ACCEPTED;
  425. } else {
  426. /* init workparam */
  427. Adapter->mppriv.act_in_progress = true;
  428. Adapter->mppriv.workparam.bcompleted = false;
  429. Adapter->mppriv.workparam.act_type = MPT_READ_RF;
  430. Adapter->mppriv.workparam.io_offset = *(unsigned long *)
  431. poid_par_priv->information_buf;
  432. Adapter->mppriv.workparam.io_value = 0xcccccccc;
  433. /* RegOffsetValue - The offset of RF register to read.
  434. * RegDataWidth - The data width of RF register to read.
  435. * RegDataValue - The value to read.
  436. * RegOffsetValue = *((unsigned long *)InformationBuffer);
  437. * RegDataWidth = *((unsigned long *)InformationBuffer+1);
  438. * RegDataValue = *((unsigned long *)InformationBuffer+2);
  439. */
  440. if (!r8712_getrfreg_cmd(Adapter,
  441. *(unsigned char *)poid_par_priv->information_buf,
  442. (unsigned char *)&Adapter->mppriv.workparam.
  443. io_value))
  444. status = RNDIS_STATUS_NOT_ACCEPTED;
  445. }
  446. } else {
  447. status = RNDIS_STATUS_INVALID_LENGTH;
  448. }
  449. return status;
  450. }
  451. enum _CONNECT_STATE_ {
  452. CHECKINGSTATUS,
  453. ASSOCIATED,
  454. ADHOCMODE,
  455. NOTASSOCIATED
  456. };
  457. uint oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv)
  458. {
  459. struct _adapter *padapter = (struct _adapter *)
  460. (poid_par_priv->adapter_context);
  461. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  462. u32 ulInfo;
  463. if (poid_par_priv->type_of_oid != QUERY_OID)
  464. return RNDIS_STATUS_NOT_ACCEPTED;
  465. /* nStatus==0 CheckingStatus
  466. * nStatus==1 Associated
  467. * nStatus==2 AdHocMode
  468. * nStatus==3 NotAssociated
  469. */
  470. if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
  471. ulInfo = CHECKINGSTATUS;
  472. else if (check_fwstate(pmlmepriv, _FW_LINKED))
  473. ulInfo = ASSOCIATED;
  474. else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))
  475. ulInfo = ADHOCMODE;
  476. else
  477. ulInfo = NOTASSOCIATED;
  478. *(u32 *)poid_par_priv->information_buf = ulInfo;
  479. *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
  480. return RNDIS_STATUS_SUCCESS;
  481. }
  482. uint oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv)
  483. {
  484. if (poid_par_priv->type_of_oid != SET_OID)
  485. return RNDIS_STATUS_NOT_ACCEPTED;
  486. return RNDIS_STATUS_SUCCESS;
  487. }