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

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

?? nic_recv.c

?? plx9054的WDM驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
    pHwRfd->RfdCbHeader.CbStatus = 0;
    pHwRfd->RfdActualCount = 0;
    pHwRfd->RfdCbHeader.CbCommand = (RFD_EL_BIT);
    pHwRfd->RfdCbHeader.CbLinkPointer = DRIVER_NULL;

    // Append this RFD to the RFD chain
    if (!IsListEmpty(&FdoData->RecvList))
    {
        pLastMpRfd = (PMP_RFD)GetListTailEntry(&FdoData->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(&FdoData->RecvList, (PLIST_ENTRY)pMpRfd);
    FdoData->nReadyRecv++;
    ASSERT(FdoData->nReadyRecv <= FdoData->CurrNumRfd);
}

NTSTATUS 
NICStartRecv(
    IN  PFDO_DATA  FdoData
    )
/*++
Routine Description:

    Start the receive unit if it's not in a ready state                    
    Assumption: Rcv spinlock has been acquired 

Arguments:

    FdoData     Pointer to our FdoData

Return Value:

    NT Status code
    
--*/
{
    PMP_RFD         pMpRfd;
    NTSTATUS        status;

    DebugPrint(TRACE, DBG_READ, "---> NICStartRecv\n");

    //
    // If the receiver is ready, then don't try to restart.
    //
    if (NIC_IS_RECV_READY(FdoData))
    {
        DebugPrint(LOUD, DBG_READ, "Receive unit already active\n");
        return STATUS_SUCCESS;
    }

    DebugPrint(LOUD, DBG_READ, "Re-start receive unit...\n");
    ASSERT(!IsListEmpty(&FdoData->RecvList));
    
    //
    // Get the MP_RFD head
    //
    pMpRfd = (PMP_RFD)GetListHeadEntry(&FdoData->RecvList);

    //
    // If more packets are received, clean up RFD chain again
    //
    if (NIC_RFD_GET_STATUS(pMpRfd->HwRfd))
    {
        NICHandleRecvInterrupt(FdoData);
        ASSERT(!IsListEmpty(&FdoData->RecvList));

        //
        // Get the new MP_RFD head
        //
        pMpRfd = (PMP_RFD)GetListHeadEntry(&FdoData->RecvList);
    }

    //
    // Wait for the SCB to clear before we set the general pointer
    //
    if (!WaitScb(FdoData))
    {
        status = STATUS_DEVICE_DATA_ERROR;
        goto exit;
    }

    if (FdoData->DevicePowerState > PowerDeviceD0)
    {
        status = STATUS_DEVICE_DATA_ERROR;
        goto exit;
    }
    //
    // Set the SCB General Pointer to point the current Rfd
    //
    FdoData->CSRAddress->ScbGeneralPointer = pMpRfd->HwRfdPhys;

    //
    // Issue the SCB RU start command
    //
    status = D100IssueScbCommand(FdoData, SCB_RUC_START, FALSE);
    if (status == STATUS_SUCCESS)
    {
        // wait for the command to be accepted
        if (!WaitScb(FdoData))
        {
            status = STATUS_DEVICE_DATA_ERROR;
        }
    }        
    
    exit:

    DebugPrint(TRACE, DBG_READ, "<--- NICStartRecv, Status=%x\n", status);
    return status;
}



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

    Reset the receive list                    
    Assumption: Rcv spinlock has been acquired 
    
Arguments:

    FdoData     Pointer to our FdoData

Return Value:

     None

--*/
{
    PMP_RFD   pMpRfd;      
    PHW_RFD   pHwRfd;    
    LONG      RfdCount;

    DebugPrint(TRACE, DBG_READ, "--> NICResetRecv\n");

    ASSERT(!IsListEmpty(&FdoData->RecvList));
    
    //
    // Get the MP_RFD head
    //
    pMpRfd = (PMP_RFD)GetListHeadEntry(&FdoData->RecvList);
    for (RfdCount = 0; RfdCount < FdoData->nReadyRecv; RfdCount++)
    {
        pHwRfd = pMpRfd->HwRfd;
        pHwRfd->RfdCbHeader.CbStatus = 0;

        pMpRfd = (PMP_RFD)GetListFLink(&pMpRfd->List);
    }

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


VOID
NICServiceReadIrps(
    PFDO_DATA   FdoData,
    PMP_RFD     *PacketArray,
    ULONG       PacketArrayCount
    )
/*++
Routine Description:

    Copy the data from the recv buffers to pending read IRP buffers
    and complete the IRP. When used as network driver, copy operation
    can be avoided by devising a private interface between us and the 
    NDIS-WDM filter and have the NDIS-WDM edge to indicate our buffers
    directly to NDIS.
    
Arguments:

    FdoData     Pointer to our FdoData

Return Value:

     None

--*/
{
    PIRP                irp;
    PLIST_ENTRY         listEntry;
    PMP_RFD             pMpRfd = NULL;
    ULONG               index, length;
    NTSTATUS            status;
    PVOID               buffer;
    
    DebugPrint(TRACE, DBG_READ, "--> NICServiceReadIrps\n");
    
    //
    // We need to dequeue all the entries in the queue, reset the cancel
    // routine for each of them and then process then:
    // - if the device is active, we will send them down
    // - else we will complete them with STATUS_NO_SUCH_DEVICE 
    //

    for(index=0; index < PacketArrayCount; index++)
    {
        pMpRfd = PacketArray[index];
        ASSERT(pMpRfd);
        
        //
        // Acquire the queue lock before manipulating the list entries.
        //
        KeAcquireSpinLockAtDpcLevel(&FdoData->RcvLock);

        while(TRUE){
            
            if(IsListEmpty(&FdoData->RecvQueueHead))
            {
                KeReleaseSpinLockFromDpcLevel(&FdoData->RcvLock);
                break;
            }

            //
            // Remove a request from the queue.
            //
            listEntry = RemoveHeadList(&FdoData->RecvQueueHead);

            irp = CONTAINING_RECORD(listEntry, IRP, Tail.Overlay.ListEntry);

            //
            // Set the cancel routine to NULL. This is an atomic operation.
            //
            if (IoSetCancelRoutine(irp, NULL))
            {
                //
                // Cancel routine cannot run now and cannot have already 
                // started to run.
                //
                KeReleaseSpinLockFromDpcLevel(&FdoData->RcvLock);
                //
                // Copy data from the RFD buffer to the IRP and complete
                // the IRP
                //
                buffer = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
                if(!buffer){
                    status = STATUS_INSUFFICIENT_RESOURCES;
                    length = 0;
                } else {
                
                    length = min(MmGetMdlByteCount(irp->MdlAddress), pMpRfd->PacketSize);                    
                    RtlCopyMemory(buffer, pMpRfd->Buffer, length);
                    
                    DebugPrintEx((LOUD, DBG_READ, 
                                    "Received Packet Data: %!HEXDUMP!\n",
                                    log_xstr(buffer, (USHORT)length)));
                    
                    status = STATUS_SUCCESS;
                }

                irp->IoStatus.Status = status;
                irp->IoStatus.Information = length;
                IoCompleteRequest(irp, IO_NO_INCREMENT);
                PciDrvIoDecrement (FdoData);
                break;
            }
            else
            {
                //
                // Cancel rotuine is running. Leave the irp alone.
                //
                InitializeListHead(&irp->Tail.Overlay.ListEntry);
                irp = NULL;
                continue; 
            }
        }
        
        KeAcquireSpinLockAtDpcLevel(&FdoData->RcvLock);

        //
        // Decrement the number of outstanding Recvs
        //
        PciDrvIoDecrement (FdoData);        
        
        ASSERT(MP_TEST_FLAG(pMpRfd, fMP_RFD_RECV_PEND));
        MP_CLEAR_FLAG(pMpRfd, fMP_RFD_RECV_PEND);


        if (FdoData->RfdShrinkCount < NIC_RFD_SHRINK_THRESHOLD)
        {
            NICReturnRFD(FdoData, pMpRfd);
        }
        else
        {
            ASSERT(FdoData->CurrNumRfd > FdoData->NumRfd);
            //
            // Queue a passive level callback to free RFD memory.
            // 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);              
            status = PciDrvQueuePassiveLevelCallback(FdoData, 
                                    NICFreeRfdWorkItem, (PVOID)pMpRfd, 
                                    NULL);
            if(NT_SUCCESS(status)){
                
                FdoData->RfdShrinkCount = 0;
                FdoData->CurrNumRfd--;            
                DebugPrint(TRACE, DBG_READ, "Shrink... CurrNumRfd = %d\n", 
                                                    FdoData->CurrNumRfd);
            } else {
                PciDrvIoDecrement (FdoData); // Free the reference                 
                //
                // We couldn't queue a workitem to free memory, so let us
                // put that back in the main pool and try again next time.
                //
                NICReturnRFD(FdoData, pMpRfd);
            }
        }
        
        KeReleaseSpinLockFromDpcLevel(&FdoData->RcvLock);
            
    }// end of loop

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

    return;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美精品一区二区三区四区| 亚洲va在线va天堂| 亚洲电影你懂得| 韩国精品一区二区| 欧美日韩精品系列| 亚洲欧美在线高清| 国产高清久久久| 91精品国产欧美一区二区18| 亚洲另类在线一区| 风间由美一区二区三区在线观看 | 午夜成人免费电影| 97久久精品人人做人人爽| 欧美xxx久久| 日本不卡免费在线视频| 欧美日韩精品福利| 亚洲人成网站精品片在线观看| 国产精品99久久久久久似苏梦涵| 欧美一三区三区四区免费在线看| 亚洲综合久久av| 色婷婷av一区二区三区gif| 中文一区二区完整视频在线观看| 精品午夜久久福利影院 | 国产日本欧洲亚洲| 久久99精品国产.久久久久| 91精品免费在线观看| 婷婷综合在线观看| 91精品国产91久久久久久最新毛片| 午夜精品久久久久影视| 欧美老女人第四色| 老司机精品视频在线| 欧美xxx久久| 国产成人免费在线视频| 国产欧美日韩不卡| 99久久综合国产精品| 国产精品久久久久久久久晋中| 国产成人在线观看免费网站| 中文字幕精品一区二区三区精品| 国产黑丝在线一区二区三区| 欧美国产激情一区二区三区蜜月 | 国产婷婷精品av在线| 国产精品一区在线| 国产精品视频你懂的| av不卡免费在线观看| 亚洲尤物在线视频观看| 9191久久久久久久久久久| 蜜臀av国产精品久久久久| 欧美xfplay| 97se亚洲国产综合在线| 午夜视频在线观看一区| 欧美岛国在线观看| 波多野结衣一区二区三区| 亚洲精品videosex极品| 69堂国产成人免费视频| 国产在线精品一区二区不卡了| 国产日产亚洲精品系列| 一本大道久久a久久精品综合| 午夜日韩在线电影| 久久综合久色欧美综合狠狠| 91丨九色丨黑人外教| 丝袜亚洲另类丝袜在线| 亚洲国产精品av| 在线看日本不卡| 激情深爱一区二区| 一区二区三区在线高清| 日韩欧美亚洲国产精品字幕久久久| 国产乱子轮精品视频| 亚洲精品v日韩精品| 精品处破学生在线二十三| 91网页版在线| 激情久久久久久久久久久久久久久久| 中文字幕一区二区三区视频| 欧美日韩国产综合一区二区三区 | 久久先锋影音av鲁色资源| 91国偷自产一区二区开放时间| 毛片一区二区三区| 一区二区三区四区在线免费观看| 欧美不卡在线视频| 欧美制服丝袜第一页| 国产aⅴ精品一区二区三区色成熟| 亚洲一区免费视频| 国产欧美视频一区二区三区| 欧美日韩国产成人在线91| 波多野洁衣一区| 国产一区二区三区久久悠悠色av| 亚洲一区二区在线观看视频| 国产欧美精品一区aⅴ影院 | 亚洲色图第一区| 精品精品欲导航| 欧美人妖巨大在线| 色哟哟日韩精品| 99久久精品一区| 国产高清不卡二三区| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲品质自拍视频| 国产精品高潮呻吟| 国产精品视频在线看| 久久久久国产精品麻豆| 日韩一区二区三区免费观看| 欧美日韩国产大片| 欧美色精品天天在线观看视频| www.成人在线| 成人av集中营| 丁香婷婷综合网| 懂色av一区二区三区免费看| 国产乱码一区二区三区| 精一区二区三区| 极品尤物av久久免费看| 美女国产一区二区| 麻豆国产精品官网| 久久国产剧场电影| 久久精品国产77777蜜臀| 久久精品国产一区二区三 | 日韩视频在线一区二区| 在线不卡一区二区| 制服丝袜成人动漫| 欧美一区二区三区在线电影| 在线观看91精品国产麻豆| 91麻豆精品国产自产在线观看一区| 欧美色国产精品| 555www色欧美视频| 日韩欧美的一区| 国产亚洲美州欧州综合国| 国产精品三级视频| 亚洲美女一区二区三区| 天堂va蜜桃一区二区三区漫画版 | 成人理论电影网| 色综合天天综合给合国产| 欧美在线视频不卡| 欧美日韩国产另类不卡| 精品国产第一区二区三区观看体验| 久久综合久久久久88| 国产精品久久久99| 亚洲免费成人av| 男女男精品视频| 国产成人一级电影| 欧洲视频一区二区| 日韩欧美不卡一区| 国产精品久久久久久久久快鸭 | 欧美一区二区三区系列电影| 欧美成人伊人久久综合网| 欧美激情综合五月色丁香小说| 综合久久久久久久| 日韩精品福利网| 成人免费视频视频在线观看免费| 欧美在线视频日韩| 久久九九久久九九| 亚洲国产综合视频在线观看| 久久精品国产99国产精品| 一本大道久久a久久精二百| 日韩欧美国产系列| 亚洲精品伦理在线| 久久av资源网| 日本高清成人免费播放| 欧美成人在线直播| 亚洲综合在线免费观看| 国产一本一道久久香蕉| 欧美在线你懂得| 欧美经典一区二区| 视频一区视频二区在线观看| 99久久综合精品| 久久亚洲欧美国产精品乐播| 一区二区三区精品在线观看| 国产福利一区在线观看| 欧美一级艳片视频免费观看| 亚洲欧美一区二区三区极速播放| 久久精品国产精品青草| 欧美色视频在线| 亚洲三级小视频| 国产自产2019最新不卡| 欧美精选一区二区| 中文字幕永久在线不卡| 极品美女销魂一区二区三区 | 色综合久久久久综合99| 久久综合色天天久久综合图片| 日韩精品视频网| 欧美三日本三级三级在线播放| 国产精品第13页| 国产91在线看| 久久久高清一区二区三区| 免费视频一区二区| 欧美精品v国产精品v日韩精品 | 国产午夜精品一区二区三区嫩草| 日精品一区二区三区| 欧美视频第二页| 艳妇臀荡乳欲伦亚洲一区| 暴力调教一区二区三区| 日本一区二区视频在线观看| 国产寡妇亲子伦一区二区| 欧美mv日韩mv国产网站app| 国产在线一区观看| 欧美一区二区三区性视频| 五月天一区二区三区| 欧美美女一区二区在线观看| 亚洲亚洲人成综合网络| 欧洲一区在线电影| 丝袜亚洲另类欧美综合| 欧美一区二区三区视频在线观看| 免费在线视频一区| 久久午夜电影网| 成人av网站在线|