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

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

?? csend.c

?? VxWorks系統CS網卡END驅動(源碼).zip
?? C
?? 第 1 頁 / 共 5 頁
字號:

   /* Initialize frame pointer and data port address */
   pFrame = pCS->pPacketPage;
   pFrame += (PKTPG_TX_FRAME/2);
   TxDataPort = pCS->IOAddr + PORT_RXTX_DATA;

   HaveExtraByte = FALSE;  /* Start out with no extra byte */

   /* Process the chain of mbufs */
   for ( pMbuf=pMbufChain; pMbuf!=NULL; pMbuf=pMbuf->mBlkHdr.mNext )
   {
      /* Setup starting pointer and length */
      pStart = pMbuf->mBlkHdr.mData;
      Length = pMbuf->mBlkHdr.mLen;

#ifdef ALIGMENT_32BIT
      /* if the mbuf payload starts on an odd address boundary */
      if( (UINT32)pStart & 0x01 )
      {
         /* If there is an extra byte left over from the previous mbuf */
         if ( HaveExtraByte )
         {
            /* Add the first byte from this mbuf to make a word */
            Straddle.byte[1] = *pStart;
 
            /* Write the word which straddles the mbufs to the chip */
            if ( pCS->InMemoryMode )
            {
#if CPU_FAMILY == ARM 
               SYS_ENET_OUT_WORD(pFrame++, Straddle.word);
#else
               *pFrame++ = Straddle.word;
#endif
            }
            else
               SYS_ENET_OUT_WORD( TxDataPort, Straddle.word );
 
            /* Adjust starting pointer and length */
            pStart++;
            Length--;

            HaveExtraByte = FALSE;
         }
         else
         {
            while( Length>=2 )
            {
               /* fetch 16 bits, 8 bits at a time */
               Straddle.byte[0] = *(UCHAR *)pStart++;
               Straddle.byte[1] = *(UCHAR *)pStart++;
    
               /* Write the word which straddles the mbufs to the chip */
               if ( pCS->InMemoryMode )
               {
#if CPU_FAMILY == ARM 
               SYS_ENET_OUT_WORD(pFrame++, Straddle.word);
#else
               *pFrame++ = Straddle.word;
#endif
              }
               else
                  SYS_ENET_OUT_WORD( TxDataPort, Straddle.word );
    
               Length -= 2;
            }
         }
      }

#endif
      /* If there is an extra byte left over from the previous mbuf */
      if ( HaveExtraByte )
      {
         /* Add the first byte from this mbuf to make a word */
         Straddle.byte[1] = *pStart;

         /* Write the word which straddles the mbufs to the chip */
         if ( pCS->InMemoryMode )
         {
#if CPU_FAMILY == ARM 
               SYS_ENET_OUT_WORD(pFrame++, Straddle.word);
#else
               *pFrame++ = Straddle.word;
#endif
         }
         else
            SYS_ENET_OUT_WORD( TxDataPort, Straddle.word );
   
         /* Adjust starting pointer and length */
         pStart++;
         Length--;

#ifdef ALIGMENT_32BIT
         while( Length>=2 )
         {
            /* fetch 16 bits, 8 bits at a time */
            Straddle.byte[0] = *(UCHAR *)pStart++;
            Straddle.byte[1] = *(UCHAR *)pStart++;
 
            /* Write the word which straddles the mbufs to the chip */
            if ( pCS->InMemoryMode )
            {
#if CPU_FAMILY == ARM 
               SYS_ENET_OUT_WORD(pFrame++, Straddle.word);
#else
               *pFrame++ = Straddle.word;
#endif
            }
            else
               SYS_ENET_OUT_WORD( TxDataPort, Straddle.word );

            Length -= 2;
         }
#endif
      }

      /* Point pBuff to the correct starting point */
      pBuff = (USHORT *)pStart;

      /* If there are odd bytes remaining in the mbuf */
      if ( Length & 1 )
      {
         HaveExtraByte = TRUE;

         /* Point pBuffLimit to the extra byte */
         pBuffLimit = (USHORT *)(pStart+Length-1);
      }
      else  /* There is an even number of bytes remaining */
      {
         HaveExtraByte = FALSE;

         /* Point pBuffLimit to just beyond the last word */
         pBuffLimit = (USHORT *)(pStart+Length);
      }

      /* Copy the words in the mbuf to the chip */
      if ( pCS->InMemoryMode )
      {
         while ( pBuff < pBuffLimit ) 
         {
#if CPU_FAMILY == ARM 
               SYS_ENET_OUT_WORD(pFrame++, *pBuff++);
#else
                         *pFrame++ = *pBuff++;
#endif
         }
      }
      else
      {
         while ( pBuff < pBuffLimit ) 
               SYS_ENET_OUT_WORD(TxDataPort, *pBuff++);
      }

      /* If there is an extra byte left over in this mbuf */
      if ( HaveExtraByte )
      {
         /* Save the extra byte for later */
         Straddle.byte[0] = *(UCHAR *)pBuff;
      }

   } /* end Process the chain of mbufs */

   /* If there is an extra byte left over from the last mbuf */
   if ( HaveExtraByte )
   {
      /* Add a zero byte to make a word */
      Straddle.byte[1] = 0;

      /* Write the last word to the chip */
      if ( pCS->InMemoryMode )
      {
#if CPU_FAMILY == ARM 
               SYS_ENET_OUT_WORD(pFrame++, Straddle.word);
#else
               *pFrame++ = Straddle.word;
#endif
      }
      else
         SYS_ENET_OUT_WORD( TxDataPort, Straddle.word );
   }
}






/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
 * Receive-related Routines                                                *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */


/*******************************************************************************
*
* csCopyRxFrame -
*
* This routine copies a received frame from the chip to a receive buffer.
*
*/

LOCAL int csCopyRxFrame( CS_END_DEVICE *pCS, char *pRxBuff )
{
   FAST USHORT *pFrame;
   FAST USHORT *pBuff;
   FAST USHORT *pBuffLimit;
   FAST int RxDataPort;
   USHORT RxLength, RxStatus;
   int test_int;

   /* Initialize the frame pointer and data port address */
   pFrame =  pCS->pPacketPage;
   pFrame += (PKTPG_RX_LENGTH/2);
   RxDataPort = pCS->IOAddr + PORT_RXTX_DATA;

   /* Get the length of the received frame */
   if ( pCS->InMemoryMode )
   {
#if CPU_FAMILY == ARM
      RxLength = SYS_ENET_IN_WORD(pFrame++);
#else
      RxLength = *pFrame++;
#endif
      RxLength = BYTE_SWAP( RxLength );
   }
   else  /* In IO mode */
   {
      RxStatus = SYS_ENET_IN_WORD( RxDataPort );  /* Discard RxStatus */
      RxLength = SYS_ENET_IN_WORD( RxDataPort );
      RxLength = BYTE_SWAP( RxLength );
   }


   /* Setup pointers to the buffer for copying */
   pBuff = (USHORT *)pRxBuff;
   test_int = (int) pBuff;
   if ((test_int % 2) != 0)
   {
      LOGMSG("receive buffer not on half word boundary: %x\n", (int)pBuff,0,0,0,0,0);
   }
   pBuffLimit  = pBuff;
   pBuffLimit += ((RxLength+1)/2);

   /* Copy the frame from the chip to the buffer */
   if ( pCS->InMemoryMode )
   {
      while ( pBuff < pBuffLimit ) 
#if CPU_FAMILY == ARM
         *pBuff++ = SYS_ENET_IN_WORD(pFrame++);
#else
         *pBuff++ = *pFrame++;
#endif
   }
   else
   {
      while ( pBuff < pBuffLimit ) 
         *pBuff++ = SYS_ENET_IN_WORD( RxDataPort );
   }

   return (RxLength);
}


/*******************************************************************************
*
* csProcessReceive -
*
* This routine processes a received packet.  The received packet was copied to
* a receive buffer at interrupt time and this routine processses the receive
* buffer at task time via netTask().
*
* The packet is copied to an mbuf chain.  The mbuf chain is then
* passed up to the protocol stack.
*
*/
LOCAL void csProcessReceive( CS_END_DEVICE *pCS, M_BLK_ID pMBuff )
{

   /* Spl = splnet( );*/
   
        /* Update the MIB2 Static */
    END_ERR_ADD (&pCS->end, MIB2_IN_UCAST, +1);

   /* Pass the mbuf chain up to the protocol stack */
    /* Call the upper layer's receive routine. */
    END_RCV_RTN_CALL(&pCS->end, pMBuff);
   /* splx( Spl ); */
}



/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
 * Misc. Routines                                                          *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */



/*******************************************************************************
* csInitQueue -
*
* Initializes an array-implemented circular queue.
*
* RETURNS: Nothing.
*
*/
LOCAL void csInitQueue( CIR_QUEUE *Q )
{
   Q->Head = Q->Tail = 0;
}



/*******************************************************************************
* csQueueEmpty -
*
* Checks the queue's status.
*
* RETURNS: TRUE if queue is empty, FALSE if queue is not empty.
*
*/

LOCAL BOOL csQueueEmpty( CIR_QUEUE *Q )
{
   if( Q->Head == Q->Tail )
      return TRUE;  /* Queue is empty */
   else
      return FALSE;
}




/*******************************************************************************
* csDequeue -
*
* This routine removes a pointer to a value from the end off an 
* array-implemented circular queue.  Assumes the queue is not empty.
*
* RETURNS: Pointer to the dequeued value.
*
*/
LOCAL void *csDequeue( CIR_QUEUE *Q )
{
   FAST void  *Element;

   Element = Q->Queue[Q->Head];
   Q->Head = (Q->Head == CS_QUEUE_SIZE) ? 0 : (Q->Head + 1);
   return Element;

}



/*******************************************************************************
* csEnqueue -
*
* This routine adds a pointer to a value to the front of an array-implmented
* circular queue.
*
* RETURNS: OK, or ERROR if the enqueue would cause a queue overflow.
*
*/
LOCAL STATUS csEnqueue( CIR_QUEUE *Q, void *pBuff )
{
   /* If queue is full return ERROR */
   if ( Q->Tail == ((Q->Head == 0) ? CS_QUEUE_SIZE : (Q->Head -1)) )
   {
      LOGMSG("csEnqueue: CS_END_DEVICE %d, Queue Overflow\n",
         0,0,0,0,0,0 );
      return ERROR;    /* Queue overflow */
   }

   /* Else, add data to the queue and return OK */
   Q->Queue[Q->Tail] = pBuff;
   Q->Tail = (Q->Tail == CS_QUEUE_SIZE) ? 0 : (Q->Tail + 1);

   return OK;
}



/*******************************************************************************
*
* csInitChip -
*
* This routine uses the instance global variables in the CS_END_DEVICE structure to
* initialize the CS8900.
*
*/

LOCAL void csInitChip( CS_END_DEVICE *pCS )
{
   PIA    pIA;
   USHORT RxCtl;
   int i;

   /* Configure the adapter for board-specific IO and media type support */
   sysEnetHWInit( pCS );

   /* Initialize the config and control registers */
   csWritePacketPage( pCS, PKTPG_RX_CFG, RX_CFG_ALL_IE );
   csWritePacketPage( pCS, PKTPG_RX_CTL,
         (RX_CTL_RX_OK_A|RX_CTL_IND_A|RX_CTL_BCAST_A|RX_CTL_MCAST_A));
   csWritePacketPage( pCS, PKTPG_TX_CFG, TX_CFG_ALL_IE );
   csWritePacketPage( pCS, PKTPG_BUF_CFG, BUF_CFG_ALL_IE ); 

   /* Put Ethernet address into the Individual Address register */
   pIA = (PIA)pCS->enetAddr;
   csWritePacketPage( pCS, PKTPG_IND_ADDR,   pIA->word[0] );
   csWritePacketPage( pCS, PKTPG_IND_ADDR+2, pIA->word[1] );
   csWritePacketPage( pCS, PKTPG_IND_ADDR+4, pIA->word[2] );

   /* Set the interrupt level in the chip */
   if ( pCS->IntLevel == 5 )
      csWritePacketPage( pCS, PKTPG_INT_NUM, BYTE_SWAP(3) );
   else
      csWritePacketPage( pCS, PKTPG_INT_NUM, BYTE_SWAP( (pCS->IntLevel)-10 ) );

   /* @kml If need to enable the promiscuous mode */
   if ( pCS->ConfigFlags & CFGFLG_PROMISC_MODE ) {
          RxCtl=csRe

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人久久精品77777最新版本| 国产夜色精品一区二区av| 亚洲香蕉伊在人在线观| 91原创在线视频| 日韩美女久久久| 99精品欧美一区二区三区小说| 国产精品久久久久久久久快鸭 | 免费在线观看视频一区| 久久综合九色综合欧美98| 日韩欧美美女一区二区三区| 欧美激情一区二区三区全黄| 午夜影院久久久| 免费成人你懂的| 亚洲精品视频免费看| 国产99久久久国产精品潘金| 日韩一区和二区| 夜夜夜精品看看| 欧美成人性福生活免费看| 久久电影网电视剧免费观看| 欧美电影免费观看高清完整版在 | 91蜜桃网址入口| 欧美一区二区久久| 国产成人av电影在线| 欧美高清一级片在线观看| 欧美狂野另类xxxxoooo| 精品一区二区在线视频| 欧美一区二区私人影院日本| 欧美视频你懂的| 亚洲色图19p| 欧美精品xxxxbbbb| 日韩精品电影在线观看| 中文字幕乱码亚洲精品一区| 91网站黄www| 亚洲女子a中天字幕| 99视频热这里只有精品免费| 国产亚洲欧美激情| av激情综合网| 亚洲大片免费看| 婷婷国产在线综合| 欧美videos中文字幕| 亚洲天堂成人在线观看| 欧美无砖砖区免费| 日本中文字幕一区二区视频| 久久久久久影视| 国产成人午夜99999| 精品亚洲国内自在自线福利| 日本成人在线电影网| 亚洲综合色区另类av| 中文字幕视频一区| 精品三级在线看| 精品少妇一区二区三区日产乱码| 欧美一区二区三区色| 在线成人免费视频| 制服丝袜亚洲网站| 91麻豆精品国产自产在线| 欧美精品v国产精品v日韩精品 | 日韩欧美一级在线播放| 91麻豆精品国产自产在线观看一区| 欧美日韩日日摸| 欧美性感一区二区三区| 欧美午夜影院一区| 欧美日韩国产高清一区二区三区 | 国产成人av在线影院| 国内精品久久久久影院一蜜桃| 美女视频网站黄色亚洲| 青青草国产精品97视觉盛宴| 久久精品国产99国产精品| 午夜欧美在线一二页| 丝瓜av网站精品一区二区| 欧美日韩国产在线播放网站| 亚洲午夜视频在线| 亚洲品质自拍视频网站| 欧美一区二区私人影院日本| 久久精品国产999大香线蕉| 欧美日韩视频在线第一区 | 亚洲成人一区在线| 欧美一级在线免费| 欧美一卡二卡三卡| 91色综合久久久久婷婷| 国产麻豆一精品一av一免费| 亚洲精品日日夜夜| 欧美激情一区二区在线| 欧美日韩亚洲另类| 国产精品66部| 久久成人麻豆午夜电影| 日韩精品亚洲一区| 日本成人在线网站| 成人精品视频网站| 免费的国产精品| 亚洲色欲色欲www| 日韩一区二区三| 97se亚洲国产综合在线| 免费在线观看精品| 国产精品三级av在线播放| 欧美久久婷婷综合色| 欧美中文字幕一区二区三区亚洲| 9i在线看片成人免费| 色综合久久综合网欧美综合网| 成人黄色免费短视频| 国产一区二区免费在线| 日av在线不卡| 一区二区三区精品视频| 亚洲视频一二区| 亚洲三级在线观看| 久久99久久久久久久久久久| 色婷婷久久综合| 久久视频一区二区| 婷婷久久综合九色综合伊人色| 99精品视频一区二区三区| 精品日韩在线观看| 天堂成人免费av电影一区| 91丝袜国产在线播放| 国产三级精品三级| 精品中文字幕一区二区| 色999日韩国产欧美一区二区| 久久新电视剧免费观看| 亚洲国产成人va在线观看天堂| 成人短视频下载| 久久久久久9999| 美国毛片一区二区三区| 欧美日韩视频在线观看一区二区三区| 国产精品日日摸夜夜摸av| 国产在线国偷精品免费看| 91精品中文字幕一区二区三区| 亚洲女同ⅹxx女同tv| 99久久伊人精品| 国产精品情趣视频| 国产精品一区二区三区四区| 精品久久国产字幕高潮| 麻豆91精品91久久久的内涵| 欧美特级限制片免费在线观看| 亚洲天堂网中文字| 99精品国产视频| 国产精品久久久久久久久免费樱桃| 大桥未久av一区二区三区中文| 国产亚洲欧美激情| 国内精品免费**视频| 久久久久久久久久看片| 国产成人一区在线| 国产欧美日韩三级| 成人精品免费网站| 亚洲少妇屁股交4| 一本色道久久综合亚洲精品按摩| 亚洲视频在线观看一区| 色欧美日韩亚洲| 一区二区三区成人在线视频| 欧美三级视频在线观看| 天天综合色天天综合色h| 91.成人天堂一区| 免费成人在线观看视频| 久久久久久久久久久久久久久99| 国产精品一二三区在线| 国产精品美女久久久久久 | 国产露脸91国语对白| 国产无遮挡一区二区三区毛片日本| 国产精品资源在线看| 国产欧美精品区一区二区三区 | 精品av综合导航| 国产成人无遮挡在线视频| 中文字幕在线不卡国产视频| 91视视频在线直接观看在线看网页在线看| 亚洲精品国产a| 欧美精品v国产精品v日韩精品| 久久国产精品99久久人人澡| 久久精品亚洲国产奇米99| 99re这里只有精品6| 亚洲小说欧美激情另类| 精品国产凹凸成av人导航| 成人99免费视频| 亚洲大片一区二区三区| 久久天天做天天爱综合色| 色婷婷精品大视频在线蜜桃视频| 午夜久久久久久久久久一区二区| 精品成a人在线观看| 91玉足脚交白嫩脚丫在线播放| 午夜精品一区二区三区免费视频| 久久久久久影视| 欧美色偷偷大香| 国产精品亚洲人在线观看| 亚洲精品国产精华液| 精品久久久久久亚洲综合网 | 久久综合久色欧美综合狠狠| 91免费在线视频观看| 蜜臀国产一区二区三区在线播放| 国产天堂亚洲国产碰碰| 欧美日韩一区二区三区不卡 | 欧美在线视频你懂得| 黄色日韩网站视频| 一区二区三区国产豹纹内裤在线| 日韩免费一区二区| 91小视频免费看| 美女视频黄频大全不卡视频在线播放 | 久久精品国产77777蜜臀| 亚洲欧美区自拍先锋| 精品国产制服丝袜高跟| 在线免费视频一区二区| 国产福利91精品| 日韩av二区在线播放| 亚洲欧美综合另类在线卡通| 日韩精品一区二区三区四区视频|