⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ar6000_drv.c

📁 Linux下SDIO设备的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
        case AR6000_IOCTL_WMI_SET_CHANNELPARAMS:        {            ret = ar6000_ioctl_set_channelParams(dev, rq);            break;        }        case AR6000_IOCTL_WMI_SET_PROBEDSSID:        {            ret = ar6000_ioctl_set_probedSsid(dev, rq);            break;        }        case AR6000_IOCTL_WMI_SET_BADAP:        {            ret = ar6000_ioctl_set_badAp(dev, rq);            break;        }        case AR6000_IOCTL_WMI_CREATE_QOS:        {            ret = ar6000_ioctl_create_qos(dev, rq);            break;        }        case AR6000_IOCTL_WMI_DELETE_QOS:        {            ret = ar6000_ioctl_delete_qos(dev, rq);            break;        }        case AR6000_IOCTL_WMI_GET_QOS_QUEUE:        {            ret = ar6000_ioctl_get_qos_queue(dev, rq);            break;        }        case AR6000_IOCTL_WMI_GET_TARGET_STATS:        {            ret = ar6000_ioctl_get_target_stats(dev, rq);            break;        }        case AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK:        {            ret = ar6000_ioctl_set_error_report_bitmask(dev, rq);            break;        }        case AR6000_IOCTL_WMI_SET_ASSOC_INFO:        {            WMI_SET_ASSOC_INFO_CMD cmd;            A_UINT8 assocInfo[WMI_MAX_ASSOC_INFO_LEN];            if (ar->arWmiReady == FALSE) {                ret = -EIO;            } else {                get_user(cmd.ieType, userdata);                if (cmd.ieType >= WMI_MAX_ASSOC_INFO_TYPE) {                    ret = -EIO;                } else {                    get_user(cmd.bufferSize, userdata + 1);                    if (cmd.bufferSize > WMI_MAX_ASSOC_INFO_LEN) {                        ret = -EFAULT;                        break;                    }                    if (copy_from_user(assocInfo, userdata + 2,                                       cmd.bufferSize))                    {                        ret = -EFAULT;                    } else {                        AR6000_SPIN_LOCK(&ar->arLock, 0);                        if (wmi_associnfo_cmd(ar->arWmi, cmd.ieType,                                                 cmd.bufferSize,                                                 assocInfo) != A_OK)                        {                            ret = -EIO;                        }                        AR6000_SPIN_UNLOCK(&ar->arLock, 0);                    }                }            }            break;        }        case AR6000_IOCTL_WMI_SET_ACCESS_PARAMS:        {            ret = ar6000_ioctl_set_access_params(dev, rq);            break;        }        case AR6000_IOCTL_WMI_SET_DISC_TIMEOUT:        {            ret = ar6000_ioctl_set_disconnect_timeout(dev, rq);            break;        }#if CONFIG_HOST_DSET_SUPPORT        case AR6000_XIOCTL_WMI_DSET_WAIT_REQ:        {            ar6000_ioctl_wait_dset_req(dev, rq);            break;        }        case AR6000_XIOCTL_WMI_DSET_OPEN_REPLY:        {            AR6000_SPIN_LOCK(&ar->arLock, 0);            ar6000_ioctl_dset_open_reply(dev, rq);            AR6000_SPIN_UNLOCK(&ar->arLock, 0);            break;        }        case AR6000_XIOCTL_WMI_DSET_DATA_REPLY:        {            AR6000_SPIN_LOCK(&ar->arLock, 0);            ar6000_ioctl_dset_data_reply(dev, rq);            AR6000_SPIN_UNLOCK(&ar->arLock, 0);            break;        }#endif /* CONFIG_HOST_DSET_SUPPORT */        case AR6000_XIOCTL_FORCE_TARGET_RESET:        {            if (htcTarget)            {//                HTCForceReset(htcTarget);            }            else            {                AR_DEBUG_PRINTF("ar6000_ioctl cannot attempt reset.\n");            }            break;        }        case AR6000_XIOCTL_CHECK_TARGET_READY:        {            /* If we made it to here, then the Target exists and is ready. */            break;        }#if CONFIG_HOST_GPIO_SUPPORT        case AR6000_XIOCTL_GPIO_OUTPUT_SET:        {            struct ar6000_gpio_output_set_cmd_s gpio_output_set_cmd;            if (ar->arWmiReady == FALSE) {                return -EIO;            }            if (down_interruptible(&ar->arSem)) {                return -ERESTARTSYS;            }            if (copy_from_user(&gpio_output_set_cmd, userdata,                                sizeof(gpio_output_set_cmd)))            {                ret = -EFAULT;            } else {                ret = ar6000_gpio_output_set(dev,                                             gpio_output_set_cmd.set_mask,                                             gpio_output_set_cmd.clear_mask,                                             gpio_output_set_cmd.enable_mask,                                             gpio_output_set_cmd.disable_mask);                if (ret != A_OK) {                    ret = EIO;                }            }            up(&ar->arSem);            break;        }        case AR6000_XIOCTL_GPIO_INPUT_GET:        {            if (ar->arWmiReady == FALSE) {                return -EIO;            }            if (down_interruptible(&ar->arSem)) {                return -ERESTARTSYS;            }            ret = ar6000_gpio_input_get(dev);            if (ret != A_OK) {                up(&ar->arSem);                return -EIO;            }            /* Wait for Target to respond. */            wait_event_interruptible(arEvent, gpio_data_available);            if (signal_pending(current)) {                ret = -EINTR;            } else {                A_ASSERT(gpio_reg_results.gpioreg_id == GPIO_ID_NONE);                if (copy_to_user(userdata, &gpio_reg_results.value,                                 sizeof(gpio_reg_results.value)))                {                    ret = -EFAULT;                }            }            up(&ar->arSem);            break;        }        case AR6000_XIOCTL_GPIO_REGISTER_SET:        {            struct ar6000_gpio_register_cmd_s gpio_register_cmd;            if (ar->arWmiReady == FALSE) {                return -EIO;            }            if (down_interruptible(&ar->arSem)) {                return -ERESTARTSYS;            }            if (copy_from_user(&gpio_register_cmd, userdata,                                sizeof(gpio_register_cmd)))            {                ret = -EFAULT;            } else {                ret = ar6000_gpio_register_set(dev,                                               gpio_register_cmd.gpioreg_id,                                               gpio_register_cmd.value);                if (ret != A_OK) {                    ret = EIO;                }                /* Wait for acknowledgement from Target */                wait_event_interruptible(arEvent, gpio_ack_received);                if (signal_pending(current)) {                    ret = -EINTR;                }            }            up(&ar->arSem);            break;        }        case AR6000_XIOCTL_GPIO_REGISTER_GET:        {            struct ar6000_gpio_register_cmd_s gpio_register_cmd;            if (ar->arWmiReady == FALSE) {                return -EIO;            }            if (down_interruptible(&ar->arSem)) {                return -ERESTARTSYS;            }            if (copy_from_user(&gpio_register_cmd, userdata,                                sizeof(gpio_register_cmd)))            {                ret = -EFAULT;            } else {                ret = ar6000_gpio_register_get(dev, gpio_register_cmd.gpioreg_id);                if (ret != A_OK) {                    up(&ar->arSem);                    return -EIO;                }                /* Wait for Target to respond. */                wait_event_interruptible(arEvent, gpio_data_available);                if (signal_pending(current)) {                    ret = -EINTR;                } else {                    A_ASSERT(gpio_register_cmd.gpioreg_id == gpio_reg_results.gpioreg_id);                    if (copy_to_user(userdata, &gpio_reg_results,                                     sizeof(gpio_reg_results)))                    {                        ret = -EFAULT;                    }                }            }            up(&ar->arSem);            break;        }        case AR6000_XIOCTL_GPIO_INTR_ACK:        {            struct ar6000_gpio_intr_ack_cmd_s gpio_intr_ack_cmd;            if (ar->arWmiReady == FALSE) {                return -EIO;            }            if (down_interruptible(&ar->arSem)) {                return -ERESTARTSYS;            }            if (copy_from_user(&gpio_intr_ack_cmd, userdata,                                sizeof(gpio_intr_ack_cmd)))            {                ret = -EFAULT;            } else {                ret = ar6000_gpio_intr_ack(dev, gpio_intr_ack_cmd.ack_mask);                if (ret != A_OK) {                    ret = EIO;                }            }            up(&ar->arSem);            break;        }        case AR6000_XIOCTL_GPIO_INTR_WAIT:        {            /* Wait for Target to report an interrupt. */            dev_hold(dev);            rtnl_unlock();            wait_event_interruptible(arEvent, gpio_intr_available);            rtnl_lock();            dev_put(dev);            if (signal_pending(current)) {                ret = -EINTR;            } else {                if (copy_to_user(userdata, &gpio_intr_results,                                 sizeof(gpio_intr_results)))                {                    ret = -EFAULT;                }            }            break;        }#endif /* CONFIG_HOST_GPIO_SUPPORT */        case AR6000_XIOCTL_SET_ADHOC_BSSID:        {            WMI_SET_ADHOC_BSSID_CMD adhocBssid;            if (ar->arWmiReady == FALSE) {                ret = -EIO;            } else if (copy_from_user(&adhocBssid, userdata,                                      sizeof(adhocBssid)))            {                ret = -EFAULT;            } else if (A_MEMCMP(adhocBssid.bssid, bcast_mac,                                AR6000_ETH_ADDR_LEN) == 0)            {                ret = -EFAULT;            } else {                A_MEMCPY(ar->arReqBssid, adhocBssid.bssid, sizeof(ar->arReqBssid));        }            break;        }        case AR6000_XIOCTL_SET_OPT_MODE:        {        WMI_SET_OPT_MODE_CMD optModeCmd;            AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;            if (ar->arWmiReady == FALSE) {                ret = -EIO;            } else if (copy_from_user(&optModeCmd, userdata,                                      sizeof(optModeCmd)))            {                ret = -EFAULT;            } else if (ar->arConnected && optModeCmd.optMode == SPECIAL_ON) {                ret = -EFAULT;            } else if (wmi_set_opt_mode_cmd(ar->arWmi, optModeCmd.optMode)                       != A_OK)            {                ret = -EIO;            }            break;        }        case AR6000_XIOCTL_OPT_SEND_FRAME:        {        WMI_OPT_TX_FRAME_CMD optTxFrmCmd;            A_UINT8 data[MAX_OPT_DATA_LEN];            if (ar->arWmiReady == FALSE) {                ret = -EIO;            } else if (copy_from_user(&optTxFrmCmd, userdata,                                      sizeof(optTxFrmCmd)))            {                ret = -EFAULT;            } else if (copy_from_user(data,                                      optTxFrmCmd.optIEData,                                      optTxFrmCmd.optIEDataLen))            {                ret = -EFAULT;            } else {                ret = wmi_opt_tx_frame_cmd(ar->arWmi,                                           optTxFrmCmd.frmType,                                           optTxFrmCmd.dstAddr,                                           optTxFrmCmd.bssid,                                           optTxFrmCmd.optIEDataLen,                                           data);            }            break;        }        case AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL:        {            WMI_BEACON_INT_CMD bIntvlCmd;            if (ar->arWmiReady == FALSE) {                ret = -EIO;            } else if (copy_from_user(&bIntvlCmd, userdata,                       sizeof(bIntvlCmd)))            {                ret = -EFAULT;            } else if (wmi_set_adhoc_bconIntvl_cmd(ar->arWmi, bIntvlCmd.beaconInterval)                        != A_OK)            {                ret = -EIO;            }            break;        }        case IEEE80211_IOCTL_SETAUTHALG:        {            AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;            struct ieee80211req_authalg req;            if (ar->arWmiReady == FALSE) {                ret = -EIO;            } else if (copy_from_user(&req, userdata,                       sizeof(struct ieee80211req_authalg)))            {                ret = -EFAULT;            } else if (req.auth_alg == AUTH_ALG_OPEN_SYSTEM) {                ar->arDot11AuthMode  = OPEN_AUTH;                ar->arPairwiseCrypto  = NONE_CRYPT;                ar->arGroupCrypto     = NONE_CRYPT;            } else if (req.auth_alg == AUTH_ALG_LEAP) {                ar->arDot11AuthMode   = LEAP_AUTH;            } else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -