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

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

?? gei82543rcvsnd.c

?? intel 82543 千兆網卡 vxworks驅動源碼
?? C
字號:


#include "gei82543Lib.h"

LOCAL void      gei82543RxDesUpdate         (END_DEVICE *);
extern void * sysVirtToPhys(void *virtAddr);
#define GEI_CAPACITY_LIMIT 5
/*************************************************************************
*
* gei82543RxDesUpdate - clean up the receive descriptor
*
* This routine cleans up receive descriptors, reusing the current cluster.
* Then it updates the tail pointer to make it available to the
* hardware.
*
* RETURNS: N/A
*/

LOCAL void gei82543RxDesUpdate
    (
    END_DEVICE *    pDrvCtrl    /* device to update  */
    )
{
    int         tempTail;        /* temporary tail index */
    char *      pRxDesc;     /* RX descriptor */
    int         tail;
    DRV_LOG (DRV_DEBUG_RX, "gei82543RxDesUpdate...\n", 1, 2, 3, 4, 5, 6);

    /* get the RX tail descriptor */
    tempTail = pDrvCtrl->rxDescTail;
    pRxDesc = GEI_GET_RX_DESC_ADDR(tempTail);

    /* clean up status field */
    GEI_WRITE_DESC_BYTE(pRxDesc,RXDESC_STATUS_OFFSET, 0);

    /* update the tail pointer */
    tail = tempTail + 1;
    if (tail == pDrvCtrl->rxDescNum)
    {
        tail = 0;
    }
    pDrvCtrl->rxDescTail = tail;


    /* kick this descriptor for receiving packet */
    GEI_WRITE_REG(INTEL_82543GC_RDT, (UINT32)tempTail);

    CACHE_PIPE_FLUSH();/*lint !e522*/

    DRV_LOG (DRV_DEBUG_RX, "gei82543RxDesUpdate...Done\n",
                            1, 2, 3, 4, 5, 6);
    return;
}

STATUS gei82543Recv
    (
    END_DEVICE *    pDrvCtrl,    /* device structure */
    char *          pRxDesc,     /* pointer to RX descriptor */
    UINT8           rxdStat      /* RX descriptor status */
    )
 {
    UINT16                len;              /* len of packet received */
    UINT8                 rxdErr;           /* RX descriptor Error field */
    UINT8                 csumErr;          /* RX descriptor Error field */
    int             tempTail;
    UINT32            tmpAddr;
    UINT32          globalPort=0;
    char *          pBuf;
    char *          pNewData ;
    void *          pkt;
    int             tail;

    DRV_LOG (DRV_DEBUG_RX, "gei82543Recv start...\n",  1, 2, 3, 4, 5, 6);

    /* check packet status */
    if (!(rxdStat & RXD_STAT_EOP))
    {
        DRV_CHG_CNT(pDrvCtrl->noPacketEOP,1);
        DRV_LOG (DRV_DEBUG_RX, "Packet EOP not set\n", 1, 2, 3, 4, 5, 6);

        LOGMSG("Packet EOP not set \n",1,2,3,4,5,6);

        goto receiveError;
    }

    csumErr = GEI_READ_DESC_BYTE(pRxDesc, RXDESC_ERROR_OFFSET);
    rxdErr = csumErr & ~(RXD_ERROR_IPE | RXD_ERROR_TCPE | RXD_ERROR_RSV);

    if (rxdErr != 0)
    {
        DRV_CHG_CNT(pDrvCtrl->errPacketNum,1);
        DRV_LOG (DRV_DEBUG_RX, "Packet Error 0x%x\n", rxdErr, 2, 3, 4, 5, 6);
        LOGMSG("Packet error 0x%x \n",rxdErr, 2, 3, 4, 5, 6);
        goto receiveError;
     }

    /* get packet length */
    GEI_READ_DESC_WORD(pRxDesc, RXDESC_LENGTH_OFFSET, len);

    if(len < MIN_ETHER_PACKET_SIZE)
    {
        DRV_LOG (DRV_DEBUG_RX, ("invalid packet length=0x%x!\n"), len,
                                 0, 0, 0, 0, 0);
        goto receiveError;
    }
    DRV_CHG_CNT(pDrvCtrl->rxPacketNum,1);

    pNewData = (char *)endPktAlloc();
    if ((char*)NULL == pNewData)
    {
        DRV_LOG (DRV_DEBUG_RX, ("Cannot malloc EndBuf for RX!\n"), 0,
                                 0, 0, 0, 0, 0);
        DRV_CHG_CNT(pDrvCtrl->noEndBuf,1);
        goto receiveError;
    }
    else
    {
        DRV_CHG_CNT(pDrvCtrl->rxPktAlloc1Num,1);   
    }

    if ( NULL== pDrvCtrl->drvObj.net)
    {
        globalPort = Ros_GlobalPort(pDrvCtrl->drvObj.slot, 1, 0);
        if(NULL==(pDrvCtrl->drvObj.net = (void *)if_search(globalPort)))
        {
            DRV_CHG_CNT(pDrvCtrl->searchNetErr,1);
            endPktFree(pNewData);
            return ERROR;
        }

    }
    /*get the end buffer address from pEndBufForRx[],not from the 
    GEI_READ_DESC_LONG(pRxDesc, RXDESC_BUFADRLOW_OFFSET, rxBufAddr);
      the rxBufAddr may be wrong after several shut/no shut operations
    GEI_READ_DESC_LONG(pRxDesc, RXDESC_BUFADRLOW_OFFSET, rxBufAddr);
    pBufAddr = (char *)rxBufAddr;*/

    pBuf = pDrvCtrl->pEndBufForRx[pDrvCtrl->rxDescTail];
    /*view the content of the packets*/
    drv_DebugRcvSndPkt(globalPort, (char *)pBuf, len, RX_DIRECTION);

    END_BUF_GET_PKT(pBuf,pkt);/*lint !e63*/
    etherPktProcess(pkt, pBuf, pDrvCtrl->drvObj.net, len);

    /*
     * Pre-invalidate new cluster before handing to hardware to avoid
     * later cache-line write-back of dirty lines, which could overwrite
     * received data. [This is especially important when using RX checksum
     * offload.] Unfortunately, this requires that we invalidate
     * the whole cluster rather than just the received portion.
     */
     tmpAddr= (UINT32)sysVirtToPhys(pNewData);
    GEI_WRITE_DESC_LONG(pRxDesc, RXDESC_BUFADRLOW_OFFSET,tmpAddr);

    /*put the new buffer address in pEndBufForRx[]*/
    pDrvCtrl->pEndBufForRx[pDrvCtrl->rxDescTail] = (char *)tmpAddr;

    tempTail = pDrvCtrl->rxDescTail;
    tail = tempTail + 1;
    if (tail == pDrvCtrl->rxDescNum)
    {
        tail = 0;
    }
    pDrvCtrl->rxDescTail = tail;

    /* kick this descriptor for receiving packet */
    GEI_WRITE_REG(INTEL_82543GC_RDT, (UINT32)tempTail);

    CACHE_PIPE_FLUSH ();  /*lint !e522*/

    /* clean up status field */
    GEI_WRITE_DESC_BYTE(pRxDesc,RXDESC_STATUS_OFFSET, 0);

    DRV_LOG (DRV_DEBUG_RX, "Receive done!\n", 1, 2, 3, 4, 5, 6);

    return OK;

receiveError:
    gei82543RxDesUpdate (pDrvCtrl);   /*lint !e961*/

    if (pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
    {
        pDrvCtrl->rxPacketDrvErr++;
    }

    DRV_LOG (DRV_DEBUG_RX, "Receive ERROR!\n", 1, 2, 3, 4, 5, 6);

    return ERROR;
 }




/*************************************************************************
*
* gei82543EndSend - driver send routine
*
* RETURNS: OK or ERROR.*/

STATUS drv_gei82543EndSend(UINT32  gPort, char *pBuf, int pktSize,char *pData)
{
    int slotNum;
    STATUS rc = OK;

    UINT32 tmpAddr; 
    INTEL82543_TX_DES *    pDesc = (INTEL82543_TX_DES *)NULL;
    END_DEVICE *pDrvCtrl = (END_DEVICE *)NULL;
    int             tmpTail;

    DRV_LOG (DRV_DEBUG_TX, "gei82543EndSend...\n", 1, 2, 3, 4, 5, 6);
    slotNum = Ros_LocalPanel(gPort);
    pDrvCtrl = geiEndDevice[slotNum];

    if ((slotNum < 1) || (slotNum > MAX_IF_CARD_NUM) ||
      ((char *)NULL == pBuf) || ((char *)NULL == pData) ||
      ((END_DEVICE *)NULL == pDrvCtrl))
    {
        return ERROR;
    }

    IF_DRV_TX_SEM_TAKE (&pDrvCtrl->drvObj, WAIT_FOREVER);

    /* check device start flag */
    if (pDrvCtrl->devStartFlag != TRUE)
    {
        DRV_LOG (DRV_DEBUG_TX, 
            "drv_gei82543EndSend:Driver has not been started!\n", 
            1, 2,3, 4, 5, 6);
        IF_DRV_TX_SEM_GIVE(&pDrvCtrl->drvObj);
        return ERROR;
    }

    DRV_CHG_CNT(pDrvCtrl->txIntCount,1);

    /*get the current transmit descriptor*/
    pDesc = (INTEL82543_TX_DES *)GEI_GET_TX_DESC_ADDR(pDrvCtrl->txDescTail);

    if (TXD_STAT_DD == (pDesc->TxStatus & TXD_STAT_DD))
    {
        /*empty current DESC which packet have been sent out by MAC controller.*/
        if ((char *)NULL != pDrvCtrl->pEndBufForMng[pDrvCtrl->txDescTail])
        {
            DRV_LOG (DRV_DEBUG_TX, "gei82543EndSend...Free TxBD!\n", 1, 2, 3, 4, 5, 6);
            /*must free pData*/
            endPktFree(pDrvCtrl->pEndBufForMng[pDrvCtrl->txDescTail]);
            pDrvCtrl->pEndBufForMng[pDrvCtrl->txDescTail]=NULL;
        }

        /*view the content of the packets*/
        drv_DebugRcvSndPkt(gPort, (char *)pBuf, pktSize, TX_DIRECTION);
        pDrvCtrl->pEndBufForMng[pDrvCtrl->txDescTail] = pData;

        /*set the properity of the sending buffer*/
        pDesc->TxpktLen = Drv_Swap16((UINT16)pktSize);
        tmpAddr	=(UINT32)sysVirtToPhys((void*)pBuf);
        pDesc->pTxBufferLow = (char*)Drv_Swap32(tmpAddr);
        pDesc->TxCmd = TXD_CMD_RS | TXD_CMD_EOP | TXD_CMD_IFCS |TXD_CMD_IDE;
        pDesc->TxStatus  = 0;

        GEI_GET_TX_DESC_TAIL_UPDATE(tmpTail, 1);

        pDrvCtrl->txDescFreeNum --;
        if(0==pDrvCtrl->txDescFreeNum)
        {
            pDrvCtrl->txDescFreeNum=GEI_DEFAULT_TXDES_NUM-1;
        }

        CACHE_PIPE_FLUSH();  /*lint !e522*/

        GEI_WRITE_REG(INTEL_82543GC_TDT, (UINT32)tmpTail);

        pDrvCtrl->txDescTail = tmpTail;

        DRV_LOG (DRV_DEBUG_TX, "gei82543EndSend...done\n",
                                 1, 2, 3, 4, 5, 6);
    }
    else
    {
        DRV_LOG (DRV_DEBUG_TX, "gei82543EndSend...No TxBD OK!\n", 1, 2, 3, 4, 5, 6);
        DRV_CHG_CNT(pDrvCtrl->txBDNotOK,1);

        rc = ERROR;
    }
    DRV_CHG_CNT(pDrvCtrl->txPacketNum,1);
    IF_DRV_TX_SEM_GIVE(&pDrvCtrl->drvObj);
    return (rc);

}

int drv_MgeoCapacity(UINT32  gPort)
{
    signed int              distance;
    int                     tmpTail;
    INTEL82543_TX_DES *   pDesc; /* pointer to descriptor */
    END_DEVICE *pDrvCtrl;
    int slotNum;
    slotNum = Ros_LocalPanel(gPort);
    pDrvCtrl = geiEndDevice[slotNum];
	
    if ((slotNum < 1) || (slotNum > MAX_IF_CARD_NUM) ||
      ((END_DEVICE *)NULL == pDrvCtrl))
    {
        return ERROR;
    }

    DRV_LOG (DRV_DEBUG_TX, ("drv_MgeoCapacity...\n"), 1, 2, 3, 4, 5, 6);
    IF_DRV_TX_SEM_TAKE (&pDrvCtrl->drvObj, WAIT_FOREVER);

    /*make sure the driver is running*/
    if (pDrvCtrl->devStartFlag == FALSE)
    {
        DRV_LOG (DRV_DEBUG_TX, ("MGEO driver is not running...\n"), 1, 2, 3, 4, 5, 6);
        IF_DRV_TX_SEM_GIVE(&(pDrvCtrl->drvObj));
        return (0);
    }

    distance = 0;
    tmpTail = pDrvCtrl->txDescTail + 1;

    while(distance < GEI_CAPACITY_LIMIT + 1)/*just find 5 available txbds*/
    {
        if (tmpTail >= pDrvCtrl->txDescNum)
        {
            tmpTail = 0;
        }

	 /*get the  descriptor to be checked*/
        pDesc = (INTEL82543_TX_DES *) GEI_GET_TX_DESC_ADDR(tmpTail);

	 /*check the bd's DD bit to detemine the txbd whether it is available*/
        if (TXD_STAT_DD !=(pDesc->TxStatus & TXD_STAT_DD))
        {
            DRV_LOG (DRV_DEBUG_TX, ("TXBD is not OK...\n"), 1, 2, 3, 4, 5, 6); 
            IF_DRV_TX_SEM_GIVE(&pDrvCtrl->drvObj);
            return distance - 1;
        }
        distance++;
        tmpTail++;
    }

    DRV_LOG (DRV_DEBUG_TX, "drv_MgeoCapacity...done\n",1, 2, 3, 4, 5, 6);
    IF_DRV_TX_SEM_GIVE(&(pDrvCtrl->drvObj));

    return distance - 1;   
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区小说| 国产精品一区二区不卡| 美女视频黄频大全不卡视频在线播放| 日韩电影免费一区| 色琪琪一区二区三区亚洲区| 精品国产一区二区三区不卡| 亚洲美女视频一区| 成人午夜伦理影院| 欧美一区二区视频在线观看2022| 国产精品福利一区二区| 国内欧美视频一区二区| 欧美日韩一区不卡| 亚洲精品国产无天堂网2021| 国产精品小仙女| 日韩欧美123| 亚洲午夜久久久久中文字幕久| 成人性视频免费网站| 精品久久人人做人人爰| 午夜欧美在线一二页| 色综合久久中文字幕| 欧美激情在线观看视频免费| 狠狠色丁香婷综合久久| 欧美一区二区三区不卡| 午夜精品一区二区三区免费视频 | 国产乱子轮精品视频| 欧美日韩免费一区二区三区视频| 国产精品美女一区二区三区| 国v精品久久久网| xf在线a精品一区二区视频网站| 日韩福利视频网| 91精品国产品国语在线不卡| 亚洲第一主播视频| 欧美电影一区二区三区| 加勒比av一区二区| 欧美成人精品福利| 精品一区二区在线免费观看| 日韩精品一区二区三区蜜臀| 激情综合网天天干| 国产亚洲欧美色| 国产精品888| 国产精品午夜久久| 91社区在线播放| 亚洲国产欧美日韩另类综合| 精品视频一区二区不卡| 日本美女一区二区| 精品三级在线看| 国产精品亚洲午夜一区二区三区| 欧美韩日一区二区三区四区| 97se亚洲国产综合在线| 亚洲国产精品一区二区www在线 | 欧美一区三区二区| 蜜桃视频在线观看一区| 2019国产精品| 9i在线看片成人免费| 亚洲国产人成综合网站| 日韩欧美国产三级电影视频| 国产尤物一区二区| 亚洲精品中文字幕乱码三区| 精品视频在线视频| 国产在线视频不卡二| 亚洲婷婷国产精品电影人久久| 欧美在线高清视频| 国产一区在线观看视频| 日韩美女视频一区二区| 欧美一区二区三区四区高清| 高清不卡一二三区| 午夜精品久久久久久久久| 26uuu另类欧美亚洲曰本| 色综合久久久网| 久久99国产精品免费网站| 国产精品传媒入口麻豆| 欧美一区二区三区在线看| 成人午夜又粗又硬又大| 亚洲va欧美va天堂v国产综合| 久久蜜桃一区二区| 欧美日韩亚洲综合一区二区三区| 国产高清在线精品| 视频一区二区三区入口| 国产精品久久久久影院色老大| 欧美日韩精品欧美日韩精品一 | www.在线欧美| 喷水一区二区三区| 亚洲色图视频网| 欧美电视剧在线看免费| 欧洲一区二区三区在线| 国产精品夜夜爽| 日韩国产高清在线| 亚洲三级电影网站| 国产嫩草影院久久久久| 欧美一级在线观看| 欧美中文字幕久久| 99在线精品一区二区三区| 韩国精品一区二区| 午夜激情一区二区三区| 国产精品看片你懂得| 亚洲精品一线二线三线| 欧美日韩国产色站一区二区三区| 成人动漫视频在线| 国产乱码精品一区二区三区忘忧草| 亚洲444eee在线观看| 亚洲美女免费在线| 国产精品热久久久久夜色精品三区 | 欧美精品一区二区三| 在线不卡免费欧美| 欧美日韩一卡二卡三卡| 色婷婷久久久亚洲一区二区三区| 国产成人自拍在线| 粉嫩嫩av羞羞动漫久久久| 激情久久五月天| 久久精品免费观看| 蜜桃久久久久久| 青娱乐精品在线视频| 视频一区二区欧美| 日韩一区精品字幕| 日韩精品乱码免费| 久久99国产精品尤物| 久久99精品久久久久| 精品中文字幕一区二区| 精品亚洲aⅴ乱码一区二区三区| 免费成人深夜小野草| 免费成人在线观看| 国产一区二区三区四区在线观看| 激情五月播播久久久精品| 国产精品18久久久久久久久| 国产麻豆9l精品三级站| 成人午夜视频福利| 91丨porny丨国产| 欧美无砖砖区免费| 欧美一级久久久久久久大片| 精品日产卡一卡二卡麻豆| 久久影院视频免费| 国产精品超碰97尤物18| 亚洲美女偷拍久久| 调教+趴+乳夹+国产+精品| 免费观看一级欧美片| 国产一二三精品| 99精品视频在线观看免费| 91久久精品一区二区| 69精品人人人人| 久久久久久一二三区| 亚洲视频图片小说| 日韩电影免费在线看| 国产剧情一区在线| 91久久国产最好的精华液| 91精品国产欧美日韩| 欧美国产国产综合| 亚洲二区在线观看| 国产自产视频一区二区三区| 99久久久精品免费观看国产蜜| 欧美精品色一区二区三区| 久久精品一区二区三区四区| 亚洲一区二区三区在线播放| 精品夜夜嗨av一区二区三区| 色综合一区二区三区| 日韩精品一区二区在线| 国产精品国产三级国产aⅴ原创 | 国产丝袜欧美中文另类| 亚洲乱码日产精品bd| 精品一区免费av| 色一情一伦一子一伦一区| 欧美成人精品3d动漫h| 亚洲欧美偷拍卡通变态| 九色|91porny| 欧美三级中文字幕在线观看| 久久男人中文字幕资源站| 亚洲成a人片综合在线| 成人高清视频在线| 日韩视频一区二区三区在线播放 | 欧美一区午夜精品| 亚洲女同一区二区| 国产老妇另类xxxxx| 777精品伊人久久久久大香线蕉| 中文字幕的久久| 久久精品噜噜噜成人av农村| 色噜噜狠狠成人中文综合| 欧美国产精品一区二区| 99精品国产视频| 欧美成人r级一区二区三区| 亚洲主播在线播放| 99精品欧美一区| 国产欧美日韩精品a在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 91国产成人在线| 日韩毛片一二三区| 成人蜜臀av电影| 久久麻豆一区二区| 精品一区二区三区香蕉蜜桃| 欧美精品丝袜中出| 亚洲成人免费看| 色久综合一二码| 亚洲免费观看高清完整| 波多野结衣在线一区| 欧美国产亚洲另类动漫| 国产精品1区2区3区| 久久色在线观看| 国产乱码精品一区二区三区av| 久久综合九色综合欧美就去吻| 麻豆成人av在线| 久久一区二区三区四区| 国产麻豆一精品一av一免费 |