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

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

?? ehci.c

?? ReactOS是一些高手根據(jù)Windows XP的內(nèi)核編寫出的類XP。內(nèi)核實(shí)現(xiàn)機(jī)理和API函數(shù)調(diào)用幾乎相同。甚至可以兼容XP的程序。喜歡研究系統(tǒng)內(nèi)核的人可以看一看。
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
    pipe_content = (PURB_HS_PIPE_CONTENT) & purb->pipe;

    //test if the purb is canceled
    if (purb->flags & URB_FLAG_FORCE_CANCEL)
    {
        purb->status = STATUS_CANCELLED;
    }
    else if (raw_status == 0)
        purb->status = STATUS_SUCCESS;

    else if (pipe_content->trans_type == USB_ENDPOINT_XFER_INT ||
             pipe_content->trans_type == USB_ENDPOINT_XFER_BULK ||
             pipe_content->trans_type == USB_ENDPOINT_XFER_CONTROL)
    {

        if (raw_status & QTD_STS_BABBLE)
            purb->status = USB_STATUS_DATA_OVERRUN;

        else if (raw_status & QTD_STS_HALT)
            purb->status = USB_STATUS_ENDPOINT_HALTED;

        else if (raw_status & QTD_STS_DBE)
            purb->status = USB_STATUS_BUFFER_OVERRUN;

        else if (raw_status & QTD_STS_XACT)
            purb->status = USB_STATUS_CRC;      // crc is included in xact err.

        else if (raw_status & QTD_STS_MMF)
            purb->status = USB_STATUS_BTSTUFF;

        else
            purb->status = STATUS_UNSUCCESSFUL;
    }
    else if (pipe_content->trans_type == USB_ENDPOINT_XFER_ISOC)
    {
        if (pipe_content->speed_high)
        {
            if (raw_status & ITD_STS_BUFERR)
                purb->status = USB_STATUS_BUFFER_OVERRUN;

            else if (raw_status & ITD_STS_BABBLE)
                purb->status = USB_STATUS_BABBLE_DETECTED;

            else if (raw_status & ITD_STS_XACTERR)      // Xact Err
                purb->status = USB_STATUS_CRC;

            else
                purb->status = STATUS_UNSUCCESSFUL;

        }
        else
        {
            if (raw_status & SITD_STS_ERR)      // ERR is received from hub's tt
                purb->status = USB_STATUS_ERROR;

            else if (raw_status & SITD_STS_DBE)
                purb->status = USB_STATUS_BUFFER_OVERRUN;

            else if (raw_status & SITD_STS_BABBLE)
                purb->status = USB_STATUS_BABBLE_DETECTED;

            else if (raw_status & SITD_STS_XACTERR)     // Xact Error
                purb->status = USB_STATUS_CRC;

            else if (raw_status & SITD_STS_MISSFRM)     // missing microframe
                purb->status = USB_STATUS_DATA_TOGGLE_MISMATCH;

            else
                purb->status = STATUS_UNSUCCESSFUL;
        }
    }
    if (purb->status != STATUS_SUCCESS)
    {
        hcd_dbg_print(DBGLVL_MEDIUM, ("ehci_set_error_code(): error status 0x%x\n", raw_status));
    }
    return purb->status;
}

static BOOLEAN NTAPI
ehci_sync_remove_urb_finished(PVOID context)
{
    PEHCI_DEV ehci;
    PLIST_ENTRY pthis, pnext, ptemp;
    PURB purb;
    PSYNC_PARAM pparam;

    pparam = (PSYNC_PARAM) context;
    ehci = pparam->ehci;
    ptemp = (PLIST_ENTRY) pparam->context;

    if (ehci == NULL)
    {
        return (UCHAR) (pparam->ret = FALSE);
    }

    ListFirst(&ehci->urb_list, pthis);
    while (pthis)
    {
        //remove urbs not in the schedule
        ListNext(&ehci->urb_list, pthis, pnext);
        purb = (PURB) pthis;

        if ((purb->flags & URB_FLAG_IN_SCHEDULE) == 0)
        {
            //finished or canceled( not applied for split bulk ).
            RemoveEntryList(pthis);
            InsertTailList(ptemp, pthis);
        }
        pthis = pnext;
    }
    pparam->ret = TRUE;
    return (UCHAR) TRUE;
}

VOID NTAPI
ehci_dpc_callback(PKDPC dpc, PVOID context, PVOID sysarg1, PVOID sysarg2)
{
    PEHCI_DEV ehci;

    LIST_HEAD temp_list;
    PLIST_ENTRY pthis, pnext;
    PURB purb;
    PEHCI_QH pqh;
    PEHCI_QTD ptd;
    PUHCI_PENDING_ENDP pending_endp;
    PUSB_DEV pdev;
    PUSB_ENDPOINT pendp;

    BOOLEAN finished;
    LONG i;
    ULONG ehci_status, urb_status;

    SYNC_PARAM sync_param;
    UCHAR ep_type;
    USE_BASIC_NON_PENDING_IRQL;

    ehci = (PEHCI_DEV) context;
    if (ehci == NULL)
        return;

    ehci_status = (ULONG) sysarg1;

    InitializeListHead(&temp_list);

    sync_param.ehci = ehci;
    sync_param.context = (PVOID) & temp_list;

    ehci_dbg_print(DBGLVL_MAXIMUM, ("ehci_dpc_callback(): entering..., ehci=0x%x\n", ehci));
    //remove finished purb from ehci's purb-list 
    KeSynchronizeExecution(ehci->pdev_ext->ehci_int, ehci_sync_remove_urb_finished, &sync_param);

    //release resources( itds, sitds, fstns, tds, and qhs ) allocated for the purb 
    while (IsListEmpty(&temp_list) == FALSE)
    {
        //not in any public queue, if do not access into dev, no race 
        //condition will occur
        purb = (PURB) RemoveHeadList(&temp_list);
        urb_status = purb->status;
        ep_type = endp_type(purb->pendp);

        if (ep_type == USB_ENDPOINT_XFER_ISOC)
        {
            // collect error for iso transfer
            urb_status = ehci_scan_iso_error(ehci, purb);
        }

        //the only place we do not use this lock on non-pending-endp-list data
        KeAcquireSpinLockAtDpcLevel(&ehci->pending_endp_list_lock);
        while (IsListEmpty(&purb->trasac_list) == FALSE)
        {
            UCHAR em_type;
            pthis = RemoveHeadList(&purb->trasac_list);
            em_type = (UCHAR) elem_type(pthis, TRUE);

            if (em_type == INIT_LIST_FLAG_QH)
            {
                pqh = qh_from_list_entry(pthis);
                elem_safe_free(pthis, TRUE);
            }
            else
            {
                //must be an itd, sitd chain
                InsertHeadList(&purb->trasac_list, pthis);
                for(i = 0, purb->bytes_transfered = 0; i < purb->td_count; i++)
                {
                    PEHCI_QTD_CONTENT ptdc = NULL;
                    PEHCI_ITD_CONTENT pitdc;
                    PEHCI_SITD_CONTENT psitdc;

                    em_type = (UCHAR) elem_type(pthis, TRUE);

                    // accumulate data transfered in tds
                    if (em_type == INIT_LIST_FLAG_QTD)
                    {
                        ptd = qtd_from_list_entry(pthis);
                        ptdc = (PEHCI_QTD_CONTENT) ptd;
                        if ((ptdc->status & QTD_STS_ACTIVE) == 0 && ((ptdc->status & QTD_ANY_ERROR) == 0))
                            purb->bytes_transfered += ptd->bytes_to_transfer;
                    }
                    else if (em_type == INIT_LIST_FLAG_ITD)
                    {
                        int j;
                        pitdc = (PEHCI_ITD_CONTENT) itd_from_list_entry(pthis);
                        for(j = 0; j < 8; j++)
                        {
                            if ((pitdc->status_slot[j].status & ITD_STS_ACTIVE) == 0
                                && (pitdc->status_slot[j].status & ITD_ANY_ERROR) == 0)
                                purb->bytes_transfered += ptdc->bytes_to_transfer;
                        }
                    }
                    else if (em_type == INIT_LIST_FLAG_SITD)
                    {
                        psitdc = (PEHCI_SITD_CONTENT) sitd_from_list_entry(pthis);
                        if ((psitdc->status & SITD_STS_ACTIVE) == 0 && (psitdc->status & SITD_ANY_ERROR) == 0)
                            purb->bytes_transfered += ptdc->bytes_to_transfer;
                    }
                    ListNext(&purb->trasac_list, pthis, pnext);
                    pthis = pnext;
                }

                // check to see if an fstn is there
                ListFirstPrev(&purb->trasac_list, pthis);
                if (elem_type(pthis, TRUE) == INIT_LIST_FLAG_FSTN)
                {
                    RemoveEntryList(pthis);
                    elem_safe_free(pthis, TRUE);
                }

                ListFirst(&purb->trasac_list, pthis);
                RemoveEntryList(&purb->trasac_list);

                // free the tds
                elem_safe_free(pthis, FALSE);

                //termination condition
                InitializeListHead(&purb->trasac_list);
                purb->last_finished_td = NULL;
            }
        }

        if (ep_type == USB_ENDPOINT_XFER_ISOC || ep_type == USB_ENDPOINT_XFER_INT)
            ehci_claim_bandwidth(ehci, purb, FALSE);    //release band-width

        KeReleaseSpinLockFromDpcLevel(&ehci->pending_endp_list_lock);

        ehci_set_error_code(purb, urb_status);

        pdev = dev_from_endp(purb->pendp);
        pendp = purb->pendp;

        // perform clear tt buffer if error on full/low bulk/control pipe
        if (ep_type == USB_ENDPOINT_XFER_BULK || ep_type == USB_ENDPOINT_XFER_CONTROL)
        {
            PURB_HS_PIPE_CONTENT pipe_content;
            PUSB_DEV phub;
            UCHAR port_idx;

            get_parent_hs_hub(pdev, phub, port_idx);
            pipe_content = (PURB_HS_PIPE_CONTENT) & purb->pipe;

            if (pipe_content->speed_high == 0 && purb->status != STATUS_SUCCESS)
            {
                // lets schedule an event to clear the tt buffer
                hub_post_clear_tt_event(phub, port_idx, purb->pipe);
            }
            else if (pipe_content->speed_high == 0)
            {
                if (phub == NULL)
                    TRAP();
                else
                {
                    // release tt if no error
                    hub_unlock_tt(phub, (UCHAR) port_idx, (UCHAR) pipe_content->trans_type);
                }
            }
        }

        finished = TRUE;

        //since the ref_count for the purb is not released, we can safely have one
        //pointer to dev

        if (purb->status == USB_STATUS_BABBLE_DETECTED)
        {
            usb_dbg_print(DBGLVL_MEDIUM,
                          ("ehci_dpc_callback(): alert!!!, babble detected, severe error, reset the whole bus\n"));
            // ehci_start( ehci );
        }

        if (ehci_status & STS_HALT)     //&& !ehci->is_suspended
        {
            ehci_start(&ehci->hcd_interf);
        }

        //this will let the new request in ehci_generic_urb_completion to this endp
        //be processed rather than queued in the pending_endp_list
        lock_dev(pdev, TRUE);
        usb_endp_busy_count_dec(pendp);
        unlock_dev(pdev, TRUE);

        if (usb_success(purb->status) == FALSE)
        {
            // set error code and complete the purb and purb is invalid from this point
            ehci_generic_urb_completion(purb, purb->context);
        }
        else
        {
            if (ep_type == USB_ENDPOINT_XFER_BULK)
            {
                purb->rest_bytes -= purb->bytes_transfered;
                if (purb->rest_bytes)
                {
                    finished = FALSE;
                }
                else
                {
                    ehci_generic_urb_completion(purb, purb->context);
                }
            }
            else
            {
                ehci_generic_urb_completion(purb, purb->context);
                // DbgBreakPoint();
                //purb is now invalid
            }
        }

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

        if (finished)
            pdev->ref_count--;

        if (urb_status && ((ep_type == USB_ENDPOINT_XFER_BULK) || (ep_type == USB_ENDPOINT_XFER_INT)))
        {
            // error on int or bulk pipe, cleared in usb_reset_pipe_completion
            pendp->flags &= ~USB_ENDP_FLAG_STAT_MASK;
            pendp->flags |= USB_ENDP_FLAG_STALL;
        }

        if (dev_state(pdev) == USB_DEV_STATE_ZOMB)
        {
            unlock_dev(pdev, TRUE);
            KeReleaseSpinLockFromDpcLevel(&ehci->pending_endp_list_lock);
            if (finished == FALSE)
            {

                purb->status = STATUS_DEVICE_DOES_NOT_EXIST;
                ehci_generic_urb_completion(purb, purb->context);

                lock_dev(pdev, TRUE);
                pdev->ref_count--;
                unlock_dev(pdev, TRUE);
            }
            continue;
        }

        if (finished && IsListEmpty(&pendp->urb_list) == TRUE)
        {
            unlock_dev(pdev, TRUE);
            KeReleaseSpinLockFromDpcLevel(&ehci->pending_endp_list_lock);
            continue;
        }
        else if (finished == TRUE)
        {
            //has purb in the endp's purb-list
            if (usb_endp_busy_count(pendp) > 0)
            {
                //the urbs still have chance to be sheduled but not this time
                unlock_dev(pdev, TRUE);
                KeReleaseSpinLockFromDpcLevel(&ehci->pending_endp_list_lock);
                continue;
            }
        }

        if (finished == FALSE)
        {
            //a split bulk transfer, ( not the high speed split transfer )
            purb->bytes_transfered = 0;
            purb->bytes_to_transfer =
                EHCI_MAX_SIZE_TRANSFER > purb->rest_bytes ? purb->rest_bytes : EHCI_MAX_SIZE_TRANSFER;

            //the purb is not finished
            purb->flags &= ~URB_FLAG_STATE_MASK;
            purb->flags |= URB_FLAG_STATE_PENDING;

            InsertHeadList(&pendp->urb_list, (PLIST_ENTRY) purb);
        }

        pending_endp = alloc_pending_endp(&ehci->pending_endp_pool, 1);
        pending_endp->pendp = pendp;
        InsertTailList(&ehci->pending_endp_list, &pending_endp->endp_link);

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

    //ah...exhausted, let's find some in the pending_endp_list to rock
    ehci_process_pending_endp(ehci);
    return;
}

static BOOLEAN NTAPI
ehci_sync_cancel_urbs_dev(PVOID context)
{
    //cancel all the urbs on one dev
    PEHCI_DEV ehci;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青娱乐精品视频| 美女精品自拍一二三四| 91精品国产91热久久久做人人| 经典一区二区三区| 亚洲一区二区三区四区的| 久久久久九九视频| 欧美日韩成人综合| 成人av电影在线| 国产一区二区精品久久99| 五月天亚洲婷婷| 一区二区免费在线播放| 日本一二三不卡| 久久久另类综合| 欧美一区二区三区在线视频| 日本道精品一区二区三区| 国产精选一区二区三区 | 亚洲第四色夜色| 亚洲色图欧美激情| 国产亚洲污的网站| 精品裸体舞一区二区三区| 欧美精品一二三区| 欧美艳星brazzers| 色www精品视频在线观看| 国产一区二区美女| 国模娜娜一区二区三区| 美女脱光内衣内裤视频久久影院| 亚洲成年人影院| 亚洲国产毛片aaaaa无费看| 国产精品进线69影院| 国产清纯白嫩初高生在线观看91 | 亚洲日本免费电影| 中文字幕一区二区三区在线播放 | 日韩国产精品91| 婷婷开心久久网| 婷婷一区二区三区| 天堂蜜桃91精品| 天堂影院一区二区| 视频一区二区国产| 日本女优在线视频一区二区| 日韩在线a电影| 欧美aa在线视频| 久久99九九99精品| 国产精品一区二区三区乱码| 国产成人午夜视频| www.亚洲色图| 欧美性色欧美a在线播放| 欧美影院一区二区| 91精品在线观看入口| 91精品国产乱码久久蜜臀| 91精品国产免费| 久久夜色精品国产噜噜av| 国产视频一区不卡| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 日韩精品一区二区三区老鸭窝 | 99精品久久99久久久久| 色综合视频在线观看| 在线视频你懂得一区二区三区| 色婷婷综合久久久中文一区二区| 欧美日韩专区在线| 精品久久久久久综合日本欧美| 久久久久久久综合狠狠综合| 国产精品久久久久久久久动漫| 亚洲欧美日韩中文播放| 亚洲欧美日韩一区| 午夜精品福利一区二区三区蜜桃| 麻豆91在线播放免费| 成人性生交大片免费看视频在线| 91丨porny丨在线| 777午夜精品免费视频| 久久综合久久久久88| 亚洲欧美一区二区三区国产精品| 午夜一区二区三区在线观看| 国产一区中文字幕| 91在线播放网址| 日韩一卡二卡三卡四卡| 国产精品久久久久久久久晋中| 亚洲高清视频在线| 国产精品亚洲а∨天堂免在线| 色94色欧美sute亚洲线路一久| 日韩视频123| 亚洲品质自拍视频| 激情偷乱视频一区二区三区| 91猫先生在线| 26uuu亚洲综合色欧美| 一区二区三区在线视频观看58| 另类小说图片综合网| 91网站最新地址| 欧美精品一区二区三区在线| 亚洲欧美aⅴ...| 国产乱色国产精品免费视频| 欧美色爱综合网| 国产精品嫩草99a| 青青草视频一区| 欧洲人成人精品| 国产精品麻豆一区二区| 美女视频免费一区| 91福利国产成人精品照片| 久久蜜桃一区二区| 亚洲福利电影网| 97精品视频在线观看自产线路二| 精品久久久久99| 日本成人在线视频网站| 91片在线免费观看| 日本一区二区三区免费乱视频| 午夜精品123| 欧美在线视频全部完| 国产精品视频免费看| 国产一区美女在线| 91精品婷婷国产综合久久性色| 亚洲视频一区二区在线观看| 国产成人在线视频免费播放| 精品久久久久久综合日本欧美| 亚洲高清视频的网址| 91久久人澡人人添人人爽欧美| 久久精品视频免费观看| 精品一区二区免费在线观看| 3d动漫精品啪啪1区2区免费| 亚洲福利视频导航| 日本高清免费不卡视频| 中文字幕在线一区二区三区| 国产毛片精品视频| 久久久久国产精品人| 六月丁香婷婷久久| 日韩你懂的电影在线观看| 日本欧美一区二区三区| 91.com视频| 免费成人结看片| 欧美一区二区视频观看视频| 日韩在线卡一卡二| 欧美一激情一区二区三区| 天天做天天摸天天爽国产一区| 欧美性色黄大片| 亚洲电影你懂得| 91精品国产综合久久婷婷香蕉| 日韩经典中文字幕一区| 欧美另类高清zo欧美| 亚洲小说春色综合另类电影| 欧美日韩视频一区二区| 性久久久久久久久久久久| 欧美高清视频一二三区 | 99热国产精品| 亚洲人精品午夜| 91福利区一区二区三区| 亚洲va在线va天堂| 欧美疯狂做受xxxx富婆| 麻豆91精品视频| 久久精品欧美一区二区三区不卡| 粉嫩绯色av一区二区在线观看| 国产精品久线在线观看| 日本韩国视频一区二区| 天堂成人免费av电影一区| 精品国产一区二区在线观看| 国产激情精品久久久第一区二区 | 国产一区亚洲一区| 国产亚洲精品aa午夜观看| 成人午夜电影网站| 樱桃视频在线观看一区| 91精品国产福利在线观看| 国模无码大尺度一区二区三区| 中文字幕免费不卡| 在线亚洲免费视频| 美国十次了思思久久精品导航| 国产午夜亚洲精品理论片色戒 | 精品精品国产高清a毛片牛牛| 国产在线播放一区| 国产精品第五页| 欧美欧美午夜aⅴ在线观看| 亚洲美女免费视频| 日韩一区二区电影| 99久久精品国产一区| 午夜精品久久久久久不卡8050| 欧美精品一区二区久久婷婷| 成人中文字幕合集| 水蜜桃久久夜色精品一区的特点| 欧美精品一区二区三区蜜臀| 91免费看`日韩一区二区| 性感美女极品91精品| 国产欧美一区二区精品久导航| 在线精品国精品国产尤物884a| 精品无人区卡一卡二卡三乱码免费卡| 国产精品久久久久久久浪潮网站| 欧美福利视频导航| 成+人+亚洲+综合天堂| 日精品一区二区三区| 国产精品久久久久久久第一福利| 51精品国自产在线| fc2成人免费人成在线观看播放| 日韩精品91亚洲二区在线观看| 国产精品久久网站| 日韩女优av电影| 欧美午夜精品久久久久久孕妇| 国产**成人网毛片九色 | 国产成人av电影在线播放| 午夜伦欧美伦电影理论片| 国产免费成人在线视频| 69成人精品免费视频| 91一区在线观看| 国产精品亚洲а∨天堂免在线| 奇米影视7777精品一区二区| 亚洲精品一卡二卡|