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

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

?? mp_nic.c

?? Intel EtherExpressTM PRO/100+ Ethernet 網卡在Windows2000/xp下的PCI驅動程序源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:

    NDIS_STATUS_SUCCESS
    NDIS_STATUS_HARD_ERRORS
    NDIS_STATUS_PENDING

--*/
{
    NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;
    PMP_TCB         pMpTcb;

#if DBG
    LONG            i;
#endif

    DBGPRINT(MP_TRACE, ("---> MpHandleSendInterrupt\n"));

    //
    // Any packets being sent? Any packet waiting in the send queue?
    //
    if (Adapter->nBusySend == 0 &&
        IsQueueEmpty(&Adapter->SendWaitQueue))
    {
        ASSERT(Adapter->CurrSendHead == Adapter->CurrSendTail);
        DBGPRINT(MP_TRACE, ("<--- MpHandleSendInterrupt\n"));
        return Status;
    }

    //
    // Check the first TCB on the send list
    //
    while (Adapter->nBusySend > 0)
    {

#if DBG
        pMpTcb = Adapter->CurrSendHead;
        for (i = 0; i < Adapter->nBusySend; i++)
        {
            pMpTcb = pMpTcb->Next;   
        }

        if (pMpTcb != Adapter->CurrSendTail)
        {
            DBGPRINT(MP_ERROR, ("nBusySend= %d\n", Adapter->nBusySend));
            DBGPRINT(MP_ERROR, ("CurrSendhead= "PTR_FORMAT"\n", Adapter->CurrSendHead));
            DBGPRINT(MP_ERROR, ("CurrSendTail= "PTR_FORMAT"\n", Adapter->CurrSendTail));
            ASSERT(FALSE);
        }
#endif      

        pMpTcb = Adapter->CurrSendHead;

        //
        // Is this TCB completed?
        //
        if (pMpTcb->HwTcb->TxCbHeader.CbStatus & CB_STATUS_COMPLETE)
        {
            //
            // Check if this is a multicast hw workaround packet
            //
            if ((pMpTcb->HwTcb->TxCbHeader.CbCommand & CB_CMD_MASK) != CB_MULTICAST)
            {
                MP_FREE_SEND_PACKET_FUN(Adapter, pMpTcb);
                
            }
            else
            {
                               
            
            }
        }
        else
        {
            break;
        }
    }

    //
    // If we queued any transmits because we didn't have any TCBs earlier,
    // dequeue and send those packets now, as long as we have free TCBs.
    //
    if (MP_IS_READY(Adapter))
    {
        while (!IsQueueEmpty(&Adapter->SendWaitQueue) &&
            MP_TCB_RESOURCES_AVAIABLE(Adapter))
        {
            PNDIS_PACKET Packet;
            PQUEUE_ENTRY pEntry; 
            
#if OFFLOAD
            if (MP_TEST_FLAG(Adapter, fMP_SHARED_MEM_IN_USE))
            {
                break;
            }
#endif
            
            pEntry = RemoveHeadQueue(&Adapter->SendWaitQueue); 
            
            ASSERT(pEntry);
            
            Adapter->nWaitSend--;

            Packet = CONTAINING_RECORD(pEntry, NDIS_PACKET, MiniportReserved);

            DBGPRINT(MP_INFO, ("MpHandleSendInterrupt - send a queued packet\n"));
            
            Status = MpSendPacketFun(Adapter, Packet, TRUE);
            if (Status != NDIS_STATUS_SUCCESS)
            {
                break;
            }
        }
    }

    DBGPRINT(MP_TRACE, ("<--- MpHandleSendInterrupt\n"));
    return Status;
}

VOID MpHandleRecvInterrupt(
    IN  PMP_ADAPTER  Adapter
    )
/*++
Routine Description:

    Interrupt handler for receive processing
    Put the received packets into an array and call NdisMIndicateReceivePacket
    If we run low on RFDs, allocate another one
    Assumption: Rcv spinlock has been acquired 

Arguments:

    Adapter     Pointer to our adapter

Return Value:

    None
    
--*/
{
    PMP_RFD         pMpRfd;
    PHW_RFD         pHwRfd;

    PNDIS_PACKET    PacketArray[NIC_DEF_RFDS];              
    PNDIS_PACKET    PacketFreeArray[NIC_DEF_RFDS];
    UINT            PacketArrayCount;
    UINT            PacketFreeCount;
    UINT            Index;
    UINT            LoopIndex = 0;
    UINT            LoopCount = NIC_MAX_RFDS / NIC_DEF_RFDS + 1;    // avoid staying here too long

    BOOLEAN         bContinue = TRUE;
    BOOLEAN         bAllocNewRfd = FALSE;
    USHORT          PacketStatus;

    
    DBGPRINT(MP_TRACE, ("---> MpHandleRecvInterrupt\n"));

    ASSERT(Adapter->nReadyRecv >= NIC_MIN_RFDS);
    
    while (LoopIndex++ < LoopCount && bContinue)
    {
        PacketArrayCount = 0;
        PacketFreeCount = 0;

        //
        // Process up to the array size RFD's
        //
        while (PacketArrayCount < NIC_DEF_RFDS)
        {
            if (IsListEmpty(&Adapter->RecvList))
            {
                ASSERT(Adapter->nReadyRecv == 0);
                bContinue = FALSE;  
                break;
            }

            //
            // Get the next MP_RFD to process
            //
            pMpRfd = (PMP_RFD)GetListHeadEntry(&Adapter->RecvList);

            //
            // Get the associated HW_RFD
            //
            pHwRfd = pMpRfd->HwRfd;
            
            //
            // Is this packet completed?
            //
            PacketStatus = NIC_RFD_GET_STATUS(pHwRfd);
            if (!NIC_RFD_STATUS_COMPLETED(PacketStatus))
            {
                bContinue = FALSE;
                break;
            }

            //
            // HW specific - check if actual count field has been updated
            //
            if (!NIC_RFD_VALID_ACTUALCOUNT(pHwRfd))
            {
                bContinue = FALSE;
                break;
            }


            //
            // Remove the RFD from the head of the List
            //
            RemoveEntryList((PLIST_ENTRY)pMpRfd);
            Adapter->nReadyRecv--;
            ASSERT(Adapter->nReadyRecv >= 0);
            
            ASSERT(MP_TEST_FLAG(pMpRfd, fMP_RFD_RECV_READY));
            MP_CLEAR_FLAG(pMpRfd, fMP_RFD_RECV_READY);

            //
            // A good packet? drop it if not.
            //
            if (!NIC_RFD_STATUS_SUCCESS(PacketStatus))
            {
                DBGPRINT(MP_WARN, ("Receive failure = %x\n", PacketStatus));
                NICReturnRFD(Adapter, pMpRfd);
                continue;
            }

            //
            // Do not receive any packets until a filter has been set
            //
            if (!Adapter->PacketFilter)
            {
                NICReturnRFD(Adapter, pMpRfd);
                continue;
            }

            //
            // Do not receive any packets until we are at D0
            //
            if (Adapter->CurrentPowerState != NdisDeviceStateD0)
            {
                NICReturnRFD(Adapter, pMpRfd);
                continue;
            }

            pMpRfd->PacketSize = NIC_RFD_GET_PACKET_SIZE(pHwRfd);
            
            NdisAdjustBufferLength(pMpRfd->NdisBuffer, pMpRfd->PacketSize);
            NdisFlushBuffer(pMpRfd->NdisBuffer, FALSE);

            // we don't mess up the buffer chain, no need to make this call in this case                                  
            // NdisRecalculatePacketCounts(pMpRfd->ReceivePacket);

            //
            // set the status on the packet, either resources or success
            //
            if (Adapter->nReadyRecv >= MIN_NUM_RFD)
            {
                // NDIS_STATUS_SUCCESS
                NDIS_SET_PACKET_STATUS(pMpRfd->NdisPacket, NDIS_STATUS_SUCCESS);
                MP_SET_FLAG(pMpRfd, fMP_RFD_RECV_PEND);
                
                InsertTailList(&Adapter->RecvPendList, (PLIST_ENTRY)pMpRfd);
                MP_INC_RCV_REF(Adapter);

            }
            else
            {
                //
                // NDIS_STATUS_RESOURCES
                //
                NDIS_SET_PACKET_STATUS(pMpRfd->NdisPacket, NDIS_STATUS_RESOURCES);
                MP_SET_FLAG(pMpRfd, fMP_RFD_RESOURCES);
                
                PacketFreeArray[PacketFreeCount] = pMpRfd->NdisPacket;
                PacketFreeCount++;

                //
                // Reset the RFD shrink count - don't attempt to shrink RFD
                //
                Adapter->RfdShrinkCount = 0;
                
                //
                // Remember to allocate a new RFD later
                //
                bAllocNewRfd = TRUE;
            }

            PacketArray[PacketArrayCount] = pMpRfd->NdisPacket;
            PacketArrayCount++;
        }

        //
        // if we didn't process any receives, just return from here
        //
        if (PacketArrayCount == 0) 
        {
            break;
        }
        //
        // Update the number of outstanding Recvs
        //
        Adapter->PoMgmt.OutstandingRecv += PacketArrayCount;

        NdisDprReleaseSpinLock(&Adapter->RcvLock);
        NdisDprAcquireSpinLock(&Adapter->Lock);
        //
        // if we have a Recv interrupt and have reported a media disconnect status
        // time to indicate the new status
        //

        if (NdisMediaStateDisconnected == Adapter->MediaState)
        {
            DBGPRINT(MP_WARN, ("Media state changed to Connected\n"));

            MP_CLEAR_FLAG(Adapter, fMP_ADAPTER_NO_CABLE);

            Adapter->MediaState = NdisMediaStateConnected;

            
            NdisDprReleaseSpinLock(&Adapter->Lock);
            //
            // Indicate the media event
            //
            NdisMIndicateStatus(Adapter->AdapterHandle, NDIS_STATUS_MEDIA_CONNECT, (PVOID)0, 0);

            NdisMIndicateStatusComplete(Adapter->AdapterHandle);

        }
    
        else
        {
            NdisDprReleaseSpinLock(&Adapter->Lock);
        }


        NdisMIndicateReceivePacket(
            Adapter->AdapterHandle,
            PacketArray,
            PacketArrayCount);

        NdisDprAcquireSpinLock(&Adapter->RcvLock);

        //
        // NDIS won't take ownership for the packets with NDIS_STATUS_RESOURCES.
        // For other packets, NDIS always takes the ownership and gives them back 
        // by calling MPReturnPackets
        //
        for (Index = 0; Index < PacketFreeCount; Index++)
        {

            //
            // Get the MP_RFD saved in this packet, in NICAllocRfd
            //
            pMpRfd = MP_GET_PACKET_RFD(PacketFreeArray[Index]);
            
            ASSERT(MP_TEST_FLAG(pMpRfd, fMP_RFD_RESOURCES));
            MP_CLEAR_FLAG(pMpRfd, fMP_RFD_RESOURCES);

            //
            // Decrement the number of outstanding Recvs
            //
            Adapter->PoMgmt.OutstandingRecv --;
    
            NICReturnRFD(Adapter, pMpRfd);
        }
        //
        //If we have set power pending, then complete it
        //
        if (((Adapter->bSetPending == TRUE)
                && (Adapter->SetRequest.Oid == OID_PNP_SET_POWER))
                && (Adapter->PoMgmt.OutstandingRecv == 0))
        {
            MpSetPowerLowComplete(Adapter);
        }
    }
    
    //
    // If we ran low on RFD's, we need to allocate a new RFD
    //
    if (bAllocNewRfd)
    {
        //
        // Allocate one more RFD only if no pending new RFD allocation AND
        // it doesn't exceed the max RFD limit
        //
        if (!Adapter->bAllocNewRfd && Adapter->CurrNumRfd < Adapter->MaxNumRfd)
        {
            PMP_RFD TempMpRfd;
            NDIS_STATUS TempStatus;

            TempMpRfd = NdisAllocateFromNPagedLookasideList(&Adapter->RecvLookaside);
            if (TempMpRfd)
            {
                MP_INC_REF(Adapter);
                Adapter->bAllocNewRfd = TRUE;

                MP_SET_FLAG(TempMpRfd, fMP_RFD_ALLOC_PEND); 

                //
                // Allocate the shared memory for this RFD.
                //
                TempStatus = NdisMAllocateSharedMemoryAsync(
                                 Adapter->AdapterHandle,
                                 Adapter->HwRfdSize,
                                 FALSE,
                                 TempMpRfd);

                //
                // The return value will be either NDIS_STATUS_PENDING or NDIS_STATUS_FAILURE
                //
                if (TempStatus == NDIS_STATUS_FAILURE)
                {
                    MP_CLEAR_FLAGS(TempMpRfd);
                    NdisFreeToNPagedLookasideList(&Adapter->RecvLookaside, TempMpRfd);

                    Adapter->bAllocNewRfd = FALSE;
                    MP_DEC_REF(Adapter);
                }
            }
        }
    }

    ASSERT(Adapter->nReadyRecv >= NIC_MIN_RFDS);

    DBGPRINT(MP_TRACE, ("<--- MpHandleRecvInterrupt\n"));
}

VOID NICReturnRFD(
    IN  PMP_ADAPTER  Adapter,
    IN  PMP_RFD		pMpRfd
    )
/*++
Routine Description:

    Recycle a RFD and put it back onto the receive list 
    Assumption: Rcv spinlock has been acquired 

Arguments:

    Adapter     Pointer to our adapter
    pMpRfd      Pointer to the RFD 

Return Value:

    None
    
--*/
{
    PMP_RFD   pLastMpRfd;
    PHW_RFD   pHwRfd = pMpRfd->HwRfd;

    ASSERT(pMpRfd->Flags == 0);
    MP_SET_FLAG(pMpRfd, fMP_RFD_RECV_READY);
    
    //
    // HW_SPECIFIC_START
    //
    pHwRfd->RfdCbHeader.CbStatus = 0;
    pHwRfd->RfdActualCount = 0;
    pHwRfd->RfdCbHeader.CbCommand = (RFD_EL_BIT);
    pHwRfd->RfdCbHeader.CbLinkPointer = DRIVER_NULL;

    //
    // We don't use any of the OOB data besides status
    // Otherwise, we need to clean up OOB data
    // NdisZeroMemory(NDIS_OOB_DATA_FROM_PACKET(pMpRfd->NdisPacket),14);
    //
    // Append this RFD to the RFD chain
    if (!IsListEmpty(&Adapter->RecvList))
    {
        pLastMpRfd = (PMP_RFD)GetListTailEntry(&Adapter->RecvList);

        // Link it onto the end of the chain dynamically
        pHwRfd = pLastMpRfd->HwRfd;
        pHwRfd->RfdCbHeader.CbLinkPointer = pMpRfd->HwRfdPhys;
        pHwRfd->RfdCbHeader.CbCommand = 0;
    }

    //
    // HW_SPECIFIC_END
    //

    //
    // The processing on this RFD is done, so put it back on the tail of
    // our list
    //
    InsertTailList(&Adapter->RecvList, (PLIST_ENTRY)pMpRfd);
    Adapter->nReadyRecv++;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国精品在线观看| 精品精品国产高清一毛片一天堂| 久久网这里都是精品| 日韩精品国产精品| 99久久国产综合色|国产精品| 中文字幕 久热精品 视频在线| 日韩经典中文字幕一区| 91浏览器打开| 亚洲午夜久久久久久久久电影院 | 爽好多水快深点欧美视频| 在线观看日韩国产| 亚洲日本电影在线| 欧美日韩大陆在线| 日韩高清国产一区在线| 欧美美女视频在线观看| 蜜臀av性久久久久蜜臀aⅴ| 日韩欧美国产午夜精品| 国产自产2019最新不卡| 国产精品嫩草99a| 欧美剧情片在线观看| 国产尤物一区二区在线| 欧美经典三级视频一区二区三区| 成人网在线免费视频| 一区二区视频在线看| 91精品国产全国免费观看| 国产成人日日夜夜| 亚洲一线二线三线视频| 日韩三级免费观看| 99精品在线观看视频| 亚洲成人福利片| 中文字幕精品一区二区三区精品| 91蜜桃在线免费视频| 麻豆久久久久久久| 亚洲精选视频免费看| 精品av久久707| 欧美另类高清zo欧美| av不卡免费在线观看| 久久99蜜桃精品| 伊人婷婷欧美激情| 国产精品美女久久久久久久久久久 | 日韩国产欧美在线观看| 中文字幕视频一区二区三区久| 欧美专区亚洲专区| 暴力调教一区二区三区| 国产大陆亚洲精品国产| 美脚の诱脚舐め脚责91 | 亚洲美女免费在线| av资源网一区| 中文字幕久久午夜不卡| 欧美一卡2卡3卡4卡| 在线精品亚洲一区二区不卡| 暴力调教一区二区三区| 东方aⅴ免费观看久久av| 看电视剧不卡顿的网站| 久久99日本精品| 久久成人综合网| 国产在线看一区| 福利电影一区二区三区| 国产一区不卡精品| 国产99久久久国产精品免费看| 盗摄精品av一区二区三区| 国产99久久久久| 99久久精品国产麻豆演员表| 色av一区二区| 日韩欧美123| 精品国产乱码久久| 中文字幕成人av| 一区二区成人在线| 色哟哟在线观看一区二区三区| 欧美视频一区二区三区| 精品国产乱码久久久久久浪潮| 国产精品成人一区二区艾草 | 欧美午夜精品一区二区三区| 欧美日韩免费电影| 日韩写真欧美这视频| 国产精品久久久久久久午夜片| 一片黄亚洲嫩模| 日韩精品一二区| 91蜜桃在线免费视频| 精品久久久久久久久久久院品网 | 久久亚洲一区二区三区明星换脸| 亚洲欧美经典视频| 国产成人无遮挡在线视频| 欧美日韩精品高清| 亚洲日本在线观看| 成人午夜免费av| 欧美xxx久久| 免费看精品久久片| 欧美特级限制片免费在线观看| 精品国产乱码久久久久久浪潮 | 色系网站成人免费| 亚洲欧洲日本在线| 国产高清一区日本| 日韩欧美一区二区不卡| 性感美女久久精品| 欧美色视频在线观看| 一区二区三区91| 成人黄色a**站在线观看| 精品国产第一区二区三区观看体验| 免费精品视频在线| 精品久久久久久久久久久久包黑料 | 天天操天天干天天综合网| 99久久婷婷国产| 亚洲自拍偷拍网站| 欧美日韩精品一区二区| 午夜精品福利一区二区三区av| 欧美日韩国产综合草草| 五月激情六月综合| 91精品国产一区二区三区| 水蜜桃久久夜色精品一区的特点| 日韩欧美精品三级| 国产精品影视在线| 国产精品你懂的在线欣赏| 91亚洲国产成人精品一区二区三 | 久久综合给合久久狠狠狠97色69| 韩国视频一区二区| 亚洲精品水蜜桃| 日韩亚洲国产中文字幕欧美| 国产福利一区二区三区视频在线| 国产亚洲美州欧州综合国| caoporn国产一区二区| 日韩国产在线观看一区| 国产女主播一区| 欧美日韩一区二区三区四区五区| 精品一区二区影视| 自拍偷拍欧美激情| 日韩一区二区三区av| 91视频在线观看免费| 极品少妇xxxx精品少妇偷拍| 亚洲婷婷国产精品电影人久久| 日韩欧美黄色影院| 欧美日韩在线精品一区二区三区激情| 精品一区二区精品| 亚洲精品国产无套在线观 | 欧美日韩免费观看一区三区| 国产成人精品网址| 麻豆国产精品视频| 午夜成人免费视频| 亚洲一区免费在线观看| 中文字幕国产精品一区二区| 精品福利在线导航| 精品国产一区二区三区av性色| 欧美电影一区二区三区| 欧美最猛性xxxxx直播| 一本色道久久综合亚洲aⅴ蜜桃| 北条麻妃国产九九精品视频| 国产东北露脸精品视频| 激情国产一区二区| 国产精品1区二区.| 丁香激情综合国产| 国产高清精品久久久久| 国产成人在线视频网站| 成人高清在线视频| 色综合色狠狠综合色| 91啪在线观看| 日韩欧美综合在线| 日本一区二区高清| 亚洲免费观看高清完整版在线观看| 中文字幕一区二区不卡 | 精品国产免费一区二区三区香蕉| 日韩一区和二区| 欧美国产日本视频| 天堂精品中文字幕在线| 久久99久久久久| 国产一区二区不卡| 91久久精品一区二区二区| 欧美乱妇一区二区三区不卡视频| 欧美v日韩v国产v| 久久久久久久久一| 亚洲第一综合色| 国产麻豆成人精品| 91.麻豆视频| 中文字幕国产一区二区| 午夜成人免费电影| 91免费版在线看| 国产偷国产偷亚洲高清人白洁| 亚洲夂夂婷婷色拍ww47| 成人免费视频国产在线观看| 欧美人牲a欧美精品| 欧美国产欧美综合| 国产馆精品极品| 精品国产人成亚洲区| 日本91福利区| 欧美日韩国产区一| 亚洲国产美女搞黄色| 色就色 综合激情| 国产精品欧美久久久久无广告| 日本v片在线高清不卡在线观看| 一本久道中文字幕精品亚洲嫩| 国产欧美日韩视频一区二区| 蜜桃久久精品一区二区| 欧美中文字幕久久| 夜夜精品浪潮av一区二区三区| 99国产精品国产精品毛片| 久久先锋影音av鲁色资源| 日本系列欧美系列| www成人在线观看| 丁香婷婷综合激情五月色| 日本一区二区动态图| 成人激情动漫在线观看|