亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ixethaccdataplane.c

?? 友善mini2440嵌入式
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* Convert the mbuf header after NPE transmission * Since there is nothing changed by the NPE, there is no need * to process anything but the update of internal stats * when they are enabled*/PRIVATE voidixEthAccMbufFromTxQ(IX_OSAL_MBUF *mbuf){#ifndef NDEBUG    /* test for unchained mbufs */    if (IX_ETHACC_NE_NEXT(mbuf) == 0)    {	/* unchained mbufs : update the stats */	IX_ETH_ACC_STATS_INC(ixEthAccDataStats.unchainedTxDoneMBufs);    }    else    {	/* chained mbufs : walk the chain and update the stats */	IX_OSAL_MBUF *ptr = mbuf;	do	{	    IX_ETH_ACC_STATS_INC(ixEthAccDataStats.chainedTxDoneMBufs);	    ptr = IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(ptr);	}	while (ptr != NULL);    }#endif}/* Convert the mbuf header after NPE reception */PRIVATE voidixEthAccMbufFromRxQ(IX_OSAL_MBUF *mbuf){    UINT32 len;    /* endianess swap for tci and flags       note: this is done only once, even for chained buffers */    IX_ETHACC_NE_FLAGS(mbuf)   = IX_OSAL_SWAP_BE_SHARED_SHORT(IX_ETHACC_NE_FLAGS(mbuf));    IX_ETHACC_NE_VLANTCI(mbuf) = IX_OSAL_SWAP_BE_SHARED_SHORT(IX_ETHACC_NE_VLANTCI(mbuf));    /* test for unchained mbufs */    if (IX_ETHACC_NE_NEXT(mbuf) == 0)    {	/* unchained mbufs */	IX_ETH_ACC_STATS_INC(ixEthAccDataStats.unchainedRxMBufs);	/* get the frame length. it is the same than the buffer length */	len = IX_OSAL_SWAP_BE_SHARED_LONG(IX_ETHACC_NE_LEN(mbuf));	len &= IX_ETHNPE_ACC_PKTLENGTH_MASK;	IX_OSAL_MBUF_PKT_LEN(mbuf) = IX_OSAL_MBUF_MLEN(mbuf) = len;        /* clears the next packet field */	IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbuf) = NULL;    }    else    {	IX_OSAL_MBUF *ptr = mbuf;	IX_OSAL_MBUF *nextPtr;	UINT32 frmLen;	/* convert the frame length */	frmLen = IX_OSAL_SWAP_BE_SHARED_LONG(IX_ETHACC_NE_LEN(mbuf));	IX_OSAL_MBUF_PKT_LEN(mbuf) = (frmLen & IX_ETHNPE_ACC_PKTLENGTH_MASK);        /* chained mbufs */	do	{	    IX_ETH_ACC_STATS_INC(ixEthAccDataStats.chainedRxMBufs);	    /* convert the length */	    len = IX_OSAL_SWAP_BE_SHARED_LONG(IX_ETHACC_NE_LEN(ptr));	    IX_OSAL_MBUF_MLEN(ptr) = (len >> IX_ETHNPE_ACC_LENGTH_OFFSET);            /* get the next pointer */ 	    PTR_NPE2VIRT(IX_OSAL_MBUF *,IX_ETHACC_NE_NEXT(ptr), nextPtr);	    if (nextPtr != NULL)	    {		nextPtr = (IX_OSAL_MBUF *)((UINT8 *)nextPtr - offsetof(IX_OSAL_MBUF,ix_ne));	    }	    /* set the next pointer */	    IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(ptr) = nextPtr;	    /* move to the next buffer */	    ptr = nextPtr;	}	while (ptr != NULL);    }}/* write to qmgr if possible and report an overflow if not possible * Use a fast lock to protect the queue write. * This way, the tx feature is reentrant. */PRIVATE IX_STATUSixEthAccQmgrLockTxWrite(IxEthAccPortId portId, UINT32 qBuffer){    IX_STATUS qStatus;    if (ixOsalFastMutexTryLock(&txWriteMutex[portId]) == IX_SUCCESS)    {	qStatus = ixQMgrQWrite(	       IX_ETH_ACC_PORT_TO_TX_Q_ID(portId),	       &qBuffer);#ifndef NDEBUG	if (qStatus != IX_SUCCESS)	{	    TX_STATS_INC(portId, txOverflow);	}#endif	ixOsalFastMutexUnlock(&txWriteMutex[portId]);    }    else    {	TX_STATS_INC(portId, txLock);	qStatus = IX_QMGR_Q_OVERFLOW;    }    return qStatus;}/* write to qmgr if possible and report an overflow if not possible * Use a fast lock to protect the queue write. * This way, the Rx feature is reentrant. */PRIVATE IX_STATUSixEthAccQmgrLockRxWrite(IxEthAccPortId portId, UINT32 qBuffer){    IX_STATUS qStatus;    if (ixOsalFastMutexTryLock(&rxWriteMutex[portId]) == IX_SUCCESS)    {	qStatus = ixQMgrQWrite(	       IX_ETH_ACC_PORT_TO_RX_FREE_Q_ID(portId),	       &qBuffer);#ifndef NDEBUG	if (qStatus != IX_SUCCESS)	{	    RX_STATS_INC(portId, rxFreeOverflow);	}#endif	ixOsalFastMutexUnlock(&rxWriteMutex[portId]);    }    else    {	RX_STATS_INC(portId, rxFreeLock);	qStatus = IX_QMGR_Q_OVERFLOW;    }    return qStatus;}/* * Set the priority and write to a qmgr queue. */PRIVATE IX_STATUSixEthAccQmgrTxWrite(IxEthAccPortId portId, UINT32 qBuffer, UINT32 priority){    /* fill the priority field */    qBuffer |= (priority << IX_ETHNPE_QM_Q_FIELD_PRIOR_R);    return ixEthAccQmgrLockTxWrite(portId, qBuffer);}/** * * @brief This function will discover the highest priority S/W Tx Q that *        has entries in it * * @param portId - (in) the id of the port whose S/W Tx queues are to be searched *        priorityPtr - (out) the priority of the highest priority occupied q will be written *                      here * * @return IX_ETH_ACC_SUCCESS if an occupied Q is found *         IX_ETH_ACC_FAIL if no Q has entries * * @internal */PRIVATE IxEthAccStatusixEthAccTxSwQHighestPriorityGet(IxEthAccPortId portId,				IxEthAccTxPriority *priorityPtr){    if (ixEthAccPortData[portId].ixEthAccTxData.schDiscipline	== FIFO_NO_PRIORITY)    {	if(IX_ETH_ACC_DATAPLANE_IS_Q_EMPTY(ixEthAccPortData[portId].	       ixEthAccTxData.txQ[IX_ETH_ACC_TX_DEFAULT_PRIORITY]))	{	    return IX_ETH_ACC_FAIL;	}	else	{	    *priorityPtr = IX_ETH_ACC_TX_DEFAULT_PRIORITY;	    TX_STATS_INC(portId,txPriority[*priorityPtr]);	    return IX_ETH_ACC_SUCCESS;	}    }    else    {	IxEthAccTxPriority highestPriority = IX_ETH_ACC_TX_PRIORITY_7;	while(1)	{	    if(!IX_ETH_ACC_DATAPLANE_IS_Q_EMPTY(ixEthAccPortData[portId].	       ixEthAccTxData.txQ[highestPriority]))	    {		*priorityPtr = highestPriority;		TX_STATS_INC(portId,txPriority[highestPriority]);		return IX_ETH_ACC_SUCCESS;	    }	    if (highestPriority == IX_ETH_ACC_TX_PRIORITY_0)	    {		return IX_ETH_ACC_FAIL;	    }	    highestPriority--;	}    }}/** * * @brief This function will take a buffer from a TX S/W Q and attempt *        to add it to the relevant TX H/W Q * * @param portId - the port whose TX queue is to be written to *        priority - identifies the queue from which the entry is to be read * * @internal */PRIVATE IxEthAccStatusixEthAccTxFromSwQ(IxEthAccPortId portId,		  IxEthAccTxPriority priority){    IX_OSAL_MBUF        *mbuf;    IX_STATUS	   qStatus;    IX_OSAL_ENSURE((UINT32)priority <= (UINT32)7, "Invalid priority");    IX_ETH_ACC_DATAPLANE_REMOVE_MBUF_FROM_Q_HEAD(	ixEthAccPortData[portId].ixEthAccTxData.txQ[priority],	mbuf);    if (mbuf != NULL)    {	/*	 * Add the Tx buffer to the H/W Tx Q	 * We do not need to flush here as it is already done	 * in TxFrameSubmit().	 */	qStatus = ixEthAccQmgrTxWrite(	      portId,	      IX_OSAL_MMU_VIRT_TO_PHYS((UINT32)IX_ETHACC_NE_SHARED(mbuf)),	      priority);	if (qStatus == IX_SUCCESS)	{	    TX_STATS_INC(portId,txFromSwQOK);	    return IX_SUCCESS;	}	else if (qStatus == IX_QMGR_Q_OVERFLOW)	{	    /*	     * H/W Q overflow, need to save the buffer	     * back on the s/w Q.	     * we must put it back on the head of the q to avoid	     * reordering packet tx	     */	    TX_STATS_INC(portId,txFromSwQDelayed);	    IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_HEAD(		ixEthAccPortData[portId].ixEthAccTxData.txQ[priority],		mbuf);	    /*enable Q notification*/	    qStatus = ixQMgrNotificationEnable(		IX_ETH_ACC_PORT_TO_TX_Q_ID(portId),		IX_ETH_ACC_PORT_TO_TX_Q_SOURCE(portId));            if (qStatus != IX_SUCCESS && qStatus != IX_QMGR_WARNING)            {		TX_INC(portId,txUnexpectedError);		IX_ETH_ACC_FATAL_LOG(	            "ixEthAccTxFromSwQ:Unexpected Error: %u\n",	            qStatus, 0, 0, 0, 0, 0);            }	}	else	{	    TX_INC(portId,txUnexpectedError);	    /* recovery attempt */	    IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_HEAD(		ixEthAccPortData[portId].ixEthAccTxData.txQ[priority],		mbuf);	    IX_ETH_ACC_FATAL_LOG(		"ixEthAccTxFromSwQ:Error: unexpected QM status 0x%08X\n",		qStatus, 0, 0, 0, 0, 0);	}    }    else    {	/* sw queue is empty */    }    return IX_ETH_ACC_FAIL;}/** * * @brief This function will take a buffer from a RXfree S/W Q and attempt *        to add it to the relevant RxFree H/W Q * * @param portId - the port whose RXFree queue is to be written to * * @internal */PRIVATE IxEthAccStatusixEthAccRxFreeFromSwQ(IxEthAccPortId portId){    IX_OSAL_MBUF        *mbuf;    IX_STATUS	   qStatus = IX_SUCCESS;    IX_ETH_ACC_DATAPLANE_REMOVE_MBUF_FROM_Q_HEAD(	  ixEthAccPortData[portId].ixEthAccRxData.freeBufferList,	  mbuf);    if (mbuf != NULL)    {	/*	 * Add The Rx Buffer to the H/W Free buffer Q if possible	 */	qStatus = ixEthAccQmgrLockRxWrite(portId,		  IX_OSAL_MMU_VIRT_TO_PHYS(			 (UINT32)IX_ETHACC_NE_SHARED(mbuf)));	if (qStatus == IX_SUCCESS)	{	    RX_STATS_INC(portId,rxFreeRepFromSwQOK);	    /*	     * Buffer added to h/w Q.	     */	    return IX_SUCCESS;	}	else if (qStatus == IX_QMGR_Q_OVERFLOW)	{	    /*	     * H/W Q overflow, need to save the buffer back on the s/w Q.	     */	    RX_STATS_INC(portId,rxFreeRepFromSwQDelayed);	    IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_HEAD(		   ixEthAccPortData[portId].ixEthAccRxData.freeBufferList,		   mbuf);	}	else	{	    /* unexpected qmgr error */	    RX_INC(portId,rxUnexpectedError);	    IX_ETH_ACC_DATAPLANE_ADD_MBUF_TO_Q_HEAD(		    ixEthAccPortData[portId].ixEthAccRxData.freeBufferList,		    mbuf);	    IX_ETH_ACC_FATAL_LOG("IxEthAccRxFreeFromSwQ:Error: unexpected QM status 0x%08X\n",				 qStatus, 0, 0, 0, 0, 0);	}    }    else    {	/* sw queue is empty */    }    return IX_ETH_ACC_FAIL;}IX_ETH_ACC_PUBLICIxEthAccStatus ixEthAccInitDataPlane(){    UINT32 portId;    /*     * Initialize the service and register callback to other services.     */    IX_ETH_ACC_MEMSET(&ixEthAccDataStats,		      0,		      sizeof(ixEthAccDataStats));    for(portId=0; portId < IX_ETH_ACC_NUMBER_OF_PORTS; portId++)    {	ixOsalFastMutexInit(&txWriteMutex[portId]);	ixOsalFastMutexInit(&rxWriteMutex[portId]);	IX_ETH_ACC_MEMSET(&ixEthAccPortData[portId],			  0,			  sizeof(ixEthAccPortData[portId]));	ixEthAccPortData[portId].ixEthAccTxData.schDiscipline = FIFO_NO_PRIORITY;    }    return (IX_ETH_ACC_SUCCESS);}IX_ETH_ACC_PUBLICIxEthAccStatus ixEthAccPortTxDoneCallbackRegister(IxEthAccPortId portId,						  IxEthAccPortTxDoneCallback						  txCallbackFn,						  UINT32 callbackTag){    if (!IX_ETH_ACC_IS_SERVICE_INITIALIZED())    {	return (IX_ETH_ACC_FAIL);    }    if (!IX_ETH_ACC_IS_PORT_VALID(portId))    {	return (IX_ETH_ACC_INVALID_PORT);    }/* HACK: removing this code to enable NPE-A preliminary testing *    if (IX_ETH_ACC_SUCCESS != ixEthAccSingleEthNpeCheck(portId)) *    { *        IX_ETH_ACC_WARNING_LOG("ixEthAccPortTxDoneCallbackRegister: Unavailable Eth %d: Cannot register TxDone Callback.\n",(INT32)portId,0,0,0,0,0); *        return IX_ETH_ACC_SUCCESS ; *    } */    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }    if (txCallbackFn == 0)	/* Check for null function pointer here. */    {	return (IX_ETH_ACC_INVALID_ARG);    }    ixEthAccPortData[portId].ixEthAccTxData.txBufferDoneCallbackFn = txCallbackFn;    ixEthAccPortData[portId].ixEthAccTxData.txCallbackTag = callbackTag;    return (IX_ETH_ACC_SUCCESS);}IX_ETH_ACC_PUBLICIxEthAccStatus ixEthAccPortRxCallbackRegister(IxEthAccPortId portId,					      IxEthAccPortRxCallback					      rxCallbackFn,					      UINT32 callbackTag){    IxEthAccPortId port;    if (!IX_ETH_ACC_IS_SERVICE_INITIALIZED())    {	return (IX_ETH_ACC_FAIL);    }    if (!IX_ETH_ACC_IS_PORT_VALID(portId))    {	return (IX_ETH_ACC_INVALID_PORT);    }    if (IX_ETH_ACC_SUCCESS != ixEthAccSingleEthNpeCheck(portId))    {        IX_ETH_ACC_WARNING_LOG("ixEthAccPortRxCallbackRegister: Unavailable Eth %d: Cannot register Rx Callback.\n",(INT32)portId,0,0,0,0,0);        return IX_ETH_ACC_SUCCESS ;    }    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }    /* Check for null function pointer here. */    if (rxCallbackFn == NULL)    {	return (IX_ETH_ACC_INVALID_ARG);    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精品久| 亚洲网友自拍偷拍| 一区二区久久久| 日韩av一区二区三区四区| 国产黄人亚洲片| 日韩欧美一卡二卡| 亚洲精品国久久99热| 韩国精品一区二区| 制服丝袜在线91| 亚洲综合另类小说| 成人在线视频一区| 日韩精品中午字幕| 日韩精品三区四区| 日本韩国精品一区二区在线观看| 精品福利二区三区| 免费国产亚洲视频| 欧美人成免费网站| 亚洲最大成人综合| 91麻豆免费观看| 久久―日本道色综合久久| 丝袜美腿亚洲综合| 欧美午夜电影在线播放| 亚洲乱码日产精品bd| 国产成人鲁色资源国产91色综| 91精品中文字幕一区二区三区| 一区二区三区成人| 99国产精品国产精品久久| 久久蜜臀精品av| 激情丁香综合五月| 久久免费看少妇高潮| 国产在线一区观看| 久久九九99视频| 国产大片一区二区| 国产精品全国免费观看高清| 国产一区二区三区久久久| 久久综合九色欧美综合狠狠| 麻豆精品一二三| 日韩欧美一区二区久久婷婷| 精品午夜一区二区三区在线观看| 欧美区在线观看| 蜜桃一区二区三区四区| 日韩一级二级三级| 韩国三级电影一区二区| 久久精品亚洲乱码伦伦中文| 国产91对白在线观看九色| 国产视频一区在线播放| jlzzjlzz亚洲日本少妇| 国产精品国产三级国产普通话三级| 粉嫩在线一区二区三区视频| 国产精品女同一区二区三区| 91在线观看成人| 亚洲午夜精品久久久久久久久| 欧美日韩激情在线| 蜜桃视频在线观看一区| 精品少妇一区二区三区在线播放 | 国产亚洲视频系列| 国产jizzjizz一区二区| **性色生活片久久毛片| 欧美图区在线视频| 蓝色福利精品导航| 国产日本一区二区| 欧美色图激情小说| 91黄色免费版| 日韩和的一区二区| 久久久久久久国产精品影院| 日本韩国欧美国产| 久久91精品国产91久久小草| 国产精品国产自产拍在线| 欧美中文字幕一区二区三区 | 国产不卡高清在线观看视频| 亚洲日本青草视频在线怡红院| 欧美视频在线观看一区| 国产在线精品一区二区三区不卡| 中文字幕av一区 二区| 欧美精品日韩综合在线| 国产成人av电影在线观看| 亚洲精品国产无套在线观| 日韩一级高清毛片| 色www精品视频在线观看| 精品一区二区三区影院在线午夜| 中文字幕色av一区二区三区| 精品日韩一区二区| 欧美色男人天堂| 成人av在线资源| 久久疯狂做爰流白浆xx| 夜夜夜精品看看| 欧美极品少妇xxxxⅹ高跟鞋| 欧美一区中文字幕| 色综合久久久久综合体| 国产精品18久久久久久久久久久久 | 欧美另类一区二区三区| 成人精品免费看| 青青草国产精品97视觉盛宴| 亚洲乱码国产乱码精品精可以看| 久久免费视频色| 欧美岛国在线观看| 91精品国产综合久久久久久 | 国产福利一区在线| 日本成人在线看| 亚洲国产人成综合网站| 国产精品国产a| 久久久噜噜噜久久人人看 | 欧美色手机在线观看| 91免费版在线| 日韩一级视频免费观看在线| 99精品国产视频| 国产成人精品免费看| 国产综合色产在线精品| 久久99在线观看| 免费精品99久久国产综合精品| 亚洲电影一区二区三区| 亚洲另类色综合网站| 国产精品福利一区二区| 国产精品麻豆久久久| 中文字幕欧美日本乱码一线二线| 久久综合狠狠综合久久综合88 | 免费人成网站在线观看欧美高清| 亚洲小少妇裸体bbw| 亚洲最大的成人av| 夜夜揉揉日日人人青青一国产精品| 中文字幕一区二区三区在线不卡 | 五月天一区二区三区| 亚洲大片一区二区三区| 亚洲国产综合91精品麻豆| 亚洲制服丝袜在线| 亚洲一区二区四区蜜桃| 午夜影院久久久| 天天av天天翘天天综合网| 丝袜亚洲另类丝袜在线| 久久99热这里只有精品| 国产一区 二区 三区一级| 国产成人小视频| 97国产一区二区| 欧美日韩国产乱码电影| 日韩视频在线观看一区二区| 亚洲精品在线观看视频| 国产三级欧美三级日产三级99 | 久久久九九九九| 中文字幕av不卡| 亚洲永久免费视频| 蜜臀va亚洲va欧美va天堂| 国产酒店精品激情| 色婷婷国产精品久久包臀| 欧美人狂配大交3d怪物一区 | 国产专区综合网| 91一区二区三区在线播放| 欧美揉bbbbb揉bbbbb| 久久综合久久综合亚洲| 17c精品麻豆一区二区免费| 日韩在线一二三区| 国产精品1024| 欧美日韩一级二级| 国产亚洲一区二区三区在线观看| 亚洲欧美日韩在线| 久久精品噜噜噜成人av农村| 成人av电影在线观看| 欧美日本高清视频在线观看| 国产日韩欧美制服另类| 亚洲女同女同女同女同女同69| 日韩精品福利网| 9久草视频在线视频精品| 3d成人h动漫网站入口| 亚洲欧美在线aaa| 男人的j进女人的j一区| 91视频免费观看| 精品国产不卡一区二区三区| 一区二区三区四区蜜桃| 国产精品99久久久久久宅男| 国产嫩草影院久久久久| 亚洲成人免费视| 99久久久久久| www精品美女久久久tv| 亚洲mv大片欧洲mv大片精品| 成人性生交大片| 久久综合色天天久久综合图片| 亚洲精品视频在线观看免费| 国产精品一区久久久久| 日韩欧美成人午夜| 亚洲国产婷婷综合在线精品| 不卡一区二区三区四区| 精品久久五月天| 日韩av高清在线观看| 在线这里只有精品| 中文字幕一区二区三区乱码在线| 经典三级在线一区| 日韩一区二区不卡| 亚洲国产综合在线| 午夜精品福利一区二区蜜股av| 久久久久久亚洲综合影院红桃| 欧美高清你懂得| 51精品视频一区二区三区| 一区二区三区国产| 亚洲午夜三级在线| 99精品久久久久久| 国产精品成人在线观看| 成人动漫在线一区| 国产精品乱码妇女bbbb| 国产大陆精品国产| 中文字幕欧美激情一区| 不卡电影免费在线播放一区|