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

📄 initproc.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
 *    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 + -