⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 request.c

📁 mx27 f14v2 源代码。包括ADS板上诸多驱动的源码。
💻 C
📖 第 1 页 / 共 5 页
字号:
//---------------------------------------------------------------------------
// 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 + -