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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? nic_recv.c

?? plx9054的WDM驅(qū)動(dòng)程序
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*++

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
    //

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久国产一区二区三区四区小说| 国产精品污网站| 国产成人免费视频网站| 一区二区理论电影在线观看| 欧美不卡一区二区三区四区| 色菇凉天天综合网| 国产精品综合二区| 天堂午夜影视日韩欧美一区二区| 国产精品久久久久永久免费观看 | 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品午夜电影| 这里只有精品免费| 在线欧美日韩精品| 99九九99九九九视频精品| 精品一区二区日韩| 午夜伊人狠狠久久| 亚洲美女少妇撒尿| 国产精品久久久久久户外露出 | 国产91色综合久久免费分享| 日韩高清在线电影| 亚洲国产日韩精品| 成人欧美一区二区三区视频网页| 26uuu国产一区二区三区| 91精品国产综合久久香蕉的特点| 色婷婷综合中文久久一本| 成人av片在线观看| av资源站一区| jvid福利写真一区二区三区| 国产精品中文字幕日韩精品| 久久99精品国产| 蜜桃视频在线观看一区二区| 日韩影院免费视频| 亚洲第一在线综合网站| 亚洲国产另类av| 亚洲一二三四久久| 一区二区久久久久| 亚洲一区二区五区| 亚洲一区二区精品久久av| 亚洲乱码国产乱码精品精的特点| 中文字幕精品一区| 亚洲国产经典视频| 国产精品久久久久久久久免费丝袜| 国产女人水真多18毛片18精品视频 | 欧美一区二区免费| 制服视频三区第一页精品| 91精品国产91热久久久做人人| 欧美日韩高清影院| 日韩一级免费观看| 精品久久国产97色综合| 精品国精品自拍自在线| 欧美精品一区二区三区在线播放| 精品国产乱码久久久久久蜜臀| 日韩欧美一级二级三级| 欧美精品一区二区三区高清aⅴ| 日韩欧美精品三级| 精品国产sm最大网站免费看| 久久九九全国免费| 亚洲欧洲另类国产综合| 亚洲免费av在线| 亚洲成人午夜电影| 久久99久久99精品免视看婷婷| 国产乱码一区二区三区| 成人污视频在线观看| 91在线精品一区二区| 在线观看日韩一区| 欧美一级xxx| 久久无码av三级| 成人欧美一区二区三区白人| 亚洲图片欧美色图| 激情综合五月婷婷| eeuss影院一区二区三区 | 欧美精品在线一区二区| 日韩免费高清视频| 国产精品美女一区二区| 水蜜桃久久夜色精品一区的特点| 麻豆精品在线视频| 成人精品电影在线观看| 在线亚洲精品福利网址导航| 日韩一卡二卡三卡国产欧美| 亚洲国产成人私人影院tom| 亚洲综合一区二区精品导航| 六月婷婷色综合| 99久久免费精品| 日韩午夜电影在线观看| 国产精品视频yy9299一区| 午夜激情久久久| 高清视频一区二区| 91麻豆精品国产自产在线观看一区| 国产日韩欧美麻豆| 日韩高清不卡一区| 成人动漫在线一区| 欧美成人一级视频| 亚洲精品日产精品乱码不卡| 狠狠久久亚洲欧美| 欧美在线三级电影| 国产精品乱人伦| 青青草国产成人99久久| 99国产精品视频免费观看| 日韩欧美一区二区不卡| 亚洲综合在线观看视频| 国产成人午夜高潮毛片| 91精品国产综合久久久久久| 中文字幕视频一区二区三区久| 青青草97国产精品免费观看| 91精彩视频在线| 国产亚洲成年网址在线观看| 男人操女人的视频在线观看欧美| 99精品久久久久久| 久久亚洲精精品中文字幕早川悠里 | 免费成人结看片| 色丁香久综合在线久综合在线观看| 久久精品人人爽人人爽| 蜜桃视频第一区免费观看| 欧美性一二三区| 国产精品美女久久久久久久| 韩国女主播一区| 日韩欧美中文一区二区| 亚洲午夜久久久久久久久久久| 成人av综合一区| 久久精品日产第一区二区三区高清版| 全国精品久久少妇| 欧美日韩精品福利| 亚洲午夜免费视频| 欧洲日韩一区二区三区| 一区二区三区在线视频观看58| 成人黄色777网| 国产精品女主播av| 懂色av中文字幕一区二区三区| 精品国产一区二区三区忘忧草 | 国产激情一区二区三区| 欧美v亚洲v综合ⅴ国产v| 欧美在线制服丝袜| 亚洲精品乱码久久久久久| 色偷偷久久一区二区三区| 一区二区中文视频| 91女人视频在线观看| 国产精品欧美一区喷水| 97se亚洲国产综合在线| 日韩理论片中文av| 一本大道久久a久久综合| 亚洲视频香蕉人妖| 色诱视频网站一区| 一区二区在线电影| 欧美午夜精品一区二区三区 | 亚洲欧美区自拍先锋| 91亚洲精品一区二区乱码| 最近日韩中文字幕| 色噜噜偷拍精品综合在线| 亚洲一区二区黄色| 欧美一区三区二区| 久久精品国产在热久久| 国产情人综合久久777777| 成人污污视频在线观看| 亚洲综合一区二区精品导航| 91麻豆精品国产91久久久资源速度| 日日夜夜免费精品视频| 精品人伦一区二区色婷婷| 国产999精品久久久久久绿帽| 亚洲国产经典视频| 欧美亚洲禁片免费| 美女视频一区在线观看| 国产日韩欧美制服另类| 一本大道久久a久久精二百| 亚洲成人免费在线| 26uuu亚洲综合色欧美| 国产91精品一区二区麻豆亚洲| 自拍视频在线观看一区二区| 欧美日韩色一区| 另类小说图片综合网| 亚洲欧洲三级电影| 欧美一二三区在线观看| 国产99精品在线观看| 91在线一区二区三区| 日韩av网站在线观看| 国产午夜精品久久久久久久 | 久久精品夜色噜噜亚洲a∨| 成人福利电影精品一区二区在线观看 | 91免费看视频| 日本一道高清亚洲日美韩| 国产精品日日摸夜夜摸av| 欧美日韩在线直播| 粉嫩aⅴ一区二区三区四区| 亚洲成人精品影院| 欧美国产成人在线| 欧美日韩精品一二三区| 成人高清视频在线| 美腿丝袜亚洲三区| 一区二区三区在线视频免费| 精品少妇一区二区| 色天使色偷偷av一区二区| 国产一区二区三区不卡在线观看 | 国产在线国偷精品产拍免费yy| 亚洲欧洲一区二区三区| 欧美成人性战久久| 欧美在线影院一区二区| 国产黄色91视频| 婷婷综合在线观看| 综合av第一页| 久久精品免视看| 日韩欧美中文字幕精品|