📄 oidproc.c
字号:
Status = NDIS_STATUS_INVALID_DATA;
}
return Status;
}
#endif // #ifdef WPA
/******************************************************************************
*
* Name: MrvDrvQueryInformation()
*
* Description: NDIS miniport get information handler
*
* Conditions for Use: NDIS wrapper will call this handler to get device information
*
* Arguments:
* IN NDIS_HANDLE MiniportAdapterContext
* IN NDIS_OID Oid
* IN PVOID InformationBuffer
* IN ULONG InformationBufferLength
* OUT PULONG BytesWritten
* OUT PULONG BytesNeeded
*
* Return Value:
* NDIS_STATUS_SUCCESS
* NDIS_STATUS_PENDING
* NDIS_STATUS_BUFFER_TOO_SHORT
* NDIS_STATUS_NOT_SUPPORTED
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS
MrvDrvQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
)
{
// String describing our adapter
char VendorDescriptor[] = VENDORDESCRIPTOR;
PMRVDRV_ADAPTER Adapter;
//UCHAR VendorId[4];
ULONGLONG GenericULONGLONG;
ULONG GenericULONG;
LONG GenericLONG;
USHORT GenericUSHORT;
UCHAR GenericArray[6];
NDIS_STATUS Status;
NDIS_PNP_CAPABILITIES PMCap;
NDIS_DEVICE_POWER_STATE NewPowerState;
// NDIS_PM_PACKET_PATTERN PMPattern;
PNDIS_802_11_STATISTICS pn11Stat;
// PUCHAR PUchar;
PVOID MoveSource;
ULONG MoveBytes;
ULONG ulRequiredSize;
#ifdef WMM
POID_MRVL_DS_WMM_STATE pWmmState;
#endif
POID_MRVL_DS_GET_RX_INFO pGetRxInfo;
// Common variables for pointing to result of query
MoveSource = (PVOID) (&GenericULONG);
MoveBytes = sizeof(GenericULONG);
//DBGPRINT(DBG_OID,("REQUEST - Enter MrvDrvQueryInformation - 0x%x \n", Oid));
Adapter = (PMRVDRV_ADAPTER)(MiniportAdapterContext);
#ifdef DEEP_SLEEP
// In Deep Sleep Mode no packet can be sent out
//Ling++, 012706, DeepSleep, modify : under DeepSleep, only query Oid==OID_MRVL_DEEP_SLEEP can be executed
// if (Adapter->IsDeepSleep)
// {
// Status = NDIS_STATUS_FAILURE;
// }
if (Adapter->IsDeepSleepRequired || Adapter->IsDeepSleep)
{
if (Oid != OID_MRVL_DEEP_SLEEP)
{
DBGPRINT(DBG_OID | DBG_ALLEN ,("Not OID_MRVL_DEEP_SLEEP OID\n"));
return NDIS_STATUS_FAILURE;
}
}
//Ling--, 012706
#endif
#ifndef NDIS50_MINIPORT
// Check device removal status
if( Adapter->SurpriseRemoved == TRUE ){
return NDIS_STATUS_ADAPTER_REMOVED;
}
#else
{
#ifdef IF_SDIO
//Ling++, 012706, DeepSleep, modify or remove this part for SDIO ?
if (!(Adapter->IsDeepSleepRequired)&&!(Adapter->IsDeepSleep))
{
if ( sdio_IsFirmwareLoaded(Adapter) == FW_STATUS_READ_FAILED)
{
DBGPRINT(DBG_OID,("card removed ! ****\n"));
return NDIS_STATUS_ADAPTER_REMOVED;
}
}
#elif defined(IF_GSPI)
if ( spi_IsFirmwareLoaded(Adapter) == FW_STATUS_READ_FAILED)
{
DBGPRINT(DBG_OID,("card removed ! ****\n"));
return NDIS_STATUS_ADAPTER_REMOVED;
}
#endif // IF_SDIO
}
#endif
// Initialize the result variables
*BytesWritten = 0;
*BytesNeeded = 0;
Status = NDIS_STATUS_SUCCESS;
#ifdef UNDER_CE
if ( Adapter->CurPowerState == NdisDeviceStateD3 )
{
// card powered off
return NDIS_STATUS_ADAPTER_REMOVED;
}
#endif // #ifdef UNDER_CE
//lykao, 061805
//RETAILMSG(1,(TEXT("[Marvell]+MrvDrvQueryInformation ")));
//NKDbgPrintfW(L"[Marvell]+MrvDrvQueryInformation Oid= 0x%x", (ULONG)Oid);
V5DbgMsg( (L" > OID qry: 0x%x\n", Oid) );
// Switch on request type
switch (Oid)
{
#ifdef PMKID_CACHE_CAP
case OID_802_11_PMKID:
{
PNDIS_802_11_PMKID pPmkid = (PNDIS_802_11_PMKID) InformationBuffer;
DBGPRINT( DBG_OID|DBG_MACEVENT, ("QUERY - OID_802_11_PMKID\n") );
if ( InformationBufferLength < sizeof(NDIS_802_11_PMKID) )
{
DBGPRINT(DBG_OID|DBG_MACEVENT, (" Buffer too small, return.\n") );
*BytesNeeded = sizeof(NDIS_802_11_PMKID);
return NDIS_STATUS_INVALID_LENGTH;
}
pPmkid->Length = sizeof(NDIS_802_11_PMKID);
pPmkid->BSSIDInfoCount = 0;
return NDIS_STATUS_SUCCESS;
}
break;
case OID_802_11_CAPABILITY:
{
PNDIS_802_11_CAPABILITY pCap = (PNDIS_802_11_CAPABILITY) InformationBuffer;
ULONG nNeedLen;
const ULONG nNumOfModes = 12;
DBGPRINT( DBG_OID|DBG_MACEVENT, ("QUERY - OID_802_11_CAPABILITY\n") );
nNeedLen = sizeof(NDIS_802_11_CAPABILITY) +
((nNumOfModes-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION) );
if (InformationBufferLength < nNeedLen)
{
DBGPRINT(DBG_OID|DBG_MACEVENT, (" Buffer too small, return.\n") );
*BytesNeeded = nNeedLen;
return NDIS_STATUS_INVALID_LENGTH;
}
pCap->Length = nNeedLen;
pCap->Version = 2;
pCap->NoOfPmkid = MAX_PMKID_CACHE;
pCap->NoOfAuthEncryptPairsSupported = nNumOfModes;
DBGPRINT(DBG_OID|DBG_MACEVENT, (" Copy data... [Len=%d, Pmkid=%d, Modes=%d]\n",
pCap->Length, pCap->NoOfPmkid, pCap->NoOfAuthEncryptPairsSupported ) );
pCap->AuthEncryptSupported[0].AuthMode = Ndis802_11AuthModeOpen;
pCap->AuthEncryptSupported[0].EncryptStatus = Ndis802_11EncryptionDisabled;
pCap->AuthEncryptSupported[1].AuthMode = Ndis802_11AuthModeOpen;
pCap->AuthEncryptSupported[1].EncryptStatus = Ndis802_11Encryption1Enabled;
pCap->AuthEncryptSupported[2].AuthMode = Ndis802_11AuthModeShared;
pCap->AuthEncryptSupported[2].EncryptStatus = Ndis802_11EncryptionDisabled;
pCap->AuthEncryptSupported[3].AuthMode = Ndis802_11AuthModeShared;
pCap->AuthEncryptSupported[3].EncryptStatus = Ndis802_11Encryption1Enabled;
pCap->AuthEncryptSupported[4].AuthMode = Ndis802_11AuthModeWPA;
pCap->AuthEncryptSupported[4].EncryptStatus = Ndis802_11Encryption2Enabled;
pCap->AuthEncryptSupported[5].AuthMode = Ndis802_11AuthModeWPA;
pCap->AuthEncryptSupported[5].EncryptStatus = Ndis802_11Encryption3Enabled;
pCap->AuthEncryptSupported[6].AuthMode = Ndis802_11AuthModeWPAPSK;
pCap->AuthEncryptSupported[6].EncryptStatus = Ndis802_11Encryption2Enabled;
pCap->AuthEncryptSupported[7].AuthMode = Ndis802_11AuthModeWPAPSK;
pCap->AuthEncryptSupported[7].EncryptStatus = Ndis802_11Encryption3Enabled;
pCap->AuthEncryptSupported[8].AuthMode = Ndis802_11AuthModeWPA2;
pCap->AuthEncryptSupported[8].EncryptStatus = Ndis802_11Encryption2Enabled;
pCap->AuthEncryptSupported[9].AuthMode = Ndis802_11AuthModeWPA2;
pCap->AuthEncryptSupported[9].EncryptStatus = Ndis802_11Encryption3Enabled;
pCap->AuthEncryptSupported[10].AuthMode = Ndis802_11AuthModeWPA2PSK;
pCap->AuthEncryptSupported[10].EncryptStatus = Ndis802_11Encryption2Enabled;
pCap->AuthEncryptSupported[11].AuthMode = Ndis802_11AuthModeWPA2PSK;
pCap->AuthEncryptSupported[11].EncryptStatus = Ndis802_11Encryption3Enabled;
*BytesWritten = nNeedLen;
return NDIS_STATUS_SUCCESS;
}
break;
#endif //PMKID_CACHE_CAP
#ifdef BG_SCAN
case OID_MRVL_BG_SCAN_QUERY:
{
POID_MRVL_DS_BG_SCAN_CONFIG pOidBG;
pOidBG = (POID_MRVL_DS_BG_SCAN_CONFIG)Adapter->BgScanCfg;
if (Adapter->bBgScanEnabled)
pOidBG->Enable = 1;
else
pOidBG->Enable = 0;
MoveSource = (PVOID) (Adapter->BgScanCfg);
MoveBytes = Adapter->nBgScanCfg;
}
break;
#endif
case OID_MRVL_GET_RX_INFO:
{
if( InformationBufferLength < sizeof(OID_MRVL_DS_GET_RX_INFO) )
{
*BytesNeeded = sizeof(OID_MRVL_DS_GET_RX_INFO);
return NDIS_STATUS_INVALID_LENGTH;
}
pGetRxInfo = (POID_MRVL_DS_GET_RX_INFO)InformationBuffer;
pGetRxInfo->RXPDSNR = Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] ;
pGetRxInfo->RXPDRate = Adapter->RxPDRate ;
MoveBytes=sizeof(OID_MRVL_DS_GET_RX_INFO);
Status = NDIS_STATUS_SUCCESS;
*BytesWritten=sizeof(OID_MRVL_DS_GET_RX_INFO);
return NDIS_STATUS_SUCCESS;
}
break;
#ifdef PA_CFG_EXT
case OID_MRVL_POWER_ADAPT_CFG_EXT:
{
#ifdef MRVL_DBG_PA_CFG_EXT
#ifdef MRVL_PRINT_DBG_MSG
MrvPrintFile("\n[Marvell]Query: OID_MRVL_POWER_ADAPT_CFG_EXT: \n");
MrvPrintFile("\n[Marvell]sizeof(OID_MRVL_DS_POWER_ADAPT_CFG_EXT)=0x%x, InformationBufferLength=0x%x !!\n",sizeof(OID_MRVL_DS_POWER_ADAPT_CFG_EXT),InformationBufferLength);
#endif
#endif
GetPACFGValue(Adapter);
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_POWER_ADAPT_CFG_EXT, OID_MRVL_POWER_ADAPT_CFG_EXT,
sizeof(OID_MRVL_DS_POWER_ADAPT_CFG_EXT), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_POWER_ADAPT_CFG_EXT, Action, SIZEOF_OID_DS_LEADING );
}
break;
#endif
//tt ++ v5 firmware
case OID_MRVL_LED_CONTROL:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_LED_CONTROL, OID_MRVL_LED_CONTROL,
sizeof(OID_MRVL_DS_LED_CONTROL), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_LED_CONTROL, NumLed, SIZEOF_OID_DS_LEADING );
break;
#ifdef CAL_DATA
case OID_MRVL_CAL_DATA:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_CAL_DATA, OID_MRVL_CAL_DATA,
sizeof(OID_MRVL_DS_CAL_DATA), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_CAL_DATA, Reserved1[0], SIZEOF_OID_DS_LEADING );
break;
case OID_MRVL_CAL_DATA_EXT:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_CAL_DATA_EXT, OID_MRVL_CAL_DATA_EXT,
sizeof(OID_MRVL_DS_CAL_DATA_EXT), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_CAL_DATA_EXT, Revision, SIZEOF_OID_DS_LEADING );
break;
#endif //CAL_DATA
case OID_MRVL_PWR_CFG:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_PWR_CFG, OID_MRVL_PWR_CFG,
sizeof(OID_MRVL_DS_PWR_CFG), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_PWR_CFG, Enable, SIZEOF_OID_DS_LEADING );
break;
case OID_MRVL_TPC_CFG:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_TPC_CFG, OID_MRVL_TPC_CFG,
sizeof(OID_MRVL_DS_TPC_CFG), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_TPC_CFG, Enable, SIZEOF_OID_DS_LEADING );
break;
case OID_MRVL_RATE_ADAPT_RATESET:
TT_CMDPARSE_SYNC_OID( HostCmd_CMD_802_11_RATE_ADAPT_RATESET, OID_MRVL_RATE_ADAPT_RATESET,
sizeof(OID_MRVL_DS_RATE_ADAPT_RATESET), HostCmd_ACT_GET, HostCmd_PENDING_ON_GET_OID, BytesWritten );
TT_CMDPARSE_QUERY_WAIT_COMPLETE_AND_RETURN( Adapter, OID_MRVL_DS_RATE_ADAPT_RATESET, EnableHwAuto, SIZEOF_OID_DS_LEADING );
break;
//tt --
case OID_GEN_MAC_OPTIONS:
// NOTE: Don't set NDIS_MAC_OPTION_RECEIVE_SERIALIZED if we
// are doing multipacket (ndis4) style receives.
GenericULONG = (ULONG)NDIS_MAC_OPTION_NO_LOOPBACK |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND;
if ( Adapter->EnableQOS )
{
GenericULONG = GenericULONG | NDIS_MAC_OPTION_8021P_PRIORITY;
}
break;
case OID_GEN_CURRENT_PACKET_FILTER:
GenericULONG = Adapter->CurrentPacketFilter;
/* tt
// Verify the Length
if (InformationBufferLength < 4){
*BytesNeeded = 4;
return (NDIS_STATUS_INVALID_LENGTH);
}
// Now call the filter function to set the packet filter.
NdisMoveMemory(InformationBuffer, (PVOID)&(Adapter->CurrentPacketFilter), sizeof(ULONG));
*/
break;
case OID_GEN_SUPPORTED_LIST:
MoveSource = (PVOID) (MrvDrvGlobalSupportedOids);
MoveBytes = sizeof(MrvDrvGlobalSupportedOids);
break;
case OID_GEN_HARDWARE_STATUS:
GenericULONG = (ULONG)Adapter->HardwareStatus;
break;
case OID_GEN_MEDIA_SUPPORTED:
MoveSource = (PVOID)MediaSupported;
MoveBytes = sizeof(NDIS_MEDIUM); // need to change for 802.11
break;
case OID_GEN_MEDIA_IN_USE:
GenericULONG = Adapter->MediaInUse;
//MoveSource = (PVOID)MediaSupported;
//MoveBytes = sizeof(NDIS_MEDIUM); // need to change for 802.11
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
// this is a work around for the ping problem.
// GenericULONG = (ULONG)(MRVDRV_MAXIMUM_ETH_PACKET_SIZE - MRVDRV_ETH_HEADER_SIZE);
//GenericULONG = (ULONG)CF_MAX_PACKET_SIZE;
#ifdef IF_GSPI
///crlo:MTU ++
///If this value is incorrect, the TCP layer will not fragment the packets correct
///The sent packets will be discarded by the other side (eg: AP) and big-size ping (eg: 10000) will fail
GenericULONG = (ULONG)MRVDRV_MTU;
///GenericULONG = (ULONG)CF_MAX_PACKET_SIZE;
///crlo:MTU ++
#else
GenericULONG = (ULONG)CF_MAX_PACKET_SIZE;
#endif ///IF_GSPI
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
GenericULONG = (ULONG)MRVDRV_MAXIMUM_ETH_PACKET_SIZE - MRVDRV_ETH_HEADER_SIZE;
DBGPRINT(DBG_RXDATA, ("OID: Return OID_GEN_MAXIMUM_LOOKAHEAD to %d\n",
MRVDRV_MAXIMUM_ETH_PACKET_SIZE- MRVDRV_ETH_HEADER_SIZE));
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -