INT CFG80211DRV_IoctlHandle( IN VOID *pAdSrc, IN RTMP_IOCTL_INPUT_STRUCT *wrq, IN INT cmd, IN USHORT subcmd, IN VOID *pData, IN ULONG Data) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; switch(cmd) { case CMD_RTPRIV_IOCTL_80211_START: case CMD_RTPRIV_IOCTL_80211_END: /* nothing to do */ break; case CMD_RTPRIV_IOCTL_80211_CB_GET: *(VOID **)pData = (VOID *)(pAd->pCfg80211_CB); break; case CMD_RTPRIV_IOCTL_80211_CB_SET: pAd->pCfg80211_CB = pData; break; case CMD_RTPRIV_IOCTL_80211_CHAN_SET: if (CFG80211DRV_OpsSetChannel(pAd, pData) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_80211_VIF_CHG: if (CFG80211DRV_OpsChgVirtualInf(pAd, pData, Data) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_80211_SCAN: CFG80211DRV_OpsScan(pAd); break; case CMD_RTPRIV_IOCTL_80211_IBSS_JOIN: CFG80211DRV_OpsJoinIbss(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_STA_LEAVE: CFG80211DRV_OpsLeave(pAd); break; case CMD_RTPRIV_IOCTL_80211_STA_GET: if (CFG80211DRV_StaGet(pAd, pData) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_80211_KEY_ADD: CFG80211DRV_KeyAdd(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET: break; case CMD_RTPRIV_IOCTL_80211_CONNECT_TO: CFG80211DRV_Connect(pAd, pData); break; #ifdef RFKILL_HW_SUPPORT case CMD_RTPRIV_IOCTL_80211_RFKILL: { UINT32 data = 0; BOOLEAN active; /* Read GPIO pin2 as Hardware controlled radio state */ RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data); active = !!(data & 0x04); if (!active) { RTMPSetLED(pAd, LED_RADIO_OFF); *(UINT8 *)pData = 0; } else *(UINT8 *)pData = 1; } break; #endif /* RFKILL_HW_SUPPORT */ case CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO: CFG80211DRV_RegNotify(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_UNREGISTER: CFG80211_UnRegister(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_BANDINFO_GET: { CFG80211_BAND *pBandInfo = (CFG80211_BAND *)pData; CFG80211_BANDINFO_FILL(pAd, pBandInfo); } break; case CMD_RTPRIV_IOCTL_80211_SURVEY_GET: CFG80211DRV_SurveyGet(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_EXTRA_IES_SET: CFG80211DRV_OpsExtraIesSet(pAd); break; case CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_SET: CFG80211DRV_OpsRemainOnChannel(pAd, pData, Data); break; case CMD_RTPRIV_IOCTL_80211_CANCEL_REMAIN_ON_CHAN_SET: CFG80211DRV_OpsCancelRemainOnChannel(pAd, Data); break; case CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_REG: if (Data) pAd->Cfg80211ProbeReqCount++; else { pAd->Cfg80211ProbeReqCount--; } if (pAd->Cfg80211ProbeReqCount > 0) pAd->Cfg80211RegisterProbeReqFrame = TRUE; else pAd->Cfg80211RegisterProbeReqFrame = FALSE; DBGPRINT(RT_DEBUG_ERROR, ("pAd->Cfg80211RegisterProbeReqFrame=%d[%d]\n",pAd->Cfg80211RegisterProbeReqFrame, pAd->Cfg80211ProbeReqCount)); break; case CMD_RTPRIV_IOCTL_80211_ACTION_FRAME_REG: if (Data) pAd->Cfg80211ActionCount++; else pAd->Cfg80211ActionCount--; if (pAd->Cfg80211ActionCount > 0) pAd->Cfg80211RegisterActionFrame = TRUE; else pAd->Cfg80211RegisterActionFrame = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("pAd->Cfg80211RegisterActionFrame=%d [%d]\n",pAd->Cfg80211RegisterActionFrame, pAd->Cfg80211ActionCount)); break; case CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK: //pAd->CommonCfg.CentralChannel = Data; //DBGPRINT(RT_DEBUG_TRACE, ("CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK %d\n", Data)); if (pAd->CommonCfg.Channel != Data) { pAd->CommonCfg.Channel= Data; AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); } break; case CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_SEND: /* send a managment frame */ pAd->TxStatusInUsed = TRUE; pAd->TxStatusSeq = pAd->Sequence; if (pData != NULL) { #ifdef WFD_SUPPORT if (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe) { PP2P_PUBLIC_FRAME pFrame = (PP2P_PUBLIC_FRAME)pData; ULONG WfdIeLen = 0, WfdIeBitmap = 0; switch (pFrame->p80211Header.FC.SubType) { case SUBTYPE_BEACON: case SUBTYPE_PROBE_REQ: case SUBTYPE_ASSOC_REQ: case SUBTYPE_REASSOC_REQ: WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) | (0x1 << SUBID_WFD_COUPLED_SINK_INFO); break; case SUBTYPE_ASSOC_RSP: case SUBTYPE_REASSOC_RSP: WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) | (0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO); break; case SUBTYPE_PROBE_RSP: WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) | (0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO); break; case SUBTYPE_ACTION: if ((pFrame->Category == CATEGORY_PUBLIC) && (pFrame->Action == ACTION_WIFI_DIRECT)) { switch (pFrame->Subtype) { case GO_NEGOCIATION_REQ: case GO_NEGOCIATION_RSP: case GO_NEGOCIATION_CONFIRM: case P2P_PROVISION_REQ: WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) | (0x1 << SUBID_WFD_COUPLED_SINK_INFO); break; case P2P_INVITE_REQ: case P2P_INVITE_RSP: case P2P_PROVISION_RSP: WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) | (0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO); break; } } break; } if (WfdIeBitmap > 0) { PUCHAR pOutBuffer; NDIS_STATUS NStatus; NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /* Get an unused nonpaged memory */ if (NStatus != NDIS_STATUS_SUCCESS) DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__)); else { memcpy(pOutBuffer, pData, Data); WfdMakeWfdIE(pAd, WfdIeBitmap, pOutBuffer + Data, &WfdIeLen); Data += WfdIeLen; if (pAd->pTxStatusBuf != NULL) os_free_mem(NULL, pAd->pTxStatusBuf); os_alloc_mem(NULL, (UCHAR **)&pAd->pTxStatusBuf, Data); if (pAd->pTxStatusBuf != NULL) { NdisCopyMemory(pAd->pTxStatusBuf, pOutBuffer, Data); pAd->TxStatusBufLen = Data; } else { DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: MEM ALLOC ERROR\n")); MlmeFreeMemory(pAd, pOutBuffer); return NDIS_STATUS_FAILURE; } MiniportMMRequest(pAd, 0, pOutBuffer, Data); } } } else #endif /* WFD_SUPPORT */ { if (pAd->pTxStatusBuf != NULL) os_free_mem(NULL, pAd->pTxStatusBuf); os_alloc_mem(NULL, (UCHAR **)&pAd->pTxStatusBuf, Data); if (pAd->pTxStatusBuf != NULL) { NdisCopyMemory(pAd->pTxStatusBuf, pData, Data); pAd->TxStatusBufLen = Data; } else { DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: MEM ALLOC ERROR\n")); return NDIS_STATUS_FAILURE; } // pAd->pTxStatusBuf // pAd->TxStatusBufLen = Data //DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: send %d\n", pAd->TxStatusSeq)); MiniportMMRequest(pAd, 0, pData, Data); //DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: sent %d\n", pAd->TxStatusSeq)); } } break; case CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_DUR_TIMER_INIT: DBGPRINT(RT_DEBUG_TRACE, ("ROC TIMER INIT\n")); RTMPInitTimer(pAd, &pAd->Cfg80211RemainOnChannelDurationTimer, GET_TIMER_FUNCTION(RemainOnChannelTimeout), pAd, FALSE); break; case CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET: DBGPRINT(RT_DEBUG_TRACE, ("CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET: %d\n", Data)); UINT32 *pChanList = (UINT32 *) pData; if (pChanList != NULL) { if (pAd->pCfg80211ChanList != NULL) os_free_mem(NULL, pAd->pCfg80211ChanList); os_alloc_mem(NULL, (UINT32 **)&pAd->pCfg80211ChanList, sizeof(UINT32 *) * Data); if (pAd->pCfg80211ChanList != NULL) { NdisCopyMemory(pAd->pCfg80211ChanList, pChanList, sizeof(UINT32 *) * Data); pAd->Cfg80211ChanListLan = Data; } else { return NDIS_STATUS_FAILURE; } } break; case CMD_RTPRIV_IOCTL_80211_BEACON_SET: CFG80211DRV_OpsBeaconSet(pAd, pData, 0); break; case CMD_RTPRIV_IOCTL_80211_BEACON_ADD: CFG80211DRV_OpsBeaconSet(pAd, pData, 1); break; case CMD_RTPRIV_IOCTL_80211_BEACON_DEL: #ifdef WFD_SUPPORT pAd->StaCfg.WfdCfg.bSuppGoOn = FALSE; #endif /* WFD_SUPPORT */ break; case CMD_RTPRIV_IOCTL_80211_CHANGE_BSS_PARM: CFG80211DRV_OpsChangeBssParm(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_AP_PROBE_RSP: if (pData != NULL) { if (pAd->pCfg80211RrobeRsp != NULL) os_free_mem(NULL, pAd->pCfg80211RrobeRsp); os_alloc_mem(NULL, (UCHAR **)&pAd->pCfg80211RrobeRsp, Data); if (pAd->pCfg80211RrobeRsp != NULL) { NdisCopyMemory(pAd->pCfg80211RrobeRsp, pData, Data); pAd->Cfg80211AssocRspLen = Data; } else { DBGPRINT(RT_DEBUG_TRACE, ("YF_AP: MEM ALLOC ERROR\n")); return NDIS_STATUS_FAILURE; } } else return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_80211_PORT_SECURED: CFG80211_StaPortSecured(pAd, pData, Data); break; case CMD_RTPRIV_IOCTL_80211_AP_STA_DEL: CFG80211_ApStaDel(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_BITRATE_SET: // pAd->CommonCfg.PhyMode = PHY_11AN_MIXED; // RTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode); //Set_WirelessMode_Proc(pAd, PHY_11AGN_MIXED); break; #ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT case CMD_RTPRIV_IOCTL_80211_SEND_WIRELESS_EVENT: CFG80211_SendWirelessEvent(pAd, pData); break; #endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */ default: return NDIS_STATUS_FAILURE; } return NDIS_STATUS_SUCCESS; }
INT CFG80211DRV_IoctlHandle( IN VOID *pAdSrc, IN RTMP_IOCTL_INPUT_STRUCT *wrq, IN INT cmd, IN USHORT subcmd, IN VOID *pData, IN ULONG Data) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; switch(cmd) { case CMD_RTPRIV_IOCTL_80211_START: case CMD_RTPRIV_IOCTL_80211_END: /* nothing to do */ break; case CMD_RTPRIV_IOCTL_80211_CB_GET: *(VOID **)pData = (VOID *)(pAd->pCfg80211_CB); break; case CMD_RTPRIV_IOCTL_80211_CB_SET: pAd->pCfg80211_CB = pData; break; case CMD_RTPRIV_IOCTL_80211_CHAN_SET: if (CFG80211DRV_OpsSetChannel(pAd, pData) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_80211_VIF_CHG: if (CFG80211DRV_OpsChgVirtualInf(pAd, pData, Data) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_80211_SCAN: CFG80211DRV_OpsScan(pAd); break; case CMD_RTPRIV_IOCTL_80211_IBSS_JOIN: CFG80211DRV_OpsJoinIbss(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_STA_LEAVE: CFG80211DRV_OpsLeave(pAd); break; case CMD_RTPRIV_IOCTL_80211_STA_GET: if (CFG80211DRV_StaGet(pAd, pData) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_80211_KEY_ADD: CFG80211DRV_KeyAdd(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET: #ifdef CONFIG_STA_SUPPORT pAd->StaCfg.DefaultKeyId = Data; /* base 0 */ #endif /* CONFIG_STA_SUPPORT */ break; case CMD_RTPRIV_IOCTL_80211_CONNECT_TO: CFG80211DRV_Connect(pAd, pData); break; #ifdef RFKILL_HW_SUPPORT case CMD_RTPRIV_IOCTL_80211_RFKILL: { UINT32 data = 0; BOOLEAN active; /* Read GPIO pin2 as Hardware controlled radio state */ RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data); active = !!(data & 0x04); if (!active) { RTMPSetLED(pAd, LED_RADIO_OFF); *(UINT8 *)pData = 0; } else *(UINT8 *)pData = 1; } break; #endif /* RFKILL_HW_SUPPORT */ case CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO: CFG80211DRV_RegNotify(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_UNREGISTER: CFG80211_UnRegister(pAd, pData); break; case CMD_RTPRIV_IOCTL_80211_BANDINFO_GET: { CFG80211_BAND *pBandInfo = (CFG80211_BAND *)pData; CFG80211_BANDINFO_FILL(pAd, pBandInfo); } break; case CMD_RTPRIV_IOCTL_80211_SURVEY_GET: CFG80211DRV_SurveyGet(pAd, pData); break; default: return NDIS_STATUS_FAILURE; } return NDIS_STATUS_SUCCESS; }