extractedLnx/linux-2.6.30/drivers/staging/rt2860/sta_ioctl.c_RTMPQueryInformation.c
INT RTMPQueryInformation(
IN PRTMP_ADAPTER pAdapter,
IN OUT struct ifreq *rq,
IN INT cmd)
{
struct iwreq *wrq = (struct iwreq *) rq;
NDIS_802_11_BSSID_LIST_EX *pBssidList = NULL;
PNDIS_WLAN_BSSID_EX pBss;
NDIS_802_11_SSID Ssid;
NDIS_802_11_CONFIGURATION *pConfiguration = NULL;
RT_802_11_LINK_STATUS *pLinkStatus = NULL;
RT_802_11_STA_CONFIG *pStaConfig = NULL;
NDIS_802_11_STATISTICS *pStatistics = NULL;
NDIS_802_11_RTS_THRESHOLD RtsThresh;
NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;
NDIS_802_11_POWER_MODE PowerMode;
NDIS_802_11_NETWORK_INFRASTRUCTURE BssType;
RT_802_11_PREAMBLE PreamType;
NDIS_802_11_AUTHENTICATION_MODE AuthMode;
NDIS_802_11_WEP_STATUS WepStatus;
NDIS_MEDIA_STATE MediaState;
ULONG BssBufSize, ulInfo=0, NetworkTypeList[4], apsd = 0;
USHORT BssLen = 0;
PUCHAR pBuf = NULL, pPtr;
INT Status = NDIS_STATUS_SUCCESS;
UINT we_version_compiled;
UCHAR i, Padding = 0;
BOOLEAN RadioState;
UCHAR driverVersion[8];
OID_SET_HT_PHYMODE *pHTPhyMode = NULL;
#ifdef SNMP_SUPPORT
//for snmp, kathy
DefaultKeyIdxValue *pKeyIdxValue;
INT valueLen;
TX_RTY_CFG_STRUC tx_rty_cfg;
ULONG ShortRetryLimit, LongRetryLimit;
UCHAR tmp[64];
#endif //SNMP
switch(cmd)
{
case RT_OID_DEVICE_NAME:
wrq->u.data.length = sizeof(STA_NIC_DEVICE_NAME);
Status = copy_to_user(wrq->u.data.pointer, STA_NIC_DEVICE_NAME, wrq->u.data.length);
break;
case RT_OID_VERSION_INFO:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_VERSION_INFO \n"));
wrq->u.data.length = 8*sizeof(UCHAR);
sprintf(&driverVersion[0], "%s", STA_DRIVER_VERSION);
driverVersion[7] = '\0';
if (copy_to_user(wrq->u.data.pointer, &driverVersion, wrq->u.data.length))
{
Status = -EFAULT;
}
break;
#ifdef RALINK_ATE
case RT_QUERY_ATE_TXDONE_COUNT:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_QUERY_ATE_TXDONE_COUNT \n"));
wrq->u.data.length = sizeof(UINT32);
if (copy_to_user(wrq->u.data.pointer, &pAdapter->ate.TxDoneCount, wrq->u.data.length))
{
Status = -EFAULT;
}
break;
#endif // RALINK_ATE //
case OID_802_11_BSSID_LIST:
if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
{
/*
* Still scanning, indicate the caller should try again.
*/
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (Still scanning)\n"));
return -EAGAIN;
}
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAdapter->ScanTab.BssNr));
pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
// Claculate total buffer size required
BssBufSize = sizeof(ULONG);
for (i = 0; i < pAdapter->ScanTab.BssNr; i++)
{
// Align pointer to 4 bytes boundary.
//Padding = 4 - (pAdapter->ScanTab.BssEntry[i].VarIELen & 0x0003);
//if (Padding == 4)
// Padding = 0;
BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->ScanTab.BssEntry[i].VarIELen + Padding);
}
// For safety issue, we add 256 bytes just in case
BssBufSize += 256;
// Allocate the same size as passed from higher layer
pBuf = kmalloc(BssBufSize, MEM_ALLOC_FLAG);
if(pBuf == NULL)
{
Status = -ENOMEM;
break;
}
// Init 802_11_BSSID_LIST_EX structure
NdisZeroMemory(pBuf, BssBufSize);
pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;
pBssidList->NumberOfItems = pAdapter->ScanTab.BssNr;
// Calculate total buffer length
BssLen = 4; // Consist of NumberOfItems
// Point to start of NDIS_WLAN_BSSID_EX
// pPtr = pBuf + sizeof(ULONG);
pPtr = (PUCHAR) &pBssidList->Bssid[0];
for (i = 0; i < pAdapter->ScanTab.BssNr; i++)
{
pBss = (PNDIS_WLAN_BSSID_EX) pPtr;
NdisMoveMemory(&pBss->MacAddress, &pAdapter->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);
if ((pAdapter->ScanTab.BssEntry[i].Hidden == 1) && (pAdapter->StaCfg.bShowHiddenSSID == FALSE))
{
//
// We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation
// and then failed to send EAPOl farame.
//
if ((pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAdapter->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED))
{
pBss->Ssid.SsidLength = pAdapter->ScanTab.BssEntry[i].SsidLen;
NdisMoveMemory(pBss->Ssid.Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
}
else
pBss->Ssid.SsidLength = 0;
}
else
{
pBss->Ssid.SsidLength = pAdapter->ScanTab.BssEntry[i].SsidLen;
NdisMoveMemory(pBss->Ssid.Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
}
pBss->Privacy = pAdapter->ScanTab.BssEntry[i].Privacy;
pBss->Rssi = pAdapter->ScanTab.BssEntry[i].Rssi - pAdapter->BbpRssiToDbmDelta;
pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAdapter->ScanTab.BssEntry[i]);
pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);
pBss->Configuration.BeaconPeriod = pAdapter->ScanTab.BssEntry[i].BeaconPeriod;
pBss->Configuration.ATIMWindow = pAdapter->ScanTab.BssEntry[i].AtimWin;
MAP_CHANNEL_ID_TO_KHZ(pAdapter->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);
if (pAdapter->ScanTab.BssEntry[i].BssType == BSS_INFRA)
pBss->InfrastructureMode = Ndis802_11Infrastructure;
else
pBss->InfrastructureMode = Ndis802_11IBSS;
NdisMoveMemory(pBss->SupportedRates, pAdapter->ScanTab.BssEntry[i].SupRate, pAdapter->ScanTab.BssEntry[i].SupRateLen);
NdisMoveMemory(pBss->SupportedRates + pAdapter->ScanTab.BssEntry[i].SupRateLen,
pAdapter->ScanTab.BssEntry[i].ExtRate,
pAdapter->ScanTab.BssEntry[i].ExtRateLen);
if (pAdapter->ScanTab.BssEntry[i].VarIELen == 0)
{
pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);
NdisMoveMemory(pBss->IEs, &pAdapter->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
}
else
{
pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->ScanTab.BssEntry[i].VarIELen);
pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
NdisMoveMemory(pBss->IEs, &pAdapter->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAdapter->ScanTab.BssEntry[i].VarIEs, pAdapter->ScanTab.BssEntry[i].VarIELen);
pPtr += pAdapter->ScanTab.BssEntry[i].VarIELen;
}
pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->ScanTab.BssEntry[i].VarIELen + Padding);
#if WIRELESS_EXT < 17
if ((BssLen + pBss->Length) < wrq->u.data.length)
BssLen += pBss->Length;
else
{
pBssidList->NumberOfItems = i;
break;
}
#else
BssLen += pBss->Length;
#endif
}
#if WIRELESS_EXT < 17
wrq->u.data.length = BssLen;
#else
if (BssLen > wrq->u.data.length)
{
kfree(pBssidList);
return -E2BIG;
}
else
wrq->u.data.length = BssLen;
#endif
Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen);
kfree(pBssidList);
break;
case OID_802_3_CURRENT_ADDRESS:
wrq->u.data.length = MAC_ADDR_LEN;
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CurrentAddress, wrq->u.data.length);
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
if (pAdapter->IndicateMediaState == NdisMediaStateConnected)
MediaState = NdisMediaStateConnected;
else
MediaState = NdisMediaStateDisconnected;
wrq->u.data.length = sizeof(NDIS_MEDIA_STATE);
Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);
break;
case OID_802_11_BSSID:
#ifdef RALINK_ATE
if (ATE_ON(pAdapter))
{
DBGPRINT(RT_DEBUG_TRACE, ("The driver is in ATE mode now\n"));
Status = NDIS_STATUS_RESOURCES;
break;
}
#endif // RALINK_ATE //
if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter))
{
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.Bssid, sizeof(NDIS_802_11_MAC_ADDRESS));
}
else
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID(=EMPTY)\n"));
Status = -ENOTCONN;
}
break;
case OID_802_11_SSID:
NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
NdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);
Ssid.SsidLength = pAdapter->CommonCfg.SsidLen;
memcpy(Ssid.Ssid, pAdapter->CommonCfg.Ssid, Ssid.SsidLength);
wrq->u.data.length = sizeof(NDIS_802_11_SSID);
Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SSID (Len=%d, ssid=%s)\n", Ssid.SsidLength,Ssid.Ssid));
break;
case RT_OID_802_11_QUERY_LINK_STATUS:
pLinkStatus = (RT_802_11_LINK_STATUS *) kmalloc(sizeof(RT_802_11_LINK_STATUS), MEM_ALLOC_FLAG);
if (pLinkStatus)
{
pLinkStatus->CurrTxRate = RateIdTo500Kbps[pAdapter->CommonCfg.TxRate]; // unit : 500 kbps
pLinkStatus->ChannelQuality = pAdapter->Mlme.ChannelQuality;
pLinkStatus->RxByteCount = pAdapter->RalinkCounters.ReceivedByteCount;
pLinkStatus->TxByteCount = pAdapter->RalinkCounters.TransmittedByteCount;
pLinkStatus->CentralChannel = pAdapter->CommonCfg.CentralChannel;
wrq->u.data.length = sizeof(RT_802_11_LINK_STATUS);
Status = copy_to_user(wrq->u.data.pointer, pLinkStatus, wrq->u.data.length);
kfree(pLinkStatus);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS\n"));
}
else
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS(kmalloc failed)\n"));
Status = -EFAULT;
}
break;
case OID_802_11_CONFIGURATION:
pConfiguration = (NDIS_802_11_CONFIGURATION *) kmalloc(sizeof(NDIS_802_11_CONFIGURATION), MEM_ALLOC_FLAG);
if (pConfiguration)
{
pConfiguration->Length = sizeof(NDIS_802_11_CONFIGURATION);
pConfiguration->BeaconPeriod = pAdapter->CommonCfg.BeaconPeriod;
pConfiguration->ATIMWindow = pAdapter->StaActive.AtimWin;
MAP_CHANNEL_ID_TO_KHZ(pAdapter->CommonCfg.Channel, pConfiguration->DSConfig);
wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION);
Status = copy_to_user(wrq->u.data.pointer, pConfiguration, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(BeaconPeriod=%ld,AtimW=%ld,Channel=%d) \n",
pConfiguration->BeaconPeriod, pConfiguration->ATIMWindow, pAdapter->CommonCfg.Channel));
kfree(pConfiguration);
}
else
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(kmalloc failed)\n"));
Status = -EFAULT;
}
break;
case RT_OID_802_11_SNR_0:
if ((pAdapter->StaCfg.LastSNR0 > 0))
{
ulInfo = ((0xeb - pAdapter->StaCfg.LastSNR0) * 3) / 16 ;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_SNR_0(0x=%lx)\n", ulInfo));
}
else
Status = -EFAULT;
break;
case RT_OID_802_11_SNR_1:
if ((pAdapter->Antenna.field.RxPath > 1) &&
(pAdapter->StaCfg.LastSNR1 > 0))
{
ulInfo = ((0xeb - pAdapter->StaCfg.LastSNR1) * 3) / 16 ;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(0x=%lx)\n",ulInfo));
}
else
Status = -EFAULT;
DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(pAdapter->StaCfg.LastSNR1=%d)\n",pAdapter->StaCfg.LastSNR1));
break;
case OID_802_11_RSSI_TRIGGER:
ulInfo = pAdapter->StaCfg.RssiSample.LastRssi0 - pAdapter->BbpRssiToDbmDelta;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RSSI_TRIGGER(=%ld)\n", ulInfo));
break;
case OID_802_11_RSSI:
case RT_OID_802_11_RSSI:
ulInfo = pAdapter->StaCfg.RssiSample.LastRssi0;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case RT_OID_802_11_RSSI_1:
ulInfo = pAdapter->StaCfg.RssiSample.LastRssi1;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case RT_OID_802_11_RSSI_2:
ulInfo = pAdapter->StaCfg.RssiSample.LastRssi2;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case OID_802_11_STATISTICS:
pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG);
if (pStatistics)
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS \n"));
// add the most up-to-date h/w raw counters into software counters
NICUpdateRawCounters(pAdapter);
// Sanity check for calculation of sucessful count
if (pAdapter->WlanCounters.TransmittedFragmentCount.QuadPart < pAdapter->WlanCounters.RetryCount.QuadPart)
pAdapter->WlanCounters.TransmittedFragmentCount.QuadPart = pAdapter->WlanCounters.RetryCount.QuadPart;
pStatistics->TransmittedFragmentCount.QuadPart = pAdapter->WlanCounters.TransmittedFragmentCount.QuadPart;
pStatistics->MulticastTransmittedFrameCount.QuadPart = pAdapter->WlanCounters.MulticastTransmittedFrameCount.QuadPart;
pStatistics->FailedCount.QuadPart = pAdapter->WlanCounters.FailedCount.QuadPart;
pStatistics->RetryCount.QuadPart = pAdapter->WlanCounters.RetryCount.QuadPart;
pStatistics->MultipleRetryCount.QuadPart = pAdapter->WlanCounters.MultipleRetryCount.QuadPart;
pStatistics->RTSSuccessCount.QuadPart = pAdapter->WlanCounters.RTSSuccessCount.QuadPart;
pStatistics->RTSFailureCount.QuadPart = pAdapter->WlanCounters.RTSFailureCount.QuadPart;
pStatistics->ACKFailureCount.QuadPart = pAdapter->WlanCounters.ACKFailureCount.QuadPart;
pStatistics->FrameDuplicateCount.QuadPart = pAdapter->WlanCounters.FrameDuplicateCount.QuadPart;
pStatistics->ReceivedFragmentCount.QuadPart = pAdapter->WlanCounters.ReceivedFragmentCount.QuadPart;
pStatistics->MulticastReceivedFrameCount.QuadPart = pAdapter->WlanCounters.MulticastReceivedFrameCount.QuadPart;
#ifdef DBG
pStatistics->FCSErrorCount = pAdapter->RalinkCounters.RealFcsErrCount;
#else
pStatistics->FCSErrorCount.QuadPart = pAdapter->WlanCounters.FCSErrorCount.QuadPart;
pStatistics->FrameDuplicateCount.u.LowPart = pAdapter->WlanCounters.FrameDuplicateCount.u.LowPart / 100;
#endif
wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);
Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length);
kfree(pStatistics);
}
else
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS(kmalloc failed)\n"));
Status = -EFAULT;
}
break;
case OID_GEN_RCV_OK:
ulInfo = pAdapter->Counters8023.GoodReceives;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case OID_GEN_RCV_NO_BUFFER:
ulInfo = pAdapter->Counters8023.RxNoBuffer;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case RT_OID_802_11_PHY_MODE:
ulInfo = (ULONG)pAdapter->CommonCfg.PhyMode;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PHY_MODE (=%ld)\n", ulInfo));
break;
case RT_OID_802_11_STA_CONFIG:
pStaConfig = (RT_802_11_STA_CONFIG *) kmalloc(sizeof(RT_802_11_STA_CONFIG), MEM_ALLOC_FLAG);
if (pStaConfig)
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG\n"));
pStaConfig->EnableTxBurst = pAdapter->CommonCfg.bEnableTxBurst;
pStaConfig->EnableTurboRate = 0;
pStaConfig->UseBGProtection = pAdapter->CommonCfg.UseBGProtection;
pStaConfig->UseShortSlotTime = pAdapter->CommonCfg.bUseShortSlotTime;
//pStaConfig->AdhocMode = pAdapter->StaCfg.AdhocMode;
pStaConfig->HwRadioStatus = (pAdapter->StaCfg.bHwRadio == TRUE) ? 1 : 0;
pStaConfig->Rsv1 = 0;
pStaConfig->SystemErrorBitmap = pAdapter->SystemErrorBitmap;
wrq->u.data.length = sizeof(RT_802_11_STA_CONFIG);
Status = copy_to_user(wrq->u.data.pointer, pStaConfig, wrq->u.data.length);
kfree(pStaConfig);
}
else
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
Status = -EFAULT;
}
break;
case OID_802_11_RTS_THRESHOLD:
RtsThresh = pAdapter->CommonCfg.RtsThreshold;
wrq->u.data.length = sizeof(RtsThresh);
Status = copy_to_user(wrq->u.data.pointer, &RtsThresh, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RTS_THRESHOLD(=%ld)\n", RtsThresh));
break;
case OID_802_11_FRAGMENTATION_THRESHOLD:
FragThresh = pAdapter->CommonCfg.FragmentThreshold;
if (pAdapter->CommonCfg.bUseZeroToDisableFragment == TRUE)
FragThresh = 0;
wrq->u.data.length = sizeof(FragThresh);
Status = copy_to_user(wrq->u.data.pointer, &FragThresh, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_FRAGMENTATION_THRESHOLD(=%ld)\n", FragThresh));
break;
case OID_802_11_POWER_MODE:
PowerMode = pAdapter->StaCfg.WindowsPowerMode;
wrq->u.data.length = sizeof(PowerMode);
Status = copy_to_user(wrq->u.data.pointer, &PowerMode, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_POWER_MODE(=%d)\n", PowerMode));
break;
case RT_OID_802_11_RADIO:
RadioState = (BOOLEAN) pAdapter->StaCfg.bSwRadio;
wrq->u.data.length = sizeof(RadioState);
Status = copy_to_user(wrq->u.data.pointer, &RadioState, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_RADIO (=%d)\n", RadioState));
break;
case OID_802_11_INFRASTRUCTURE_MODE:
if (pAdapter->StaCfg.BssType == BSS_ADHOC)
BssType = Ndis802_11IBSS;
else if (pAdapter->StaCfg.BssType == BSS_INFRA)
BssType = Ndis802_11Infrastructure;
else if (pAdapter->StaCfg.BssType == BSS_MONITOR)
BssType = Ndis802_11Monitor;
else
BssType = Ndis802_11AutoUnknown;
wrq->u.data.length = sizeof(BssType);
Status = copy_to_user(wrq->u.data.pointer, &BssType, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_INFRASTRUCTURE_MODE(=%d)\n", BssType));
break;
case RT_OID_802_11_PREAMBLE:
PreamType = pAdapter->CommonCfg.TxPreamble;
wrq->u.data.length = sizeof(PreamType);
Status = copy_to_user(wrq->u.data.pointer, &PreamType, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PREAMBLE(=%d)\n", PreamType));
break;
case OID_802_11_AUTHENTICATION_MODE:
AuthMode = pAdapter->StaCfg.AuthMode;
wrq->u.data.length = sizeof(AuthMode);
Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_AUTHENTICATION_MODE(=%d)\n", AuthMode));
break;
case OID_802_11_WEP_STATUS:
WepStatus = pAdapter->StaCfg.WepStatus;
wrq->u.data.length = sizeof(WepStatus);
Status = copy_to_user(wrq->u.data.pointer, &WepStatus, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEP_STATUS(=%d)\n", WepStatus));
break;
case OID_802_11_TX_POWER_LEVEL:
wrq->u.data.length = sizeof(ULONG);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.TxPower, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_TX_POWER_LEVEL %x\n",pAdapter->CommonCfg.TxPower));
break;
case RT_OID_802_11_TX_POWER_LEVEL_1:
wrq->u.data.length = sizeof(ULONG);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.TxPowerPercentage, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAdapter->CommonCfg.TxPowerPercentage));
break;
case OID_802_11_NETWORK_TYPES_SUPPORTED:
if ((pAdapter->RfIcType == RFIC_2850) || (pAdapter->RfIcType == RFIC_2750))
{
NetworkTypeList[0] = 3; // NumberOfItems = 3
NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b
NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g
NetworkTypeList[3] = Ndis802_11OFDM5; // NetworkType[3] = 11a
wrq->u.data.length = 16;
Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);
}
else
{
NetworkTypeList[0] = 2; // NumberOfItems = 2
NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b
NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g
wrq->u.data.length = 12;
Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);
}
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_NETWORK_TYPES_SUPPORTED\n"));
break;
case OID_802_11_NETWORK_TYPE_IN_USE:
wrq->u.data.length = sizeof(ULONG);
if (pAdapter->CommonCfg.PhyMode == PHY_11A)
ulInfo = Ndis802_11OFDM5;
else if ((pAdapter->CommonCfg.PhyMode == PHY_11BG_MIXED) || (pAdapter->CommonCfg.PhyMode == PHY_11G))
ulInfo = Ndis802_11OFDM24;
else
ulInfo = Ndis802_11DS;
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case RT_OID_802_11_QUERY_LAST_RX_RATE:
ulInfo = (ULONG)pAdapter->LastRxRate;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\n", ulInfo));
break;
case RT_OID_802_11_QUERY_LAST_TX_RATE:
//ulInfo = (ULONG)pAdapter->LastTxRate;
ulInfo = (ULONG)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.word;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%lx)\n", ulInfo));
break;
case RT_OID_802_11_QUERY_EEPROM_VERSION:
wrq->u.data.length = sizeof(ULONG);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->EepromVersion, wrq->u.data.length);
break;
case RT_OID_802_11_QUERY_FIRMWARE_VERSION:
wrq->u.data.length = sizeof(ULONG);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->FirmwareVersion, wrq->u.data.length);
break;
case RT_OID_802_11_QUERY_NOISE_LEVEL:
wrq->u.data.length = sizeof(UCHAR);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->BbpWriteLatch[66], wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_NOISE_LEVEL (=%d)\n", pAdapter->BbpWriteLatch[66]));
break;
case RT_OID_802_11_EXTRA_INFO:
wrq->u.data.length = sizeof(ULONG);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->ExtraInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_EXTRA_INFO (=%ld)\n", pAdapter->ExtraInfo));
break;
case RT_OID_WE_VERSION_COMPILED:
wrq->u.data.length = sizeof(UINT);
we_version_compiled = WIRELESS_EXT;
Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length);
break;
case RT_OID_802_11_QUERY_APSD_SETTING:
apsd = (pAdapter->CommonCfg.bAPSDCapable | (pAdapter->CommonCfg.bAPSDAC_BE << 1) | (pAdapter->CommonCfg.bAPSDAC_BK << 2)
| (pAdapter->CommonCfg.bAPSDAC_VI << 3) | (pAdapter->CommonCfg.bAPSDAC_VO << 4) | (pAdapter->CommonCfg.MaxSPLength << 5));
wrq->u.data.length = sizeof(ULONG);
Status = copy_to_user(wrq->u.data.pointer, &apsd, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_SETTING (=0x%lx,APSDCap=%d,AC_BE=%d,AC_BK=%d,AC_VI=%d,AC_VO=%d,MAXSPLen=%d)\n",
apsd,pAdapter->CommonCfg.bAPSDCapable,pAdapter->CommonCfg.bAPSDAC_BE,pAdapter->CommonCfg.bAPSDAC_BK,pAdapter->CommonCfg.bAPSDAC_VI,pAdapter->CommonCfg.bAPSDAC_VO,pAdapter->CommonCfg.MaxSPLength));
break;
case RT_OID_802_11_QUERY_APSD_PSM:
wrq->u.data.length = sizeof(ULONG);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.bAPSDForcePowerSave, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_PSM (=%d)\n", pAdapter->CommonCfg.bAPSDForcePowerSave));
break;
case RT_OID_802_11_QUERY_WMM:
wrq->u.data.length = sizeof(BOOLEAN);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.bWmmCapable, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_WMM (=%d)\n", pAdapter->CommonCfg.bWmmCapable));
break;
#ifdef WPA_SUPPLICANT_SUPPORT
case RT_OID_NEW_DRIVER:
{
UCHAR enabled = 1;
wrq->u.data.length = sizeof(UCHAR);
Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_NEW_DRIVER (=%d)\n", enabled));
}
break;
case RT_OID_WPA_SUPPLICANT_SUPPORT:
wrq->u.data.length = sizeof(UCHAR);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->StaCfg.WpaSupplicantUP, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAdapter->StaCfg.WpaSupplicantUP));
break;
#endif // WPA_SUPPLICANT_SUPPORT //
case RT_OID_DRIVER_DEVICE_NAME:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_DRIVER_DEVICE_NAME \n"));
wrq->u.data.length = 16;
if (copy_to_user(wrq->u.data.pointer, pAdapter->StaCfg.dev_name, wrq->u.data.length))
{
Status = -EFAULT;
}
break;
case RT_OID_802_11_QUERY_HT_PHYMODE:
pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG);
if (pHTPhyMode)
{
pHTPhyMode->PhyMode = pAdapter->CommonCfg.PhyMode;
pHTPhyMode->HtMode = (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE;
pHTPhyMode->BW = (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW;
pHTPhyMode->MCS= (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS;
pHTPhyMode->SHORTGI= (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI;
pHTPhyMode->STBC= (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC;
pHTPhyMode->ExtOffset = ((pAdapter->CommonCfg.CentralChannel < pAdapter->CommonCfg.Channel) ? (EXTCHA_BELOW) : (EXTCHA_ABOVE));
wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);
if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))
{
Status = -EFAULT;
}
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n",
pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));
DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.word));
}
else
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
Status = -EFAULT;
}
break;
case RT_OID_802_11_COUNTRY_REGION:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_COUNTRY_REGION \n"));
wrq->u.data.length = sizeof(ulInfo);
ulInfo = pAdapter->CommonCfg.CountryRegionForABand;
ulInfo = (ulInfo << 8)|(pAdapter->CommonCfg.CountryRegion);
if (copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length))
{
Status = -EFAULT;
}
break;
case RT_OID_802_11_QUERY_DAT_HT_PHYMODE:
pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG);
if (pHTPhyMode)
{
pHTPhyMode->PhyMode = pAdapter->CommonCfg.PhyMode;
pHTPhyMode->HtMode = (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.HTMODE;
pHTPhyMode->BW = (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.BW;
pHTPhyMode->MCS= (UCHAR)pAdapter->StaCfg.DesiredTransmitSetting.field.MCS;
pHTPhyMode->SHORTGI= (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.ShortGI;
pHTPhyMode->STBC= (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.STBC;
wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);
if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))
{
Status = -EFAULT;
}
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n",
pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));
DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.word));
}
else
{
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
Status = -EFAULT;
}
break;
case RT_OID_QUERY_MULTIPLE_CARD_SUPPORT:
wrq->u.data.length = sizeof(UCHAR);
i = 0;
#ifdef MULTIPLE_CARD_SUPPORT
i = 1;
#endif // MULTIPLE_CARD_SUPPORT //
if (copy_to_user(wrq->u.data.pointer, &i, wrq->u.data.length))
{
Status = -EFAULT;
}
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_QUERY_MULTIPLE_CARD_SUPPORT(=%d) \n", i));
break;
#ifdef SNMP_SUPPORT
case RT_OID_802_11_MAC_ADDRESS:
wrq->u.data.length = MAC_ADDR_LEN;
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CurrentAddress, wrq->u.data.length);
break;
case RT_OID_802_11_MANUFACTUREROUI:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREROUI \n"));
wrq->u.data.length = ManufacturerOUI_LEN;
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CurrentAddress, wrq->u.data.length);
break;
case RT_OID_802_11_MANUFACTURERNAME:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTURERNAME \n"));
wrq->u.data.length = strlen(ManufacturerNAME);
Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
break;
case RT_OID_802_11_RESOURCETYPEIDNAME:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_RESOURCETYPEIDNAME \n"));
wrq->u.data.length = strlen(ResourceTypeIdName);
Status = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length);
break;
case RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \n"));
ulInfo = 1; // 1 is support wep else 2 is not support.
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case RT_OID_802_11_POWERMANAGEMENTMODE:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_POWERMANAGEMENTMODE \n"));
if (pAdapter->StaCfg.Psm == PSMP_ACTION)
ulInfo = 1; // 1 is power active else 2 is power save.
else
ulInfo = 2;
wrq->u.data.length = sizeof(ulInfo);
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
break;
case OID_802_11_WEPDEFAULTKEYVALUE:
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEPDEFAULTKEYVALUE \n"));
//KeyIdxValue.KeyIdx = pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId;
pKeyIdxValue = wrq->u.data.pointer;
DBGPRINT(RT_DEBUG_TRACE,("KeyIdxValue.KeyIdx = %d, \n",pKeyIdxValue->KeyIdx));
valueLen = pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].KeyLen;
NdisMoveMemory(pKeyIdxValue->Value,
&pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].Key,
valueLen);
pKeyIdxValue->Value[valueLen]='\0';
wrq->u.data.length = sizeof(DefaultKeyIdxValue);
Status = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE,("DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \n", pAdapter->StaCfg.DefaultKeyId, wrq->u.data.length, pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].KeyLen,
pAdapter->SharedKey[BSS0][0].Key[0],
pAdapter->SharedKey[BSS0][1].Key[0],
pAdapter->SharedKey[BSS0][2].Key[0],
pAdapter->SharedKey[BSS0][3].Key[0]));
break;
case OID_802_11_WEPDEFAULTKEYID:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPDEFAULTKEYID \n"));
wrq->u.data.length = sizeof(UCHAR);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->StaCfg.DefaultKeyId, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyId =%d \n", pAdapter->StaCfg.DefaultKeyId));
break;
case RT_OID_802_11_WEPKEYMAPPINGLENGTH:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \n"));
wrq->u.data.length = sizeof(UCHAR);
Status = copy_to_user(wrq->u.data.pointer,
&pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].KeyLen,
wrq->u.data.length);
break;
case OID_802_11_SHORTRETRYLIMIT:
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SHORTRETRYLIMIT \n"));
wrq->u.data.length = sizeof(ULONG);
RTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word);
ShortRetryLimit = tx_rty_cfg.field.ShortRtyLimit;
DBGPRINT(RT_DEBUG_TRACE, ("ShortRetryLimit =%ld, tx_rty_cfg.field.ShortRetryLimit=%d\n", ShortRetryLimit, tx_rty_cfg.field.ShortRtyLimit));
Status = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length);
break;
case OID_802_11_LONGRETRYLIMIT:
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_LONGRETRYLIMIT \n"));
wrq->u.data.length = sizeof(ULONG);
RTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word);
LongRetryLimit = tx_rty_cfg.field.LongRtyLimit;
DBGPRINT(RT_DEBUG_TRACE, ("LongRetryLimit =%ld, tx_rty_cfg.field.LongRtyLimit=%d\n", LongRetryLimit, tx_rty_cfg.field.LongRtyLimit));
Status = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length);
break;
case RT_OID_802_11_PRODUCTID:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRODUCTID \n"));
{
USHORT device_id;
if (((POS_COOKIE)pAdapter->OS_Cookie)->pci_dev != NULL)
pci_read_config_word(((POS_COOKIE)pAdapter->OS_Cookie)->pci_dev, PCI_DEVICE_ID, &device_id);
else
DBGPRINT(RT_DEBUG_TRACE, (" pci_dev = NULL\n"));
sprintf(tmp, "%04x %04x\n", NIC_PCI_VENDOR_ID, device_id);
}
wrq->u.data.length = strlen(tmp);
Status = copy_to_user(wrq->u.data.pointer, tmp, wrq->u.data.length);
break;
case RT_OID_802_11_MANUFACTUREID:
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREID \n"));
wrq->u.data.length = strlen(ManufacturerNAME);
Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
break;
case OID_802_11_CURRENTCHANNEL:
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CURRENTCHANNEL \n"));
wrq->u.data.length = sizeof(UCHAR);
DBGPRINT(RT_DEBUG_TRACE, ("sizeof UCHAR=%d, channel=%d \n", sizeof(UCHAR), pAdapter->CommonCfg.Channel));
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.Channel, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
break;
#endif //SNMP_SUPPORT
case OID_802_11_BUILD_CHANNEL_EX:
{
UCHAR value;
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BUILD_CHANNEL_EX \n"));
wrq->u.data.length = sizeof(UCHAR);
#ifdef EXT_BUILD_CHANNEL_LIST
DBGPRINT(RT_DEBUG_TRACE, ("Support EXT_BUILD_CHANNEL_LIST.\n"));
value = 1;
#else
DBGPRINT(RT_DEBUG_TRACE, ("Doesn't support EXT_BUILD_CHANNEL_LIST.\n"));
value = 0;
#endif // EXT_BUILD_CHANNEL_LIST //
Status = copy_to_user(wrq->u.data.pointer, &value, 1);
DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
}
break;
case OID_802_11_GET_CH_LIST:
{
PRT_CHANNEL_LIST_INFO pChListBuf;
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CH_LIST \n"));
if (pAdapter->ChannelListNum == 0)
{
wrq->u.data.length = 0;
break;
}
pChListBuf = (RT_CHANNEL_LIST_INFO *) kmalloc(sizeof(RT_CHANNEL_LIST_INFO), MEM_ALLOC_FLAG);
if (pChListBuf == NULL)
{
wrq->u.data.length = 0;
break;
}
pChListBuf->ChannelListNum = pAdapter->ChannelListNum;
for (i = 0; i < pChListBuf->ChannelListNum; i++)
pChListBuf->ChannelList[i] = pAdapter->ChannelList[i].Channel;
wrq->u.data.length = sizeof(RT_CHANNEL_LIST_INFO);
Status = copy_to_user(wrq->u.data.pointer, pChListBuf, sizeof(RT_CHANNEL_LIST_INFO));
DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
if (pChListBuf)
kfree(pChListBuf);
}
break;
case OID_802_11_GET_COUNTRY_CODE:
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_COUNTRY_CODE \n"));
wrq->u.data.length = 2;
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.CountryCode, 2);
DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
break;
case OID_802_11_GET_CHANNEL_GEOGRAPHY:
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CHANNEL_GEOGRAPHY \n"));
wrq->u.data.length = 1;
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.Geography, 1);
DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
break;
#ifdef QOS_DLS_SUPPORT
case RT_OID_802_11_QUERY_DLS:
wrq->u.data.length = sizeof(BOOLEAN);
Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.bDLSCapable, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS(=%d)\n", pAdapter->CommonCfg.bDLSCapable));
break;
case RT_OID_802_11_QUERY_DLS_PARAM:
{
PRT_802_11_DLS_INFO pDlsInfo = kmalloc(sizeof(RT_802_11_DLS_INFO), GFP_ATOMIC);
if (pDlsInfo == NULL)
break;
for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++)
{
RTMPMoveMemory(&pDlsInfo->Entry[i], &pAdapter->StaCfg.DLSEntry[i], sizeof(RT_802_11_DLS_UI));
}
pDlsInfo->num = MAX_NUM_OF_DLS_ENTRY;
wrq->u.data.length = sizeof(RT_802_11_DLS_INFO);
Status = copy_to_user(wrq->u.data.pointer, pDlsInfo, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS_PARAM\n"));
if (pDlsInfo)
kfree(pDlsInfo);
}
break;
#endif // QOS_DLS_SUPPORT //
default:
DBGPRINT(RT_DEBUG_TRACE, ("Query::unknown IOCTL's subcmd = 0x%08x\n", cmd));
Status = -EOPNOTSUPP;
break;
}
return Status;
}
Generated by GNU enscript 1.6.4.