📄 ar6000_drv.c
字号:
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 + -