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

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

?? usbhcdsl811hslib.c

?? sl811hs_vxworks_host_driver_v1_0_13 sl811的主驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
*
* Schedules an isochronous transfer for the first time.
*
* RETURNS: N/A
*/

LOCAL VOID scheduleIsochTransfer
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    /* Isochronous transfers are scheduled immediately if the
     * USB_IRP.flag USB_FLAG_ISO_ASAP is set else beginning in the
     * frame specified by USB_IRP.startFrame.  The number of frames
     * to be scheduled is equal to the number of TDs in the 
     * IRP_WORKSPACE.
     */

    if ((pIrp->flags & USB_FLAG_ISO_ASAP) != 0)
	    pWork->isochNext = FINDEX (getFrameNo (pHost) + UHC_FRAME_SKIP);
    else
	    pWork->isochNext = FINDEX (pIrp->startFrame);

    pWork->isochCount = 0;

    scheduleIsochFrames (pHost, pIrp, pWork);
    }


/***************************************************************************
*
* unscheduleInterruptTransfer - removes interrupt transfer from work list
*
* RETURNS: N/A
*/

LOCAL VOID unscheduleInterruptTransfer
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    pQH_WRAPPER pCurrentQh;
    pQH_WRAPPER pNextQh;
    UINT16 i;

    /* We need to search the list of interrupt QHs to find any references
     * to the indicated QH and purge each one.
     */

    for (i = 0; i < UHCI_FRAME_LIST_ENTRIES; i += pWork->interval)
	{
	pCurrentQh = &pHost->pIntAnchorQhs [i];

	while ((pNextQh = QH_FROM_PCIPTR (pCurrentQh->qh.qhLink))
		!= pHost->pCtlAnchorQh &&
		pNextQh->sw.pWork->interval >= pWork->interval &&
		pNextQh != pWork->pQh)
	    {
	    pCurrentQh = pNextQh;
	    }

	if (pNextQh == pWork->pQh)
	    {
	    /* We found a reference to this QH. Modify the QH list to
	     * skip over it.  NOTE: pNextQh == pWork->pQh. */

	    pCurrentQh->qh.qhLink = pNextQh->qh.qhLink;
	    DMA_FLUSH (&pCurrentQh->qh.qhLink, sizeof (pCurrentQh->qh.qhLink));
	    }
	}
    }
    

/***************************************************************************
*
* scheduleInterruptTransfer - inserts interrupt IRP in frame list
*
* Schedules an interrupt transfer repeatedly in the frame list as
* indicated by the service interval.
*
* RETURNS: N/A
*/

LOCAL VOID scheduleInterruptTransfer
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    pQH_WRAPPER pExistingQh;
    pQH_WRAPPER pNextQh;
    UINT16 i;

    /* Calculate the service interval we'll actually use. */

    pWork->interval = calcIntInterval (pWork->pPipe->interval);

    /* Schedule interrupt transfer periodically throughout frame list */

    for (i = 0; i < UHCI_FRAME_LIST_ENTRIES; i += pWork->interval)
	{
	/* Find the appropriate point in the list of interrupt QHs for this
	 * frame into which to schedule this QH.  This QH needs to be
	 * scheduled ahead of all interrupt QHs which are serviced more
	 * frequently (ie., least frequently serviced QHs come first).
	 */

	pExistingQh = &pHost->pIntAnchorQhs [i];

	while ((pNextQh = QH_FROM_PCIPTR (pExistingQh->qh.qhLink)) 
		!= pHost->pCtlAnchorQh &&
		pNextQh->sw.pWork->interval >= pWork->interval &&
		pNextQh != pWork->pQh)
	    {
	    pExistingQh = pNextQh;
	    }

	if (pNextQh != pWork->pQh)
	    {
	    if (i == 0)
		{
		pWork->pQh->qh.qhLink = pExistingQh->qh.qhLink;
		DMA_FLUSH (&pWork->pQh->qh, sizeof (pWork->pQh->qh));
		}

	    pExistingQh->qh.qhLink = QH_TO_PCIPTR (pWork->pQh);
	    DMA_FLUSH (&pExistingQh->qh.qhLink, sizeof (pExistingQh->qh.qhLink));
	    }
	}
    }


/***************************************************************************
*
* unscheduleControlTransfer - removes control transfer from work list
*
* RETURNS: N/A
*/

LOCAL VOID unscheduleControlTransfer
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    pQH_WRAPPER pCurrentQh;
    pQH_WRAPPER pNextQh;

    /* Find the control transfer in the work list and unlink it. */

    pCurrentQh = pHost->pCtlAnchorQh;

    while ((pNextQh = QH_FROM_PCIPTR (pCurrentQh->qh.qhLink)) != pWork->pQh)
	{
	pCurrentQh = pNextQh;
	}

    if (pNextQh == pWork->pQh)
	{
	/* Bipass pWork->pQh. */

	pCurrentQh->qh.qhLink = pWork->pQh->qh.qhLink;
	DMA_FLUSH (&pCurrentQh->qh.qhLink, sizeof (pCurrentQh->qh.qhLink));

	if (pHost->pLastCtlQh == pWork->pQh)
	    pHost->pLastCtlQh = pCurrentQh;
	}
    }
    

/***************************************************************************
*
* scheduleControlTransfer - inserts control IRP in frame list
*
* Inserts the control transfer into the portion of the frame list 
* appropriate for control transfers.
*
* RETURNS: N/A
*/

LOCAL VOID scheduleControlTransfer
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    pQH_WRAPPER pExistingQh;
    pQH_WRAPPER pNextQh;


    /* Low speed control transfers must always be scheduled before full
     * speed control transfers in order to ensure that they execute
     * completely within a specified frame.
     */

    if (pWork->pPipe->speed == USB_SPEED_LOW)
	{
	/* Insert this low speed transfer after currently scheduled low
	 * speed transfers and ahead of any high speed transfers.
	 */

	pExistingQh = pHost->pCtlAnchorQh;

	while ((pNextQh = QH_FROM_PCIPTR (pExistingQh->qh.qhLink)) 
		!= pHost->pBulkAnchorQh && 
		pNextQh->sw.pWork->pPipe->speed == USB_SPEED_LOW)
	    {
	    pExistingQh = pNextQh;
	    }
	}
    else
	{
	/* This is a full speed transfer.  Add the QH to the end of the list 
	 * of control QHs. 
	 */

	pExistingQh = pHost->pLastCtlQh;
	}


    /* Set this QH's forward link to pExistingQh's forward link */

    if ((pWork->pQh->qh.qhLink = pExistingQh->qh.qhLink) == 
	pHost->pciPtrToBulkAnchorQh)
	{
	pHost->pLastCtlQh = pWork->pQh;
	}

    DMA_FLUSH (&pWork->pQh->qh, sizeof (pWork->pQh->qh));

    /* Set the forward link of the previous QH to this QH. */

    pExistingQh->qh.qhLink = QH_TO_PCIPTR (pWork->pQh);
    DMA_FLUSH (&pExistingQh->qh.qhLink, sizeof (pExistingQh->qh.qhLink));
    }


/***************************************************************************
*
* unscheduleBulkTransfer - removes bulk transfer from work list
*
* RETURNS: N/A
*/

LOCAL VOID unscheduleBulkTransfer
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    pQH_WRAPPER pCurrentQh;
    pQH_WRAPPER pNextQh;

    /* Find the bulk transfer in the work list and unlink it. */

    pCurrentQh = pHost->pBulkAnchorQh;

    while ((pNextQh = QH_FROM_PCIPTR (pCurrentQh->qh.qhLink)) != pWork->pQh)
	{
	pCurrentQh = pNextQh;
	}

    if (pNextQh == pWork->pQh)
	{
	/* Bipass pWork->pQh. */

	if (ENABLE_BANDWIDTH_RECLAMATION (pHost))
	    {
	    if (pCurrentQh == pHost->pBulkAnchorQh &&
		pNextQh->qh.qhLink == pHost->pciPtrToBulkAnchorQh)
		{
		pCurrentQh->qh.qhLink = UHC_END_OF_LIST;
		}
	    else
		{
		pCurrentQh->qh.qhLink = pNextQh->qh.qhLink;
		}
	    }
	else
	    {
	    pCurrentQh->qh.qhLink = pNextQh->qh.qhLink;
	    }

	DMA_FLUSH (&pCurrentQh->qh.qhLink, sizeof (pCurrentQh->qh.qhLink));

	if (pHost->pLastBulkQh == pNextQh)
	    pHost->pLastBulkQh = pCurrentQh;
	}
    }
    

/***************************************************************************
*
* scheduleBulkTransfer - inserts bulk IRP in frame list
*
* Inserts the bulk transfer into the portion of the frame list appropriate 
* for bulk transfers.
*
* RETURNS: N/A
*/

LOCAL VOID scheduleBulkTransfer
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    /* Set the forward link of this QH to the forward link of the
     * QH which is currently last on the bulk list.
     */

    if (ENABLE_BANDWIDTH_RECLAMATION (pHost))
	{
	if (pHost->pLastBulkQh->qh.qhLink == UHC_END_OF_LIST)
	    pWork->pQh->qh.qhLink = pHost->pciPtrToBulkAnchorQh;
	else
	    pWork->pQh->qh.qhLink = pHost->pLastBulkQh->qh.qhLink;
	}
    else
	{
	pWork->pQh->qh.qhLink = pHost->pLastBulkQh->qh.qhLink;
	}

    DMA_FLUSH (&pWork->pQh->qh, sizeof (pWork->pQh->qh));


    /* Set the forward link of the previous QH to this QH. */

    pHost->pLastBulkQh->qh.qhLink = QH_TO_PCIPTR (pWork->pQh);
    DMA_FLUSH (&pHost->pLastBulkQh->qh.qhLink, 
		sizeof (pHost->pLastBulkQh->qh.qhLink));

    pHost->pLastBulkQh = pWork->pQh;
    }


/***************************************************************************
*
* unscheduleIrp - Removes QH/TDs for IRP from work UHC work lists
*
* RETURNS: N/A
*/

LOCAL VOID unscheduleIrp
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp,
    pIRP_WORKSPACE pWork
    )

    {
    /* un-Scheduling proceeds differently for each transaction type. */

    switch (pWork->pPipe->transferType)
	{
	case USB_XFRTYPE_ISOCH:
	    unscheduleIsochTransfer (pHost, pIrp, pWork);
	    break;

	case USB_XFRTYPE_INTERRUPT: 
	    unscheduleInterruptTransfer (pHost, pIrp, pWork);
	    break;

	case USB_XFRTYPE_CONTROL:
	    unscheduleControlTransfer (pHost, pIrp, pWork);
	    break;

	case USB_XFRTYPE_BULK:
	    unscheduleBulkTransfer (pHost, pIrp, pWork);
	    break;
	}
    }


/***************************************************************************
*
* scheduleIrp - try to schedule an IRP in the frame list
*
* RETURNS: N/A
*/

LOCAL VOID scheduleIrp
    (
    pHCD_HOST pHost,
    pUSB_IRP pIrp
    )

    {
    pIRP_WORKSPACE pWork = (pIRP_WORKSPACE) pIrp->hcdPtr;
    pHCD_PIPE pPipe = pWork->pPipe;


    /* prepare TDs */

    assignTds (pHost, pIrp, pWork);


    /* Mark the time the IRP was first scheduled. */

    if (!pWork->irpRunning)
	{
	pWork->irpRunning = TRUE;
	pWork->startTime = OSS_TIME ();
	}


    /* Scheduling proceeds differently for each transaction type. */

    switch (pPipe->transferType)
	{
	case USB_XFRTYPE_ISOCH:
	    scheduleIsochTransfer (pHost, pIrp, pWork);
	    break;

	case USB_XFRTYPE_INTERRUPT: 
	    scheduleInterruptTransfer (pHost, pIrp, pWork);
	    break;

	case USB_XFRTYPE_CONTROL:
	    scheduleControlTransfer (pHost, pIrp, pWork);
	    break;

	case USB_XFRTYPE_BULK:
	    scheduleBulkTransfer (pHost, pIrp, pWork);
	    break;
	}
    }


/***************************************************************************
*
* rescheduleTds - Examine the given IRP and see if it needs servicing
*
* <pIrp> is an IRP which may/may not have been assigned QHs and TDs and
* currently be schedule for execution.	Examine the <pIrp> and its
* associated USB_WORKSPACE in <pWork> (which might be NULL).  If no work
* has been scheduled or if no TDs have been completed by the UHC, then
* we do nothing.  If there are TDs which have been completed, then we
* release them to the "free" pool.  If work remains to be done, then we
* reschedule the TDs.  If no work remains to be done or if there is an
* error, then we report that the IRP is complete.
*
* RETURNS: OK = IRP completed ok
*      PENDING = IRP still being executed
*      S_usbHcdLib_xxx = IRP fai

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久88色综合天天6| 亚洲成va人在线观看| 国产一区欧美一区| 久久一区二区三区四区| 精品一区二区三区香蕉蜜桃| 久久老女人爱爱| 国产91在线看| 亚洲精品久久久久久国产精华液| 一本到不卡免费一区二区| 亚洲影院免费观看| 日韩三级.com| 懂色av一区二区三区免费观看| 亚洲欧洲一区二区三区| 欧美亚洲一区二区三区四区| 青青国产91久久久久久| 久久久国产精品午夜一区ai换脸| 欧美一级日韩一级| 国产一区二区三区电影在线观看| 中文字幕在线免费不卡| 欧美在线观看视频一区二区| 美女网站色91| 国产精品系列在线| 精品视频全国免费看| 精品在线一区二区三区| 亚洲欧美在线视频观看| 91精品国模一区二区三区| 国产一区二区三区日韩| 亚洲综合清纯丝袜自拍| 精品日韩成人av| 91在线视频网址| 另类小说视频一区二区| 一区二区三区中文字幕| 精品国产一区二区精华| 91官网在线观看| 国产麻豆视频精品| 亚洲va欧美va人人爽午夜 | 色婷婷激情久久| 精品一区二区三区视频在线观看| 亚洲人xxxx| 精品久久久久久久人人人人传媒| 一本一本大道香蕉久在线精品| 激情久久久久久久久久久久久久久久| 亚洲欧美日韩国产手机在线| 精品国产亚洲在线| 欧美日韩免费电影| av在线一区二区三区| 日本中文一区二区三区| 有坂深雪av一区二区精品| 国产欧美一区二区精品忘忧草| 欧美日韩一卡二卡三卡| av电影天堂一区二区在线| 捆绑调教美女网站视频一区| 一区二区三区色| 国产精品免费久久久久| 精品国产髙清在线看国产毛片| 欧美午夜精品一区| 成人av网站大全| 国产成人激情av| 国产中文一区二区三区| 免费观看一级欧美片| 亚洲成a人v欧美综合天堂下载| 中文字幕在线观看一区二区| 国产欧美精品一区| 久久亚洲一级片| 日韩三级视频在线观看| 欧美一级片在线| 777午夜精品免费视频| 欧美日韩视频在线观看一区二区三区| 成人国产亚洲欧美成人综合网 | 久久亚洲私人国产精品va媚药| 9191国产精品| 91麻豆精品91久久久久同性| 日本精品一区二区三区四区的功能| 国产毛片精品国产一区二区三区| 欧美日韩在线亚洲一区蜜芽| 一本色道久久综合亚洲aⅴ蜜桃 | 国产视频亚洲色图| 久久综合九色综合欧美98| 日韩你懂的电影在线观看| 欧美一区二区三区四区五区| 制服视频三区第一页精品| 777午夜精品免费视频| 欧美一区二区久久| 精品日本一线二线三线不卡| 精品欧美一区二区三区精品久久| 欧美va亚洲va国产综合| 久久久91精品国产一区二区三区| 久久一区二区视频| 中文在线一区二区| 亚洲免费伊人电影| 亚洲不卡av一区二区三区| 日韩成人一区二区| 黄色精品一二区| 国产成人午夜高潮毛片| 97久久精品人人做人人爽50路| 91在线观看免费视频| 欧美在线观看禁18| 欧美一区二区观看视频| 久久久精品综合| 国产精品久久久久久久久图文区 | 色综合天天做天天爱| 日本精品裸体写真集在线观看| 在线观看亚洲a| 日韩女优电影在线观看| 久久精品视频一区| 一区二区高清免费观看影视大全| 日韩激情av在线| 国产精品911| 欧美亚洲日本一区| 日韩欧美视频在线 | 中文字幕在线免费不卡| 五月天久久比比资源色| 韩国v欧美v日本v亚洲v| caoporm超碰国产精品| 欧美精品18+| 国产欧美日韩中文久久| 亚洲成人中文在线| 国产精品一区二区三区网站| 91精品1区2区| 精品国产99国产精品| 一区二区三区视频在线看| 激情图区综合网| 欧美亚洲动漫精品| 国产亚洲欧美在线| 亚洲成人第一页| 国产成a人无v码亚洲福利| 欧美系列在线观看| 亚洲第一福利视频在线| 国产精品美女久久久久久久久| 日日摸夜夜添夜夜添精品视频| 东方aⅴ免费观看久久av| 一本久久综合亚洲鲁鲁五月天| 91在线高清观看| wwwwww.欧美系列| 亚洲国产婷婷综合在线精品| 国产精品123| 4438亚洲最大| 亚洲高清在线精品| 成人性生交大片免费看中文| 日韩一区二区三区在线观看| 亚洲人成伊人成综合网小说| 国产在线观看一区二区| 欧美肥胖老妇做爰| 亚洲乱码国产乱码精品精小说| 国产伦精品一区二区三区免费迷| 在线播放/欧美激情| 亚洲一区二区三区影院| 成人免费视频播放| 久久噜噜亚洲综合| 韩日欧美一区二区三区| 欧美日韩国产一级| 亚洲精品国久久99热| 成人毛片在线观看| 国产视频一区二区在线| 激情久久五月天| 精品久久久久久综合日本欧美| 日本人妖一区二区| 欧美绝品在线观看成人午夜影视| 亚洲乱码中文字幕综合| 91在线视频18| 亚洲国产精品国自产拍av| 国产精品99久久久久久宅男| 精品国产免费视频| 精品一区二区免费在线观看| 欧美一级片在线| 捆绑调教美女网站视频一区| 欧美成人性战久久| 韩国一区二区在线观看| 久久夜色精品国产噜噜av | 国产自产2019最新不卡| 精品日韩av一区二区| 韩国女主播一区| 精品国免费一区二区三区| 美女网站在线免费欧美精品| 日韩精品一区二区三区视频播放| 麻豆国产91在线播放| 26uuu精品一区二区 | av男人天堂一区| 自拍偷拍欧美激情| 91成人免费网站| 五月天激情综合| 亚洲精品一区二区三区99| 国产精品夜夜嗨| 国产精品国产自产拍在线| a4yy欧美一区二区三区| 玉米视频成人免费看| 91精品婷婷国产综合久久性色 | 午夜精品一区二区三区三上悠亚| 欧美日韩国产片| 久久精品国产一区二区三| 久久精品一区二区| 97国产一区二区| 午夜精品久久久久久久久久| 精品免费日韩av| 99精品1区2区| 日韩黄色在线观看| 国产欧美一区二区在线| 精品视频1区2区| 国产乱码一区二区三区| 亚洲精品日韩综合观看成人91|