📄 request.c
字号:
//---------------------------------------------------------------------------
// Copyright (C) 2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//--------------------------------------------------------------------------
//
// File: request.c
// Source file for platform specific SDIO WLAN functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// INCLUDE FILES
//------------------------------------------------------------------------------
#include "precomp.h"
//------------------------------------------------------------------------------
// GLOBAL DEFINITIONS
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// GLOBAL OR STATIC VARIABLES
//------------------------------------------------------------------------------
const char aucVendorDescriptor[] = "Freescale Waveblaster Wireless LAN Adapter";
NDIS_STATUS iCurOIDStatus = NDIS_STATUS_SUCCESS;
MIB_ID u16MibID_GetMIBAttr;
int32 debugLevelDef = 0;
//------------------------------------------------------------------------------
// STATIC FUNCTION PROTOTYPES
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// EXPORTED FUNCTIONS
//------------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//
// NAME vENDCleanBssidList
//
// PARAMETERS psHAL Pointer to HAL context.
//
// DESCRIPTION This function cleans up the BSSID List.
//
//-----------------------------------------------------------------------------
#define BSSID_2_MIN_TIMEOUT_IN_100_NANOSEC_UNITS 1200000000UL
#define BSSID_6_MIN_TIMEOUT_IN_100_NANOSEC_UNITS 3600000000UL
#define BSSID_1_SEC_TIMEOUT_IN_100_NANOSEC_UNITS 10000000UL
#ifdef CA_CE_GROUND
#pragma pack(1)
typedef struct
{
bool bPacketForTarget; // set by host, cleared by target
bool bPacketForHost; // set by target, cleared by host
uint16 u16ToTargetPktLen; // set by host, read by target
uint16 u16ToHostPktLen; // set by target, read by host
uint16 u16Padding; // force 4 byte alignment
} FCT_MAILBOX_S;
typedef struct
{
uint16 u16PktType;
uint32 u32PktLength;
uint16 u16PktSequenceNum;
} HEADER_S;
#pragma pack()
static void setTargetPacketReady(PHAL_CONTEXT psHAL,uint16 u16PacketLength);
static bool pollForHostPacket(PHAL_CONTEXT psHAL,uint32 u32TimeoutMs, uint16 *pu16PacketLength);
static void setHostPacketIdle(PHAL_CONTEXT psHAL);
static void getMailbox(PHAL_CONTEXT psHAL);
static void setMailbox(PHAL_CONTEXT psHAL);
static bool waitForIdle(PHAL_CONTEXT psHAL);
static FCT_MAILBOX_S OMailbox_s;
static void setTargetPacketReady(PHAL_CONTEXT psHAL,uint16 u16PacketLength)
{
getMailbox(psHAL);
OMailbox_s.bPacketForTarget = TRUE;
OMailbox_s.u16ToTargetPktLen = u16PacketLength;
setMailbox(psHAL);
}
static bool pollForHostPacket(PHAL_CONTEXT psHAL,uint32 u32TimeoutMs, uint16 *pu16PacketLength)
{
uint16 u16Cnt = 0;
getMailbox(psHAL);
while (OMailbox_s.bPacketForHost == FALSE && u16Cnt++ < (u32TimeoutMs/10 + 1))
{
OS_DELAY_MS(10);
getMailbox(psHAL);
}
*pu16PacketLength = OMailbox_s.u16ToHostPktLen;
return (OMailbox_s.bPacketForHost == TRUE);
}
static void setHostPacketIdle(PHAL_CONTEXT psHAL)
{
getMailbox(psHAL);
OMailbox_s.bPacketForHost = FALSE;
setMailbox(psHAL);
}
static void getMailbox(PHAL_CONTEXT psHAL)
{
while (!boHALacquireSemaphore(psHAL, HAL_MAILBOX_0))
OS_DELAY_MS(1);
vHALreadMailbox(psHAL, 0x2000, (PULONG)&OMailbox_s, sizeof(FCT_MAILBOX_S));
vHALreleaseSemaphore(psHAL, HAL_MAILBOX_0);
}
static void setMailbox(PHAL_CONTEXT psHAL)
{
while (!boHALacquireSemaphore(psHAL, HAL_MAILBOX_0))
OS_DELAY_MS(1);
vHALwriteMailbox(psHAL, 0x2000, (PULONG)&OMailbox_s, sizeof(FCT_MAILBOX_S));
vHALreleaseSemaphore(psHAL, HAL_MAILBOX_0);
}
static bool waitForIdle(PHAL_CONTEXT psHAL)
{
uint16 u16Cnt = 0;
getMailbox(psHAL);
if (OMailbox_s.bPacketForHost != FALSE)
{
setHostPacketIdle(psHAL);
}
while (OMailbox_s.bPacketForTarget != FALSE && u16Cnt++ < 100)
{
OS_DELAY_MS(10);
getMailbox(psHAL);
}
return (OMailbox_s.bPacketForTarget == FALSE);
}
#endif
VOID
vENDCleanBssidList( IN PHAL_CONTEXT psHAL )
{
ULONG i;
LARGE_INTEGER sExpiredBssidSysTime;
PWLAN_CONTEXT psWlan = &psHAL->psAdapter->sWlan;
NdisGetCurrentSystemTime(&sExpiredBssidSysTime);
if ( ((psWlan->ulNetworkTypeInUse == Ndis802_11DS) ||
(psWlan->ulNetworkTypeInUse == Ndis802_11OFDM24)) ||
((psWlan->ulNetworkTypeInUse == Ndis802_11OFDM5) &&
(psHAL->psAdapter->eNetState != NET_CONNECTED)) )
{
sExpiredBssidSysTime.QuadPart -= BSSID_2_MIN_TIMEOUT_IN_100_NANOSEC_UNITS;
}
else if (psWlan->ulNetworkTypeInUse == Ndis802_11OFDM5)
{
ULONG ulscanIntervalInUse = (psWlan->ulPowerMode == Ndis802_11PowerModeCAM) ?
psWlan->sBckGrndScanConfig.ulCamScanInterval : psWlan->sBckGrndScanConfig.ulPsScanInterval;
if (ulscanIntervalInUse == 0) // No background scans - will take 3 host scan requests to scan all channels
{
sExpiredBssidSysTime.QuadPart -= BSSID_6_MIN_TIMEOUT_IN_100_NANOSEC_UNITS;
}
else
{
sExpiredBssidSysTime.QuadPart -= BSSID_2_MIN_TIMEOUT_IN_100_NANOSEC_UNITS;
}
}
else
{
return;
}
for ( i=0; i<psWlan->ulNumOfBssidBuf; i++ )
{
if ( ( psWlan->sBssidList[i].llTimeStamp > 0) &&
( psWlan->sBssidList[i].llTimeStamp < sExpiredBssidSysTime.QuadPart ) )
{
if ( ((psHAL->psAdapter->eNetState == NET_CONNECTED) ||
(psHAL->psAdapter->eNetState == NET_DISCONNECTING)) &&
(OS_MEMEQU( &psWlan->ucBSSID, psWlan->sBssidList[ i ].psBssid->MacAddress, IEEE_ADDR_LEN )) )
{
// do not remove this entry if it is the BSSID that the device is connected to...
// if device is busy, background scans may not have reported the BSSID
// and host will not request a host scan if the device is busy with Rx/Tx
}
else
{
psWlan->sBssidList[i].llTimeStamp = 0; // BSSID has expired, entry is now free
psWlan->ulNumOfBssid--;
}
}
}
}
//-----------------------------------------------------------------------------
//
// NAME iMiniportQueryInformation
//
// PARAMETERS hMiniportAdapterContext Pointer to Adapter context.
// ulOid The OID that is to be set.
// pvInformationBuffer Pointer to the data buffer.
// ulInformationBufferLength The length of data buffer.
// pulBytesWritten Number of bytes written to buffer.
// pulBytesNeeded If buffer is not enough for holding
// data, return the bytes needed.
//
// RETURNS NDIS_STATUS_SUCCESS
// NDIS_STATUS_INVALID_LENGTH
// NDIS_STATUS_NOT_SUPPORTED
// NDIS_STATUS_NOT_ACCEPTED
//
// DESCRIPTION Get OIDs.
//
//-----------------------------------------------------------------------------
NDIS_STATUS
iMiniportQueryInformation(
IN NDIS_HANDLE hMiniportAdapterContext,
IN NDIS_OID ulOid,
IN PVOID pvInformationBuffer,
IN ULONG ulInformationBufferLength,
OUT PULONG pulBytesWritten,
OUT PULONG pulBytesNeeded)
{
static NDIS_OID GlobalSupportedOids[] =
{
OID_GEN_SUPPORTED_LIST, // Query only
OID_GEN_HARDWARE_STATUS, // Query only
OID_GEN_MAC_OPTIONS, // Query only
OID_GEN_MEDIA_SUPPORTED, // Query only
OID_GEN_MEDIA_IN_USE, // Query only
OID_GEN_MAXIMUM_LOOKAHEAD, // Query only
OID_GEN_MAXIMUM_FRAME_SIZE, // Query only
OID_GEN_MAXIMUM_TOTAL_SIZE, // Query only
OID_GEN_TRANSMIT_BLOCK_SIZE, // Query only
OID_GEN_RECEIVE_BLOCK_SIZE, // Query only
OID_GEN_CURRENT_LOOKAHEAD, // Both query and set
OID_GEN_CURRENT_PACKET_FILTER, // Both query and set
OID_GEN_LINK_SPEED, // Query only
OID_GEN_TRANSMIT_BUFFER_SPACE, // Query only
OID_GEN_RECEIVE_BUFFER_SPACE, // Query only
OID_GEN_VENDOR_ID, // Query only
OID_GEN_VENDOR_DESCRIPTION, // Query only
OID_GEN_VENDOR_DRIVER_VERSION, // Query only
OID_GEN_DRIVER_VERSION, // Query only
OID_GEN_MEDIA_CONNECT_STATUS, // Query only
OID_GEN_MAXIMUM_SEND_PACKETS, // Query only
OID_GEN_XMIT_OK, // Query only
OID_GEN_RCV_OK, // Query only
OID_GEN_XMIT_ERROR, // Query only
OID_GEN_RCV_ERROR, // Query only
OID_GEN_RCV_NO_BUFFER, // Query only
OID_GEN_RCV_CRC_ERROR, // Query only
OID_GEN_TRANSMIT_QUEUE_LENGTH, // Query only
OID_GEN_PHYSICAL_MEDIUM, // Query only
//OID_GEN_PROTOCOL_OPTIONS, // Not supported
OID_802_3_PERMANENT_ADDRESS, // Query only
OID_802_3_CURRENT_ADDRESS, // Query only
OID_802_3_MULTICAST_LIST, // Both query and set
OID_802_3_MAXIMUM_LIST_SIZE, // Query only
OID_802_3_RCV_ERROR_ALIGNMENT, // Query only
OID_802_3_XMIT_ONE_COLLISION, // Query only
OID_802_3_XMIT_MORE_COLLISIONS, // Query only
//OID_802_3_XMIT_DEFERRED, // Not supported
//OID_802_3_XMIT_MAX_COLLISIONS, // Not supported
//OID_802_3_RCV_OVERRUN, // Not supported
//OID_802_3_XMIT_UNDERRUN, // Not supported
//OID_802_3_XMIT_HEARTBEAT_FAILURE, // Not supported
//OID_802_3_XMIT_TIMES_CRS_LOST, // Not supported
//OID_802_3_XMIT_LATE_COLLISIONS, // Not supported
/* Power Management */
//OID_PNP_CAPABILITIES, // Not supported
//OID_PNP_SET_POWER, // Not supported
//OID_PNP_QUERY_POWER, // Not supported
/* 802.11 WLAN related OIDs */
OID_802_11_BSSID, // Both query and set
OID_802_11_SSID, // Both query and set
OID_802_11_NETWORK_TYPES_SUPPORTED, // Query only
OID_802_11_NETWORK_TYPE_IN_USE, // Both query and set
OID_802_11_RSSI, // Query only
OID_802_11_RSSI_TRIGGER, // Both query and set
OID_802_11_INFRASTRUCTURE_MODE, // Both query and set
OID_802_11_FRAGMENTATION_THRESHOLD, // Both query and set
OID_802_11_RTS_THRESHOLD, // Both query and set
OID_802_11_NUMBER_OF_ANTENNAS, // Query only
OID_802_11_RX_ANTENNA_SELECTED, // Both query and set
OID_802_11_TX_ANTENNA_SELECTED, // Both query and set
OID_802_11_SUPPORTED_RATES, // Query only
OID_802_11_DESIRED_RATES, // Query only
OID_802_11_CONFIGURATION, // Both query and set
OID_802_11_STATISTICS, // Query only
OID_802_11_POWER_MODE, // Both query and set
OID_802_11_BSSID_LIST, // Query only
OID_802_11_AUTHENTICATION_MODE, // Both query and set
OID_802_11_ENCRYPTION_STATUS, // Both query and set
OID_802_11_ASSOCIATION_INFORMATION, // Both query and set
OID_802_11_ADD_WEP, // Set only
OID_802_11_REMOVE_WEP, // Set only
OID_802_11_DISASSOCIATE, // Set only
OID_802_11_BSSID_LIST_SCAN, // Set only
OID_802_11_RELOAD_DEFAULTS, // Set only
OID_802_11_ADD_KEY, // Set only
OID_802_11_REMOVE_KEY, // Set only
OID_802_11_TEST, // Set only
OID_802_11_MEDIA_STREAM_MODE, // Both query and set
/* Dot11 OIDs */
OID_DOT11_CURRENT_REG_DOMAIN, // Both query and set
/* Custom OIDs */
OID_COMMASIC_RESET, // Set only
OID_COMMASIC_TX_THRUPUT_PS_THRESHOLD, // Both query and set
OID_COMMASIC_RX_THRUPUT_PS_THRESHOLD, // Both query and set
OID_COMMASIC_SHORT_PREAMBLE, // Both query and set
OID_COMMASIC_RX_BUF_OVERFLOW_CT, // Both query and set
OID_COMMASIC_UWA_SENS_LOCKOUT, // Both query and set
OID_COMMASIC_RX_STATS, // Both query and set
OID_COMMASIC_CONFIG, // Set only
OID_COMMASIC_GEN_STATS, // Both query and set
OID_COMMASIC_SNR, // Query only
OID_COMMASIC_CARD_STATUS, // Query only
OID_COMMASIC_CARD_CIS, // Query only
OID_COMMASIC_REGISTER, // Both query and set
OID_COMMASIC_UTIL_STATUS, // Query only
OID_COMMASIC_UTIL_SIGNAL, // Query only
OID_COMMASIC_UTIL_STAT, // Both query and set
OID_COMMASIC_RADIO, // Both query and set
OID_COMMASIC_IBSS_CHANNEL, // Both query and set
//OID_COMMASIC_BACKGROUND_SCAN_CONFIG,// Both query and set
OID_COMMASIC_CARD_CAPABILITIES, // Query only
OID_COMMASIC_FORCE_TX_RATE, // Both query and set
#ifdef CA_CE_GROUND
OID_COMMASIC_CARADIO_INIT,// Both query and set
OID_COMMASIC_CARADIO_LOAD, // Query only
OID_COMMASIC_CARADIO_SEQ, // Both query and set
OID_COMMASIC_CARADIO_RES, // query only
#endif
};
PEND_CONTEXT psAdapter = (PEND_CONTEXT)(hMiniportAdapterContext);
NDIS_STATUS iStatus = NDIS_STATUS_SUCCESS;
UCHAR aucVendorId[4];
NDIS_MEDIUM Medium = NdisMedium802_3;
NDIS_HARDWARE_STATUS HardwareStatus = NdisHardwareStatusReady;
ULONG ulGenericUlong = 0;
USHORT usGenericUShort = 0;
BOOLEAN boGenericBool = FALSE;
UCHAR aucGenericArray[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
ULONG i;
// Common variables for pointing to result of query.
PVOID pvMoveSource = (PVOID) (&ulGenericUlong);
ULONG ulMoveBytes = sizeof(ulGenericUlong);
BOOLEAN boSkipCopy = FALSE;
PWLAN_CONTEXT psWlan = &psAdapter->sWlan;
PHAL_CONTEXT psHAL = &psAdapter->sHAL;
PDAT_STATISTICS psStats = &psAdapter->sStats;
#ifdef CA_CE_GROUND
caMsg *pCAMsg;
ULONG ulCAUlong = 0x12345678;
#endif
DBG_LEV3(("iMiniportQueryInformation()\n"));
// Initialize the result.
*pulBytesWritten = 0;
*pulBytesNeeded = 0;
// Switch on request type.
switch (ulOid)
{
case OID_GEN_SUPPORTED_LIST:
pvMoveSource = (PVOID) (GlobalSupportedOids);
ulMoveBytes = sizeof(GlobalSupportedOids);
break;
case OID_GEN_HARDWARE_STATUS:
pvMoveSource = (PVOID)(&HardwareStatus);
ulMoveBytes = sizeof(NDIS_HARDWARE_STATUS);
break;
case OID_GEN_MAC_OPTIONS:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -