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

📄 initproc.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
 *
 *  Purpose:    This module provides the implementaion of NDIS miniport 
 *              dirver initialization, reset and check for hang routines.
 *
 *  $Author: heb $
 *
 *  $Date: 2007/07/13 08:01:35 $
 *
 *  $Revision: 1.13.2.5 $
 *
 *****************************************************************************/

/*
===============================================================================
            INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#ifdef IF_SPI 
#if CMCS
//chenglong
#include "common.h"
#endif
#endif
// jeff.spurgat 2003-04-04
#ifdef UNDER_CE
// jeff.spurgat 2003-04-15
// cardservices support
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#endif

#include "If.h"
#include <regext.h>
//////////////added by zhangb////////////////
#include "ParaRoamingProc.h"
//////////////added by zhangb////////////////
#include "logmain.h"
extern DWORD g_AssociationDuration;

//#ifdef DEBUG_PARA_ROAMING
PRIVATE_PARAROAMING_ADAPTER priv;
//#endif

//#if DBG
unsigned char lptRegImage1 = 0;
unsigned char lptRegImage2 = 0;

// PJG: Note if using igxbug in precompiled header
// you need to define the debug vars manually.
LARGE_INTEGER    t1Time, t1LastTime, t1CurTime;
LARGE_INTEGER    t2Time, t2LastTime, t2CurTime;
LARGE_INTEGER    t3Time, t3LastTime, t3CurTime;
LARGE_INTEGER    t4Time, t4LastTime, t4CurTime;
LARGE_INTEGER    t5Time, t5LastTime, t5CurTime;
LARGE_INTEGER    t6Time, t6LastTime, t6CurTime;

LARGE_INTEGER    curTime;
LARGE_INTEGER    lastTime;
ULONG DebugLevel = DBG_DEFAULT; 
LARGE_INTEGER isrTimeDelay;  

#ifdef UNDER_CE
FILE     *MrvDbgfp = NULL;
#endif // #ifdef UNDER_CE
                              
//#endif 

unsigned char wlan_cal_data[] = {
//Action
0x00,0x00,
//Reserved1[9]
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//PA calibration options
0x0a,
//type of external PA
0x00,
//Antenna selection
0x05,
//channel calibration
0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,
0x08,0x00,0x09,0x00,0x0A,0x00,0x0b,0x00,0x0C,0x00,0x0D,0x00,0x0e,0x00,
//RF register calibration
0xaA,0x0B,0x0C,0x00,
//Reserved2[4]
0x00,0x00,0x00,0x00,
//Regulatory Domain
0x00,0x02,
//ECO present or not
0x32,
//VGA capacitor calibration
0xCc,
//Reserved3[12]
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//# MAC address
0x00,0x0b,0x6c,0x4e,0xcd,0xd2
};

//#define NEW_SCHEME_TO_GET_RESOURCES
#ifdef IF_SPI
BOOL g_bWLAN_FW_Downloaded = FALSE;
///crlo:add ++
#ifdef IF_SPI
static BOOL isDrvInitialized = FALSE;
#endif ///IF_SPI
///crlo:add --
#ifdef CMCS
//chenglong
NDIS_HANDLE g_nMiniportAdapterContext;
extern void SPI_Initialize(void);
#endif
#endif
/*
===============================================================================
            CODED PUBLIC VARIABLE
===============================================================================
*/

//
//          Registry table, works with INF file and ReadRegistryInfo() to provide a 
//          convenient way for device specific registry information reading. 
//
static REGINFOTAB MrvDrvRegInfoTab[] = { 
  {NDIS_STRING_CONST("DesiredSSID"),        "DesiredSSID",         1, FIELD_OFFSET(MRVDRV_ADAPTER, DesiredSSID)+4,            32},
  {NDIS_STRING_CONST("NetWorkMode"),        "NetworkMode",         0, FIELD_OFFSET(MRVDRV_ADAPTER, InfrastructureMode),        4},   
  {NDIS_STRING_CONST("AuthMode"),           "AuthMode",            0, FIELD_OFFSET(MRVDRV_ADAPTER, AuthenticationMode),        4},
  {NDIS_STRING_CONST("TxAntenna"),          "TxAntenna",           3, FIELD_OFFSET(MRVDRV_ADAPTER, TxAntenna),                 4},
  {NDIS_STRING_CONST("RxAntenna"),          "RxAntenna",           3, FIELD_OFFSET(MRVDRV_ADAPTER, RxAntenna),                 4},
  {NDIS_STRING_CONST("Channel"),            "Channel",             0, FIELD_OFFSET(MRVDRV_ADAPTER, Channel),                   4},
  {NDIS_STRING_CONST("DataRate"),           "DataRate",            3, FIELD_OFFSET(MRVDRV_ADAPTER, DataRate),                  4},
  {NDIS_STRING_CONST("FragThsd"),           "FragThsd",            0, FIELD_OFFSET(MRVDRV_ADAPTER, FragThsd),                  4},
  {NDIS_STRING_CONST("RTSThsd"),            "RTSThsd",             0, FIELD_OFFSET(MRVDRV_ADAPTER, RTSThsd),                   4},
    {NDIS_STRING_CONST("MaxChanTime"),        "MaxChanTime",         0, FIELD_OFFSET(MRVDRV_ADAPTER, DefaultPerChannelScanTime), 4},
  {NDIS_STRING_CONST("Preamble"),           "Preamble",            0, FIELD_OFFSET(MRVDRV_ADAPTER, Preamble),                  4},
    {NDIS_STRING_CONST("PowerMode"),          "PowerMode",           0, FIELD_OFFSET(MRVDRV_ADAPTER, PSMode),                    4},
    {NDIS_STRING_CONST("RoamingMode"),        "RoamingMode",         0, FIELD_OFFSET(MRVDRV_ADAPTER, RoamingMode),               1},
    {NDIS_STRING_CONST("RoamingRSSILevel"),   "RoamingRSSILevel",    0, FIELD_OFFSET(MRVDRV_ADAPTER, RoamingLevel),              1},
    {NDIS_STRING_CONST("RoamingPeriod"),      "RoamingPeriod",       0, FIELD_OFFSET(MRVDRV_ADAPTER, RoamingPeriod),             4},
//tt ++ v5 firmware
    {NDIS_STRING_CONST("BTMode"),             "BTMode",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTMode),                    4},
    {NDIS_STRING_CONST("BTAntennaConfig"),    "BTAntennaConfig",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTAntennaConfig),           4},
    {NDIS_STRING_CONST("BTFrequencyConfig"),  "BTFrequencyConfig",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTFrequencyConfig),         4},
    {NDIS_STRING_CONST("BTWLANTxPriorityLo"), "BTWLANTxPriorityLo",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANTxPriorityLo),        4},
    {NDIS_STRING_CONST("BTWLANTxPriorityHi"), "BTWLANTxPriorityHi",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANTxPriorityHi),        4},
    {NDIS_STRING_CONST("BTWLANRxPriorityLo"), "BTWLANRxPriorityLo",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityLo),        4},
    {NDIS_STRING_CONST("BTWLANRxPriorityHi"), "BTWLANRxPriorityHi",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi),        4},
    {NDIS_STRING_CONST("BTTrafficType"), "BTTrafficType",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi),        4},
    {NDIS_STRING_CONST("BTTimeShareInterval"), "BTTimeShareInterval",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi),        4},
    {NDIS_STRING_CONST("BTTime"), "BTTime",       0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi),        4},
//tt --
  {NDIS_STRING_CONST("QOS"),                "QOS",                 0, FIELD_OFFSET(MRVDRV_ADAPTER, EnableQOS),                 4},
  {NDIS_STRING_CONST("WepStatus"),          "WepStatus",           0, FIELD_OFFSET(MRVDRV_ADAPTER, WEPStatus),                 4},
  {NDIS_STRING_CONST("TxWepKey"),           "TxWepKey",            0, FIELD_OFFSET(MRVDRV_ADAPTER, TxWepKey),                  4},
  {NDIS_STRING_CONST("TxPower"),            "TxPower",             0, FIELD_OFFSET(MRVDRV_ADAPTER, TxPower),                   4},
  {NDIS_STRING_CONST("WepKey1"),            "WepKey1",             1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey1)+12,               16},
  {NDIS_STRING_CONST("WepKey2"),            "WepKey2",             1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey2)+12,               16},
  {NDIS_STRING_CONST("WepKey3"),            "WepKey3",             1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey3)+12,               16},
  {NDIS_STRING_CONST("WepKey4"),            "WepKey4",             1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey4)+12,               16},
  {NDIS_STRING_CONST("AdhocDefaultBand"),   "AdhocDefaultBand"   , 0, FIELD_OFFSET(MRVDRV_ADAPTER, AdhocDefaultBand),          4},
    {NDIS_STRING_CONST("AdhocDefaultChannel"),"AdhocDefaultChannel", 0, FIELD_OFFSET(MRVDRV_ADAPTER, AdhocDefaultChannel),       4},    
  {NDIS_STRING_CONST("AdhocWiFiDataRate"),  "AdhocWiFiDataRate"  , 0, FIELD_OFFSET(MRVDRV_ADAPTER, AdhocWiFiDataRate),         4},
  //{NDIS_STRING_CONST("SetSD4BIT"),          "SetSD4BIT"          , 0, FIELD_OFFSET(MRVDRV_ADAPTER, SetSD4BIT),                 4}  
	{NDIS_STRING_CONST("SetSD4BIT"),          "SetSD4BIT"          , 0, FIELD_OFFSET(MRVDRV_ADAPTER, SetSD4BIT),                 4},  
	{NDIS_STRING_CONST("SdioIstThread"),          "SdioIstThread"          , 0, FIELD_OFFSET(MRVDRV_ADAPTER, SdioIstThread),                 4},
#ifdef ENABLE_802_11D
	{NDIS_STRING_CONST("Enable80211D"),       "Enable80211D"  ,      0, FIELD_OFFSET(MRVDRV_ADAPTER, Enable80211D),         	 4},
    {NDIS_STRING_CONST("DefaultRegion"),      "DefaultRegion"  ,     0, FIELD_OFFSET(MRVDRV_ADAPTER, DefaultRegion),         	 4},
    {NDIS_STRING_CONST("DefaultBand"),        "DefaultBand"  ,       0, FIELD_OFFSET(MRVDRV_ADAPTER, DefaultBand),         		 4},
#endif
    };
   
// jeff.spurgat 20003-04-02
// Registry settings for Install_Driver function (required in WinCE)
//
// The following settings are set as default:
//
// [HKEY_LOCAL_MACHINE\Comm\CF8385PN]
//   "DisplayName"="Marvell MrvDrv CF 802.11b"
//   "Group"="NDIS"
//   "ImagePath"="CF8385PN.dll"
// 
// [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PCI\Template\CF8385PN]
//   "Dll"="NDIS.dll"
//   "Entry"="NdisPCIBusDeviceInit"
//   "IsrDll"="giisr.dll"
//   "IsrHandler"="ISRHandler"
//   "Class"=dword:02
//   "SubClass"=dword:00
//   "ProgIF"=dword:0
//   "PortIsIO"=dword:0
//   "PortOffset"=dword:00
//   "PortSize"=dword:0
//   "PortMask"=dword:00000000
//   "VendorID"=multi_sz:"0000"
//   "DeviceID"=multi_sz:"0000"
//
// [HKEY_LOCAL_MACHINE\Drivers\PCMCIA\CF8385PN]
//   "Dll"="ndis.dll"
//   "Prefix"="NDS"
//   "Miniport"="CF8385PN"
//
// [HKEY_LOCAL_MACHINE\Drivers\PCMCIA\Detect\101]
//   "Dll"="CF8385PN.dll"
//   "Entry"="DetectMrvDrv"
//


#define SIZE_OF_REG_TAB (sizeof(MrvDrvRegInfoTab)/sizeof(REGINFOTAB))
/*
===============================================================================
            CODED PUBLIC PROCEDURES
===============================================================================
*/

//*********************************************
void SetWifiState(DWORD dwState)
{
	 DWORD    Status ; 
	 HKEY     hKey= 0 ; 
	 Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("System\\State\\Hardware"), 0L,  KEY_WRITE, &hKey);
	 if(Status == ERROR_SUCCESS)  
	 {
		  Status = RegSetValueEx(hKey, TEXT("WiFi"), 0,  REG_DWORD, (LPBYTE)&dwState, sizeof(DWORD));  
		  RegCloseKey(hKey);
	 } 
}

// The call-back function for Registry Notifications.
void RegistryNotifyCallbackFunc(HREGNOTIFY hNotify, DWORD dwUserData, const PBYTE pData, const UINT cbData)
{
	 DWORD dwState=(DWORD)*pData;

   //DEBUGMSG(1, (TEXT("RegistryNotifyCallbackFunc data=%d\n"), dwState));
	   if(dwState==0)
		SetWifiState(1);

	 if(dwState==4)
		 SetWifiState(3);

	 if(dwState==6)
		 SetWifiState(7);

	 if(7<dwState && dwState<15)
		 SetWifiState(11);

	 if((15<dwState) && (dwState<31) && (dwState%2==0))
		 SetWifiState(19);

	 return;
}

void InitWlanStateMonitor(void)
{
	 HKEY hKey;
	 HREGNOTIFY g_hRegNotify;
	
	 if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("System\\State"), 0,  KEY_QUERY_VALUE, &hKey))
	 {
		   HRESULT hr = RegistryNotifyCallback(hKey, TEXT("Hardware"),TEXT("WiFi"),RegistryNotifyCallbackFunc,0,NULL,&g_hRegNotify); 
		   RegCloseKey(hKey);
	 }  
}
//*******************************************

/* Add the coded public routines here, each with their own prologue. */

// jeff.spurgat 2003-04-02
// DllEntry is required for WinCE driver
#ifdef UNDER_CE
//-----------------------------------------------------------------------------
// Function   : DllEntry
// This function provides the DLL entry point required for the WinCE 
// driver. Since all network drivers are implemented as DLL's in WinCE, 
// this entry point is needed.
//
// Inputs     : HANDLE hDLL, handle identifying this DLL.
//
//              DWORD dwReason, reason of invocation of this entry point.
//
//              LPVOID lpReserved, reserved param
//
// Outputs    : None.
//
// Returns    : TRUE - don't really know what this function is used
//                     for, it has basically been reproduced here from 
//                     the WinCE sample driver. Just safer to return TRUE
//                     than FALSE :-)
//
//-----------------------------------------------------------------------------
BOOL __stdcall
DllEntry( HANDLE hDLL,
          DWORD dwReason,
          LPVOID lpReserved )
{

    switch (dwReason) 
    {
        case DLL_PROCESS_ATTACH:
            DEBUGMSG(1, (TEXT("MRVDRVND5: DLL_PROCESS_ATTACH\n")));
            DisableThreadLibraryCalls ((HMODULE)hDLL);
            break;
        case DLL_PROCESS_DETACH:
            DEBUGMSG(1, (TEXT("MRVDRVND5: DLL_PROCESS_DETACH\n")));
            break;
    }
    return TRUE;
}
#endif

// jeff.spurgat 2003-04-02
// Added AddKeyValues() function, which is used by Install_Driver() to set
// registry key entries. This function was taken from samples in Platform
// Builder.
#ifdef UNDER_CE
/****************************************************************************
 * Function   : AddKeyValues
 * This function adds the specified key and its value into the
 * registry under HKEY_LOCAL_MACHINE.
 *
 * Inputs     : LPWSTR KeyName, name of the key to be added to the registry.
 *
 *              PREG_VALUE_DESCR Vals, value associated with this key.
 *
 * Outputs    : None.
 *
 * NOTE       : 1. This function only supports REG_MULTI_SZ strings with 
 *                 one item.
 *              2. Assumes that input Value for the specified Key is NULL
 *                 terminated.
 *
 * Returns    : TRUE  - if successfully added Key & Value
 *              FALSE - if failed to add Key & Value
 *
 ***************************************************************************/
BOOL
AddKeyValues (LPWSTR KeyName, PREG_VALUE_DESCR Vals)
{
    DWORD Status;
    DWORD dwDisp;
    HKEY hKey;
    PREG_VALUE_DESCR pValue;
    DWORD ValLen;
    PBYTE pVal;
    DWORD dwVal;
    LPWSTR pStr;

    Status = RegCreateKeyEx (HKEY_LOCAL_MACHINE, KeyName, 0, NULL, REG_OPTION_NON_VOLATILE, 0, NULL, &hKey, &dwDisp);

    if (Status != ERROR_SUCCESS)
        return (FALSE);

    pValue = Vals;
    while (pValue->val_name)
  {
    switch (pValue->val_type)
    {
      case REG_DWORD:
        pVal = (PBYTE)&dwVal;
        dwVal = (DWORD)pValue->val_data;
        ValLen = sizeof (DWORD);
        break;
      case REG_SZ:
        pVal = (PBYTE)pValue->val_data;
        ValLen = (wcslen ((LPWSTR)pVal) + 1) * sizeof (WCHAR);
        break;
      case REG_MULTI_SZ:
        dwVal = wcslen ((LPWSTR)pValue->val_data);
        ValLen = (dwVal + 2) * sizeof (WCHAR);
        pVal = LocalAlloc (LPTR, ValLen);
        if (pVal == NULL)
        {
          RegCloseKey (hKey);
          return (FALSE);
        }
        wcscpy ((LPWSTR)pVal, (LPWSTR)pValue->val_data);
        pStr = (LPWSTR)pVal + dwVal;
        pStr[1] = 0;
        break;
    }
    Status = RegSetValueEx (hKey, pValue->val_name, 0, pValue->val_type, pVal, ValLen);
    if (pValue->val_type == REG_MULTI_SZ)
      LocalFree (pVal);
        if (Status != ERROR_SUCCESS)
    {
            RegCloseKey (hKey);
            return (FALSE);
    }
        pValue++;
    }
    RegCloseKey (hKey);
    return (TRUE);
}
#endif // UNDER_CE



/******************************************************************************
 *
 *  Name: DriverEntry()
 *
 *  Description:  
 *    NDIS miniport driver primary driver entry. 
 *
 *  Arguments:
 *      DriverObject - Pointer to driver object created by the system.
 *      RegistryPath - The registry path of this driver
 *    
 *  Return Value:
 *
 *    NDIS_STATUS_SUCCESS 
 *    NDIS_STATUS_BAD_CHARACTERISTICS 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -