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

📄 ixatmdrxcfginfo.c

📁 有关ARM开发板上的IXP400网络驱动程序的源码以。
💻 C
📖 第 1 页 / 共 4 页
字号:
    if ((vcDescriptor->status == IX_ATMDACC_RX_CHANNEL_DOWN) &&        (vcDescriptor->replenishInProgress == FALSE))    {        /* flush the rx free queue */        do        {            /* read the RX free queue entry */            returnStatus = ixQMgrQRead (vcDescriptor->rxFreeQueueId, &qEntry);        }        while (returnStatus == IX_SUCCESS && qEntry != 0);        /* flush any remaining entry from the rx queue        */        while (!IX_ATMDACC_RXQ_ALL_RECYCLED (rxSwQueue))        {            /* get the current descriptor */            npeDescriptor = IX_ATMDACC_RXQ_HEAD_ENTRY_GET (rxSwQueue);            /* unchain the mbuf (chaining could have started on NPE) */            mbufPtr = npeDescriptor->atmd.pRootMbuf;	    mbufPtrTmp = mbufPtr;	    do {		IX_ATMDACC_DATA_CACHE_INVALIDATE(mbufPtrTmp, sizeof(mbufPtrTmp));		IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN(UINT32,IX_OSAL_MBUF_MLEN(mbufPtrTmp));				/* convert the mbuf to virtual address space */		IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN (UINT8 *,IX_OSAL_MBUF_MDATA(mbufPtrTmp)); 		IX_ATMDACC_CONVERT_TO_VIRTUAL_ADDRESS (IX_OSAL_MBUF_MDATA(mbufPtrTmp)); 		/* Check for unchained mbufs */		if (IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp) != NULL)		{		    /* if unchained mbuf exist, then get the next mbuf */		    IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN (IX_OSAL_MBUF *,							IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp));		    IX_ATMDACC_CONVERT_TO_VIRTUAL_ADDRESS (IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp));		    mbufPtrTmp = IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp);		}		else		{		    mbufPtrTmp = NULL;		}	    } while (mbufPtrTmp != NULL);            /* move the queue pointer */            IX_ATMDACC_RXQ_HEAD_INCR (rxSwQueue);            /* release the mbuf through the user-supplied callback */            rxBitField = npeDescriptor->npe.rx.rxBitField;            IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN(UINT32, rxBitField);            (*vcDescriptor->rxDoneCallback) (                IX_NPE_A_RXBITFIELD_PORT_GET(rxBitField),                vcDescriptor->callbackId,                IX_ATMDACC_MBUF_RETURN,                IX_ATMDACC_CLP_NOT_SET,                mbufPtr);        }                            /* all descriptors should be back */        /* check if resources are still allocated */        returnStatus = ixAtmdAccRxCfgFreeResourcesCheck (npeVcId);            } /* end of if(vcDescriptor) */    else    {        /* rxDisconnectAck is not yet received or        * replenish is in progress, which means that resources        * are still allocated.        */        returnStatus = IX_ATMDACC_RESOURCES_STILL_ALLOCATED;    }    return returnStatus;}/* ----------------------------------------------* read status callback*/PRIVATE voidixAtmdAccRxCfgNpeAtmStatusReadCallback (IxNpeMhNpeId npeMhNpeId,                                        IxNpeMhMessage npeMhMessage){    UINT32 id;    /* Check NpeId */    IX_ATMDACC_ENSURE (npeMhNpeId == IX_NPEMH_NPEID_NPEA, "wrong npeMhNpeId");    /* Check Id */    id = npeMhMessage.data[0] & NPE_RESP_ID_MASK;    IX_ATMDACC_ENSURE (id == NPE_ATM_STATUS_READ_EXPECTED_ID, "wrong id");    npeRespWordRead = npeMhMessage.data[1];    /* Unblock the reading context */    IX_ATMDACC_NPE_RESPONSE_LOCK_RELEASE ();}/* --------------------------------------------------* Query the npe ATM status*/PRIVATE IX_STATUSixAtmdAccRxCfgNpeAtmStatusRead (unsigned int * rxFreeUnderflowCount,                                 unsigned int * rxOverflowCount){    IX_STATUS returnStatus;        /* get the rx free underflow count */    returnStatus = ixAtmdAccUtilNpeMsgWithResponseSend(        IX_NPE_A_MSSG_ATM_STATUS_READ,        NPE_MSG_RXFREEUNDERFLOW_ID,         NPE_IGNORE,        ixAtmdAccRxCfgNpeAtmStatusReadCallback);        if (returnStatus == IX_SUCCESS)    {        /* Wait for ixAtmdAccNpeReadCallback to release */        IX_ATMDACC_NPE_RESPONSE_LOCK_GET ();                /* copy the response */        *rxFreeUnderflowCount = npeRespWordRead;                /* get the rx underflow count */        returnStatus = ixAtmdAccUtilNpeMsgWithResponseSend(            IX_NPE_A_MSSG_ATM_STATUS_READ,            NPE_MSG_RXOVERFLOW_ID,             NPE_IGNORE,            ixAtmdAccRxCfgNpeAtmStatusReadCallback);                if (returnStatus == IX_SUCCESS)        {            /* Wait for ixAtmdAccNpeReadCallback to release */            IX_ATMDACC_NPE_RESPONSE_LOCK_GET ();                        /* copy the response */            *rxOverflowCount = npeRespWordRead;        }    }        /* map the error */    if (returnStatus != IX_SUCCESS)    {        returnStatus = IX_FAIL;    }        return returnStatus;}/* ---------------------------------------------------------* display internals*/voidixAtmdAccRxCfgInfoStatsShow (void){    int vc;    int rxStream;    IX_STATUS returnStatus;    unsigned int numEntries;    unsigned int rxOverflowCount, rxFreeUnderflowCount;    IxQMgrQId qId;    printf("\n");    IX_ATMDACC_FULL_STATS(    printf ("Rx Free Dummy notification ................ : %10u (should be 0)\n",        ixAtmdAccRxFreeDummyNotificationErrorCount);    printf ("Rx Process Dummy notification ............. : %10u (should be 0)\n",        ixAtmdAccRxDummyProcessPerformErrorCount);    printf ("Rx Enable ................................. : %10u\n",        ixAtmdAccRxEnableCount);    printf ("Rx Disable ................................ : %10u\n",        ixAtmdAccRxDisableCount);    printf ("Rx descriptor missing during disconnect ... : %10u (should be 0)\n",        ixAtmdAccRxTransportErrorStats.descriptorOrderDisconnectErrorCount);    printf ("Rx descriptor missing ..................... : %10u (should be 0)\n",        ixAtmdAccRxTransportErrorStats.descriptorOrderErrorCount);    printf ("Rx descriptor chaining inconsistent ....... : %10u (should be 0)\n",        ixAtmdAccRxTransportErrorStats.mbufChainErrorCount);    printf ("Rx descriptor mbuf mismatch ............... : %10u (should be 0)\n",        ixAtmdAccRxTransportErrorStats.mbufMismatchErrorCount);    printf("\n");    );    ixAtmdAccRxCfgNpeAtmStatusRead(&rxFreeUnderflowCount,                                   &rxOverflowCount);    printf ("Rx Free Underflow (Npe) ................... : %10u (should be 0)\n",        rxFreeUnderflowCount);    printf ("Rx Overflow (Npe) ......................... : %10u (should be 0)\n",        rxOverflowCount);    printf("\n");    /* iterate through all VCs */    for (vc = 0; vc < IX_ATM_MAX_NUM_AAL_OAM_RX_VCS; vc++)    {        if (IX_ATMDACC_RX_VC_INUSE(ixAtmdAccRxVcDescriptor[vc].connId))        {            char *stringAalType = "???????";            char *stringState   = "???????";            switch(ixAtmdAccRxVcDescriptor[vc].status)            {            case IX_ATMDACC_RX_CHANNEL_UP:                 stringState = "Up";                break;            case IX_ATMDACC_RX_CHANNEL_DOWN:                stringState = "DOWN";                break;            case IX_ATMDACC_RX_CHANNEL_DOWN_PENDING:                stringState = "DOWN PENDING";                break;            }            switch(ixAtmdAccRxVcDescriptor[vc].npeAalType)            {            case IX_NPE_A_AAL_TYPE_5:                stringAalType = "AAL5   ";                break;            case IX_NPE_A_AAL_TYPE_0_48:                stringAalType = "AAL0_48";                break;            case IX_NPE_A_AAL_TYPE_0_52:                stringAalType = "AAL0_52";                break;            case IX_NPE_A_AAL_TYPE_OAM:                stringAalType = "OAM    ";                break;            case IX_NPE_A_AAL_TYPE_INVALID:            default:                break;            }            /* display information per VC */            printf ("Rx Channel %2d %s %s connId %8.8x rxFreeQueueId %2d rxQueueId %2d\n",                vc,                stringAalType,                stringState,                ixAtmdAccRxVcDescriptor[vc].connId,                ixAtmdAccRxVcDescriptor[vc].rxFreeQueueId,                ixAtmdAccRxVcDescriptor[vc].rxQueueId);            printf ("   RxId %u Port %u Vpi %u Vci %u userId %8.8x\n",                vc,                ixAtmdAccRxVcDescriptor[vc].port,                ixAtmdAccRxVcDescriptor[vc].vpi,                ixAtmdAccRxVcDescriptor[vc].vci,                ixAtmdAccRxVcDescriptor[vc].callbackId);            printf ("   Descriptor head %10u >= tail %10u\n",                ixAtmdAccRxVcDescriptor[vc].queue.head,                ixAtmdAccRxVcDescriptor[vc].queue.tail);            numEntries = 0;            ixAtmdAccRxVcFreeEntriesQuery(ixAtmdAccRxVcDescriptor[vc].connId,                &numEntries);            printf ("   Rx Free queue level %10u\n",                 ixAtmdAccRxVcDescriptor[vc].rxFreeQueueSize - numEntries);        } /* end of if(IX_ATMDACC_RX_VC_INUSE) */    } /* end of for(vc) */    printf("\n");    for (rxStream = 0; rxStream < IX_ATM_MAX_RX_STREAMS; rxStream++)    {        ixAtmdAccUtilQmgrQIdGet(rxStream, &qId);        printf("Queue %2u:\n", qId);        IX_ATMDACC_FULL_STATS(        printf ("   Rx Dispatch invoke ....................... : %10u\n",            ixAtmdAccRxDispatchStats[rxStream].invokeCount);        printf ("   Rx Dispatch failed ....................... : %10u (should be 0)\n",            ixAtmdAccRxDispatchStats[rxStream].failedCount);        printf ("   Rx SPath Pdu received .................... : %10u\n",            ixAtmdAccRxDispatchStats[rxStream].spPduCount);        printf ("   Rx RxDisableAck received ................. : %10u\n",            ixAtmdAccRxDispatchStats[rxStream].ackCount);        printf ("   Rx Max Rx per dispatch ................... : %10u\n",            ixAtmdAccRxDispatchStats[rxStream].maxRxPerDispatch);        );        /* get the current number of Queue entries */        returnStatus = ixQMgrQNumEntriesGet (qId, &numEntries);                /* read again the number of entries  */        if (returnStatus == IX_QMGR_WARNING)        {            returnStatus = ixQMgrQNumEntriesGet (qId, &numEntries);        }                if (returnStatus != IX_SUCCESS)        {            printf ("   Rx Queue level .............,,,,,,,,,..... :        N/A\n");        }        else        {            printf ("   Rx Queue level ........................... : %10u\n", numEntries);        } /* end of if-else(returnStatus) */    } /* end of for(rxStream) */    printf("\n");}/* ---------------------------------------------------------* display the rx configuration*/voidixAtmdAccRxCfgInfoChannelShow (IxAtmLogicalPort port){    unsigned int vc;    /* iterate through the VCs for this port */    for (vc = 0; vc < IX_ATM_MAX_NUM_AAL_OAM_RX_VCS; vc++)    {        if (IX_ATMDACC_RX_VC_INUSE (ixAtmdAccRxVcDescriptor[vc].connId))        {            if (ixAtmdAccRxVcDescriptor[vc].port == port)            {                IX_ATMDACC_RX_QUEUE *rxSwQueue = &ixAtmdAccRxVcDescriptor[vc].queue;                unsigned int numEntries = 0;                IX_STATUS returnStatus =                     ixQMgrQNumEntriesGet(ixAtmdAccRxVcDescriptor[vc].rxFreeQueueId,                    &numEntries);                char *stringAalType = "???????";                switch(ixAtmdAccRxVcDescriptor[vc].npeAalType)                {                case IX_NPE_A_AAL_TYPE_5:                    stringAalType = "AAL5   ";                    break;                case IX_NPE_A_AAL_TYPE_0_48:                    stringAalType = "AAL0_48";                    break;                case IX_NPE_A_AAL_TYPE_0_52:                    stringAalType = "AAL0_52";                    break;                case IX_NPE_A_AAL_TYPE_OAM:                    stringAalType = "OAM    ";                    break;                case IX_NPE_A_AAL_TYPE_INVALID:                default:                    break;                }                                if (returnStatus == IX_QMGR_WARNING)                {                    returnStatus = ixQMgrQNumEntriesGet(ixAtmdAccRxVcDescriptor[vc].rxFreeQueueId,                        &numEntries);                    if (returnStatus == IX_QMGR_WARNING)                    {                        numEntries = 0;                    }                }                /* display data about VC */                printf ("   Rx Channel %2u %s ConnId 0x%8.8x UserId 0x%8.8x\n",                    vc,                    stringAalType,                    ixAtmdAccRxVcDescriptor[vc].connId,                    ixAtmdAccRxVcDescriptor[vc].callbackId);                printf ("      Vpi %3u Vci %5u MbfsRx %10u MbfsRxf %10u\n",                    ixAtmdAccRxVcDescriptor[vc].vpi,                    ixAtmdAccRxVcDescriptor[vc].vci,                    rxSwQueue->head - rxSwQueue->size,                    numEntries);            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -