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

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

?? ehci.c

?? ReactOS是一些高手根據Windows XP的內核編寫出的類XP。內核實現機理和API函數調用幾乎相同。甚至可以兼容XP的程序。喜歡研究系統內核的人可以看一看。
?? C
?? 第 1 頁 / 共 5 頁
字號:
    return new;
}

BOOLEAN
destroy_pending_endp_pool(PUHCI_PENDING_ENDP_POOL pool)
{
    if (pool == NULL)
        return FALSE;

    InitializeListHead(&pool->free_que);
    pool->free_count = pool->total_count = 0;
    usb_free_mem(pool->pending_endp_array);
    pool->pending_endp_array = NULL;

    return TRUE;

}
#else
#define ehci_wait_ms uhci_wait_ms
extern VOID uhci_wait_ms(PEHCI_DEV ehci, LONG ms);

extern BOOLEAN init_pending_endp_pool(PUHCI_PENDING_ENDP_POOL pool);

extern BOOLEAN free_pending_endp(PUHCI_PENDING_ENDP_POOL pool, PUHCI_PENDING_ENDP pending_endp);

extern PUHCI_PENDING_ENDP alloc_pending_endp(PUHCI_PENDING_ENDP_POOL pool, LONG count);

extern BOOLEAN destroy_pending_endp_pool(PUHCI_PENDING_ENDP_POOL pool);

#endif

//end of pending endpoint pool funcs

static VOID NTAPI
ehci_cancel_pending_endp_urb(IN PVOID Parameter)
{
    PLIST_ENTRY abort_list;
    PUSB_DEV pdev;
    PURB purb;
    USE_BASIC_NON_PENDING_IRQL;

    abort_list = (PLIST_ENTRY) Parameter;

    if (abort_list == NULL)
        return;

    while (IsListEmpty(abort_list) == FALSE)
    {
        //these devs are protected by purb's ref-count
        purb = (PURB) RemoveHeadList(abort_list);
        pdev = purb->pdev;
        // purb->status is set when they are added to abort_list

        ehci_generic_urb_completion(purb, purb->context);

        lock_dev(pdev, FALSE);
        pdev->ref_count--;
        unlock_dev(pdev, FALSE);
    }
    usb_free_mem(abort_list);
    return;
}

static BOOLEAN
ehci_process_pending_endp(PEHCI_DEV ehci)
{
    PUSB_DEV pdev;
    LIST_ENTRY temp_list, abort_list;
    PLIST_ENTRY pthis;
    PURB purb;
    PUSB_ENDPOINT pendp;
    NTSTATUS can_submit = STATUS_SUCCESS;
    PWORK_QUEUE_ITEM pwork_item;
    PLIST_ENTRY cancel_list;
    PUSB_DEV pparent = NULL;
    UCHAR port_idx = 0;
    BOOLEAN tt_needed;
    UCHAR hub_addr = 0;
    USE_BASIC_IRQL;

    if (ehci == NULL)
        return FALSE;

    InitializeListHead(&temp_list);
    InitializeListHead(&abort_list);

    purb = NULL;
    ehci_dbg_print(DBGLVL_MEDIUM, ("ehci_process_pending_endp(): entering..., ehci=0x%x\n", ehci));

    lock_pending_endp_list(&ehci->pending_endp_list_lock);
    while (IsListEmpty(&ehci->pending_endp_list) == FALSE)
    {

        ehci_dbg_print(DBGLVL_MAXIMUM, ("ehci_process_pending_endp(): pending_endp_list=0x%x\n",
                                        &ehci->pending_endp_list));

        tt_needed = FALSE;
        pthis = RemoveHeadList(&ehci->pending_endp_list);
        pendp = ((PUHCI_PENDING_ENDP) pthis)->pendp;
        pdev = dev_from_endp(pendp);
        lock_dev(pdev, TRUE);

        if (dev_state(pdev) == USB_DEV_STATE_ZOMB)
        {
            unlock_dev(pdev, TRUE);
            free_pending_endp(&ehci->pending_endp_pool, struct_ptr(pthis, UHCI_PENDING_ENDP, endp_link));
            //delegate to ehci_remove_device for remiving the purb queue on the endpoint
            continue;
        }
        if ((pdev->flags & USB_DEV_FLAG_HIGH_SPEED) == 0)
        {
            // prepare split transaction
            unlock_dev(pdev, TRUE);

            // pparent won't be removed when pending_endp_list_lock is acquired.
            get_parent_hs_hub(pdev, pparent, port_idx);

            if (pparent == NULL)
            {
                TRAP();
                ehci_dbg_print(DBGLVL_MEDIUM,
                               ("ehci_process_pending_endp(): full/low speed device with no parent!!!\n"));
                free_pending_endp(&ehci->pending_endp_pool, struct_ptr(pthis, UHCI_PENDING_ENDP, endp_link));
                continue;
            }

            if (hub_lock_tt(pparent, port_idx, (UCHAR) endp_type(pendp)) == FALSE)
            {
                lock_dev(pdev, TRUE);
                if (dev_state(pdev) != USB_DEV_STATE_ZOMB)
                {
                    // reinsert the pending-endp to the list
                    InsertTailList(&temp_list, pthis);
                    unlock_dev(pdev, TRUE);
                }
                else
                {
                    // delegate to ehci_remove_device for purb removal
                    unlock_dev(pdev, TRUE);
                    free_pending_endp(&ehci->pending_endp_pool,
                                      struct_ptr(pthis, UHCI_PENDING_ENDP, endp_link));
                }
                continue;
            }

            // backup the hub address for future use
            hub_addr = pparent->dev_addr;

            lock_dev(pdev, TRUE);
            if (dev_state(pdev) == USB_DEV_STATE_ZOMB)
            {
                unlock_dev(pdev, TRUE);
                free_pending_endp(&ehci->pending_endp_pool, struct_ptr(pthis, UHCI_PENDING_ENDP, endp_link));
                hub_unlock_tt(pparent, port_idx, (UCHAR) endp_type(pendp));
                continue;
            }
            tt_needed = TRUE;
            // go on processing
        }

        if (endp_state(pendp) == USB_ENDP_FLAG_STALL)
        {
            while (IsListEmpty(&pendp->urb_list) == FALSE)
            {
                purb = (PURB) RemoveHeadList(&pendp->urb_list);
                purb->status = USB_STATUS_ENDPOINT_HALTED;
                InsertTailList(&abort_list, (LIST_ENTRY *) purb);
            }
            InitializeListHead(&pendp->urb_list);
            unlock_dev(pdev, TRUE);
            free_pending_endp(&ehci->pending_endp_pool, struct_ptr(pthis, UHCI_PENDING_ENDP, endp_link));
            if (tt_needed)
                hub_unlock_tt(pparent, port_idx, (UCHAR) endp_type(pendp));
            continue;
        }

        if (IsListEmpty(&pendp->urb_list) == FALSE)
        {
            purb = (PURB) RemoveHeadList(&pendp->urb_list);
            ASSERT(purb);
        }
        else
        {
            InitializeListHead(&pendp->urb_list);
            unlock_dev(pdev, TRUE);
            free_pending_endp(&ehci->pending_endp_pool, struct_ptr(pthis, UHCI_PENDING_ENDP, endp_link));
            if (tt_needed)
                hub_unlock_tt(pparent, port_idx, (UCHAR) endp_type(pendp));
            continue;
        }

        if (tt_needed)
        {
            ((PURB_HS_CONTEXT_CONTENT) & purb->hs_context)->hub_addr = hub_addr;
            ((PURB_HS_CONTEXT_CONTENT) & purb->hs_context)->port_idx = port_idx;
        }

        // if can_submit is STATUS_SUCCESS, the purb is inserted into the schedule
        switch (endp_type(pendp))
        {
            case USB_ENDPOINT_XFER_BULK:
            {
                can_submit = ehci_internal_submit_bulk(ehci, purb);
                break;
            }
            case USB_ENDPOINT_XFER_CONTROL:
            {
                can_submit = ehci_internal_submit_ctrl(ehci, purb);
                break;
            }
            case USB_ENDPOINT_XFER_INT:
            {
                can_submit = ehci_internal_submit_int(ehci, purb);
                break;
            }
            case USB_ENDPOINT_XFER_ISOC:
            {
                can_submit = ehci_internal_submit_iso(ehci, purb);
                break;
            }
        }

        if (can_submit == STATUS_NO_MORE_ENTRIES)
        {
            //no enough bandwidth or tds
            InsertHeadList(&pendp->urb_list, (PLIST_ENTRY) purb);
            InsertTailList(&temp_list, pthis);
        }
        else
        {
            // otherwise error or success
            free_pending_endp(&ehci->pending_endp_pool, struct_ptr(pthis, UHCI_PENDING_ENDP, endp_link));

            if (can_submit != STATUS_SUCCESS)
            {
                //abort these URBs
                InsertTailList(&abort_list, (LIST_ENTRY *) purb);
                purb->status = can_submit;
            }
        }
        unlock_dev(pdev, TRUE);
        if (can_submit != STATUS_SUCCESS && tt_needed)
        {
            hub_unlock_tt(pparent, port_idx, (UCHAR) endp_type(pendp));
        }
    }

    if (IsListEmpty(&temp_list) == FALSE)
    {
        //re-append them to the pending_endp_list
        ListFirst(&temp_list, pthis);
        RemoveEntryList(&temp_list);
        MergeList(&ehci->pending_endp_list, pthis);
    }
    unlock_pending_endp_list(&ehci->pending_endp_list_lock);

    if (IsListEmpty(&abort_list) == FALSE)
    {
        PLIST_ENTRY pthis;
        cancel_list = (PLIST_ENTRY) usb_alloc_mem(NonPagedPool, sizeof(WORK_QUEUE_ITEM) + sizeof(LIST_ENTRY));
        ASSERT(cancel_list);

        ListFirst(&abort_list, pthis);
        RemoveEntryList(&abort_list);
        InsertTailList(pthis, cancel_list);

        pwork_item = (PWORK_QUEUE_ITEM) & cancel_list[1];

        // we do not need to worry the ehci_cancel_pending_endp_urb running when the
        // driver is unloading since purb-reference count will prevent the dev_mgr to 
        // quit till all the reference count to the dev drop to zero.
        ExInitializeWorkItem(pwork_item, ehci_cancel_pending_endp_urb, (PVOID) cancel_list);
        ExQueueWorkItem(pwork_item, DelayedWorkQueue);
    }
    return TRUE;
}

NTSTATUS
ehci_submit_urb(PEHCI_DEV ehci, PUSB_DEV pdev, PUSB_ENDPOINT pendp, PURB purb)
{
    int i;
    PUHCI_PENDING_ENDP pending_endp;
    NTSTATUS status;
    USE_BASIC_IRQL;

    if (ehci == NULL)
        return STATUS_INVALID_PARAMETER;

    if (pdev == NULL || pendp == NULL || purb == NULL)
    {
        // give a chance to those pending urb, especially for clearing hub tt
        ehci_process_pending_endp(ehci);
        return STATUS_INVALID_PARAMETER;
    }

    lock_pending_endp_list(&ehci->pending_endp_list_lock);
    lock_dev(pdev, TRUE);

    if (dev_state(pdev) == USB_DEV_STATE_ZOMB)
    {
        status = purb->status = STATUS_DEVICE_DOES_NOT_EXIST;
        goto LBL_OUT;
    }

    if (dev_class(pdev) == USB_DEV_CLASS_ROOT_HUB)
    {
        unlock_dev(pdev, TRUE);
        unlock_pending_endp_list(&ehci->pending_endp_list_lock);
        status = ehci_rh_submit_urb(pdev, purb);
        return status;
    }

    if (pendp)
        purb->pendp = pendp;
    else
        purb->pendp = &pdev->default_endp;

    if (dev_from_endp(purb->pendp) != pdev)
    {
        status = purb->status = STATUS_INVALID_PARAMETER;
        goto LBL_OUT;
    }

    if (endp_state(purb->pendp) == USB_ENDP_FLAG_STALL)
    {
        status = purb->status = USB_STATUS_ENDPOINT_HALTED;
        goto LBL_OUT;
    }

    if ((pdev->flags & USB_DEV_FLAG_HIGH_SPEED) == 0)
    {
        // wait one ms
        usb_wait_ms_dpc(1);
    }

    purb->pdev = pdev;
    purb->rest_bytes = purb->data_length;

    if (endp_type(purb->pendp) == USB_ENDPOINT_XFER_BULK)
        purb->bytes_to_transfer = (purb->data_length > EHCI_MAX_SIZE_TRANSFER ? EHCI_MAX_SIZE_TRANSFER : purb->data_length);    //multiple transfer for large data block
    else
        purb->bytes_to_transfer = purb->data_length;

    ehci_dbg_print(DBGLVL_MEDIUM, ("ehci_submit_urb(): bytes_to_transfer=0x%x\n", purb->bytes_to_transfer));

    purb->bytes_transfered = 0;
    InitializeListHead(&purb->trasac_list);
    purb->last_finished_td = &purb->trasac_list;
    purb->flags &= ~(URB_FLAG_STATE_MASK | URB_FLAG_IN_SCHEDULE | URB_FLAG_FORCE_CANCEL);
    purb->flags |= URB_FLAG_STATE_PENDING;


    i = IsListEmpty(&pendp->urb_list);
    InsertTailList(&pendp->urb_list, &purb->urb_link);

    pdev->ref_count++;          //for purb reference

    if (i == FALSE)
    {
        //there is purb pending, simply queue it and return
        status = purb->status = STATUS_PENDING;
        goto LBL_OUT;
    }
    else if (usb_endp_busy_count(purb->pendp) && endp_type(purb->pendp) != USB_ENDPOINT_XFER_ISOC)
    {
        //
        //No purb waiting but purb overlap not allowed, 
        //so leave it in queue and return, will be scheduled
        //later
        //
        status = purb->status = STATUS_PENDING;
        goto LBL_OUT;
    }

    pending_endp = alloc_pending_endp(&ehci->pending_endp_pool, 1);
    if (pending_endp == NULL)
    {
        //panic
        status = purb->status = STATUS_UNSUCCESSFUL;
        goto LBL_OUT2;
    }

    pending_endp->pendp = purb->pendp;
    InsertTailList(&ehci->pending_endp_list, (PLIST_ENTRY) pending_endp);

    unlock_dev(pdev, TRUE);
    unlock_pending_endp_list(&ehci->pending_endp_list_lock);

    ehci_process_pending_endp(ehci);
    return STATUS_PENDING;

  LBL_OUT2:
    pdev->ref_count--;
    RemoveEntryList((PLIST_ENTRY) purb);

  LBL_OUT:
    unlock_dev(pdev, TRUE);
    unlock_pending_endp_list(&ehci->pending_endp_list_lock);
    ehci_process_pending_endp(ehci);
    return status;
}

static NTSTATUS
ehci_set_error_code(PURB purb, ULONG raw_status)
{
    PURB_HS_PIPE_CONTENT pipe_content;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品三级麻豆| 国产乱人伦精品一区二区在线观看| 精品久久人人做人人爰| 91精品久久久久久蜜臀| 欧美一区三区四区| 欧美一三区三区四区免费在线看| 91精品欧美福利在线观看| 7777女厕盗摄久久久| 678五月天丁香亚洲综合网| 欧亚一区二区三区| 7878成人国产在线观看| 欧美成人激情免费网| 久久美女艺术照精彩视频福利播放| 精品日产卡一卡二卡麻豆| 2021国产精品久久精品| 国产精品天干天干在观线| 亚洲美女电影在线| 午夜欧美电影在线观看| 久久99精品久久久久| 国产在线播放一区三区四| 福利电影一区二区| 欧洲亚洲国产日韩| 精品久久一二三区| 综合网在线视频| 五月天激情综合网| 国产精品伊人色| 91免费国产在线观看| 制服丝袜亚洲网站| 中文字幕乱码日本亚洲一区二区| 亚洲美女视频在线观看| 九九在线精品视频| 91视频国产观看| 欧美一二三区在线| 亚洲乱码国产乱码精品精的特点 | 成人av资源下载| 色8久久精品久久久久久蜜| 欧美肥妇bbw| 国产精品国产三级国产专播品爱网| 亚洲一区二区av在线| 国产一区二区三区四区五区美女| 91麻豆免费视频| 精品少妇一区二区三区在线播放 | 欧美久久高跟鞋激| 久久久一区二区三区| 亚洲国产中文字幕| 成人午夜免费电影| 欧美一区二区视频在线观看2022| 中文字幕av一区二区三区| 日韩av在线发布| 日本高清不卡aⅴ免费网站| 久久女同互慰一区二区三区| 亚洲一区二区3| 99在线热播精品免费| 精品播放一区二区| 婷婷综合另类小说色区| 在线精品亚洲一区二区不卡| 久久女同精品一区二区| 精品夜夜嗨av一区二区三区| 在线视频欧美区| 亚洲欧洲在线观看av| 国产成a人亚洲精品| 欧美成人a∨高清免费观看| 午夜欧美视频在线观看| 在线精品观看国产| 一区二区三区欧美视频| 91免费精品国自产拍在线不卡| 国产三级精品三级| 国产精品自拍三区| 欧美成人福利视频| 日本欧美在线观看| 欧美人与禽zozo性伦| 一区二区三区不卡视频| 在线免费观看视频一区| 亚洲综合免费观看高清完整版 | 免费观看日韩av| 91精品久久久久久久99蜜桃| 亚洲国产三级在线| 欧美日韩国产三级| 免费一级片91| 久久综合久久综合久久| 国产精品18久久久久久vr| 久久色中文字幕| 风流少妇一区二区| 亚洲精品日韩综合观看成人91| 色综合视频在线观看| 亚洲一区在线观看免费观看电影高清| 色综合夜色一区| 亚洲午夜视频在线观看| 在线播放一区二区三区| 久久99精品国产| 久久精品视频一区二区三区| 国产成人在线网站| 亚洲另类中文字| 欧美日韩aaa| 国产一区不卡在线| 国产精品久久久久久久午夜片 | 轻轻草成人在线| 久久久久97国产精华液好用吗| 国产剧情一区在线| 亚洲欧美日韩成人高清在线一区| 在线观看视频一区二区| 日韩精品一二区| 日本一区二区三区高清不卡| 91免费国产在线观看| 秋霞成人午夜伦在线观看| 中文一区在线播放| 91麻豆精品国产无毒不卡在线观看| 久久se精品一区精品二区| 国产精品久久久久久户外露出| 欧美午夜在线观看| 国产超碰在线一区| 天堂av在线一区| |精品福利一区二区三区| 欧美日韩美少妇| 国产不卡高清在线观看视频| 亚洲国产一区二区a毛片| 久久毛片高清国产| 欧美日韩国产经典色站一区二区三区 | 夜夜嗨av一区二区三区四季av| 91精品国产综合久久福利| 国产999精品久久久久久| 亚瑟在线精品视频| 亚洲欧美影音先锋| 久久亚洲综合色| 欧美一级高清片在线观看| 一本到高清视频免费精品| 国产一区二区看久久| 日韩av一区二区三区四区| 国产精品久久久久久久久免费桃花 | 亚洲午夜久久久久久久久电影院| 欧美精品一区二区三区蜜臀 | 天堂午夜影视日韩欧美一区二区| 国产精品久久久久久亚洲伦| 精品国产凹凸成av人网站| 欧美日韩一区二区三区四区 | 性做久久久久久免费观看| 成人免费小视频| 久久久www成人免费毛片麻豆| 欧美人与禽zozo性伦| 色域天天综合网| 91一区一区三区| 99久久精品情趣| 成人午夜精品在线| 国产99久久久久| 国产精品亚洲视频| 国产综合色视频| 国内精品国产成人国产三级粉色| 日本欧美在线观看| 免费观看久久久4p| 久久99精品视频| 久久国产精品色婷婷| 久久精品国产久精国产| 日韩专区一卡二卡| 日韩不卡一区二区三区| 天天影视网天天综合色在线播放| 一区二区三区色| 日韩中文字幕一区二区三区| 亚洲成人黄色小说| 青娱乐精品在线视频| 精品一区二区三区视频在线观看| 久久成人18免费观看| 国产成人精品一区二区三区四区 | 香蕉乱码成人久久天堂爱免费| 亚洲精选在线视频| 午夜精品久久久久久不卡8050| 艳妇臀荡乳欲伦亚洲一区| 亚洲风情在线资源站| 日本网站在线观看一区二区三区 | 97se狠狠狠综合亚洲狠狠| av在线这里只有精品| 91美女片黄在线观看| 欧美日韩精品一区二区| 欧美一区二区视频网站| 久久伊99综合婷婷久久伊| 国产精品美女www爽爽爽| 亚洲精品日韩综合观看成人91| 五月天欧美精品| 国产一区二区三区蝌蚪| 99久久精品国产毛片| 欧美三级资源在线| 精品三级av在线| 亚洲欧美激情视频在线观看一区二区三区| 亚洲色图视频网| 久久爱www久久做| 99久久精品费精品国产一区二区| 欧美探花视频资源| 久久精品欧美一区二区三区麻豆| 中文字幕亚洲综合久久菠萝蜜| 五月天一区二区三区| 处破女av一区二区| 欧美精品一二三| 自拍偷拍亚洲激情| 久久超碰97人人做人人爱| 在线视频亚洲一区| 久久精品夜夜夜夜久久| 亚洲成人动漫一区| 成人av资源下载| 精品国产伦理网| 亚洲成人av免费| 成人美女在线观看|