📄 initproc.c
字号:
* NDIS_STATUS_BAD_VERSION
* NDIS_STATUS_RESOURCES
* NDIS_STATUS_FAILURE
*
* Notes:
*
*****************************************************************************/
NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
NDIS_STATUS Status;
NDIS_HANDLE NdisWrapperHandle;
NDIS_MINIPORT_CHARACTERISTICS MrvDrvNMC;
INITDEBUG();
DBGPRINT(DBG_LOAD,("INIT - Enter DriverEntry\n"));
#ifdef MRV_CHIP_8305
DBGPRINT(DBG_ALL, ("*** SD8305 Driver ***\n"));
#endif // #ifdef MRV_CHIP_8305
#ifdef MRV_CHIP_8381PN
DBGPRINT(DBG_ALL, ("*** SD8381PN Driver ***\n"));
#endif // #ifdef MRV_CHIP_8381PN
#ifdef MRV_CHIP_8385PN
DBGPRINT(DBG_ALL, ("*** SD8385PN Driver ***\n"));
#endif // #ifdef MRV_CHIP_8385PN
#ifdef MRV_CHIP_8399
DBGPRINT(DBG_ALL, ("*** SD8399 Driver ***\n"));
#endif // #ifdef MRV_CHIP_8385PN
#ifdef MRV_CHIP_8385H
DBGPRINT(DBG_ALL, ("*** SD8385H Driver ***\n"));
#endif // #ifdef MRV_CHIP_8385H
#ifdef MRV_CHIP_8686PN //dralee_1209
DBGPRINT(DBG_ALL, ("*** SD8686PN Driver ***\n"));
#endif // #ifdef MRV_CHIP_8686PN
DBGPRINT(DBG_ALL, ("*** Driver version %s ***\n",
MRVDRV_DRIVER_BUILD_VERSION));
DBGPRINT(DBG_ALL, ("*** Built on %s %s ***\n",
__DATE__,
__TIME__));
// Now we must initialize the wrapper, and then register the Miniport
#ifdef DBG
isrTimeDelay.QuadPart = 0;
#endif
NdisMInitializeWrapper(
&NdisWrapperHandle,
DriverObject,
RegistryPath,
NULL
);
#ifdef MRVL_GUI_INTERFACE
g_NdisWrapperHandle = NdisWrapperHandle;
#endif // MRVL_GUI_INTERFACE
NdisZeroMemory(&MrvDrvNMC, sizeof(MrvDrvNMC));
// Initialize the Miniport characteristics for NdisMRegisterMiniport.
MrvDrvNMC.MajorNdisVersion = MRVDRV_NDIS_MAJOR_VERSION;
MrvDrvNMC.MinorNdisVersion = MRVDRV_NDIS_MINOR_VERSION;
MrvDrvNMC.InitializeHandler = MrvDrvInitialize;
MrvDrvNMC.ResetHandler = MrvDrvReset;
MrvDrvNMC.CheckForHangHandler = MrvDrvCheckForHang;
MrvDrvNMC.HandleInterruptHandler = NULL;
MrvDrvNMC.DisableInterruptHandler = NULL; //MrvDrvDisableInterrupt;
MrvDrvNMC.EnableInterruptHandler = NULL; //MrvDrvEnableInterrupt;
MrvDrvNMC.ISRHandler = NULL;
MrvDrvNMC.QueryInformationHandler = MrvDrvQueryInformation;
MrvDrvNMC.SetInformationHandler = MrvDrvSetInformation;
MrvDrvNMC.AllocateCompleteHandler = MrvDrvAllocateComplete;
MrvDrvNMC.ReconfigureHandler = NULL;
#ifdef NDIS51_MINIPORT
MrvDrvNMC.PnPEventNotifyHandler = MrvDrvPnPEventNotify;
#ifdef TX_PRY_Q
MrvDrvNMC.CancelSendPacketsHandler = NULL;
#else
MrvDrvNMC.CancelSendPacketsHandler = MrvDrvCancelSendPackets;
#endif
MrvDrvNMC.AdapterShutdownHandler = MrvDrvShutdownHandler;
#endif
//MrvDrvNMC.HaltHandler = MrvDrvHalt;
MrvDrvNMC.HaltHandler = NULL;
MrvDrvNMC.TransferDataHandler = NULL;
MrvDrvNMC.ReturnPacketHandler = MrvDrvReturnPacket;
MrvDrvNMC.SendHandler = MrvDrvSend;
MrvDrvNMC.SendPacketsHandler = NULL;
// Register this driver with the NDIS wrapper
// This will cause MrvDrvInitialize to be called before returning
Status = NdisMRegisterMiniport(
NdisWrapperHandle,
&MrvDrvNMC,
sizeof(NDIS_MINIPORT_CHARACTERISTICS));
if (Status == NDIS_STATUS_SUCCESS)
{
DBGPRINT(DBG_LOAD,("<== DriverEntry: register miniport success\n"));
return NDIS_STATUS_SUCCESS;
}
NdisTerminateWrapper(NdisWrapperHandle, NULL);
DBGPRINT(DBG_LOAD,("<== INIT - DriverEntry: register miniport failed!!\n"));
return Status;
}
/******************************************************************************
*
* Name: MrvDrvInitialize()
*
* Description:
* NDIS miniport initialization routine, upper layer interface to the NDIS wrapper.
* This routine will check medium support and call rsource allocation and HW
* initialization routines to set up the staion.
*
* Conditions for Use:
* Will be called by NDIS wrapper to initialize the device
*
* Arguments:
* OUT PNDIS_STATUS OpenErrorStatus,
* OUT PUINT SelectedMediumIndex,
* IN PNDIS_MEDIUM MediumArray,
* IN UINT MediumArraySize,
* IN NDIS_HANDLE MiniportAdapterHandle,
* IN NDIS_HANDLE WrapperConfigurationContext
*
* Return Value:
* NDIS_STATUS_SUCCESS
* NDIS_STATUS_FAILURE
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS
MrvDrvInitialize(
OUT PNDIS_STATUS OpenErrorStatus,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE WrapperConfigurationContext
)
{
ULONG i;
NDIS_STATUS Status;
PMRVDRV_ADAPTER Adapter;
NDIS_HANDLE RegHdl;
BOOLEAN timerStatus;
IF_FW_STATUS fwStatus;
i =0;
DBGPRINT(DBG_LOAD,("INIT - Enter MrvDrvInitialize \n"));
#ifdef IF_SPI
#if CMCS
//chenglong
KernelIoControl(IOCTL_GET_WLAN_DRIVER_LOADED, NULL, 0, &bWLANDriverLoaded, sizeof(BOOL), NULL);
if (FALSE == bWLANDriverLoaded)
{
bWLANDriverLoaded = TRUE;
KernelIoControl(IOCTL_SET_WLAN_DRIVER_LOADED, &bWLANDriverLoaded, sizeof(BOOL), NULL, 0, NULL);
//NKDbgPrintfW(TEXT("WLAN: First time to load driver \n"));
}
else
{
//NKDbgPrintfW(TEXT("WLAN: Second time to load driver \n"));
return NDIS_STATUS_FAILURE;
}
#endif
///crlo:add ++
#ifdef IF_SPI
///This function will be called twice in the initialization period. Avoid it
if (isDrvInitialized == TRUE) {
return NDIS_STATUS_FAILURE;
}
#endif ///IF_SPI
///crlo:add --
#endif
// Only support medium type 802.3
for( i = 0; i < MediumArraySize; i++ )
{
if( MediumArray[i] == NdisMedium802_3 )
break;
}
// If 802.3 is not found, return error
if (i == MediumArraySize)
{
//DEBUGSTR(("802.3 Media type not found.\n"));
return NDIS_STATUS_UNSUPPORTED_MEDIA;
}
// Select medium type 802.3
*SelectedMediumIndex = i;
// Allocate adapter handler
Status = MRVDRV_ALLOC_MEM(&Adapter, sizeof(MRVDRV_ADAPTER));
if( Status != NDIS_STATUS_SUCCESS )
{
DBGPRINT(DBG_ERROR | DBG_LOAD, ("Unable to allocate adapter memory, "
"Status = 0x%x\n", Status));
return Status;
}
// Zero out the adapter object space
NdisZeroMemory(Adapter, sizeof(MRVDRV_ADAPTER));
Adapter->MrvDrvAdapterHdl = MiniportAdapterHandle;
Adapter->MrvDrvWrapperConfigurationContext = WrapperConfigurationContext;
#ifdef MRVL_GUI_INTERFACE
Adapter->WrapperHandle = g_NdisWrapperHandle;
Adapter->QueryOidByIOCTL = FALSE;;
Adapter->SetOidByIOCTL = FALSE;
Adapter->UIPresent = FALSE;
MrvlRegisterDeviceObj(Adapter);
#endif // MRVL_GUI_INTERFACE
Adapter->ConfigurationHandle = WrapperConfigurationContext;
Adapter->ShutDown = FALSE;
/////////////////////////////////////////////////////////////////
//[1]
//
// Assign default adapter object value and allocate buffer
//
InitAdapterObject(Adapter);
///////////////////////////////////////////////////
//[2]
//
// Read configuration from registry
//
NdisOpenConfiguration(
&Status,
&RegHdl,
WrapperConfigurationContext);
if (Status != NDIS_STATUS_SUCCESS)
{
FreeAdapterObject(Adapter);
return NDIS_STATUS_FAILURE;
}
Status = ReadRegistryInfo(Adapter, RegHdl);
if(Status != NDIS_STATUS_SUCCESS )
{
FreeAdapterObject(Adapter);
NdisCloseConfiguration(RegHdl);
return Status;
}
NdisCloseConfiguration(RegHdl);
////////////////////////////////////////////////////////////////
//[3]
if ( If_Initialize( Adapter, WrapperConfigurationContext ) != NDIS_STATUS_SUCCESS )
{
// Only adapter object itself has been created up to
// this point
MRVDRV_FREE_MEM((PVOID)Adapter, sizeof(MRVDRV_ADAPTER));
DBGPRINT(DBG_LOAD | DBG_ERROR, ("*** SDIOInitialization FAILED! ***\n"));
return NDIS_STATUS_FAILURE;
}
//InitWlanStateMonitor();
// Call NdisMSetAttributesEx to inform NDIS NIC features
// Set the time-out for unreturned OID to be 10 seconds
#ifdef MRVL_WINXP_NDIS51
NdisMSetAttributesEx(
Adapter->MrvDrvAdapterHdl,
(NDIS_HANDLE) Adapter,
MRVL_CHECK_FOR_HANG_TIME,
(ULONG)NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK,
NdisInterfaceInternal);
#else
NdisMSetAttributesEx(
Adapter->MrvDrvAdapterHdl,
(NDIS_HANDLE) Adapter,
6,
0,
NdisInterfacePcMcia);
#endif
//
// Assign default adapter object value and allocate buffer
//
//dralee move forward
//InitAdapterObject(Adapter);
InitializeCriticalSection(&Adapter->CmdQueueExeSection);
//InitializeCriticalSection(&Adapter->SDIOCriticalSection);
// command
NdisAllocateSpinLock(&Adapter->FreeQSpinLock);
//dralee_1108
//NdisAllocateSpinLock(&Adapter->PriorityQSpinLock);
// rx
NdisAllocateSpinLock(&Adapter->RxQueueSpinLock);
Status = AllocateAdapterBuffer(Adapter);
if( Status != NDIS_STATUS_SUCCESS )
return Status;
// Initialize sync object
InitSyncObjects(Adapter);
#ifdef DEBUG_PARA_ROAMING
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Enter MrvDrvInitialize!...\n")));
#endif
Status = InitParaPrivAdapterObject(Adapter);
if( Status != NDIS_STATUS_SUCCESS )
return Status;
InitParaPrivAdapterFlags(&priv);
#endif
#ifdef IF_SPI
#if CMCS
//chenglong
g_nMiniportAdapterContext = Adapter;
//chenglong
//NKDbgPrintfW(TEXT("WLAN: SPI_Initialize() \r\n!!"));
SPI_Initialize();
#endif
#endif
// SDIO FW Download
g_spi_dummy_clk_reg = 0x05;
g_spi_dummy_clk_data = 0x0e;
dummy_clk_reg = 0x05;
dummy_clk_data = 0x0e;
fwStatus = If_FirmwareDownload(Adapter);
if ( fwStatus != FW_STATUS_INITIALIZED )
{
DBGPRINT(DBG_LOAD, ("Failed to download the firmware\n"));
return NDIS_STATUS_FAILURE;
}
#ifdef IF_SPI
//chenglong
g_bWLAN_FW_Downloaded = TRUE;
#if 1
g_spi_dummy_clk_reg = 0x01;
g_spi_dummy_clk_data = 0x01;
dummy_clk_reg = 0x01;
dummy_clk_data = 0x01;
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_GSPI_BUS_CONFIG,
HostCmd_ACT_GEN_SET,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
#endif
#endif
#ifdef MRVL_EXTERNAL_FW_DOWNLOAD
//give a chance for FW download, for debugging only
#ifdef MRV_CHIP_8305
MessageBox(NULL, TEXT("Download FW Now"), TEXT("SD8305"), MB_OK);
#elif defined(MRV_CHIP_8381PN)
MessageBox(NULL, TEXT("Download FW Now"), TEXT("SD8381PN"), MB_OK);
#elif defined(MRV_CHIP_8385PN)
MessageBox(NULL, TEXT("Download FW Now"), TEXT("SD8385PN"), MB_OK);
#elif defined(MRV_CHIP_8399)
MessageBox(NULL, TEXT("Download FW Now"), TEXT("SD8399"), MB_OK);
#elif defined(MRV_CHIP_8385H)
MessageBox(NULL, TEXT("Download FW Now"), TEXT("SD8385H"), MB_OK);
#elif defined(MRV_CHIP_8686PN) //dralee_1209
MessageBox(NULL, TEXT("Download FW Now"), TEXT("SD8686PN"), MB_OK);
#endif
#endif // #ifdef MRVL_EXTERNAL_FW_DOWNLOAD
#ifndef IF_SPI
NdisMSleep(50000); // Wait long enough
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -