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

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

?? nic_init.c

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

    // Setup the initial pointers to the SW and HW TCB data space
    pMpTcb = (PMP_TCB) FdoData->MpTcbMem;
    pHwTcb = (PHW_TCB) FdoData->HwSendMemAllocVa;
    HwTcbPhys = FdoData->HwSendMemAllocPa.LowPart;

    // Setup the initial pointers to the TBD data space.
    // TBDs are located immediately following the TCBs
    pHwTbd = (PTBD_STRUC) (FdoData->HwSendMemAllocVa +
                 (sizeof(TXCB_STRUC) * FdoData->NumTcb));
    HwTbdPhys = HwTcbPhys + (sizeof(TXCB_STRUC) * FdoData->NumTcb);

    // Go through and set up each TCB
    for (TcbCount = 0; TcbCount < FdoData->NumTcb; TcbCount++)
    {
        pMpTcb->HwTcb = pHwTcb;                 // save ptr to HW TCB
        pMpTcb->HwTcbPhys = HwTcbPhys;      // save HW TCB physical address

        pMpTcb->HwTbd = pHwTbd;                 // save ptr to TBD array
        pMpTcb->HwTbdPhys = HwTbdPhys;      // save TBD array physical address

        if (TcbCount){
            pMpTcb->PrevHwTcb = pHwTcb - 1;
        }
        else {
            pMpTcb->PrevHwTcb   = (PHW_TCB)((PUCHAR)FdoData->HwSendMemAllocVa +
                                  ((FdoData->NumTcb - 1) * sizeof(HW_TCB)));
        }
        pHwTcb->TxCbHeader.CbStatus = 0;        // clear the status 
        pHwTcb->TxCbHeader.CbCommand = CB_EL_BIT | CB_TX_SF_BIT | CB_TRANSMIT;


        // Set the link pointer in HW TCB to the next TCB in the chain.  
        // If this is the last TCB in the chain, then set it to the first TCB.
        if (TcbCount < FdoData->NumTcb - 1)
        {
            pMpTcb->Next = pMpTcb + 1;
            pHwTcb->TxCbHeader.CbLinkPointer = HwTcbPhys + sizeof(HW_TCB);
        }
        else
        {
            pMpTcb->Next = (PMP_TCB) FdoData->MpTcbMem;
            pHwTcb->TxCbHeader.CbLinkPointer = 
                FdoData->HwSendMemAllocPa.LowPart;
        }

        pHwTcb->TxCbThreshold = (UCHAR) FdoData->AiThreshold;
        pHwTcb->TxCbTbdPointer = HwTbdPhys;

        pMpTcb++; 
        pHwTcb++;
        HwTcbPhys += sizeof(TXCB_STRUC);
        pHwTbd = (PTBD_STRUC)((PUCHAR)pHwTbd + sizeof(TBD_STRUC) * NIC_MAX_PHYS_BUF_COUNT);
        HwTbdPhys += sizeof(TBD_STRUC) * NIC_MAX_PHYS_BUF_COUNT;
    }

    // set the TCB head/tail indexes
    // head is the olded one to free, tail is the next one to use
    FdoData->CurrSendHead = (PMP_TCB) FdoData->MpTcbMem;
    FdoData->CurrSendTail = (PMP_TCB) FdoData->MpTcbMem;

    DebugPrint(TRACE, DBG_INIT, "<-- NICInitSend\n");
}

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

    Initialize receive data structures

Arguments:

    FdoData     Pointer to our adapter

Return Value:

--*/    
{
    NTSTATUS        status = STATUS_INSUFFICIENT_RESOURCES;
    PMP_RFD         pMpRfd;      
    LONG            RfdCount;
    PDMA_ADAPTER    DmaAdapterObject = FdoData->DmaAdapterObject;

    DebugPrint(TRACE, DBG_INIT, "--> NICInitRecv\n");


    // Setup each RFD
    for (RfdCount = 0; RfdCount < FdoData->NumRfd; RfdCount++)
    {
        pMpRfd = ExAllocateFromNPagedLookasideList(&FdoData->RecvLookaside);
        if (!pMpRfd)
        {
            //ErrorValue = ERRLOG_OUT_OF_LOOKASIDE_MEMORY;
            continue;
        }
        //
        // Allocate the shared memory for this RFD.
        //
        pMpRfd->OriginalHwRfd = FdoData->AllocateCommonBuffer(
            DmaAdapterObject,
            FdoData->HwRfdSize,
            &pMpRfd->OriginalHwRfdPa,
            FALSE);

        if (!pMpRfd->OriginalHwRfd)
        {
            //ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
            ExFreeToNPagedLookasideList(&FdoData->RecvLookaside, pMpRfd);
            continue;
        }

        //
        // Get a 8-byts aligned memory from the original HwRfd
        //
        pMpRfd->HwRfd = (PHW_RFD)DATA_ALIGN(pMpRfd->OriginalHwRfd);
        
        //
        // Now HwRfd is already 8-bytes aligned, and the size of HwPfd header(not data part) is a multiple of 8,
        // If we shift HwRfd 0xA bytes up, the Ethernet header size is 14 bytes long, then the data will be at
        // 8 byte boundary. 
        // 
        pMpRfd->HwRfd = (PHW_RFD)((PUCHAR)(pMpRfd->HwRfd) + HWRFD_SHIFT_OFFSET);
        //
        // Update physical address accordingly
        // 
        pMpRfd->HwRfdPa.QuadPart = pMpRfd->OriginalHwRfdPa.QuadPart + 
                         BYTES_SHIFT(pMpRfd->HwRfd, pMpRfd->OriginalHwRfd);


        status = NICAllocRfd(FdoData, pMpRfd);
        if (!NT_SUCCESS(status))
        {
            ExFreeToNPagedLookasideList(&FdoData->RecvLookaside, pMpRfd);
            continue;
        }
        //
        // Add this RFD to the RecvList
        // 
        FdoData->CurrNumRfd++;                      
        NICReturnRFD(FdoData, pMpRfd);
    }

    if (FdoData->CurrNumRfd > NIC_MIN_RFDS)
    {
        status = STATUS_SUCCESS;
    }
    //
    // FdoData->CurrNumRfd < NIC_MIN_RFDs
    //
    if (status != STATUS_SUCCESS)
    {
        // TODO: Log an entry into the eventlog
    }

    DebugPrint(TRACE, DBG_INIT, "<-- NICInitRecv, status=%x\n", status);

    return status;
}

NTSTATUS
NICAllocRfd(
    IN  PFDO_DATA     FdoData,
    IN  PMP_RFD       pMpRfd
    )
/*++
Routine Description:

    Allocate MDL and associate with a RFD.
    Should be called at PASSIVE_LEVEL.

Arguments:

    FdoData     Pointer to our adapter
    pMpRfd      pointer to a RFD

Return Value:


--*/    
{
    NTSTATUS            status = STATUS_SUCCESS;
    PHW_RFD             pHwRfd;    

    PAGED_CODE();
    
    do{
        pHwRfd = pMpRfd->HwRfd;
        pMpRfd->HwRfdPhys = pMpRfd->HwRfdPa.LowPart;

        pMpRfd->Flags = 0;
        pMpRfd->Mdl = IoAllocateMdl((PVOID)&pHwRfd->RfdBuffer.RxMacHeader,
                                    NIC_MAX_PACKET_SIZE,
                                    FALSE,
                                    FALSE,
                                    NULL);
        if (!pMpRfd->Mdl)
        {
            status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }
        
        MmBuildMdlForNonPagedPool(pMpRfd->Mdl);
        
        pMpRfd->Buffer = &pHwRfd->RfdBuffer.RxMacHeader;

        // Init each RFD header
        pHwRfd->RfdRbdPointer = DRIVER_NULL;
        pHwRfd->RfdSize = NIC_MAX_PACKET_SIZE;
    }while(FALSE);

    if (!NT_SUCCESS(status))
    {
        if (pMpRfd->HwRfd)
        {
            //
            // Free HwRfd, we need to free the original memory 
            // pointed by OriginalHwRfd.
            // 
            FdoData->FreeCommonBuffer(
                FdoData->DmaAdapterObject,
                FdoData->HwRfdSize,
                pMpRfd->OriginalHwRfdPa,        
                pMpRfd->OriginalHwRfd,
                FALSE);
    
            pMpRfd->HwRfd = NULL;
            pMpRfd->OriginalHwRfd = NULL;
        }
    }

    return status;

}

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

    Free a RFD.
    Should be called at PASSIVE_LEVEL.

Arguments:

    FdoData     Pointer to our adapter
    pMpRfd      Pointer to a RFD

Return Value:

    None                                                    

--*/    
{
    PAGED_CODE();
    
    ASSERT(pMpRfd->HwRfd);    
    ASSERT(pMpRfd->Mdl);  

    IoFreeMdl(pMpRfd->Mdl);
    
    //
    // Free HwRfd, we need to free the original memory pointed 
    // by OriginalHwRfd.
    // 
    
    FdoData->FreeCommonBuffer(
        FdoData->DmaAdapterObject,
        FdoData->HwRfdSize,
        pMpRfd->OriginalHwRfdPa,        
        pMpRfd->OriginalHwRfd,
        FALSE);
    
    pMpRfd->HwRfd = NULL;
    pMpRfd->OriginalHwRfd = NULL;
    
    ExFreeToNPagedLookasideList(&FdoData->RecvLookaside, pMpRfd);
}

VOID
NICAllocRfdWorkItem(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PWORK_ITEM_CONTEXT Context
)
/*++

Routine Description:

   Worker routine to allocate memory for RFD at PASSIVE_LEVEL.

Arguments:

    DeviceObject - pointer to a device object.

    Context - pointer to the workitem.

Return Value:

   VOID

--*/
{
    PFDO_DATA   FdoData = (PFDO_DATA)DeviceObject->DeviceExtension;
    KIRQL       oldIrql;
    PMP_RFD     TempMpRfd;
    NTSTATUS    status;

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

    PAGED_CODE();
    
    TempMpRfd = ExAllocateFromNPagedLookasideList(&FdoData->RecvLookaside);
    if (TempMpRfd)
    {
        //
        // Allocate the shared memory for this RFD.
        //
        TempMpRfd->OriginalHwRfd = FdoData->AllocateCommonBuffer(
                                        FdoData->DmaAdapterObject,
                                        FdoData->HwRfdSize,
                                        &TempMpRfd->OriginalHwRfdPa,
                                        FALSE);
        if (!TempMpRfd->OriginalHwRfd)
        {
            ExFreeToNPagedLookasideList(&FdoData->RecvLookaside, TempMpRfd);
            DebugPrint(ERROR, DBG_READ, "Recv: AllocateCommonBuffer failed\n");                    
            goto Exit;    
        }

        //
        // First get a HwRfd at 8 byte boundary from OriginalHwRfd
        // 
        TempMpRfd->HwRfd = (PHW_RFD)DATA_ALIGN(TempMpRfd->OriginalHwRfd);
        //
        // Then shift HwRfd so that the data(after ethernet header) is at 8 bytes boundary
        //
        TempMpRfd->HwRfd = (PHW_RFD)((PUCHAR)TempMpRfd->HwRfd + HWRFD_SHIFT_OFFSET);
        //
        // Update physical address as well
        // 
        TempMpRfd->HwRfdPa.QuadPart = TempMpRfd->OriginalHwRfdPa.QuadPart + 
                            BYTES_SHIFT(TempMpRfd->HwRfd, TempMpRfd->OriginalHwRfd);

        status = NICAllocRfd(FdoData, TempMpRfd);
        if (!NT_SUCCESS(status))
        {
            //
            // NICAllocRfd frees common buffer when it returns an error.
            // So, let us not worry about freeing that here.
            //
            ExFreeToNPagedLookasideList(&FdoData->RecvLookaside, TempMpRfd);
            DebugPrint(ERROR, DBG_READ, "Recv: NICAllocRfd failed %x\n", status);                    
            goto Exit;
        }

        KeAcquireSpinLock(&FdoData->RcvLock, &oldIrql);
        
        //
        // Add this RFD to the RecvList
        //
        FdoData->CurrNumRfd++;                      
        NICReturnRFD(FdoData, TempMpRfd);

        KeReleaseSpinLock(&FdoData->RcvLock, oldIrql);
        
        ASSERT(FdoData->CurrNumRfd <= FdoData->MaxNumRfd);
        DebugPrint(TRACE, DBG_READ, "CurrNumRfd=%d\n", FdoData->CurrNumRfd);                
        
    }    

Exit:
    PciDrvIoDecrement(FdoData);
    FdoData->AllocNewRfd = FALSE;                

    IoFreeWorkItem((PIO_WORKITEM)Context->WorkItem);
    ExFreePool((PVOID)Context);

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

    return;
}
    
VOID
NICFreeRfdWorkItem(
    IN PDEVICE_OBJECT       DeviceObject,
    IN PWORK_ITEM_CONTEXT   Context
)
/*++

Routine Description:

   Worker routine to RFD memory at PASSIVE_LEVEL.

Arguments:

    DeviceObject - pointer to a device object.

    Context - pointer to the workitem.

Return Value:

   VOID

--*/
{
    PFDO_DATA   fdoData = (PFDO_DATA)DeviceObject->DeviceExtension;
    PMP_RFD     pMpRfd = Context->Argument1;

    DebugPrint(TRACE, DBG_READ, "---> NICFreeRfdWorkItem\n");
    
    PAGED_CODE();
    
    NICFreeRfd(fdoData, pMpRfd);

    IoFreeWorkItem((PIO_WORKITEM)Context->WorkItem);
    ExFreePool((PVOID)Context);

    PciDrvIoDecrement (fdoData);
    
    DebugPrint(TRACE, DBG_READ, "<--- NICFreeRfdWorkItem\n");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人欧美edvon| 这里只有精品电影| 欧美三区在线观看| 久久久久国产精品厨房| 一区二区三区久久| 成人综合在线视频| 91精品国产免费| 夜夜精品视频一区二区| 成人h版在线观看| 亚洲精品一区二区三区影院| 亚洲国产裸拍裸体视频在线观看乱了 | 国产精品美女久久久久久久久| 亚洲.国产.中文慕字在线| 国产二区国产一区在线观看| 这里是久久伊人| 午夜电影一区二区| 在线视频综合导航| 欧美精品一区二区三区久久久| 亚洲成人av一区二区三区| 国产999精品久久| 精品国产一区二区精华| 麻豆一区二区三区| 正在播放一区二区| 欧美a级理论片| 91精品国产一区二区三区| 三级在线观看一区二区| 欧美日韩国产一级二级| 一区二区三区在线视频免费| 97久久超碰国产精品电影| 久久久精品黄色| 国产.欧美.日韩| 亚洲国产精品成人综合| 成人免费视频caoporn| 国产精品久久久久久久浪潮网站| 高清视频一区二区| 国产精品萝li| 色综合天天天天做夜夜夜夜做| 日韩一区日韩二区| 色婷婷久久综合| 26uuu久久综合| 色94色欧美sute亚洲线路一久 | 国产欧美日本一区二区三区| 国产一区在线视频| 国产欧美在线观看一区| 成人app软件下载大全免费| 国产精品久久久久影视| 色综合天天综合网天天看片| 亚洲综合久久久| 欧美片在线播放| 激情文学综合插| 国产精品久久久一区麻豆最新章节| 91老司机福利 在线| 亚洲尤物视频在线| 日韩欧美中文一区二区| 国产一区二区三区在线观看精品| 日本一区二区免费在线观看视频| 99久久精品国产网站| 亚洲成av人影院| 337p粉嫩大胆色噜噜噜噜亚洲| 国产成人福利片| 伊人色综合久久天天人手人婷| 国产99一区视频免费| 国产精品入口麻豆九色| 欧美伊人精品成人久久综合97| 日本91福利区| 专区另类欧美日韩| 欧美一区二区三区播放老司机| 国产成人在线看| 午夜精品福利久久久| 久久精品视频在线免费观看| 色婷婷av一区二区三区大白胸| 日本欧美肥老太交大片| 中文字幕日韩av资源站| 91麻豆精品国产自产在线观看一区 | 欧美在线视频不卡| 精品无人区卡一卡二卡三乱码免费卡| 久久九九久精品国产免费直播| 日本高清不卡aⅴ免费网站| 蜜桃av一区二区三区电影| 亚洲欧洲精品一区二区三区| 日韩欧美美女一区二区三区| av午夜一区麻豆| 六月丁香婷婷久久| 亚洲一区在线观看免费观看电影高清 | 欧美一级日韩不卡播放免费| 成人激情免费视频| 久久99蜜桃精品| 亚洲高清视频在线| 国产精品伦理一区二区| 日韩欧美久久久| 欧美日韩成人综合在线一区二区| 粉嫩蜜臀av国产精品网站| 日本成人在线看| 亚洲午夜一区二区三区| 国产精品国产三级国产普通话三级| 日韩午夜在线观看| 欧美在线免费观看亚洲| 不卡的av在线| 风流少妇一区二区| 国产在线播精品第三| 青青草精品视频| 日韩av电影免费观看高清完整版 | 中文在线资源观看网站视频免费不卡 | 蜜桃视频第一区免费观看| 亚洲成人激情综合网| 亚洲欧美偷拍卡通变态| 国产精品欧美精品| 欧美高清在线一区| 久久精品亚洲一区二区三区浴池| 日韩西西人体444www| 欧美一级日韩不卡播放免费| 欧美电影一区二区| 欧美美女一区二区在线观看| 欧美色网站导航| 欧美日韩的一区二区| 5858s免费视频成人| 欧美日韩久久一区| 宅男噜噜噜66一区二区66| 91精品国产综合久久精品性色| 欧美男生操女生| 日韩一区二区在线免费观看| 欧美一区二区三区在| 欧美成人猛片aaaaaaa| 日韩无一区二区| 久久久久久久久久久久久女国产乱| 精品国产乱码久久| 亚洲国产高清不卡| 亚洲日穴在线视频| 午夜亚洲国产au精品一区二区| 午夜精品一区二区三区免费视频| 午夜精品在线视频一区| 麻豆精品在线视频| 国产成人免费在线观看不卡| 色呦呦网站一区| 欧美精品日韩精品| 久久久精品影视| 日韩毛片高清在线播放| 午夜亚洲国产au精品一区二区| 免费观看一级特黄欧美大片| 韩国精品久久久| 91一区一区三区| 91精品在线观看入口| 久久久午夜精品理论片中文字幕| 国产精品久久久久久久久动漫| 亚洲午夜久久久久久久久电影网 | 久久精品国内一区二区三区| 国内精品久久久久影院一蜜桃| 成人做爰69片免费看网站| 欧美婷婷六月丁香综合色| 日韩一区二区三区视频在线| 国产精品亲子伦对白| 亚洲二区在线视频| 国产suv一区二区三区88区| 在线观看三级视频欧美| 久久综合久色欧美综合狠狠| 亚洲免费在线电影| 精品一二三四区| 91福利国产精品| 国产色综合一区| 亚洲成人午夜电影| 成人午夜在线视频| 欧美一区二区性放荡片| 中文字幕日韩欧美一区二区三区| 免费成人美女在线观看.| eeuss影院一区二区三区| 日韩亚洲欧美综合| 亚洲五月六月丁香激情| 国产·精品毛片| 精品国产一区二区三区四区四| 一区二区三区成人| 成人丝袜高跟foot| 日韩精品专区在线影院重磅| 亚洲综合色视频| 91网站最新地址| 国产无人区一区二区三区| 日韩av一区二区三区四区| 在线免费亚洲电影| 亚洲视频免费看| 岛国一区二区在线观看| 26uuu亚洲综合色欧美| 日本欧美在线看| 91精品国产一区二区三区蜜臀| 亚洲综合图片区| 日本精品免费观看高清观看| 国产精品午夜在线| 国产伦精品一区二区三区在线观看| 欧美日韩大陆一区二区| 亚洲一区二区三区四区在线| 一本色道久久综合亚洲aⅴ蜜桃| 中文字幕欧美国产| 国产黑丝在线一区二区三区| 日韩美女视频在线| 美国十次了思思久久精品导航| 欧美日韩mp4| 日韩国产在线观看一区| 777午夜精品免费视频| 亚洲福利视频一区| 欧美日韩视频在线第一区| 亚洲一二三区视频在线观看| 欧美午夜在线观看|