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

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

?? isr.c

?? CS8900 for windows ce 4.2 驅動程序源碼
?? C
字號:
//---------------------------------------------------------------------------
//
//  Copyright (C) 1996-1997. Unpublished Work of Crystal Semiconductor Corp.
//  All Rights Reserved.
//
//  THIS WORK IS AN UNPUBLISHED WORK AND CONTAINS CONFIDENTIAL,
//  PROPRIETARY AND TRADE SECRET INFORMATION OF CRYSTAL SEMICONDUCTOR.
//  ACCESS TO THIS WORK IS RESTRICTED TO (I) CRYSTAL SEMICONDUCTOR EMPLOYEES
//  WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF THEIR
//  ASSIGNMENTS  AND (II) ENTITIES OTHER THAN CRYSTAL SEMICONDUCTOR WHO
//  HAVE ENTERED INTO  APPROPRIATE LICENSE AGREEMENTS.  NO PART OF THIS
//  WORK MAY BE USED, PRACTICED, PERFORMED, COPIED, DISTRIBUTED, REVISED,
//  MODIFIED, TRANSLATED, ABRIDGED, CONDENSED, EXPANDED, COLLECTED,
//  COMPILED,LINKED,RECAST, TRANSFORMED, ADAPTED IN ANY FORM OR BY ANY
//  MEANS,MANUAL, MECHANICAL, CHEMICAL, ELECTRICAL, ELECTRONIC, OPTICAL,
//  BIOLOGICAL, OR OTHERWISE WITHOUT THE PRIOR WRITTEN PERMISSION AND
//  CONSENT OF CRYSTAL SEMICONDUCTOR . ANY USE OR EXPLOITATION OF THIS WORK
//  WITHOUT THE PRIOR WRITTEN CONSENT OF CRYSTAL SEMICONDUCTOR  COULD
//  SUBJECT THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY.
//
//---------------------------------------------------------------------------

#include "cs8900a.h"
#include "cshrd.h"




// External Prototypes

void  CopyPacketToChip( IN PCHIP );
WORD  BidForTransmit( IN PCHIP );
void  PurgeTransmitQueue( IN PCHIP );
void  ReceivePacket( IN PCHIP, IN WORD );
void  ReceiveEarlyPacket( IN PCHIP, IN WORD  );

// Local Prototypes

void ProcessReceiveInterrupts(IN PCHIP, IN WORD );
void ProcessTransmitInterrupts(IN PCHIP, IN WORD );
void ProcessBufferInterrupts(IN PCHIP, IN WORD );
void ProcessRxOverflowInterrupts(IN PCHIP, IN WORD );
void ProcessTxOverflowInterrupts(IN PCHIP, IN WORD );

typedef void (*VC20_ISQHANDLER)(IN PCHIP, IN WORD );
#define MAX_ISQ_EVENTS 5

VC20_ISQHANDLER IsqEventHandler[MAX_ISQ_EVENTS] = {
                  ProcessReceiveInterrupts,
                  ProcessTransmitInterrupts,
                  ProcessBufferInterrupts,
                  ProcessRxOverflowInterrupts,
                  ProcessTxOverflowInterrupts,
                  };





VOID
CrystalDisableInterrupt(
    IN  NDIS_HANDLE MiniportAdapterContext
    )
{
   //QQQQQQQQQQQ Why mark out? VchipDisableInterrupts( ((PVPMINIPDATA)MiniportAdapterContext)->pChip );

VchipDisableInterrupts( ((PVPMINIPDATA)MiniportAdapterContext)->pChip );

 //   DbgPrint("\nCs8900a(): DisableInterrupt() \n");
    return;
}

VOID
CrystalEnableInterrupt(
    IN  NDIS_HANDLE MiniportAdapterContext
    )
/*++

Routine Description:

    This routine is used to turn on all interrupts from the adapter.

Arguments:

    MiniportAdapterContext - A pointer to the VP context

Return Value:

    None.

--*/
{

    VPM_SetupMiniContext;
    VchipEnableInterrupts( ((PVPMINIPDATA)MiniportAdapterContext)->pChip );
//    DbgPrint("\nCs8900a(): EnableInterrupt\n");
    return;

}

extern
VOID
CrystalInterruptService(
    OUT PBOOLEAN InterruptRecognized,
    OUT PBOOLEAN QueueDpc,
    IN  PVOID Context
    )

/*++

Routine Description:

    Interrupt service routine.  This routine only gets
    called during initial initialization of the adapter.

Arguments:

    InterruptRecognized - Boolean value which returns TRUE if the
        ISR recognizes the interrupt as coming from this adapter.

    QueueDpc - TRUE if a DPC should be queued.

    Context - Really a pointer to the adapter.

Return Value:

    Returns true if the card ISR is non-zero.

--*/

{


   NDIS_HANDLE MiniportAdapterContext = Context;
   VPM_SetupMiniContext;


//    DbgPrint("\nCs8900a(): InterruptService()\n");

      *InterruptRecognized = TRUE;
      *QueueDpc = TRUE;



   return;

}

VOID
CrystalHandleInterrupt(
    IN NDIS_HANDLE MiniportAdapterContext
    )

/*++

Routine Description:

    This DPR routine is queued by the wrapper after every interrupt
    and also by other routines within the driver that notice that
    some deferred processing needs to be done.  It's main
    job is to call the interrupt processing code.

Arguments:

    MiniportAdapterContext - Really a pointer to the adapter.

Return Value:

    None.

--*/

{

   WORD  Result=TRUE;
   VPM_SetupMiniContext;

//    DbgPrint("\nCs8900a(): HandleInterrupt 1\n");

   if (pvMini_Context->CurrentState == NdisHardwareStatusInitializing) {
      return;
   } /* endif */


   while (Result) {  // Loop until ISR indicates there was nothing to do

      Result = VchipISR( pvMini_Context->pChip );

   } /* endwhile */

    VchipEnableInterrupts (pvMini_Context->pChip );

//     DbgPrint("\nCs8900a(): HandleInterrupt 2\n");

	 return;

 }





WORD VchipISR( PCHIP pChip )
{
   WORD  IsqEvent;
   WORD  EventIndex;
   PORT  IOBase = pChip->Config.IOBase;
   PCD   pData = pChip->pData;
   WORD  BidStatus;
   WORD  Status=FALSE;
   WORD  regNum;

   pData->NeedToIssueRcvCmpltFlag = FALSE;
   

   /* Ignore spurrious interrupt that occurs while resetting */
   if ( pData->Resetting ) return Status;


   do {  // While ISQ != 0

      //  Read ISQ
      NdisRawReadPortUshort((PORT)(IOBase+CRYSTAL_ISQ_PORT), &IsqEvent  );

      if (IsqEvent != 0) {
         Status=TRUE;
     
         regNum = IsqEvent & CRYSTAL_ISQ_EVENT_MASK;
         if (regNum == 0x12) //TxCol event
         {
             // @melody 11/05/2002
             // The register number of Tx Collision Counter is not multiple of 4 
             // so we should calculate it separately.
             EventIndex = 5;
         }
         else 
         {
             EventIndex = regNum/4;
         } 

         if (--EventIndex < MAX_ISQ_EVENTS) {
            IsqEventHandler[EventIndex](pChip, IsqEvent);
         } /* endif */
      } /* endif */


   } while ( IsqEvent != 0 ); /* enddo */


   if (pData->NeedToIssueRcvCmpltFlag == TRUE) {
      PVPMINIPDATA pvMini_Context = (PVPMINIPDATA)(pChip->pPSD); 
      NDIS_HANDLE MiniportAdapterHandle = pvMini_Context->vpMiniportAdapterHandle; 

      NdisMEthIndicateReceiveComplete( MiniportAdapterHandle );
   } /* endif */



   // Transmits are handled outside of ISQ Loop to prioritize Receive
   if ((pData->StartTX) && (pData->TransmitQueue.Head != NULL)) {

      pData->StartTX = FALSE;
      if (!pData->TransmitBidPending) {
         BidStatus = BidForTransmit(pChip);
      } /* endif */
      if ((pData->TransmitBidPending) ||  // StartTX & TransmitBidPending means ReadyForTX received
          (BidStatus == SUCCESS)) {
         pData->TransmitBidPending = FALSE;
         CopyPacketToChip(pChip);
      }
   } else {
      pData->StartTX = FALSE;
   } /* endif */

   return Status;

}


void ProcessReceiveInterrupts( PCHIP pChip, WORD IsqEvent )
{
   PORT  IOBase = pChip->Config.IOBase;
   PCD   pData = pChip->pData;
   WORD  Errors = 0;

   if ( IsqEvent & CRYSTAL_RER_PACKET_RECEIVED_OK) {

      ReceivePacket( pChip, IsqEvent );

   } else {
      //
      // A receive error occurred
      //

      if (IsqEvent & CRYSTAL_RER_CRC_ERROR) {
         Errors |= RX_ERR_CRC_ERROR;

         if(IsqEvent & CRYSTAL_RER_DRIBBLE) {
            Errors |= RX_ERR_DRIBBLE;
         }
      }
      if (IsqEvent & CRYSTAL_RER_EXTRA_DATA) {
         Errors |= RX_ERR_EXTRA_DATA;
      }
      if (IsqEvent & CRYSTAL_RER_RUNT) {
         Errors |= RX_ERR_RUNT;
      }
      VpsRecvError( pChip, Errors );
   }
};

void ProcessTransmitInterrupts( PCHIP pChip, WORD IsqEvent )
{
   PORT  IOBase = pChip->Config.IOBase;
   PCD   pData = pChip->pData;
   WORD  Errors = 0;
   WORD  Collisions = 0;
   PTRANSMIT_QUEUE_ELEMENT TxPacket;
   PNDIS_PACKET Packet;
   PVPMINIPDATA pvMini_Context = (PVPMINIPDATA)(pChip->pPSD); 
   NDIS_HANDLE MiniportAdapterHandle = pvMini_Context->vpMiniportAdapterHandle; 


   //
   // We first in any transmit event must  decrement the counter of the
   // underrun Threshold
   //

   if ( pData->TransmitThresholdCount != 0) {
      (pData->TransmitThresholdCount)--;
   }

   //
   // Check if the packet completed OK, and update statistics.
   //
      if (IsqEvent & CRYSTAL_TER_EXCESSIVE_COLLISIONS) {
         Errors |= TX_ERR_EXCESS_COLL;
      }
      Collisions = (INT)(IsqEvent & CRYSTAL_TER_COLLISIONS_MASK) >> CRYSTAL_TER_COLLISIONS_SHIFT;

      if (IsqEvent & CRYSTAL_TER_JABBER) {
         Errors |= TX_ERR_JABBER;
      }


      if (IsqEvent & CRYSTAL_TER_OUT_OF_WINDOW) {
         Errors |= TX_ERR_OUT_OF_WIN;
      }


   // Dequeue the Packet
   DEQ_PACKET(&TxPacket, pData->TransmitQueue);

   if (TxPacket != NULL) {
   
      Packet = CONTAINING_RECORD(TxPacket,NDIS_PACKET,MiniportReserved);	

      if (IsqEvent & CRYSTAL_TER_LOST_CRS) Errors |= TX_ERR_LOSS_CRS;
      if (IsqEvent & CRYSTAL_TER_SQE_ERROR) Errors |= TX_ERR_SQE_ERROR;
      if (Errors) {
         VpsSendError( pChip,Errors );
      } /* endif */
    
      
     
   	  if (Collisions == 1) {
   	     pvMini_Context->XmitOneCollisions++;
   	  } else if (Collisions > 1) {
   	     pvMini_Context->XmitMoreCollisions++;
   	  } /* endif */
     
     
      pvMini_Context->XmitOKs++;
     

      NdisMSendComplete(MiniportAdapterHandle,
                              Packet,
                              NDIS_STATUS_SUCCESS
                              );

   } /* endif */


   //
   // If there is a packet in the transmit queue then try
   // transmitting it at the end of the ISR
   //
   if (pData->TransmitQueue.Head != NULL ) {
      pData->StartTX = TRUE;
   } else {
      pData->TransmitInProgress = FALSE;
   }

};

void ProcessBufferInterrupts( PCHIP pChip, WORD IsqEvent )
{
   PORT  IOBase = pChip->Config.IOBase;
   PCD   pData = pChip->pData;

   //
   // Then check for READY_FOR_TRANSMIT
   //
   if (IsqEvent & CRYSTAL_BER_READY_FOR_TRANSMIT) {


      if (pData->TransmitQueue.Head != NULL) {
         pData->TransmitBidPending = FALSE;
         pData->StartTX = FALSE;
         CopyPacketToChip( pChip );
      }
   }

   //
   // If TX_UNDERRUN occured then update counters.
   //
   if (IsqEvent & CRYSTAL_BER_TX_UNDERRUN) {

      if (pData->TransmitQueue.Head != NULL) {  // Resend current Frame
         VpsSendError( pChip,TX_ERR_UNDERRUN );
         pData->StartTX = TRUE;
      }
      //
      //  We have a underrun so we see if we have exceeded the threshold
      //  if so go to next transmit command
      //

      (pData->TransmitThresholdCount)++;

      if( pData->TransmitThresholdCount == UNDERRUN_THRESHOLD){

         (pData->TransmitThresholdCount)= 0;

         if (pData->TransmitCommand < CRYSTAL_TCR_TX_START_ALL_BYTES) {

            pData->TransmitCommand += CRYSTAL_TCR_TX_START_381_BYTES;

         }
      }
   }

};

void ProcessRxOverflowInterrupts( PCHIP pChip, WORD IsqEvent )
{
   PCD   pData = pChip->pData;
   IsqEvent = IsqEvent >> 6;
   do {
      VpsRecvError( pChip, RX_ERR_OVERRUN );
   } while (--IsqEvent !=0);
};

void ProcessTxOverflowInterrupts( PCHIP pChip, WORD IsqEvent )
{
   PCD   pData = pChip->pData;
   if (pData->TransmitQueue.Head != NULL) {  // Resend current Frame
      VpsSendError( pChip, TX_ERR_FRAME_ABORT ); // May need better RC here
   }
};




void VchipEnableInterrupts( PCHIP pChip )
{

   WORD  Data;
   PORT  IOBase = pChip->Config.IOBase;

   if ( ((PCD)(pChip->pData))->Resetting ) return;

   //
   // Enable  BUS_CTL register Interrupt Enable.
   //

   NdisRawWritePortUshort((PORT)(IOBase+CRYSTAL_ADDRESS_PORT),
               CRYSTAL_BUS_CONTROL_REGISTER);

   NdisRawReadPortUshort((PORT)(IOBase+CRYSTAL_DATA_PORT), &Data);

   NdisRawWritePortUshort((PORT)(IOBase+CRYSTAL_DATA_PORT),
               Data | CRYSTAL_BCR_INTERRUPT_ENABLE);



};


void VchipDisableInterrupts( PCHIP pChip )
{


   WORD  Data;
   PORT  IOBase = pChip->Config.IOBase;

   if ( ((PCD)(pChip->pData))->Resetting ) return;
   //
   // Disable  BUS_CTL register Interrupt Enable.
   //

   NdisRawWritePortUshort((PORT)(IOBase+CRYSTAL_ADDRESS_PORT),
               CRYSTAL_BUS_CONTROL_REGISTER);

   NdisRawReadPortUshort((PORT)(IOBase+CRYSTAL_DATA_PORT), &Data);

   NdisRawWritePortUshort((PORT)(IOBase+CRYSTAL_DATA_PORT),
              Data &(~CRYSTAL_BCR_INTERRUPT_ENABLE) );


};




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合九色综合欧美就去吻| 亚洲图片自拍偷拍| 一区二区三区在线影院| 日本vs亚洲vs韩国一区三区二区| 成人精品免费网站| 日韩欧美中文字幕公布| 亚洲欧美日韩在线| 国产老妇另类xxxxx| 欧美精品九九99久久| 国产精品国产三级国产普通话三级| 青青草91视频| 精品污污网站免费看| 亚洲欧洲性图库| 国产精品99久| 欧美精品一区二区三区蜜桃 | 色偷偷成人一区二区三区91| 欧美一区二区视频观看视频| 一区二区三区在线观看欧美| 成人激情文学综合网| 亚洲精品在线免费观看视频| 水野朝阳av一区二区三区| 91麻豆免费在线观看| 国产精品国产三级国产aⅴ无密码| 国产一区二区三区国产| 欧美大黄免费观看| 美女脱光内衣内裤视频久久网站 | 欧美在线观看视频一区二区三区 | 国产一区二区三区四区五区美女 | 麻豆91在线看| 欧美一区二区三区人| 亚洲成人自拍网| 在线观看日韩精品| 亚洲综合免费观看高清完整版在线| 一本到不卡精品视频在线观看| 中文字幕五月欧美| 99re这里都是精品| 一区二区三区视频在线观看| 欧洲精品视频在线观看| 亚洲无人区一区| 欧美久久婷婷综合色| 日韩高清一级片| 精品日韩av一区二区| 激情图片小说一区| 综合网在线视频| 欧洲中文字幕精品| 日韩一区精品字幕| 欧美va亚洲va国产综合| 国产成人免费在线视频| 国产精品久久久久久亚洲毛片 | 色综合色狠狠天天综合色| 亚洲麻豆国产自偷在线| 99r国产精品| 肉色丝袜一区二区| 日韩精品一区二区三区视频| 国产成人av在线影院| 日韩一区有码在线| 欧美麻豆精品久久久久久| 老司机午夜精品| 国产精品久久久99| 精品视频一区二区不卡| 久久精品国产亚洲一区二区三区| 久久精品人人做| 欧美亚洲综合一区| 韩国av一区二区三区在线观看| 国产精品三级视频| 欧美日本国产视频| 国产成人亚洲综合a∨婷婷| 亚洲欧美另类久久久精品2019| 欧美一区二区三区四区五区| 福利电影一区二区三区| 夜夜嗨av一区二区三区| 精品sm在线观看| 欧美这里有精品| 国产激情视频一区二区三区欧美| 一区二区三区在线播| 日韩免费福利电影在线观看| 成人高清在线视频| 麻豆精品视频在线观看免费| 国产精品成人免费精品自在线观看| 欧美日韩激情在线| 国产成人精品网址| 午夜精品一区二区三区三上悠亚| 久久一区二区三区四区| 欧美日韩一二三| 成人精品gif动图一区| 欧美aaa在线| 亚洲无线码一区二区三区| 国产人妖乱国产精品人妖| 欧美一区二区三区婷婷月色| 色综合一区二区三区| 国产成人在线看| 激情国产一区二区| 亚洲成av人片一区二区| 中文字幕一区在线| 国产午夜精品一区二区三区视频| 欧美日韩一本到| 91免费国产在线| 国产69精品久久777的优势| 日韩激情视频在线观看| 亚洲影院久久精品| 亚洲人精品一区| 中文字幕一区二区三区四区| 欧美国产欧美综合| 久久久亚洲国产美女国产盗摄 | 久久精品一区蜜桃臀影院| 91精品一区二区三区在线观看| 在线精品视频小说1| 91在线一区二区三区| av福利精品导航| av激情综合网| 色欲综合视频天天天| 一本大道久久a久久精品综合| 99视频国产精品| jlzzjlzz国产精品久久| 盗摄精品av一区二区三区| 成人免费毛片高清视频| 国产成人av资源| av成人免费在线观看| 99在线精品观看| 91免费国产在线观看| 欧美中文字幕一区二区三区| 欧美日韩五月天| 91精品国产福利| 欧美一区二区久久| 欧美va亚洲va在线观看蝴蝶网| 精品久久久久久久一区二区蜜臀| 久久综合久久综合久久综合| 国产亚洲综合性久久久影院| 中文av字幕一区| 亚洲男同性恋视频| 亚洲成a人片在线不卡一二三区| 亚洲成人中文在线| 久久se这里有精品| 懂色av中文字幕一区二区三区 | 精品一区二区三区香蕉蜜桃| 国产综合色视频| 99精品黄色片免费大全| 欧美视频在线观看一区| 精品精品国产高清a毛片牛牛 | 欧美体内she精视频| 91精品在线观看入口| 国产午夜精品久久久久久免费视| 成人免费在线观看入口| 午夜精品久久久久久久99水蜜桃| 久久se这里有精品| 成人午夜激情在线| 欧美日韩国产高清一区二区| 欧美精品一区二区三区一线天视频| 国产精品久久国产精麻豆99网站| 亚洲福利视频一区二区| 国产一区二区看久久| 欧美性xxxxxx少妇| 精品久久五月天| 一区二区三区精品视频在线| 久久成人久久鬼色| 色欧美88888久久久久久影院| 91精品国产色综合久久不卡电影 | 91精品国产综合久久福利| 久久久久久久久岛国免费| 一区二区三区精密机械公司| 国内精品在线播放| 在线精品视频小说1| 欧美国产日本视频| 日本亚洲最大的色成网站www| 懂色av一区二区三区蜜臀| 欧美欧美午夜aⅴ在线观看| 国产欧美一区二区在线| 日韩二区三区四区| 91麻豆国产香蕉久久精品| 精品成人免费观看| 亚洲va天堂va国产va久| 99久久精品免费看国产免费软件| 日韩欧美一二三区| 亚洲电影第三页| 91色porny| 国产亚洲欧洲一区高清在线观看| 天堂av在线一区| 91国偷自产一区二区三区观看| 国产欧美日韩另类一区| 久久国产尿小便嘘嘘| 7777女厕盗摄久久久| 亚洲六月丁香色婷婷综合久久 | 91老师片黄在线观看| 中文字幕高清一区| 国产自产高清不卡| 欧美一级久久久| 五月激情综合色| 欧亚洲嫩模精品一区三区| 国产精品久久久久久亚洲毛片| 国产美女久久久久| 日韩欧美一区二区久久婷婷| 日韩精彩视频在线观看| 欧美日韩国产a| 亚州成人在线电影| 欧美日韩一区二区三区视频| 亚洲一区二区高清| 欧美三级韩国三级日本三斤| 亚洲国产精品一区二区尤物区| 欧美中文字幕一区二区三区亚洲| 亚洲精品免费视频|