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

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

?? nic_recv.c

?? plx9054的WDM驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) Microsoft Corporation.  All rights reserved.

    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY      
    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
    PURPOSE.

Module Name:
    NIC_RECV.C

Abstract:
    This module contains miniport receive routines


Environment:

    Kernel mode


Revision History:
    DChen       11-01-99    created
    EliyasY     Feb 13, 2003 converted to WDM

--*/

#include "precomp.h"

#if defined(EVENT_TRACING)
#include "nic_recv.tmh"
#endif

VOID 
NICHandleRecvInterrupt(
    IN  PFDO_DATA  FdoData
    )
/*++
Routine Description:

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

Arguments:

    FdoData     Pointer to our FdoData

Return Value:

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

    PMP_RFD         PacketArray[NIC_DEF_RFDS];              
    PMP_RFD         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;
    
    DebugPrint(TRACE, DBG_READ, "---> NICHandleRecvInterrupt\n");

    ASSERT(FdoData->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(&FdoData->RecvList))
            {
                ASSERT(FdoData->nReadyRecv == 0);
                bContinue = FALSE;  
                break;
            }

            //
            // Get the next MP_RFD to process
            //
            pMpRfd = (PMP_RFD)GetListHeadEntry(&FdoData->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);
            FdoData->nReadyRecv--;
            ASSERT(FdoData->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))
            {
                DebugPrint(WARNING, DBG_READ, "Receive failure = %x\n", PacketStatus);
                NICReturnRFD(FdoData, pMpRfd);
                continue;
            }

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

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

            pMpRfd->PacketSize = NIC_RFD_GET_PACKET_SIZE(pHwRfd);
            
            KeFlushIoBuffers(pMpRfd->Mdl, TRUE, TRUE); 

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

            }
            else
            {
                MP_SET_FLAG(pMpRfd, fMP_RFD_RESOURCES);
                
                PacketFreeArray[PacketFreeCount] = pMpRfd;
                PacketFreeCount++;

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

            PacketArray[PacketArrayCount] = pMpRfd;
            PacketArrayCount++;
            //
            // Update the number of outstanding Recvs
            //
            PciDrvIoIncrement(FdoData);
            
        }

        //
        // if we didn't process any receives, just return from here
        //
        if (PacketArrayCount == 0) 
        {
            break;
        }
        
        KeReleaseSpinLockFromDpcLevel(&FdoData->RcvLock);
        KeAcquireSpinLockAtDpcLevel(&FdoData->Lock);
        //
        // If we have a Recv interrupt and have reported a media disconnect status
        // time to indicate the new status
        //

        if (Disconnected == FdoData->MediaState)
        {
            DebugPrint(WARNING, DBG_READ, "Media state changed to Connected\n");

            MP_CLEAR_FLAG(FdoData, fMP_ADAPTER_NO_CABLE);

            FdoData->MediaState = Connected;
            
            KeReleaseSpinLockFromDpcLevel(&FdoData->Lock);
            //
            // Indicate the media event
            //
            NICServiceIndicateStatusIrp(FdoData);
        }
    
        else
        {
            KeReleaseSpinLockFromDpcLevel(&FdoData->Lock);
        }


        NICServiceReadIrps(
            FdoData,
            PacketArray,
            PacketArrayCount);

        //
        // Return all the RFDs to the pool.
        //
        KeAcquireSpinLockAtDpcLevel(&FdoData->RcvLock);

        for (Index = 0; Index < PacketFreeCount; Index++)
        {

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

    
            NICReturnRFD(FdoData, pMpRfd);
        }

    }
    
    //
    // If we ran low on RFD's, we need to allocate a new RFD
    //
    if (bAllocNewRfd)
    {
        //
        // Allocate one more RFD only if it doesn't exceed the max RFD limit
        //
        if (FdoData->CurrNumRfd < FdoData->MaxNumRfd 
                    && !FdoData->AllocNewRfd)
        {
            NTSTATUS status;
            //
            // Increment the IO count to accout for the pending workitem. This
            // will prevent us from freeing resources during stop/remove until
            // the workitem callback is executed.
            //
            PciDrvIoIncrement(FdoData);
            FdoData->AllocNewRfd = TRUE;
            
            //
            // Since we are running at DISPATCH_LEVEL, we will queue a workitem
            // to allocate RFD memory at PASSIVE_LEVEL. Note that 
            // AllocateCommonBuffer and FreeCommonBuffer can be called only at
            // PASSIVE_LEVEL.
            //
            status = PciDrvQueuePassiveLevelCallback(FdoData, 
                                        NICAllocRfdWorkItem,
                                        NULL, NULL);
            if(!NT_SUCCESS(status)){
                PciDrvIoDecrement(FdoData);
                FdoData->AllocNewRfd = FALSE;                
            }
        }
    }

    ASSERT(FdoData->nReadyRecv >= NIC_MIN_RFDS);

    DebugPrint(TRACE, DBG_READ, "<--- NICHandleRecvInterrupt\n");
}

VOID 
NICReturnRFD(
    IN  PFDO_DATA FdoData,
    IN  PMP_RFD   pMpRfd
    )
/*++
Routine Description:

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

Arguments:

    FdoData     Pointer to our FdoData
    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
    //

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久嫩草精品久久久久| 2020国产成人综合网| 日韩你懂的在线观看| 国产午夜精品美女毛片视频| 亚洲观看高清完整版在线观看| 国产一区二区三区日韩| 欧美日韩免费一区二区三区| 国产精品日日摸夜夜摸av| 秋霞午夜鲁丝一区二区老狼| 色婷婷av久久久久久久| 亚洲国产精品ⅴa在线观看| 日韩国产精品久久久久久亚洲| 91亚洲精华国产精华精华液| 亚洲线精品一区二区三区 | 日本精品免费观看高清观看| 精品久久五月天| 午夜电影网一区| 色94色欧美sute亚洲线路二| 中文字幕av在线一区二区三区| 三级在线观看一区二区| 91黄色激情网站| 亚洲欧洲成人自拍| 高清国产一区二区三区| 久久综合视频网| 久草精品在线观看| 欧美精品一区二区三区高清aⅴ | 免费观看久久久4p| 久久精品视频免费观看| 久久国产免费看| 伊人色综合久久天天人手人婷| 欧美精品久久久久久久多人混战| 91网址在线看| 国产精品嫩草久久久久| 免费看黄色91| 一本一道久久a久久精品综合蜜臀| 综合av第一页| 欧美色图天堂网| 国产麻豆精品一区二区| 亚洲一区二区三区在线| www国产精品av| 欧美唯美清纯偷拍| youjizz久久| 国内精品免费**视频| 日韩中文字幕不卡| 亚洲免费在线观看视频| 国产欧美日韩另类视频免费观看 | 国产69精品久久777的优势| 亚洲国产精品自拍| 最新热久久免费视频| 久久综合一区二区| 91精品国产一区二区人妖| 色综合天天性综合| 国产一区二区三区黄视频| 国产日韩精品视频一区| 日韩av中文字幕一区二区 | 日韩一区中文字幕| 亚洲观看高清完整版在线观看| 久久99精品国产麻豆婷婷| 国产一区二区调教| 91精品国产综合久久精品性色 | 成人丝袜18视频在线观看| 激情都市一区二区| 国产精品久久久99| 国产欧美日韩卡一| 91精品国产乱码| 精品婷婷伊人一区三区三| 国产一区二区三区黄视频| 久久99精品久久久久久久久久久久| 夜夜精品视频一区二区| 亚洲色图一区二区三区| 久久精品一区二区三区av| 欧美日韩在线直播| 91成人国产精品| 欧美在线观看视频一区二区 | 国产制服丝袜一区| 日韩av一级片| 日本不卡一区二区三区高清视频| 亚洲激情第一区| 亚洲资源中文字幕| 亚洲精品一二三四区| 国产精品久久一级| 日韩vs国产vs欧美| 性久久久久久久久| 亚洲国产精品久久不卡毛片| 国产目拍亚洲精品99久久精品| 91 com成人网| 欧美狂野另类xxxxoooo| 精品视频在线视频| 欧美日韩一区不卡| 欧美老肥妇做.爰bbww视频| 欧美吻胸吃奶大尺度电影| 精品污污网站免费看| 欧美裸体bbwbbwbbw| 色综合天天综合色综合av | 欧美吞精做爰啪啪高潮| 成人高清视频免费观看| 国产91精品一区二区| 国产精品一区二区黑丝| 国产一区二区中文字幕| 国产麻豆一精品一av一免费 | 视频一区二区欧美| 天涯成人国产亚洲精品一区av| 亚洲国产成人porn| 日本不卡123| 精品在线播放免费| 精品亚洲成a人| 91蜜桃在线观看| 欧美午夜精品久久久久久孕妇| 欧美写真视频网站| 欧美日韩精品二区第二页| 欧美一区二区三区思思人| 日韩欧美综合一区| 国产日韩精品一区二区浪潮av| 一色桃子久久精品亚洲| 亚洲激情网站免费观看| 亚洲va在线va天堂| 视频精品一区二区| 天天色天天操综合| 激情综合色丁香一区二区| 成人免费高清视频在线观看| 日本福利一区二区| 欧美一区二区三区免费视频 | 日韩欧美一级片| 国产欧美日本一区视频| 亚洲黄色小说网站| 免费人成网站在线观看欧美高清| 国产成人综合亚洲91猫咪| 在线观看免费视频综合| 欧美一级欧美三级在线观看| 日韩欧美久久一区| 国产清纯白嫩初高生在线观看91| 一区二区三区**美女毛片| 美国十次综合导航| 成+人+亚洲+综合天堂| 欧美高清dvd| 亚洲男人天堂av| 精品一区二区三区在线观看| 在线观看国产91| 久久久一区二区三区捆绑**| 日韩电影在线免费看| 国产一区二区三区四区五区美女| 欧美裸体一区二区三区| 日本一区二区免费在线| 久久精品99国产精品日本| 精品免费日韩av| 天天色天天操综合| 91国产免费观看| 国产精品国产自产拍高清av| 久久99最新地址| 欧美美女网站色| 亚洲v日本v欧美v久久精品| 99久久99久久综合| 中文子幕无线码一区tr| 美女视频免费一区| 91精品视频网| 夜夜嗨av一区二区三区四季av| 本田岬高潮一区二区三区| 精品嫩草影院久久| 日韩专区欧美专区| 国产91高潮流白浆在线麻豆| 久久免费的精品国产v∧| 午夜精品一区二区三区三上悠亚| 99久久er热在这里只有精品66| 久久免费视频一区| 精品一区二区在线免费观看| 91麻豆精品久久久久蜜臀| 亚洲婷婷在线视频| 色拍拍在线精品视频8848| 中文字幕一区二区三中文字幕| 国产综合成人久久大片91| 日韩女优制服丝袜电影| 亚洲成人av资源| 欧美亚洲一区三区| 精品剧情v国产在线观看在线| 国产在线乱码一区二区三区| 91精品国产综合久久精品app| 亚洲国产精品久久一线不卡| 在线精品视频免费播放| 亚洲精品日韩一| 色婷婷精品大在线视频| 亚洲婷婷综合色高清在线| 91蜜桃在线免费视频| 亚洲欧美另类图片小说| 一本大道久久a久久精二百| 国产精品剧情在线亚洲| 成人精品鲁一区一区二区| 国产精品色婷婷| 91蜜桃视频在线| 一区二区不卡在线视频 午夜欧美不卡在| 美女网站色91| 久久蜜桃av一区精品变态类天堂 | 国产偷国产偷亚洲高清人白洁| 国产资源在线一区| 国产精品乱人伦| 91福利小视频| 日韩国产一二三区| 精品国产伦一区二区三区观看方式| 国产在线一区观看| 国产精品乱人伦中文| 在线视频国产一区|