rt2860v2源码分析三

来源:互联网 发布:布道者软件 编辑:程序博客网 时间:2024/05/17 10:26

rt2860_probe函数中调用了RtmpPhyNetDevInit为无线网络设备进行初始化,实质是分配建立了pNetDevHook结构体:

PNET_DEV RtmpPhyNetDevInit(    IN VOID                     *pAd,    IN RTMP_OS_NETDEV_OP_HOOK   *pNetDevHook){    struct net_device   *net_dev = NULL;/*  NDIS_STATUS     Status; */    ULONG InfId, OpMode;    RTMP_DRIVER_MAIN_INF_GET(pAd, &InfId);/*  net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); */    RTMP_DRIVER_MAIN_INF_CREATE(pAd, &net_dev);    if (net_dev == NULL)    {        printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n");        return NULL;    }    NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));    pNetDevHook->open = MainVirtualIF_open;    pNetDevHook->stop = MainVirtualIF_close;    pNetDevHook->xmit = rt28xx_send_packets;#ifdef IKANOS_VX_1X0    pNetDevHook->xmit = IKANOS_DataFramesTx;#endif /* IKANOS_VX_1X0 */    pNetDevHook->ioctl = rt28xx_ioctl;    pNetDevHook->priv_flags = InfId; /*INT_MAIN; */    pNetDevHook->get_stats = RT28xx_get_ether_stats;    pNetDevHook->needProtcted = FALSE;#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12)    pNetDevHook->get_wstats = rt28xx_get_wireless_stats;#endif    RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);#ifdef CONFIG_STA_SUPPORT#if WIRELESS_EXT >= 12    if (OpMode == OPMODE_STA)    {        pNetDevHook->iw_handler = (void *)&rt28xx_iw_handler_def;    }#endif /*WIRELESS_EXT >= 12 */#endif /* CONFIG_STA_SUPPORT */#ifdef CONFIG_APSTA_MIXED_SUPPORT#if WIRELESS_EXT >= 12    if (OpMode == OPMODE_AP)    {        pNetDevHook->iw_handler = &rt28xx_ap_iw_handler_def;    }#endif /*WIRELESS_EXT >= 12 */#endif /* CONFIG_APSTA_MIXED_SUPPORT */    /* put private data structure */    RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd);    /* double-check if pAd is associated with the net_dev */    if (RTMP_OS_NETDEV_GET_PRIV(net_dev) == NULL)    {        RtmpOSNetDevFree(net_dev);        return NULL;    }/*  pAd->net_dev = net_dev; */    RTMP_DRIVER_NET_DEV_SET(pAd, net_dev);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)    SET_MODULE_OWNER(net_dev);#endif     return net_dev;}

pNetDevHookRTMP_OS_NETDEV_OP_HOOK结构体,这个结构体是RTMP_OS为对网络设备进行操作的hook,并在RtmpOSNetDevAttach函数中与分配net_device结构体pNetDev进行了关联。则网络操作open函数即为MainVirtualIF_open,其他操作也一一对应,MainVirtualIF_open内容如下:

/*========================================================================Routine Description:    Open raxx interface.Arguments:    *net_dev            the raxx interface pointer========================================================================*/int MainVirtualIF_open(IN struct net_device *net_dev){    VOID *pAd = NULL;    GET_PAD_FROM_NET_DEV(pAd, net_dev);     /* Sanity check for pAd */    if (pAd == NULL)        return 0; /* close ok */#ifdef CONFIG_AP_SUPPORT/*  pAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE; */    RTMP_DRIVER_AP_MAIN_OPEN(pAd);#endif /* CONFIG_AP_SUPPORT */#ifdef IFUP_IN_PROBE        while (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)    {        OS_WAIT(10);        DBGPRINT(RT_DEBUG_TRACE, ("Card not ready, NDIS_STATUS_SUCCESS!\n"));    }#else    if (VIRTUAL_IF_UP(pAd) != 0)        return -1;#endif /* IFUP_IN_PROBE */      /* increase MODULE use count */    RT_MOD_INC_USE_COUNT();    netif_start_queue(net_dev);    netif_carrier_on(net_dev);    netif_wake_queue(net_dev);    return 0;}

在前缀为RTMP_DRIVD的函数中,例如RTMP_DRIVER_MAIN_INF_GETRTMP_DRIVER_MAIN_INF_CREATE,这些函数都定义了RTMP中的端口Ioctl操作,统一调用了RTMP_COM_IoctlHandle,并根据参数cmd来选择不同的操作任务。

RTMP_COM_IoctlHandle函数内容如下:

INT RTMP_COM_IoctlHandle(    IN  VOID                    *pAdSrc,    IN  RTMP_IOCTL_INPUT_STRUCT *wrq,    IN  INT                     cmd,    IN  USHORT                  subcmd,    IN  VOID                    *pData,    IN  ULONG                   Data){    PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;    POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;    INT Status = NDIS_STATUS_SUCCESS, i;    UCHAR PermanentAddress[MAC_ADDR_LEN];    USHORT Addr01, Addr23, Addr45;    pObj = pObj; /* avoid compile warning */    switch(cmd)    {        case CMD_RTPRIV_IOCTL_NETDEV_GET:        /* get main net_dev */        {            VOID **ppNetDev = (VOID **)pData;            *ppNetDev = (VOID *)(pAd->net_dev);        }            break;        case CMD_RTPRIV_IOCTL_NETDEV_SET:        /* set main net_dev */            pAd->net_dev = pData;#ifdef CONFIG_AP_SUPPORT            pAd->ApCfg.MBSSID[MAIN_MBSSID].MSSIDDev = pData;#endif /* CONFIG_AP_SUPPORT */            break;        case CMD_RTPRIV_IOCTL_OPMODE_GET:        /* get Operation Mode */            *(ULONG *)pData = pAd->OpMode;            break;        case CMD_RTPRIV_IOCTL_TASK_LIST_GET:        /* get all Tasks */        {            RT_CMD_WAIT_QUEUE_LIST *pList = (RT_CMD_WAIT_QUEUE_LIST *)pData;            pList->pMlmeTask = &pAd->mlmeTask;#ifdef RTMP_TIMER_TASK_SUPPORT            pList->pTimerTask = &pAd->timerTask;#endif /* RTMP_TIMER_TASK_SUPPORT */            pList->pCmdQTask = &pAd->cmdQTask;#ifdef WSC_INCLUDED            pList->pWscTask = &pAd->wscTask;#endif /* WSC_INCLUDED */        }            break;        case CMD_RTPRIV_IOCTL_IRQ_INIT:        /* init IRQ */            RTMP_IRQ_INIT(pAd);            break;        case CMD_RTPRIV_IOCTL_IRQ_RELEASE:        /* release IRQ */            RTMP_OS_IRQ_RELEASE(pAd, pAd->net_dev);            break;#ifdef RTMP_MAC_PCI        case CMD_RTPRIV_IOCTL_MSI_ENABLE:        /* enable MSI */            RTMP_MSI_ENABLE(pAd);            *(ULONG **)pData = (ULONG *)(pObj->pci_dev);            break;#endif /* RTMP_MAC_PCI */        case CMD_RTPRIV_IOCTL_NIC_NOT_EXIST:        /* set driver state to fRTMP_ADAPTER_NIC_NOT_EXIST */            RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);            break;#ifdef CONFIG_APSTA_MIXED_SUPPORT        case CMD_RTPRIV_IOCTL_MAX_IN_BIT:            /* set MAX_IN_BIT for WMM */            CW_MAX_IN_BITS = Data;            break;#endif /* CONFIG_APSTA_MIXED_SUPPORT */#ifdef CONFIG_STA_SUPPORT#ifdef CONFIG_PM#ifdef USB_SUPPORT_SELECTIVE_SUSPEND                case CMD_RTPRIV_IOCTL_USB_DEV_GET:                /* get USB DEV */                {                        VOID **ppUsb_Dev = (VOID **)pData;                        *ppUsb_Dev = (VOID *)(pObj->pUsb_Dev);                }                        break;                case CMD_RTPRIV_IOCTL_USB_INTF_GET:                /* get USB INTF */                {                        VOID **ppINTF = (VOID **)pData;                        *ppINTF = (VOID *)(pObj->intf);                }                        break;        case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_SET:        /* set driver state to fRTMP_ADAPTER_SUSPEND */            RTMP_SET_FLAG(pAd,fRTMP_ADAPTER_SUSPEND);            break;        case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_CLEAR:        /* clear driver state to fRTMP_ADAPTER_SUSPEND */            RTMP_CLEAR_FLAG(pAd,fRTMP_ADAPTER_SUSPEND);            break;        case CMD_RTPRIV_IOCTL_ADAPTER_SEND_DISSASSOCIATE:        /* clear driver state to fRTMP_ADAPTER_SUSPEND */            if (INFRA_ON(pAd) &&            (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))            {                MLME_DISASSOC_REQ_STRUCT    DisReq;                MLME_QUEUE_ELEM *MsgElem;/* = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);*/                os_alloc_mem(NULL, (UCHAR **)&MsgElem, sizeof(MLME_QUEUE_ELEM));                if (MsgElem)                {                    COPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid);                    DisReq.Reason =  REASON_DEAUTH_STA_LEAVING;                    MsgElem->Machine = ASSOC_STATE_MACHINE;                    MsgElem->MsgType = MT2_MLME_DISASSOC_REQ;                    MsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);                    NdisMoveMemory(MsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));                    /* Prevent to connect AP again in STAMlmePeriodicExec*/                    pAd->MlmeAux.AutoReconnectSsidLen= 32;                    NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);                    pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;                    MlmeDisassocReqAction(pAd, MsgElem);/*              kfree(MsgElem);*/                    os_free_mem(NULL, MsgElem);                }                /*              RTMPusecDelay(1000);*/                RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CGIWAP, -1, NULL, NULL, 0);            }            break;        case CMD_RTPRIV_IOCTL_ADAPTER_SUSPEND_TEST:        /* test driver state to fRTMP_ADAPTER_SUSPEND */            *(UCHAR *)pData = RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_SUSPEND);            break;        case CMD_RTPRIV_IOCTL_ADAPTER_IDLE_RADIO_OFF_TEST:        /* test driver state to fRTMP_ADAPTER_IDLE_RADIO_OFF */            *(UCHAR *)pData = RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_IDLE_RADIO_OFF);            break;        case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_OFF:        /* RT28xxUsbAsicRadioOff */            RT28xxUsbAsicRadioOff(pAd);            break;        case CMD_RTPRIV_IOCTL_ADAPTER_RT28XX_USB_ASICRADIO_ON:        /* RT28xxUsbAsicRadioOn */            RT28xxUsbAsicRadioOn(pAd);            break;#ifdef WOW_SUPPORT#endif /* WOW_SUPPORT */#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */#endif /* CONFIG_PM */          case CMD_RTPRIV_IOCTL_AP_BSSID_GET:            if (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)                NdisCopyMemory(pData, pAd->MlmeAux.Bssid, 6);            else                return NDIS_STATUS_FAILURE;            break;#endif /* CONFIG_STA_SUPPORT */        case CMD_RTPRIV_IOCTL_SANITY_CHECK:        /* sanity check before IOCTL */            if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))#ifdef IFUP_IN_PROBE            || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS))            || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))            || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))#endif /* IFUP_IN_PROBE */            )            {                if(pData == NULL || RT_isLegalCmdBeforeInfUp((PSTRING) pData) == FALSE)                return NDIS_STATUS_FAILURE;            }            break;        case CMD_RTPRIV_IOCTL_SIOCGIWFREQ:        /* get channel number */            *(ULONG *)pData = pAd->CommonCfg.Channel;            break;#ifdef MESH_SUPPORT        case CMD_RTPRIV_IOCTL_MESH_INIT:            MeshInit(pAd, pData);            break;        case CMD_RTPRIV_IOCTL_MESH_REMOVE:            MESH_Remove(pAd);            break;        case CMD_RTPRIV_IOCTL_MESH_OPEN_PRE:            if (MESH_OpenPre(pData) != 0)                return NDIS_STATUS_FAILURE;            break;        case CMD_RTPRIV_IOCTL_MESH_OPEN_POST:            if (MESH_OpenPost(pData) != 0)                return NDIS_STATUS_FAILURE;            break;        case CMD_RTPRIV_IOCTL_MESH_IS_VALID:            *(BOOLEAN *)pData = MeshValid(&pAd->MeshTab);            break;        case CMD_RTPRIV_IOCTL_MESH_CLOSE:            MESH_Close(pData);            break;#endif /* MESH_SUPPORT */#ifdef P2P_SUPPORT        case CMD_RTPRIV_IOCTL_P2P_INIT:            P2pInit(pAd, pData);            break;        case CMD_RTPRIV_IOCTL_P2P_REMOVE:            P2P_Remove(pAd);            break;        case CMD_RTPRIV_IOCTL_P2P_OPEN_PRE:            if (P2P_OpenPre(pData) != 0)                return NDIS_STATUS_FAILURE;            break;        case CMD_RTPRIV_IOCTL_P2P_OPEN_POST:            if (P2P_OpenPost(pData) != 0)                return NDIS_STATUS_FAILURE;            break;        case CMD_RTPRIV_IOCTL_P2P_CLOSE:            P2P_Close(pData);            break;#endif /* P2P_SUPPORT */        case CMD_RTPRIV_IOCTL_BEACON_UPDATE:        /* update all beacon contents */#ifdef CONFIG_AP_SUPPORT            APMakeAllBssBeacon(pAd);            APUpdateAllBeaconFrame(pAd);#endif /* CONFIG_AP_SUPPORT */#ifdef MESH_SUPPORT            MeshMakeBeacon(pAd, pAd->MeshTab.BcnBufIdx);            MeshUpdateBeaconFrame(pAd, pAd->MeshTab.BcnBufIdx);#endif /* MESH_SUPPORT */            break;        case CMD_RTPRIV_IOCTL_RXPATH_GET:        /* get the number of rx path */            *(ULONG *)pData = pAd->Antenna.field.RxPath;            break;        case CMD_RTPRIV_IOCTL_CHAN_LIST_NUM_GET:            *(ULONG *)pData = pAd->ChannelListNum;            break;        case CMD_RTPRIV_IOCTL_CHAN_LIST_GET:        {            UINT32 i;            UCHAR *pChannel = (UCHAR *)pData;            for (i = 1; i <= pAd->ChannelListNum; i++)            {                *pChannel = pAd->ChannelList[i-1].Channel;                pChannel ++;            }        }            break;        case CMD_RTPRIV_IOCTL_FREQ_LIST_GET:        {            UINT32 i;            UINT32 *pFreq = (UINT32 *)pData;            UINT32 m;            for (i = 1; i <= pAd->ChannelListNum; i++)            {                m = 2412000;                MAP_CHANNEL_ID_TO_KHZ(pAd->ChannelList[i-1].Channel, m);                (*pFreq) = m;                pFreq ++;            }        }            break;#ifdef EXT_BUILD_CHANNEL_LIST       case CMD_RTPRIV_SET_PRECONFIG_VALUE:       /* Set some preconfigured value before interface up*/           pAd->CommonCfg.DfsType = MAX_RD_REGION;           break;#endif /* EXT_BUILD_CHANNEL_LIST */#ifdef RTMP_PCI_SUPPORT        case CMD_RTPRIV_IOCTL_PCI_SUSPEND:            RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);            RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);            break;        case CMD_RTPRIV_IOCTL_PCI_RESUME:            RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);            RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);            break;        case CMD_RTPRIV_IOCTL_PCI_CSR_SET:            pAd->CSRBaseAddress = (PUCHAR)Data;            DBGPRINT(RT_DEBUG_ERROR, ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n", (ULONG)pAd->CSRBaseAddress, (ULONG)Data));            break;        case CMD_RTPRIV_IOCTL_PCIE_INIT:            RTMPInitPCIeDevice(pData, pAd);            break;#endif /* RTMP_PCI_SUPPORT */#ifdef RT_CFG80211_SUPPORT        case CMD_RTPRIV_IOCTL_CFG80211_CFG_START:            RT_CFG80211_REINIT(pAd);            RT_CFG80211_CRDA_REG_RULE_APPLY(pAd);            break;#endif /* RT_CFG80211_SUPPORT */#ifdef INF_PPA_SUPPORT        case CMD_RTPRIV_IOCTL_INF_PPA_INIT:            os_alloc_mem(NULL, (UCHAR **)&(pAd->pDirectpathCb), sizeof(PPA_DIRECTPATH_CB));            break;        case CMD_RTPRIV_IOCTL_INF_PPA_EXIT:            if (ppa_hook_directpath_register_dev_fn && pAd->PPAEnable==TRUE)             {                UINT status;                status=ppa_hook_directpath_register_dev_fn(&pAd->g_if_id, pAd->net_dev, NULL, 0);                DBGPRINT(RT_DEBUG_TRACE, ("unregister PPA:g_if_id=%d status=%d\n",pAd->g_if_id,status));            }            os_free_mem(NULL, pAd->pDirectpathCb);            break;#endif /* INF_PPA_SUPPORT*/        case CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP:        /* interface up */        {            RT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData;            if (VIRTUAL_IF_NUM(pAd) == 0)            {                if (pInfConf->rt28xx_open(pAd->net_dev) != 0)                {                    DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_open return fail!\n"));                    return NDIS_STATUS_FAILURE;                }            }            else            {#ifdef CONFIG_AP_SUPPORT                extern VOID APMakeAllBssBeacon(IN PRTMP_ADAPTER pAd);                extern VOID  APUpdateAllBeaconFrame(IN PRTMP_ADAPTER pAd);                APMakeAllBssBeacon(pAd);                APUpdateAllBeaconFrame(pAd);#endif /* CONFIG_AP_SUPPORT */#ifdef MESH_SUPPORT                {                    extern VOID MeshMakeBeacon(IN PRTMP_ADAPTER pAd, IN UCHAR idx);                    extern VOID MeshUpdateBeaconFrame(IN PRTMP_ADAPTER pAd, IN UCHAR idx);                    MeshMakeBeacon(pAd, pAd->MeshTab.BcnBufIdx);                    MeshUpdateBeaconFrame(pAd, pAd->MeshTab.BcnBufIdx);                }#endif /* MESH_SUPPORT */            }            VIRTUAL_IF_INC(pAd);        }            break;        case CMD_RTPRIV_IOCTL_VIRTUAL_INF_DOWN:        /* interface down */        {            RT_CMD_INF_UP_DOWN *pInfConf = (RT_CMD_INF_UP_DOWN *)pData;            VIRTUAL_IF_DEC(pAd);            if (VIRTUAL_IF_NUM(pAd) == 0)                pInfConf->rt28xx_close(pAd->net_dev);        }            break;        case CMD_RTPRIV_IOCTL_VIRTUAL_INF_GET:        /* get virtual interface number */            *(ULONG *)pData = VIRTUAL_IF_NUM(pAd);            break;        case CMD_RTPRIV_IOCTL_INF_TYPE_GET:        /* get current interface type */            *(ULONG *)pData = pAd->infType;            break;        case CMD_RTPRIV_IOCTL_INF_STATS_GET:            /* get statistics */            {                           RT_CMD_STATS *pStats = (RT_CMD_STATS *)pData;                pStats->pStats = pAd->stats;                if(pAd->OpMode == OPMODE_STA)                {                    pStats->rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;                    pStats->tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;                    pStats->rx_bytes = pAd->RalinkCounters.ReceivedByteCount;                    pStats->tx_bytes = pAd->RalinkCounters.TransmittedByteCount;                    pStats->rx_errors = pAd->Counters8023.RxErrors;                    pStats->tx_errors = pAd->Counters8023.TxErrors;                    pStats->multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart;   /* multicast packets received*/                    pStats->collisions = pAd->Counters8023.OneCollision + pAd->Counters8023.MoreCollisions;  /* Collision packets*/                    pStats->rx_over_errors = pAd->Counters8023.RxNoBuffer;                   /* receiver ring buff overflow*/                    pStats->rx_crc_errors = 0;/*pAd->WlanCounters.FCSErrorCount;      recved pkt with crc error*/                    pStats->rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors;          /* recv'd frame alignment error*/                    pStats->rx_fifo_errors = pAd->Counters8023.RxNoBuffer;                   /* recv'r fifo overrun*/                }#ifdef CONFIG_AP_SUPPORT                else if(pAd->OpMode == OPMODE_AP)                {                    INT index;                    for(index = 0; index < MAX_MBSSID_NUM(pAd); index++)                    {                        if (pAd->ApCfg.MBSSID[index].MSSIDDev == (PNET_DEV)(pStats->pNetDev))                        {                            break;                        }                    }                    if(index >= MAX_MBSSID_NUM(pAd))                    {                        //reset counters                        pStats->rx_packets = 0;                        pStats->tx_packets = 0;                        pStats->rx_bytes = 0;                        pStats->tx_bytes = 0;                        pStats->rx_errors = 0;                        pStats->tx_errors = 0;                        pStats->multicast = 0;   /* multicast packets received*/                        pStats->collisions = 0;  /* Collision packets*/                        pStats->rx_over_errors = 0; /* receiver ring buff overflow*/                        pStats->rx_crc_errors = 0; /* recved pkt with crc error*/                        pStats->rx_frame_errors = 0; /* recv'd frame alignment error*/                        pStats->rx_fifo_errors = 0; /* recv'r fifo overrun*/                        DBGPRINT(RT_DEBUG_ERROR, ("CMD_RTPRIV_IOCTL_INF_STATS_GET: can not find mbss I/F\n"));                        return NDIS_STATUS_FAILURE;                    }                    pStats->rx_packets = pAd->ApCfg.MBSSID[index].RxCount;                    pStats->tx_packets = pAd->ApCfg.MBSSID[index].TxCount;                    pStats->rx_bytes = pAd->ApCfg.MBSSID[index].ReceivedByteCount;                    pStats->tx_bytes = pAd->ApCfg.MBSSID[index].TransmittedByteCount;                    pStats->rx_errors = pAd->ApCfg.MBSSID[index].RxErrorCount;                    pStats->tx_errors = pAd->ApCfg.MBSSID[index].TxErrorCount;                    pStats->multicast = pAd->ApCfg.MBSSID[index].mcPktsRx; /* multicast packets received */                    pStats->collisions = 0;  /* Collision packets*/                    pStats->rx_over_errors = 0;                   /* receiver ring buff overflow*/                    pStats->rx_crc_errors = 0;/* recved pkt with crc error*/                    pStats->rx_frame_errors = 0;          /* recv'd frame alignment error*/                    pStats->rx_fifo_errors = 0;                   /* recv'r fifo overrun*/                }#endif            }            break;        case CMD_RTPRIV_IOCTL_INF_IW_STATUS_GET:        /* get wireless statistics */        {            UCHAR CurOpMode = OPMODE_AP;#ifdef CONFIG_AP_SUPPORT             PMAC_TABLE_ENTRY pMacEntry = NULL;#endif /* CONFIG_AP_SUPPORT */            RT_CMD_IW_STATS *pStats = (RT_CMD_IW_STATS *)pData;            pStats->qual = 0;            pStats->level = 0;            pStats->noise = 0;            pStats->pStats = pAd->iw_stats;#ifdef CONFIG_STA_SUPPORT            if (pAd->OpMode == OPMODE_STA)            {                CurOpMode = OPMODE_STA;#ifdef P2P_SUPPORT                if (pStats->priv_flags == INT_P2P)                    CurOpMode = OPMODE_AP;#endif /* P2P_SUPPORT */                                }#endif /* CONFIG_STA_SUPPORT */            /*check if the interface is down*/            if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))                return NDIS_STATUS_FAILURE; #ifdef CONFIG_AP_SUPPORT            if (CurOpMode == OPMODE_AP)            {#ifdef APCLI_SUPPORT                if ((pStats->priv_flags == INT_APCLI)#ifdef P2P_SUPPORT                    || (P2P_CLI_ON(pAd))#endif /* P2P_SUPPORT */                    )                {                    INT ApCliIdx = ApCliIfLookUp(pAd, (PUCHAR)pStats->dev_addr);                    if ((ApCliIdx >= 0) && VALID_WCID(pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID))                        pMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ApCliIdx].MacTabWCID];                }                else#endif /* APCLI_SUPPORT */                {                    /*                        only AP client support wireless stats function.                        return NULL pointer for all other cases.                    */                    pMacEntry = NULL;                }            }#endif /* CONFIG_AP_SUPPORT */#ifdef CONFIG_STA_SUPPORT            if (CurOpMode == OPMODE_STA)                pStats->qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10);#endif /* CONFIG_STA_SUPPORT */#ifdef CONFIG_AP_SUPPORT            if (CurOpMode == OPMODE_AP)            {                if (pMacEntry != NULL)                    pStats->qual = ((pMacEntry->ChannelQuality * 12)/10 + 10);                else                    pStats->qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10);            }#endif /* CONFIG_AP_SUPPORT */            if (pStats->qual > 100)                pStats->qual = 100;#ifdef CONFIG_STA_SUPPORT            if (CurOpMode == OPMODE_STA)            {                pStats->level =                    RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0,                                    pAd->StaCfg.RssiSample.AvgRssi1,                                    pAd->StaCfg.RssiSample.AvgRssi2);            }#endif /* CONFIG_STA_SUPPORT */#ifdef CONFIG_AP_SUPPORT            if (CurOpMode == OPMODE_AP)            {                if (pMacEntry != NULL)                    pStats->level =                        RTMPMaxRssi(pAd, pMacEntry->RssiSample.AvgRssi0,                                        pMacEntry->RssiSample.AvgRssi1,                                        pMacEntry->RssiSample.AvgRssi2);#ifdef P2P_APCLI_SUPPORT                else                    pStats->level =                        RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0,                                        pAd->StaCfg.RssiSample.AvgRssi1,                                        pAd->StaCfg.RssiSample.AvgRssi2);#endif /* P2P_APCLI_SUPPORT */            }#endif /* CONFIG_AP_SUPPORT */#ifdef CONFIG_AP_SUPPORT            pStats->noise = RTMPMaxRssi(pAd, pAd->ApCfg.RssiSample.AvgRssi0,                                        pAd->ApCfg.RssiSample.AvgRssi1,                                        pAd->ApCfg.RssiSample.AvgRssi2) -                                        RTMPMinSnr(pAd, pAd->ApCfg.RssiSample.AvgSnr0,                                        pAd->ApCfg.RssiSample.AvgSnr1);#endif /* CONFIG_AP_SUPPORT */#ifdef CONFIG_STA_SUPPORT            pStats->noise = RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.AvgRssi0,                                        pAd->StaCfg.RssiSample.AvgRssi1,                                        pAd->StaCfg.RssiSample.AvgRssi2) -                                         RTMPMinSnr(pAd, pAd->StaCfg.RssiSample.AvgSnr0,                                         pAd->StaCfg.RssiSample.AvgSnr1);#endif /* CONFIG_STA_SUPPORT */        }            break;        case CMD_RTPRIV_IOCTL_INF_MAIN_CREATE:            *(VOID **)pData = RtmpPhyNetDevMainCreate(pAd);            break;        case CMD_RTPRIV_IOCTL_INF_MAIN_ID_GET:            *(ULONG *)pData = INT_MAIN;            break;        case CMD_RTPRIV_IOCTL_INF_MAIN_CHECK:            if (Data != INT_MAIN)                return NDIS_STATUS_FAILURE;            break;        case CMD_RTPRIV_IOCTL_INF_P2P_CHECK:            if (Data != INT_P2P)                return NDIS_STATUS_FAILURE;            break;#ifdef WDS_SUPPORT        case CMD_RTPRIV_IOCTL_WDS_INIT:            WDS_Init(pAd, pData);            break;        case CMD_RTPRIV_IOCTL_WDS_REMOVE:            WDS_Remove(pAd);            break;        case CMD_RTPRIV_IOCTL_WDS_STATS_GET:            if (Data == INT_WDS)            {                if (WDS_StatsGet(pAd, pData) != TRUE)                    return NDIS_STATUS_FAILURE;            }            else                return NDIS_STATUS_FAILURE;            break;#endif /* WDS_SUPPORT */#ifdef RALINK_ATE#ifdef RALINK_QA        case CMD_RTPRIV_IOCTL_ATE:            RtmpDoAte(pAd, wrq, pData);            break;#endif /* RALINK_QA */ #endif /* RALINK_ATE */        case CMD_RTPRIV_IOCTL_MAC_ADDR_GET:            RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);            RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);            RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);                        PermanentAddress[0] = (UCHAR)(Addr01 & 0xff);                   PermanentAddress[1] = (UCHAR)(Addr01 >> 8);            PermanentAddress[2] = (UCHAR)(Addr23 & 0xff);            PermanentAddress[3] = (UCHAR)(Addr23 >> 8);            PermanentAddress[4] = (UCHAR)(Addr45 & 0xff);            PermanentAddress[5] = (UCHAR)(Addr45 >> 8);                         for(i=0; i<6; i++)                *(UCHAR *)(pData+i) = PermanentAddress[i];            break;#ifdef CONFIG_AP_SUPPORT        case CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:        /* handle for SIOCGIWRATEQ */        {            RT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData;            HTTRANSMIT_SETTING HtPhyMode;#ifdef MESH_SUPPORT            if (pRate->priv_flags == INT_MESH)                HtPhyMode = pAd->MeshTab.HTPhyMode;            else#endif /* MESH_SUPPORT */#ifdef APCLI_SUPPORT            if (pRate->priv_flags == INT_APCLI)                HtPhyMode = pAd->ApCfg.ApCliTab[pObj->ioctl_if].HTPhyMode;            else#endif /* APCLI_SUPPORT */#ifdef WDS_SUPPORT            if (pRate->priv_flags == INT_WDS)                HtPhyMode = pAd->WdsTab.WdsEntry[pObj->ioctl_if].HTPhyMode;            else#endif /* WDS_SUPPORT */            {                HtPhyMode = pAd->ApCfg.MBSSID[pObj->ioctl_if].HTPhyMode;#ifdef MBSS_SUPPORT                /* reset phy mode for MBSS */                MBSS_PHY_MODE_RESET(pObj->ioctl_if, HtPhyMode);#endif /* MBSS_SUPPORT */            }            RtmpDrvMaxRateGet(pAd, HtPhyMode.field.MODE, HtPhyMode.field.ShortGI,                            HtPhyMode.field.BW, HtPhyMode.field.MCS,                            (UINT32 *)&pRate->BitRate);        }            break;#endif /* CONFIG_AP_SUPPORT */        case CMD_RTPRIV_IOCTL_SIOCGIWNAME:            RtmpIoctl_rt_ioctl_giwname(pAd, pData, 0);            break;    }#ifdef RT_CFG80211_SUPPORT    if ((CMD_RTPRIV_IOCTL_80211_START <= cmd) &&        (cmd <= CMD_RTPRIV_IOCTL_80211_END))    {        CFG80211DRV_IoctlHandle(pAd, wrq, cmd, subcmd, pData, Data);    }#endif /* RT_CFG80211_SUPPORT */    if (cmd >= CMD_RTPRIV_IOCTL_80211_COM_LATEST_ONE)        return NDIS_STATUS_FAILURE;    return Status;}
1 0
原创粉丝点击