rt2860v2源码解析四

本文深入探讨了rt2860v2无线设备在OpenWRT中的驱动初始化过程,通过pci设备的probe函数,详细解析了驱动设备操作的初始化步骤,包括关键函数的功能和执行流程。
摘要由CSDN通过智能技术生成

在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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值