2 * This file contains ioctl functions
5 #include <linux/ctype.h>
6 #include <linux/delay.h>
8 #include <linux/if_arp.h>
9 #include <linux/wireless.h>
11 #include <net/iw_handler.h>
12 #include <net/ieee80211.h>
22 #define MAX_SCAN_CELL_SIZE (IW_EV_ADDR_LEN + \
24 IW_EV_UINT_LEN + IW_EV_FREQ_LEN + \
25 IW_EV_QUAL_LEN + IW_ESSID_MAX_SIZE + \
26 IW_EV_PARAM_LEN + 40) /* 40 for WPAIE */
28 #define WAIT_FOR_SCAN_RRESULT_MAX_TIME (10 * HZ)
30 static int setrxantenna(wlan_private * priv, int mode)
33 wlan_adapter *adapter = priv->adapter;
35 if (mode != RF_ANTENNA_1 && mode != RF_ANTENNA_2
36 && mode != RF_ANTENNA_AUTO) {
40 adapter->rxantennamode = mode;
42 lbs_pr_debug(1, "SET RX Antenna mode to 0x%04x\n", adapter->rxantennamode);
44 ret = libertas_prepare_and_send_command(priv, cmd_802_11_rf_antenna,
46 cmd_option_waitforrsp, 0,
47 &adapter->rxantennamode);
51 static int settxantenna(wlan_private * priv, int mode)
54 wlan_adapter *adapter = priv->adapter;
56 if ((mode != RF_ANTENNA_1) && (mode != RF_ANTENNA_2)
57 && (mode != RF_ANTENNA_AUTO)) {
61 adapter->txantennamode = mode;
63 lbs_pr_debug(1, "SET TX Antenna mode to 0x%04x\n", adapter->txantennamode);
65 ret = libertas_prepare_and_send_command(priv, cmd_802_11_rf_antenna,
67 cmd_option_waitforrsp, 0,
68 &adapter->txantennamode);
73 static int getrxantenna(wlan_private * priv, char *buf)
76 wlan_adapter *adapter = priv->adapter;
78 // clear it, so we will know if the value
79 // returned below is correct or not.
80 adapter->rxantennamode = 0;
82 ret = libertas_prepare_and_send_command(priv, cmd_802_11_rf_antenna,
84 cmd_option_waitforrsp, 0, NULL);
91 lbs_pr_debug(1, "Get Rx Antenna mode:0x%04x\n", adapter->rxantennamode);
93 return sprintf(buf, "0x%04x", adapter->rxantennamode) + 1;
96 static int gettxantenna(wlan_private * priv, char *buf)
99 wlan_adapter *adapter = priv->adapter;
101 // clear it, so we will know if the value
102 // returned below is correct or not.
103 adapter->txantennamode = 0;
105 ret = libertas_prepare_and_send_command(priv, cmd_802_11_rf_antenna,
107 cmd_option_waitforrsp, 0, NULL);
114 lbs_pr_debug(1, "Get Tx Antenna mode:0x%04x\n", adapter->txantennamode);
116 return sprintf(buf, "0x%04x", adapter->txantennamode) + 1;
119 static int wlan_set_region(wlan_private * priv, u16 region_code)
123 for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
124 // use the region code to search for the index
125 if (region_code == libertas_region_code_to_index[i]) {
126 priv->adapter->regiontableindex = (u16) i;
127 priv->adapter->regioncode = region_code;
132 // if it's unidentified region code
133 if (i >= MRVDRV_MAX_REGION_CODE) {
134 lbs_pr_debug(1, "region Code not identified\n");
139 if (libertas_set_regiontable(priv, priv->adapter->regioncode, 0)) {
148 * @brief Get/Set Firmware wakeup method
150 * @param priv A pointer to wlan_private structure
151 * @param wrq A pointer to user data
152 * @return 0--success, otherwise fail
154 static int wlan_txcontrol(wlan_private * priv, struct iwreq *wrq)
156 wlan_adapter *adapter = priv->adapter;
160 if ((int)wrq->u.data.length == 0) {
162 (wrq->u.data.pointer, &adapter->pkttxctrl, sizeof(u32))) {
163 lbs_pr_alert("copy_to_user failed!\n");
167 if ((int)wrq->u.data.length > 1) {
168 lbs_pr_alert("ioctl too many args!\n");
171 if (copy_from_user(&data, wrq->u.data.pointer, sizeof(int))) {
172 lbs_pr_alert("Copy from user failed\n");
176 adapter->pkttxctrl = (u32) data;
179 wrq->u.data.length = 1;
186 * @brief Get/Set NULL Package generation interval
188 * @param priv A pointer to wlan_private structure
189 * @param wrq A pointer to user data
190 * @return 0--success, otherwise fail
192 static int wlan_null_pkt_interval(wlan_private * priv, struct iwreq *wrq)
194 wlan_adapter *adapter = priv->adapter;
198 if ((int)wrq->u.data.length == 0) {
199 data = adapter->nullpktinterval;
201 if (copy_to_user(wrq->u.data.pointer, &data, sizeof(int))) {
202 lbs_pr_alert( "copy_to_user failed!\n");
206 if ((int)wrq->u.data.length > 1) {
207 lbs_pr_alert( "ioctl too many args!\n");
210 if (copy_from_user(&data, wrq->u.data.pointer, sizeof(int))) {
211 lbs_pr_debug(1, "Copy from user failed\n");
215 adapter->nullpktinterval = data;
218 wrq->u.data.length = 1;
224 static int wlan_get_rxinfo(wlan_private * priv, struct iwreq *wrq)
226 wlan_adapter *adapter = priv->adapter;
229 data[0] = adapter->SNR[TYPE_RXPD][TYPE_NOAVG];
230 data[1] = adapter->rxpd_rate;
231 if (copy_to_user(wrq->u.data.pointer, data, sizeof(int) * 2)) {
232 lbs_pr_debug(1, "Copy to user failed\n");
235 wrq->u.data.length = 2;
240 static int wlan_get_snr(wlan_private * priv, struct iwreq *wrq)
243 wlan_adapter *adapter = priv->adapter;
247 memset(data, 0, sizeof(data));
248 if (wrq->u.data.length) {
249 if (copy_from_user(data, wrq->u.data.pointer,
250 min_t(size_t, wrq->u.data.length, 4) * sizeof(int)))
253 if ((wrq->u.data.length == 0) || (data[0] == 0) || (data[0] == 1)) {
254 if (adapter->connect_status == libertas_connected) {
255 ret = libertas_prepare_and_send_command(priv,
258 cmd_option_waitforrsp,
268 if (wrq->u.data.length == 0) {
269 data[0] = adapter->SNR[TYPE_BEACON][TYPE_NOAVG];
270 data[1] = adapter->SNR[TYPE_BEACON][TYPE_AVG];
271 data[2] = adapter->SNR[TYPE_RXPD][TYPE_NOAVG];
272 data[3] = adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
273 if (copy_to_user(wrq->u.data.pointer, data, sizeof(int) * 4))
275 wrq->u.data.length = 4;
276 } else if (data[0] == 0) {
277 data[0] = adapter->SNR[TYPE_BEACON][TYPE_NOAVG];
278 if (copy_to_user(wrq->u.data.pointer, data, sizeof(int)))
280 wrq->u.data.length = 1;
281 } else if (data[0] == 1) {
282 data[0] = adapter->SNR[TYPE_BEACON][TYPE_AVG];
283 if (copy_to_user(wrq->u.data.pointer, data, sizeof(int)))
285 wrq->u.data.length = 1;
286 } else if (data[0] == 2) {
287 data[0] = adapter->SNR[TYPE_RXPD][TYPE_NOAVG];
288 if (copy_to_user(wrq->u.data.pointer, data, sizeof(int)))
290 wrq->u.data.length = 1;
291 } else if (data[0] == 3) {
292 data[0] = adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
293 if (copy_to_user(wrq->u.data.pointer, data, sizeof(int)))
295 wrq->u.data.length = 1;
303 static int wlan_beacon_interval(wlan_private * priv, struct iwreq *wrq)
306 wlan_adapter *adapter = priv->adapter;
308 if (wrq->u.data.length > 0) {
309 if (copy_from_user(&data, wrq->u.data.pointer, sizeof(int)))
312 lbs_pr_debug(1, "WLAN SET BEACON INTERVAL: %d\n", data);
313 if ((data > MRVDRV_MAX_BEACON_INTERVAL)
314 || (data < MRVDRV_MIN_BEACON_INTERVAL))
316 adapter->beaconperiod = data;
318 data = adapter->beaconperiod;
319 if (copy_to_user(wrq->u.data.pointer, &data, sizeof(int)))
322 wrq->u.data.length = 1;
327 static int wlan_get_rssi(wlan_private * priv, struct iwreq *wrq)
330 wlan_adapter *adapter = priv->adapter;
336 data = SUBCMD_DATA(wrq);
337 if ((data == 0) || (data == 1)) {
338 ret = libertas_prepare_and_send_command(priv,
340 0, cmd_option_waitforrsp,
351 temp = CAL_RSSI(adapter->SNR[TYPE_BEACON][TYPE_NOAVG],
352 adapter->NF[TYPE_BEACON][TYPE_NOAVG]);
355 temp = CAL_RSSI(adapter->SNR[TYPE_BEACON][TYPE_AVG],
356 adapter->NF[TYPE_BEACON][TYPE_AVG]);
359 temp = CAL_RSSI(adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
360 adapter->NF[TYPE_RXPD][TYPE_NOAVG]);
363 temp = CAL_RSSI(adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
364 adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
369 val = (int *)wrq->u.name;
376 static int wlan_get_nf(wlan_private * priv, struct iwreq *wrq)
379 wlan_adapter *adapter = priv->adapter;
384 data = SUBCMD_DATA(wrq);
385 if ((data == 0) || (data == 1)) {
386 ret = libertas_prepare_and_send_command(priv,
388 0, cmd_option_waitforrsp,
399 temp = adapter->NF[TYPE_BEACON][TYPE_NOAVG];
402 temp = adapter->NF[TYPE_BEACON][TYPE_AVG];
405 temp = adapter->NF[TYPE_RXPD][TYPE_NOAVG];
408 temp = adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
416 lbs_pr_debug(1, "%s: temp = %d\n", __FUNCTION__, temp);
417 val = (int *)wrq->u.name;
422 static int wlan_get_txrate_ioctl(wlan_private * priv, struct ifreq *req)
424 wlan_adapter *adapter = priv->adapter;
426 struct iwreq *wrq = (struct iwreq *)req;
429 lbs_pr_debug(1, "wlan_get_txrate_ioctl\n");
430 ret = libertas_prepare_and_send_command(priv, cmd_802_11_tx_rate_query,
431 cmd_act_get, cmd_option_waitforrsp,
436 pdata = (int *)wrq->u.name;
437 *pdata = (int)adapter->txrate;
441 static int wlan_get_adhoc_status_ioctl(wlan_private * priv, struct iwreq *wrq)
444 wlan_adapter *adapter = priv->adapter;
446 memset(status, 0, sizeof(status));
448 switch (adapter->inframode) {
450 if (adapter->connect_status == libertas_connected) {
451 if (adapter->adhoccreate)
452 memcpy(&status, "AdhocStarted", sizeof(status));
454 memcpy(&status, "AdhocJoined", sizeof(status));
456 memcpy(&status, "AdhocIdle", sizeof(status));
459 case wlan802_11infrastructure:
460 memcpy(&status, "Inframode", sizeof(status));
463 memcpy(&status, "AutoUnknownmode", sizeof(status));
467 lbs_pr_debug(1, "status = %s\n", status);
468 wrq->u.data.length = strlen(status) + 1;
470 if (wrq->u.data.pointer) {
471 if (copy_to_user(wrq->u.data.pointer,
472 &status, wrq->u.data.length))
481 * @brief Set Auto prescan
482 * @param priv A pointer to wlan_private structure
483 * @param wrq A pointer to iwreq structure
484 * @return 0 --success, otherwise fail
486 static int wlan_subcmd_setprescan_ioctl(wlan_private * priv, struct iwreq *wrq)
489 wlan_adapter *adapter = priv->adapter;
492 data = SUBCMD_DATA(wrq);
493 lbs_pr_debug(1, "WLAN_SUBCMD_SET_PRESCAN %d\n", data);
494 adapter->prescan = data;
496 val = (int *)wrq->u.name;
501 static int wlan_set_multiple_dtim_ioctl(wlan_private * priv, struct ifreq *req)
503 struct iwreq *wrq = (struct iwreq *)req;
510 idata = SUBCMD_DATA(wrq);
512 if (((mdtim >= MRVDRV_MIN_MULTIPLE_DTIM)
513 && (mdtim <= MRVDRV_MAX_MULTIPLE_DTIM))
514 || (mdtim == MRVDRV_IGNORE_MULTIPLE_DTIM)) {
515 priv->adapter->multipledtim = mdtim;
519 lbs_pr_debug(1, "Invalid parameter, multipledtim not changed.\n");
525 static void adjust_mtu(wlan_private * priv)
527 int mtu_increment = 0;
529 if (priv->adapter->linkmode == WLAN_LINKMODE_802_11)
530 mtu_increment += sizeof(struct ieee80211_hdr_4addr);
532 if (priv->adapter->radiomode == WLAN_RADIOMODE_RADIOTAP)
533 mtu_increment += max(sizeof(struct tx_radiotap_hdr),
534 sizeof(struct rx_radiotap_hdr));
535 priv->wlan_dev.netdev->mtu = ETH_FRAME_LEN
536 - sizeof(struct ethhdr)
541 * @brief Set Link-Layer Layer mode
542 * @param priv A pointer to wlan_private structure
543 * @param req A pointer to ifreq structure
544 * @return 0 --success, otherwise fail
546 static int wlan_set_linkmode_ioctl(wlan_private * priv, struct ifreq *req)
550 mode = (int)((struct ifreq *)((u8 *) req + 4))->ifr_data;
553 case WLAN_LINKMODE_802_3:
554 priv->adapter->linkmode = mode;
556 case WLAN_LINKMODE_802_11:
557 priv->adapter->linkmode = mode;
560 lbs_pr_info("usb8388-5: invalid link-layer mode (%#x)\n",
565 lbs_pr_debug(1, "usb8388-5: link-layer mode is %#x\n", mode);
573 * @brief Set Radio header mode
574 * @param priv A pointer to wlan_private structure
575 * @param req A pointer to ifreq structure
576 * @return 0 --success, otherwise fail
578 static int wlan_set_radiomode_ioctl(wlan_private * priv, struct ifreq *req)
582 mode = (int)((struct ifreq *)((u8 *) req + 4))->ifr_data;
585 case WLAN_RADIOMODE_NONE:
586 priv->adapter->radiomode = mode;
588 case WLAN_RADIOMODE_RADIOTAP:
589 priv->adapter->radiomode = mode;
592 lbs_pr_debug(1, "usb8388-5: invalid radio header mode (%#x)\n",
596 lbs_pr_debug(1, "usb8388-5: radio-header mode is %#x\n", mode);
603 * @brief Set Debug header mode
604 * @param priv A pointer to wlan_private structure
605 * @param req A pointer to ifreq structure
606 * @return 0 --success, otherwise fail
608 static int wlan_set_debugmode_ioctl(wlan_private * priv, struct ifreq *req)
610 priv->adapter->debugmode = (int)((struct ifreq *)
611 ((u8 *) req + 4))->ifr_data;
615 static int wlan_subcmd_getrxantenna_ioctl(wlan_private * priv,
620 struct iwreq *wrq = (struct iwreq *)req;
622 lbs_pr_debug(1, "WLAN_SUBCMD_GETRXANTENNA\n");
623 len = getrxantenna(priv, buf);
625 wrq->u.data.length = len;
626 if (wrq->u.data.pointer) {
627 if (copy_to_user(wrq->u.data.pointer, &buf, len)) {
628 lbs_pr_debug(1, "CopyToUser failed\n");
636 static int wlan_subcmd_gettxantenna_ioctl(wlan_private * priv,
641 struct iwreq *wrq = (struct iwreq *)req;
643 lbs_pr_debug(1, "WLAN_SUBCMD_GETTXANTENNA\n");
644 len = gettxantenna(priv, buf);
646 wrq->u.data.length = len;
647 if (wrq->u.data.pointer) {
648 if (copy_to_user(wrq->u.data.pointer, &buf, len)) {
649 lbs_pr_debug(1, "CopyToUser failed\n");
657 * @brief Get the MAC TSF value from the firmware
659 * @param priv A pointer to wlan_private structure
660 * @param wrq A pointer to iwreq structure containing buffer
661 * space to store a TSF value retrieved from the firmware
663 * @return 0 if successful; IOCTL error code otherwise
665 static int wlan_get_tsf_ioctl(wlan_private * priv, struct iwreq *wrq)
670 ret = libertas_prepare_and_send_command(priv,
672 0, cmd_option_waitforrsp, 0, &tsfval);
674 lbs_pr_debug(1, "IOCTL: Get TSF = 0x%016llx\n", tsfval);
677 lbs_pr_debug(1, "IOCTL: Get TSF; command exec failed\n");
680 if (copy_to_user(wrq->u.data.pointer,
682 min_t(size_t, wrq->u.data.length,
683 sizeof(tsfval))) != 0) {
685 lbs_pr_debug(1, "IOCTL: Get TSF; Copy to user failed\n");
695 * @brief Get/Set adapt rate
696 * @param priv A pointer to wlan_private structure
697 * @param wrq A pointer to iwreq structure
698 * @return 0 --success, otherwise fail
700 static int wlan_adapt_rateset(wlan_private * priv, struct iwreq *wrq)
703 wlan_adapter *adapter = priv->adapter;
706 memset(data, 0, sizeof(data));
707 if (!wrq->u.data.length) {
708 lbs_pr_debug(1, "Get ADAPT RATE SET\n");
709 ret = libertas_prepare_and_send_command(priv,
710 cmd_802_11_rate_adapt_rateset,
712 cmd_option_waitforrsp, 0, NULL);
713 data[0] = adapter->enablehwauto;
714 data[1] = adapter->ratebitmap;
715 if (copy_to_user(wrq->u.data.pointer, data, sizeof(int) * 2)) {
716 lbs_pr_debug(1, "Copy to user failed\n");
719 #define GET_TWO_INT 2
720 wrq->u.data.length = GET_TWO_INT;
722 lbs_pr_debug(1, "Set ADAPT RATE SET\n");
723 if (wrq->u.data.length > 2)
726 (data, wrq->u.data.pointer,
727 sizeof(int) * wrq->u.data.length)) {
728 lbs_pr_debug(1, "Copy from user failed\n");
732 adapter->enablehwauto = data[0];
733 adapter->ratebitmap = data[1];
734 ret = libertas_prepare_and_send_command(priv,
735 cmd_802_11_rate_adapt_rateset,
737 cmd_option_waitforrsp, 0, NULL);
743 * @brief Get/Set inactivity timeout
744 * @param priv A pointer to wlan_private structure
745 * @param wrq A pointer to iwreq structure
746 * @return 0 --success, otherwise fail
748 static int wlan_inactivity_timeout(wlan_private * priv, struct iwreq *wrq)
755 if (wrq->u.data.length > 1)
758 if (wrq->u.data.length == 0) {
760 ret = libertas_prepare_and_send_command(priv,
761 cmd_802_11_inactivity_timeout,
763 cmd_option_waitforrsp, 0,
766 if (copy_to_user(wrq->u.data.pointer, &data, sizeof(int))) {
767 lbs_pr_debug(1, "Copy to user failed\n");
772 if (copy_from_user(&data, wrq->u.data.pointer, sizeof(int))) {
773 lbs_pr_debug(1, "Copy from user failed\n");
778 ret = libertas_prepare_and_send_command(priv,
779 cmd_802_11_inactivity_timeout,
781 cmd_option_waitforrsp, 0,
785 wrq->u.data.length = 1;
791 static int wlan_do_getlog_ioctl(wlan_private * priv, struct iwreq *wrq)
794 char buf[GETLOG_BUFSIZE - 1];
795 wlan_adapter *adapter = priv->adapter;
797 lbs_pr_debug(1, " GET STATS\n");
799 ret = libertas_prepare_and_send_command(priv, cmd_802_11_get_log,
800 0, cmd_option_waitforrsp, 0, NULL);
806 if (wrq->u.data.pointer) {
807 sprintf(buf, "\n mcasttxframe %u failed %u retry %u "
808 "multiretry %u framedup %u "
809 "rtssuccess %u rtsfailure %u ackfailure %u\n"
810 "rxfrag %u mcastrxframe %u fcserror %u "
811 "txframe %u wepundecryptable %u ",
812 adapter->logmsg.mcasttxframe,
813 adapter->logmsg.failed,
814 adapter->logmsg.retry,
815 adapter->logmsg.multiretry,
816 adapter->logmsg.framedup,
817 adapter->logmsg.rtssuccess,
818 adapter->logmsg.rtsfailure,
819 adapter->logmsg.ackfailure,
820 adapter->logmsg.rxfrag,
821 adapter->logmsg.mcastrxframe,
822 adapter->logmsg.fcserror,
823 adapter->logmsg.txframe,
824 adapter->logmsg.wepundecryptable);
825 wrq->u.data.length = strlen(buf) + 1;
826 if (copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length)) {
827 lbs_pr_debug(1, "Copy to user failed\n");
835 static int wlan_scan_type_ioctl(wlan_private * priv, struct iwreq *wrq)
838 u8 *option[] = { "active", "passive", "get", };
839 int i, max_options = (sizeof(option) / sizeof(option[0]));
841 wlan_adapter *adapter = priv->adapter;
843 if (priv->adapter->enable11d) {
844 lbs_pr_debug(1, "11D: Cannot set scantype when 11D enabled\n");
848 memset(buf, 0, sizeof(buf));
850 if (copy_from_user(buf, wrq->u.data.pointer, min_t(size_t, sizeof(buf),
851 wrq->u.data.length)))
854 lbs_pr_debug(1, "Scan type Option = %s\n", buf);
856 buf[sizeof(buf) - 1] = '\0';
858 for (i = 0; i < max_options; i++) {
859 if (!strcmp(buf, option[i]))
865 adapter->scantype = cmd_scan_type_active;
868 adapter->scantype = cmd_scan_type_passive;
871 wrq->u.data.length = strlen(option[adapter->scantype]) + 1;
873 if (copy_to_user(wrq->u.data.pointer,
874 option[adapter->scantype],
875 wrq->u.data.length)) {
876 lbs_pr_debug(1, "Copy to user failed\n");
882 lbs_pr_debug(1, "Invalid Scan type Ioctl Option\n");
890 static int wlan_scan_mode_ioctl(wlan_private * priv, struct iwreq *wrq)
892 wlan_adapter *adapter = priv->adapter;
894 u8 *option[] = { "bss", "ibss", "any", "get" };
895 int i, max_options = (sizeof(option) / sizeof(option[0]));
900 memset(buf, 0, sizeof(buf));
902 if (copy_from_user(buf, wrq->u.data.pointer, min_t(size_t, sizeof(buf),
903 wrq->u.data.length))) {
904 lbs_pr_debug(1, "Copy from user failed\n");
908 lbs_pr_debug(1, "Scan mode Option = %s\n", buf);
910 buf[sizeof(buf) - 1] = '\0';
912 for (i = 0; i < max_options; i++) {
913 if (!strcmp(buf, option[i]))
920 adapter->scanmode = cmd_bss_type_bss;
923 adapter->scanmode = cmd_bss_type_ibss;
926 adapter->scanmode = cmd_bss_type_any;
930 wrq->u.data.length = strlen(option[adapter->scanmode - 1]) + 1;
932 lbs_pr_debug(1, "Get Scan mode Option = %s\n",
933 option[adapter->scanmode - 1]);
935 lbs_pr_debug(1, "Scan mode length %d\n", wrq->u.data.length);
937 if (copy_to_user(wrq->u.data.pointer,
938 option[adapter->scanmode - 1],
939 wrq->u.data.length)) {
940 lbs_pr_debug(1, "Copy to user failed\n");
943 lbs_pr_debug(1, "GET Scan type Option after copy = %s\n",
944 (char *)wrq->u.data.pointer);
949 lbs_pr_debug(1, "Invalid Scan mode Ioctl Option\n");
959 * @brief Get/Set Adhoc G Rate
961 * @param priv A pointer to wlan_private structure
962 * @param wrq A pointer to user data
963 * @return 0--success, otherwise fail
965 static int wlan_do_set_grate_ioctl(wlan_private * priv, struct iwreq *wrq)
967 wlan_adapter *adapter = priv->adapter;
973 data1 = SUBCMD_DATA(wrq);
976 adapter->adhoc_grate_enabled = 0;
979 adapter->adhoc_grate_enabled = 1;
986 data = adapter->adhoc_grate_enabled;
987 val = (int *)wrq->u.name;
993 static inline int hex2int(char c)
995 if (c >= '0' && c <= '9')
997 if (c >= 'a' && c <= 'f')
998 return (c - 'a' + 10);
999 if (c >= 'A' && c <= 'F')
1000 return (c - 'A' + 10);
1004 /* Convert a string representation of a MAC address ("xx:xx:xx:xx:xx:xx")
1005 into binary format (6 bytes).
1007 This function expects that each byte is represented with 2 characters
1008 (e.g., 11:2:11:11:11:11 is invalid)
1011 static char *eth_str2addr(char *ethstr, u8 * addr)
1016 /* get rid of initial blanks */
1017 while (*pos == ' ' || *pos == '\t')
1020 for (i = 0; i < 6; i++) {
1021 val = hex2int(*pos++);
1024 val2 = hex2int(*pos++);
1027 addr[i] = (val * 16 + val2) & 0xff;
1029 if (i < 5 && *pos++ != ':')
1035 /* this writes xx:xx:xx:xx:xx:xx into ethstr
1036 (ethstr must have space for 18 chars) */
1037 static int eth_addr2str(u8 * addr, char *ethstr)
1042 for (i = 0; i < 6; i++) {
1043 sprintf(pos, "%02x", addr[i] & 0xff);
1052 * @brief Add an entry to the BT table
1053 * @param priv A pointer to wlan_private structure
1054 * @param req A pointer to ifreq structure
1055 * @return 0 --success, otherwise fail
1057 static int wlan_bt_add_ioctl(wlan_private * priv, struct ifreq *req)
1059 struct iwreq *wrq = (struct iwreq *)req;
1060 char ethaddrs_str[18];
1062 u8 ethaddr[ETH_ALEN];
1065 if (copy_from_user(ethaddrs_str, wrq->u.data.pointer,
1066 sizeof(ethaddrs_str)))
1069 if ((pos = eth_str2addr(ethaddrs_str, ethaddr)) == NULL) {
1070 lbs_pr_info("BT_ADD: Invalid MAC address\n");
1074 lbs_pr_debug(1, "BT: adding %s\n", ethaddrs_str);
1076 return (libertas_prepare_and_send_command(priv, cmd_bt_access,
1077 cmd_act_bt_access_add,
1078 cmd_option_waitforrsp, 0, ethaddr));
1082 * @brief Delete an entry from the BT table
1083 * @param priv A pointer to wlan_private structure
1084 * @param req A pointer to ifreq structure
1085 * @return 0 --success, otherwise fail
1087 static int wlan_bt_del_ioctl(wlan_private * priv, struct ifreq *req)
1089 struct iwreq *wrq = (struct iwreq *)req;
1090 char ethaddrs_str[18];
1091 u8 ethaddr[ETH_ALEN];
1095 if (copy_from_user(ethaddrs_str, wrq->u.data.pointer,
1096 sizeof(ethaddrs_str)))
1099 if ((pos = eth_str2addr(ethaddrs_str, ethaddr)) == NULL) {
1100 lbs_pr_info("Invalid MAC address\n");
1104 lbs_pr_debug(1, "BT: deleting %s\n", ethaddrs_str);
1106 return (libertas_prepare_and_send_command(priv,
1108 cmd_act_bt_access_del,
1109 cmd_option_waitforrsp, 0, ethaddr));
1115 * @brief Reset all entries from the BT table
1116 * @param priv A pointer to wlan_private structure
1117 * @return 0 --success, otherwise fail
1119 static int wlan_bt_reset_ioctl(wlan_private * priv)
1123 lbs_pr_alert( "BT: resetting\n");
1125 return (libertas_prepare_and_send_command(priv,
1127 cmd_act_bt_access_reset,
1128 cmd_option_waitforrsp, 0, NULL));
1135 * @brief List an entry from the BT table
1136 * @param priv A pointer to wlan_private structure
1137 * @param req A pointer to ifreq structure
1138 * @return 0 --success, otherwise fail
1140 static int wlan_bt_list_ioctl(wlan_private * priv, struct ifreq *req)
1144 struct iwreq *wrq = (struct iwreq *)req;
1145 /* used to pass id and store the bt entry returned by the FW */
1148 char addr1addr2[2 * ETH_ALEN];
1150 static char outstr[64];
1151 char *pbuf = outstr;
1156 if (copy_from_user(outstr, wrq->u.data.pointer, sizeof(outstr))) {
1157 lbs_pr_debug(1, "Copy from user failed\n");
1160 param.id = simple_strtoul(outstr, NULL, 10);
1161 pos = sprintf(pbuf, "%d: ", param.id);
1164 ret = libertas_prepare_and_send_command(priv, cmd_bt_access,
1165 cmd_act_bt_access_list,
1166 cmd_option_waitforrsp, 0,
1170 addr1 = param.addr1addr2;
1172 pos = sprintf(pbuf, "ignoring traffic from ");
1174 pos = eth_addr2str(addr1, pbuf);
1177 sprintf(pbuf, "(null)");
1181 wrq->u.data.length = strlen(outstr);
1182 if (copy_to_user(wrq->u.data.pointer, (char *)outstr,
1183 wrq->u.data.length)) {
1184 lbs_pr_debug(1, "BT_LIST: Copy to user failed!\n");
1193 * @brief Find the next parameter in an input string
1194 * @param ptr A pointer to the input parameter string
1195 * @return A pointer to the next parameter, or 0 if no parameters left.
1197 static char * next_param(char * ptr)
1199 if (!ptr) return NULL;
1200 while (*ptr == ' ' || *ptr == '\t') ++ptr;
1201 return (*ptr == '\0') ? NULL : ptr;
1205 * @brief Add an entry to the FWT table
1206 * @param priv A pointer to wlan_private structure
1207 * @param req A pointer to ifreq structure
1208 * @return 0 --success, otherwise fail
1210 static int wlan_fwt_add_ioctl(wlan_private * priv, struct ifreq *req)
1212 struct iwreq *wrq = (struct iwreq *)req;
1214 static struct cmd_ds_fwt_access fwt_access;
1218 if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
1221 if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
1222 lbs_pr_alert( "FWT_ADD: Invalid MAC address 1\n");
1226 if ((ptr = eth_str2addr(ptr, fwt_access.ra)) == NULL) {
1227 lbs_pr_alert( "FWT_ADD: Invalid MAC address 2\n");
1231 if ((ptr = next_param(ptr)))
1233 cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1235 fwt_access.metric = FWT_DEFAULT_METRIC;
1237 if ((ptr = next_param(ptr)))
1238 fwt_access.dir = (u8)simple_strtoul(ptr, &ptr, 10);
1240 fwt_access.dir = FWT_DEFAULT_DIR;
1242 if ((ptr = next_param(ptr)))
1244 cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1246 fwt_access.ssn = FWT_DEFAULT_SSN;
1248 if ((ptr = next_param(ptr)))
1250 cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1252 fwt_access.dsn = FWT_DEFAULT_DSN;
1254 if ((ptr = next_param(ptr)))
1255 fwt_access.hopcount = simple_strtoul(ptr, &ptr, 10);
1257 fwt_access.hopcount = FWT_DEFAULT_HOPCOUNT;
1259 if ((ptr = next_param(ptr)))
1260 fwt_access.ttl = simple_strtoul(ptr, &ptr, 10);
1262 fwt_access.ttl = FWT_DEFAULT_TTL;
1264 if ((ptr = next_param(ptr)))
1265 fwt_access.expiration =
1266 cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1268 fwt_access.expiration = FWT_DEFAULT_EXPIRATION;
1270 if ((ptr = next_param(ptr)))
1271 fwt_access.sleepmode = (u8)simple_strtoul(ptr, &ptr, 10);
1273 fwt_access.sleepmode = FWT_DEFAULT_SLEEPMODE;
1275 if ((ptr = next_param(ptr)))
1277 cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1279 fwt_access.snr = FWT_DEFAULT_SNR;
1283 char ethaddr1_str[18], ethaddr2_str[18];
1284 eth_addr2str(fwt_access.da, ethaddr1_str);
1285 eth_addr2str(fwt_access.ra, ethaddr2_str);
1286 lbs_pr_debug(1, "FWT_ADD: adding (da:%s,%i,ra:%s)\n", ethaddr1_str,
1287 fwt_access.dir, ethaddr2_str);
1288 lbs_pr_debug(1, "FWT_ADD: ssn:%u dsn:%u met:%u hop:%u ttl:%u exp:%u slp:%u snr:%u\n",
1289 fwt_access.ssn, fwt_access.dsn, fwt_access.metric,
1290 fwt_access.hopcount, fwt_access.ttl, fwt_access.expiration,
1291 fwt_access.sleepmode, fwt_access.snr);
1296 return (libertas_prepare_and_send_command(priv, cmd_fwt_access,
1297 cmd_act_fwt_access_add,
1298 cmd_option_waitforrsp, 0,
1299 (void *)&fwt_access));
1303 * @brief Delete an entry from the FWT table
1304 * @param priv A pointer to wlan_private structure
1305 * @param req A pointer to ifreq structure
1306 * @return 0 --success, otherwise fail
1308 static int wlan_fwt_del_ioctl(wlan_private * priv, struct ifreq *req)
1310 struct iwreq *wrq = (struct iwreq *)req;
1312 static struct cmd_ds_fwt_access fwt_access;
1316 if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
1319 if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
1320 lbs_pr_alert( "FWT_DEL: Invalid MAC address 1\n");
1324 if ((ptr = eth_str2addr(ptr, fwt_access.ra)) == NULL) {
1325 lbs_pr_alert( "FWT_DEL: Invalid MAC address 2\n");
1329 if ((ptr = next_param(ptr)))
1330 fwt_access.dir = (u8)simple_strtoul(ptr, &ptr, 10);
1332 fwt_access.dir = FWT_DEFAULT_DIR;
1336 char ethaddr1_str[18], ethaddr2_str[18];
1337 lbs_pr_debug(1, "FWT_DEL: line is %s\n", in_str);
1338 eth_addr2str(fwt_access.da, ethaddr1_str);
1339 eth_addr2str(fwt_access.ra, ethaddr2_str);
1340 lbs_pr_debug(1, "FWT_DEL: removing (da:%s,ra:%s,dir:%d)\n", ethaddr1_str,
1341 ethaddr2_str, fwt_access.dir);
1346 return (libertas_prepare_and_send_command(priv,
1348 cmd_act_fwt_access_del,
1349 cmd_option_waitforrsp, 0,
1350 (void *)&fwt_access));
1355 * @brief Print route parameters
1356 * @param fwt_access struct cmd_ds_fwt_access with route info
1357 * @param buf destination buffer for route info
1359 static void print_route(struct cmd_ds_fwt_access fwt_access, char *buf)
1361 buf += sprintf(buf, " ");
1362 buf += eth_addr2str(fwt_access.da, buf);
1363 buf += sprintf(buf, " ");
1364 buf += eth_addr2str(fwt_access.ra, buf);
1365 buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.metric));
1366 buf += sprintf(buf, " %u", fwt_access.dir);
1367 buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.ssn));
1368 buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.dsn));
1369 buf += sprintf(buf, " %u", fwt_access.hopcount);
1370 buf += sprintf(buf, " %u", fwt_access.ttl);
1371 buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.expiration));
1372 buf += sprintf(buf, " %u", fwt_access.sleepmode);
1373 buf += sprintf(buf, " %u", le32_to_cpu(fwt_access.snr));
1377 * @brief Lookup an entry in the FWT table
1378 * @param priv A pointer to wlan_private structure
1379 * @param req A pointer to ifreq structure
1380 * @return 0 --success, otherwise fail
1382 static int wlan_fwt_lookup_ioctl(wlan_private * priv, struct ifreq *req)
1384 struct iwreq *wrq = (struct iwreq *)req;
1387 static struct cmd_ds_fwt_access fwt_access;
1388 static char out_str[128];
1392 if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
1395 if ((ptr = eth_str2addr(in_str, fwt_access.da)) == NULL) {
1396 lbs_pr_alert( "FWT_LOOKUP: Invalid MAC address\n");
1402 char ethaddr1_str[18];
1403 lbs_pr_debug(1, "FWT_LOOKUP: line is %s\n", in_str);
1404 eth_addr2str(fwt_access.da, ethaddr1_str);
1405 lbs_pr_debug(1, "FWT_LOOKUP: looking for (da:%s)\n", ethaddr1_str);
1409 ret = libertas_prepare_and_send_command(priv,
1411 cmd_act_fwt_access_lookup,
1412 cmd_option_waitforrsp, 0,
1413 (void *)&fwt_access);
1416 print_route(fwt_access, out_str);
1418 sprintf(out_str, "(null)");
1420 wrq->u.data.length = strlen(out_str);
1421 if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
1422 wrq->u.data.length)) {
1423 lbs_pr_debug(1, "FWT_LOOKUP: Copy to user failed!\n");
1432 * @brief Reset all entries from the FWT table
1433 * @param priv A pointer to wlan_private structure
1434 * @return 0 --success, otherwise fail
1436 static int wlan_fwt_reset_ioctl(wlan_private * priv)
1438 lbs_pr_debug(1, "FWT: resetting\n");
1440 return (libertas_prepare_and_send_command(priv,
1442 cmd_act_fwt_access_reset,
1443 cmd_option_waitforrsp, 0, NULL));
1447 * @brief List an entry from the FWT table
1448 * @param priv A pointer to wlan_private structure
1449 * @param req A pointer to ifreq structure
1450 * @return 0 --success, otherwise fail
1452 static int wlan_fwt_list_ioctl(wlan_private * priv, struct ifreq *req)
1454 struct iwreq *wrq = (struct iwreq *)req;
1456 static struct cmd_ds_fwt_access fwt_access;
1458 static char out_str[128];
1459 char *pbuf = out_str;
1463 if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
1466 fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1470 lbs_pr_debug(1, "FWT_LIST: line is %s\n", in_str);
1471 lbs_pr_debug(1, "FWT_LIST: listing id:%i\n", le32_to_cpu(fwt_access.id));
1475 ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
1476 cmd_act_fwt_access_list,
1477 cmd_option_waitforrsp, 0, (void *)&fwt_access);
1480 print_route(fwt_access, pbuf);
1482 pbuf += sprintf(pbuf, " (null)");
1484 wrq->u.data.length = strlen(out_str);
1485 if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
1486 wrq->u.data.length)) {
1487 lbs_pr_debug(1, "FWT_LIST: Copy to user failed!\n");
1496 * @brief List an entry from the FRT table
1497 * @param priv A pointer to wlan_private structure
1498 * @param req A pointer to ifreq structure
1499 * @return 0 --success, otherwise fail
1501 static int wlan_fwt_list_route_ioctl(wlan_private * priv, struct ifreq *req)
1503 struct iwreq *wrq = (struct iwreq *)req;
1505 static struct cmd_ds_fwt_access fwt_access;
1507 static char out_str[128];
1508 char *pbuf = out_str;
1512 if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
1515 fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1519 lbs_pr_debug(1, "FWT_LIST_ROUTE: line is %s\n", in_str);
1520 lbs_pr_debug(1, "FWT_LIST_ROUTE: listing id:%i\n", le32_to_cpu(fwt_access.id));
1524 ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
1525 cmd_act_fwt_access_list_route,
1526 cmd_option_waitforrsp, 0, (void *)&fwt_access);
1529 pbuf += sprintf(pbuf, " ");
1530 pbuf += eth_addr2str(fwt_access.da, pbuf);
1531 pbuf += sprintf(pbuf, " %u", le32_to_cpu(fwt_access.metric));
1532 pbuf += sprintf(pbuf, " %u", fwt_access.dir);
1533 /* note that the firmware returns the nid in the id field */
1534 pbuf += sprintf(pbuf, " %u", le32_to_cpu(fwt_access.id));
1535 pbuf += sprintf(pbuf, " %u", le32_to_cpu(fwt_access.ssn));
1536 pbuf += sprintf(pbuf, " %u", le32_to_cpu(fwt_access.dsn));
1537 pbuf += sprintf(pbuf, " hop %u", fwt_access.hopcount);
1538 pbuf += sprintf(pbuf, " ttl %u", fwt_access.ttl);
1539 pbuf += sprintf(pbuf, " %u", le32_to_cpu(fwt_access.expiration));
1541 pbuf += sprintf(pbuf, " (null)");
1543 wrq->u.data.length = strlen(out_str);
1544 if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
1545 wrq->u.data.length)) {
1546 lbs_pr_debug(1, "FWT_LIST_ROUTE: Copy to user failed!\n");
1555 * @brief List an entry from the FNT table
1556 * @param priv A pointer to wlan_private structure
1557 * @param req A pointer to ifreq structure
1558 * @return 0 --success, otherwise fail
1560 static int wlan_fwt_list_neighbor_ioctl(wlan_private * priv, struct ifreq *req)
1562 struct iwreq *wrq = (struct iwreq *)req;
1564 static struct cmd_ds_fwt_access fwt_access;
1566 static char out_str[128];
1567 char *pbuf = out_str;
1571 if (copy_from_user(in_str, wrq->u.data.pointer, sizeof(in_str)))
1574 memset(&fwt_access, 0, sizeof(fwt_access));
1575 fwt_access.id = cpu_to_le32(simple_strtoul(ptr, &ptr, 10));
1579 lbs_pr_debug(1, "FWT_LIST_NEIGHBOR: line is %s\n", in_str);
1580 lbs_pr_debug(1, "FWT_LIST_NEIGHBOR: listing id:%i\n", le32_to_cpu(fwt_access.id));
1584 ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
1585 cmd_act_fwt_access_list_neighbor,
1586 cmd_option_waitforrsp, 0,
1587 (void *)&fwt_access);
1590 pbuf += sprintf(pbuf, " ra ");
1591 pbuf += eth_addr2str(fwt_access.ra, pbuf);
1592 pbuf += sprintf(pbuf, " slp %u", fwt_access.sleepmode);
1593 pbuf += sprintf(pbuf, " snr %u", le32_to_cpu(fwt_access.snr));
1594 pbuf += sprintf(pbuf, " ref %u", le32_to_cpu(fwt_access.references));
1596 pbuf += sprintf(pbuf, " (null)");
1598 wrq->u.data.length = strlen(out_str);
1599 if (copy_to_user(wrq->u.data.pointer, (char *)out_str,
1600 wrq->u.data.length)) {
1601 lbs_pr_debug(1, "FWT_LIST_NEIGHBOR: Copy to user failed!\n");
1610 * @brief Cleans up the route (FRT) and neighbor (FNT) tables
1611 * (Garbage Collection)
1612 * @param priv A pointer to wlan_private structure
1613 * @param req A pointer to ifreq structure
1614 * @return 0 --success, otherwise fail
1616 static int wlan_fwt_cleanup_ioctl(wlan_private * priv, struct ifreq *req)
1618 static struct cmd_ds_fwt_access fwt_access;
1623 lbs_pr_debug(1, "FWT: cleaning up\n");
1625 memset(&fwt_access, 0, sizeof(fwt_access));
1627 ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
1628 cmd_act_fwt_access_cleanup,
1629 cmd_option_waitforrsp, 0,
1630 (void *)&fwt_access);
1633 req->ifr_data = (char *)(le32_to_cpu(fwt_access.references));
1642 * @brief Gets firmware internal time (debug purposes)
1643 * @param priv A pointer to wlan_private structure
1644 * @param req A pointer to ifreq structure
1645 * @return 0 --success, otherwise fail
1647 static int wlan_fwt_time_ioctl(wlan_private * priv, struct ifreq *req)
1649 static struct cmd_ds_fwt_access fwt_access;
1654 lbs_pr_debug(1, "FWT: getting time\n");
1656 memset(&fwt_access, 0, sizeof(fwt_access));
1658 ret = libertas_prepare_and_send_command(priv, cmd_fwt_access,
1659 cmd_act_fwt_access_time,
1660 cmd_option_waitforrsp, 0,
1661 (void *)&fwt_access);
1664 req->ifr_data = (char *)(le32_to_cpu(fwt_access.references));
1673 * @brief Gets mesh ttl from firmware
1674 * @param priv A pointer to wlan_private structure
1675 * @param req A pointer to ifreq structure
1676 * @return 0 --success, otherwise fail
1678 static int wlan_mesh_get_ttl_ioctl(wlan_private * priv, struct ifreq *req)
1680 struct cmd_ds_mesh_access mesh_access;
1685 memset(&mesh_access, 0, sizeof(mesh_access));
1687 ret = libertas_prepare_and_send_command(priv, cmd_mesh_access,
1688 cmd_act_mesh_get_ttl,
1689 cmd_option_waitforrsp, 0,
1690 (void *)&mesh_access);
1693 req->ifr_data = (char *)(le32_to_cpu(mesh_access.data[0]));
1703 * @brief Gets mesh ttl from firmware
1704 * @param priv A pointer to wlan_private structure
1705 * @param ttl New ttl value
1706 * @return 0 --success, otherwise fail
1708 static int wlan_mesh_set_ttl_ioctl(wlan_private * priv, int ttl)
1710 struct cmd_ds_mesh_access mesh_access;
1715 if( (ttl > 0xff) || (ttl < 0) )
1718 memset(&mesh_access, 0, sizeof(mesh_access));
1719 mesh_access.data[0] = ttl;
1721 ret = libertas_prepare_and_send_command(priv, cmd_mesh_access,
1722 cmd_act_mesh_set_ttl,
1723 cmd_option_waitforrsp, 0,
1724 (void *)&mesh_access);
1734 * @brief ioctl function - entry point
1736 * @param dev A pointer to net_device structure
1737 * @param req A pointer to ifreq structure
1738 * @param cmd command
1739 * @return 0--success, otherwise fail
1741 int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
1747 wlan_private *priv = dev->priv;
1748 wlan_adapter *adapter = priv->adapter;
1749 struct iwreq *wrq = (struct iwreq *)req;
1753 lbs_pr_debug(1, "libertas_do_ioctl: ioctl cmd = 0x%x\n", cmd);
1756 lbs_pr_debug(1, "Scan type Ioctl\n");
1757 ret = wlan_scan_type_ioctl(priv, wrq);
1760 case WLAN_SETNONE_GETNONE: /* set WPA mode on/off ioctl #20 */
1761 switch (wrq->u.data.flags) {
1763 lbs_pr_debug(1, "Deauth\n");
1764 libertas_send_deauth(priv);
1768 lbs_pr_debug(1, "Adhoc stop\n");
1769 ret = libertas_do_adhocstop_ioctl(priv);
1773 wlan_radio_ioctl(priv, 1);
1777 wlan_radio_ioctl(priv, 0);
1779 case WLANWLANIDLEON:
1780 libertas_idle_on(priv);
1782 case WLANWLANIDLEOFF:
1783 libertas_idle_off(priv);
1785 case WLAN_SUBCMD_BT_RESET: /* bt_reset */
1786 wlan_bt_reset_ioctl(priv);
1788 case WLAN_SUBCMD_FWT_RESET: /* fwt_reset */
1789 wlan_fwt_reset_ioctl(priv);
1791 } /* End of switch */
1794 case WLAN_SETINT_GETINT:
1795 /* The first 4 bytes of req->ifr_data is sub-ioctl number
1796 * after 4 bytes sits the payload.
1798 subcmd = (int)req->ifr_data; //from iwpriv subcmd
1801 ret = wlan_get_nf(priv, wrq);
1804 ret = wlan_get_rssi(priv, wrq);
1807 ret = libertas_cmd_enable_11d(priv, wrq);
1809 case WLANADHOCGRATE:
1810 ret = wlan_do_set_grate_ioctl(priv, wrq);
1812 case WLAN_SUBCMD_SET_PRESCAN:
1813 ret = wlan_subcmd_setprescan_ioctl(priv, wrq);
1818 case WLAN_SETONEINT_GETONEINT:
1819 switch (wrq->u.data.flags) {
1820 case WLAN_BEACON_INTERVAL:
1821 ret = wlan_beacon_interval(priv, wrq);
1824 case WLAN_LISTENINTRVL:
1825 if (!wrq->u.data.length) {
1827 lbs_pr_debug(1, "Get locallisteninterval value\n");
1828 #define GET_ONE_INT 1
1829 data = adapter->locallisteninterval;
1830 if (copy_to_user(wrq->u.data.pointer,
1831 &data, sizeof(int))) {
1832 lbs_pr_debug(1, "Copy to user failed\n");
1836 wrq->u.data.length = GET_ONE_INT;
1840 (&data, wrq->u.data.pointer, sizeof(int))) {
1841 lbs_pr_debug(1, "Copy from user failed\n");
1845 lbs_pr_debug(1, "Set locallisteninterval = %d\n",
1847 #define MAX_U16_VAL 65535
1848 if (data > MAX_U16_VAL) {
1849 lbs_pr_debug(1, "Exceeds U16 value\n");
1852 adapter->locallisteninterval = data;
1855 case WLAN_TXCONTROL:
1856 ret = wlan_txcontrol(priv, wrq); //adds for txcontrol ioctl
1859 case WLAN_NULLPKTINTERVAL:
1860 ret = wlan_null_pkt_interval(priv, wrq);
1869 case WLAN_SETONEINT_GETNONE:
1870 /* The first 4 bytes of req->ifr_data is sub-ioctl number
1871 * after 4 bytes sits the payload.
1873 subcmd = wrq->u.data.flags; //from wpa_supplicant subcmd
1876 subcmd = (int)req->ifr_data; //from iwpriv subcmd
1879 case WLAN_SUBCMD_SETRXANTENNA: /* SETRXANTENNA */
1880 idata = SUBCMD_DATA(wrq);
1881 ret = setrxantenna(priv, idata);
1883 case WLAN_SUBCMD_SETTXANTENNA: /* SETTXANTENNA */
1884 idata = SUBCMD_DATA(wrq);
1885 ret = settxantenna(priv, idata);
1887 case WLAN_SET_ATIM_WINDOW:
1888 adapter->atimwindow = SUBCMD_DATA(wrq);
1889 adapter->atimwindow = min_t(__u16, adapter->atimwindow, 50);
1892 adapter->bcn_avg_factor = SUBCMD_DATA(wrq);
1893 if (adapter->bcn_avg_factor == 0)
1894 adapter->bcn_avg_factor =
1895 DEFAULT_BCN_AVG_FACTOR;
1896 if (adapter->bcn_avg_factor > DEFAULT_BCN_AVG_FACTOR)
1897 adapter->bcn_avg_factor =
1898 DEFAULT_BCN_AVG_FACTOR;
1900 case WLANSETDATAAVG:
1901 adapter->data_avg_factor = SUBCMD_DATA(wrq);
1902 if (adapter->data_avg_factor == 0)
1903 adapter->data_avg_factor =
1904 DEFAULT_DATA_AVG_FACTOR;
1905 if (adapter->data_avg_factor > DEFAULT_DATA_AVG_FACTOR)
1906 adapter->data_avg_factor =
1907 DEFAULT_DATA_AVG_FACTOR;
1910 idata = SUBCMD_DATA(wrq);
1911 ret = wlan_set_region(priv, (u16) idata);
1914 case WLAN_SET_LISTEN_INTERVAL:
1915 idata = SUBCMD_DATA(wrq);
1916 adapter->listeninterval = (u16) idata;
1919 case WLAN_SET_MULTIPLE_DTIM:
1920 ret = wlan_set_multiple_dtim_ioctl(priv, req);
1923 case WLAN_SET_LINKMODE:
1924 ret = wlan_set_linkmode_ioctl(priv, req);
1927 case WLAN_SET_RADIOMODE:
1928 ret = wlan_set_radiomode_ioctl(priv, req);
1931 case WLAN_SET_DEBUGMODE:
1932 ret = wlan_set_debugmode_ioctl(priv, req);
1935 case WLAN_SUBCMD_MESH_SET_TTL:
1936 idata = SUBCMD_DATA(wrq);
1937 ret = wlan_mesh_set_ttl_ioctl(priv, idata);
1947 case WLAN_SETNONE_GETTWELVE_CHAR: /* Get Antenna settings */
1949 * We've not used IW_PRIV_TYPE_FIXED so sub-ioctl number is
1950 * in flags of iwreq structure, otherwise it will be in
1951 * mode member of iwreq structure.
1953 switch ((int)wrq->u.data.flags) {
1954 case WLAN_SUBCMD_GETRXANTENNA: /* Get Rx Antenna */
1955 ret = wlan_subcmd_getrxantenna_ioctl(priv, req);
1958 case WLAN_SUBCMD_GETTXANTENNA: /* Get Tx Antenna */
1959 ret = wlan_subcmd_gettxantenna_ioctl(priv, req);
1963 ret = wlan_get_tsf_ioctl(priv, wrq);
1968 case WLAN_SET128CHAR_GET128CHAR:
1969 switch ((int)wrq->u.data.flags) {
1972 lbs_pr_debug(1, "Scan mode Ioctl\n");
1973 ret = wlan_scan_mode_ioctl(priv, wrq);
1976 case WLAN_GET_ADHOC_STATUS:
1977 ret = wlan_get_adhoc_status_ioctl(priv, wrq);
1979 case WLAN_SUBCMD_BT_ADD:
1980 ret = wlan_bt_add_ioctl(priv, req);
1982 case WLAN_SUBCMD_BT_DEL:
1983 ret = wlan_bt_del_ioctl(priv, req);
1985 case WLAN_SUBCMD_BT_LIST:
1986 ret = wlan_bt_list_ioctl(priv, req);
1988 case WLAN_SUBCMD_FWT_ADD:
1989 ret = wlan_fwt_add_ioctl(priv, req);
1991 case WLAN_SUBCMD_FWT_DEL:
1992 ret = wlan_fwt_del_ioctl(priv, req);
1994 case WLAN_SUBCMD_FWT_LOOKUP:
1995 ret = wlan_fwt_lookup_ioctl(priv, req);
1997 case WLAN_SUBCMD_FWT_LIST_NEIGHBOR:
1998 ret = wlan_fwt_list_neighbor_ioctl(priv, req);
2000 case WLAN_SUBCMD_FWT_LIST:
2001 ret = wlan_fwt_list_ioctl(priv, req);
2003 case WLAN_SUBCMD_FWT_LIST_ROUTE:
2004 ret = wlan_fwt_list_route_ioctl(priv, req);
2009 case WLAN_SETNONE_GETONEINT:
2010 switch ((int)req->ifr_data) {
2012 pdata = (int *)wrq->u.name;
2013 *pdata = (int)adapter->bcn_avg_factor;
2017 pdata = (int *)wrq->u.name;
2018 *pdata = (int)adapter->regioncode;
2021 case WLAN_GET_LISTEN_INTERVAL:
2022 pdata = (int *)wrq->u.name;
2023 *pdata = (int)adapter->listeninterval;
2026 case WLAN_GET_LINKMODE:
2027 req->ifr_data = (char *)((u32) adapter->linkmode);
2030 case WLAN_GET_RADIOMODE:
2031 req->ifr_data = (char *)((u32) adapter->radiomode);
2034 case WLAN_GET_DEBUGMODE:
2035 req->ifr_data = (char *)((u32) adapter->debugmode);
2038 case WLAN_GET_MULTIPLE_DTIM:
2039 pdata = (int *)wrq->u.name;
2040 *pdata = (int)adapter->multipledtim;
2042 case WLAN_GET_TX_RATE:
2043 ret = wlan_get_txrate_ioctl(priv, req);
2045 case WLAN_SUBCMD_FWT_CLEANUP: /* fwt_cleanup */
2046 ret = wlan_fwt_cleanup_ioctl(priv, req);
2049 case WLAN_SUBCMD_FWT_TIME: /* fwt_time */
2050 ret = wlan_fwt_time_ioctl(priv, req);
2053 case WLAN_SUBCMD_MESH_GET_TTL:
2054 ret = wlan_mesh_get_ttl_ioctl(priv, req);
2065 ret = wlan_do_getlog_ioctl(priv, wrq);
2068 case WLAN_SET_GET_SIXTEEN_INT:
2069 switch ((int)wrq->u.data.flags) {
2073 struct cmd_ds_802_11_tpc_cfg cfg;
2074 memset(&cfg, 0, sizeof(cfg));
2075 if ((wrq->u.data.length > 1)
2076 && (wrq->u.data.length != 5))
2079 if (wrq->u.data.length == 0) {
2085 (data, wrq->u.data.pointer,
2088 "Copy from user failed\n");
2095 cfg.enable = data[0];
2096 cfg.usesnr = data[1];
2103 libertas_prepare_and_send_command(priv,
2106 cmd_option_waitforrsp,
2109 data[0] = cfg.enable;
2110 data[1] = cfg.usesnr;
2115 (wrq->u.data.pointer, data,
2117 lbs_pr_debug(1, "Copy to user failed\n");
2121 wrq->u.data.length = 5;
2128 struct cmd_ds_802_11_pwr_cfg cfg;
2129 memset(&cfg, 0, sizeof(cfg));
2130 if ((wrq->u.data.length > 1)
2131 && (wrq->u.data.length != 4))
2133 if (wrq->u.data.length == 0) {
2139 (data, wrq->u.data.pointer,
2142 "Copy from user failed\n");
2149 cfg.enable = data[0];
2150 cfg.PA_P0 = data[1];
2151 cfg.PA_P1 = data[2];
2152 cfg.PA_P2 = data[3];
2155 libertas_prepare_and_send_command(priv,
2158 cmd_option_waitforrsp,
2160 data[0] = cfg.enable;
2161 data[1] = cfg.PA_P0;
2162 data[2] = cfg.PA_P1;
2163 data[3] = cfg.PA_P2;
2165 (wrq->u.data.pointer, data,
2167 lbs_pr_debug(1, "Copy to user failed\n");
2171 wrq->u.data.length = 4;
2174 case WLAN_AUTO_FREQ_SET:
2177 struct cmd_ds_802_11_afc afc;
2178 memset(&afc, 0, sizeof(afc));
2179 if (wrq->u.data.length != 3)
2182 (data, wrq->u.data.pointer,
2184 lbs_pr_debug(1, "Copy from user failed\n");
2187 afc.afc_auto = data[0];
2189 if (afc.afc_auto != 0) {
2190 afc.threshold = data[1];
2191 afc.period = data[2];
2193 afc.timing_offset = data[1];
2194 afc.carrier_offset = data[2];
2197 libertas_prepare_and_send_command(priv,
2200 cmd_option_waitforrsp,
2204 case WLAN_AUTO_FREQ_GET:
2207 struct cmd_ds_802_11_afc afc;
2208 memset(&afc, 0, sizeof(afc));
2210 libertas_prepare_and_send_command(priv,
2213 cmd_option_waitforrsp,
2215 data[0] = afc.afc_auto;
2216 data[1] = afc.timing_offset;
2217 data[2] = afc.carrier_offset;
2219 (wrq->u.data.pointer, data,
2221 lbs_pr_debug(1, "Copy to user failed\n");
2225 wrq->u.data.length = 3;
2228 case WLAN_SCANPROBES:
2231 if (wrq->u.data.length > 0) {
2233 (&data, wrq->u.data.pointer,
2236 "Copy from user failed\n");
2240 adapter->scanprobes = data;
2242 data = adapter->scanprobes;
2244 (wrq->u.data.pointer, &data,
2247 "Copy to user failed\n");
2251 wrq->u.data.length = 1;
2254 case WLAN_LED_GPIO_CTRL:
2259 struct cmd_ds_802_11_led_ctrl ctrl;
2260 struct mrvlietypes_ledgpio *gpio =
2261 (struct mrvlietypes_ledgpio *) ctrl.data;
2263 memset(&ctrl, 0, sizeof(ctrl));
2264 if (wrq->u.data.length > MAX_LEDS * 2)
2266 if ((wrq->u.data.length % 2) != 0)
2268 if (wrq->u.data.length == 0) {
2274 (data, wrq->u.data.pointer,
2276 wrq->u.data.length)) {
2278 "Copy from user failed\n");
2285 ctrl.numled = cpu_to_le16(0);
2287 cpu_to_le16(TLV_TYPE_LED_GPIO);
2288 gpio->header.len = wrq->u.data.length;
2289 for (i = 0; i < wrq->u.data.length;
2291 gpio->ledpin[i / 2].led =
2293 gpio->ledpin[i / 2].pin =
2298 libertas_prepare_and_send_command(priv,
2299 cmd_802_11_led_gpio_ctrl,
2301 cmd_option_waitforrsp,
2303 for (i = 0; i < gpio->header.len; i += 2) {
2304 data[i] = gpio->ledpin[i / 2].led;
2305 data[i + 1] = gpio->ledpin[i / 2].pin;
2307 if (copy_to_user(wrq->u.data.pointer, data,
2309 gpio->header.len)) {
2310 lbs_pr_debug(1, "Copy to user failed\n");
2314 wrq->u.data.length = gpio->header.len;
2317 case WLAN_ADAPT_RATESET:
2318 ret = wlan_adapt_rateset(priv, wrq);
2320 case WLAN_INACTIVITY_TIMEOUT:
2321 ret = wlan_inactivity_timeout(priv, wrq);
2324 ret = wlan_get_snr(priv, wrq);
2326 case WLAN_GET_RXINFO:
2327 ret = wlan_get_rxinfo(priv, wrq);