在pci设备的probe函数rt2860_probe
中,有获取设备的初始化操作:
/* get DRIVER operations */
RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, NULL, &PciConfig, NULL);
RTMP_DRV_OPS_FUNCTION
函数调用了RtmpDrvOpsInit
函数进行驱动设备操作的初始化,内容如下:
VOID RtmpDrvOpsInit(
OUT VOID *pDrvOpsOrg,
INOUT VOID *pDrvNetOpsOrg,
IN RTMP_PCI_CONFIG *pPciConfig,
IN RTMP_USB_CONFIG *pUsbConfig)
{
RTMP_DRV_ABL_OPS *pDrvOps = (RTMP_DRV_ABL_OPS *)pDrvOpsOrg;
/* init PCI/USB configuration in different OS */
if (pPciConfig != NULL)
RtmpPciConfig = *pPciConfig;
if (pUsbConfig != NULL)
RtmpUsbConfig = *pUsbConfig;
/* init operators provided from us (DRIVER module) */
pDrvOps->RTMPAllocAdapterBlock = RTMPAllocAdapterBlock;
pDrvOps->RTMPFreeAdapter = RTMPFreeAdapter;
pDrvOps->RtmpRaDevCtrlExit = RtmpRaDevCtrlExit;
pDrvOps->RtmpRaDevCtrlInit = RtmpRaDevCtrlInit;
#ifdef RTMP_MAC_PCI
pDrvOps->RTMPHandleInterrupt = RTMPHandleInterrupt;
#endif /* RTMP_MAC_PCI */
pDrvOps->RTMPSendPackets = RTMPSendPackets;
#ifdef MBSS_SUPPORT
pDrvOps->MBSS_PacketSend = MBSS_PacketSend;
#endif /* MBSS_SUPPORT */
#ifdef WDS_SUPPORT
pDrvOps->WDS_PacketSend = WDS_PacketSend;
#endif /* WDS_SUPPORT */
#ifdef APCLI_SUPPORT
pDrvOps->APC_PacketSend = APC_PacketSend;
#endif /* APCLI_SUPPORT */
#ifdef MESH_SUPPORT
pDrvOps->MESH_PacketSend = MESH_PacketSend;
#endif /* MESH_SUPPORT */
#ifdef P2P_SUPPORT
pDrvOps->P2P_PacketSend = P2P_PacketSend;
#endif /* P2P_SUPPORT */
pDrvOps->RTMP_COM_IoctlHandle = RTMP_COM_IoctlHandle;
#ifdef CONFIG_AP_SUPPORT
pDrvOps->RTMP_AP_IoctlHandle = RTMP_AP_IoctlHandle;
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_STA_SUPPORT
pDrvOps->RTMP_STA_IoctlHandle = RTMP_STA_IoctlHandle;
#endif /* CONFIG_STA_SUPPORT */
pDrvOps->RTMPDrvOpen = RTMPDrvOpen;
pDrvOps->RTMPDrvClose = RTMPDrvClose;
pDrvOps->RTMPInfClose = RTMPInfClose;
pDrvOps->rt28xx_init = rt28xx_init;
/* init operators provided from us and netif module */
}
rt28xx_init
函数进行了初始,内容如下:
int rt28xx_init(
IN VOID *pAdSrc,
IN PSTRING pDefaultMac,
IN PSTRING pHostName)
{
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
UINT index;
UCHAR TmpPhy;
NDIS_STATUS Status;
if (pAd == NULL)
return FALSE;
#ifdef CONFIG_STA_SUPPORT
#ifdef PCIE_PS_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
/* If dirver doesn't wake up firmware here,*/
/* NICLoadFirmware will hang forever when interface is up again.*/
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) &&
OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
{
AUTO_WAKEUP_STRUC AutoWakeupCfg;
AsicForceWakeup(pAd, TRUE);
AutoWakeupCfg.word = 0;
RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
}
}
#endif /* PCIE_PS_SUPPORT */
#endif /* CONFIG_STA_SUPPORT */
/* reset Adapter flags*/
RTMP_CLEAR_FLAGS(pAd);
/* Init BssTab & ChannelInfo tabbles for auto channel select.*/
#ifdef CONFIG_AP_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
{
/*#ifdef AUTO_CH_SELECT_ENHANCE*/
AutoChBssTableInit(pAd);
ChannelInfoInit(pAd);
/*#endif AUTO_CH_SELECT_ENHANCE */
}
#endif /* CONFIG_AP_SUPPORT */
#ifdef DOT11_N_SUPPORT
/* Allocate BA Reordering memory*/
if (ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM) != TRUE)
goto err1;
#endif /* DOT11_N_SUPPORT */
/* Make sure MAC gets ready.*/
index = 0;
if (WaitForAsicReady(pAd) != TRUE)
goto err1;
DBGPRINT(RT_DEBUG_TRACE, ("MAC[Ver:Rev=0x%08x]\n", pAd->MACVersion));
if (MAX_LEN_OF_MAC_TABLE > MAX_AVAILABLE_CLIENT_WCID(pAd))
{
DBGPRINT(RT_DEBUG_ERROR, ("MAX_LEN_OF_MAC_TABLE can not be larger than MAX_AVAILABLE_CLIENT_WCID!!!!\n"));
goto err1;
}
#ifdef RTMP_MAC_PCI
/* To fix driver disable/enable hang issue when radio off*/
RT