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

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

?? csend.c

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

   pCS=(CS_END_DEVICE *)pV;

   /* disable CS8900 interrupts at the system level */
   if ( sysEnetIntDisable(pCS) == ERROR )
   {
      LOGMSG("csStop: CS_END_DEVICE %d, sysEnetIntDisable failed\n", 
              pCS->unit,0,0,0,0,0 );
      return( NULL );
   }

   /* set the flags to indicate NIC status */ 
   /* Mark the interface as down */
   END_FLAGS_CLR (&pCS->end, IFF_UP | IFF_RUNNING);

   /* Stop the chip */
   if ( csResetChip(pCS) == ERROR )
   {
      LOGMSG("csStop: CS_END_DEVICE %d, Can not reset the chip\n",
              pCS->unit, 0,0,0,0,0 );
      return ERROR;
   }


   LOGMSG("csStop(): unit=%d, The CS8900 device has been stopped.\n", 
            pCS->unit,0,0,0,0,0 );


   return OK;
}


/******************************************************************************
*
* csUnload - unload a driver from the system
*
* This function first brings down the device, and then frees any
* stuff that was allocated by the driver in the load function.
*
* RETURNS: OK or ERROR.
*/

LOCAL STATUS csUnload ( END_OBJ *pV        /* device to be unloaded */
    )
{
CS_END_DEVICE *pCS;

   pCS=(CS_END_DEVICE *)pV;

   END_OBJECT_UNLOAD (&pCS->end);
   LOGMSG("csUnLoad(): unit=%d, CS8900 driver is unloaded!\n", 
           pCS->unit,0,0,0,0,0 );
   return (OK);
}

/*******************************************************************************
*
* csIoctl -
*
* This routine is a major entry point and is called by the protocol stack to
* modify characteristics of this network interface driver.  
*/
LOCAL int csIoctl(     
    END_OBJ *pV,        /* device receiving command */
    int cmd,                        /* ioctl command code */
    caddr_t data                /* command argument */
    )
{
int status = 0;
long value;
CS_END_DEVICE *pCS;

   pCS=(CS_END_DEVICE *)pV;

   switch( cmd )
   {
      case EIOCSADDR:
         if (data == NULL)
            return (EINVAL);
         bcopy ((char *)data, (char *)END_HADDR(&pCS->end), 
                END_HADDR_LEN(&pCS->end));
         bcopy( (char *)data, (char *)pCS->enetAddr, 6);
         csConfig(pCS);
         break;
      case EIOCGADDR:
         if (data == NULL) return (EINVAL);
         bcopy ((char *)END_HADDR(&pCS->end), (char *)data,
                END_HADDR_LEN(&pCS->end));
         break;
      case EIOCSFLAGS: /* set Promiscuous Mode */
         value = (long)data;
         if (value < 0)
         {
            value = -(--value);
            END_FLAGS_CLR (&pCS->end, value);
         }
         else
         {
            END_FLAGS_SET (&pCS->end, value);
         }
         csConfig (pCS);
         break;
      case EIOCGFLAGS:
         *(int *)data = END_FLAGS_GET(&pCS->end);
         break;
      case EIOCMULTIADD:
         status = csMCastAdd ((void*)pCS, (char *) data);
         break;
      case EIOCMULTIDEL:
         status = csMCastDel ((void*)pCS, (char *) data);
         break;
      case EIOCMULTIGET:
         status = csMCastGet ((void*)pCS, (MULTI_TABLE *) data);
         break;
      case EIOCPOLLSTART:
         csPollStart ((void*)pCS);
         break;
      case EIOCPOLLSTOP:
         csPollStop ((void*)pCS);
         break;
      case EIOCGMIB2:
         if (data == NULL) return (EINVAL);
         bcopy((char *)&pCS->end.mib2Tbl, (char *)data,
               sizeof(pCS->end.mib2Tbl));
         break;
      case EIOCGFBUF:
         if (data == NULL)
         return (EINVAL);
         *(int *)data = CS_MIN_FBUF;
         break;
      default:
         status = EINVAL;
   }


   return (status);
}


/*******************************************************************************
*
* csSend - the driver send routine
*
* This routine takes a M_BLK_ID sends off the data in the M_BLK_ID.
* The buffer must already have the addressing information properly installed
* in it.  This is done by a higher layer.    
*
* RETURNS: OK or ERROR.
*/

LOCAL STATUS csSend ( END_OBJ  *pV,        /* device ptr */
                      M_BLK_ID pMBuff   /* data to send */
)
{    
   int         oldLevel=0;
CS_END_DEVICE *pCS;

   pCS=(CS_END_DEVICE *)pV;
   /*
    * Obtain exclusive access to transmitter.  This is necessary because
    * we might have more than one stack transmitting at once.
    */

    if (!(pCS->ConfigFlags & CFGFLG_POLL_MODE))
        END_TX_SEM_TAKE (&pCS->end, WAIT_FOREVER);

    /* This is the normal case where all the data is in one M_BLK_ID */
    /* Set pointers in local structures to point to data. */
    /* place a transmit request */

    if (!(pCS->ConfigFlags & CFGFLG_POLL_MODE))
    {
	  /*  disable interrupts*/
      oldLevel=INT_LOCK();
    }
    
    /* initiate device transmit */
    csStartOutput(pCS, pMBuff);

    if (!(pCS->ConfigFlags & CFGFLG_POLL_MODE))
    {
 	  /*  enable interrupts*/
      INT_UNLOCK(oldLevel);
    }
    
    /* Advance our management index */

    if (!(pCS->ConfigFlags & CFGFLG_POLL_MODE))
        END_TX_SEM_GIVE (&pCS->end);

    return (OK);
}


/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
 * Interrupt-handler Routines                                              *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */


/*******************************************************************************
*
* csIntr -
*
* This routine in the interrupt service routine.  This routine is called by
* VxWorks wrapper code whenever the CS8900 chip generates and interrupt.  The 
* wrapper code issues an EOI command.
*
* This routine processes the events on the Interrupt Status Queue.  The events
* are read one at a time from the ISQ and the appropriate event handlers are
* called.  The ISQ is read until it is empty.  Reading a zero from the ISQ will
* deassert the interrupt request line.
*
* RETURNS: Nothing
*
*/

LOCAL void csIntr(CS_END_DEVICE *pCS)
{
   USHORT Event;

   /* Ignore any interrupts that happen while the chip is being reset */
   if( pCS->Resetting )
      return;

   /* Set locale flag */
   pCS->InISR = TRUE;
   /* Read an event from the Interrupt Status Queue */
   if( pCS->InMemoryMode )
      Event = csReadPacketPage( pCS, PKTPG_ISQ );
   else
      Event = SYS_ENET_IN_WORD( (pCS->IOAddr)+PORT_ISQ );

   /* Process all the events in the Interrupt Status Queue */
   while( Event != 0 )
   {
      /* Dispatch to an event handler based on the register number */
      switch ( Event & REG_NUM_MASK )
      {
         case REG_NUM_RX_EVENT:
            csReceiveEvent( pCS, Event );
            break;

         case REG_NUM_TX_EVENT:
            csTransmitEvent( pCS, Event );
            break;

         case REG_NUM_BUF_EVENT:
            csBufferEvent( pCS, Event );
            break;

         case REG_NUM_RX_MISS: 
            /* Read the Rx Miss count (clears the counter). */
            /* Miss count is in the 10 MSBs */
            /*pCS->ArpCom.ac_if.if_ierrors += ( (BYTE_SWAP(Event)) >> 6); */
            END_ERR_ADD (&pCS->end, MIB2_IN_ERRS,( (BYTE_SWAP(Event)) >> 6) );

            LOGMSG("csRxMissEvent: CS_END_DEVICE %d,, %d added to RX miss counter\n",
            pCS->unit, ( (BYTE_SWAP(Event)) >> 6),0,0,0,0 );
            break;

         case REG_NUM_TX_COL:  
            /* Read the collision counter (clears the counter). */           
            /* Collision count is in the 10 MSBs */
            pCS->Collisions += ( (BYTE_SWAP(Event)) >> 6);
        
            LOGMSG("csTxColEvent: CS_END_DEVICE %d, %d added to collision counter\n",
            pCS->unit, ( (BYTE_SWAP(Event)) >> 6),0,0,0,0 );
            break;
  
         default: 
            LOGMSG("csIntr: CS_END_DEVICE %d, Unknown interrupt event: %04X\n",
               pCS->unit, (BYTE_SWAP(Event)),0,0,0,0 );
            break;
      }

      /* Read another event from the Interrupt Status Queue */
      if ( pCS->InMemoryMode )
         Event = csReadPacketPage( pCS, PKTPG_ISQ );
      else
         Event = SYS_ENET_IN_WORD( (pCS->IOAddr)+PORT_ISQ );
   }
   
   /* Ensure task-level event handler is running */
   if( pCS->NetJobDepth < 2 )
   {
      pCS->NetJobDepth++;
      netJobAdd( (FUNCPTR)csEventHandler, (int)pCS, 0, 0, 0, 0 ); 
   }

   /* Clear locale flag */
   pCS->InISR = FALSE;
}


/*******************************************************************************
*
* csBufferEvent -
*
* The routine is called whenever an event occurs regarding the transmit and
* receive buffers within the CS8900 chip.  The only buffer events we 
* currently handle are Rdy4TX interrupts, Tx Underruns, and SW ints.
*
*/

LOCAL void csBufferEvent( CS_END_DEVICE *pCS, USHORT BufEvent )
{
USHORT BusStatus;

   if ( BufEvent & BUF_EVENT_TX_UNDR )
   {

      /* TX underrun occured */
      pCS->TxUnderruns++;

      /* Modify start command if total underruns > threshold value */
      /* by setting TX start command to next increment */
      if( pCS->TxUnderruns == CS_TX_UNDRUN_TRHSHOLD )
      {
          /* Reset the threshold counter */
          pCS->TxUnderruns = 0;
          
          /* Select the next TxStartCommand */ 
          if( pCS->TxStartCMD == TX_CMD_START_5 )
             pCS->TxStartCMD = TX_CMD_START_381;

          else if( pCS->TxStartCMD == TX_CMD_START_381 )
             pCS->TxStartCMD = TX_CMD_START_1021;

          else pCS->TxStartCMD = TX_CMD_START_ALL;
      }
       
      /* Try to TX the frame again */
      if ( pCS->InMemoryMode )
      {
            csWritePacketPage( pCS, PKTPG_TX_CMD, pCS->TxStartCMD );
            csWritePacketPage( pCS, PKTPG_TX_LENGTH, BYTE_SWAP(pCS->TxLength) );
      }
      else  /* In IO mode */
      {
            SYS_ENET_OUT_WORD( (pCS->IOAddr)+PORT_TX_CMD, pCS->TxStartCMD );
            SYS_ENET_OUT_WORD( (pCS->IOAddr)+PORT_TX_LENGTH, 
            BYTE_SWAP(pCS->TxLength));
      }

      /* Read BusStatus register which indicates success of the request */
      BusStatus = csReadPacketPage( pCS, PKTPG_BUS_ST );

      if ( BusStatus & BUS_ST_RDY4TXNOW )
      {
            /* On-chip buffer space available -- start transmission */
             csCopyTxFrame( pCS, pCS->pTxFrameChain );
      }

      LOGMSG("csBufferEvent: CS_END_DEVICE %d, Transmit underrun\n",
         pCS->unit, 0,0,0,0,0 );

      pCS->TotalTxUnderruns++;
   }


   else if ( BufEvent & BUF_EVENT_RDY4TX )
   {
      (pCS->Rdy4TxInts) += 1;

      /* The chip is ready for transmission now */

      /* If a TX is pending, copy the frame to the chip to start transmission */
      if( pCS->pTxFrameChain != NULL )
      {
         csCopyTxFrame( pCS, pCS->pTxFrameChain );
      }
   }


   else if ( BufEvent & BUF_EVENT_SW_INT )
   {
      LOGMSG("csBufferEvent: CS_END_DEVICE %d, Software initiated interrupt\n",
         pCS->unit, 0,0,0,0,0 );
   }
}




/*******************************************************************************
*
* csTransmitEvent -
*
* This routine is called whenever the transmission of a packet has completed
* successfully or unsuccessfully.  If the transmission was not successful,
* then the output error count is incremented.  If there are more packets in the
* transmit queue, then the next packet is started immediately.
*
*/

LOCAL void csTransmitEvent( CS_END_DEVICE *pCS, USHORT TxEvent )
{
   /* WE only get here if the transmit in progress has completed, either 
    * successfully or due to an error condition.  In any event, queue the 
    * mbuf chain for freeing at task level and NULL the frame pointer to mark
    * the TX no longer in progress.
    */

   csEnqueue( pCS->pTxBuffFreeList, pCS->pTxFrameChain );
   pCS->pTxFrameChain = NULL;
   pCS->TxInProgress = FALSE;   

   /* If there were any errors transmitting this frame */
   if ( TxEvent & (TX_EVENT_LOSS_CRS | TX_EVENT_SQE_ERR | TX_EVENT_OUT_WIN |
            TX_EVENT_JABBER | TX_EVENT_16_COLL) )
   {
      /* Increment the output error count */
    /* @kml	 The definition of the MIB-II variable ifOutUcastPkts in Interface
	   group from RFC 1158 is "The total  number of  packets that higher-level 
	   protocols requested be transmitted to a subnetwork-unicast address, 
	   INCLUDE those that were discarded or not sent."*/
      END_ERR_ADD (&pCS->end, MIB2_OUT_ERRS, +1);

      /* If debugging is enabled then log error messages */
#ifdef  CS_DEBUG_ENABLE

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99riav久久精品riav| 午夜久久久久久| 国产成人综合网| 久久精品亚洲麻豆av一区二区| 蜜臀久久99精品久久久画质超高清| 欧美日韩精品系列| 青青草精品视频| 久久综合久色欧美综合狠狠| 国产激情精品久久久第一区二区 | 99久久精品免费看| 麻豆91免费看| 久久久精品2019中文字幕之3| 国产成人免费视| 亚洲精品久久久蜜桃| 欧美男女性生活在线直播观看| 男女男精品网站| 国产视频一区二区在线| 97久久精品人人做人人爽50路 | 欧美日韩专区在线| 蜜桃视频一区二区三区| 久久99久久精品欧美| 成人做爰69片免费看网站| 久久久久久黄色| 99re8在线精品视频免费播放| 亚洲精选免费视频| 日韩欧美在线网站| 东方aⅴ免费观看久久av| 亚洲免费观看高清完整版在线观看熊| 欧美日韩在线播放| 狠狠色综合色综合网络| 亚洲美女视频在线| 精品卡一卡二卡三卡四在线| 99国产一区二区三精品乱码| 婷婷久久综合九色国产成人| 久久久久久久久久美女| 在线观看av不卡| 国产又粗又猛又爽又黄91精品| 亚洲人成精品久久久久久| 日韩欧美一区二区视频| 99国产精品国产精品久久| 日韩精品高清不卡| 亚洲欧洲日产国码二区| 精品欧美乱码久久久久久1区2区| 99热这里都是精品| 国产乱子轮精品视频| 亚洲影院久久精品| 中文一区二区完整视频在线观看| 欧美日韩成人在线一区| 97超碰欧美中文字幕| 国内精品视频一区二区三区八戒| 亚洲激情在线激情| 国产精品网站在线观看| 精品三级在线观看| 欧美日韩成人综合天天影院 | 亚洲精品一二三四区| 2023国产精品自拍| 制服丝袜在线91| 欧美性淫爽ww久久久久无| 成人午夜碰碰视频| 国产一区二区精品在线观看| 午夜av一区二区三区| 一区二区三区产品免费精品久久75| 国产亚洲污的网站| 久久亚区不卡日本| 精品动漫一区二区三区在线观看| 欧美人妖巨大在线| 欧美视频一区二| 欧美在线免费视屏| 色婷婷久久久亚洲一区二区三区| jlzzjlzz国产精品久久| 成人黄色777网| 成人av网站免费| 成人av免费在线| 精品久久久久久亚洲综合网| 欧美精品三级日韩久久| 欧美丰满美乳xxx高潮www| 欧美浪妇xxxx高跟鞋交| 欧美日韩久久一区| 538prom精品视频线放| 欧美日韩一区三区| 欧美一级一级性生活免费录像| 欧美日韩一区在线| 欧美一区二区久久久| 欧美一区二区三区免费大片| 欧美一区二区三区四区久久| 欧美电影免费观看高清完整版在 | 精品国产91洋老外米糕| 久久一留热品黄| 国产亚洲婷婷免费| 最新国产成人在线观看| 中文字幕一区二区在线观看| 亚洲欧美区自拍先锋| 一区二区三区四区乱视频| 亚洲一区在线观看视频| 天天综合色天天综合色h| 日韩精品国产欧美| 男女性色大片免费观看一区二区| 极品美女销魂一区二区三区免费 | 中文久久乱码一区二区| 亚洲婷婷综合色高清在线| 亚洲色图欧洲色图婷婷| 亚洲电影欧美电影有声小说| 日韩av网站免费在线| 精品一区二区三区视频 | 91在线视频网址| 在线观看91精品国产入口| 91精品蜜臀在线一区尤物| 国产亚洲综合色| 亚洲精品国产无天堂网2021| 日韩国产一二三区| 国产成人午夜精品5599| 日本道免费精品一区二区三区| 欧美乱妇一区二区三区不卡视频| 久久午夜色播影院免费高清| 亚洲色图欧美激情| 久久99热国产| 日本高清无吗v一区| 欧美一区二区三区四区久久| 亚洲欧洲日韩在线| 免费在线看一区| 成人毛片在线观看| 91精品国产综合久久香蕉麻豆| 久久精品男人的天堂| 午夜精品久久久久久不卡8050| 国产老肥熟一区二区三区| 欧美午夜精品免费| 中文字幕欧美日韩一区| 日韩综合在线视频| 99vv1com这只有精品| 精品成人一区二区| 亚洲第一成人在线| 成人app软件下载大全免费| 欧美精品亚洲二区| 亚洲视频一区二区免费在线观看| 久久99精品国产| 欧美亚洲综合在线| 中文字幕在线不卡一区| 精品一区二区三区在线视频| 欧美在线免费播放| 国产精品美日韩| 精品一区二区三区免费毛片爱| 在线视频你懂得一区| 久色婷婷小香蕉久久| 欧美色区777第一页| 亚洲丝袜精品丝袜在线| 狠狠色狠狠色综合日日91app| 欧美日韩国产欧美日美国产精品| 亚洲色图另类专区| 成人在线视频一区二区| 精品日韩一区二区| 免费观看日韩av| 91精品婷婷国产综合久久性色| 一级女性全黄久久生活片免费| 成人一区二区三区在线观看| 日韩精品中文字幕在线不卡尤物| 五月婷婷激情综合网| 91国产视频在线观看| 成人免费在线视频| 99久久精品国产毛片| 一区在线播放视频| av在线一区二区| 中文字幕中文在线不卡住| 国产成人综合视频| 久久日一线二线三线suv| 蜜臀国产一区二区三区在线播放| 在线播放欧美女士性生活| 午夜日韩在线电影| 91精品国产综合久久福利软件| 亚洲18女电影在线观看| 欧美久久一二区| 日韩高清在线电影| 欧美xxxxxxxx| 国产精品自拍网站| 国产色产综合色产在线视频| 国产精品一二三| 国产精品视频一区二区三区不卡 | 色综合久久中文综合久久牛| 亚洲欧美在线高清| 色婷婷香蕉在线一区二区| 亚洲一区二区三区免费视频| 欧美午夜不卡视频| 首页国产欧美久久| 欧美本精品男人aⅴ天堂| 国产精品一区二区免费不卡 | 另类小说色综合网站| 26uuu精品一区二区在线观看| 国产在线不卡一区| 综合久久综合久久| 欧美在线影院一区二区| 午夜精品一区二区三区电影天堂| 日韩一区二区在线播放| 国产酒店精品激情| 中文字幕一区二区三区色视频 | 欧美影院一区二区| 免费观看一级特黄欧美大片| 国产日韩av一区| 色视频欧美一区二区三区| 日韩国产高清影视| 日本一区二区不卡视频| 欧美中文字幕亚洲一区二区va在线|