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;
41 ar6000_ioctl_get_roam_tbl(struct net_device *dev, struct ifreq *rq)
43 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
45 if (ar->arWmiReady == FALSE) {
49 if(wmi_get_roam_tbl_cmd(ar->arWmi) != A_OK) {
57 ar6000_ioctl_get_roam_data(struct net_device *dev, struct ifreq *rq)
59 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
61 if (ar->arWmiReady == FALSE) {
66 /* currently assume only roam times are required */
67 if(wmi_get_roam_data_cmd(ar->arWmi, ROAM_DATA_TIME) != A_OK) {
76 ar6000_ioctl_set_roam_ctrl(struct net_device *dev, char *userdata)
78 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
79 WMI_SET_ROAM_CTRL_CMD cmd;
80 A_UINT8 size = sizeof(cmd);
82 if (ar->arWmiReady == FALSE) {
87 if (copy_from_user(&cmd, userdata, size)) {
91 if (cmd.roamCtrlType == WMI_SET_HOST_BIAS) {
92 if (cmd.info.bssBiasInfo.numBss > 1) {
93 size += (cmd.info.bssBiasInfo.numBss - 1) * sizeof(WMI_BSS_BIAS);
97 if (copy_from_user(&cmd, userdata, size)) {
101 if(wmi_set_roam_ctrl_cmd(ar->arWmi, &cmd, size) != A_OK) {
109 ar6000_ioctl_set_powersave_timers(struct net_device *dev, char *userdata)
111 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
112 WMI_POWERSAVE_TIMERS_POLICY_CMD cmd;
113 A_UINT8 size = sizeof(cmd);
115 if (ar->arWmiReady == FALSE) {
119 if (copy_from_user(&cmd, userdata, size)) {
123 if (copy_from_user(&cmd, userdata, size)) {
127 if(wmi_set_powersave_timers_cmd(ar->arWmi, &cmd, size) != A_OK) {
135 ar6000_ioctl_set_qos_supp(struct net_device *dev, struct ifreq *rq)
137 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
138 WMI_SET_QOS_SUPP_CMD cmd;
141 if ((dev->flags & IFF_UP) != IFF_UP) {
144 if (ar->arWmiReady == FALSE) {
148 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
154 ret = wmi_set_qos_supp_cmd(ar->arWmi, cmd.status);
170 ar6000_ioctl_set_wmm(struct net_device *dev, struct ifreq *rq)
172 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
176 if ((dev->flags & IFF_UP) != IFF_UP) {
179 if (ar->arWmiReady == FALSE) {
183 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
189 if (cmd.status == WMI_WMM_ENABLED) {
190 ar->arWmmEnabled = TRUE;
192 ar->arWmmEnabled = FALSE;
195 ret = wmi_set_wmm_cmd(ar->arWmi, cmd.status);
211 ar6000_ioctl_set_txop(struct net_device *dev, struct ifreq *rq)
213 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
214 WMI_SET_WMM_TXOP_CMD cmd;
217 if ((dev->flags & IFF_UP) != IFF_UP) {
220 if (ar->arWmiReady == FALSE) {
224 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
230 ret = wmi_set_wmm_txop(ar->arWmi, cmd.txopEnable);
246 ar6000_ioctl_get_rd(struct net_device *dev, struct ifreq *rq)
248 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
251 if ((dev->flags & IFF_UP) != IFF_UP || ar->arWmiReady == FALSE) {
255 if(copy_to_user((char *)((unsigned int*)rq->ifr_data + 1),
256 &ar->arRegCode, sizeof(ar->arRegCode)))
263 ar6000_ioctl_set_country(struct net_device *dev, struct ifreq *rq)
265 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
266 WMI_AP_SET_COUNTRY_CMD cmd;
269 if ((dev->flags & IFF_UP) != IFF_UP) {
272 if (ar->arWmiReady == FALSE) {
276 if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
282 ar->ap_profile_flag = 1; /* There is a change in profile */
284 ret = wmi_set_country(ar->arWmi, cmd.countryCode);
285 A_MEMCPY(ar->ap_country_code, cmd.countryCode, 3);
301 /* Get power mode command */
303 ar6000_ioctl_get_power_mode(struct net_device *dev, struct ifreq *rq)
305 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
306 WMI_POWER_MODE_CMD power_mode;
309 if (ar->arWmiReady == FALSE) {
313 power_mode.powerMode = wmi_get_power_mode_cmd(ar->arWmi);
314 if (copy_to_user(rq->ifr_data, &power_mode, sizeof(WMI_POWER_MODE_CMD))) {
323 ar6000_ioctl_set_channelParams(struct net_device *dev, struct ifreq *rq)
325 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
326 WMI_CHANNEL_PARAMS_CMD cmd, *cmdp;
329 if (ar->arWmiReady == FALSE) {
334 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
338 if( (ar->arNextMode == AP_NETWORK) && (cmd.numChannels || cmd.scanParam) ) {
339 A_PRINTF("ERROR: Only wmode is allowed in AP mode\n");
343 if (cmd.numChannels > 1) {
344 cmdp = A_MALLOC(130);
345 if (copy_from_user(cmdp, rq->ifr_data,
347 ((cmd.numChannels - 1) * sizeof(A_UINT16))))
356 if ((ar->arPhyCapability == WMI_11G_CAPABILITY) &&
357 ((cmdp->phyMode == WMI_11A_MODE) || (cmdp->phyMode == WMI_11AG_MODE)))
363 (wmi_set_channelParams_cmd(ar->arWmi, cmdp->scanParam, cmdp->phyMode,
364 cmdp->numChannels, cmdp->channelList)
370 if (cmd.numChannels > 1) {
374 ar->ap_wmode = cmdp->phyMode;
375 /* Set the profile change flag to allow a commit cmd */
376 ar->ap_profile_flag = 1;
383 ar6000_ioctl_set_snr_threshold(struct net_device *dev, struct ifreq *rq)
386 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
387 WMI_SNR_THRESHOLD_PARAMS_CMD cmd;
390 if (ar->arWmiReady == FALSE) {
394 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
398 if( wmi_set_snr_threshold_params(ar->arWmi, &cmd) != A_OK ) {
406 ar6000_ioctl_set_rssi_threshold(struct net_device *dev, struct ifreq *rq)
408 #define SWAP_THOLD(thold1, thold2) do { \
409 USER_RSSI_THOLD tmpThold; \
410 tmpThold.tag = thold1.tag; \
411 tmpThold.rssi = thold1.rssi; \
412 thold1.tag = thold2.tag; \
413 thold1.rssi = thold2.rssi; \
414 thold2.tag = tmpThold.tag; \
415 thold2.rssi = tmpThold.rssi; \
418 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
419 WMI_RSSI_THRESHOLD_PARAMS_CMD cmd;
420 USER_RSSI_PARAMS rssiParams;
424 if (ar->arWmiReady == FALSE) {
428 if (copy_from_user((char *)&rssiParams, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(USER_RSSI_PARAMS))) {
431 cmd.weight = rssiParams.weight;
432 cmd.pollTime = rssiParams.pollTime;
434 A_MEMCPY(ar->rssi_map, &rssiParams.tholds, sizeof(ar->rssi_map));
436 * only 6 elements, so use bubble sorting, in ascending order
438 for (i = 5; i > 0; i--) {
439 for (j = 0; j < i; j++) { /* above tholds */
440 if (ar->rssi_map[j+1].rssi < ar->rssi_map[j].rssi) {
441 SWAP_THOLD(ar->rssi_map[j+1], ar->rssi_map[j]);
442 } else if (ar->rssi_map[j+1].rssi == ar->rssi_map[j].rssi) {
447 for (i = 11; i > 6; i--) {
448 for (j = 6; j < i; j++) { /* below tholds */
449 if (ar->rssi_map[j+1].rssi < ar->rssi_map[j].rssi) {
450 SWAP_THOLD(ar->rssi_map[j+1], ar->rssi_map[j]);
451 } else if (ar->rssi_map[j+1].rssi == ar->rssi_map[j].rssi) {
458 for (i = 0; i < 12; i++) {
459 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("thold[%d].tag: %d, thold[%d].rssi: %d \n",
460 i, ar->rssi_map[i].tag, i, ar->rssi_map[i].rssi));
464 if (enablerssicompensation) {
465 for (i = 0; i < 6; i++)
466 ar->rssi_map[i].rssi = rssi_compensation_reverse_calc(ar, ar->rssi_map[i].rssi, TRUE);
467 for (i = 6; i < 12; i++)
468 ar->rssi_map[i].rssi = rssi_compensation_reverse_calc(ar, ar->rssi_map[i].rssi, FALSE);
471 cmd.thresholdAbove1_Val = ar->rssi_map[0].rssi;
472 cmd.thresholdAbove2_Val = ar->rssi_map[1].rssi;
473 cmd.thresholdAbove3_Val = ar->rssi_map[2].rssi;
474 cmd.thresholdAbove4_Val = ar->rssi_map[3].rssi;
475 cmd.thresholdAbove5_Val = ar->rssi_map[4].rssi;
476 cmd.thresholdAbove6_Val = ar->rssi_map[5].rssi;
477 cmd.thresholdBelow1_Val = ar->rssi_map[6].rssi;
478 cmd.thresholdBelow2_Val = ar->rssi_map[7].rssi;
479 cmd.thresholdBelow3_Val = ar->rssi_map[8].rssi;
480 cmd.thresholdBelow4_Val = ar->rssi_map[9].rssi;
481 cmd.thresholdBelow5_Val = ar->rssi_map[10].rssi;
482 cmd.thresholdBelow6_Val = ar->rssi_map[11].rssi;
484 if( wmi_set_rssi_threshold_params(ar->arWmi, &cmd) != A_OK ) {
492 ar6000_ioctl_set_lq_threshold(struct net_device *dev, struct ifreq *rq)
495 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
496 WMI_LQ_THRESHOLD_PARAMS_CMD cmd;
499 if (ar->arWmiReady == FALSE) {
503 if (copy_from_user(&cmd, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(cmd))) {
507 if( wmi_set_lq_threshold_params(ar->arWmi, &cmd) != A_OK ) {
516 ar6000_ioctl_set_probedSsid(struct net_device *dev, struct ifreq *rq)
518 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
519 WMI_PROBED_SSID_CMD cmd;
522 if (ar->arWmiReady == FALSE) {
526 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
530 if (wmi_probedSsid_cmd(ar->arWmi, cmd.entryIndex, cmd.flag, cmd.ssidLength,
540 ar6000_ioctl_set_badAp(struct net_device *dev, struct ifreq *rq)
542 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
543 WMI_ADD_BAD_AP_CMD cmd;
546 if (ar->arWmiReady == FALSE) {
551 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
555 if (cmd.badApIndex > WMI_MAX_BAD_AP_INDEX) {
559 if (A_MEMCMP(cmd.bssid, null_mac, AR6000_ETH_ADDR_LEN) == 0) {
561 * This is a delete badAP.
563 if (wmi_deleteBadAp_cmd(ar->arWmi, cmd.badApIndex) != A_OK) {
567 if (wmi_addBadAp_cmd(ar->arWmi, cmd.badApIndex, cmd.bssid) != A_OK) {
576 ar6000_ioctl_create_qos(struct net_device *dev, struct ifreq *rq)
578 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
579 WMI_CREATE_PSTREAM_CMD cmd;
582 if (ar->arWmiReady == FALSE) {
587 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
591 ret = wmi_verify_tspec_params(&cmd, tspecCompliance);
593 ret = wmi_create_pstream_cmd(ar->arWmi, &cmd);
609 ar6000_ioctl_delete_qos(struct net_device *dev, struct ifreq *rq)
611 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
612 WMI_DELETE_PSTREAM_CMD cmd;
615 if (ar->arWmiReady == FALSE) {
619 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
623 ret = wmi_delete_pstream_cmd(ar->arWmi, cmd.trafficClass, cmd.tsid);
639 ar6000_ioctl_get_qos_queue(struct net_device *dev, struct ifreq *rq)
641 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
642 struct ar6000_queuereq qreq;
645 if (ar->arWmiReady == FALSE) {
649 if( copy_from_user(&qreq, rq->ifr_data,
650 sizeof(struct ar6000_queuereq)))
653 qreq.activeTsids = wmi_get_mapped_qos_queue(ar->arWmi, qreq.trafficClass);
655 if (copy_to_user(rq->ifr_data, &qreq,
656 sizeof(struct ar6000_queuereq)))
664 #ifdef CONFIG_HOST_TCMD_SUPPORT
666 ar6000_ioctl_tcmd_get_rx_report(struct net_device *dev,
667 struct ifreq *rq, A_UINT8 *data, A_UINT32 len)
669 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
670 A_UINT32 buf[4+TCMD_MAX_RATES];
673 if (ar->bIsDestroyProgress) {
677 if (ar->arWmiReady == FALSE) {
681 if (down_interruptible(&ar->arSem)) {
685 if (ar->bIsDestroyProgress) {
690 ar->tcmdRxReport = 0;
691 if (wmi_test_cmd(ar->arWmi, data, len) != A_OK) {
696 wait_event_interruptible_timeout(arEvent, ar->tcmdRxReport != 0, wmitimeout * HZ);
698 if (signal_pending(current)) {
702 buf[0] = ar->tcmdRxTotalPkt;
703 buf[1] = ar->tcmdRxRssi;
704 buf[2] = ar->tcmdRxcrcErrPkt;
705 buf[3] = ar->tcmdRxsecErrPkt;
706 A_MEMCPY(((A_UCHAR *)buf)+(4*sizeof(A_UINT32)), ar->tcmdRateCnt, sizeof(ar->tcmdRateCnt));
707 A_MEMCPY(((A_UCHAR *)buf)+(4*sizeof(A_UINT32))+(TCMD_MAX_RATES *sizeof(A_UINT16)), ar->tcmdRateCntShortGuard, sizeof(ar->tcmdRateCntShortGuard));
709 if (!ret && copy_to_user(rq->ifr_data, buf, sizeof(buf))) {
719 ar6000_tcmd_rx_report_event(void *devt, A_UINT8 * results, int len)
721 AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
722 TCMD_CONT_RX * rx_rep = (TCMD_CONT_RX *)results;
724 if (enablerssicompensation) {
725 rx_rep->u.report.rssiInDBm = rssi_compensation_calc_tcmd(tcmdRxFreq, rx_rep->u.report.rssiInDBm,rx_rep->u.report.totalPkt);
729 ar->tcmdRxTotalPkt = rx_rep->u.report.totalPkt;
730 ar->tcmdRxRssi = rx_rep->u.report.rssiInDBm;
731 ar->tcmdRxcrcErrPkt = rx_rep->u.report.crcErrPkt;
732 ar->tcmdRxsecErrPkt = rx_rep->u.report.secErrPkt;
733 ar->tcmdRxReport = 1;
734 A_MEMZERO(ar->tcmdRateCnt, sizeof(ar->tcmdRateCnt));
735 A_MEMZERO(ar->tcmdRateCntShortGuard, sizeof(ar->tcmdRateCntShortGuard));
736 A_MEMCPY(ar->tcmdRateCnt, rx_rep->u.report.rateCnt, sizeof(ar->tcmdRateCnt));
737 A_MEMCPY(ar->tcmdRateCntShortGuard, rx_rep->u.report.rateCntShortGuard, sizeof(ar->tcmdRateCntShortGuard));
741 #endif /* CONFIG_HOST_TCMD_SUPPORT*/
744 ar6000_ioctl_set_error_report_bitmask(struct net_device *dev, struct ifreq *rq)
746 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
747 WMI_TARGET_ERROR_REPORT_BITMASK cmd;
750 if (ar->arWmiReady == FALSE) {
754 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
758 ret = wmi_set_error_report_bitmask(ar->arWmi, cmd.bitmask);
760 return (ret==0 ? ret : -EINVAL);
764 ar6000_clear_target_stats(struct net_device *dev)
766 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
767 TARGET_STATS *pStats = &ar->arTargetStats;
770 if (ar->arWmiReady == FALSE) {
773 AR6000_SPIN_LOCK(&ar->arLock, 0);
774 A_MEMZERO(pStats, sizeof(TARGET_STATS));
775 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
780 ar6000_ioctl_get_target_stats(struct net_device *dev, struct ifreq *rq)
782 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
783 TARGET_STATS_CMD cmd;
784 TARGET_STATS *pStats = &ar->arTargetStats;
787 if (ar->bIsDestroyProgress) {
790 if (ar->arWmiReady == FALSE) {
793 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
796 if (down_interruptible(&ar->arSem)) {
799 if (ar->bIsDestroyProgress) {
804 ar->statsUpdatePending = TRUE;
806 if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
811 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
813 if (signal_pending(current)) {
817 if (!ret && copy_to_user(rq->ifr_data, pStats, sizeof(*pStats))) {
821 if (cmd.clearStats == 1) {
822 ret = ar6000_clear_target_stats(dev);
831 ar6000_ioctl_get_ap_stats(struct net_device *dev, struct ifreq *rq)
833 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
834 A_UINT32 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 */
835 WMI_AP_MODE_STAT *pStats = &ar->arAPStats;
838 if (ar->arWmiReady == FALSE) {
841 if (copy_from_user(&action, (char *)((unsigned int*)rq->ifr_data + 1),
846 if (action == AP_CLEAR_STATS) {
848 AR6000_SPIN_LOCK(&ar->arLock, 0);
849 for(i = 0; i < AP_MAX_NUM_STA; i++) {
850 pStats->sta[i].tx_bytes = 0;
851 pStats->sta[i].tx_pkts = 0;
852 pStats->sta[i].tx_error = 0;
853 pStats->sta[i].tx_discard = 0;
854 pStats->sta[i].rx_bytes = 0;
855 pStats->sta[i].rx_pkts = 0;
856 pStats->sta[i].rx_error = 0;
857 pStats->sta[i].rx_discard = 0;
859 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
863 if (down_interruptible(&ar->arSem)) {
867 ar->statsUpdatePending = TRUE;
869 if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
874 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
876 if (signal_pending(current)) {
880 if (!ret && copy_to_user(rq->ifr_data, pStats, sizeof(*pStats))) {
890 ar6000_ioctl_set_access_params(struct net_device *dev, struct ifreq *rq)
892 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
893 WMI_SET_ACCESS_PARAMS_CMD cmd;
896 if (ar->arWmiReady == FALSE) {
900 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
904 if (wmi_set_access_params_cmd(ar->arWmi, cmd.ac, cmd.txop, cmd.eCWmin, cmd.eCWmax,
916 ar6000_ioctl_set_disconnect_timeout(struct net_device *dev, struct ifreq *rq)
918 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
919 WMI_DISC_TIMEOUT_CMD cmd;
922 if (ar->arWmiReady == FALSE) {
926 if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
930 if (wmi_disctimeout_cmd(ar->arWmi, cmd.disconnectTimeout) == A_OK)
941 ar6000_xioctl_set_voice_pkt_size(struct net_device *dev, char * userdata)
943 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
944 WMI_SET_VOICE_PKT_SIZE_CMD cmd;
947 if (ar->arWmiReady == FALSE) {
951 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
955 if (wmi_set_voice_pkt_size_cmd(ar->arWmi, cmd.voicePktSize) == A_OK)
967 ar6000_xioctl_set_max_sp_len(struct net_device *dev, char * userdata)
969 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
970 WMI_SET_MAX_SP_LEN_CMD cmd;
973 if (ar->arWmiReady == FALSE) {
977 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
981 if (wmi_set_max_sp_len_cmd(ar->arWmi, cmd.maxSPLen) == A_OK)
993 ar6000_xioctl_set_bt_status_cmd(struct net_device *dev, char * userdata)
995 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
996 WMI_SET_BT_STATUS_CMD cmd;
999 if (ar->arWmiReady == FALSE) {
1003 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1007 if (wmi_set_bt_status_cmd(ar->arWmi, cmd.streamType, cmd.status) == A_OK)
1018 ar6000_xioctl_set_bt_params_cmd(struct net_device *dev, char * userdata)
1020 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1021 WMI_SET_BT_PARAMS_CMD cmd;
1024 if (ar->arWmiReady == FALSE) {
1028 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1032 if (wmi_set_bt_params_cmd(ar->arWmi, &cmd) == A_OK)
1043 ar6000_xioctl_set_btcoex_fe_ant_cmd(struct net_device * dev, char * userdata)
1045 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1046 WMI_SET_BTCOEX_FE_ANT_CMD cmd;
1049 if (ar->arWmiReady == FALSE) {
1052 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1056 if (wmi_set_btcoex_fe_ant_cmd(ar->arWmi, &cmd) == A_OK)
1067 ar6000_xioctl_set_btcoex_colocated_bt_dev_cmd(struct net_device * dev, char * userdata)
1069 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1070 WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD cmd;
1073 if (ar->arWmiReady == FALSE) {
1077 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1081 if (wmi_set_btcoex_colocated_bt_dev_cmd(ar->arWmi, &cmd) == A_OK)
1092 ar6000_xioctl_set_btcoex_btinquiry_page_config_cmd(struct net_device * dev, char * userdata)
1094 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1095 WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD cmd;
1098 if (ar->arWmiReady == FALSE) {
1102 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1106 if (wmi_set_btcoex_btinquiry_page_config_cmd(ar->arWmi, &cmd) == A_OK)
1117 ar6000_xioctl_set_btcoex_sco_config_cmd(struct net_device * dev, char * userdata)
1119 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1120 WMI_SET_BTCOEX_SCO_CONFIG_CMD cmd;
1123 if (ar->arWmiReady == FALSE) {
1127 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1131 if (wmi_set_btcoex_sco_config_cmd(ar->arWmi, &cmd) == A_OK)
1142 ar6000_xioctl_set_btcoex_a2dp_config_cmd(struct net_device * dev,
1145 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1146 WMI_SET_BTCOEX_A2DP_CONFIG_CMD cmd;
1149 if (ar->arWmiReady == FALSE) {
1153 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1157 if (wmi_set_btcoex_a2dp_config_cmd(ar->arWmi, &cmd) == A_OK)
1168 ar6000_xioctl_set_btcoex_aclcoex_config_cmd(struct net_device * dev, char * userdata)
1170 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1171 WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMD cmd;
1174 if (ar->arWmiReady == FALSE) {
1178 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1182 if (wmi_set_btcoex_aclcoex_config_cmd(ar->arWmi, &cmd) == A_OK)
1193 ar60000_xioctl_set_btcoex_debug_cmd(struct net_device * dev, char * userdata)
1195 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1196 WMI_SET_BTCOEX_DEBUG_CMD cmd;
1199 if (ar->arWmiReady == FALSE) {
1203 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1207 if (wmi_set_btcoex_debug_cmd(ar->arWmi, &cmd) == A_OK)
1218 ar6000_xioctl_set_btcoex_bt_operating_status_cmd(struct net_device * dev, char * userdata)
1220 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1221 WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD cmd;
1224 if (ar->arWmiReady == FALSE) {
1228 if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
1232 if (wmi_set_btcoex_bt_operating_status_cmd(ar->arWmi, &cmd) == A_OK)
1242 ar6000_xioctl_get_btcoex_config_cmd(struct net_device * dev, char * userdata,
1246 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1247 AR6000_BTCOEX_CONFIG btcoexConfig;
1248 WMI_BTCOEX_CONFIG_EVENT *pbtcoexConfigEv = &ar->arBtcoexConfig;
1252 if (ar->bIsDestroyProgress) {
1255 if (ar->arWmiReady == FALSE) {
1258 if (copy_from_user(&btcoexConfig.configCmd, userdata, sizeof(AR6000_BTCOEX_CONFIG))) {
1261 if (down_interruptible(&ar->arSem)) {
1262 return -ERESTARTSYS;
1265 if (wmi_get_btcoex_config_cmd(ar->arWmi, (WMI_GET_BTCOEX_CONFIG_CMD *)&btcoexConfig.configCmd) != A_OK)
1271 ar->statsUpdatePending = TRUE;
1273 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
1275 if (signal_pending(current)) {
1279 if (!ret && copy_to_user(btcoexConfig.configEvent, pbtcoexConfigEv, sizeof(WMI_BTCOEX_CONFIG_EVENT))) {
1287 ar6000_xioctl_get_btcoex_stats_cmd(struct net_device * dev, char * userdata, struct ifreq *rq)
1289 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1290 AR6000_BTCOEX_STATS btcoexStats;
1291 WMI_BTCOEX_STATS_EVENT *pbtcoexStats = &ar->arBtcoexStats;
1294 if (ar->bIsDestroyProgress) {
1297 if (ar->arWmiReady == FALSE) {
1301 if (down_interruptible(&ar->arSem)) {
1302 return -ERESTARTSYS;
1305 if (copy_from_user(&btcoexStats.statsEvent, userdata, sizeof(AR6000_BTCOEX_CONFIG))) {
1309 if (wmi_get_btcoex_stats_cmd(ar->arWmi) != A_OK)
1315 ar->statsUpdatePending = TRUE;
1317 wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
1319 if (signal_pending(current)) {
1323 if (!ret && copy_to_user(btcoexStats.statsEvent, pbtcoexStats, sizeof(WMI_BTCOEX_STATS_EVENT))) {
1333 #ifdef CONFIG_HOST_GPIO_SUPPORT
1334 struct ar6000_gpio_intr_wait_cmd_s gpio_intr_results;
1335 /* gpio_reg_results and gpio_data_available are protected by arSem */
1336 static struct ar6000_gpio_register_cmd_s gpio_reg_results;
1337 static A_BOOL gpio_data_available; /* Requested GPIO data available */
1338 static A_BOOL gpio_intr_available; /* GPIO interrupt info available */
1339 static A_BOOL gpio_ack_received; /* GPIO ack was received */
1341 /* Host-side initialization for General Purpose I/O support */
1342 void ar6000_gpio_init(void)
1344 gpio_intr_available = FALSE;
1345 gpio_data_available = FALSE;
1346 gpio_ack_received = FALSE;
1350 * Called when a GPIO interrupt is received from the Target.
1351 * intr_values shows which GPIO pins have interrupted.
1352 * input_values shows a recent value of GPIO pins.
1355 ar6000_gpio_intr_rx(A_UINT32 intr_mask, A_UINT32 input_values)
1357 gpio_intr_results.intr_mask = intr_mask;
1358 gpio_intr_results.input_values = input_values;
1359 *((volatile A_BOOL *)&gpio_intr_available) = TRUE;
1364 * This is called when a response is received from the Target
1365 * for a previous or ar6000_gpio_input_get or ar6000_gpio_register_get
1369 ar6000_gpio_data_rx(A_UINT32 reg_id, A_UINT32 value)
1371 gpio_reg_results.gpioreg_id = reg_id;
1372 gpio_reg_results.value = value;
1373 *((volatile A_BOOL *)&gpio_data_available) = TRUE;
1378 * This is called when an acknowledgement is received from the Target
1379 * for a previous or ar6000_gpio_output_set or ar6000_gpio_register_set
1383 ar6000_gpio_ack_rx(void)
1385 gpio_ack_received = TRUE;
1390 ar6000_gpio_output_set(struct net_device *dev,
1392 A_UINT32 clear_mask,
1393 A_UINT32 enable_mask,
1394 A_UINT32 disable_mask)
1396 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1398 gpio_ack_received = FALSE;
1399 return wmi_gpio_output_set(ar->arWmi,
1400 set_mask, clear_mask, enable_mask, disable_mask);
1404 ar6000_gpio_input_get(struct net_device *dev)
1406 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1408 *((volatile A_BOOL *)&gpio_data_available) = FALSE;
1409 return wmi_gpio_input_get(ar->arWmi);
1413 ar6000_gpio_register_set(struct net_device *dev,
1414 A_UINT32 gpioreg_id,
1417 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1419 gpio_ack_received = FALSE;
1420 return wmi_gpio_register_set(ar->arWmi, gpioreg_id, value);
1424 ar6000_gpio_register_get(struct net_device *dev,
1425 A_UINT32 gpioreg_id)
1427 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1429 *((volatile A_BOOL *)&gpio_data_available) = FALSE;
1430 return wmi_gpio_register_get(ar->arWmi, gpioreg_id);
1434 ar6000_gpio_intr_ack(struct net_device *dev,
1437 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1439 gpio_intr_available = FALSE;
1440 return wmi_gpio_intr_ack(ar->arWmi, ack_mask);
1442 #endif /* CONFIG_HOST_GPIO_SUPPORT */
1444 #if defined(CONFIG_TARGET_PROFILE_SUPPORT)
1445 static struct prof_count_s prof_count_results;
1446 static A_BOOL prof_count_available; /* Requested GPIO data available */
1449 prof_count_get(struct net_device *dev)
1451 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1453 *((volatile A_BOOL *)&prof_count_available) = FALSE;
1454 return wmi_prof_count_get_cmd(ar->arWmi);
1458 * This is called when a response is received from the Target
1459 * for a previous prof_count_get call.
1462 prof_count_rx(A_UINT32 addr, A_UINT32 count)
1464 prof_count_results.addr = addr;
1465 prof_count_results.count = count;
1466 *((volatile A_BOOL *)&prof_count_available) = TRUE;
1469 #endif /* CONFIG_TARGET_PROFILE_SUPPORT */
1473 ar6000_create_acl_data_osbuf(struct net_device *dev, A_UINT8 *userdata, void **p_osbuf)
1476 A_UINT8 tmp_space[8];
1477 HCI_ACL_DATA_PKT *acl;
1478 A_UINT8 hdr_size, *datap=NULL;
1479 A_STATUS ret = A_OK;
1481 /* ACL is in data path. There is a need to create pool
1482 * mechanism for allocating and freeing NETBUFs - ToDo later.
1486 acl = (HCI_ACL_DATA_PKT *)tmp_space;
1487 hdr_size = sizeof(acl->hdl_and_flags) + sizeof(acl->data_len);
1490 if (a_copy_from_user(acl, userdata, hdr_size)) {
1495 osbuf = A_NETBUF_ALLOC(hdr_size + acl->data_len);
1496 if (osbuf == NULL) {
1500 A_NETBUF_PUT(osbuf, hdr_size + acl->data_len);
1501 datap = (A_UINT8 *)A_NETBUF_DATA(osbuf);
1503 /* Real copy to osbuf */
1504 acl = (HCI_ACL_DATA_PKT *)(datap);
1505 A_MEMCPY(acl, tmp_space, hdr_size);
1506 if (a_copy_from_user(acl->data, userdata + hdr_size, acl->data_len)) {
1515 A_NETBUF_FREE(osbuf);
1523 ar6000_ioctl_ap_setparam(AR_SOFTC_T *ar, int param, int value)
1528 case IEEE80211_PARAM_WPA:
1531 ar->arAuthMode = WPA_AUTH;
1534 ar->arAuthMode = WPA2_AUTH;
1537 ar->arAuthMode = WPA_AUTH | WPA2_AUTH;
1540 ar->arAuthMode = NONE_AUTH;
1544 case IEEE80211_PARAM_AUTHMODE:
1545 if(value == IEEE80211_AUTH_WPA_PSK) {
1546 if (WPA_AUTH == ar->arAuthMode) {
1547 ar->arAuthMode = WPA_PSK_AUTH;
1548 } else if (WPA2_AUTH == ar->arAuthMode) {
1549 ar->arAuthMode = WPA2_PSK_AUTH;
1550 } else if ((WPA_AUTH | WPA2_AUTH) == ar->arAuthMode) {
1551 ar->arAuthMode = WPA_PSK_AUTH | WPA2_PSK_AUTH;
1553 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Error - Setting PSK "\
1554 "mode when WPA param was set to %d\n",
1560 case IEEE80211_PARAM_UCASTCIPHER:
1561 ar->arPairwiseCrypto = 0;
1562 if(value & (1<<IEEE80211_CIPHER_AES_CCM)) {
1563 ar->arPairwiseCrypto |= AES_CRYPT;
1565 if(value & (1<<IEEE80211_CIPHER_TKIP)) {
1566 ar->arPairwiseCrypto |= TKIP_CRYPT;
1568 if(!ar->arPairwiseCrypto) {
1569 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
1570 ("Error - Invalid cipher in WPA \n"));
1574 case IEEE80211_PARAM_PRIVACY:
1576 ar->arDot11AuthMode = OPEN_AUTH;
1577 ar->arAuthMode = NONE_AUTH;
1578 ar->arPairwiseCrypto = NONE_CRYPT;
1579 ar->arPairwiseCryptoLen = 0;
1580 ar->arGroupCrypto = NONE_CRYPT;
1581 ar->arGroupCryptoLen = 0;
1585 case IEEE80211_PARAM_WAPI:
1586 A_PRINTF("WAPI Policy: %d\n", value);
1587 ar->arDot11AuthMode = OPEN_AUTH;
1588 ar->arAuthMode = NONE_AUTH;
1590 ar->arPairwiseCrypto = WAPI_CRYPT;
1591 ar->arGroupCrypto = WAPI_CRYPT;
1593 ar->arPairwiseCrypto = NONE_CRYPT;
1594 ar->arGroupCrypto = NONE_CRYPT;
1603 ar6000_ioctl_setparam(AR_SOFTC_T *ar, int param, int value)
1605 A_BOOL profChanged = FALSE;
1608 if(ar->arNextMode == AP_NETWORK) {
1609 ar->ap_profile_flag = 1; /* There is a change in profile */
1611 case IEEE80211_PARAM_WPA:
1612 case IEEE80211_PARAM_AUTHMODE:
1613 case IEEE80211_PARAM_UCASTCIPHER:
1614 case IEEE80211_PARAM_PRIVACY:
1615 case IEEE80211_PARAM_WAPI:
1616 ret = ar6000_ioctl_ap_setparam(ar, param, value);
1622 case IEEE80211_PARAM_WPA:
1625 ar->arAuthMode = WPA_AUTH;
1629 ar->arAuthMode = WPA2_AUTH;
1633 ar->arAuthMode = NONE_AUTH;
1638 case IEEE80211_PARAM_AUTHMODE:
1640 case IEEE80211_AUTH_WPA_PSK:
1641 if (WPA_AUTH == ar->arAuthMode) {
1642 ar->arAuthMode = WPA_PSK_AUTH;
1644 } else if (WPA2_AUTH == ar->arAuthMode) {
1645 ar->arAuthMode = WPA2_PSK_AUTH;
1648 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Error - Setting PSK "\
1649 "mode when WPA param was set to %d\n",
1654 case IEEE80211_AUTH_WPA_CCKM:
1655 if (WPA2_AUTH == ar->arAuthMode) {
1656 ar->arAuthMode = WPA2_AUTH_CCKM;
1658 ar->arAuthMode = WPA_AUTH_CCKM;
1665 case IEEE80211_PARAM_UCASTCIPHER:
1667 case IEEE80211_CIPHER_AES_CCM:
1668 ar->arPairwiseCrypto = AES_CRYPT;
1671 case IEEE80211_CIPHER_TKIP:
1672 ar->arPairwiseCrypto = TKIP_CRYPT;
1675 case IEEE80211_CIPHER_WEP:
1676 ar->arPairwiseCrypto = WEP_CRYPT;
1679 case IEEE80211_CIPHER_NONE:
1680 ar->arPairwiseCrypto = NONE_CRYPT;
1685 case IEEE80211_PARAM_UCASTKEYLEN:
1686 if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
1689 ar->arPairwiseCryptoLen = value;
1692 case IEEE80211_PARAM_MCASTCIPHER:
1694 case IEEE80211_CIPHER_AES_CCM:
1695 ar->arGroupCrypto = AES_CRYPT;
1698 case IEEE80211_CIPHER_TKIP:
1699 ar->arGroupCrypto = TKIP_CRYPT;
1702 case IEEE80211_CIPHER_WEP:
1703 ar->arGroupCrypto = WEP_CRYPT;
1706 case IEEE80211_CIPHER_NONE:
1707 ar->arGroupCrypto = NONE_CRYPT;
1712 case IEEE80211_PARAM_MCASTKEYLEN:
1713 if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
1716 ar->arGroupCryptoLen = value;
1719 case IEEE80211_PARAM_COUNTERMEASURES:
1720 if (ar->arWmiReady == FALSE) {
1723 wmi_set_tkip_countermeasures_cmd(ar->arWmi, value);
1728 if ((ar->arNextMode != AP_NETWORK) && (profChanged == TRUE)) {
1730 * profile has changed. Erase ssid to signal change
1732 A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
1739 ar6000_ioctl_setkey(AR_SOFTC_T *ar, struct ieee80211req_key *ik)
1743 CRYPTO_TYPE keyType = NONE_CRYPT;
1746 ar->user_saved_keys.keyOk = FALSE;
1748 if ( (0 == memcmp(ik->ik_macaddr, null_mac, IEEE80211_ADDR_LEN)) ||
1749 (0 == memcmp(ik->ik_macaddr, bcast_mac, IEEE80211_ADDR_LEN)) ) {
1750 keyUsage = GROUP_USAGE;
1751 if(ar->arNextMode == AP_NETWORK) {
1752 A_MEMCPY(&ar->ap_mode_bkey, ik,
1753 sizeof(struct ieee80211req_key));
1755 if(ar->arPairwiseCrypto == WAPI_CRYPT) {
1756 return ap_set_wapi_key(ar, ik);
1761 A_MEMCPY(&ar->user_saved_keys.bcast_ik, ik,
1762 sizeof(struct ieee80211req_key));
1765 keyUsage = PAIRWISE_USAGE;
1767 A_MEMCPY(&ar->user_saved_keys.ucast_ik, ik,
1768 sizeof(struct ieee80211req_key));
1771 if(ar->arNextMode == AP_NETWORK) {
1772 if(ar->arPairwiseCrypto == WAPI_CRYPT) {
1773 return ap_set_wapi_key(ar, ik);
1779 switch (ik->ik_type) {
1780 case IEEE80211_CIPHER_WEP:
1781 keyType = WEP_CRYPT;
1783 case IEEE80211_CIPHER_TKIP:
1784 keyType = TKIP_CRYPT;
1786 case IEEE80211_CIPHER_AES_CCM:
1787 keyType = AES_CRYPT;
1793 ar->user_saved_keys.keyType = keyType;
1795 if (IEEE80211_CIPHER_CCKM_KRK != ik->ik_type) {
1796 if (NONE_CRYPT == keyType) {
1800 if ((WEP_CRYPT == keyType)&&(!ar->arConnected)) {
1801 int index = ik->ik_keyix;
1803 if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(ik->ik_keylen)) {
1807 A_MEMZERO(ar->arWepKeyList[index].arKey,
1808 sizeof(ar->arWepKeyList[index].arKey));
1809 A_MEMCPY(ar->arWepKeyList[index].arKey, ik->ik_keydata, ik->ik_keylen);
1810 ar->arWepKeyList[index].arKeyLen = ik->ik_keylen;
1812 if(ik->ik_flags & IEEE80211_KEY_DEFAULT){
1813 ar->arDefTxKeyIndex = index;
1819 if (((WPA_PSK_AUTH == ar->arAuthMode) || (WPA2_PSK_AUTH == ar->arAuthMode)) &&
1820 (GROUP_USAGE & keyUsage))
1822 A_UNTIMEOUT(&ar->disconnect_timer);
1825 status = wmi_addKey_cmd(ar->arWmi, ik->ik_keyix, keyType, keyUsage,
1826 ik->ik_keylen, (A_UINT8 *)&ik->ik_keyrsc,
1827 ik->ik_keydata, KEY_OP_INIT_VAL, ik->ik_macaddr,
1830 if (status != A_OK) {
1834 status = wmi_add_krk_cmd(ar->arWmi, ik->ik_keydata);
1838 ar->user_saved_keys.keyOk = TRUE;
1844 int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1846 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
1847 HIF_DEVICE *hifDevice = ar->arHifDevice;
1849 unsigned int address = 0;
1850 unsigned int length = 0;
1851 unsigned char *buffer;
1853 A_UINT32 connectCtrlFlags;
1856 WMI_SET_AKMP_PARAMS_CMD akmpParams;
1857 WMI_SET_PMKID_LIST_CMD pmkidInfo;
1859 WMI_SET_HT_CAP_CMD htCap;
1860 WMI_SET_HT_OP_CMD htOp;
1863 * ioctl operations may have to wait for the Target, so we cannot hold rtnl.
1864 * Prevent the device from disappearing under us and release the lock during
1865 * the ioctl operation.
1870 if (cmd == AR6000_IOCTL_EXTENDED) {
1872 * This allows for many more wireless ioctls than would otherwise
1873 * be available. Applications embed the actual ioctl command in
1874 * the first word of the parameter block, and use the command
1875 * AR6000_IOCTL_EXTENDED_CMD on the ioctl call.
1877 get_user(cmd, (int *)rq->ifr_data);
1878 userdata = (char *)(((unsigned int *)rq->ifr_data)+1);
1879 if(is_xioctl_allowed(ar->arNextMode, cmd) != A_OK) {
1880 A_PRINTF("xioctl: cmd=%d not allowed in this mode\n",cmd);
1885 A_STATUS ret = is_iwioctl_allowed(ar->arNextMode, cmd);
1886 if(ret == A_ENOTSUP) {
1887 A_PRINTF("iwioctl: cmd=0x%x not allowed in this mode\n", cmd);
1890 } else if (ret == A_ERROR) {
1891 /* It is not our ioctl (out of range ioctl) */
1895 userdata = (char *)rq->ifr_data;
1898 if ((ar->arWlanState == WLAN_DISABLED) &&
1899 ((cmd != AR6000_XIOCTRL_WMI_SET_WLAN_STATE) &&
1900 (cmd != AR6000_XIOCTL_GET_WLAN_SLEEP_STATE) &&
1901 (cmd != AR6000_XIOCTL_DIAG_READ) &&
1902 (cmd != AR6000_XIOCTL_DIAG_WRITE) &&
1903 (cmd != AR6000_XIOCTL_SET_BT_HW_POWER_STATE) &&
1904 (cmd != AR6000_XIOCTL_GET_BT_HW_POWER_STATE) &&
1905 (cmd != AR6000_XIOCTL_ADD_AP_INTERFACE) &&
1906 (cmd != AR6000_XIOCTL_REMOVE_AP_INTERFACE) &&
1907 (cmd != AR6000_IOCTL_WMI_GETREV)))
1916 case IEEE80211_IOCTL_SETPARAM:
1919 int *ptr = (int *)rq->ifr_ifru.ifru_newname;
1920 if (ar->arWmiReady == FALSE) {
1925 ret = ar6000_ioctl_setparam(ar,param,value);
1929 case IEEE80211_IOCTL_SETKEY:
1931 struct ieee80211req_key keydata;
1932 if (ar->arWmiReady == FALSE) {
1934 } else if (copy_from_user(&keydata, userdata,
1935 sizeof(struct ieee80211req_key))) {
1938 ar6000_ioctl_setkey(ar, &keydata);
1942 case IEEE80211_IOCTL_DELKEY:
1943 case IEEE80211_IOCTL_SETOPTIE:
1948 case IEEE80211_IOCTL_SETMLME:
1950 struct ieee80211req_mlme mlme;
1951 if (ar->arWmiReady == FALSE) {
1953 } else if (copy_from_user(&mlme, userdata,
1954 sizeof(struct ieee80211req_mlme))) {
1957 switch (mlme.im_op) {
1958 case IEEE80211_MLME_AUTHORIZE:
1959 A_PRINTF("setmlme AUTHORIZE %02X:%02X\n",
1960 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1962 case IEEE80211_MLME_UNAUTHORIZE:
1963 A_PRINTF("setmlme UNAUTHORIZE %02X:%02X\n",
1964 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1966 case IEEE80211_MLME_DEAUTH:
1967 A_PRINTF("setmlme DEAUTH %02X:%02X\n",
1968 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1969 //remove_sta(ar, mlme.im_macaddr);
1971 case IEEE80211_MLME_DISASSOC:
1972 A_PRINTF("setmlme DISASSOC %02X:%02X\n",
1973 mlme.im_macaddr[4], mlme.im_macaddr[5]);
1974 //remove_sta(ar, mlme.im_macaddr);
1981 wmi_ap_set_mlme(ar->arWmi, mlme.im_op, mlme.im_macaddr,
1986 case IEEE80211_IOCTL_ADDPMKID:
1988 struct ieee80211req_addpmkid req;
1989 if (ar->arWmiReady == FALSE) {
1991 } else if (copy_from_user(&req, userdata, sizeof(struct ieee80211req_addpmkid))) {
1996 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",
1997 req.pi_bssid[0], req.pi_bssid[1], req.pi_bssid[2],
1998 req.pi_bssid[3], req.pi_bssid[4], req.pi_bssid[5],
2001 status = wmi_setPmkid_cmd(ar->arWmi, req.pi_bssid, req.pi_pmkid,
2004 if (status != A_OK) {
2011 #ifdef CONFIG_HOST_TCMD_SUPPORT
2012 case AR6000_XIOCTL_TCMD_CONT_TX:
2016 if ((ar->tcmdPm == TCMD_PM_SLEEP) ||
2017 (ar->tcmdPm == TCMD_PM_DEEPSLEEP))
2019 A_PRINTF("Can NOT send tx tcmd when target is asleep! \n");
2024 if(copy_from_user(&txCmd, userdata, sizeof(TCMD_CONT_TX))) {
2028 wmi_test_cmd(ar->arWmi,(A_UINT8 *)&txCmd, sizeof(TCMD_CONT_TX));
2032 case AR6000_XIOCTL_TCMD_CONT_RX:
2036 if ((ar->tcmdPm == TCMD_PM_SLEEP) ||
2037 (ar->tcmdPm == TCMD_PM_DEEPSLEEP))
2039 A_PRINTF("Can NOT send rx tcmd when target is asleep! \n");
2043 if(copy_from_user(&rxCmd, userdata, sizeof(TCMD_CONT_RX))) {
2050 case TCMD_CONT_RX_PROMIS:
2051 case TCMD_CONT_RX_FILTER:
2052 case TCMD_CONT_RX_SETMAC:
2053 case TCMD_CONT_RX_SET_ANT_SWITCH_TABLE:
2054 wmi_test_cmd(ar->arWmi,(A_UINT8 *)&rxCmd,
2055 sizeof(TCMD_CONT_RX));
2056 tcmdRxFreq = rxCmd.u.para.freq;
2058 case TCMD_CONT_RX_REPORT:
2059 ar6000_ioctl_tcmd_get_rx_report(dev, rq,
2060 (A_UINT8 *)&rxCmd, sizeof(TCMD_CONT_RX));
2063 A_PRINTF("Unknown Cont Rx mode: %d\n",rxCmd.act);
2069 case AR6000_XIOCTL_TCMD_PM:
2073 if(copy_from_user(&pmCmd, userdata, sizeof(TCMD_PM))) {
2077 ar->tcmdPm = pmCmd.mode;
2078 wmi_test_cmd(ar->arWmi, (A_UINT8*)&pmCmd, sizeof(TCMD_PM));
2081 #endif /* CONFIG_HOST_TCMD_SUPPORT */
2083 case AR6000_XIOCTL_BMI_DONE:
2086 rtnl_lock(); /* ar6000_init expects to be called holding rtnl lock */
2087 ret = ar6000_init(dev);
2092 ret = BMIDone(hifDevice);
2096 case AR6000_XIOCTL_BMI_READ_MEMORY:
2097 get_user(address, (unsigned int *)userdata);
2098 get_user(length, (unsigned int *)userdata + 1);
2099 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Read Memory (address: 0x%x, length: %d)\n",
2101 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
2102 A_MEMZERO(buffer, length);
2103 ret = BMIReadMemory(hifDevice, address, buffer, length);
2104 if (copy_to_user(rq->ifr_data, buffer, length)) {
2113 case AR6000_XIOCTL_BMI_WRITE_MEMORY:
2114 get_user(address, (unsigned int *)userdata);
2115 get_user(length, (unsigned int *)userdata + 1);
2116 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Write Memory (address: 0x%x, length: %d)\n",
2118 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
2119 A_MEMZERO(buffer, length);
2120 if (copy_from_user(buffer, &userdata[sizeof(address) +
2121 sizeof(length)], length))
2125 ret = BMIWriteMemory(hifDevice, address, buffer, length);
2133 case AR6000_XIOCTL_BMI_TEST:
2134 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("No longer supported\n"));
2138 case AR6000_XIOCTL_BMI_EXECUTE:
2139 get_user(address, (unsigned int *)userdata);
2140 get_user(param, (unsigned int *)userdata + 1);
2141 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Execute (address: 0x%x, param: %d)\n",
2143 ret = BMIExecute(hifDevice, address, (A_UINT32*)¶m);
2144 put_user(param, (unsigned int *)rq->ifr_data); /* return value */
2147 case AR6000_XIOCTL_BMI_SET_APP_START:
2148 get_user(address, (unsigned int *)userdata);
2149 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Set App Start (address: 0x%x)\n", address));
2150 ret = BMISetAppStart(hifDevice, address);
2153 case AR6000_XIOCTL_BMI_READ_SOC_REGISTER:
2154 get_user(address, (unsigned int *)userdata);
2155 ret = BMIReadSOCRegister(hifDevice, address, (A_UINT32*)¶m);
2156 put_user(param, (unsigned int *)rq->ifr_data); /* return value */
2159 case AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER:
2160 get_user(address, (unsigned int *)userdata);
2161 get_user(param, (unsigned int *)userdata + 1);
2162 ret = BMIWriteSOCRegister(hifDevice, address, param);
2165 #ifdef HTC_RAW_INTERFACE
2166 case AR6000_XIOCTL_HTC_RAW_OPEN:
2168 if (!arRawIfEnabled(ar)) {
2169 /* make sure block size is set in case the target was reset since last
2170 * BMI phase (i.e. flashup downloads) */
2171 ret = ar6000_set_htc_params(ar->arHifDevice,
2173 0, /* use default yield */
2174 0 /* use default number of HTC ctrl buffers */
2176 if (A_FAILED(ret)) {
2179 /* Terminate the BMI phase */
2180 ret = BMIDone(hifDevice);
2182 ret = ar6000_htc_raw_open(ar);
2187 case AR6000_XIOCTL_HTC_RAW_CLOSE:
2188 if (arRawIfEnabled(ar)) {
2189 ret = ar6000_htc_raw_close(ar);
2190 arRawIfEnabled(ar) = FALSE;
2196 case AR6000_XIOCTL_HTC_RAW_READ:
2197 if (arRawIfEnabled(ar)) {
2198 unsigned int streamID;
2199 get_user(streamID, (unsigned int *)userdata);
2200 get_user(length, (unsigned int *)userdata + 1);
2201 buffer = (unsigned char*)rq->ifr_data + sizeof(length);
2202 ret = ar6000_htc_raw_read(ar, (HTC_RAW_STREAM_ID)streamID,
2203 (char*)buffer, length);
2204 put_user(ret, (unsigned int *)rq->ifr_data);
2210 case AR6000_XIOCTL_HTC_RAW_WRITE:
2211 if (arRawIfEnabled(ar)) {
2212 unsigned int streamID;
2213 get_user(streamID, (unsigned int *)userdata);
2214 get_user(length, (unsigned int *)userdata + 1);
2215 buffer = (unsigned char*)userdata + sizeof(streamID) + sizeof(length);
2216 ret = ar6000_htc_raw_write(ar, (HTC_RAW_STREAM_ID)streamID,
2217 (char*)buffer, length);
2218 put_user(ret, (unsigned int *)rq->ifr_data);
2223 #endif /* HTC_RAW_INTERFACE */
2225 case AR6000_XIOCTL_BMI_LZ_STREAM_START:
2226 get_user(address, (unsigned int *)userdata);
2227 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Start Compressed Stream (address: 0x%x)\n", address));
2228 ret = BMILZStreamStart(hifDevice, address);
2231 case AR6000_XIOCTL_BMI_LZ_DATA:
2232 get_user(length, (unsigned int *)userdata);
2233 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Send Compressed Data (length: %d)\n", length));
2234 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
2235 A_MEMZERO(buffer, length);
2236 if (copy_from_user(buffer, &userdata[sizeof(length)], length))
2240 ret = BMILZData(hifDevice, buffer, length);
2248 #if defined(CONFIG_TARGET_PROFILE_SUPPORT)
2250 * Optional support for Target-side profiling.
2251 * Not needed in production.
2254 /* Configure Target-side profiling */
2255 case AR6000_XIOCTL_PROF_CFG:
2259 get_user(period, (unsigned int *)userdata);
2260 get_user(nbins, (unsigned int *)userdata + 1);
2262 if (wmi_prof_cfg_cmd(ar->arWmi, period, nbins) != A_OK) {
2269 /* Start a profiling bucket/bin at the specified address */
2270 case AR6000_XIOCTL_PROF_ADDR_SET:
2273 get_user(addr, (unsigned int *)userdata);
2275 if (wmi_prof_addr_set_cmd(ar->arWmi, addr) != A_OK) {
2282 /* START Target-side profiling */
2283 case AR6000_XIOCTL_PROF_START:
2284 wmi_prof_start_cmd(ar->arWmi);
2287 /* STOP Target-side profiling */
2288 case AR6000_XIOCTL_PROF_STOP:
2289 wmi_prof_stop_cmd(ar->arWmi);
2291 case AR6000_XIOCTL_PROF_COUNT_GET:
2293 if (ar->bIsDestroyProgress) {
2297 if (ar->arWmiReady == FALSE) {
2301 if (down_interruptible(&ar->arSem)) {
2305 if (ar->bIsDestroyProgress) {
2311 prof_count_available = FALSE;
2312 ret = prof_count_get(dev);
2319 /* Wait for Target to respond. */
2320 wait_event_interruptible(arEvent, prof_count_available);
2321 if (signal_pending(current)) {
2324 if (copy_to_user(userdata, &prof_count_results,
2325 sizeof(prof_count_results)))
2333 #endif /* CONFIG_TARGET_PROFILE_SUPPORT */
2335 case AR6000_IOCTL_WMI_GETREV:
2337 if (copy_to_user(rq->ifr_data, &ar->arVersion,
2338 sizeof(ar->arVersion)))
2344 case AR6000_IOCTL_WMI_SETPWR:
2346 WMI_POWER_MODE_CMD pwrModeCmd;
2348 if (ar->arWmiReady == FALSE) {
2350 } else if (copy_from_user(&pwrModeCmd, userdata,
2351 sizeof(pwrModeCmd)))
2355 if (wmi_powermode_cmd(ar->arWmi, pwrModeCmd.powerMode)
2363 case AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS:
2365 WMI_IBSS_PM_CAPS_CMD ibssPmCaps;
2367 if (ar->arWmiReady == FALSE) {
2369 } else if (copy_from_user(&ibssPmCaps, userdata,
2370 sizeof(ibssPmCaps)))
2374 if (wmi_ibsspmcaps_cmd(ar->arWmi, ibssPmCaps.power_saving, ibssPmCaps.ttl,
2375 ibssPmCaps.atim_windows, ibssPmCaps.timeout_value) != A_OK)
2379 AR6000_SPIN_LOCK(&ar->arLock, 0);
2380 ar->arIbssPsEnable = ibssPmCaps.power_saving;
2381 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
2385 case AR6000_XIOCTL_WMI_SET_AP_PS:
2387 WMI_AP_PS_CMD apPsCmd;
2389 if (ar->arWmiReady == FALSE) {
2391 } else if (copy_from_user(&apPsCmd, userdata,
2396 if (wmi_apps_cmd(ar->arWmi, apPsCmd.psType, apPsCmd.idle_time,
2397 apPsCmd.ps_period, apPsCmd.sleep_period) != A_OK)
2404 case AR6000_IOCTL_WMI_SET_PMPARAMS:
2406 WMI_POWER_PARAMS_CMD pmParams;
2408 if (ar->arWmiReady == FALSE) {
2410 } else if (copy_from_user(&pmParams, userdata,
2415 if (wmi_pmparams_cmd(ar->arWmi, pmParams.idle_period,
2416 pmParams.pspoll_number,
2417 pmParams.dtim_policy,
2418 pmParams.tx_wakeup_policy,
2419 pmParams.num_tx_to_wakeup,
2420 #if WLAN_CONFIG_IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN
2421 IGNORE_POWER_SAVE_FAIL_EVENT_DURING_SCAN
2423 SEND_POWER_SAVE_FAIL_EVENT_ALWAYS
2432 case AR6000_IOCTL_WMI_SETSCAN:
2434 if (ar->arWmiReady == FALSE) {
2436 } else if (copy_from_user(&ar->scParams, userdata,
2437 sizeof(ar->scParams)))
2441 if (CAN_SCAN_IN_CONNECT(ar->scParams.scanCtrlFlags)) {
2442 ar->arSkipScan = FALSE;
2444 ar->arSkipScan = TRUE;
2447 if (wmi_scanparams_cmd(ar->arWmi, ar->scParams.fg_start_period,
2448 ar->scParams.fg_end_period,
2449 ar->scParams.bg_period,
2450 ar->scParams.minact_chdwell_time,
2451 ar->scParams.maxact_chdwell_time,
2452 ar->scParams.pas_chdwell_time,
2453 ar->scParams.shortScanRatio,
2454 ar->scParams.scanCtrlFlags,
2455 ar->scParams.max_dfsch_act_time,
2456 ar->scParams.maxact_scan_per_ssid) != A_OK)
2463 case AR6000_IOCTL_WMI_SETLISTENINT:
2465 WMI_LISTEN_INT_CMD listenCmd;
2467 if (ar->arWmiReady == FALSE) {
2469 } else if (copy_from_user(&listenCmd, userdata,
2474 if (wmi_listeninterval_cmd(ar->arWmi, listenCmd.listenInterval, listenCmd.numBeacons) != A_OK) {
2477 AR6000_SPIN_LOCK(&ar->arLock, 0);
2478 ar->arListenIntervalT = listenCmd.listenInterval;
2479 ar->arListenIntervalB = listenCmd.numBeacons;
2480 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
2486 case AR6000_IOCTL_WMI_SET_BMISS_TIME:
2488 WMI_BMISS_TIME_CMD bmissCmd;
2490 if (ar->arWmiReady == FALSE) {
2492 } else if (copy_from_user(&bmissCmd, userdata,
2497 if (wmi_bmisstime_cmd(ar->arWmi, bmissCmd.bmissTime, bmissCmd.numBeacons) != A_OK) {
2503 case AR6000_IOCTL_WMI_SETBSSFILTER:
2505 WMI_BSS_FILTER_CMD filt;
2507 if (ar->arWmiReady == FALSE) {
2509 } else if (copy_from_user(&filt, userdata,
2514 if (wmi_bssfilter_cmd(ar->arWmi, filt.bssFilter, filt.ieMask)
2518 ar->arUserBssFilter = param;
2524 case AR6000_IOCTL_WMI_SET_SNRTHRESHOLD:
2526 ret = ar6000_ioctl_set_snr_threshold(dev, rq);
2529 case AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD:
2531 ret = ar6000_ioctl_set_rssi_threshold(dev, rq);
2534 case AR6000_XIOCTL_WMI_CLR_RSSISNR:
2536 if (ar->arWmiReady == FALSE) {
2539 ret = wmi_clr_rssi_snr(ar->arWmi);
2542 case AR6000_XIOCTL_WMI_SET_LQTHRESHOLD:
2544 ret = ar6000_ioctl_set_lq_threshold(dev, rq);
2547 case AR6000_XIOCTL_WMI_SET_LPREAMBLE:
2549 WMI_SET_LPREAMBLE_CMD setLpreambleCmd;
2551 if (ar->arWmiReady == FALSE) {
2553 } else if (copy_from_user(&setLpreambleCmd, userdata,
2554 sizeof(setLpreambleCmd)))
2558 if (wmi_set_lpreamble_cmd(ar->arWmi, setLpreambleCmd.status,
2559 #if WLAN_CONFIG_DONOT_IGNORE_BARKER_IN_ERP
2560 WMI_DONOT_IGNORE_BARKER_IN_ERP
2562 WMI_IGNORE_BARKER_IN_ERP
2572 case AR6000_XIOCTL_WMI_SET_RTS:
2574 WMI_SET_RTS_CMD rtsCmd;
2575 if (ar->arWmiReady == FALSE) {
2577 } else if (copy_from_user(&rtsCmd, userdata,
2582 ar->arRTS = rtsCmd.threshold;
2583 if (wmi_set_rts_cmd(ar->arWmi, rtsCmd.threshold)
2592 case AR6000_XIOCTL_WMI_SET_WMM:
2594 ret = ar6000_ioctl_set_wmm(dev, rq);
2597 case AR6000_XIOCTL_WMI_SET_QOS_SUPP:
2599 ret = ar6000_ioctl_set_qos_supp(dev, rq);
2602 case AR6000_XIOCTL_WMI_SET_TXOP:
2604 ret = ar6000_ioctl_set_txop(dev, rq);
2607 case AR6000_XIOCTL_WMI_GET_RD:
2609 ret = ar6000_ioctl_get_rd(dev, rq);
2612 case AR6000_IOCTL_WMI_SET_CHANNELPARAMS:
2614 ret = ar6000_ioctl_set_channelParams(dev, rq);
2617 case AR6000_IOCTL_WMI_SET_PROBEDSSID:
2619 ret = ar6000_ioctl_set_probedSsid(dev, rq);
2622 case AR6000_IOCTL_WMI_SET_BADAP:
2624 ret = ar6000_ioctl_set_badAp(dev, rq);
2627 case AR6000_IOCTL_WMI_CREATE_QOS:
2629 ret = ar6000_ioctl_create_qos(dev, rq);
2632 case AR6000_IOCTL_WMI_DELETE_QOS:
2634 ret = ar6000_ioctl_delete_qos(dev, rq);
2637 case AR6000_IOCTL_WMI_GET_QOS_QUEUE:
2639 ret = ar6000_ioctl_get_qos_queue(dev, rq);
2642 case AR6000_IOCTL_WMI_GET_TARGET_STATS:
2644 ret = ar6000_ioctl_get_target_stats(dev, rq);
2647 case AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK:
2649 ret = ar6000_ioctl_set_error_report_bitmask(dev, rq);
2652 case AR6000_IOCTL_WMI_SET_ASSOC_INFO:
2654 WMI_SET_ASSOC_INFO_CMD cmd;
2655 A_UINT8 assocInfo[WMI_MAX_ASSOC_INFO_LEN];
2657 if (ar->arWmiReady == FALSE) {
2660 get_user(cmd.ieType, userdata);
2661 if (cmd.ieType >= WMI_MAX_ASSOC_INFO_TYPE) {
2664 get_user(cmd.bufferSize, userdata + 1);
2665 if (cmd.bufferSize > WMI_MAX_ASSOC_INFO_LEN) {
2669 if (copy_from_user(assocInfo, userdata + 2,
2674 if (wmi_associnfo_cmd(ar->arWmi, cmd.ieType,
2685 case AR6000_IOCTL_WMI_SET_ACCESS_PARAMS:
2687 ret = ar6000_ioctl_set_access_params(dev, rq);
2690 case AR6000_IOCTL_WMI_SET_DISC_TIMEOUT:
2692 ret = ar6000_ioctl_set_disconnect_timeout(dev, rq);
2695 case AR6000_XIOCTL_FORCE_TARGET_RESET:
2697 if (ar->arHtcTarget)
2699 // HTCForceReset(htcTarget);
2703 AR_DEBUG_PRINTF(ATH_DEBUG_WARN,("ar6000_ioctl cannot attempt reset.\n"));
2707 case AR6000_XIOCTL_TARGET_INFO:
2708 case AR6000_XIOCTL_CHECK_TARGET_READY: /* backwards compatibility */
2710 /* If we made it to here, then the Target exists and is ready. */
2712 if (cmd == AR6000_XIOCTL_TARGET_INFO) {
2713 if (copy_to_user((A_UINT32 *)rq->ifr_data, &ar->arVersion.target_ver,
2714 sizeof(ar->arVersion.target_ver)))
2718 if (copy_to_user(((A_UINT32 *)rq->ifr_data)+1, &ar->arTargetType,
2719 sizeof(ar->arTargetType)))
2726 case AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS:
2728 WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD hbparam;
2730 if (copy_from_user(&hbparam, userdata, sizeof(hbparam)))
2734 AR6000_SPIN_LOCK(&ar->arLock, 0);
2735 /* Start a cyclic timer with the parameters provided. */
2736 if (hbparam.frequency) {
2737 ar->arHBChallengeResp.frequency = hbparam.frequency;
2739 if (hbparam.threshold) {
2740 ar->arHBChallengeResp.missThres = hbparam.threshold;
2743 /* Delete the pending timer and start a new one */
2744 if (timer_pending(&ar->arHBChallengeResp.timer)) {
2745 A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
2747 A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
2748 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
2752 case AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP:
2756 if (copy_from_user(&cookie, userdata, sizeof(cookie))) {
2761 /* Send the challenge on the control channel */
2762 if (wmi_get_challenge_resp_cmd(ar->arWmi, cookie, APP_HB_CHALLENGE) != A_OK) {
2769 case AR6000_XIOCTL_USER_SETKEYS:
2772 ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_RUN;
2774 if (copy_from_user(&ar->user_key_ctrl, userdata,
2775 sizeof(ar->user_key_ctrl)))
2781 A_PRINTF("ar6000 USER set key %x\n", ar->user_key_ctrl);
2784 #endif /* USER_KEYS */
2786 #ifdef CONFIG_HOST_GPIO_SUPPORT
2787 case AR6000_XIOCTL_GPIO_OUTPUT_SET:
2789 struct ar6000_gpio_output_set_cmd_s gpio_output_set_cmd;
2791 if (ar->bIsDestroyProgress) {
2795 if (ar->arWmiReady == FALSE) {
2799 if (down_interruptible(&ar->arSem)) {
2803 if (ar->bIsDestroyProgress) {
2809 if (copy_from_user(&gpio_output_set_cmd, userdata,
2810 sizeof(gpio_output_set_cmd)))
2814 ret = ar6000_gpio_output_set(dev,
2815 gpio_output_set_cmd.set_mask,
2816 gpio_output_set_cmd.clear_mask,
2817 gpio_output_set_cmd.enable_mask,
2818 gpio_output_set_cmd.disable_mask);
2826 case AR6000_XIOCTL_GPIO_INPUT_GET:
2828 if (ar->bIsDestroyProgress) {
2832 if (ar->arWmiReady == FALSE) {
2836 if (down_interruptible(&ar->arSem)) {
2840 if (ar->bIsDestroyProgress) {
2846 ret = ar6000_gpio_input_get(dev);
2853 /* Wait for Target to respond. */
2854 wait_event_interruptible(arEvent, gpio_data_available);
2855 if (signal_pending(current)) {
2858 A_ASSERT(gpio_reg_results.gpioreg_id == GPIO_ID_NONE);
2860 if (copy_to_user(userdata, &gpio_reg_results.value,
2861 sizeof(gpio_reg_results.value)))
2869 case AR6000_XIOCTL_GPIO_REGISTER_SET:
2871 struct ar6000_gpio_register_cmd_s gpio_register_cmd;
2873 if (ar->bIsDestroyProgress) {
2877 if (ar->arWmiReady == FALSE) {
2881 if (down_interruptible(&ar->arSem)) {
2885 if (ar->bIsDestroyProgress) {
2891 if (copy_from_user(&gpio_register_cmd, userdata,
2892 sizeof(gpio_register_cmd)))
2896 ret = ar6000_gpio_register_set(dev,
2897 gpio_register_cmd.gpioreg_id,
2898 gpio_register_cmd.value);
2903 /* Wait for acknowledgement from Target */
2904 wait_event_interruptible(arEvent, gpio_ack_received);
2905 if (signal_pending(current)) {
2912 case AR6000_XIOCTL_GPIO_REGISTER_GET:
2914 struct ar6000_gpio_register_cmd_s gpio_register_cmd;
2916 if (ar->bIsDestroyProgress) {
2920 if (ar->arWmiReady == FALSE) {
2924 if (down_interruptible(&ar->arSem)) {
2928 if (ar->bIsDestroyProgress) {
2934 if (copy_from_user(&gpio_register_cmd, userdata,
2935 sizeof(gpio_register_cmd)))
2939 ret = ar6000_gpio_register_get(dev, gpio_register_cmd.gpioreg_id);
2946 /* Wait for Target to respond. */
2947 wait_event_interruptible(arEvent, gpio_data_available);
2948 if (signal_pending(current)) {
2951 A_ASSERT(gpio_register_cmd.gpioreg_id == gpio_reg_results.gpioreg_id);
2952 if (copy_to_user(userdata, &gpio_reg_results,
2953 sizeof(gpio_reg_results)))
2962 case AR6000_XIOCTL_GPIO_INTR_ACK:
2964 struct ar6000_gpio_intr_ack_cmd_s gpio_intr_ack_cmd;
2966 if (ar->bIsDestroyProgress) {
2970 if (ar->arWmiReady == FALSE) {
2974 if (down_interruptible(&ar->arSem)) {
2978 if (ar->bIsDestroyProgress) {
2984 if (copy_from_user(&gpio_intr_ack_cmd, userdata,
2985 sizeof(gpio_intr_ack_cmd)))
2989 ret = ar6000_gpio_intr_ack(dev, gpio_intr_ack_cmd.ack_mask);
2997 case AR6000_XIOCTL_GPIO_INTR_WAIT:
2999 /* Wait for Target to report an interrupt. */
3000 wait_event_interruptible(arEvent, gpio_intr_available);
3002 if (signal_pending(current)) {
3005 if (copy_to_user(userdata, &gpio_intr_results,
3006 sizeof(gpio_intr_results)))
3013 #endif /* CONFIG_HOST_GPIO_SUPPORT */
3015 case AR6000_XIOCTL_DBGLOG_CFG_MODULE:
3017 struct ar6000_dbglog_module_config_s config;
3019 if (copy_from_user(&config, userdata, sizeof(config))) {
3024 /* Send the challenge on the control channel */
3025 if (wmi_config_debug_module_cmd(ar->arWmi, config.mmask,
3026 config.tsr, config.rep,
3027 config.size, config.valid) != A_OK)
3035 case AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS:
3037 /* Send the challenge on the control channel */
3038 if (ar6000_dbglog_get_debug_logs(ar) != A_OK)
3046 case AR6000_XIOCTL_SET_ADHOC_BSSID:
3048 WMI_SET_ADHOC_BSSID_CMD adhocBssid;
3050 if (ar->arWmiReady == FALSE) {
3052 } else if (copy_from_user(&adhocBssid, userdata,
3053 sizeof(adhocBssid)))
3056 } else if (A_MEMCMP(adhocBssid.bssid, bcast_mac,
3057 AR6000_ETH_ADDR_LEN) == 0)
3062 A_MEMCPY(ar->arReqBssid, adhocBssid.bssid, sizeof(ar->arReqBssid));
3067 case AR6000_XIOCTL_SET_OPT_MODE:
3069 WMI_SET_OPT_MODE_CMD optModeCmd;
3070 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
3072 if (ar->arWmiReady == FALSE) {
3074 } else if (copy_from_user(&optModeCmd, userdata,
3075 sizeof(optModeCmd)))
3078 } else if (ar->arConnected && optModeCmd.optMode == SPECIAL_ON) {
3081 } else if (wmi_set_opt_mode_cmd(ar->arWmi, optModeCmd.optMode)
3089 case AR6000_XIOCTL_OPT_SEND_FRAME:
3091 WMI_OPT_TX_FRAME_CMD optTxFrmCmd;
3092 A_UINT8 data[MAX_OPT_DATA_LEN];
3094 if (ar->arWmiReady == FALSE) {
3096 } else if (copy_from_user(&optTxFrmCmd, userdata,
3097 sizeof(optTxFrmCmd)))
3100 } else if (copy_from_user(data,
3101 userdata+sizeof(WMI_OPT_TX_FRAME_CMD)-1,
3102 optTxFrmCmd.optIEDataLen))
3106 ret = wmi_opt_tx_frame_cmd(ar->arWmi,
3107 optTxFrmCmd.frmType,
3108 optTxFrmCmd.dstAddr,
3110 optTxFrmCmd.optIEDataLen,
3116 case AR6000_XIOCTL_WMI_SETRETRYLIMITS:
3118 WMI_SET_RETRY_LIMITS_CMD setRetryParams;
3120 if (ar->arWmiReady == FALSE) {
3122 } else if (copy_from_user(&setRetryParams, userdata,
3123 sizeof(setRetryParams)))
3127 if (wmi_set_retry_limits_cmd(ar->arWmi, setRetryParams.frameType,
3128 setRetryParams.trafficClass,
3129 setRetryParams.maxRetries,
3130 setRetryParams.enableNotify) != A_OK)
3134 AR6000_SPIN_LOCK(&ar->arLock, 0);
3135 ar->arMaxRetries = setRetryParams.maxRetries;
3136 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
3141 case AR6000_XIOCTL_SET_BEACON_INTVAL:
3143 WMI_BEACON_INT_CMD bIntvlCmd;
3145 if (ar->arWmiReady == FALSE) {
3147 } else if (copy_from_user(&bIntvlCmd, userdata,
3151 } else if (wmi_set_adhoc_bconIntvl_cmd(ar->arWmi, bIntvlCmd.beaconInterval)
3157 ar->ap_beacon_interval = bIntvlCmd.beaconInterval;
3158 ar->ap_profile_flag = 1; /* There is a change in profile */
3162 case IEEE80211_IOCTL_SETAUTHALG:
3164 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
3165 struct ieee80211req_authalg req;
3167 if (ar->arWmiReady == FALSE) {
3169 } else if (copy_from_user(&req, userdata,
3170 sizeof(struct ieee80211req_authalg)))
3174 if (req.auth_alg & AUTH_ALG_OPEN_SYSTEM) {
3175 ar->arDot11AuthMode |= OPEN_AUTH;
3176 ar->arPairwiseCrypto = NONE_CRYPT;
3177 ar->arGroupCrypto = NONE_CRYPT;
3179 if (req.auth_alg & AUTH_ALG_SHARED_KEY) {
3180 ar->arDot11AuthMode |= SHARED_AUTH;
3181 ar->arPairwiseCrypto = WEP_CRYPT;
3182 ar->arGroupCrypto = WEP_CRYPT;
3183 ar->arAuthMode = NONE_AUTH;
3185 if (req.auth_alg == AUTH_ALG_LEAP) {
3186 ar->arDot11AuthMode = LEAP_AUTH;
3192 case AR6000_XIOCTL_SET_VOICE_PKT_SIZE:
3193 ret = ar6000_xioctl_set_voice_pkt_size(dev, userdata);
3196 case AR6000_XIOCTL_SET_MAX_SP:
3197 ret = ar6000_xioctl_set_max_sp_len(dev, userdata);
3200 case AR6000_XIOCTL_WMI_GET_ROAM_TBL:
3201 ret = ar6000_ioctl_get_roam_tbl(dev, rq);
3203 case AR6000_XIOCTL_WMI_SET_ROAM_CTRL:
3204 ret = ar6000_ioctl_set_roam_ctrl(dev, userdata);
3206 case AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS:
3207 ret = ar6000_ioctl_set_powersave_timers(dev, userdata);
3209 case AR6000_XIOCTRL_WMI_GET_POWER_MODE:
3210 ret = ar6000_ioctl_get_power_mode(dev, rq);
3212 case AR6000_XIOCTRL_WMI_SET_WLAN_STATE:
3214 AR6000_WLAN_STATE state;
3215 get_user(state, (unsigned int *)userdata);
3216 if (ar6000_set_wlan_state(ar, state)!=A_OK) {
3221 case AR6000_XIOCTL_WMI_GET_ROAM_DATA:
3222 ret = ar6000_ioctl_get_roam_data(dev, rq);
3225 case AR6000_XIOCTL_WMI_SET_BT_STATUS:
3226 ret = ar6000_xioctl_set_bt_status_cmd(dev, userdata);
3229 case AR6000_XIOCTL_WMI_SET_BT_PARAMS:
3230 ret = ar6000_xioctl_set_bt_params_cmd(dev, userdata);
3233 case AR6000_XIOCTL_WMI_SET_BTCOEX_FE_ANT:
3234 ret = ar6000_xioctl_set_btcoex_fe_ant_cmd(dev, userdata);
3237 case AR6000_XIOCTL_WMI_SET_BTCOEX_COLOCATED_BT_DEV:
3238 ret = ar6000_xioctl_set_btcoex_colocated_bt_dev_cmd(dev, userdata);
3241 case AR6000_XIOCTL_WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG:
3242 ret = ar6000_xioctl_set_btcoex_btinquiry_page_config_cmd(dev, userdata);
3245 case AR6000_XIOCTL_WMI_SET_BTCOEX_SCO_CONFIG:
3246 ret = ar6000_xioctl_set_btcoex_sco_config_cmd( dev, userdata);
3249 case AR6000_XIOCTL_WMI_SET_BTCOEX_A2DP_CONFIG:
3250 ret = ar6000_xioctl_set_btcoex_a2dp_config_cmd(dev, userdata);
3253 case AR6000_XIOCTL_WMI_SET_BTCOEX_ACLCOEX_CONFIG:
3254 ret = ar6000_xioctl_set_btcoex_aclcoex_config_cmd(dev, userdata);
3257 case AR6000_XIOCTL_WMI_SET_BTCOEX_DEBUG:
3258 ret = ar60000_xioctl_set_btcoex_debug_cmd(dev, userdata);
3261 case AR6000_XIOCTL_WMI_SET_BT_OPERATING_STATUS:
3262 ret = ar6000_xioctl_set_btcoex_bt_operating_status_cmd(dev, userdata);
3265 case AR6000_XIOCTL_WMI_GET_BTCOEX_CONFIG:
3266 ret = ar6000_xioctl_get_btcoex_config_cmd(dev, userdata, rq);
3269 case AR6000_XIOCTL_WMI_GET_BTCOEX_STATS:
3270 ret = ar6000_xioctl_get_btcoex_stats_cmd(dev, userdata, rq);
3273 case AR6000_XIOCTL_WMI_STARTSCAN:
3275 WMI_START_SCAN_CMD setStartScanCmd, *cmdp;
3277 if (ar->arWmiReady == FALSE) {
3279 } else if (copy_from_user(&setStartScanCmd, userdata,
3280 sizeof(setStartScanCmd)))
3284 if (setStartScanCmd.numChannels > 1) {
3285 cmdp = A_MALLOC(130);
3286 if (copy_from_user(cmdp, userdata,
3288 ((setStartScanCmd.numChannels - 1) *
3296 cmdp = &setStartScanCmd;
3299 if (wmi_startscan_cmd(ar->arWmi, cmdp->scanType,
3302 cmdp->homeDwellTime,
3303 cmdp->forceScanInterval,
3305 cmdp->channelList) != A_OK)
3312 case AR6000_XIOCTL_WMI_SETFIXRATES:
3314 WMI_FIX_RATES_CMD setFixRatesCmd;
3315 A_STATUS returnStatus;
3317 if (ar->arWmiReady == FALSE) {
3319 } else if (copy_from_user(&setFixRatesCmd, userdata,
3320 sizeof(setFixRatesCmd)))
3324 returnStatus = wmi_set_fixrates_cmd(ar->arWmi, setFixRatesCmd.fixRateMask);
3325 if (returnStatus == A_EINVAL) {
3327 } else if(returnStatus != A_OK) {
3330 ar->ap_profile_flag = 1; /* There is a change in profile */
3336 case AR6000_XIOCTL_WMI_GETFIXRATES:
3338 WMI_FIX_RATES_CMD getFixRatesCmd;
3339 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
3342 if (ar->bIsDestroyProgress) {
3346 if (ar->arWmiReady == FALSE) {
3351 if (down_interruptible(&ar->arSem)) {
3355 if (ar->bIsDestroyProgress) {
3360 /* Used copy_from_user/copy_to_user to access user space data */
3361 if (copy_from_user(&getFixRatesCmd, userdata, sizeof(getFixRatesCmd))) {
3364 ar->arRateMask = 0xFFFFFFFF;
3366 if (wmi_get_ratemask_cmd(ar->arWmi) != A_OK) {
3372 wait_event_interruptible_timeout(arEvent, ar->arRateMask != 0xFFFFFFFF, wmitimeout * HZ);
3374 if (signal_pending(current)) {
3379 getFixRatesCmd.fixRateMask = ar->arRateMask;
3382 if(copy_to_user(userdata, &getFixRatesCmd, sizeof(getFixRatesCmd))) {
3390 case AR6000_XIOCTL_WMI_SET_AUTHMODE:
3392 WMI_SET_AUTH_MODE_CMD setAuthMode;
3394 if (ar->arWmiReady == FALSE) {
3396 } else if (copy_from_user(&setAuthMode, userdata,
3397 sizeof(setAuthMode)))
3401 if (wmi_set_authmode_cmd(ar->arWmi, setAuthMode.mode) != A_OK)
3408 case AR6000_XIOCTL_WMI_SET_REASSOCMODE:
3410 WMI_SET_REASSOC_MODE_CMD setReassocMode;
3412 if (ar->arWmiReady == FALSE) {
3414 } else if (copy_from_user(&setReassocMode, userdata,
3415 sizeof(setReassocMode)))
3419 if (wmi_set_reassocmode_cmd(ar->arWmi, setReassocMode.mode) != A_OK)
3426 case AR6000_XIOCTL_DIAG_READ:
3428 A_UINT32 addr, data;
3429 get_user(addr, (unsigned int *)userdata);
3430 addr = TARG_VTOP(ar->arTargetType, addr);
3431 if (ar6000_ReadRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
3434 put_user(data, (unsigned int *)userdata + 1);
3437 case AR6000_XIOCTL_DIAG_WRITE:
3439 A_UINT32 addr, data;
3440 get_user(addr, (unsigned int *)userdata);
3441 get_user(data, (unsigned int *)userdata + 1);
3442 addr = TARG_VTOP(ar->arTargetType, addr);
3443 if (ar6000_WriteRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
3448 case AR6000_XIOCTL_WMI_SET_KEEPALIVE:
3450 WMI_SET_KEEPALIVE_CMD setKeepAlive;
3451 if (ar->arWmiReady == FALSE) {
3454 } else if (copy_from_user(&setKeepAlive, userdata,
3455 sizeof(setKeepAlive))){
3458 if (wmi_set_keepalive_cmd(ar->arWmi, setKeepAlive.keepaliveInterval) != A_OK) {
3464 case AR6000_XIOCTL_WMI_SET_PARAMS:
3466 WMI_SET_PARAMS_CMD cmd;
3467 if (ar->arWmiReady == FALSE) {
3470 } else if (copy_from_user(&cmd, userdata,
3473 } else if (copy_from_user(&cmd, userdata,
3474 sizeof(cmd) + cmd.length))
3478 if (wmi_set_params_cmd(ar->arWmi, cmd.opcode, cmd.length, cmd.buffer) != A_OK) {
3484 case AR6000_XIOCTL_WMI_SET_MCAST_FILTER:
3486 WMI_SET_MCAST_FILTER_CMD cmd;
3487 if (ar->arWmiReady == FALSE) {
3490 } else if (copy_from_user(&cmd, userdata,
3494 if (wmi_set_mcast_filter_cmd(ar->arWmi, cmd.multicast_mac[0],
3495 cmd.multicast_mac[1],
3496 cmd.multicast_mac[2],
3497 cmd.multicast_mac[3]) != A_OK) {
3503 case AR6000_XIOCTL_WMI_DEL_MCAST_FILTER:
3505 WMI_SET_MCAST_FILTER_CMD cmd;
3506 if (ar->arWmiReady == FALSE) {
3509 } else if (copy_from_user(&cmd, userdata,
3513 if (wmi_del_mcast_filter_cmd(ar->arWmi, cmd.multicast_mac[0],
3514 cmd.multicast_mac[1],
3515 cmd.multicast_mac[2],
3516 cmd.multicast_mac[3]) != A_OK) {
3522 case AR6000_XIOCTL_WMI_MCAST_FILTER:
3524 WMI_MCAST_FILTER_CMD cmd;
3525 if (ar->arWmiReady == FALSE) {
3528 } else if (copy_from_user(&cmd, userdata,
3532 if (wmi_mcast_filter_cmd(ar->arWmi, cmd.enable) != A_OK) {
3538 case AR6000_XIOCTL_WMI_GET_KEEPALIVE:
3540 AR_SOFTC_T *ar = (AR_SOFTC_T *)ar6k_priv(dev);
3541 WMI_GET_KEEPALIVE_CMD getKeepAlive;
3543 if (ar->bIsDestroyProgress) {
3547 if (ar->arWmiReady == FALSE) {
3551 if (down_interruptible(&ar->arSem)) {
3555 if (ar->bIsDestroyProgress) {
3560 if (copy_from_user(&getKeepAlive, userdata,sizeof(getKeepAlive))) {
3563 getKeepAlive.keepaliveInterval = wmi_get_keepalive_cmd(ar->arWmi);
3564 ar->arKeepaliveConfigured = 0xFF;
3565 if (wmi_get_keepalive_configured(ar->arWmi) != A_OK){
3570 wait_event_interruptible_timeout(arEvent, ar->arKeepaliveConfigured != 0xFF, wmitimeout * HZ);
3571 if (signal_pending(current)) {
3576 getKeepAlive.configured = ar->arKeepaliveConfigured;
3578 if (copy_to_user(userdata, &getKeepAlive, sizeof(getKeepAlive))) {
3585 case AR6000_XIOCTL_WMI_SET_APPIE:
3587 WMI_SET_APPIE_CMD appIEcmd;
3588 A_UINT8 appIeInfo[IEEE80211_APPIE_FRAME_MAX_LEN];
3589 A_UINT32 fType,ieLen;
3591 if (ar->arWmiReady == FALSE) {
3595 get_user(fType, (A_UINT32 *)userdata);
3596 appIEcmd.mgmtFrmType = fType;
3597 if (appIEcmd.mgmtFrmType >= IEEE80211_APPIE_NUM_OF_FRAME) {
3600 get_user(ieLen, (A_UINT32 *)(userdata + 4));
3601 appIEcmd.ieLen = ieLen;
3602 A_PRINTF("WPSIE: Type-%d, Len-%d\n",appIEcmd.mgmtFrmType, appIEcmd.ieLen);
3603 if (appIEcmd.ieLen > IEEE80211_APPIE_FRAME_MAX_LEN) {
3607 if (copy_from_user(appIeInfo, userdata + 8, appIEcmd.ieLen)) {
3610 if (wmi_set_appie_cmd(ar->arWmi, appIEcmd.mgmtFrmType,
3611 appIEcmd.ieLen, appIeInfo) != A_OK)
3619 case AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER:
3621 WMI_BSS_FILTER_CMD cmd;
3622 A_UINT32 filterType;
3624 if (copy_from_user(&filterType, userdata, sizeof(A_UINT32)))
3629 if (filterType & (IEEE80211_FILTER_TYPE_BEACON |
3630 IEEE80211_FILTER_TYPE_PROBE_RESP))
3632 cmd.bssFilter = ALL_BSS_FILTER;
3634 cmd.bssFilter = NONE_BSS_FILTER;
3636 if (wmi_bssfilter_cmd(ar->arWmi, cmd.bssFilter, 0) != A_OK) {
3639 ar->arUserBssFilter = cmd.bssFilter;
3642 AR6000_SPIN_LOCK(&ar->arLock, 0);
3643 ar->arMgmtFilter = filterType;
3644 AR6000_SPIN_UNLOCK(&ar->arLock, 0);
3647 case AR6000_XIOCTL_WMI_SET_WSC_STATUS:
3649 A_UINT32 wsc_status;
3651 if (ar->arWmiReady == FALSE) {
3654 } else if (copy_from_user(&wsc_status, userdata, sizeof(A_UINT32)))
3659 if (wmi_set_wsc_status_cmd(ar->arWmi, wsc_status) != A_OK) {
3664 case AR6000_XIOCTL_BMI_ROMPATCH_INSTALL:
3669 A_UINT32 do_activate;
3670 A_UINT32 rompatch_id;
3672 get_user(ROM_addr, (A_UINT32 *)userdata);
3673 get_user(RAM_addr, (A_UINT32 *)userdata + 1);
3674 get_user(nbytes, (A_UINT32 *)userdata + 2);
3675 get_user(do_activate, (A_UINT32 *)userdata + 3);
3676 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Install rompatch from ROM: 0x%x to RAM: 0x%x length: %d\n",
3677 ROM_addr, RAM_addr, nbytes));
3678 ret = BMIrompatchInstall(hifDevice, ROM_addr, RAM_addr,
3679 nbytes, do_activate, &rompatch_id);
3681 put_user(rompatch_id, (unsigned int *)rq->ifr_data); /* return value */
3686 case AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL:
3688 A_UINT32 rompatch_id;
3690 get_user(rompatch_id, (A_UINT32 *)userdata);
3691 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("UNinstall rompatch_id %d\n", rompatch_id));
3692 ret = BMIrompatchUninstall(hifDevice, rompatch_id);
3696 case AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE:
3697 case AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE:
3699 A_UINT32 rompatch_count;
3701 get_user(rompatch_count, (A_UINT32 *)userdata);
3702 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("Change rompatch activation count=%d\n", rompatch_count));
3703 length = sizeof(A_UINT32) * rompatch_count;
3704 if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
3705 A_MEMZERO(buffer, length);
3706 if (copy_from_user(buffer, &userdata[sizeof(rompatch_count)], length))
3710 if (cmd == AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE) {
3711 ret = BMIrompatchActivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
3713 ret = BMIrompatchDeactivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
3723 case AR6000_XIOCTL_SET_IP:
3725 WMI_SET_IP_CMD setIP;
3727 if (ar->arWmiReady == FALSE) {
3729 } else if (copy_from_user(&setIP, userdata,
3734 if (wmi_set_ip_cmd(ar->arWmi,
3743 case AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE:
3745 WMI_SET_HOST_SLEEP_MODE_CMD setHostSleepMode;
3747 if (ar->arWmiReady == FALSE) {
3749 } else if (copy_from_user(&setHostSleepMode, userdata,
3750 sizeof(setHostSleepMode)))
3754 if (wmi_set_host_sleep_mode_cmd(ar->arWmi,
3755 &setHostSleepMode) != A_OK)
3762 case AR6000_XIOCTL_WMI_SET_WOW_MODE:
3764 WMI_SET_WOW_MODE_CMD setWowMode;
3766 if (ar->arWmiReady == FALSE) {
3768 } else if (copy_from_user(&setWowMode, userdata,
3769 sizeof(setWowMode)))
3773 if (wmi_set_wow_mode_cmd(ar->arWmi,
3774 &setWowMode) != A_OK)
3781 case AR6000_XIOCTL_WMI_GET_WOW_LIST:
3783 WMI_GET_WOW_LIST_CMD getWowList;
3785 if (ar->arWmiReady == FALSE) {
3787 } else if (copy_from_user(&getWowList, userdata,
3788 sizeof(getWowList)))
3792 if (wmi_get_wow_list_cmd(ar->arWmi,
3793 &getWowList) != A_OK)
3800 case AR6000_XIOCTL_WMI_ADD_WOW_PATTERN:
3802 #define WOW_PATTERN_SIZE 64
3803 #define WOW_MASK_SIZE 64
3805 WMI_ADD_WOW_PATTERN_CMD cmd;
3806 A_UINT8 mask_data[WOW_PATTERN_SIZE]={0};
3807 A_UINT8 pattern_data[WOW_PATTERN_SIZE]={0};
3810 if (ar->arWmiReady == FALSE) {
3814 if(copy_from_user(&cmd, userdata,
3815 sizeof(WMI_ADD_WOW_PATTERN_CMD)))
3820 if (copy_from_user(pattern_data,
3827 if (copy_from_user(mask_data,
3828 (userdata + 3 + cmd.filter_size),
3834 if (wmi_add_wow_pattern_cmd(ar->arWmi,
3835 &cmd, pattern_data, mask_data, cmd.filter_size) != A_OK)
3840 #undef WOW_PATTERN_SIZE
3841 #undef WOW_MASK_SIZE
3844 case AR6000_XIOCTL_WMI_DEL_WOW_PATTERN:
3846 WMI_DEL_WOW_PATTERN_CMD delWowPattern;
3848 if (ar->arWmiReady == FALSE) {
3850 } else if (copy_from_user(&delWowPattern, userdata,
3851 sizeof(delWowPattern)))
3855 if (wmi_del_wow_pattern_cmd(ar->arWmi,
3856 &delWowPattern) != A_OK)
3863 case AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE:
3864 if (ar->arHtcTarget != NULL) {
3865 #ifdef ATH_DEBUG_MODULE
3866 HTCDumpCreditStates(ar->arHtcTarget);
3867 #endif /* ATH_DEBUG_MODULE */
3868 #ifdef HTC_EP_STAT_PROFILING
3870 HTC_ENDPOINT_STATS stats;
3873 for (i = 0; i < 5; i++) {
3874 if (HTCGetEndpointStatistics(ar->arHtcTarget,
3876 HTC_EP_STAT_SAMPLE_AND_CLEAR,
3878 A_PRINTF(KERN_ALERT"------- Profiling Endpoint : %d \n", i);
3879 A_PRINTF(KERN_ALERT"TxCreditLowIndications : %d \n", stats.TxCreditLowIndications);
3880 A_PRINTF(KERN_ALERT"TxIssued : %d \n", stats.TxIssued);
3881 A_PRINTF(KERN_ALERT"TxDropped: %d \n", stats.TxDropped);
3882 A_PRINTF(KERN_ALERT"TxPacketsBundled : %d \n", stats.TxPacketsBundled);
3883 A_PRINTF(KERN_ALERT"TxBundles : %d \n", stats.TxBundles);
3884 A_PRINTF(KERN_ALERT"TxCreditRpts : %d \n", stats.TxCreditRpts);
3885 A_PRINTF(KERN_ALERT"TxCreditsRptsFromRx : %d \n", stats.TxCreditRptsFromRx);
3886 A_PRINTF(KERN_ALERT"TxCreditsRptsFromOther : %d \n", stats.TxCreditRptsFromOther);
3887 A_PRINTF(KERN_ALERT"TxCreditsRptsFromEp0 : %d \n", stats.TxCreditRptsFromEp0);
3888 A_PRINTF(KERN_ALERT"TxCreditsFromRx : %d \n", stats.TxCreditsFromRx);
3889 A_PRINTF(KERN_ALERT"TxCreditsFromOther : %d \n", stats.TxCreditsFromOther);
3890 A_PRINTF(KERN_ALERT"TxCreditsFromEp0 : %d \n", stats.TxCreditsFromEp0);
3891 A_PRINTF(KERN_ALERT"TxCreditsConsummed : %d \n", stats.TxCreditsConsummed);
3892 A_PRINTF(KERN_ALERT"TxCreditsReturned : %d \n", stats.TxCreditsReturned);
3893 A_PRINTF(KERN_ALERT"RxReceived : %d \n", stats.RxReceived);
3894 A_PRINTF(KERN_ALERT"RxPacketsBundled : %d \n", stats.RxPacketsBundled);
3895 A_PRINTF(KERN_ALERT"RxLookAheads : %d \n", stats.RxLookAheads);
3896 A_PRINTF(KERN_ALERT"RxBundleLookAheads : %d \n", stats.RxBundleLookAheads);
3897 A_PRINTF(KERN_ALERT"RxBundleIndFromHdr : %d \n", stats.RxBundleIndFromHdr);
3898 A_PRINTF(KERN_ALERT"RxAllocThreshHit : %d \n", stats.RxAllocThreshHit);
3899 A_PRINTF(KERN_ALERT"RxAllocThreshBytes : %d \n", stats.RxAllocThreshBytes);
3900 A_PRINTF(KERN_ALERT"---- \n");
3908 case AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE:
3909 if (ar->arHtcTarget != NULL) {
3910 struct ar6000_traffic_activity_change data;
3912 if (copy_from_user(&data, userdata, sizeof(data)))
3917 /* note, this is used for testing (mbox ping testing), indicate activity
3918 * change using the stream ID as the traffic class */
3919 ar6000_indicate_tx_activity(ar,
3920 (A_UINT8)data.StreamID,
3921 data.Active ? TRUE : FALSE);
3924 case AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS:
3925 if (ar->arWmiReady == FALSE) {
3927 } else if (copy_from_user(&connectCtrlFlags, userdata,
3928 sizeof(connectCtrlFlags)))
3932 ar->arConnectCtrlFlags = connectCtrlFlags;
3935 case AR6000_XIOCTL_WMI_SET_AKMP_PARAMS:
3936 if (ar->arWmiReady == FALSE) {
3938 } else if (copy_from_user(&akmpParams, userdata,
3939 sizeof(WMI_SET_AKMP_PARAMS_CMD)))
3943 if (wmi_set_akmp_params_cmd(ar->arWmi, &akmpParams) != A_OK) {
3948 case AR6000_XIOCTL_WMI_SET_PMKID_LIST:
3949 if (ar->arWmiReady == FALSE) {
3952 if (copy_from_user(&pmkidInfo.numPMKID, userdata,
3953 sizeof(pmkidInfo.numPMKID)))
3958 if (copy_from_user(&pmkidInfo.pmkidList,
3959 userdata + sizeof(pmkidInfo.numPMKID),
3960 pmkidInfo.numPMKID * sizeof(WMI_PMKID)))
3965 if (wmi_set_pmkid_list_cmd(ar->arWmi, &pmkidInfo) != A_OK) {
3970 case AR6000_XIOCTL_WMI_GET_PMKID_LIST:
3971 if (ar->arWmiReady == FALSE) {
3974 if (wmi_get_pmkid_list_cmd(ar->arWmi) != A_OK) {
3979 case AR6000_XIOCTL_WMI_ABORT_SCAN:
3980 if (ar->arWmiReady == FALSE) {
3983 ret = wmi_abort_scan_cmd(ar->arWmi);
3985 case AR6000_XIOCTL_AP_HIDDEN_SSID:
3987 A_UINT8 hidden_ssid;
3988 if (ar->arWmiReady == FALSE) {
3990 } else if (copy_from_user(&hidden_ssid, userdata, sizeof(hidden_ssid))) {
3993 wmi_ap_set_hidden_ssid(ar->arWmi, hidden_ssid);
3994 ar->ap_hidden_ssid = hidden_ssid;
3995 ar->ap_profile_flag = 1; /* There is a change in profile */
3999 case AR6000_XIOCTL_AP_GET_STA_LIST:
4001 if (ar->arWmiReady == FALSE) {
4006 A_MEMZERO(&temp, sizeof(temp));
4007 for(i=0;i<AP_MAX_NUM_STA;i++) {
4008 A_MEMCPY(temp.sta[i].mac, ar->sta_list[i].mac, ATH_MAC_LEN);
4009 temp.sta[i].aid = ar->sta_list[i].aid;
4010 temp.sta[i].keymgmt = ar->sta_list[i].keymgmt;
4011 temp.sta[i].ucipher = ar->sta_list[i].ucipher;
4012 temp.sta[i].auth = ar->sta_list[i].auth;
4014 if(copy_to_user((ap_get_sta_t *)rq->ifr_data, &temp,
4015 sizeof(ar->sta_list))) {
4021 case AR6000_XIOCTL_AP_SET_NUM_STA:
4024 if (ar->arWmiReady == FALSE) {
4026 } else if (copy_from_user(&num_sta, userdata, sizeof(num_sta))) {
4028 } else if(num_sta > AP_MAX_NUM_STA) {
4029 /* value out of range */
4032 wmi_ap_set_num_sta(ar->arWmi, num_sta);
4036 case AR6000_XIOCTL_AP_SET_ACL_POLICY:
4039 if (ar->arWmiReady == FALSE) {
4041 } else if (copy_from_user(&policy, userdata, sizeof(policy))) {
4043 } else if(policy == ar->g_acl.policy) {
4044 /* No change in policy */
4046 if(!(policy & AP_ACL_RETAIN_LIST_MASK)) {
4047 /* clear ACL list */
4048 memset(&ar->g_acl,0,sizeof(WMI_AP_ACL));
4050 ar->g_acl.policy = policy;
4051 wmi_ap_set_acl_policy(ar->arWmi, policy);
4055 case AR6000_XIOCTL_AP_SET_ACL_MAC:
4057 WMI_AP_ACL_MAC_CMD acl;
4058 if (ar->arWmiReady == FALSE) {
4060 } else if (copy_from_user(&acl, userdata, sizeof(acl))) {
4063 if(acl_add_del_mac(&ar->g_acl, &acl)) {
4064 wmi_ap_acl_mac_list(ar->arWmi, &acl);
4066 A_PRINTF("ACL list error\n");
4072 case AR6000_XIOCTL_AP_GET_ACL_LIST:
4074 if (ar->arWmiReady == FALSE) {
4076 } else if(copy_to_user((WMI_AP_ACL *)rq->ifr_data, &ar->g_acl,
4077 sizeof(WMI_AP_ACL))) {
4082 case AR6000_XIOCTL_AP_COMMIT_CONFIG:
4084 ret = ar6000_ap_mode_profile_commit(ar);
4087 case IEEE80211_IOCTL_GETWPAIE:
4089 struct ieee80211req_wpaie wpaie;
4090 if (ar->arWmiReady == FALSE) {
4092 } else if (copy_from_user(&wpaie, userdata, sizeof(wpaie))) {
4094 } else if (ar6000_ap_mode_get_wpa_ie(ar, &wpaie)) {
4096 } else if(copy_to_user(userdata, &wpaie, sizeof(wpaie))) {
4101 case AR6000_XIOCTL_AP_CONN_INACT_TIME:
4104 if (ar->arWmiReady == FALSE) {
4106 } else if (copy_from_user(&period, userdata, sizeof(period))) {
4109 wmi_ap_conn_inact_time(ar->arWmi, period);
4113 case AR6000_XIOCTL_AP_PROT_SCAN_TIME:
4115 WMI_AP_PROT_SCAN_TIME_CMD bgscan;
4116 if (ar->arWmiReady == FALSE) {
4118 } else if (copy_from_user(&bgscan, userdata, sizeof(bgscan))) {
4121 wmi_ap_bgscan_time(ar->arWmi, bgscan.period_min, bgscan.dwell_ms);
4125 case AR6000_XIOCTL_AP_SET_COUNTRY:
4127 ret = ar6000_ioctl_set_country(dev, rq);
4130 case AR6000_XIOCTL_AP_SET_DTIM:
4132 WMI_AP_SET_DTIM_CMD d;
4133 if (ar->arWmiReady == FALSE) {
4135 } else if (copy_from_user(&d, userdata, sizeof(d))) {
4138 if(d.dtim > 0 && d.dtim < 11) {
4139 ar->ap_dtim_period = d.dtim;
4140 wmi_ap_set_dtim(ar->arWmi, d.dtim);
4141 ar->ap_profile_flag = 1; /* There is a change in profile */
4143 A_PRINTF("DTIM out of range. Valid range is [1-10]\n");
4149 case AR6000_XIOCTL_WMI_TARGET_EVENT_REPORT:
4151 WMI_SET_TARGET_EVENT_REPORT_CMD evtCfgCmd;
4153 if (ar->arWmiReady == FALSE) {
4156 if (copy_from_user(&evtCfgCmd, userdata,
4157 sizeof(evtCfgCmd))) {
4161 ret = wmi_set_target_event_report_cmd(ar->arWmi, &evtCfgCmd);
4164 case AR6000_XIOCTL_AP_INTRA_BSS_COMM:
4167 if (ar->arWmiReady == FALSE) {
4169 } else if (copy_from_user(&intra, userdata, sizeof(intra))) {
4172 ar->intra_bss = (intra?1:0);
4176 case AR6000_XIOCTL_DUMP_MODULE_DEBUG_INFO:
4178 struct drv_debug_module_s moduleinfo;
4180 if (copy_from_user(&moduleinfo, userdata, sizeof(moduleinfo))) {
4185 a_dump_module_debug_info_by_name(moduleinfo.modulename);
4189 case AR6000_XIOCTL_MODULE_DEBUG_SET_MASK:
4191 struct drv_debug_module_s moduleinfo;
4193 if (copy_from_user(&moduleinfo, userdata, sizeof(moduleinfo))) {
4198 if (A_FAILED(a_set_module_mask(moduleinfo.modulename, moduleinfo.mask))) {
4204 case AR6000_XIOCTL_MODULE_DEBUG_GET_MASK:
4206 struct drv_debug_module_s moduleinfo;
4208 if (copy_from_user(&moduleinfo, userdata, sizeof(moduleinfo))) {
4213 if (A_FAILED(a_get_module_mask(moduleinfo.modulename, &moduleinfo.mask))) {
4218 if (copy_to_user(userdata, &moduleinfo, sizeof(moduleinfo))) {
4225 #ifdef ATH_AR6K_11N_SUPPORT
4226 case AR6000_XIOCTL_DUMP_RCV_AGGR_STATS:
4228 PACKET_LOG *copy_of_pkt_log;
4230 aggr_dump_stats(ar->aggr_cntxt, ©_of_pkt_log);
4231 if (copy_to_user(rq->ifr_data, copy_of_pkt_log, sizeof(PACKET_LOG))) {
4236 case AR6000_XIOCTL_SETUP_AGGR:
4238 WMI_ADDBA_REQ_CMD cmd;
4240 if (ar->arWmiReady == FALSE) {
4242 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4245 wmi_setup_aggr_cmd(ar->arWmi, cmd.tid);
4250 case AR6000_XIOCTL_DELE_AGGR:
4252 WMI_DELBA_REQ_CMD cmd;
4254 if (ar->arWmiReady == FALSE) {
4256 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4259 wmi_delete_aggr_cmd(ar->arWmi, cmd.tid, cmd.is_sender_initiator);
4264 case AR6000_XIOCTL_ALLOW_AGGR:
4266 WMI_ALLOW_AGGR_CMD cmd;
4268 if (ar->arWmiReady == FALSE) {
4270 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4273 wmi_allow_aggr_cmd(ar->arWmi, cmd.tx_allow_aggr, cmd.rx_allow_aggr);
4278 case AR6000_XIOCTL_SET_HT_CAP:
4280 if (ar->arWmiReady == FALSE) {
4282 } else if (copy_from_user(&htCap, userdata,
4288 if (wmi_set_ht_cap_cmd(ar->arWmi, &htCap) != A_OK)
4295 case AR6000_XIOCTL_SET_HT_OP:
4297 if (ar->arWmiReady == FALSE) {
4299 } else if (copy_from_user(&htOp, userdata,
4305 if (wmi_set_ht_op_cmd(ar->arWmi, htOp.sta_chan_width) != A_OK)
4313 case AR6000_XIOCTL_ACL_DATA:
4316 if (ar->arWmiReady == FALSE) {
4318 } else if (ar6000_create_acl_data_osbuf(dev, (A_UINT8*)userdata, &osbuf) != A_OK) {
4321 if (wmi_data_hdr_add(ar->arWmi, osbuf, DATA_MSGTYPE, 0, WMI_DATA_HDR_DATA_TYPE_ACL,0,NULL) != A_OK) {
4322 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("XIOCTL_ACL_DATA - wmi_data_hdr_add failed\n"));
4324 /* Send data buffer over HTC */
4325 ar6000_acl_data_tx(osbuf, ar->arNetDev);
4330 case AR6000_XIOCTL_HCI_CMD:
4334 WMI_HCI_CMD *cmd = (WMI_HCI_CMD *)tmp_buf;
4337 size = sizeof(cmd->cmd_buf_sz);
4338 if (ar->arWmiReady == FALSE) {
4340 } else if (copy_from_user(cmd, userdata, size)) {
4342 } else if(copy_from_user(cmd->buf, userdata + size, cmd->cmd_buf_sz)) {
4345 if (wmi_send_hci_cmd(ar->arWmi, cmd->buf, cmd->cmd_buf_sz) != A_OK) {
4348 A_PRINTF_LOG("HCI Command To PAL --> \n");
4349 for(i = 0; i < cmd->cmd_buf_sz; i++) {
4350 A_PRINTF_LOG("0x%02x ",cmd->buf[i]);
4356 A_PRINTF_LOG("==================================\n");
4361 case AR6000_XIOCTL_WLAN_CONN_PRECEDENCE:
4363 WMI_SET_BT_WLAN_CONN_PRECEDENCE cmd;
4364 if (ar->arWmiReady == FALSE) {
4366 } else if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
4369 if (cmd.precedence == BT_WLAN_CONN_PRECDENCE_WLAN ||
4370 cmd.precedence == BT_WLAN_CONN_PRECDENCE_PAL) {
4371 if ( wmi_set_wlan_conn_precedence_cmd(ar->arWmi, cmd.precedence) != A_OK) {
4380 case AR6000_XIOCTL_AP_GET_STAT:
4382 ret = ar6000_ioctl_get_ap_stats(dev, rq);
4385 case AR6000_XIOCTL_SET_TX_SELECT_RATES:
4387 WMI_SET_TX_SELECT_RATES_CMD masks;
4389 if (ar->arWmiReady == FALSE) {
4391 } else if (copy_from_user(&masks, userdata,
4397 if (wmi_set_tx_select_rates_cmd(ar->arWmi, masks.rateMasks) != A_OK)
4404 case AR6000_XIOCTL_AP_GET_HIDDEN_SSID:
4406 WMI_AP_HIDDEN_SSID_CMD ssid;
4407 ssid.hidden_ssid = ar->ap_hidden_ssid;
4409 if (ar->arWmiReady == FALSE) {
4411 } else if(copy_to_user((WMI_AP_HIDDEN_SSID_CMD *)rq->ifr_data,
4412 &ssid, sizeof(WMI_AP_HIDDEN_SSID_CMD))) {
4417 case AR6000_XIOCTL_AP_GET_COUNTRY:
4419 WMI_AP_SET_COUNTRY_CMD cty;
4420 A_MEMCPY(cty.countryCode, ar->ap_country_code, 3);
4422 if (ar->arWmiReady == FALSE) {
4424 } else if(copy_to_user((WMI_AP_SET_COUNTRY_CMD *)rq->ifr_data,
4425 &cty, sizeof(WMI_AP_SET_COUNTRY_CMD))) {
4430 case AR6000_XIOCTL_AP_GET_WMODE:
4432 if (ar->arWmiReady == FALSE) {
4434 } else if(copy_to_user((A_UINT8 *)rq->ifr_data,
4435 &ar->ap_wmode, sizeof(A_UINT8))) {
4440 case AR6000_XIOCTL_AP_GET_DTIM:
4442 WMI_AP_SET_DTIM_CMD dtim;
4443 dtim.dtim = ar->ap_dtim_period;
4445 if (ar->arWmiReady == FALSE) {
4447 } else if(copy_to_user((WMI_AP_SET_DTIM_CMD *)rq->ifr_data,
4448 &dtim, sizeof(WMI_AP_SET_DTIM_CMD))) {
4453 case AR6000_XIOCTL_AP_GET_BINTVL:
4455 WMI_BEACON_INT_CMD bi;
4456 bi.beaconInterval = ar->ap_beacon_interval;
4458 if (ar->arWmiReady == FALSE) {
4460 } else if(copy_to_user((WMI_BEACON_INT_CMD *)rq->ifr_data,
4461 &bi, sizeof(WMI_BEACON_INT_CMD))) {
4466 case AR6000_XIOCTL_AP_GET_RTS:
4468 WMI_SET_RTS_CMD rts;
4469 rts.threshold = ar->arRTS;
4471 if (ar->arWmiReady == FALSE) {
4473 } else if(copy_to_user((WMI_SET_RTS_CMD *)rq->ifr_data,
4474 &rts, sizeof(WMI_SET_RTS_CMD))) {
4479 case AR6000_XIOCTL_FETCH_TARGET_REGS:
4481 A_UINT32 targregs[AR6003_FETCH_TARG_REGS_COUNT];
4483 if (ar->arTargetType == TARGET_TYPE_AR6003) {
4484 ar6k_FetchTargetRegs(hifDevice, targregs);
4485 if (copy_to_user((A_UINT32 *)rq->ifr_data, &targregs, sizeof(targregs)))
4494 case AR6000_XIOCTL_AP_SET_11BG_RATESET:
4496 WMI_AP_SET_11BG_RATESET_CMD rate;
4497 if (ar->arWmiReady == FALSE) {
4499 } else if (copy_from_user(&rate, userdata, sizeof(rate))) {
4502 wmi_ap_set_rateset(ar->arWmi, rate.rateset);
4506 case AR6000_XIOCTL_GET_WLAN_SLEEP_STATE:
4508 WMI_REPORT_SLEEP_STATE_EVENT wmiSleepEvent ;
4510 if (ar->arWlanState == WLAN_ENABLED) {
4511 wmiSleepEvent.sleepState = WMI_REPORT_SLEEP_STATUS_IS_AWAKE;
4513 wmiSleepEvent.sleepState = WMI_REPORT_SLEEP_STATUS_IS_DEEP_SLEEP;
4515 rq->ifr_ifru.ifru_ivalue = ar->arWlanState; /* return value */
4517 ar6000_send_event_to_app(ar, WMI_REPORT_SLEEP_STATE_EVENTID, (A_UINT8*)&wmiSleepEvent,
4518 sizeof(WMI_REPORT_SLEEP_STATE_EVENTID));
4522 case AR6000_XIOCTL_SET_BT_HW_POWER_STATE:
4525 get_user(state, (unsigned int *)userdata);
4526 if (ar6000_set_bt_hw_state(ar, state)!=A_OK) {
4531 case AR6000_XIOCTL_GET_BT_HW_POWER_STATE:
4532 rq->ifr_ifru.ifru_ivalue = !ar->arBTOff; /* return value */
4536 case AR6000_XIOCTL_WMI_SET_TX_SGI_PARAM:
4538 WMI_SET_TX_SGI_PARAM_CMD SGICmd;
4540 if (ar->arWmiReady == FALSE) {
4542 } else if (copy_from_user(&SGICmd, userdata,
4546 if (wmi_SGI_cmd(ar->arWmi, SGICmd.sgiMask, SGICmd.sgiPERThreshold) != A_OK) {
4554 case AR6000_XIOCTL_ADD_AP_INTERFACE:
4555 #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT
4557 char ap_ifname[IFNAMSIZ] = {0,};
4558 if (copy_from_user(ap_ifname, userdata, IFNAMSIZ)) {
4561 if (ar6000_add_ap_interface(ar, ap_ifname) != A_OK) {
4570 case AR6000_XIOCTL_REMOVE_AP_INTERFACE:
4571 #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT
4572 if (ar6000_remove_ap_interface(ar) != A_OK) {
4585 rtnl_lock(); /* restore rtnl state */
4591 A_UINT8 mac_cmp_wild(A_UINT8 *mac, A_UINT8 *new_mac, A_UINT8 wild, A_UINT8 new_wild)
4595 for(i=0;i<ATH_MAC_LEN;i++) {
4596 if((wild & 1<<i) && (new_wild & 1<<i)) continue;
4597 if(mac[i] != new_mac[i]) return 1;
4599 if((A_MEMCMP(new_mac, null_mac, 6)==0) && new_wild &&
4600 (wild != new_wild)) {
4607 A_UINT8 acl_add_del_mac(WMI_AP_ACL *a, WMI_AP_ACL_MAC_CMD *acl)
4609 A_INT8 already_avail=-1, free_slot=-1, i;
4611 /* To check whether this mac is already there in our list */
4612 for(i=AP_ACL_SIZE-1;i>=0;i--)
4614 if(mac_cmp_wild(a->acl_mac[i], acl->mac, a->wildcard[i],
4618 if(!((1 << i) & a->index))
4622 if(acl->action == ADD_MAC_ADDR)
4624 /* Dont add mac if it is already available */
4625 if((already_avail >= 0) || (free_slot == -1))
4628 A_MEMCPY(a->acl_mac[free_slot], acl->mac, ATH_MAC_LEN);
4629 a->index = a->index | (1 << free_slot);
4630 acl->index = free_slot;
4631 a->wildcard[free_slot] = acl->wildcard;
4634 else if(acl->action == DEL_MAC_ADDR)
4636 if(acl->index > AP_ACL_SIZE)
4639 if(!(a->index & (1 << acl->index)))
4642 A_MEMZERO(a->acl_mac[acl->index],ATH_MAC_LEN);
4643 a->index = a->index & ~(1 << acl->index);
4644 a->wildcard[acl->index] = 0;