1 //------------------------------------------------------------------------------
2 // Copyright (c) 2004-2010 Atheros Communications Inc.
3 // All rights reserved.
7 // Permission to use, copy, modify, and/or distribute this software for any
8 // purpose with or without fee is hereby granted, provided that the above
9 // copyright notice and this permission notice appear in all copies.
11 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 // Author(s): ="Atheros"
22 //------------------------------------------------------------------------------
24 #include "ar6000_drv.h"
25 #include "ieee80211_ioctl.h"
26 #include "ar6kap_common.h"
27 #include "targaddrs.h"
29 #include "wlan_config.h"
31 extern int enablerssicompensation;
33 extern unsigned int wmitimeout;
34 extern A_WAITQUEUE_HEAD arEvent;
35 extern int tspecCompliance;
39 ar6000_ioctl_get_roam_tbl(struct net_device *dev, struct ifreq *rq)
41 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
43 if (ar->arWmiReady == false) {
47 if(wmi_get_roam_tbl_cmd(ar->arWmi) != 0) {
55 ar6000_ioctl_get_roam_data(struct net_device *dev, struct ifreq *rq)
57 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
59 if (ar->arWmiReady == false) {
64 /* currently assume only roam times are required */
65 if(wmi_get_roam_data_cmd(ar->arWmi, ROAM_DATA_TIME) != 0) {
74 ar6000_ioctl_set_roam_ctrl(struct net_device *dev, char *userdata)
76 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
77 WMI_SET_ROAM_CTRL_CMD cmd;
78 u8 size = sizeof(cmd);
80 if (ar->arWmiReady == false) {
85 if (copy_from_user(&cmd, userdata, size)) {
89 if (cmd.roamCtrlType == WMI_SET_HOST_BIAS) {
90 if (cmd.info.bssBiasInfo.numBss > 1) {
91 size += (cmd.info.bssBiasInfo.numBss - 1) * sizeof(WMI_BSS_BIAS);
95 if (copy_from_user(&cmd, userdata, size)) {
99 if(wmi_set_roam_ctrl_cmd(ar->arWmi, &cmd, size) != 0) {
107 ar6000_ioctl_set_powersave_timers(struct net_device *dev, char *userdata)
109 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
110 WMI_POWERSAVE_TIMERS_POLICY_CMD cmd;
111 u8 size = sizeof(cmd);
113 if (ar->arWmiReady == false) {
117 if (copy_from_user(&cmd, userdata, size)) {
121 if (copy_from_user(&cmd, userdata, size)) {
125 if(wmi_set_powersave_timers_cmd(ar->arWmi, &cmd, size) != 0) {
133 ar6000_ioctl_set_qos_supp(struct net_device *dev, struct ifreq *rq)
135 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
136 WMI_SET_QOS_SUPP_CMD cmd;
139 if ((dev->flags & IFF_UP) != IFF_UP) {
142 if (ar->arWmiReady == false) {
146 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
152 ret = wmi_set_qos_supp_cmd(ar->arWmi, cmd.status);
168 ar6000_ioctl_set_wmm(struct net_device *dev, struct ifreq *rq)
170 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
174 if ((dev->flags & IFF_UP) != IFF_UP) {
177 if (ar->arWmiReady == false) {
181 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
187 if (cmd.status == WMI_WMM_ENABLED) {
188 ar->arWmmEnabled = true;
190 ar->arWmmEnabled = false;
193 ret = wmi_set_wmm_cmd(ar->arWmi, cmd.status);
209 ar6000_ioctl_set_txop(struct net_device *dev, struct ifreq *rq)
211 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
212 WMI_SET_WMM_TXOP_CMD cmd;
215 if ((dev->flags & IFF_UP) != IFF_UP) {
218 if (ar->arWmiReady == false) {
222 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
228 ret = wmi_set_wmm_txop(ar->arWmi, cmd.txopEnable);
244 ar6000_ioctl_get_rd(struct net_device *dev, struct ifreq *rq)
246 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
249 if ((dev->flags & IFF_UP) != IFF_UP || ar->arWmiReady == false) {
253 if(copy_to_user((char *)((unsigned int*)rq->ifr_data + 1),
254 &ar->arRegCode, sizeof(ar->arRegCode)))
261 ar6000_ioctl_set_country(struct net_device *dev, struct ifreq *rq)
263 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
264 WMI_AP_SET_COUNTRY_CMD cmd;
267 if ((dev->flags & IFF_UP) != IFF_UP) {
270 if (ar->arWmiReady == false) {
274 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
280 ar->ap_profile_flag = 1; /* There is a change in profile */
282 ret = wmi_set_country(ar->arWmi, cmd.countryCode);
283 memcpy(ar->ap_country_code, cmd.countryCode, 3);
299 /* Get power mode command */
301 ar6000_ioctl_get_power_mode(struct net_device *dev, struct ifreq *rq)
303 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
304 WMI_POWER_MODE_CMD power_mode;
307 if (ar->arWmiReady == false) {
311 power_mode.powerMode = wmi_get_power_mode_cmd(ar->arWmi);
312 if (copy_to_user(rq->ifr_data, &power_mode, sizeof(WMI_POWER_MODE_CMD))) {
321 ar6000_ioctl_set_channelParams(struct net_device *dev, struct ifreq *rq)
323 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
324 WMI_CHANNEL_PARAMS_CMD cmd, *cmdp;
327 if (ar->arWmiReady == false) {
332 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
336 if( (ar->arNextMode == AP_NETWORK) && (cmd.numChannels || cmd.scanParam) ) {
337 A_PRINTF("ERROR: Only wmode is allowed in AP mode\n");
341 if (cmd.numChannels > 1) {
342 cmdp = A_MALLOC(130);
343 if (copy_from_user(cmdp, rq->ifr_data,
345 ((cmd.numChannels - 1) * sizeof(u16))))
354 if ((ar->arPhyCapability == WMI_11G_CAPABILITY) &&
355 ((cmdp->phyMode == WMI_11A_MODE) || (cmdp->phyMode == WMI_11AG_MODE)))
361 (wmi_set_channelParams_cmd(ar->arWmi, cmdp->scanParam, cmdp->phyMode,
362 cmdp->numChannels, cmdp->channelList)
368 if (cmd.numChannels > 1) {
372 ar->ap_wmode = cmdp->phyMode;
373 /* Set the profile change flag to allow a commit cmd */
374 ar->ap_profile_flag = 1;
381 ar6000_ioctl_set_snr_threshold(struct net_device *dev, struct ifreq *rq)
384 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
385 WMI_SNR_THRESHOLD_PARAMS_CMD cmd;
388 if (ar->arWmiReady == false) {
392 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
396 if( wmi_set_snr_threshold_params(ar->arWmi, &cmd) != 0 ) {
404 ar6000_ioctl_set_rssi_threshold(struct net_device *dev, struct ifreq *rq)
406 #define SWAP_THOLD(thold1, thold2) do { \
407 USER_RSSI_THOLD tmpThold; \
408 tmpThold.tag = thold1.tag; \
409 tmpThold.rssi = thold1.rssi; \
410 thold1.tag = thold2.tag; \
411 thold1.rssi = thold2.rssi; \
412 thold2.tag = tmpThold.tag; \
413 thold2.rssi = tmpThold.rssi; \
416 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
417 WMI_RSSI_THRESHOLD_PARAMS_CMD cmd;
418 USER_RSSI_PARAMS rssiParams;
422 if (ar->arWmiReady == false) {
426 if (copy_from_user((char *)&rssiParams, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(USER_RSSI_PARAMS))) {
429 cmd.weight = rssiParams.weight;
430 cmd.pollTime = rssiParams.pollTime;
432 memcpy(ar->rssi_map, &rssiParams.tholds, sizeof(ar->rssi_map));
434 * only 6 elements, so use bubble sorting, in ascending order
436 for (i = 5; i > 0; i--) {
437 for (j = 0; j < i; j++) { /* above tholds */
438 if (ar->rssi_map[j+1].rssi < ar->rssi_map[j].rssi) {
439 SWAP_THOLD(ar->rssi_map[j+1], ar->rssi_map[j]);
440 } else if (ar->rssi_map[j+1].rssi == ar->rssi_map[j].rssi) {
445 for (i = 11; i > 6; i--) {
446 for (j = 6; j < i; j++) { /* below tholds */
447 if (ar->rssi_map[j+1].rssi < ar->rssi_map[j].rssi) {
448 SWAP_THOLD(ar->rssi_map[j+1], ar->rssi_map[j]);
449 } else if (ar->rssi_map[j+1].rssi == ar->rssi_map[j].rssi) {
456 for (i = 0; i < 12; i++) {
457 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("thold[%d].tag: %d, thold[%d].rssi: %d \n",
458 i, ar->rssi_map[i].tag, i, ar->rssi_map[i].rssi));
462 if (enablerssicompensation) {
463 for (i = 0; i < 6; i++)
464 ar->rssi_map[i].rssi = rssi_compensation_reverse_calc(ar, ar->rssi_map[i].rssi, true);
465 for (i = 6; i < 12; i++)
466 ar->rssi_map[i].rssi = rssi_compensation_reverse_calc(ar, ar->rssi_map[i].rssi, false);
469 cmd.thresholdAbove1_Val = ar->rssi_map[0].rssi;
470 cmd.thresholdAbove2_Val = ar->rssi_map[1].rssi;
471 cmd.thresholdAbove3_Val = ar->rssi_map[2].rssi;
472 cmd.thresholdAbove4_Val = ar->rssi_map[3].rssi;
473 cmd.thresholdAbove5_Val = ar->rssi_map[4].rssi;
474 cmd.thresholdAbove6_Val = ar->rssi_map[5].rssi;
475 cmd.thresholdBelow1_Val = ar->rssi_map[6].rssi;
476 cmd.thresholdBelow2_Val = ar->rssi_map[7].rssi;
477 cmd.thresholdBelow3_Val = ar->rssi_map[8].rssi;
478 cmd.thresholdBelow4_Val = ar->rssi_map[9].rssi;
479 cmd.thresholdBelow5_Val = ar->rssi_map[10].rssi;
480 cmd.thresholdBelow6_Val = ar->rssi_map[11].rssi;
482 if( wmi_set_rssi_threshold_params(ar->arWmi, &cmd) != 0 ) {
490 ar6000_ioctl_set_lq_threshold(struct net_device *dev, struct ifreq *rq)
493 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
494 WMI_LQ_THRESHOLD_PARAMS_CMD cmd;
497 if (ar->arWmiReady == false) {
501 if (copy_from_user(&cmd, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(cmd))) {
505 if( wmi_set_lq_threshold_params(ar->arWmi, &cmd) != 0 ) {
514 ar6000_ioctl_set_probedSsid(struct net_device *dev, struct ifreq *rq)
516 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
517 WMI_PROBED_SSID_CMD cmd;
520 if (ar->arWmiReady == false) {
524 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
528 if (wmi_probedSsid_cmd(ar->arWmi, cmd.entryIndex, cmd.flag, cmd.ssidLength,
538 ar6000_ioctl_set_badAp(struct net_device *dev, struct ifreq *rq)
540 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
541 WMI_ADD_BAD_AP_CMD cmd;
544 if (ar->arWmiReady == false) {
549 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
553 if (cmd.badApIndex > WMI_MAX_BAD_AP_INDEX) {
557 if (memcmp(cmd.bssid, null_mac, AR6000_ETH_ADDR_LEN) == 0) {
559 * This is a delete badAP.
561 if (wmi_deleteBadAp_cmd(ar->arWmi, cmd.badApIndex) != 0) {
565 if (wmi_addBadAp_cmd(ar->arWmi, cmd.badApIndex, cmd.bssid) != 0) {
574 ar6000_ioctl_create_qos(struct net_device *dev, struct ifreq *rq)
576 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
577 WMI_CREATE_PSTREAM_CMD cmd;
580 if (ar->arWmiReady == false) {
585 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
589 ret = wmi_verify_tspec_params(&cmd, tspecCompliance);
591 ret = wmi_create_pstream_cmd(ar->arWmi, &cmd);
607 ar6000_ioctl_delete_qos(struct net_device *dev, struct ifreq *rq)
609 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
610 WMI_DELETE_PSTREAM_CMD cmd;
613 if (ar->arWmiReady == false) {
617 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
621 ret = wmi_delete_pstream_cmd(ar->arWmi, cmd.trafficClass, cmd.tsid);
637 ar6000_ioctl_get_qos_queue(struct net_device *dev, struct ifreq *rq)
639 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
640 struct ar6000_queuereq qreq;
643 if (ar->arWmiReady == false) {
647 if( copy_from_user(&qreq, rq->ifr_data,
648 sizeof(struct ar6000_queuereq)))
651 qreq.activeTsids = wmi_get_mapped_qos_queue(ar->arWmi, qreq.trafficClass);
653 if (copy_to_user(rq->ifr_data, &qreq,
654 sizeof(struct ar6000_queuereq)))
662 #ifdef CONFIG_HOST_TCMD_SUPPORT
664 ar6000_ioctl_tcmd_get_rx_report(struct net_device *dev,
665 struct ifreq *rq, u8 *data, u32 len)
667 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
668 u32 buf[4+TCMD_MAX_RATES];
671 if (ar->bIsDestroyProgress) {
675 if (ar->arWmiReady == false) {
679 if (down_interruptible(&ar->arSem)) {
683 if (ar->bIsDestroyProgress) {
688 ar->tcmdRxReport = 0;
689 if (wmi_test_cmd(ar->arWmi, data, len) != 0) {
694 wait_event_interruptible_timeout(arEvent, ar->tcmdRxReport != 0, wmitimeout * HZ);
696 if (signal_pending(current)) {
700 buf[0] = ar->tcmdRxTotalPkt;
701 buf[1] = ar->tcmdRxRssi;
702 buf[2] = ar->tcmdRxcrcErrPkt;
703 buf[3] = ar->tcmdRxsecErrPkt;
704 memcpy(((u8 *)buf)+(4*sizeof(u32)), ar->tcmdRateCnt, sizeof(ar->tcmdRateCnt));
705 memcpy(((u8 *)buf)+(4*sizeof(u32))+(TCMD_MAX_RATES *sizeof(u16)), ar->tcmdRateCntShortGuard, sizeof(ar->tcmdRateCntShortGuard));
707 if (!ret && copy_to_user(rq->ifr_data, buf, sizeof(buf))) {
717 ar6000_tcmd_rx_report_event(void *devt, u8 *results, int len)
719 struct ar6_softc *ar = (struct ar6_softc *)devt;
720 TCMD_CONT_RX * rx_rep = (TCMD_CONT_RX *)results;
722 if (enablerssicompensation) {
723 rx_rep->u.report.rssiInDBm = rssi_compensation_calc_tcmd(tcmdRxFreq, rx_rep->u.report.rssiInDBm,rx_rep->u.report.totalPkt);
727 ar->tcmdRxTotalPkt = rx_rep->u.report.totalPkt;
728 ar->tcmdRxRssi = rx_rep->u.report.rssiInDBm;
729 ar->tcmdRxcrcErrPkt = rx_rep->u.report.crcErrPkt;
730 ar->tcmdRxsecErrPkt = rx_rep->u.report.secErrPkt;
731 ar->tcmdRxReport = 1;
732 A_MEMZERO(ar->tcmdRateCnt, sizeof(ar->tcmdRateCnt));
733 A_MEMZERO(ar->tcmdRateCntShortGuard, sizeof(ar->tcmdRateCntShortGuard));
734 memcpy(ar->tcmdRateCnt, rx_rep->u.report.rateCnt, sizeof(ar->tcmdRateCnt));
735 memcpy(ar->tcmdRateCntShortGuard, rx_rep->u.report.rateCntShortGuard, sizeof(ar->tcmdRateCntShortGuard));
739 #endif /* CONFIG_HOST_TCMD_SUPPORT*/
742 ar6000_ioctl_set_error_report_bitmask(struct net_device *dev, struct ifreq *rq)
744 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
745 WMI_TARGET_ERROR_REPORT_BITMASK cmd;
748 if (ar->arWmiReady == false) {
752 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
756 ret = wmi_set_error_report_bitmask(ar->arWmi, cmd.bitmask);
758 return (ret==0 ? ret : -EINVAL);
762 ar6000_clear_target_stats(struct net_device *dev)
764 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
765 TARGET_STATS *pStats = &ar->arTargetStats;
768 if (ar->arWmiReady == false) {
771 AR6000_SPIN_LOCK(&ar->arLock, 0);
772 A_MEMZERO(pStats, sizeof(TARGET_STATS));
773 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
778 ar6000_ioctl_get_target_stats(struct net_device *dev, struct ifreq *rq)
780 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
781 TARGET_STATS_CMD cmd;
782 TARGET_STATS *pStats = &ar->arTargetStats;
785 if (ar->bIsDestroyProgress) {
788 if (ar->arWmiReady == false) {
791 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
794 if (down_interruptible(&ar->arSem)) {
797 if (ar->bIsDestroyProgress) {
802 ar->statsUpdatePending = true;
804 if(wmi_get_stats_cmd(ar->arWmi) != 0) {
809 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == false, wmitimeout * HZ);
811 if (signal_pending(current)) {
815 if (!ret && copy_to_user(rq->ifr_data, pStats, sizeof(*pStats))) {
819 if (cmd.clearStats == 1) {
820 ret = ar6000_clear_target_stats(dev);
829 ar6000_ioctl_get_ap_stats(struct net_device *dev, struct ifreq *rq)
831 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
832 u32 action; /* Allocating only the desired space on the frame. Declaring is as a WMI_AP_MODE_STAT variable results in exceeding the compiler imposed limit on the maximum frame size */
833 WMI_AP_MODE_STAT *pStats = &ar->arAPStats;
836 if (ar->arWmiReady == false) {
839 if (copy_from_user(&action, (char *)((unsigned int*)rq->ifr_data + 1),
844 if (action == AP_CLEAR_STATS) {
846 AR6000_SPIN_LOCK(&ar->arLock, 0);
847 for(i = 0; i < AP_MAX_NUM_STA; i++) {
848 pStats->sta[i].tx_bytes = 0;
849 pStats->sta[i].tx_pkts = 0;
850 pStats->sta[i].tx_error = 0;
851 pStats->sta[i].tx_discard = 0;
852 pStats->sta[i].rx_bytes = 0;
853 pStats->sta[i].rx_pkts = 0;
854 pStats->sta[i].rx_error = 0;
855 pStats->sta[i].rx_discard = 0;
857 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
861 if (down_interruptible(&ar->arSem)) {
865 ar->statsUpdatePending = true;
867 if(wmi_get_stats_cmd(ar->arWmi) != 0) {
872 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == false, wmitimeout * HZ);
874 if (signal_pending(current)) {
878 if (!ret && copy_to_user(rq->ifr_data, pStats, sizeof(*pStats))) {
888 ar6000_ioctl_set_access_params(struct net_device *dev, struct ifreq *rq)
890 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
891 WMI_SET_ACCESS_PARAMS_CMD cmd;
894 if (ar->arWmiReady == false) {
898 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
902 if (wmi_set_access_params_cmd(ar->arWmi, cmd.ac, cmd.txop, cmd.eCWmin, cmd.eCWmax,
914 ar6000_ioctl_set_disconnect_timeout(struct net_device *dev, struct ifreq *rq)
916 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
917 WMI_DISC_TIMEOUT_CMD cmd;
920 if (ar->arWmiReady == false) {
924 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
928 if (wmi_disctimeout_cmd(ar->arWmi, cmd.disconnectTimeout) == 0)
939 ar6000_xioctl_set_voice_pkt_size(struct net_device *dev, char *userdata)
941 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
942 WMI_SET_VOICE_PKT_SIZE_CMD cmd;
945 if (ar->arWmiReady == false) {
949 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
953 if (wmi_set_voice_pkt_size_cmd(ar->arWmi, cmd.voicePktSize) == 0)
965 ar6000_xioctl_set_max_sp_len(struct net_device *dev, char *userdata)
967 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
968 WMI_SET_MAX_SP_LEN_CMD cmd;
971 if (ar->arWmiReady == false) {
975 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
979 if (wmi_set_max_sp_len_cmd(ar->arWmi, cmd.maxSPLen) == 0)
991 ar6000_xioctl_set_bt_status_cmd(struct net_device *dev, char *userdata)
993 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
994 WMI_SET_BT_STATUS_CMD cmd;
997 if (ar->arWmiReady == false) {
1001 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1005 if (wmi_set_bt_status_cmd(ar->arWmi, cmd.streamType, cmd.status) == 0)
1016 ar6000_xioctl_set_bt_params_cmd(struct net_device *dev, char *userdata)
1018 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1019 WMI_SET_BT_PARAMS_CMD cmd;
1022 if (ar->arWmiReady == false) {
1026 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1030 if (wmi_set_bt_params_cmd(ar->arWmi, &cmd) == 0)
1041 ar6000_xioctl_set_btcoex_fe_ant_cmd(struct net_device * dev, char *userdata)
1043 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1044 WMI_SET_BTCOEX_FE_ANT_CMD cmd;
1047 if (ar->arWmiReady == false) {
1050 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1054 if (wmi_set_btcoex_fe_ant_cmd(ar->arWmi, &cmd) == 0)
1065 ar6000_xioctl_set_btcoex_colocated_bt_dev_cmd(struct net_device * dev, char *userdata)
1067 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1068 WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD cmd;
1071 if (ar->arWmiReady == false) {
1075 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1079 if (wmi_set_btcoex_colocated_bt_dev_cmd(ar->arWmi, &cmd) == 0)
1090 ar6000_xioctl_set_btcoex_btinquiry_page_config_cmd(struct net_device * dev, char *userdata)
1092 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1093 WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD cmd;
1096 if (ar->arWmiReady == false) {
1100 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1104 if (wmi_set_btcoex_btinquiry_page_config_cmd(ar->arWmi, &cmd) == 0)
1115 ar6000_xioctl_set_btcoex_sco_config_cmd(struct net_device * dev, char *userdata)
1117 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1118 WMI_SET_BTCOEX_SCO_CONFIG_CMD cmd;
1121 if (ar->arWmiReady == false) {
1125 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1129 if (wmi_set_btcoex_sco_config_cmd(ar->arWmi, &cmd) == 0)
1140 ar6000_xioctl_set_btcoex_a2dp_config_cmd(struct net_device * dev,
1143 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1144 WMI_SET_BTCOEX_A2DP_CONFIG_CMD cmd;
1147 if (ar->arWmiReady == false) {
1151 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1155 if (wmi_set_btcoex_a2dp_config_cmd(ar->arWmi, &cmd) == 0)
1166 ar6000_xioctl_set_btcoex_aclcoex_config_cmd(struct net_device * dev, char *userdata)
1168 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1169 WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMD cmd;
1172 if (ar->arWmiReady == false) {
1176 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1180 if (wmi_set_btcoex_aclcoex_config_cmd(ar->arWmi, &cmd) == 0)
1191 ar60000_xioctl_set_btcoex_debug_cmd(struct net_device * dev, char *userdata)
1193 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1194 WMI_SET_BTCOEX_DEBUG_CMD cmd;
1197 if (ar->arWmiReady == false) {
1201 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1205 if (wmi_set_btcoex_debug_cmd(ar->arWmi, &cmd) == 0)
1216 ar6000_xioctl_set_btcoex_bt_operating_status_cmd(struct net_device * dev, char *userdata)
1218 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1219 WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD cmd;
1222 if (ar->arWmiReady == false) {
1226 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1230 if (wmi_set_btcoex_bt_operating_status_cmd(ar->arWmi, &cmd) == 0)
1240 ar6000_xioctl_get_btcoex_config_cmd(struct net_device * dev, char *userdata,
1244 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1245 AR6000_BTCOEX_CONFIG btcoexConfig;
1246 WMI_BTCOEX_CONFIG_EVENT *pbtcoexConfigEv = &ar->arBtcoexConfig;
1250 if (ar->bIsDestroyProgress) {
1253 if (ar->arWmiReady == false) {
1256 if (copy_from_user(&btcoexConfig.configCmd, userdata, sizeof(AR6000_BTCOEX_CONFIG))) {
1259 if (down_interruptible(&ar->arSem)) {
1260 return -ERESTARTSYS;
1263 if (wmi_get_btcoex_config_cmd(ar->arWmi, (WMI_GET_BTCOEX_CONFIG_CMD *)&btcoexConfig.configCmd) != 0)
1269 ar->statsUpdatePending = true;
1271 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == false, wmitimeout * HZ);
1273 if (signal_pending(current)) {
1277 if (!ret && copy_to_user(btcoexConfig.configEvent, pbtcoexConfigEv, sizeof(WMI_BTCOEX_CONFIG_EVENT))) {
1285 ar6000_xioctl_get_btcoex_stats_cmd(struct net_device * dev, char *userdata, struct ifreq *rq)
1287 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1288 AR6000_BTCOEX_STATS btcoexStats;
1289 WMI_BTCOEX_STATS_EVENT *pbtcoexStats = &ar->arBtcoexStats;
1292 if (ar->bIsDestroyProgress) {
1295 if (ar->arWmiReady == false) {
1299 if (down_interruptible(&ar->arSem)) {
1300 return -ERESTARTSYS;
1303 if (copy_from_user(&btcoexStats.statsEvent, userdata, sizeof(AR6000_BTCOEX_CONFIG))) {
1307 if (wmi_get_btcoex_stats_cmd(ar->arWmi) != 0)
1313 ar->statsUpdatePending = true;
1315 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == false, wmitimeout * HZ);
1317 if (signal_pending(current)) {
1321 if (!ret && copy_to_user(btcoexStats.statsEvent, pbtcoexStats, sizeof(WMI_BTCOEX_STATS_EVENT))) {
1332 ar6000_xioctl_set_excess_tx_retry_thres_cmd(struct net_device * dev, char * userdata)
1334 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1335 WMI_SET_EXCESS_TX_RETRY_THRES_CMD cmd;
1338 if (ar->arWmiReady == false) {
1342 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1346 if (wmi_set_excess_tx_retry_thres_cmd(ar->arWmi, &cmd) != 0)
1353 #ifdef CONFIG_HOST_GPIO_SUPPORT
1354 struct ar6000_gpio_intr_wait_cmd_s gpio_intr_results;
1355 /* gpio_reg_results and gpio_data_available are protected by arSem */
1356 static struct ar6000_gpio_register_cmd_s gpio_reg_results;
1357 static bool gpio_data_available; /* Requested GPIO data available */
1358 static bool gpio_intr_available; /* GPIO interrupt info available */
1359 static bool gpio_ack_received; /* GPIO ack was received */
1361 /* Host-side initialization for General Purpose I/O support */
1362 void ar6000_gpio_init(void)
1364 gpio_intr_available = false;
1365 gpio_data_available = false;
1366 gpio_ack_received = false;
1370 * Called when a GPIO interrupt is received from the Target.
1371 * intr_values shows which GPIO pins have interrupted.
1372 * input_values shows a recent value of GPIO pins.
1375 ar6000_gpio_intr_rx(u32 intr_mask, u32 input_values)
1377 gpio_intr_results.intr_mask = intr_mask;
1378 gpio_intr_results.input_values = input_values;
1379 *((volatile bool *)&gpio_intr_available) = true;
1384 * This is called when a response is received from the Target
1385 * for a previous or ar6000_gpio_input_get or ar6000_gpio_register_get
1389 ar6000_gpio_data_rx(u32 reg_id, u32 value)
1391 gpio_reg_results.gpioreg_id = reg_id;
1392 gpio_reg_results.value = value;
1393 *((volatile bool *)&gpio_data_available) = true;
1398 * This is called when an acknowledgement is received from the Target
1399 * for a previous or ar6000_gpio_output_set or ar6000_gpio_register_set
1403 ar6000_gpio_ack_rx(void)
1405 gpio_ack_received = true;
1410 ar6000_gpio_output_set(struct net_device *dev,
1416 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1418 gpio_ack_received = false;
1419 return wmi_gpio_output_set(ar->arWmi,
1420 set_mask, clear_mask, enable_mask, disable_mask);
1424 ar6000_gpio_input_get(struct net_device *dev)
1426 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1428 *((volatile bool *)&gpio_data_available) = false;
1429 return wmi_gpio_input_get(ar->arWmi);
1433 ar6000_gpio_register_set(struct net_device *dev,
1437 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1439 gpio_ack_received = false;
1440 return wmi_gpio_register_set(ar->arWmi, gpioreg_id, value);
1444 ar6000_gpio_register_get(struct net_device *dev,
1447 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1449 *((volatile bool *)&gpio_data_available) = false;
1450 return wmi_gpio_register_get(ar->arWmi, gpioreg_id);
1454 ar6000_gpio_intr_ack(struct net_device *dev,
1457 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1459 gpio_intr_available = false;
1460 return wmi_gpio_intr_ack(ar->arWmi, ack_mask);
1462 #endif /* CONFIG_HOST_GPIO_SUPPORT */
1464 #if defined(CONFIG_TARGET_PROFILE_SUPPORT)
1465 static struct prof_count_s prof_count_results;
1466 static bool prof_count_available; /* Requested GPIO data available */
1469 prof_count_get(struct net_device *dev)
1471 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1473 *((volatile bool *)&prof_count_available) = false;
1474 return wmi_prof_count_get_cmd(ar->arWmi);
1478 * This is called when a response is received from the Target
1479 * for a previous prof_count_get call.
1482 prof_count_rx(u32 addr, u32 count)
1484 prof_count_results.addr = addr;
1485 prof_count_results.count = count;
1486 *((volatile bool *)&prof_count_available) = true;
1489 #endif /* CONFIG_TARGET_PROFILE_SUPPORT */
1493 ar6000_create_acl_data_osbuf(struct net_device *dev, u8 *userdata, void **p_osbuf)
1497 HCI_ACL_DATA_PKT *acl;
1498 u8 hdr_size, *datap=NULL;
1501 /* ACL is in data path. There is a need to create pool
1502 * mechanism for allocating and freeing NETBUFs - ToDo later.
1506 acl = (HCI_ACL_DATA_PKT *)tmp_space;
1507 hdr_size = sizeof(acl->hdl_and_flags) + sizeof(acl->data_len);
1510 if (a_copy_from_user(acl, userdata, hdr_size)) {
1515 osbuf = A_NETBUF_ALLOC(hdr_size + acl->data_len);
1516 if (osbuf == NULL) {
1520 A_NETBUF_PUT(osbuf, hdr_size + acl->data_len);
1521 datap = (u8 *)A_NETBUF_DATA(osbuf);
1523 /* Real copy to osbuf */
1524 acl = (HCI_ACL_DATA_PKT *)(datap);
1525 memcpy(acl, tmp_space, hdr_size);
1526 if (a_copy_from_user(acl->data, userdata + hdr_size, acl->data_len)) {
1535 A_NETBUF_FREE(osbuf);
1543 ar6000_ioctl_ap_setparam(struct ar6_softc *ar, int param, int value)
1548 case IEEE80211_PARAM_WPA:
1551 ar->arAuthMode = WPA_AUTH;
1554 ar->arAuthMode = WPA2_AUTH;
1557 ar->arAuthMode = WPA_AUTH | WPA2_AUTH;
1560 ar->arAuthMode = NONE_AUTH;
1564 case IEEE80211_PARAM_AUTHMODE:
1565 if(value == IEEE80211_AUTH_WPA_PSK) {
1566 if (WPA_AUTH == ar->arAuthMode) {
1567 ar->arAuthMode = WPA_PSK_AUTH;
1568 } else if (WPA2_AUTH == ar->arAuthMode) {
1569 ar->arAuthMode = WPA2_PSK_AUTH;
1570 } else if ((WPA_AUTH | WPA2_AUTH) == ar->arAuthMode) {
1571 ar->arAuthMode = WPA_PSK_AUTH | WPA2_PSK_AUTH;
1573 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Error - Setting PSK "\
1574 "mode when WPA param was set to %d\n",
1580 case IEEE80211_PARAM_UCASTCIPHER:
1581 ar->arPairwiseCrypto = 0;
1582 if(value & (1<<IEEE80211_CIPHER_AES_CCM)) {
1583 ar->arPairwiseCrypto |= AES_CRYPT;
1585 if(value & (1<<IEEE80211_CIPHER_TKIP)) {
1586 ar->arPairwiseCrypto |= TKIP_CRYPT;
1588 if(!ar->arPairwiseCrypto) {
1589 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
1590 ("Error - Invalid cipher in WPA \n"));
1594 case IEEE80211_PARAM_PRIVACY:
1596 ar->arDot11AuthMode = OPEN_AUTH;
1597 ar->arAuthMode = NONE_AUTH;
1598 ar->arPairwiseCrypto = NONE_CRYPT;
1599 ar->arPairwiseCryptoLen = 0;
1600 ar->arGroupCrypto = NONE_CRYPT;
1601 ar->arGroupCryptoLen = 0;
1605 case IEEE80211_PARAM_WAPI:
1606 A_PRINTF("WAPI Policy: %d\n", value);
1607 ar->arDot11AuthMode = OPEN_AUTH;
1608 ar->arAuthMode = NONE_AUTH;
1610 ar->arPairwiseCrypto = WAPI_CRYPT;
1611 ar->arGroupCrypto = WAPI_CRYPT;
1613 ar->arPairwiseCrypto = NONE_CRYPT;
1614 ar->arGroupCrypto = NONE_CRYPT;
1623 ar6000_ioctl_setparam(struct ar6_softc *ar, int param, int value)
1625 bool profChanged = false;
1628 if(ar->arNextMode == AP_NETWORK) {
1629 ar->ap_profile_flag = 1; /* There is a change in profile */
1631 case IEEE80211_PARAM_WPA:
1632 case IEEE80211_PARAM_AUTHMODE:
1633 case IEEE80211_PARAM_UCASTCIPHER:
1634 case IEEE80211_PARAM_PRIVACY:
1635 case IEEE80211_PARAM_WAPI:
1636 ret = ar6000_ioctl_ap_setparam(ar, param, value);
1642 case IEEE80211_PARAM_WPA:
1645 ar->arAuthMode = WPA_AUTH;
1649 ar->arAuthMode = WPA2_AUTH;
1653 ar->arAuthMode = NONE_AUTH;
1658 case IEEE80211_PARAM_AUTHMODE:
1660 case IEEE80211_AUTH_WPA_PSK:
1661 if (WPA_AUTH == ar->arAuthMode) {
1662 ar->arAuthMode = WPA_PSK_AUTH;
1664 } else if (WPA2_AUTH == ar->arAuthMode) {
1665 ar->arAuthMode = WPA2_PSK_AUTH;
1668 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Error - Setting PSK "\
1669 "mode when WPA param was set to %d\n",
1674 case IEEE80211_AUTH_WPA_CCKM:
1675 if (WPA2_AUTH == ar->arAuthMode) {
1676 ar->arAuthMode = WPA2_AUTH_CCKM;
1678 ar->arAuthMode = WPA_AUTH_CCKM;
1685 case IEEE80211_PARAM_UCASTCIPHER:
1687 case IEEE80211_CIPHER_AES_CCM:
1688 ar->arPairwiseCrypto = AES_CRYPT;
1691 case IEEE80211_CIPHER_TKIP:
1692 ar->arPairwiseCrypto = TKIP_CRYPT;
1695 case IEEE80211_CIPHER_WEP:
1696 ar->arPairwiseCrypto = WEP_CRYPT;
1699 case IEEE80211_CIPHER_NONE:
1700 ar->arPairwiseCrypto = NONE_CRYPT;
1705 case IEEE80211_PARAM_UCASTKEYLEN:
1706 if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
1709 ar->arPairwiseCryptoLen = value;
1712 case IEEE80211_PARAM_MCASTCIPHER:
1714 case IEEE80211_CIPHER_AES_CCM:
1715 ar->arGroupCrypto = AES_CRYPT;
1718 case IEEE80211_CIPHER_TKIP:
1719 ar->arGroupCrypto = TKIP_CRYPT;
1722 case IEEE80211_CIPHER_WEP:
1723 ar->arGroupCrypto = WEP_CRYPT;
1726 case IEEE80211_CIPHER_NONE:
1727 ar->arGroupCrypto = NONE_CRYPT;
1732 case IEEE80211_PARAM_MCASTKEYLEN:
1733 if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
1736 ar->arGroupCryptoLen = value;
1739 case IEEE80211_PARAM_COUNTERMEASURES:
1740 if (ar->arWmiReady == false) {
1743 wmi_set_tkip_countermeasures_cmd(ar->arWmi, value);
1748 if ((ar->arNextMode != AP_NETWORK) && (profChanged == true)) {
1750 * profile has changed. Erase ssid to signal change
1752 A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
1759 ar6000_ioctl_setkey(struct ar6_softc *ar, struct ieee80211req_key *ik)
1763 CRYPTO_TYPE keyType = NONE_CRYPT;
1766 ar->user_saved_keys.keyOk = false;
1768 if ( (0 == memcmp(ik->ik_macaddr, null_mac, IEEE80211_ADDR_LEN)) ||
1769 (0 == memcmp(ik->ik_macaddr, bcast_mac, IEEE80211_ADDR_LEN)) ) {
1770 keyUsage = GROUP_USAGE;
1771 if(ar->arNextMode == AP_NETWORK) {
1772 memcpy(&ar->ap_mode_bkey, ik,
1773 sizeof(struct ieee80211req_key));
1775 if(ar->arPairwiseCrypto == WAPI_CRYPT) {
1776 return ap_set_wapi_key(ar, ik);
1781 memcpy(&ar->user_saved_keys.bcast_ik, ik,
1782 sizeof(struct ieee80211req_key));
1785 keyUsage = PAIRWISE_USAGE;
1787 memcpy(&ar->user_saved_keys.ucast_ik, ik,
1788 sizeof(struct ieee80211req_key));
1791 if(ar->arNextMode == AP_NETWORK) {
1792 if(ar->arPairwiseCrypto == WAPI_CRYPT) {
1793 return ap_set_wapi_key(ar, ik);
1799 switch (ik->ik_type) {
1800 case IEEE80211_CIPHER_WEP:
1801 keyType = WEP_CRYPT;
1803 case IEEE80211_CIPHER_TKIP:
1804 keyType = TKIP_CRYPT;
1806 case IEEE80211_CIPHER_AES_CCM:
1807 keyType = AES_CRYPT;
1813 ar->user_saved_keys.keyType = keyType;
1815 if (IEEE80211_CIPHER_CCKM_KRK != ik->ik_type) {
1816 if (NONE_CRYPT == keyType) {
1820 if ((WEP_CRYPT == keyType)&&(!ar->arConnected)) {
1821 int index = ik->ik_keyix;
1823 if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(ik->ik_keylen)) {
1827 A_MEMZERO(ar->arWepKeyList[index].arKey,
1828 sizeof(ar->arWepKeyList[index].arKey));
1829 memcpy(ar->arWepKeyList[index].arKey, ik->ik_keydata, ik->ik_keylen);
1830 ar->arWepKeyList[index].arKeyLen = ik->ik_keylen;
1832 if(ik->ik_flags & IEEE80211_KEY_DEFAULT){
1833 ar->arDefTxKeyIndex = index;
1839 if (((WPA_PSK_AUTH == ar->arAuthMode) || (WPA2_PSK_AUTH == ar->arAuthMode)) &&
1840 (GROUP_USAGE & keyUsage))
1842 A_UNTIMEOUT(&ar->disconnect_timer);
1845 status = wmi_addKey_cmd(ar->arWmi, ik->ik_keyix, keyType, keyUsage,
1846 ik->ik_keylen, (u8 *)&ik->ik_keyrsc,
1847 ik->ik_keydata, KEY_OP_INIT_VAL, ik->ik_macaddr,
1854 status = wmi_add_krk_cmd(ar->arWmi, ik->ik_keydata);
1858 ar->user_saved_keys.keyOk = true;
1864 int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1866 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1867 struct hif_device *hifDevice = ar->arHifDevice;
1869 unsigned int address = 0;
1870 unsigned int length = 0;
1871 unsigned char *buffer;
1873 u32 connectCtrlFlags;
1876 WMI_SET_AKMP_PARAMS_CMD akmpParams;
1877 WMI_SET_PMKID_LIST_CMD pmkidInfo;
1879 WMI_SET_HT_CAP_CMD htCap;
1880 WMI_SET_HT_OP_CMD htOp;
1883 * ioctl operations may have to wait for the Target, so we cannot hold rtnl.
1884 * Prevent the device from disappearing under us and release the lock during
1885 * the ioctl operation.
1890 if (cmd == AR6000_IOCTL_EXTENDED) {
1892 * This allows for many more wireless ioctls than would otherwise
1893 * be available. Applications embed the actual ioctl command in
1894 * the first word of the parameter block, and use the command
1895 * AR6000_IOCTL_EXTENDED_CMD on the ioctl call.
1897 if (get_user(cmd, (int *)rq->ifr_data)) {
1901 userdata = (char *)(((unsigned int *)rq->ifr_data)+1);
1902 if(is_xioctl_allowed(ar->arNextMode, cmd) != 0) {
1903 A_PRINTF("xioctl: cmd=%d not allowed in this mode\n",cmd);
1908 int ret = is_iwioctl_allowed(ar->arNextMode, cmd);
1909 if(ret == A_ENOTSUP) {
1910 A_PRINTF("iwioctl: cmd=0x%x not allowed in this mode\n", cmd);
1913 } else if (ret == A_ERROR) {
1914 /* It is not our ioctl (out of range ioctl) */
1918 userdata = (char *)rq->ifr_data;
1921 if ((ar->arWlanState == WLAN_DISABLED) &&
1922 ((cmd != AR6000_XIOCTRL_WMI_SET_WLAN_STATE) &&
1923 (cmd != AR6000_XIOCTL_GET_WLAN_SLEEP_STATE) &&
1924 (cmd != AR6000_XIOCTL_DIAG_READ) &&
1925 (cmd != AR6000_XIOCTL_DIAG_WRITE) &&
1926 (cmd != AR6000_XIOCTL_SET_BT_HW_POWER_STATE) &&
1927 (cmd != AR6000_XIOCTL_GET_BT_HW_POWER_STATE) &&
1928 (cmd != AR6000_XIOCTL_ADD_AP_INTERFACE) &&
1929 (cmd != AR6000_XIOCTL_REMOVE_AP_INTERFACE) &&
1930 (cmd != AR6000_IOCTL_WMI_GETREV)))
1939 case IEEE80211_IOCTL_SETPARAM:
1942 int *ptr = (int *)rq->ifr_ifru.ifru_newname;
1943 if (ar->arWmiReady == false) {
1948 ret = ar6000_ioctl_setparam(ar,param,value);
1952 case IEEE80211_IOCTL_SETKEY:
1954 struct ieee80211req_key keydata;
1955 if (ar->arWmiReady == false) {
1957 } else if (copy_from_user(&keydata, userdata,
1958 sizeof(struct ieee80211req_key))) {
1961 ar6000_ioctl_setkey(ar, &keydata);
1965 case IEEE80211_IOCTL_DELKEY:
1966 case IEEE80211_IOCTL_SETOPTIE:
1971 case IEEE80211_IOCTL_SETMLME:
1973 struct ieee80211req_mlme mlme;
1974 if (ar->arWmiReady == false) {
1976 } else if (copy_from_user(&mlme, userdata,
1977 sizeof(struct ieee80211req_mlme))) {
1980 switch (mlme.im_op) {
1981 case IEEE80211_MLME_AUTHORIZE:
1982 A_PRINTF("setmlme AUTHORIZE %02X:%02X\n",
1983 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1985 case IEEE80211_MLME_UNAUTHORIZE:
1986 A_PRINTF("setmlme UNAUTHORIZE %02X:%02X\n",
1987 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1989 case IEEE80211_MLME_DEAUTH:
1990 A_PRINTF("setmlme DEAUTH %02X:%02X\n",
1991 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1992 //remove_sta(ar, mlme.im_macaddr);
1994 case IEEE80211_MLME_DISASSOC:
1995 A_PRINTF("setmlme DISASSOC %02X:%02X\n",
1996 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1997 //remove_sta(ar, mlme.im_macaddr);
2004 wmi_ap_set_mlme(ar->arWmi, mlme.im_op, mlme.im_macaddr,
2009 case IEEE80211_IOCTL_ADDPMKID:
2011 struct ieee80211req_addpmkid req;
2012 if (ar->arWmiReady == false) {
2014 } else if (copy_from_user(&req, userdata, sizeof(struct ieee80211req_addpmkid))) {
2019 AR_DEBUG_PRINTF(ATH_DEBUG_WLAN_CONNECT,("Add pmkid for %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x en=%d\n",
2020 req.pi_bssid[0], req.pi_bssid[1], req.pi_bssid[2],
2021 req.pi_bssid[3], req.pi_bssid[4], req.pi_bssid[5],
2024 status = wmi_setPmkid_cmd(ar->arWmi, req.pi_bssid, req.pi_pmkid,
2034 #ifdef CONFIG_HOST_TCMD_SUPPORT
2035 case AR6000_XIOCTL_TCMD_CONT_TX:
2039 if ((ar->tcmdPm == TCMD_PM_SLEEP) ||
2040 (ar->tcmdPm == TCMD_PM_DEEPSLEEP))
2042 A_PRINTF("Can NOT send tx tcmd when target is asleep! \n");
2047 if(copy_from_user(&txCmd, userdata, sizeof(TCMD_CONT_TX))) {
2051 wmi_test_cmd(ar->arWmi,(u8 *)&txCmd, sizeof(TCMD_CONT_TX));
2055 case AR6000_XIOCTL_TCMD_CONT_RX:
2059 if ((ar->tcmdPm == TCMD_PM_SLEEP) ||
2060 (ar->tcmdPm == TCMD_PM_DEEPSLEEP))
2062 A_PRINTF("Can NOT send rx tcmd when target is asleep! \n");
2066 if(copy_from_user(&rxCmd, userdata, sizeof(TCMD_CONT_RX))) {
2073 case TCMD_CONT_RX_PROMIS:
2074 case TCMD_CONT_RX_FILTER:
2075 case TCMD_CONT_RX_SETMAC:
2076 case TCMD_CONT_RX_SET_ANT_SWITCH_TABLE:
2077 wmi_test_cmd(ar->arWmi,(u8 *)&rxCmd,
2078 sizeof(TCMD_CONT_RX));
2079 tcmdRxFreq = rxCmd.u.para.freq;
2081 case TCMD_CONT_RX_REPORT:
2082 ar6000_ioctl_tcmd_get_rx_report(dev, rq,
2083 (u8 *)&rxCmd, sizeof(TCMD_CONT_RX));
2086 A_PRINTF("Unknown Cont Rx mode: %d\n",rxCmd.act);
2092 case AR6000_XIOCTL_TCMD_PM:
2096 if(copy_from_user(&pmCmd, userdata, sizeof(TCMD_PM))) {
2100 ar->tcmdPm = pmCmd.mode;
2101 wmi_test_cmd(ar->arWmi, (u8 *)&pmCmd, sizeof(TCMD_PM));
2104 #endif /* CONFIG_HOST_TCMD_SUPPORT */
2106 case AR6000_XIOCTL_BMI_DONE:
2107 rtnl_lock(); /* ar6000_init expects to be called holding rtnl lock */
2108 ret = ar6000_init(dev);
2112 case AR6000_XIOCTL_BMI_READ_MEMORY:
2113 if (get_user(address, (unsigned int *)userdata) ||
2114 get_user(length, (unsigned int *)userdata + 1)) {
2119 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Read Memory (address: 0x%x, length: %d)\n",
2121 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
2122 A_MEMZERO(buffer, length);
2123 ret = BMIReadMemory(hifDevice, address, buffer, length);
2124 if (copy_to_user(rq->ifr_data, buffer, length)) {
2133 case AR6000_XIOCTL_BMI_WRITE_MEMORY:
2134 if (get_user(address, (unsigned int *)userdata) ||
2135 get_user(length, (unsigned int *)userdata + 1)) {
2139 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Write Memory (address: 0x%x, length: %d)\n",
2141 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
2142 A_MEMZERO(buffer, length);
2143 if (copy_from_user(buffer, &userdata[sizeof(address) +
2144 sizeof(length)], length))
2148 ret = BMIWriteMemory(hifDevice, address, buffer, length);
2156 case AR6000_XIOCTL_BMI_TEST:
2157 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("No longer supported\n"));
2161 case AR6000_XIOCTL_BMI_EXECUTE:
2162 if (get_user(address, (unsigned int *)userdata) ||
2163 get_user(param, (unsigned int *)userdata + 1)) {
2167 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Execute (address: 0x%x, param: %d)\n",
2169 ret = BMIExecute(hifDevice, address, (u32 *)¶m);
2171 if (put_user(param, (unsigned int *)rq->ifr_data)) {
2177 case AR6000_XIOCTL_BMI_SET_APP_START:
2178 if (get_user(address, (unsigned int *)userdata)) {
2182 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Set App Start (address: 0x%x)\n", address));
2183 ret = BMISetAppStart(hifDevice, address);
2186 case AR6000_XIOCTL_BMI_READ_SOC_REGISTER:
2187 if (get_user(address, (unsigned int *)userdata)) {
2191 ret = BMIReadSOCRegister(hifDevice, address, (u32 *)¶m);
2193 if (put_user(param, (unsigned int *)rq->ifr_data)) {
2199 case AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER:
2200 if (get_user(address, (unsigned int *)userdata) ||
2201 get_user(param, (unsigned int *)userdata + 1)) {
2205 ret = BMIWriteSOCRegister(hifDevice, address, param);
2208 #ifdef HTC_RAW_INTERFACE
2209 case AR6000_XIOCTL_HTC_RAW_OPEN:
2211 if (!arRawIfEnabled(ar)) {
2212 /* make sure block size is set in case the target was reset since last
2213 * BMI phase (i.e. flashup downloads) */
2214 ret = ar6000_set_htc_params(ar->arHifDevice,
2216 0, /* use default yield */
2217 0 /* use default number of HTC ctrl buffers */
2222 /* Terminate the BMI phase */
2223 ret = BMIDone(hifDevice);
2225 ret = ar6000_htc_raw_open(ar);
2230 case AR6000_XIOCTL_HTC_RAW_CLOSE:
2231 if (arRawIfEnabled(ar)) {
2232 ret = ar6000_htc_raw_close(ar);
2233 arRawIfEnabled(ar) = false;
2239 case AR6000_XIOCTL_HTC_RAW_READ:
2240 if (arRawIfEnabled(ar)) {
2241 unsigned int streamID;
2242 if (get_user(streamID, (unsigned int *)userdata) ||
2243 get_user(length, (unsigned int *)userdata + 1)) {
2247 buffer = (unsigned char*)rq->ifr_data + sizeof(length);
2248 ret = ar6000_htc_raw_read(ar, (HTC_RAW_STREAM_ID)streamID,
2249 (char*)buffer, length);
2250 if (put_user(ret, (unsigned int *)rq->ifr_data)) {
2259 case AR6000_XIOCTL_HTC_RAW_WRITE:
2260 if (arRawIfEnabled(ar)) {
2261 unsigned int streamID;
2262 if (get_user(streamID, (unsigned int *)userdata) ||
2263 get_user(length, (unsigned int *)userdata + 1)) {
2267 buffer = (unsigned char*)userdata + sizeof(streamID) + sizeof(length);
2268 ret = ar6000_htc_raw_write(ar, (HTC_RAW_STREAM_ID)streamID,
2269 (char*)buffer, length);
2270 if (put_user(ret, (unsigned int *)rq->ifr_data)) {
2278 #endif /* HTC_RAW_INTERFACE */
2280 case AR6000_XIOCTL_BMI_LZ_STREAM_START:
2281 if (get_user(address, (unsigned int *)userdata)) {
2285 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Start Compressed Stream (address: 0x%x)\n", address));
2286 ret = BMILZStreamStart(hifDevice, address);
2289 case AR6000_XIOCTL_BMI_LZ_DATA:
2290 if (get_user(length, (unsigned int *)userdata)) {
2294 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Send Compressed Data (length: %d)\n", length));
2295 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
2296 A_MEMZERO(buffer, length);
2297 if (copy_from_user(buffer, &userdata[sizeof(length)], length))
2301 ret = BMILZData(hifDevice, buffer, length);
2309 #if defined(CONFIG_TARGET_PROFILE_SUPPORT)
2311 * Optional support for Target-side profiling.
2312 * Not needed in production.
2315 /* Configure Target-side profiling */
2316 case AR6000_XIOCTL_PROF_CFG:
2320 if (get_user(period, (unsigned int *)userdata) ||
2321 get_user(nbins, (unsigned int *)userdata + 1)) {
2326 if (wmi_prof_cfg_cmd(ar->arWmi, period, nbins) != 0) {
2333 /* Start a profiling bucket/bin at the specified address */
2334 case AR6000_XIOCTL_PROF_ADDR_SET:
2337 if (get_user(addr, (unsigned int *)userdata)) {
2342 if (wmi_prof_addr_set_cmd(ar->arWmi, addr) != 0) {
2349 /* START Target-side profiling */
2350 case AR6000_XIOCTL_PROF_START:
2351 wmi_prof_start_cmd(ar->arWmi);
2354 /* STOP Target-side profiling */
2355 case AR6000_XIOCTL_PROF_STOP:
2356 wmi_prof_stop_cmd(ar->arWmi);
2358 case AR6000_XIOCTL_PROF_COUNT_GET:
2360 if (ar->bIsDestroyProgress) {
2364 if (ar->arWmiReady == false) {
2368 if (down_interruptible(&ar->arSem)) {
2372 if (ar->bIsDestroyProgress) {
2378 prof_count_available = false;
2379 ret = prof_count_get(dev);
2386 /* Wait for Target to respond. */
2387 wait_event_interruptible(arEvent, prof_count_available);
2388 if (signal_pending(current)) {
2391 if (copy_to_user(userdata, &prof_count_results,
2392 sizeof(prof_count_results)))
2400 #endif /* CONFIG_TARGET_PROFILE_SUPPORT */
2402 case AR6000_IOCTL_WMI_GETREV:
2404 if (copy_to_user(rq->ifr_data, &ar->arVersion,
2405 sizeof(ar->arVersion)))
2411 case AR6000_IOCTL_WMI_SETPWR:
2413 WMI_POWER_MODE_CMD pwrModeCmd;
2415 if (ar->arWmiReady == false) {
2417 } else if (copy_from_user(&pwrModeCmd, userdata,
2418 sizeof(pwrModeCmd)))
2422 if (wmi_powermode_cmd(ar->arWmi, pwrModeCmd.powerMode)
2430 case AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS:
2432 WMI_IBSS_PM_CAPS_CMD ibssPmCaps;
2434 if (ar->arWmiReady == false) {
2436 } else if (copy_from_user(&ibssPmCaps, userdata,
2437 sizeof(ibssPmCaps)))
2441 if (wmi_ibsspmcaps_cmd(ar->arWmi, ibssPmCaps.power_saving, ibssPmCaps.ttl,
2442 ibssPmCaps.atim_windows, ibssPmCaps.timeout_value) != 0)
2446 AR6000_SPIN_LOCK(&ar->arLock, 0);
2447 ar->arIbssPsEnable = ibssPmCaps.power_saving;
2448 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
2452 case AR6000_XIOCTL_WMI_SET_AP_PS:
2454 WMI_AP_PS_CMD apPsCmd;
2456 if (ar->arWmiReady == false) {
2458 } else if (copy_from_user(&apPsCmd, userdata,
2463 if (wmi_apps_cmd(ar->arWmi, apPsCmd.psType, apPsCmd.idle_time,
2464 apPsCmd.ps_period, apPsCmd.sleep_period) != 0)
2471 case AR6000_IOCTL_WMI_SET_PMPARAMS:
2473 WMI_POWER_PARAMS_CMD pmParams;
2475 if (ar->arWmiReady == false) {
2477 } else if (copy_from_user(&pmParams, userdata,
2482 if (wmi_pmparams_cmd(ar->arWmi, pmParams.idle_period,
2483 pmParams.pspoll_number,
2484 pmParams.dtim_policy,
2485 pmParams.tx_wakeup_policy,
2486 pmParams.num_tx_to_wakeup,
2487 #if WLAN_CONFIG_IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN
2488 IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN
2490 SEND_POWER_SAVE_FAIL_EVENT_ALWAYS
2499 case AR6000_IOCTL_WMI_SETSCAN:
2501 if (ar->arWmiReady == false) {
2503 } else if (copy_from_user(&ar->scParams, userdata,
2504 sizeof(ar->scParams)))
2508 if (CAN_SCAN_IN_CONNECT(ar->scParams.scanCtrlFlags)) {
2509 ar->arSkipScan = false;
2511 ar->arSkipScan = true;
2514 if (wmi_scanparams_cmd(ar->arWmi, ar->scParams.fg_start_period,
2515 ar->scParams.fg_end_period,
2516 ar->scParams.bg_period,
2517 ar->scParams.minact_chdwell_time,
2518 ar->scParams.maxact_chdwell_time,
2519 ar->scParams.pas_chdwell_time,
2520 ar->scParams.shortScanRatio,
2521 ar->scParams.scanCtrlFlags,
2522 ar->scParams.max_dfsch_act_time,
2523 ar->scParams.maxact_scan_per_ssid) != 0)
2530 case AR6000_IOCTL_WMI_SETLISTENINT:
2532 WMI_LISTEN_INT_CMD listenCmd;
2534 if (ar->arWmiReady == false) {
2536 } else if (copy_from_user(&listenCmd, userdata,
2541 if (wmi_listeninterval_cmd(ar->arWmi, listenCmd.listenInterval, listenCmd.numBeacons) != 0) {
2544 AR6000_SPIN_LOCK(&ar->arLock, 0);
2545 ar->arListenIntervalT = listenCmd.listenInterval;
2546 ar->arListenIntervalB = listenCmd.numBeacons;
2547 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
2553 case AR6000_IOCTL_WMI_SET_BMISS_TIME:
2555 WMI_BMISS_TIME_CMD bmissCmd;
2557 if (ar->arWmiReady == false) {
2559 } else if (copy_from_user(&bmissCmd, userdata,
2564 if (wmi_bmisstime_cmd(ar->arWmi, bmissCmd.bmissTime, bmissCmd.numBeacons) != 0) {
2570 case AR6000_IOCTL_WMI_SETBSSFILTER:
2572 WMI_BSS_FILTER_CMD filt;
2574 if (ar->arWmiReady == false) {
2576 } else if (copy_from_user(&filt, userdata,
2581 if (wmi_bssfilter_cmd(ar->arWmi, filt.bssFilter, filt.ieMask)
2585 ar->arUserBssFilter = filt.bssFilter;
2591 case AR6000_IOCTL_WMI_SET_SNRTHRESHOLD:
2593 ret = ar6000_ioctl_set_snr_threshold(dev, rq);
2596 case AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD:
2598 ret = ar6000_ioctl_set_rssi_threshold(dev, rq);
2601 case AR6000_XIOCTL_WMI_CLR_RSSISNR:
2603 if (ar->arWmiReady == false) {
2606 ret = wmi_clr_rssi_snr(ar->arWmi);
2609 case AR6000_XIOCTL_WMI_SET_LQTHRESHOLD:
2611 ret = ar6000_ioctl_set_lq_threshold(dev, rq);
2614 case AR6000_XIOCTL_WMI_SET_LPREAMBLE:
2616 WMI_SET_LPREAMBLE_CMD setLpreambleCmd;
2618 if (ar->arWmiReady == false) {
2620 } else if (copy_from_user(&setLpreambleCmd, userdata,
2621 sizeof(setLpreambleCmd)))
2625 if (wmi_set_lpreamble_cmd(ar->arWmi, setLpreambleCmd.status,
2626 #if WLAN_CONFIG_DONOT_IGNORE_BARKER_IN_ERP
2627 WMI_DONOT_IGNORE_BARKER_IN_ERP
2629 WMI_IGNORE_BARKER_IN_ERP
2639 case AR6000_XIOCTL_WMI_SET_RTS:
2641 WMI_SET_RTS_CMD rtsCmd;
2642 if (ar->arWmiReady == false) {
2644 } else if (copy_from_user(&rtsCmd, userdata,
2649 ar->arRTS = rtsCmd.threshold;
2650 if (wmi_set_rts_cmd(ar->arWmi, rtsCmd.threshold)
2659 case AR6000_XIOCTL_WMI_SET_WMM:
2661 ret = ar6000_ioctl_set_wmm(dev, rq);
2664 case AR6000_XIOCTL_WMI_SET_QOS_SUPP:
2666 ret = ar6000_ioctl_set_qos_supp(dev, rq);
2669 case AR6000_XIOCTL_WMI_SET_TXOP:
2671 ret = ar6000_ioctl_set_txop(dev, rq);
2674 case AR6000_XIOCTL_WMI_GET_RD:
2676 ret = ar6000_ioctl_get_rd(dev, rq);
2679 case AR6000_IOCTL_WMI_SET_CHANNELPARAMS:
2681 ret = ar6000_ioctl_set_channelParams(dev, rq);
2684 case AR6000_IOCTL_WMI_SET_PROBEDSSID:
2686 ret = ar6000_ioctl_set_probedSsid(dev, rq);
2689 case AR6000_IOCTL_WMI_SET_BADAP:
2691 ret = ar6000_ioctl_set_badAp(dev, rq);
2694 case AR6000_IOCTL_WMI_CREATE_QOS:
2696 ret = ar6000_ioctl_create_qos(dev, rq);
2699 case AR6000_IOCTL_WMI_DELETE_QOS:
2701 ret = ar6000_ioctl_delete_qos(dev, rq);
2704 case AR6000_IOCTL_WMI_GET_QOS_QUEUE:
2706 ret = ar6000_ioctl_get_qos_queue(dev, rq);
2709 case AR6000_IOCTL_WMI_GET_TARGET_STATS:
2711 ret = ar6000_ioctl_get_target_stats(dev, rq);
2714 case AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK:
2716 ret = ar6000_ioctl_set_error_report_bitmask(dev, rq);
2719 case AR6000_IOCTL_WMI_SET_ASSOC_INFO:
2721 WMI_SET_ASSOC_INFO_CMD cmd;
2722 u8 assocInfo[WMI_MAX_ASSOC_INFO_LEN];
2724 if (ar->arWmiReady == false) {
2729 if (get_user(cmd.ieType, userdata)) {
2733 if (cmd.ieType >= WMI_MAX_ASSOC_INFO_TYPE) {
2738 if (get_user(cmd.bufferSize, userdata + 1) ||
2739 (cmd.bufferSize > WMI_MAX_ASSOC_INFO_LEN) ||
2740 copy_from_user(assocInfo, userdata + 2, cmd.bufferSize)) {
2744 if (wmi_associnfo_cmd(ar->arWmi, cmd.ieType,
2745 cmd.bufferSize, assocInfo) != 0) {
2751 case AR6000_IOCTL_WMI_SET_ACCESS_PARAMS:
2753 ret = ar6000_ioctl_set_access_params(dev, rq);
2756 case AR6000_IOCTL_WMI_SET_DISC_TIMEOUT:
2758 ret = ar6000_ioctl_set_disconnect_timeout(dev, rq);
2761 case AR6000_XIOCTL_FORCE_TARGET_RESET:
2763 if (ar->arHtcTarget)
2765 // HTCForceReset(htcTarget);
2769 AR_DEBUG_PRINTF(ATH_DEBUG_WARN,("ar6000_ioctl cannot attempt reset.\n"));
2773 case AR6000_XIOCTL_TARGET_INFO:
2774 case AR6000_XIOCTL_CHECK_TARGET_READY: /* backwards compatibility */
2776 /* If we made it to here, then the Target exists and is ready. */
2778 if (cmd == AR6000_XIOCTL_TARGET_INFO) {
2779 if (copy_to_user((u32 *)rq->ifr_data, &ar->arVersion.target_ver,
2780 sizeof(ar->arVersion.target_ver)))
2784 if (copy_to_user(((u32 *)rq->ifr_data)+1, &ar->arTargetType,
2785 sizeof(ar->arTargetType)))
2792 case AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS:
2794 WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD hbparam;
2796 if (copy_from_user(&hbparam, userdata, sizeof(hbparam)))
2800 AR6000_SPIN_LOCK(&ar->arLock, 0);
2801 /* Start a cyclic timer with the parameters provided. */
2802 if (hbparam.frequency) {
2803 ar->arHBChallengeResp.frequency = hbparam.frequency;
2805 if (hbparam.threshold) {
2806 ar->arHBChallengeResp.missThres = hbparam.threshold;
2809 /* Delete the pending timer and start a new one */
2810 if (timer_pending(&ar->arHBChallengeResp.timer)) {
2811 A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
2813 A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
2814 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
2818 case AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP:
2822 if (copy_from_user(&cookie, userdata, sizeof(cookie))) {
2827 /* Send the challenge on the control channel */
2828 if (wmi_get_challenge_resp_cmd(ar->arWmi, cookie, APP_HB_CHALLENGE) != 0) {
2835 case AR6000_XIOCTL_USER_SETKEYS:
2838 ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_RUN;
2840 if (copy_from_user(&ar->user_key_ctrl, userdata,
2841 sizeof(ar->user_key_ctrl)))
2847 A_PRINTF("ar6000 USER set key %x\n", ar->user_key_ctrl);
2850 #endif /* USER_KEYS */
2852 #ifdef CONFIG_HOST_GPIO_SUPPORT
2853 case AR6000_XIOCTL_GPIO_OUTPUT_SET:
2855 struct ar6000_gpio_output_set_cmd_s gpio_output_set_cmd;
2857 if (ar->bIsDestroyProgress) {
2861 if (ar->arWmiReady == false) {
2865 if (down_interruptible(&ar->arSem)) {
2869 if (ar->bIsDestroyProgress) {
2875 if (copy_from_user(&gpio_output_set_cmd, userdata,
2876 sizeof(gpio_output_set_cmd)))
2880 ret = ar6000_gpio_output_set(dev,
2881 gpio_output_set_cmd.set_mask,
2882 gpio_output_set_cmd.clear_mask,
2883 gpio_output_set_cmd.enable_mask,
2884 gpio_output_set_cmd.disable_mask);
2892 case AR6000_XIOCTL_GPIO_INPUT_GET:
2894 if (ar->bIsDestroyProgress) {
2898 if (ar->arWmiReady == false) {
2902 if (down_interruptible(&ar->arSem)) {
2906 if (ar->bIsDestroyProgress) {
2912 ret = ar6000_gpio_input_get(dev);
2919 /* Wait for Target to respond. */
2920 wait_event_interruptible(arEvent, gpio_data_available);
2921 if (signal_pending(current)) {
2924 A_ASSERT(gpio_reg_results.gpioreg_id == GPIO_ID_NONE);
2926 if (copy_to_user(userdata, &gpio_reg_results.value,
2927 sizeof(gpio_reg_results.value)))
2935 case AR6000_XIOCTL_GPIO_REGISTER_SET:
2937 struct ar6000_gpio_register_cmd_s gpio_register_cmd;
2939 if (ar->bIsDestroyProgress) {
2943 if (ar->arWmiReady == false) {
2947 if (down_interruptible(&ar->arSem)) {
2951 if (ar->bIsDestroyProgress) {
2957 if (copy_from_user(&gpio_register_cmd, userdata,
2958 sizeof(gpio_register_cmd)))
2962 ret = ar6000_gpio_register_set(dev,
2963 gpio_register_cmd.gpioreg_id,
2964 gpio_register_cmd.value);
2969 /* Wait for acknowledgement from Target */
2970 wait_event_interruptible(arEvent, gpio_ack_received);
2971 if (signal_pending(current)) {
2978 case AR6000_XIOCTL_GPIO_REGISTER_GET:
2980 struct ar6000_gpio_register_cmd_s gpio_register_cmd;
2982 if (ar->bIsDestroyProgress) {
2986 if (ar->arWmiReady == false) {
2990 if (down_interruptible(&ar->arSem)) {
2994 if (ar->bIsDestroyProgress) {
3000 if (copy_from_user(&gpio_register_cmd, userdata,
3001 sizeof(gpio_register_cmd)))
3005 ret = ar6000_gpio_register_get(dev, gpio_register_cmd.gpioreg_id);
3012 /* Wait for Target to respond. */
3013 wait_event_interruptible(arEvent, gpio_data_available);
3014 if (signal_pending(current)) {
3017 A_ASSERT(gpio_register_cmd.gpioreg_id == gpio_reg_results.gpioreg_id);
3018 if (copy_to_user(userdata, &gpio_reg_results,
3019 sizeof(gpio_reg_results)))
3028 case AR6000_XIOCTL_GPIO_INTR_ACK:
3030 struct ar6000_gpio_intr_ack_cmd_s gpio_intr_ack_cmd;
3032 if (ar->bIsDestroyProgress) {
3036 if (ar->arWmiReady == false) {
3040 if (down_interruptible(&ar->arSem)) {
3044 if (ar->bIsDestroyProgress) {
3050 if (copy_from_user(&gpio_intr_ack_cmd, userdata,
3051 sizeof(gpio_intr_ack_cmd)))
3055 ret = ar6000_gpio_intr_ack(dev, gpio_intr_ack_cmd.ack_mask);
3063 case AR6000_XIOCTL_GPIO_INTR_WAIT:
3065 /* Wait for Target to report an interrupt. */
3066 wait_event_interruptible(arEvent, gpio_intr_available);
3068 if (signal_pending(current)) {
3071 if (copy_to_user(userdata, &gpio_intr_results,
3072 sizeof(gpio_intr_results)))
3079 #endif /* CONFIG_HOST_GPIO_SUPPORT */
3081 case AR6000_XIOCTL_DBGLOG_CFG_MODULE:
3083 struct ar6000_dbglog_module_config_s config;
3085 if (copy_from_user(&config, userdata, sizeof(config))) {
3090 /* Send the challenge on the control channel */
3091 if (wmi_config_debug_module_cmd(ar->arWmi, config.mmask,
3092 config.tsr, config.rep,
3093 config.size, config.valid) != 0)
3101 case AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS:
3103 /* Send the challenge on the control channel */
3104 if (ar6000_dbglog_get_debug_logs(ar) != 0)
3112 case AR6000_XIOCTL_SET_ADHOC_BSSID:
3114 WMI_SET_ADHOC_BSSID_CMD adhocBssid;
3116 if (ar->arWmiReady == false) {
3118 } else if (copy_from_user(&adhocBssid, userdata,
3119 sizeof(adhocBssid)))
3122 } else if (memcmp(adhocBssid.bssid, bcast_mac,
3123 AR6000_ETH_ADDR_LEN) == 0)
3128 memcpy(ar->arReqBssid, adhocBssid.bssid, sizeof(ar->arReqBssid));
3133 case AR6000_XIOCTL_SET_OPT_MODE:
3135 WMI_SET_OPT_MODE_CMD optModeCmd;
3136 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
3138 if (ar->arWmiReady == false) {
3140 } else if (copy_from_user(&optModeCmd, userdata,
3141 sizeof(optModeCmd)))
3144 } else if (ar->arConnected && optModeCmd.optMode == SPECIAL_ON) {
3147 } else if (wmi_set_opt_mode_cmd(ar->arWmi, optModeCmd.optMode)
3155 case AR6000_XIOCTL_OPT_SEND_FRAME:
3157 WMI_OPT_TX_FRAME_CMD optTxFrmCmd;
3158 u8 data[MAX_OPT_DATA_LEN];
3160 if (ar->arWmiReady == false) {
3165 if (copy_from_user(&optTxFrmCmd, userdata, sizeof(optTxFrmCmd))) {
3170 if (optTxFrmCmd.optIEDataLen > MAX_OPT_DATA_LEN) {
3175 if (copy_from_user(data, userdata+sizeof(WMI_OPT_TX_FRAME_CMD) - 1,
3176 optTxFrmCmd.optIEDataLen)) {
3181 ret = wmi_opt_tx_frame_cmd(ar->arWmi,
3182 optTxFrmCmd.frmType,
3183 optTxFrmCmd.dstAddr,
3185 optTxFrmCmd.optIEDataLen,
3189 case AR6000_XIOCTL_WMI_SETRETRYLIMITS:
3191 WMI_SET_RETRY_LIMITS_CMD setRetryParams;
3193 if (ar->arWmiReady == false) {
3195 } else if (copy_from_user(&setRetryParams, userdata,
3196 sizeof(setRetryParams)))
3200 if (wmi_set_retry_limits_cmd(ar->arWmi, setRetryParams.frameType,
3201 setRetryParams.trafficClass,
3202 setRetryParams.maxRetries,
3203 setRetryParams.enableNotify) != 0)
3207 AR6000_SPIN_LOCK(&ar->arLock, 0);
3208 ar->arMaxRetries = setRetryParams.maxRetries;
3209 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
3214 case AR6000_XIOCTL_SET_BEACON_INTVAL:
3216 WMI_BEACON_INT_CMD bIntvlCmd;
3218 if (ar->arWmiReady == false) {
3220 } else if (copy_from_user(&bIntvlCmd, userdata,
3224 } else if (wmi_set_adhoc_bconIntvl_cmd(ar->arWmi, bIntvlCmd.beaconInterval)
3230 ar->ap_beacon_interval = bIntvlCmd.beaconInterval;
3231 ar->ap_profile_flag = 1; /* There is a change in profile */
3235 case IEEE80211_IOCTL_SETAUTHALG:
3237 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
3238 struct ieee80211req_authalg req;
3240 if (ar->arWmiReady == false) {
3242 } else if (copy_from_user(&req, userdata,
3243 sizeof(struct ieee80211req_authalg)))
3247 if (req.auth_alg & AUTH_ALG_OPEN_SYSTEM) {
3248 ar->arDot11AuthMode |= OPEN_AUTH;
3249 ar->arPairwiseCrypto = NONE_CRYPT;
3250 ar->arGroupCrypto = NONE_CRYPT;
3252 if (req.auth_alg & AUTH_ALG_SHARED_KEY) {
3253 ar->arDot11AuthMode |= SHARED_AUTH;
3254 ar->arPairwiseCrypto = WEP_CRYPT;
3255 ar->arGroupCrypto = WEP_CRYPT;
3256 ar->arAuthMode = NONE_AUTH;
3258 if (req.auth_alg == AUTH_ALG_LEAP) {
3259 ar->arDot11AuthMode = LEAP_AUTH;
3265 case AR6000_XIOCTL_SET_VOICE_PKT_SIZE:
3266 ret = ar6000_xioctl_set_voice_pkt_size(dev, userdata);
3269 case AR6000_XIOCTL_SET_MAX_SP:
3270 ret = ar6000_xioctl_set_max_sp_len(dev, userdata);
3273 case AR6000_XIOCTL_WMI_GET_ROAM_TBL:
3274 ret = ar6000_ioctl_get_roam_tbl(dev, rq);
3276 case AR6000_XIOCTL_WMI_SET_ROAM_CTRL:
3277 ret = ar6000_ioctl_set_roam_ctrl(dev, userdata);
3279 case AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS:
3280 ret = ar6000_ioctl_set_powersave_timers(dev, userdata);
3282 case AR6000_XIOCTRL_WMI_GET_POWER_MODE:
3283 ret = ar6000_ioctl_get_power_mode(dev, rq);
3285 case AR6000_XIOCTRL_WMI_SET_WLAN_STATE:
3287 AR6000_WLAN_STATE state;
3288 if (get_user(state, (unsigned int *)userdata))
3290 else if (ar6000_set_wlan_state(ar, state) != 0)
3294 case AR6000_XIOCTL_WMI_GET_ROAM_DATA:
3295 ret = ar6000_ioctl_get_roam_data(dev, rq);
3298 case AR6000_XIOCTL_WMI_SET_BT_STATUS:
3299 ret = ar6000_xioctl_set_bt_status_cmd(dev, userdata);
3302 case AR6000_XIOCTL_WMI_SET_BT_PARAMS:
3303 ret = ar6000_xioctl_set_bt_params_cmd(dev, userdata);
3306 case AR6000_XIOCTL_WMI_SET_BTCOEX_FE_ANT:
3307 ret = ar6000_xioctl_set_btcoex_fe_ant_cmd(dev, userdata);
3310 case AR6000_XIOCTL_WMI_SET_BTCOEX_COLOCATED_BT_DEV:
3311 ret = ar6000_xioctl_set_btcoex_colocated_bt_dev_cmd(dev, userdata);
3314 case AR6000_XIOCTL_WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG:
3315 ret = ar6000_xioctl_set_btcoex_btinquiry_page_config_cmd(dev, userdata);
3318 case AR6000_XIOCTL_WMI_SET_BTCOEX_SCO_CONFIG:
3319 ret = ar6000_xioctl_set_btcoex_sco_config_cmd( dev, userdata);
3322 case AR6000_XIOCTL_WMI_SET_BTCOEX_A2DP_CONFIG:
3323 ret = ar6000_xioctl_set_btcoex_a2dp_config_cmd(dev, userdata);
3326 case AR6000_XIOCTL_WMI_SET_BTCOEX_ACLCOEX_CONFIG:
3327 ret = ar6000_xioctl_set_btcoex_aclcoex_config_cmd(dev, userdata);
3330 case AR6000_XIOCTL_WMI_SET_BTCOEX_DEBUG:
3331 ret = ar60000_xioctl_set_btcoex_debug_cmd(dev, userdata);
3334 case AR6000_XIOCTL_WMI_SET_BT_OPERATING_STATUS:
3335 ret = ar6000_xioctl_set_btcoex_bt_operating_status_cmd(dev, userdata);
3338 case AR6000_XIOCTL_WMI_GET_BTCOEX_CONFIG:
3339 ret = ar6000_xioctl_get_btcoex_config_cmd(dev, userdata, rq);
3342 case AR6000_XIOCTL_WMI_GET_BTCOEX_STATS:
3343 ret = ar6000_xioctl_get_btcoex_stats_cmd(dev, userdata, rq);
3346 case AR6000_XIOCTL_WMI_STARTSCAN:
3348 WMI_START_SCAN_CMD setStartScanCmd, *cmdp;
3350 if (ar->arWmiReady == false) {
3352 } else if (copy_from_user(&setStartScanCmd, userdata,
3353 sizeof(setStartScanCmd)))
3357 if (setStartScanCmd.numChannels > 1) {
3358 cmdp = A_MALLOC(130);
3359 if (copy_from_user(cmdp, userdata,
3361 ((setStartScanCmd.numChannels - 1) *
3369 cmdp = &setStartScanCmd;
3372 if (wmi_startscan_cmd(ar->arWmi, cmdp->scanType,
3375 cmdp->homeDwellTime,
3376 cmdp->forceScanInterval,
3378 cmdp->channelList) != 0)
3385 case AR6000_XIOCTL_WMI_SETFIXRATES:
3387 WMI_FIX_RATES_CMD setFixRatesCmd;
3390 if (ar->arWmiReady == false) {
3392 } else if (copy_from_user(&setFixRatesCmd, userdata,
3393 sizeof(setFixRatesCmd)))
3397 returnStatus = wmi_set_fixrates_cmd(ar->arWmi, setFixRatesCmd.fixRateMask);
3398 if (returnStatus == A_EINVAL) {
3400 } else if(returnStatus != 0) {
3403 ar->ap_profile_flag = 1; /* There is a change in profile */
3409 case AR6000_XIOCTL_WMI_GETFIXRATES:
3411 WMI_FIX_RATES_CMD getFixRatesCmd;
3412 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
3415 if (ar->bIsDestroyProgress) {
3419 if (ar->arWmiReady == false) {
3424 if (down_interruptible(&ar->arSem)) {
3428 if (ar->bIsDestroyProgress) {
3433 /* Used copy_from_user/copy_to_user to access user space data */
3434 if (copy_from_user(&getFixRatesCmd, userdata, sizeof(getFixRatesCmd))) {
3437 ar->arRateMask = 0xFFFFFFFF;
3439 if (wmi_get_ratemask_cmd(ar->arWmi) != 0) {
3445 wait_event_interruptible_timeout(arEvent, ar->arRateMask != 0xFFFFFFFF, wmitimeout * HZ);
3447 if (signal_pending(current)) {
3452 getFixRatesCmd.fixRateMask = ar->arRateMask;
3455 if(copy_to_user(userdata, &getFixRatesCmd, sizeof(getFixRatesCmd))) {
3463 case AR6000_XIOCTL_WMI_SET_AUTHMODE:
3465 WMI_SET_AUTH_MODE_CMD setAuthMode;
3467 if (ar->arWmiReady == false) {
3469 } else if (copy_from_user(&setAuthMode, userdata,
3470 sizeof(setAuthMode)))
3474 if (wmi_set_authmode_cmd(ar->arWmi, setAuthMode.mode) != 0)
3481 case AR6000_XIOCTL_WMI_SET_REASSOCMODE:
3483 WMI_SET_REASSOC_MODE_CMD setReassocMode;
3485 if (ar->arWmiReady == false) {
3487 } else if (copy_from_user(&setReassocMode, userdata,
3488 sizeof(setReassocMode)))
3492 if (wmi_set_reassocmode_cmd(ar->arWmi, setReassocMode.mode) != 0)
3499 case AR6000_XIOCTL_DIAG_READ:
3502 if (get_user(addr, (unsigned int *)userdata)) {
3506 addr = TARG_VTOP(ar->arTargetType, addr);
3507 if (ar6000_ReadRegDiag(ar->arHifDevice, &addr, &data) != 0) {
3510 if (put_user(data, (unsigned int *)userdata + 1)) {
3516 case AR6000_XIOCTL_DIAG_WRITE:
3519 if (get_user(addr, (unsigned int *)userdata) ||
3520 get_user(data, (unsigned int *)userdata + 1)) {
3524 addr = TARG_VTOP(ar->arTargetType, addr);
3525 if (ar6000_WriteRegDiag(ar->arHifDevice, &addr, &data) != 0) {
3530 case AR6000_XIOCTL_WMI_SET_KEEPALIVE:
3532 WMI_SET_KEEPALIVE_CMD setKeepAlive;
3533 if (ar->arWmiReady == false) {
3536 } else if (copy_from_user(&setKeepAlive, userdata,
3537 sizeof(setKeepAlive))){
3540 if (wmi_set_keepalive_cmd(ar->arWmi, setKeepAlive.keepaliveInterval) != 0) {
3546 case AR6000_XIOCTL_WMI_SET_PARAMS:
3548 WMI_SET_PARAMS_CMD cmd;
3549 if (ar->arWmiReady == false) {
3552 } else if (copy_from_user(&cmd, userdata,
3555 } else if (copy_from_user(&cmd, userdata,
3556 sizeof(cmd) + cmd.length))
3560 if (wmi_set_params_cmd(ar->arWmi, cmd.opcode, cmd.length, cmd.buffer) != 0) {
3566 case AR6000_XIOCTL_WMI_SET_MCAST_FILTER:
3568 WMI_SET_MCAST_FILTER_CMD cmd;
3569 if (ar->arWmiReady == false) {
3572 } else if (copy_from_user(&cmd, userdata,
3576 if (wmi_set_mcast_filter_cmd(ar->arWmi, cmd.multicast_mac[0],
3577 cmd.multicast_mac[1],
3578 cmd.multicast_mac[2],
3579 cmd.multicast_mac[3]) != 0) {
3585 case AR6000_XIOCTL_WMI_DEL_MCAST_FILTER:
3587 WMI_SET_MCAST_FILTER_CMD cmd;
3588 if (ar->arWmiReady == false) {
3591 } else if (copy_from_user(&cmd, userdata,
3595 if (wmi_del_mcast_filter_cmd(ar->arWmi, cmd.multicast_mac[0],
3596 cmd.multicast_mac[1],
3597 cmd.multicast_mac[2],
3598 cmd.multicast_mac[3]) != 0) {
3604 case AR6000_XIOCTL_WMI_MCAST_FILTER:
3606 WMI_MCAST_FILTER_CMD cmd;
3607 if (ar->arWmiReady == false) {
3610 } else if (copy_from_user(&cmd, userdata,
3614 if (wmi_mcast_filter_cmd(ar->arWmi, cmd.enable) != 0) {
3620 case AR6000_XIOCTL_WMI_GET_KEEPALIVE:
3622 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
3623 WMI_GET_KEEPALIVE_CMD getKeepAlive;
3625 if (ar->bIsDestroyProgress) {
3629 if (ar->arWmiReady == false) {
3633 if (down_interruptible(&ar->arSem)) {
3637 if (ar->bIsDestroyProgress) {
3642 if (copy_from_user(&getKeepAlive, userdata,sizeof(getKeepAlive))) {
3645 getKeepAlive.keepaliveInterval = wmi_get_keepalive_cmd(ar->arWmi);
3646 ar->arKeepaliveConfigured = 0xFF;
3647 if (wmi_get_keepalive_configured(ar->arWmi) != 0){
3652 wait_event_interruptible_timeout(arEvent, ar->arKeepaliveConfigured != 0xFF, wmitimeout * HZ);
3653 if (signal_pending(current)) {
3658 getKeepAlive.configured = ar->arKeepaliveConfigured;
3660 if (copy_to_user(userdata, &getKeepAlive, sizeof(getKeepAlive))) {
3667 case AR6000_XIOCTL_WMI_SET_APPIE:
3669 WMI_SET_APPIE_CMD appIEcmd;
3670 u8 appIeInfo[IEEE80211_APPIE_FRAME_MAX_LEN];
3673 if (ar->arWmiReady == false) {
3677 if (get_user(fType, (u32 *)userdata)) {
3681 appIEcmd.mgmtFrmType = fType;
3682 if (appIEcmd.mgmtFrmType >= IEEE80211_APPIE_NUM_OF_FRAME) {
3685 if (get_user(ieLen, (u32 *)(userdata + 4))) {
3689 appIEcmd.ieLen = ieLen;
3690 A_PRINTF("WPSIE: Type-%d, Len-%d\n",appIEcmd.mgmtFrmType, appIEcmd.ieLen);
3691 if (appIEcmd.ieLen > IEEE80211_APPIE_FRAME_MAX_LEN) {
3695 if (copy_from_user(appIeInfo, userdata + 8, appIEcmd.ieLen)) {
3698 if (wmi_set_appie_cmd(ar->arWmi, appIEcmd.mgmtFrmType,
3699 appIEcmd.ieLen, appIeInfo) != 0)
3707 case AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER:
3709 WMI_BSS_FILTER_CMD cmd;
3712 if (copy_from_user(&filterType, userdata, sizeof(u32)))
3717 if (filterType & (IEEE80211_FILTER_TYPE_BEACON |
3718 IEEE80211_FILTER_TYPE_PROBE_RESP))
3720 cmd.bssFilter = ALL_BSS_FILTER;
3722 cmd.bssFilter = NONE_BSS_FILTER;
3724 if (wmi_bssfilter_cmd(ar->arWmi, cmd.bssFilter, 0) != 0) {
3727 ar->arUserBssFilter = cmd.bssFilter;
3730 AR6000_SPIN_LOCK(&ar->arLock, 0);
3731 ar->arMgmtFilter = filterType;
3732 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
3735 case AR6000_XIOCTL_WMI_SET_WSC_STATUS:
3739 if (ar->arWmiReady == false) {
3742 } else if (copy_from_user(&wsc_status, userdata, sizeof(u32)))
3747 if (wmi_set_wsc_status_cmd(ar->arWmi, wsc_status) != 0) {
3752 case AR6000_XIOCTL_BMI_ROMPATCH_INSTALL:
3760 if (get_user(ROM_addr, (u32 *)userdata) ||
3761 get_user(RAM_addr, (u32 *)userdata + 1) ||
3762 get_user(nbytes, (u32 *)userdata + 2) ||
3763 get_user(do_activate, (u32 *)userdata + 3)) {
3767 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Install rompatch from ROM: 0x%x to RAM: 0x%x length: %d\n",
3768 ROM_addr, RAM_addr, nbytes));
3769 ret = BMIrompatchInstall(hifDevice, ROM_addr, RAM_addr,
3770 nbytes, do_activate, &rompatch_id);
3773 if (put_user(rompatch_id, (unsigned int *)rq->ifr_data)) {
3781 case AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL:
3785 if (get_user(rompatch_id, (u32 *)userdata)) {
3789 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("UNinstall rompatch_id %d\n", rompatch_id));
3790 ret = BMIrompatchUninstall(hifDevice, rompatch_id);
3794 case AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE:
3795 case AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE:
3799 if (get_user(rompatch_count, (u32 *)userdata)) {
3803 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Change rompatch activation count=%d\n", rompatch_count));
3804 length = sizeof(u32) * rompatch_count;
3805 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
3806 A_MEMZERO(buffer, length);
3807 if (copy_from_user(buffer, &userdata[sizeof(rompatch_count)], length))
3811 if (cmd == AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE) {
3812 ret = BMIrompatchActivate(hifDevice, rompatch_count, (u32 *)buffer);
3814 ret = BMIrompatchDeactivate(hifDevice, rompatch_count, (u32 *)buffer);
3824 case AR6000_XIOCTL_SET_IP:
3826 WMI_SET_IP_CMD setIP;
3828 if (ar->arWmiReady == false) {
3830 } else if (copy_from_user(&setIP, userdata,
3835 if (wmi_set_ip_cmd(ar->arWmi,
3844 case AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE:
3846 WMI_SET_HOST_SLEEP_MODE_CMD setHostSleepMode;
3848 if (ar->arWmiReady == false) {
3850 } else if (copy_from_user(&setHostSleepMode, userdata,
3851 sizeof(setHostSleepMode)))
3855 if (wmi_set_host_sleep_mode_cmd(ar->arWmi,
3856 &setHostSleepMode) != 0)
3863 case AR6000_XIOCTL_WMI_SET_WOW_MODE:
3865 WMI_SET_WOW_MODE_CMD setWowMode;
3867 if (ar->arWmiReady == false) {
3869 } else if (copy_from_user(&setWowMode, userdata,
3870 sizeof(setWowMode)))
3874 if (wmi_set_wow_mode_cmd(ar->arWmi,
3882 case AR6000_XIOCTL_WMI_GET_WOW_LIST:
3884 WMI_GET_WOW_LIST_CMD getWowList;
3886 if (ar->arWmiReady == false) {
3888 } else if (copy_from_user(&getWowList, userdata,
3889 sizeof(getWowList)))
3893 if (wmi_get_wow_list_cmd(ar->arWmi,
3901 case AR6000_XIOCTL_WMI_ADD_WOW_PATTERN:
3903 #define WOW_PATTERN_SIZE 64
3904 #define WOW_MASK_SIZE 64
3906 WMI_ADD_WOW_PATTERN_CMD cmd;
3907 u8 mask_data[WOW_PATTERN_SIZE]={0};
3908 u8 pattern_data[WOW_PATTERN_SIZE]={0};
3911 if (ar->arWmiReady == false) {
3915 if(copy_from_user(&cmd, userdata,
3916 sizeof(WMI_ADD_WOW_PATTERN_CMD)))
3921 if (copy_from_user(pattern_data,
3928 if (copy_from_user(mask_data,
3929 (userdata + 3 + cmd.filter_size),
3935 if (wmi_add_wow_pattern_cmd(ar->arWmi,
3936 &cmd, pattern_data, mask_data, cmd.filter_size) != 0)
3941 #undef WOW_PATTERN_SIZE
3942 #undef WOW_MASK_SIZE
3945 case AR6000_XIOCTL_WMI_DEL_WOW_PATTERN:
3947 WMI_DEL_WOW_PATTERN_CMD delWowPattern;
3949 if (ar->arWmiReady == false) {
3951 } else if (copy_from_user(&delWowPattern, userdata,
3952 sizeof(delWowPattern)))
3956 if (wmi_del_wow_pattern_cmd(ar->arWmi,
3957 &delWowPattern) != 0)
3964 case AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE:
3965 if (ar->arHtcTarget != NULL) {
3966 #ifdef ATH_DEBUG_MODULE
3967 HTCDumpCreditStates(ar->arHtcTarget);
3968 #endif /* ATH_DEBUG_MODULE */
3969 #ifdef HTC_EP_STAT_PROFILING
3971 struct htc_endpoint_stats stats;
3974 for (i = 0; i < 5; i++) {
3975 if (HTCGetEndpointStatistics(ar->arHtcTarget,
3977 HTC_EP_STAT_SAMPLE_AND_CLEAR,
3979 A_PRINTF(KERN_ALERT"------- Profiling Endpoint : %d \n", i);
3980 A_PRINTF(KERN_ALERT"TxCreditLowIndications : %d \n", stats.TxCreditLowIndications);
3981 A_PRINTF(KERN_ALERT"TxIssued : %d \n", stats.TxIssued);
3982 A_PRINTF(KERN_ALERT"TxDropped: %d \n", stats.TxDropped);
3983 A_PRINTF(KERN_ALERT"TxPacketsBundled : %d \n", stats.TxPacketsBundled);
3984 A_PRINTF(KERN_ALERT"TxBundles : %d \n", stats.TxBundles);
3985 A_PRINTF(KERN_ALERT"TxCreditRpts : %d \n", stats.TxCreditRpts);
3986 A_PRINTF(KERN_ALERT"TxCreditsRptsFromRx : %d \n", stats.TxCreditRptsFromRx);
3987 A_PRINTF(KERN_ALERT"TxCreditsRptsFromOther : %d \n", stats.TxCreditRptsFromOther);
3988 A_PRINTF(KERN_ALERT"TxCreditsRptsFromEp0 : %d \n", stats.TxCreditRptsFromEp0);
3989 A_PRINTF(KERN_ALERT"TxCreditsFromRx : %d \n", stats.TxCreditsFromRx);
3990 A_PRINTF(KERN_ALERT"TxCreditsFromOther : %d \n", stats.TxCreditsFromOther);
3991 A_PRINTF(KERN_ALERT"TxCreditsFromEp0 : %d \n", stats.TxCreditsFromEp0);
3992 A_PRINTF(KERN_ALERT"TxCreditsConsummed : %d \n", stats.TxCreditsConsummed);
3993 A_PRINTF(KERN_ALERT"TxCreditsReturned : %d \n", stats.TxCreditsReturned);
3994 A_PRINTF(KERN_ALERT"RxReceived : %d \n", stats.RxReceived);
3995 A_PRINTF(KERN_ALERT"RxPacketsBundled : %d \n", stats.RxPacketsBundled);
3996 A_PRINTF(KERN_ALERT"RxLookAheads : %d \n", stats.RxLookAheads);
3997 A_PRINTF(KERN_ALERT"RxBundleLookAheads : %d \n", stats.RxBundleLookAheads);
3998 A_PRINTF(KERN_ALERT"RxBundleIndFromHdr : %d \n", stats.RxBundleIndFromHdr);
3999 A_PRINTF(KERN_ALERT"RxAllocThreshHit : %d \n", stats.RxAllocThreshHit);
4000 A_PRINTF(KERN_ALERT"RxAllocThreshBytes : %d \n", stats.RxAllocThreshBytes);
4001 A_PRINTF(KERN_ALERT"---- \n");
4009 case AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE:
4010 if (ar->arHtcTarget != NULL) {
4011 struct ar6000_traffic_activity_change data;
4013 if (copy_from_user(&data, userdata, sizeof(data)))
4018 /* note, this is used for testing (mbox ping testing), indicate activity
4019 * change using the stream ID as the traffic class */
4020 ar6000_indicate_tx_activity(ar,
4022 data.Active ? true : false);
4025 case AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS:
4026 if (ar->arWmiReady == false) {
4028 } else if (copy_from_user(&connectCtrlFlags, userdata,
4029 sizeof(connectCtrlFlags)))
4033 ar->arConnectCtrlFlags = connectCtrlFlags;
4036 case AR6000_XIOCTL_WMI_SET_AKMP_PARAMS:
4037 if (ar->arWmiReady == false) {
4039 } else if (copy_from_user(&akmpParams, userdata,
4040 sizeof(WMI_SET_AKMP_PARAMS_CMD)))
4044 if (wmi_set_akmp_params_cmd(ar->arWmi, &akmpParams) != 0) {
4049 case AR6000_XIOCTL_WMI_SET_PMKID_LIST:
4050 if (ar->arWmiReady == false) {
4053 if (copy_from_user(&pmkidInfo.numPMKID, userdata,
4054 sizeof(pmkidInfo.numPMKID)))
4059 if (copy_from_user(&pmkidInfo.pmkidList,
4060 userdata + sizeof(pmkidInfo.numPMKID),
4061 pmkidInfo.numPMKID * sizeof(WMI_PMKID)))
4066 if (wmi_set_pmkid_list_cmd(ar->arWmi, &pmkidInfo) != 0) {
4071 case AR6000_XIOCTL_WMI_GET_PMKID_LIST:
4072 if (ar->arWmiReady == false) {
4075 if (wmi_get_pmkid_list_cmd(ar->arWmi) != 0) {
4080 case AR6000_XIOCTL_WMI_ABORT_SCAN:
4081 if (ar->arWmiReady == false) {
4084 ret = wmi_abort_scan_cmd(ar->arWmi);
4086 case AR6000_XIOCTL_AP_HIDDEN_SSID:
4089 if (ar->arWmiReady == false) {
4091 } else if (copy_from_user(&hidden_ssid, userdata, sizeof(hidden_ssid))) {
4094 wmi_ap_set_hidden_ssid(ar->arWmi, hidden_ssid);
4095 ar->ap_hidden_ssid = hidden_ssid;
4096 ar->ap_profile_flag = 1; /* There is a change in profile */
4100 case AR6000_XIOCTL_AP_GET_STA_LIST:
4102 if (ar->arWmiReady == false) {
4107 A_MEMZERO(&temp, sizeof(temp));
4108 for(i=0;i<AP_MAX_NUM_STA;i++) {
4109 memcpy(temp.sta[i].mac, ar->sta_list[i].mac, ATH_MAC_LEN);
4110 temp.sta[i].aid = ar->sta_list[i].aid;
4111 temp.sta[i].keymgmt = ar->sta_list[i].keymgmt;
4112 temp.sta[i].ucipher = ar->sta_list[i].ucipher;
4113 temp.sta[i].auth = ar->sta_list[i].auth;
4115 if(copy_to_user((ap_get_sta_t *)rq->ifr_data, &temp,
4116 sizeof(ar->sta_list))) {
4122 case AR6000_XIOCTL_AP_SET_NUM_STA:
4125 if (ar->arWmiReady == false) {
4127 } else if (copy_from_user(&num_sta, userdata, sizeof(num_sta))) {
4129 } else if(num_sta > AP_MAX_NUM_STA) {
4130 /* value out of range */
4133 wmi_ap_set_num_sta(ar->arWmi, num_sta);
4137 case AR6000_XIOCTL_AP_SET_ACL_POLICY:
4140 if (ar->arWmiReady == false) {
4142 } else if (copy_from_user(&policy, userdata, sizeof(policy))) {
4144 } else if(policy == ar->g_acl.policy) {
4145 /* No change in policy */
4147 if(!(policy & AP_ACL_RETAIN_LIST_MASK)) {
4148 /* clear ACL list */
4149 memset(&ar->g_acl,0,sizeof(WMI_AP_ACL));
4151 ar->g_acl.policy = policy;
4152 wmi_ap_set_acl_policy(ar->arWmi, policy);
4156 case AR6000_XIOCTL_AP_SET_ACL_MAC:
4158 WMI_AP_ACL_MAC_CMD acl;
4159 if (ar->arWmiReady == false) {
4161 } else if (copy_from_user(&acl, userdata, sizeof(acl))) {
4164 if(acl_add_del_mac(&ar->g_acl, &acl)) {
4165 wmi_ap_acl_mac_list(ar->arWmi, &acl);
4167 A_PRINTF("ACL list error\n");
4173 case AR6000_XIOCTL_AP_GET_ACL_LIST:
4175 if (ar->arWmiReady == false) {
4177 } else if(copy_to_user((WMI_AP_ACL *)rq->ifr_data, &ar->g_acl,
4178 sizeof(WMI_AP_ACL))) {
4183 case AR6000_XIOCTL_AP_COMMIT_CONFIG:
4185 ret = ar6000_ap_mode_profile_commit(ar);
4188 case IEEE80211_IOCTL_GETWPAIE:
4190 struct ieee80211req_wpaie wpaie;
4191 if (ar->arWmiReady == false) {
4193 } else if (copy_from_user(&wpaie, userdata, sizeof(wpaie))) {
4195 } else if (ar6000_ap_mode_get_wpa_ie(ar, &wpaie)) {
4197 } else if(copy_to_user(userdata, &wpaie, sizeof(wpaie))) {
4202 case AR6000_XIOCTL_AP_CONN_INACT_TIME:
4205 if (ar->arWmiReady == false) {
4207 } else if (copy_from_user(&period, userdata, sizeof(period))) {
4210 wmi_ap_conn_inact_time(ar->arWmi, period);
4214 case AR6000_XIOCTL_AP_PROT_SCAN_TIME:
4216 WMI_AP_PROT_SCAN_TIME_CMD bgscan;
4217 if (ar->arWmiReady == false) {
4219 } else if (copy_from_user(&bgscan, userdata, sizeof(bgscan))) {
4222 wmi_ap_bgscan_time(ar->arWmi, bgscan.period_min, bgscan.dwell_ms);
4226 case AR6000_XIOCTL_AP_SET_COUNTRY:
4228 ret = ar6000_ioctl_set_country(dev, rq);
4231 case AR6000_XIOCTL_AP_SET_DTIM:
4233 WMI_AP_SET_DTIM_CMD d;
4234 if (ar->arWmiReady == false) {
4236 } else if (copy_from_user(&d, userdata, sizeof(d))) {
4239 if(d.dtim > 0 && d.dtim < 11) {
4240 ar->ap_dtim_period = d.dtim;
4241 wmi_ap_set_dtim(ar->arWmi, d.dtim);
4242 ar->ap_profile_flag = 1; /* There is a change in profile */
4244 A_PRINTF("DTIM out of range. Valid range is [1-10]\n");
4250 case AR6000_XIOCTL_WMI_TARGET_EVENT_REPORT:
4252 WMI_SET_TARGET_EVENT_REPORT_CMD evtCfgCmd;
4254 if (ar->arWmiReady == false) {
4257 if (copy_from_user(&evtCfgCmd, userdata,
4258 sizeof(evtCfgCmd))) {
4262 ret = wmi_set_target_event_report_cmd(ar->arWmi, &evtCfgCmd);
4265 case AR6000_XIOCTL_AP_INTRA_BSS_COMM:
4268 if (ar->arWmiReady == false) {
4270 } else if (copy_from_user(&intra, userdata, sizeof(intra))) {
4273 ar->intra_bss = (intra?1:0);
4277 case AR6000_XIOCTL_DUMP_MODULE_DEBUG_INFO:
4279 struct drv_debug_module_s moduleinfo;
4281 if (copy_from_user(&moduleinfo, userdata, sizeof(moduleinfo))) {
4286 a_dump_module_debug_info_by_name(moduleinfo.modulename);
4290 case AR6000_XIOCTL_MODULE_DEBUG_SET_MASK:
4292 struct drv_debug_module_s moduleinfo;
4294 if (copy_from_user(&moduleinfo, userdata, sizeof(moduleinfo))) {
4299 if (a_set_module_mask(moduleinfo.modulename, moduleinfo.mask)) {
4305 case AR6000_XIOCTL_MODULE_DEBUG_GET_MASK:
4307 struct drv_debug_module_s moduleinfo;
4309 if (copy_from_user(&moduleinfo, userdata, sizeof(moduleinfo))) {
4314 if (a_get_module_mask(moduleinfo.modulename, &moduleinfo.mask)) {
4319 if (copy_to_user(userdata, &moduleinfo, sizeof(moduleinfo))) {
4326 #ifdef ATH_AR6K_11N_SUPPORT
4327 case AR6000_XIOCTL_DUMP_RCV_AGGR_STATS:
4329 PACKET_LOG *copy_of_pkt_log;
4331 aggr_dump_stats(ar->aggr_cntxt, ©_of_pkt_log);
4332 if (copy_to_user(rq->ifr_data, copy_of_pkt_log, sizeof(PACKET_LOG))) {
4337 case AR6000_XIOCTL_SETUP_AGGR:
4339 WMI_ADDBA_REQ_CMD cmd;
4341 if (ar->arWmiReady == false) {
4343 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4346 wmi_setup_aggr_cmd(ar->arWmi, cmd.tid);
4351 case AR6000_XIOCTL_DELE_AGGR:
4353 WMI_DELBA_REQ_CMD cmd;
4355 if (ar->arWmiReady == false) {
4357 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4360 wmi_delete_aggr_cmd(ar->arWmi, cmd.tid, cmd.is_sender_initiator);
4365 case AR6000_XIOCTL_ALLOW_AGGR:
4367 WMI_ALLOW_AGGR_CMD cmd;
4369 if (ar->arWmiReady == false) {
4371 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4374 wmi_allow_aggr_cmd(ar->arWmi, cmd.tx_allow_aggr, cmd.rx_allow_aggr);
4379 case AR6000_XIOCTL_SET_HT_CAP:
4381 if (ar->arWmiReady == false) {
4383 } else if (copy_from_user(&htCap, userdata,
4389 if (wmi_set_ht_cap_cmd(ar->arWmi, &htCap) != 0)
4396 case AR6000_XIOCTL_SET_HT_OP:
4398 if (ar->arWmiReady == false) {
4400 } else if (copy_from_user(&htOp, userdata,
4406 if (wmi_set_ht_op_cmd(ar->arWmi, htOp.sta_chan_width) != 0)
4414 case AR6000_XIOCTL_ACL_DATA:
4417 if (ar->arWmiReady == false) {
4419 } else if (ar6000_create_acl_data_osbuf(dev, (u8 *)userdata, &osbuf) != 0) {
4422 if (wmi_data_hdr_add(ar->arWmi, osbuf, DATA_MSGTYPE, 0, WMI_DATA_HDR_DATA_TYPE_ACL,0,NULL) != 0) {
4423 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("XIOCTL_ACL_DATA - wmi_data_hdr_add failed\n"));
4425 /* Send data buffer over HTC */
4426 ar6000_acl_data_tx(osbuf, ar->arNetDev);
4431 case AR6000_XIOCTL_HCI_CMD:
4435 WMI_HCI_CMD *cmd = (WMI_HCI_CMD *)tmp_buf;
4438 size = sizeof(cmd->cmd_buf_sz);
4439 if (ar->arWmiReady == false) {
4441 } else if (copy_from_user(cmd, userdata, size)) {
4443 } else if(copy_from_user(cmd->buf, userdata + size, cmd->cmd_buf_sz)) {
4446 if (wmi_send_hci_cmd(ar->arWmi, cmd->buf, cmd->cmd_buf_sz) != 0) {
4449 A_PRINTF_LOG("HCI Command To PAL --> \n");
4450 for(i = 0; i < cmd->cmd_buf_sz; i++) {
4451 A_PRINTF_LOG("0x%02x ",cmd->buf[i]);
4457 A_PRINTF_LOG("==================================\n");
4462 case AR6000_XIOCTL_WLAN_CONN_PRECEDENCE:
4464 WMI_SET_BT_WLAN_CONN_PRECEDENCE cmd;
4465 if (ar->arWmiReady == false) {
4467 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4470 if (cmd.precedence == BT_WLAN_CONN_PRECDENCE_WLAN ||
4471 cmd.precedence == BT_WLAN_CONN_PRECDENCE_PAL) {
4472 if ( wmi_set_wlan_conn_precedence_cmd(ar->arWmi, cmd.precedence) != 0) {
4481 case AR6000_XIOCTL_AP_GET_STAT:
4483 ret = ar6000_ioctl_get_ap_stats(dev, rq);
4486 case AR6000_XIOCTL_SET_TX_SELECT_RATES:
4488 WMI_SET_TX_SELECT_RATES_CMD masks;
4490 if (ar->arWmiReady == false) {
4492 } else if (copy_from_user(&masks, userdata,
4498 if (wmi_set_tx_select_rates_cmd(ar->arWmi, masks.rateMasks) != 0)
4505 case AR6000_XIOCTL_AP_GET_HIDDEN_SSID:
4507 WMI_AP_HIDDEN_SSID_CMD ssid;
4508 ssid.hidden_ssid = ar->ap_hidden_ssid;
4510 if (ar->arWmiReady == false) {
4512 } else if(copy_to_user((WMI_AP_HIDDEN_SSID_CMD *)rq->ifr_data,
4513 &ssid, sizeof(WMI_AP_HIDDEN_SSID_CMD))) {
4518 case AR6000_XIOCTL_AP_GET_COUNTRY:
4520 WMI_AP_SET_COUNTRY_CMD cty;
4521 memcpy(cty.countryCode, ar->ap_country_code, 3);
4523 if (ar->arWmiReady == false) {
4525 } else if(copy_to_user((WMI_AP_SET_COUNTRY_CMD *)rq->ifr_data,
4526 &cty, sizeof(WMI_AP_SET_COUNTRY_CMD))) {
4531 case AR6000_XIOCTL_AP_GET_WMODE:
4533 if (ar->arWmiReady == false) {
4535 } else if(copy_to_user((u8 *)rq->ifr_data,
4536 &ar->ap_wmode, sizeof(u8))) {
4541 case AR6000_XIOCTL_AP_GET_DTIM:
4543 WMI_AP_SET_DTIM_CMD dtim;
4544 dtim.dtim = ar->ap_dtim_period;
4546 if (ar->arWmiReady == false) {
4548 } else if(copy_to_user((WMI_AP_SET_DTIM_CMD *)rq->ifr_data,
4549 &dtim, sizeof(WMI_AP_SET_DTIM_CMD))) {
4554 case AR6000_XIOCTL_AP_GET_BINTVL:
4556 WMI_BEACON_INT_CMD bi;
4557 bi.beaconInterval = ar->ap_beacon_interval;
4559 if (ar->arWmiReady == false) {
4561 } else if(copy_to_user((WMI_BEACON_INT_CMD *)rq->ifr_data,
4562 &bi, sizeof(WMI_BEACON_INT_CMD))) {
4567 case AR6000_XIOCTL_AP_GET_RTS:
4569 WMI_SET_RTS_CMD rts;
4570 rts.threshold = ar->arRTS;
4572 if (ar->arWmiReady == false) {
4574 } else if(copy_to_user((WMI_SET_RTS_CMD *)rq->ifr_data,
4575 &rts, sizeof(WMI_SET_RTS_CMD))) {
4580 case AR6000_XIOCTL_FETCH_TARGET_REGS:
4582 u32 targregs[AR6003_FETCH_TARG_REGS_COUNT];
4584 if (ar->arTargetType == TARGET_TYPE_AR6003) {
4585 ar6k_FetchTargetRegs(hifDevice, targregs);
4586 if (copy_to_user((u32 *)rq->ifr_data, &targregs, sizeof(targregs)))
4595 case AR6000_XIOCTL_AP_SET_11BG_RATESET:
4597 WMI_AP_SET_11BG_RATESET_CMD rate;
4598 if (ar->arWmiReady == false) {
4600 } else if (copy_from_user(&rate, userdata, sizeof(rate))) {
4603 wmi_ap_set_rateset(ar->arWmi, rate.rateset);
4607 case AR6000_XIOCTL_GET_WLAN_SLEEP_STATE:
4609 WMI_REPORT_SLEEP_STATE_EVENT wmiSleepEvent ;
4611 if (ar->arWlanState == WLAN_ENABLED) {
4612 wmiSleepEvent.sleepState = WMI_REPORT_SLEEP_STATUS_IS_AWAKE;
4614 wmiSleepEvent.sleepState = WMI_REPORT_SLEEP_STATUS_IS_DEEP_SLEEP;
4616 rq->ifr_ifru.ifru_ivalue = ar->arWlanState; /* return value */
4618 ar6000_send_event_to_app(ar, WMI_REPORT_SLEEP_STATE_EVENTID, (u8 *)&wmiSleepEvent,
4619 sizeof(WMI_REPORT_SLEEP_STATE_EVENTID));
4623 case AR6000_XIOCTL_SET_BT_HW_POWER_STATE:
4626 if (get_user(state, (unsigned int *)userdata)) {
4630 if (ar6000_set_bt_hw_state(ar, state)!= 0) {
4635 case AR6000_XIOCTL_GET_BT_HW_POWER_STATE:
4636 rq->ifr_ifru.ifru_ivalue = !ar->arBTOff; /* return value */
4640 case AR6000_XIOCTL_WMI_SET_TX_SGI_PARAM:
4642 WMI_SET_TX_SGI_PARAM_CMD SGICmd;
4644 if (ar->arWmiReady == false) {
4646 } else if (copy_from_user(&SGICmd, userdata,
4650 if (wmi_SGI_cmd(ar->arWmi, SGICmd.sgiMask, SGICmd.sgiPERThreshold) != 0) {
4658 case AR6000_XIOCTL_ADD_AP_INTERFACE:
4659 #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT
4661 char ap_ifname[IFNAMSIZ] = {0,};
4662 if (copy_from_user(ap_ifname, userdata, IFNAMSIZ)) {
4665 if (ar6000_add_ap_interface(ar, ap_ifname) != 0) {
4674 case AR6000_XIOCTL_REMOVE_AP_INTERFACE:
4675 #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT
4676 if (ar6000_remove_ap_interface(ar) != 0) {
4684 case AR6000_XIOCTL_WMI_SET_EXCESS_TX_RETRY_THRES:
4686 ret = ar6000_xioctl_set_excess_tx_retry_thres_cmd(dev, userdata);
4695 rtnl_lock(); /* restore rtnl state */
4701 u8 mac_cmp_wild(u8 *mac, u8 *new_mac, u8 wild, u8 new_wild)
4705 for(i=0;i<ATH_MAC_LEN;i++) {
4706 if((wild & 1<<i) && (new_wild & 1<<i)) continue;
4707 if(mac[i] != new_mac[i]) return 1;
4709 if((memcmp(new_mac, null_mac, 6)==0) && new_wild &&
4710 (wild != new_wild)) {
4717 u8 acl_add_del_mac(WMI_AP_ACL *a, WMI_AP_ACL_MAC_CMD *acl)
4719 s8 already_avail=-1, free_slot=-1, i;
4721 /* To check whether this mac is already there in our list */
4722 for(i=AP_ACL_SIZE-1;i>=0;i--)
4724 if(mac_cmp_wild(a->acl_mac[i], acl->mac, a->wildcard[i],
4728 if(!((1 << i) & a->index))
4732 if(acl->action == ADD_MAC_ADDR)
4734 /* Dont add mac if it is already available */
4735 if((already_avail >= 0) || (free_slot == -1))
4738 memcpy(a->acl_mac[free_slot], acl->mac, ATH_MAC_LEN);
4739 a->index = a->index | (1 << free_slot);
4740 acl->index = free_slot;
4741 a->wildcard[free_slot] = acl->wildcard;
4744 else if(acl->action == DEL_MAC_ADDR)
4746 if(acl->index > AP_ACL_SIZE)
4749 if(!(a->index & (1 << acl->index)))
4752 A_MEMZERO(a->acl_mac[acl->index],ATH_MAC_LEN);
4753 a->index = a->index & ~(1 << acl->index);
4754 a->wildcard[acl->index] = 0;