INT RTMP_COM_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; POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; INT Status = NDIS_STATUS_SUCCESS, i; pObj = pObj; /* avoid compile warning */ switch(cmd) { case CMD_RTPRIV_IOCTL_NETDEV_GET: /* get main net_dev */ { VOID **ppNetDev = (VOID **)pData; *ppNetDev = (VOID *)(pAd->net_dev); } break; case CMD_RTPRIV_IOCTL_NETDEV_SET: { struct wifi_dev *wdev = NULL; /* set main net_dev */ pAd->net_dev = pData; #ifdef CONFIG_AP_SUPPORT if (pAd->OpMode == OPMODE_AP) { pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.if_dev = (void *)pData; pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.func_dev = (void *)&pAd->ApCfg.MBSSID[MAIN_MBSSID]; pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.sys_handle = (void *)pAd; RTMP_OS_NETDEV_SET_WDEV(pData, &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev); wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; } #endif /* CONFIG_AP_SUPPORT */ if (wdev) { if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("Assign wdev idx for %s failed, free net device!\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev))); RtmpOSNetDevFree(pAd->net_dev); } } break; } case CMD_RTPRIV_IOCTL_OPMODE_GET: /* get Operation Mode */ *(ULONG *)pData = pAd->OpMode; break; case CMD_RTPRIV_IOCTL_TASK_LIST_GET: /* get all Tasks */ { RT_CMD_WAIT_QUEUE_LIST *pList = (RT_CMD_WAIT_QUEUE_LIST *)pData; pList->pMlmeTask = &pAd->mlmeTask; #ifdef RTMP_TIMER_TASK_SUPPORT pList->pTimerTask = &pAd->timerTask; #endif /* RTMP_TIMER_TASK_SUPPORT */ pList->pCmdQTask = &pAd->cmdQTask; #ifdef WSC_INCLUDED pList->pWscTask = &pAd->wscTask; #endif /* WSC_INCLUDED */ } break; #ifdef RTMP_MAC_PCI case CMD_RTPRIV_IOCTL_IRQ_INIT: /* init IRQ */ rtmp_irq_init(pAd); break; #endif /* RTMP_MAC_PCI */ case CMD_RTPRIV_IOCTL_IRQ_RELEASE: /* release IRQ */ RTMP_OS_IRQ_RELEASE(pAd, pAd->net_dev); break; #ifdef RTMP_MAC_PCI case CMD_RTPRIV_IOCTL_MSI_ENABLE: /* enable MSI */ RTMP_MSI_ENABLE(pAd); *(ULONG **)pData = (ULONG *)(pObj->pci_dev); break; #endif /* RTMP_MAC_PCI */ case CMD_RTPRIV_IOCTL_NIC_NOT_EXIST: /* set driver state to fRTMP_ADAPTER_NIC_NOT_EXIST */ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); break; case CMD_RTPRIV_IOCTL_MCU_SLEEP_CLEAR: RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP); break; case CMD_RTPRIV_IOCTL_SANITY_CHECK: /* sanity check before IOCTL */ if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) #ifdef IFUP_IN_PROBE || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) #endif /* IFUP_IN_PROBE */ ) { if(pData == NULL || RT_isLegalCmdBeforeInfUp((PSTRING) pData) == FALSE) return NDIS_STATUS_FAILURE; } break; case CMD_RTPRIV_IOCTL_SIOCGIWFREQ: /* get channel number */ *(ULONG *)pData = pAd->CommonCfg.Channel; break; #ifdef CONFIG_SNIFFER_SUPPORT case CMD_RTPRIV_IOCTL_SNIFF_INIT: Monitor_Init(pAd, pData); break; case CMD_RTPRIV_IOCTL_SNIFF_OPEN: if (Monitor_Open(pAd, pData) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_SNIFF_CLOSE: if (Monitor_Close(pAd, pData) != TRUE) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_SNIFF_REMOVE: Monitor_Remove(pAd); break; #endif /*CONFIG_SNIFFER_SUPPORT*/ case CMD_RTPRIV_IOCTL_BEACON_UPDATE: /* update all beacon contents */ #ifdef CONFIG_AP_SUPPORT APMakeAllBssBeacon(pAd); APUpdateAllBeaconFrame(pAd); #endif /* CONFIG_AP_SUPPORT */ break; case CMD_RTPRIV_IOCTL_RXPATH_GET: /* get the number of rx path */ *(ULONG *)pData = pAd->Antenna.field.RxPath; break; case CMD_RTPRIV_IOCTL_CHAN_LIST_NUM_GET: *(ULONG *)pData = pAd->ChannelListNum; break; case CMD_RTPRIV_IOCTL_CHAN_LIST_GET: { UINT32 i; UCHAR *pChannel = (UCHAR *)pData; for (i = 1; i <= pAd->ChannelListNum; i++) { *pChannel = pAd->ChannelList[i-1].Channel; pChannel ++; } } break; case CMD_RTPRIV_IOCTL_FREQ_LIST_GET: { UINT32 i; UINT32 *pFreq = (UINT32 *)pData; UINT32 m; for (i = 1; i <= pAd->ChannelListNum; i++) { m = 2412000; MAP_CHANNEL_ID_TO_KHZ(pAd->ChannelList[i-1].Channel, m); (*pFreq) = m; pFreq ++; } } break; #ifdef EXT_BUILD_CHANNEL_LIST case CMD_RTPRIV_SET_PRECONFIG_VALUE: /* Set some preconfigured value before interface up*/ pAd->CommonCfg.DfsType = MAX_RD_REGION; break; #endif /* EXT_BUILD_CHANNEL_LIST */ #ifdef RTMP_PCI_SUPPORT case CMD_RTPRIV_IOCTL_PCI_SUSPEND: RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); break; case CMD_RTPRIV_IOCTL_PCI_RESUME: RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); break; case CMD_RTPRIV_IOCTL_PCI_CSR_SET: pAd->CSRBaseAddress = (PUCHAR)Data; DBGPRINT(RT_DEBUG_ERROR, ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n", (ULONG)pAd->CSRBaseAddress, (ULONG)Data)); break; case CMD_RTPRIV_IOCTL_PCIE_INIT: RTMPInitPCIeDevice(pData, pAd); break; #endif /* RTMP_PCI_SUPPORT */ #ifdef RT_CFG80211_SUPPORT case CMD_RTPRIV_IOCTL_CFG80211_CFG_START: RT_CFG80211_REINIT(pAd); RT_CFG80211_CRDA_REG_RULE_APPLY(pAd); break; #endif /* RT_CFG80211_SUPPORT */ #ifdef INF_PPA_SUPPORT case CMD_RTPRIV_IOCTL_INF_PPA_INIT: os_alloc_mem(NULL, (UCHAR **)&(pAd->pDirectpathCb), sizeof(PPA_DIRECTPATH_CB)); break; case CMD_RTPRIV_IOCTL_INF_PPA_EXIT: if (ppa_hook_directpath_register_dev_fn && (pAd->PPAEnable == TRUE)) { UINT status; status = ppa_hook_directpath_register_dev_fn(&pAd->g_if_id, pAd->net_dev, NULL, 0); DBGPRINT(RT_DEBUG_TRACE, ("Unregister PPA::status=%d, if_id=%d\n", status, pAd->g_if_id)); } os_free_mem(NULL, pAd->pDirectpathCb); break; #endif /* INF_PPA_SUPPORT*/ case CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP: /* interface up */ { RT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData; if (VIRTUAL_IF_NUM(pAd) == 0) { if (pInfConf->rt28xx_open(pAd->net_dev) != 0) { DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_open return fail!\n")); return NDIS_STATUS_FAILURE; } } else { #ifdef CONFIG_AP_SUPPORT extern VOID APMakeAllBssBeacon(IN PRTMP_ADAPTER pAd); extern VOID APUpdateAllBeaconFrame(IN PRTMP_ADAPTER pAd); APMakeAllBssBeacon(pAd); APUpdateAllBeaconFrame(pAd); #endif /* CONFIG_AP_SUPPORT */ } VIRTUAL_IF_INC(pAd); } break; case CMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN: /* interface down */ { RT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData; VIRTUAL_IF_DEC(pAd); if (VIRTUAL_IF_NUM(pAd) == 0) pInfConf->rt28xx_close(pAd->net_dev); } break; case CMD_RTPRIV_IOCTL_VIRTUAL_INF_GET: /* get virtual interface number */ *(ULONG *)pData = VIRTUAL_IF_NUM(pAd); break; case CMD_RTPRIV_IOCTL_INF_TYPE_GET: /* get current interface type */ *(ULONG *)pData = pAd->infType; break; case CMD_RTPRIV_IOCTL_INF_STATS_GET: /* get statistics */ { RT_CMD_STATS *pStats = (RT_CMD_STATS *)pData; pStats->pStats = pAd->stats; if(pAd->OpMode == OPMODE_STA) { pStats->rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; pStats->tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; pStats->rx_bytes = pAd->RalinkCounters.ReceivedByteCount; pStats->tx_bytes = pAd->RalinkCounters.TransmittedByteCount; pStats->rx_errors = pAd->Counters8023.RxErrors; pStats->tx_errors = pAd->Counters8023.TxErrors; pStats->multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; /* multicast packets received*/ pStats->collisions = 0; /* Collision packets*/ pStats->rx_over_errors = pAd->Counters8023.RxNoBuffer; /* receiver ring buff overflow*/ pStats->rx_crc_errors = 0;/*pAd->WlanCounters.FCSErrorCount; recved pkt with crc error*/ pStats->rx_frame_errors = 0; /* recv'd frame alignment error*/ pStats->rx_fifo_errors = pAd->Counters8023.RxNoBuffer; /* recv'r fifo overrun*/ } #ifdef CONFIG_AP_SUPPORT else if(pAd->OpMode == OPMODE_AP) { INT index; for(index = 0; index < MAX_MBSSID_NUM(pAd); index++) { if (pAd->ApCfg.MBSSID[index].wdev.if_dev == (PNET_DEV)(pStats->pNetDev)) { break; } } if(index >= MAX_MBSSID_NUM(pAd)) { //reset counters pStats->rx_packets = 0; pStats->tx_packets = 0; pStats->rx_bytes = 0; pStats->tx_bytes = 0; pStats->rx_errors = 0; pStats->tx_errors = 0; pStats->multicast = 0; /* multicast packets received*/ pStats->collisions = 0; /* Collision packets*/ pStats->rx_over_errors = 0; /* receiver ring buff overflow*/ pStats->rx_crc_errors = 0; /* recved pkt with crc error*/ pStats->rx_frame_errors = 0; /* recv'd frame alignment error*/ pStats->rx_fifo_errors = 0; /* recv'r fifo overrun*/ DBGPRINT(RT_DEBUG_ERROR, ("CMD_RTPRIV_IOCTL_INF_STATS_GET: can not find mbss I/F\n")); return NDIS_STATUS_FAILURE; } pStats->rx_packets = pAd->ApCfg.MBSSID[index].RxCount; pStats->tx_packets = pAd->ApCfg.MBSSID[index].TxCount; pStats->rx_bytes = pAd->ApCfg.MBSSID[index].ReceivedByteCount; pStats->tx_bytes = pAd->ApCfg.MBSSID[index].TransmittedByteCount; pStats->rx_errors = pAd->ApCfg.MBSSID[index].RxErrorCount; pStats->tx_errors = pAd->ApCfg.MBSSID[index].TxErrorCount; pStats->multicast = pAd->ApCfg.MBSSID[index].mcPktsRx; /* multicast packets received */ pStats->collisions = 0; /* Collision packets*/ pStats->rx_over_errors = 0; /* receiver ring buff overflow*/ pStats->rx_crc_errors = 0;/* recved pkt with crc error*/ pStats->rx_frame_errors = 0; /* recv'd frame alignment error*/ pStats->rx_fifo_errors = 0; /* recv'r fifo overrun*/ } #endif } break; case CMD_RTPRIV_IOCTL_INF_IW_STATUS_GET: /* get wireless statistics */ { UCHAR CurOpMode = OPMODE_AP; #ifdef CONFIG_AP_SUPPORT PMAC_TABLE_ENTRY pMacEntry = NULL; #endif /* CONFIG_AP_SUPPORT */ RT_CMD_IW_STATS *pStats = (RT_CMD_IW_STATS *)pData; pStats->qual = 0; pStats->level = 0; pStats->noise = 0; pStats->pStats = pAd->iw_stats; /*check if the interface is down*/ if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) return NDIS_STATUS_FAILURE; #ifdef CONFIG_AP_SUPPORT if (CurOpMode == OPMODE_AP) { #ifdef APCLI_SUPPORT if ((pStats->priv_flags == INT_APCLI) ) { INT ApCliIdx = ApCliIfLookUp(pAd, (PUCHAR)pStats->dev_addr); if ((ApCliIdx >= 0) && VALID_WCID(pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID)) pMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID]; } else #endif /* APCLI_SUPPORT */ { /* only AP client support wireless stats function. return NULL pointer for all other cases. */ pMacEntry = NULL; } } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_AP_SUPPORT if (CurOpMode == OPMODE_AP) { if (pMacEntry != NULL) pStats->qual = ((pMacEntry->ChannelQuality * 12)/10 + 10); else pStats->qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10); } #endif /* CONFIG_AP_SUPPORT */ if (pStats->qual > 100) pStats->qual = 100; #ifdef CONFIG_AP_SUPPORT if (CurOpMode == OPMODE_AP) { if (pMacEntry != NULL) pStats->level = RTMPMaxRssi(pAd, pMacEntry->RssiSample.AvgRssi0, pMacEntry->RssiSample.AvgRssi1, pMacEntry->RssiSample.AvgRssi2); } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_AP_SUPPORT pStats->noise = RTMPMaxRssi(pAd, pAd->ApCfg.RssiSample.AvgRssi0, pAd->ApCfg.RssiSample.AvgRssi1, pAd->ApCfg.RssiSample.AvgRssi2) - RTMPMinSnr(pAd, pAd->ApCfg.RssiSample.AvgSnr0, pAd->ApCfg.RssiSample.AvgSnr1); #endif /* CONFIG_AP_SUPPORT */ } break; case CMD_RTPRIV_IOCTL_INF_MAIN_CREATE: *(VOID **)pData = RtmpPhyNetDevMainCreate(pAd); break; case CMD_RTPRIV_IOCTL_INF_MAIN_ID_GET: *(ULONG *)pData = INT_MAIN; break; case CMD_RTPRIV_IOCTL_INF_MAIN_CHECK: if (Data != INT_MAIN) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_INF_P2P_CHECK: if (Data != INT_P2P) return NDIS_STATUS_FAILURE; break; #ifdef WDS_SUPPORT case CMD_RTPRIV_IOCTL_WDS_INIT: WDS_Init(pAd, pData); break; case CMD_RTPRIV_IOCTL_WDS_REMOVE: WDS_Remove(pAd); break; case CMD_RTPRIV_IOCTL_WDS_STATS_GET: if (Data == INT_WDS) { if (WDS_StatsGet(pAd, pData) != TRUE) return NDIS_STATUS_FAILURE; } else return NDIS_STATUS_FAILURE; break; #endif /* WDS_SUPPORT */ #ifdef RALINK_ATE #ifdef RALINK_QA case CMD_RTPRIV_IOCTL_ATE: RtmpDoAte(pAd, wrq, pData); break; #endif /* RALINK_QA */ #endif /* RALINK_ATE */ case CMD_RTPRIV_IOCTL_MAC_ADDR_GET: { UCHAR mac_addr[MAC_ADDR_LEN]; USHORT Addr01, Addr23, Addr45; RT28xx_EEPROM_READ16(pAd, 0x04, Addr01); RT28xx_EEPROM_READ16(pAd, 0x06, Addr23); RT28xx_EEPROM_READ16(pAd, 0x08, Addr45); mac_addr[0] = (UCHAR)(Addr01 & 0xff); mac_addr[1] = (UCHAR)(Addr01 >> 8); mac_addr[2] = (UCHAR)(Addr23 & 0xff); mac_addr[3] = (UCHAR)(Addr23 >> 8); mac_addr[4] = (UCHAR)(Addr45 & 0xff); mac_addr[5] = (UCHAR)(Addr45 >> 8); for(i=0; i<6; i++) *(UCHAR *)(pData+i) = mac_addr[i]; break; } #ifdef CONFIG_AP_SUPPORT case CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ: /* handle for SIOCGIWRATEQ */ { RT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData; HTTRANSMIT_SETTING HtPhyMode; UINT8 BW = 0, GI = 0, MCS = 0; #ifdef APCLI_SUPPORT if (pRate->priv_flags == INT_APCLI) memcpy(&HtPhyMode, &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev.HTPhyMode, sizeof(HTTRANSMIT_SETTING)); else #endif /* APCLI_SUPPORT */ #ifdef WDS_SUPPORT if (pRate->priv_flags == INT_WDS) memcpy(&HtPhyMode, &pAd->WdsTab.WdsEntry[pObj->ioctl_if].wdev.HTPhyMode, sizeof(HTTRANSMIT_SETTING)); else #endif /* WDS_SUPPORT */ { memcpy(&HtPhyMode, &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.HTPhyMode, sizeof(HTTRANSMIT_SETTING)); #ifdef MBSS_SUPPORT /* reset phy mode for MBSS */ MBSS_PHY_MODE_RESET(pObj->ioctl_if, HtPhyMode); #endif /* MBSS_SUPPORT */ } #ifdef DOT11_VHT_AC if (HtPhyMode.field.BW == BW_40 && pAd->CommonCfg.vht_bw == VHT_BW_80 && HtPhyMode.field.MODE >= MODE_VHT) { BW = 2; GI = pAd->CommonCfg.vht_sgi_80; } else #endif /* DOT11_VHT_AC */ { BW = HtPhyMode.field.BW; GI = HtPhyMode.field.ShortGI; } RtmpDrvRateGet(pAd, HtPhyMode.field.MODE, GI, BW, HtPhyMode.field.MCS, pAd->Antenna.field.TxPath, (UINT32 *)&pRate->BitRate); } break; #endif /* CONFIG_AP_SUPPORT */ case CMD_RTPRIV_IOCTL_SIOCGIWNAME: RtmpIoctl_rt_ioctl_giwname(pAd, pData, 0); break; } #ifdef RT_CFG80211_SUPPORT if ((CMD_RTPRIV_IOCTL_80211_START <= cmd) && (cmd <= CMD_RTPRIV_IOCTL_80211_END)) { Status = CFG80211DRV_IoctlHandle(pAd, wrq, cmd, subcmd, pData, Data); } #endif /* RT_CFG80211_SUPPORT */ if (cmd >= CMD_RTPRIV_IOCTL_80211_COM_LATEST_ONE) return NDIS_STATUS_FAILURE; return Status; }
INT Show_Repeater_Cli_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { INT i; UINT32 RegValue; UINT32 DataRate=0; if (!pAd->ApCfg.bMACRepeaterEn) return TRUE; printk("\n"); RTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &RegValue); printk("BackOff Slot : %s slot time, BKOFF_SLOT_CFG(0x1104) = 0x%08x\n", OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED) ? "short" : "long", RegValue); #ifdef DOT11_N_SUPPORT printk("HT Operating Mode : %d\n", pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode); printk("\n"); #endif /* DOT11_N_SUPPORT */ printk("\n%-19s%-4s%-4s%-4s%-4s%-8s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s%-7s%-7s\n", "MAC", "AID", "BSS", "PSM", "WMM", "MIMOPS", "RSSI0", "RSSI1", "RSSI2", "PhMd", "BW", "MCS", "SGI", "STBC", "Idle", "Rate"); for (i = MAX_NUMBER_OF_MAC; i < MAX_NUMBER_OF_MAC + ((MAX_EXT_MAC_ADDR_SIZE + 1) * MAX_APCLI_NUM); i++) { PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; if (pEntry && IS_ENTRY_APCLI(pEntry)&& (pEntry->Sst == SST_ASSOC) && (pEntry->bReptCli)) { DataRate=0; RtmpDrvRateGet(pAd, pEntry->HTPhyMode.field.MODE, pEntry->HTPhyMode.field.ShortGI, pEntry->HTPhyMode.field.BW,pEntry->HTPhyMode.field.MCS, newRateGetAntenna(pEntry->HTPhyMode.field.MCS, pEntry->HTPhyMode.field.MODE),&DataRate); DataRate /= 500000; DataRate /= 2; printk("%02X:%02X:%02X:%02X:%02X:%02X ", pEntry->ReptCliAddr[0], pEntry->ReptCliAddr[1], pEntry->ReptCliAddr[2], pEntry->ReptCliAddr[3], pEntry->ReptCliAddr[4], pEntry->ReptCliAddr[5]); printk("%-4d", (int)pEntry->Aid); printk("%-4d", (int)pEntry->apidx); printk("%-4d", (int)pEntry->PsMode); printk("%-4d", (int)CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)); #ifdef DOT11_N_SUPPORT printk("%-8d", (int)pEntry->MmpsMode); #endif /* DOT11_N_SUPPORT */ printk("%-7d", pEntry->RssiSample.AvgRssi0); printk("%-7d", pEntry->RssiSample.AvgRssi1); printk("%-7d", pEntry->RssiSample.AvgRssi2); printk("%-10s", get_phymode_str(pEntry->HTPhyMode.field.MODE)); printk("%-6s", get_bw_str(pEntry->HTPhyMode.field.BW)); printk("%-6d", pEntry->HTPhyMode.field.MCS); printk("%-6d", pEntry->HTPhyMode.field.ShortGI); printk("%-6d", pEntry->HTPhyMode.field.STBC); printk("%-7d", (int)(pEntry->StaIdleTimeout - pEntry->NoDataIdleCount)); printk("%-7d", (int)DataRate); printk("%-10d, %d, %d%%\n", pEntry->DebugFIFOCount, pEntry->DebugTxCount, (pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0); printk("\n"); } } return TRUE; }
INT RTMP_COM_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; POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; INT Status = NDIS_STATUS_SUCCESS, i; pObj = pObj; /* avoid compile warning */ switch(cmd) { case CMD_RTPRIV_IOCTL_NETDEV_GET: /* get main net_dev */ { VOID **ppNetDev = (VOID **)pData; *ppNetDev = (VOID *)(pAd->net_dev); } break; case CMD_RTPRIV_IOCTL_NETDEV_SET: { struct wifi_dev *wdev = NULL; /* set main net_dev */ pAd->net_dev = pData; #ifdef CONFIG_AP_SUPPORT if (pAd->OpMode == OPMODE_AP) { pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.if_dev = (void *)pData; pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.func_dev = (void *)&pAd->ApCfg.MBSSID[MAIN_MBSSID]; pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.sys_handle = (void *)pAd; RTMP_OS_NETDEV_SET_WDEV(pData, &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev); wdev = &pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev; } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT if (pAd->OpMode == OPMODE_STA) { pAd->StaCfg.wdev.if_dev = pData; pAd->StaCfg.wdev.func_dev = (void *)&pAd->StaCfg; pAd->StaCfg.wdev.sys_handle = (void *)pAd; RTMP_OS_NETDEV_SET_WDEV(pData, &pAd->StaCfg.wdev); wdev = &pAd->StaCfg.wdev; } #endif /* CONFIG_STA_SUPPORT */ if (wdev) { if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("Assign wdev idx for %s failed, free net device!\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev))); RtmpOSNetDevFree(pAd->net_dev); } } break; } case CMD_RTPRIV_IOCTL_OPMODE_GET: /* get Operation Mode */ *(ULONG *)pData = pAd->OpMode; break; case CMD_RTPRIV_IOCTL_TASK_LIST_GET: /* get all Tasks */ { RT_CMD_WAIT_QUEUE_LIST *pList = (RT_CMD_WAIT_QUEUE_LIST *)pData; pList->pMlmeTask = &pAd->mlmeTask; #ifdef RTMP_TIMER_TASK_SUPPORT pList->pTimerTask = &pAd->timerTask; #endif /* RTMP_TIMER_TASK_SUPPORT */ pList->pCmdQTask = &pAd->cmdQTask; } break; case CMD_RTPRIV_IOCTL_IRQ_RELEASE: /* release IRQ */ RTMP_OS_IRQ_RELEASE(pAd, pAd->net_dev); break; case CMD_RTPRIV_IOCTL_NIC_NOT_EXIST: /* set driver state to fRTMP_ADAPTER_NIC_NOT_EXIST */ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); break; case CMD_RTPRIV_IOCTL_MCU_SLEEP_CLEAR: RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP); break; #ifdef CONFIG_STA_SUPPORT #ifdef CONFIG_PM #ifdef USB_SUPPORT_SELECTIVE_SUSPEND case CMD_RTPRIV_IOCTL_USB_DEV_GET: /* get USB DEV */ { VOID **ppUsb_Dev = (VOID **)pData; *ppUsb_Dev = (VOID *)(pObj->pUsb_Dev); } break; case CMD_RTPRIV_IOCTL_USB_INTF_GET: /* get USB INTF */ { VOID **ppINTF = (VOID **)pData; *ppINTF = (VOID *)(pObj->intf); } break; case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_SET: /* set driver state to fRTMP_ADAPTER_SUSPEND */ RTMP_SET_FLAG(pAd,fRTMP_ADAPTER_SUSPEND); break; case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_CLEAR: /* clear driver state to fRTMP_ADAPTER_SUSPEND */ RTMP_CLEAR_FLAG(pAd,fRTMP_ADAPTER_SUSPEND); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MCU_SEND_IN_BAND_CMD); RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_MCU_SLEEP); break; case CMD_RTPRIV_IOCTL_ADAPTER_SEND_DISSASSOCIATE: /* clear driver state to fRTMP_ADAPTER_SUSPEND */ if (INFRA_ON(pAd) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) { MLME_DISASSOC_REQ_STRUCT DisReq; MLME_QUEUE_ELEM *MsgElem; os_alloc_mem(NULL, (UCHAR **)&MsgElem, sizeof(MLME_QUEUE_ELEM)); if (MsgElem) { COPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid); DisReq.Reason = REASON_DEAUTH_STA_LEAVING; MsgElem->Machine = ASSOC_STATE_MACHINE; MsgElem->MsgType = MT2_MLME_DISASSOC_REQ; MsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); NdisMoveMemory(MsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); /* Prevent to connect AP again in STAMlmePeriodicExec*/ pAd->MlmeAux.AutoReconnectSsidLen= 32; NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; MlmeDisassocReqAction(pAd, MsgElem); os_free_mem(NULL, MsgElem); } /* RtmpusecDelay(1000);*/ RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CGIWAP, -1, NULL, NULL, 0); } break; case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_TEST: /* test driver state to fRTMP_ADAPTER_SUSPEND */ *(UCHAR *)pData = RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_SUSPEND); break; case CMD_RTPRIV_IOCTL_ADAPTER_IDLE_RADIO_OFF_TEST: /* test driver state to fRTMP_ADAPTER_IDLE_RADIO_OFF */ *(UCHAR *)pData = RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_IDLE_RADIO_OFF); break; case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_OFF: ASIC_RADIO_OFF(pAd, SUSPEND_RADIO_OFF); break; case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_ON: ASIC_RADIO_ON(pAd, RESUME_RADIO_ON); break; #endif /* USB_SUPPORT_SELECTIVE_SUSPEND */ #if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_STATUS: *(UCHAR *)pData = (UCHAR)pAd->WOW_Cfg.bEnable; break; case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_ENABLE: ASIC_WOW_ENABLE(pAd); break; case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_WOW_DISABLE: ASIC_WOW_DISABLE(pAd); break; #endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */ #endif /* CONFIG_PM */ case CMD_RTPRIV_IOCTL_AP_BSSID_GET: if (pAd->StaCfg.wdev.PortSecured == WPA_802_1X_PORT_NOT_SECURED) NdisCopyMemory(pData, pAd->MlmeAux.Bssid, 6); else return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_SET: /* set driver state to fRTMP_ADAPTER_SUSPEND */ RTMP_SET_FLAG(pAd,fRTMP_ADAPTER_SUSPEND); break; case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_CLEAR: /* clear driver state to fRTMP_ADAPTER_SUSPEND */ RTMP_CLEAR_FLAG(pAd,fRTMP_ADAPTER_SUSPEND); break; case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_OFF: /* RT28xxUsbAsicRadioOff */ //RT28xxUsbAsicRadioOff(pAd); ASIC_RADIO_OFF(pAd, SUSPEND_RADIO_OFF); break; case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_ON: /* RT28xxUsbAsicRadioOn */ //RT28xxUsbAsicRadioOn(pAd); ASIC_RADIO_ON(pAd, RESUME_RADIO_ON); break; #endif /* CONFIG_STA_SUPPORT */ case CMD_RTPRIV_IOCTL_SANITY_CHECK: /* sanity check before IOCTL */ if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) #ifdef IFUP_IN_PROBE || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) #endif /* IFUP_IN_PROBE */ ) { if(pData == NULL || RT_isLegalCmdBeforeInfUp((PSTRING) pData) == FALSE) return NDIS_STATUS_FAILURE; } break; case CMD_RTPRIV_IOCTL_SIOCGIWFREQ: /* get channel number */ *(ULONG *)pData = pAd->CommonCfg.Channel; break; case CMD_RTPRIV_IOCTL_BEACON_UPDATE: /* update all beacon contents */ #ifdef CONFIG_AP_SUPPORT APMakeAllBssBeacon(pAd); APUpdateAllBeaconFrame(pAd); #endif /* CONFIG_AP_SUPPORT */ break; case CMD_RTPRIV_IOCTL_RXPATH_GET: /* get the number of rx path */ *(ULONG *)pData = pAd->Antenna.field.RxPath; break; case CMD_RTPRIV_IOCTL_CHAN_LIST_NUM_GET: *(ULONG *)pData = pAd->ChannelListNum; break; case CMD_RTPRIV_IOCTL_CHAN_LIST_GET: { UINT32 i; UCHAR *pChannel = (UCHAR *)pData; for (i = 1; i <= pAd->ChannelListNum; i++) { *pChannel = pAd->ChannelList[i-1].Channel; pChannel ++; } } break; case CMD_RTPRIV_IOCTL_FREQ_LIST_GET: { UINT32 i; UINT32 *pFreq = (UINT32 *)pData; UINT32 m; for (i = 1; i <= pAd->ChannelListNum; i++) { m = 2412000; MAP_CHANNEL_ID_TO_KHZ(pAd->ChannelList[i-1].Channel, m); (*pFreq) = m; pFreq ++; } } break; #ifdef EXT_BUILD_CHANNEL_LIST case CMD_RTPRIV_SET_PRECONFIG_VALUE: /* Set some preconfigured value before interface up*/ pAd->CommonCfg.DfsType = MAX_RD_REGION; break; #endif /* EXT_BUILD_CHANNEL_LIST */ #ifdef RTMP_USB_SUPPORT case CMD_RTPRIV_IOCTL_USB_MORE_FLAG_SET: { RT_CMD_USB_MORE_FLAG_CONFIG *pConfig; UINT32 VendorID, ProductID; pConfig = (RT_CMD_USB_MORE_FLAG_CONFIG *)pData; VendorID = pConfig->VendorID; ProductID = pConfig->ProductID; if (VendorID == 0x0DB0) { if ((ProductID == 0x871C) || (ProductID == 0x822C)) { RTMP_SET_MORE_FLAG(pAd, (fRTMP_ADAPTER_DISABLE_DOT_11N | fRTMP_ADAPTER_WSC_PBC_PIN0)); } if ((ProductID == 0x871A) || (ProductID == 0x822A)) { RTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N); } if ((ProductID == 0x871B) || (ProductID == 0x822B)) { RTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_WSC_PBC_PIN0); } } if (VendorID == 0x07D1) { if (ProductID == 0x3C0F) RTMP_SET_MORE_FLAG(pAd, fRTMP_ADAPTER_DISABLE_DOT_11N); } } break; case CMD_RTPRIV_IOCTL_USB_CONFIG_INIT: { RT_CMD_USB_DEV_CONFIG *pConfig; UINT32 i; pConfig = (RT_CMD_USB_DEV_CONFIG *)pData; pAd->NumberOfPipes = pConfig->NumberOfPipes; pAd->BulkInMaxPacketSize = pConfig->BulkInMaxPacketSize; pAd->BulkOutMaxPacketSize = pConfig->BulkOutMaxPacketSize; for (i = 0; i < 6; i++) pAd->BulkOutEpAddr[i] = pConfig->BulkOutEpAddr[i]; for (i = 0; i < 2; i++) pAd->BulkInEpAddr[i] = pConfig->BulkInEpAddr[i]; pAd->config = pConfig->pConfig; } break; case CMD_RTPRIV_IOCTL_USB_SUSPEND: pAd->PM_FlgSuspend = 1; if (Data) { RTUSBCancelPendingBulkInIRP(pAd); RTUSBCancelPendingBulkOutIRP(pAd); } break; case CMD_RTPRIV_IOCTL_USB_RESUME: pAd->PM_FlgSuspend = 0; break; case CMD_RTPRIV_IOCTL_USB_INIT: InitUSBDevice(pData, pAd); break; #endif /* RTMP_USB_SUPPORT */ #ifdef RT_CFG80211_SUPPORT case CMD_RTPRIV_IOCTL_CFG80211_CFG_START: RT_CFG80211_REINIT(pAd); RT_CFG80211_CRDA_REG_RULE_APPLY(pAd); break; #endif /* RT_CFG80211_SUPPORT */ #ifdef INF_PPA_SUPPORT case CMD_RTPRIV_IOCTL_INF_PPA_INIT: os_alloc_mem(NULL, (UCHAR **)&(pAd->pDirectpathCb), sizeof(PPA_DIRECTPATH_CB)); break; case CMD_RTPRIV_IOCTL_INF_PPA_EXIT: if (ppa_hook_directpath_register_dev_fn && (pAd->PPAEnable == TRUE)) { UINT status; status = ppa_hook_directpath_register_dev_fn(&pAd->g_if_id, pAd->net_dev, NULL, 0); DBGPRINT(RT_DEBUG_TRACE, ("Unregister PPA::status=%d, if_id=%d\n", status, pAd->g_if_id)); } os_free_mem(NULL, pAd->pDirectpathCb); break; #endif /* INF_PPA_SUPPORT*/ case CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP: /* interface up */ { RT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData; if (VIRTUAL_IF_NUM(pAd) == 0) { if (pInfConf->rt28xx_open(pAd->net_dev) != 0) { DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_open return fail!\n")); return NDIS_STATUS_FAILURE; } } else { #ifdef CONFIG_AP_SUPPORT extern VOID APMakeAllBssBeacon(IN PRTMP_ADAPTER pAd); extern VOID APUpdateAllBeaconFrame(IN PRTMP_ADAPTER pAd); APMakeAllBssBeacon(pAd); APUpdateAllBeaconFrame(pAd); #endif /* CONFIG_AP_SUPPORT */ } VIRTUAL_IF_INC(pAd); } break; case CMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN: /* interface down */ { RT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData; VIRTUAL_IF_DEC(pAd); if (VIRTUAL_IF_NUM(pAd) == 0) pInfConf->rt28xx_close(pAd->net_dev); } break; case CMD_RTPRIV_IOCTL_VIRTUAL_INF_GET: /* get virtual interface number */ *(ULONG *)pData = VIRTUAL_IF_NUM(pAd); break; case CMD_RTPRIV_IOCTL_INF_TYPE_GET: /* get current interface type */ *(ULONG *)pData = pAd->infType; break; case CMD_RTPRIV_IOCTL_INF_STATS_GET: /* get statistics */ { RT_CMD_STATS *pStats = (RT_CMD_STATS *)pData; pStats->pStats = pAd->stats; if(pAd->OpMode == OPMODE_STA) { pStats->rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; pStats->tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; pStats->rx_bytes = pAd->RalinkCounters.ReceivedByteCount; pStats->tx_bytes = pAd->RalinkCounters.TransmittedByteCount; pStats->rx_errors = pAd->Counters8023.RxErrors; pStats->tx_errors = pAd->Counters8023.TxErrors; pStats->multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; /* multicast packets received*/ pStats->collisions = 0; /* Collision packets*/ pStats->rx_over_errors = pAd->Counters8023.RxNoBuffer; /* receiver ring buff overflow*/ pStats->rx_crc_errors = 0;/*pAd->WlanCounters.FCSErrorCount; recved pkt with crc error*/ pStats->rx_frame_errors = 0; /* recv'd frame alignment error*/ pStats->rx_fifo_errors = pAd->Counters8023.RxNoBuffer; /* recv'r fifo overrun*/ } #ifdef CONFIG_AP_SUPPORT else if(pAd->OpMode == OPMODE_AP) { INT index; for(index = 0; index < MAX_MBSSID_NUM(pAd); index++) { if (pAd->ApCfg.MBSSID[index].wdev.if_dev == (PNET_DEV)(pStats->pNetDev)) { break; } } if(index >= MAX_MBSSID_NUM(pAd)) { //reset counters pStats->rx_packets = 0; pStats->tx_packets = 0; pStats->rx_bytes = 0; pStats->tx_bytes = 0; pStats->rx_errors = 0; pStats->tx_errors = 0; pStats->multicast = 0; /* multicast packets received*/ pStats->collisions = 0; /* Collision packets*/ pStats->rx_over_errors = 0; /* receiver ring buff overflow*/ pStats->rx_crc_errors = 0; /* recved pkt with crc error*/ pStats->rx_frame_errors = 0; /* recv'd frame alignment error*/ pStats->rx_fifo_errors = 0; /* recv'r fifo overrun*/ DBGPRINT(RT_DEBUG_ERROR, ("CMD_RTPRIV_IOCTL_INF_STATS_GET: can not find mbss I/F\n")); return NDIS_STATUS_FAILURE; } pStats->rx_packets = pAd->ApCfg.MBSSID[index].RxCount; pStats->tx_packets = pAd->ApCfg.MBSSID[index].TxCount; pStats->rx_bytes = pAd->ApCfg.MBSSID[index].ReceivedByteCount; pStats->tx_bytes = pAd->ApCfg.MBSSID[index].TransmittedByteCount; pStats->rx_errors = pAd->ApCfg.MBSSID[index].RxErrorCount; pStats->tx_errors = pAd->ApCfg.MBSSID[index].TxErrorCount; pStats->multicast = pAd->ApCfg.MBSSID[index].mcPktsRx; /* multicast packets received */ pStats->collisions = 0; /* Collision packets*/ pStats->rx_over_errors = 0; /* receiver ring buff overflow*/ pStats->rx_crc_errors = 0;/* recved pkt with crc error*/ pStats->rx_frame_errors = 0; /* recv'd frame alignment error*/ pStats->rx_fifo_errors = 0; /* recv'r fifo overrun*/ } #endif } break; case CMD_RTPRIV_IOCTL_INF_IW_STATUS_GET: /* get wireless statistics */ { UCHAR CurOpMode = OPMODE_AP; #ifdef CONFIG_AP_SUPPORT PMAC_TABLE_ENTRY pMacEntry = NULL; #endif /* CONFIG_AP_SUPPORT */ RT_CMD_IW_STATS *pStats = (RT_CMD_IW_STATS *)pData; pStats->qual = 0; pStats->level = 0; pStats->noise = 0; pStats->pStats = pAd->iw_stats; #ifdef CONFIG_STA_SUPPORT if (pAd->OpMode == OPMODE_STA) { CurOpMode = OPMODE_STA; } #endif /* CONFIG_STA_SUPPORT */ /*check if the interface is down*/ if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) return NDIS_STATUS_FAILURE; #ifdef CONFIG_AP_SUPPORT if (CurOpMode == OPMODE_AP) { #ifdef APCLI_SUPPORT if ((pStats->priv_flags == INT_APCLI) ) { INT ApCliIdx = ApCliIfLookUp(pAd, (PUCHAR)pStats->dev_addr); if ((ApCliIdx >= 0) && VALID_WCID(pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID)) pMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID]; } else #endif /* APCLI_SUPPORT */ { /* only AP client support wireless stats function. return NULL pointer for all other cases. */ pMacEntry = NULL; } } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT if (CurOpMode == OPMODE_STA) pStats->qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10); #endif /* CONFIG_STA_SUPPORT */ #ifdef CONFIG_AP_SUPPORT if (CurOpMode == OPMODE_AP) { if (pMacEntry != NULL) pStats->qual = ((pMacEntry->ChannelQuality * 12)/10 + 10); else pStats->qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10); } #endif /* CONFIG_AP_SUPPORT */ if (pStats->qual > 100) pStats->qual = 100; #ifdef CONFIG_STA_SUPPORT if (CurOpMode == OPMODE_STA) { pStats->level = RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0, pAd->StaCfg.RssiSample.AvgRssi1, pAd->StaCfg.RssiSample.AvgRssi2); } #endif /* CONFIG_STA_SUPPORT */ #ifdef CONFIG_AP_SUPPORT if (CurOpMode == OPMODE_AP) { if (pMacEntry != NULL) pStats->level = RTMPMaxRssi(pAd, pMacEntry->RssiSample.AvgRssi0, pMacEntry->RssiSample.AvgRssi1, pMacEntry->RssiSample.AvgRssi2); } #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_AP_SUPPORT pStats->noise = RTMPMaxRssi(pAd, pAd->ApCfg.RssiSample.AvgRssi0, pAd->ApCfg.RssiSample.AvgRssi1, pAd->ApCfg.RssiSample.AvgRssi2) - RTMPMinSnr(pAd, pAd->ApCfg.RssiSample.AvgSnr0, pAd->ApCfg.RssiSample.AvgSnr1); #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT pStats->noise = RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0, pAd->StaCfg.RssiSample.AvgRssi1, pAd->StaCfg.RssiSample.AvgRssi2) - RTMPMinSnr(pAd, pAd->StaCfg.RssiSample.AvgSnr0, pAd->StaCfg.RssiSample.AvgSnr1); #endif /* CONFIG_STA_SUPPORT */ } break; case CMD_RTPRIV_IOCTL_INF_MAIN_CREATE: *(VOID **)pData = RtmpPhyNetDevMainCreate(pAd); break; case CMD_RTPRIV_IOCTL_INF_MAIN_ID_GET: *(ULONG *)pData = INT_MAIN; break; case CMD_RTPRIV_IOCTL_INF_MAIN_CHECK: if (Data != INT_MAIN) return NDIS_STATUS_FAILURE; break; case CMD_RTPRIV_IOCTL_INF_P2P_CHECK: if (Data != INT_P2P) return NDIS_STATUS_FAILURE; break; #ifdef RALINK_ATE #endif /* RALINK_ATE */ case CMD_RTPRIV_IOCTL_MAC_ADDR_GET: { UCHAR mac_addr[MAC_ADDR_LEN]; USHORT Addr01, Addr23, Addr45; RT28xx_EEPROM_READ16(pAd, 0x04, Addr01); RT28xx_EEPROM_READ16(pAd, 0x06, Addr23); RT28xx_EEPROM_READ16(pAd, 0x08, Addr45); mac_addr[0] = (UCHAR)(Addr01 & 0xff); mac_addr[1] = (UCHAR)(Addr01 >> 8); mac_addr[2] = (UCHAR)(Addr23 & 0xff); mac_addr[3] = (UCHAR)(Addr23 >> 8); mac_addr[4] = (UCHAR)(Addr45 & 0xff); mac_addr[5] = (UCHAR)(Addr45 >> 8); for(i=0; i<6; i++) *(UCHAR *)(pData+i) = mac_addr[i]; break; } #ifdef CONFIG_AP_SUPPORT case CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ: /* handle for SIOCGIWRATEQ */ { RT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData; HTTRANSMIT_SETTING HtPhyMode; UINT8 BW = 0, GI = 0, MCS = 0; #ifdef APCLI_SUPPORT if (pRate->priv_flags == INT_APCLI) memcpy(&HtPhyMode, &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev.HTPhyMode, sizeof(HTTRANSMIT_SETTING)); else #endif /* APCLI_SUPPORT */ { memcpy(&HtPhyMode, &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.HTPhyMode, sizeof(HTTRANSMIT_SETTING)); #ifdef MBSS_SUPPORT /* reset phy mode for MBSS */ MBSS_PHY_MODE_RESET(pObj->ioctl_if, HtPhyMode); #endif /* MBSS_SUPPORT */ } #ifdef DOT11_VHT_AC if (HtPhyMode.field.BW == BW_40 && pAd->CommonCfg.vht_bw == VHT_BW_80 && HtPhyMode.field.MODE >= MODE_VHT) { BW = 2; GI = pAd->CommonCfg.vht_sgi_80; } else #endif /* DOT11_VHT_AC */ { BW = HtPhyMode.field.BW; GI = HtPhyMode.field.ShortGI; } RtmpDrvRateGet(pAd, HtPhyMode.field.MODE, GI, BW, HtPhyMode.field.MCS, pAd->Antenna.field.TxPath, (UINT32 *)&pRate->BitRate); } break; #endif /* CONFIG_AP_SUPPORT */ case CMD_RTPRIV_IOCTL_SIOCGIWNAME: RtmpIoctl_rt_ioctl_giwname(pAd, pData, 0); break; } #ifdef RT_CFG80211_SUPPORT if ((CMD_RTPRIV_IOCTL_80211_START <= cmd) && (cmd <= CMD_RTPRIV_IOCTL_80211_END)) { Status = CFG80211DRV_IoctlHandle(pAd, wrq, cmd, subcmd, pData, Data); } #endif /* RT_CFG80211_SUPPORT */ if (cmd >= CMD_RTPRIV_IOCTL_80211_COM_LATEST_ONE) return NDIS_STATUS_FAILURE; return Status; }