📄 initproc.c
字号:
);
#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 ##dralee
MrvDrvNMC.CancelSendPacketsHandler = NULL;
//#else
//MrvDrvNMC.CancelSendPacketsHandler = MrvDrvCancelSendPackets;
//#endif
MrvDrvNMC.AdapterShutdownHandler = MrvDrvShutdownHandler;
#endif
//++dralee_20060418 don't remove this call back. unplug card need this to release resource.
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"));
//RETAILMSG(1,(TEXT("<== DriverEntry: register miniport success")));
return NDIS_STATUS_SUCCESS;
}
NdisTerminateWrapper(NdisWrapperHandle, NULL);
DBGPRINT(DBG_LOAD,("<== INIT - DriverEntry: register miniport failed!!\n"));
//RETAILMSG(1,(TEXT("<== INIT - DriverEntry: register miniport failed!!")));
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;
//???dralee----------------------------
#if 1
#else //1
#ifdef IF_GSPI
#ifdef OMAP
DWORD dwReadValue = 0;
BOOL bWLANDriverLoaded = FALSE;
DWORD dwRegValue = 0;
#endif // OMAP
#endif // IF_GSPI
#endif //1
//???------------------------------------
IF_FW_STATUS fwStatus;
i =0;
DBGPRINT(DBG_LOAD,("INIT - Enter MrvDrvInitialize \n"));
//RETAILMSG(1,(TEXT("INIT - Enter MrvDrvInitialize(%xh, %xh)"), (int)MiniportAdapterHandle, (int)WrapperConfigurationContext));
//???dralee--------------------------------------------------------
#if 1
#ifdef IF_GSPI
///crlo:2k60303 - leave this fragment temporally. We will remove it later...
///This function will be called twice in the initialization period. Avoid it
if (isDrvInitialized == TRUE) {
return NDIS_STATUS_FAILURE;
// RETAILMSG(1,(TEXT("Exit MrvDrvInitialize(success directly)")));
// return NDIS_STATUS_SUCCESS;
}
// if (isDrvInitialized == FALSE) {
// isDrvInitialized = TRUE;
// return NDIS_STATUS_SUCCESS;
// }
#endif ///IF_GSPI
#else //1
#ifdef IF_GSPI
#if OMAP
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
///This function will be called twice in the initialization period. Avoid it
if (isDrvInitialized == TRUE) {
return NDIS_STATUS_FAILURE;
}
#endif ///IF_GSPI
#endif //1
//???---------------------------------------------------------------------
// 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"));
RETAILMSG(1,(TEXT("Initialize failed \n")));
return NDIS_STATUS_FAILURE;
}
// 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
InitializeCriticalSection(&Adapter->CmdQueueExeSection);
// command
NdisAllocateSpinLock(&Adapter->FreeQSpinLock);
NdisAllocateSpinLock(&Adapter->RxQueueSpinLock);
Status = AllocateAdapterBuffer(Adapter);
if( Status != NDIS_STATUS_SUCCESS )
return Status;
// Initialize sync object
InitSyncObjects(Adapter);
//???dralee------------------------------------------
#if 1
#else //1
#ifdef IF_GSPI
#if OMAP
g_nMiniportAdapterContext = Adapter;
SPI_Initialize();
#endif
#endif
#endif //1
//???-------------------------------------------------
// SDIO FW Download
fwStatus = If_FirmwareDownload(Adapter);
if ( fwStatus != FW_STATUS_INITIALIZED )
{
DBGPRINT(DBG_LOAD, ("Failed to download the firmware\n"));
return NDIS_STATUS_FAILURE;
}
//???dralee-------------------------------------------------------------------
///#if 1
IF_BUS_CONFIG;
///#else //1
/*#ifdef IF_GSPI
///crlo:if_gspi ++
///Move to gspi_if.h / sdio.h
///g_bWLAN_FW_Downloaded = TRUE;
g_spi_dummy_clk_reg = 0x01;
g_spi_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);
///crlo:if_gspi --
#endif*/
///#endif //1
//???---------------------------------------------------------------------------
#ifdef MRVL_EXTERNAL_FW_DOWNLOAD
//give a chance for FW download, for debugging only
///crlo:verdef ++
MessageBox(NULL, TEXT("Download FW Now"), (TEXT(IFSTRN) TEXT(CHIPSTRN) TEXT("_") TEXT(RFSTRN)), MB_OK);
///crlo:verdef --
#endif // #ifdef MRVL_EXTERNAL_FW_DOWNLOAD
//???dralee----------------------------------------
///#if 1
NdisMSleep(IF_WAITING_FW_BOOTUP);
///crlo:if_gspi ++
///crlo: move to if_gspi.h
/*
#else //1
#ifndef IF_GSPI
NdisMSleep(50000); // Wait long enough
#else
NdisMSleep(50); // Wait long enough
#endif
#endif //1
*/
///crlo:if_gspi --
//???---------------------------------------------
NdisFillMemory(Adapter->CurrentAddr, MRVDRV_ETH_ADDR_LEN, 0xff);
NdisFillMemory(Adapter->PermanentAddr, MRVDRV_ETH_ADDR_LEN, 0xff);
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_GET_HW_SPEC,
0,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
//???dralee--------------------------------------------
///#if 1
NdisMSleep(IF_WAITING_GET_HW_SPEC_READY);
///crlo: move to if_gspi.h / if_sdio.h
/*
#else //1
#ifndef IF_GSPI
NdisMSleep(2500000);
#else
NdisMSleep(2500);
#endif
#endif //1
*/
//???--------------------------------------------------
/// Power-Save
if ( Adapter->PSMode != 0)
{
Adapter->PSMode = Ndis802_11PowerModeMAX_PSP;
}
DBGPRINT(DBG_NEWPS, ("Adapter PSMODE = %d\n", Adapter->PSMode));
//???dralee-------------------------------------------------------
//#if 1
// give the interrupt timer a chance to execute
IF_RELEASE_CPU_TIME;
/*
#else
#ifdef IF_SDIO
// give the interrupt timer a chance to execute
NdisMSleep(10000);
#endif // IF_SDIO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -