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

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

?? pehci.c

?? usb isp1761驅動源代碼 可編進內核。
?? C
?? 第 1 頁 / 共 5 頁
字號:
#else
    else{
        return;
    }

#endif


    ormask = isp1761_reg_read32(hcd->dev, hcd->regs.int_irq_mask_or, ormask);
    /*process all the endpoints first those are done*/
    donetoclear = donemap;
    while(donetoclear){
        /*index is the number of endpoints open currently*/
        index = donetoclear & mask;
        donetoclear &= ~mask;
        mask <<= 1;
        /*what if we are in the middle of schedule
          where nothing is done*/
        if(!index ){
            location++;
            continue;
        }

        /*read our td_ptd_map*/
        td_ptd_map = &ptd_map_buff->map_list[location];

        /*if this one is already in the removal*/
        if(td_ptd_map->state == TD_PTD_REMOVE ||
                td_ptd_map->state ==  TD_PTD_NEW){
            pehci_check("interrupt td is being removed\n");
            /*this will be handled by urb_remove*/
            /*if this is last urb no need to complete it again*/
            donemap &= ~td_ptd_map->ptd_bitmap;
            /*if there is something pending*/
            ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap;
            continue;
        }


        /*if we found something already in*/
        if(!(skipmap & td_ptd_map->ptd_bitmap)){
            pehci_check("intr td_ptd_map %x,skipnap %x\n",
                    td_ptd_map->ptd_bitmap,skipmap);
            donemap &= ~td_ptd_map->ptd_bitmap;
            /*in case pending*/
            ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap; ;
            location++;
            continue;
        }


        if(td_ptd_map->state ==  TD_PTD_NEW){
            pehci_check("interrupt not come here, map %x,location %d\n", td_ptd_map->ptd_bitmap,location);
            donemap &= ~td_ptd_map->ptd_bitmap;
            /*in case pending*/
            ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap;
            donemap &= ~td_ptd_map->ptd_bitmap;
            location++;
            continue;
        }

        /*move to the next schedule*/
        location ++;
        /*endpoint, td, urb and memory
         * for current transfer*/
        qh = td_ptd_map->qh;
        qtd = td_ptd_map->qtd;
        if(qtd->state & QTD_STATE_NEW){
            /*we need to schedule it*/
            goto schedule;
        }
        urb = qtd->urb;
        mem_addr = &qtd->mem_addr;

        /*clear the irq mask for this transfer*/
        ormask &= ~td_ptd_map->ptd_bitmap;
        isp1761_reg_write32(hcd->dev, hcd->regs.int_irq_mask_or, ormask);

        ptd_map_buff->active_ptds--;
        memset(qhint, 0, sizeof(struct _isp1761_qhint));

        /*read this ptd from the ram address,address is in the
          td_ptd_map->ptd_header_addr*/
        isp1761_mem_read(hcd->dev, td_ptd_map->ptd_header_addr,0,(u32 *)(qhint),PHCI_QHA_LENGTH,0);

        /*statuc of 8 uframes*/
        for(i=0;i<8;i++){
            /*take care of errors*/
            usofstatus = qhint->td_info5 >> (8 + i * 3);
            switch(usofstatus & 0x7){
                case INT_UNDERRUN:
                    pehci_print("under run , %x\n", usofstatus);
                    break;
                case INT_EXACT:
                    pehci_print("transaction error, %x\n", usofstatus);
                    break;
                case INT_BABBLE:
                    pehci_print("babble error, %x\n", usofstatus);
                    break;
            }
        }

        if(urb->dev->speed != USB_SPEED_HIGH)
            /*length is 1K for full/low speed device*/
            length = PTD_XFERRED_NONHSLENGTH(qhint->td_info4);
        else
            /*length is 32K for high speed device*/
            length = PTD_XFERRED_LENGTH(qhint->td_info4);

        pehci_hcd_update_error_status(qhint->td_info4, urb);
        /*halted, need to finish all the transfer on this endpoint*/
        if(qhint->td_info4 & PTD_STATUS_HALTED){
            //td_ptd_map->lasttd = 1;
            qtd->state |= QTD_STATE_LAST;
            /*in case of halt, next transfer will start with toggle zero,
             *USB speck, 5.8.5*/
            qh->datatoggle = td_ptd_map->datatoggle = 0;
            donemap &= ~td_ptd_map->ptd_bitmap;
            ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap;
            dontschedule = 1;
            goto copylength;
        }


copylength:
        /*preserve the current data toggle*/
        qh->datatoggle = td_ptd_map->datatoggle = PTD_NEXTTOGGLE(qhint->td_info4);
        /*copy data from the host*/
        switch(PTD_PID(qhint->td_info2)){
            case IN_PID:
                if(length && (length <= MAX_PTD_BUFFER_SIZE))
                    /*do read only when there is somedata*/
                    isp1761_mem_read(hcd->dev,(u32)mem_addr->phy_addr,0,(void*)(le32_to_cpu(qtd->hw_buf[0])),length,0);
            case OUT_PID:
                urb->actual_length += length;
                qh->hw_current = qtd->hw_next;
                phci_hcd_mem_free(&qtd->mem_addr);
                qtd->state &= ~QTD_STATE_NEW;
                qtd->state |= QTD_STATE_DONE;
                break;
        }

        if(qtd->state & QTD_STATE_LAST){
            pehci_hcd_urb_complete(hcd,qh,urb,td_ptd_map);
            if(dontschedule){ /*cleanup will start from drivers*/
                dontschedule = 0;
                continue;
            }

            /*take the next if in the queue*/
            if(!list_empty(&qh->qtd_list)){
                struct list_head *head;
                /*last td of previous urb*/
                head = &qh->qtd_list;
                qtd = list_entry(head->next,struct ehci_qtd, qtd_list);
                td_ptd_map->qtd = qtd;
                qh->hw_current = cpu_to_le32(qtd);
                qh->qh_state = QH_STATE_LINKED;

            }else{
                td_ptd_map->qtd = (struct ehci_qtd *) le32_to_cpu(0);
                qh->hw_current = cpu_to_le32(0);
                qh->qh_state = QH_STATE_TAKE_NEXT;
                donemap &= ~td_ptd_map->ptd_bitmap;
                ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap;
                continue;
            }

        }

schedule:    
        {
            /*current td comes from qh->hw_current*/    
            ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap;
            ormask |= td_ptd_map->ptd_bitmap;
            ptd_map_buff->active_ptds++;
            pehci_check("inter schedule next qtd %p, active tds %d\n", qtd,ptd_map_buff->active_ptds);
            pehci_hcd_qtd_schedule(hcd,qtd,qh,td_ptd_map);
        }        

    } /*end of while*/


    /*clear all the tds inside this routine*/
    skipmap &= ~donemap;
    isp1761_reg_write32(hcd->dev, hcd->regs.inttdskipmap, skipmap);
    ormask |= donemap;
    isp1761_reg_write32(hcd->dev, hcd->regs.int_irq_mask_or,ormask);
}

/*atl(bulk/control) transfer handler*/
/*1. read done map
  2. read the ptd to see any errors
  3. copy the payload to and from
  4. update ehci td
  5. make new ptd if transfer there and earlier done
  6. schedule
 */
    static void
pehci_hcd_atl_worker(phci_hcd *hcd)
{
    u32 donemap = 0, donetoclear=0;
    u32 pendingmap = 0;
    u32 rl = 0; 
    u32 mask = 0x1,index = 0;
    u32 location = 0;
    u32 nakcount = 0;
    u32 active = 0;
    u32 length = 0;
    u32 skipmap = 0;
    u32 tempskipmap = 0;        
    u32 ormask=0;
    struct urb *urb;
    struct ehci_qtd *qtd = 0;
    struct ehci_qh *qh;
    struct _isp1761_qha   atlqha;
    struct _isp1761_qha *qha;
    td_ptd_map_t       *td_ptd_map;
    td_ptd_map_buff_t   *ptd_map_buff;
    urb_priv_t          *urbpriv = 0;   
    struct isp1761_mem_addr *mem_addr = 0;
    u32 dontschedule = 0;       

    ptd_map_buff = &(td_ptd_map_buff[TD_PTD_BUFF_TYPE_ATL]);
    pendingmap = ptd_map_buff->pending_ptd_bitmap;

#ifdef MSEC_INT_BASED
    /*running on skipmap rather donemap,
      some cases donemap may not be set 
      for complete transfer
     */                 
    skipmap = isp1761_reg_read32(hcd->dev, hcd->regs.atltdskipmap, skipmap);
    tempskipmap = ~skipmap;
    if(tempskipmap){
        donemap = isp1761_reg_read32(hcd->dev, hcd->regs.atltddonemap,donemap);
        skipmap |= donemap;
        isp1761_reg_write32(hcd->dev, hcd->regs.atltdskipmap, skipmap);
        qha = &atlqha;
        donemap |= pendingmap;
        tempskipmap &= ~donemap;
    }

    /*if sof interrupt enabled*/
    else{
        /*if there is something pending , put this transfer in*/
        if(pendingmap){
            pehci_hcd_schedule_pending_ptds(hcd,pendingmap,(u8)TD_PTD_BUFF_TYPE_ATL,1);
        }
        return;
    }
#else

    donemap = isp1761_reg_read32(hcd->dev, hcd->regs.atltddonemap,donemap);
    if(donemap){
        skipmap = isp1761_reg_read32(hcd->dev, hcd->regs.atltdskipmap, skipmap);
        skipmap |= donemap;
        isp1761_reg_write32(hcd->dev, hcd->regs.atltdskipmap, skipmap);
        qha = &atlqha;
    }
    else{
        return;

    }
#endif

    /*read the interrupt mask registers*/
    ormask = isp1761_reg_read32(hcd->dev, hcd->regs.atl_irq_mask_or, ormask);


    /*this map is used only to update and
     * scheduling for the tds who are not
     * complete. the tds those are complete
     * new schedule will happen from
     * td_ptd_submit_urb routine
     * */
    donetoclear = donemap;
    /*we will be processing skipped tds also*/
    donetoclear |= tempskipmap; 
    /*process all the endpoints first those are done*/
    while(donetoclear){
        /*index is the number of endpoint open currently*/
        index = donetoclear & mask;
        donetoclear &= ~mask;
        mask <<= 1;
        /*what if we are in the middle of schedule
          where nothing is done
         */
        if(!index ){
            location++;
            continue;
        }

        /*read our td_ptd_map*/
        td_ptd_map = &ptd_map_buff->map_list[location];

        /*urb is in remove*/
        if(td_ptd_map->state == TD_PTD_NEW ||
                td_ptd_map->state ==  TD_PTD_REMOVE){
            pehci_check("atl td is being removed,map %x, skipmap %x\n", td_ptd_map->ptd_bitmap, skipmap);
            pehci_check("temp skipmap %x, pendign map %x,done %x\n",tempskipmap, pendingmap,donemap);

            /*unlink urb will take care of this*/
            donemap &= ~td_ptd_map->ptd_bitmap;
            /*in case pending*/
            ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap;
            location++;
            continue;
        }


        /*move to the next endpoint*/
        location ++;
        /*endpoint, td, urb and memory
         * for current endpoint*/
        qh = td_ptd_map->qh;
        qtd = td_ptd_map->qtd;
        if(!qh || !qtd)
        {
            err("Never Error:QH and QTD must not be zero\n");
            donemap &= ~td_ptd_map->ptd_bitmap;
            /*in case pending*/
            ptd_map_buff->pending_ptd_bitmap &= ~td_ptd_map->ptd_bitmap;            
            continue;
        } 
#ifdef MSEC_INT_BASED           
        /*new td must be scheduled*/
        if((qtd->state & QTD_STATE_NEW) /*&&
                                          (pendingmap & td_ptd_map->ptd_bitmap)*/){
            /*this td will come here first time from
             *pending tds, so its qh->hw_current needs to
             * adjusted
             */
            qh->hw_current = QTD_NEXT (qtd->qtd_dma);
            goto schedule;
        }
#endif                  

        urb = qtd->urb;
        urbpriv = (urb_priv_t *)urb->hcpriv;
        mem_addr = &qtd->mem_addr;

#ifdef MSEC_INT_BASED
        /*check here for the td if its done*/
        if(donemap & td_ptd_map->ptd_bitmap){
            /*nothing to do*/
            ;
        }else{
       

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产伦精品一区二区三区免费迷| 亚洲激情自拍视频| 日本 国产 欧美色综合| 欧美日韩国产美| 午夜精品免费在线| 欧美一级高清大全免费观看| 激情综合网天天干| 欧美国产97人人爽人人喊| 不卡av电影在线播放| 一区二区三区高清在线| 欧美精品aⅴ在线视频| 久久爱www久久做| 欧美国产一区在线| 欧美体内she精高潮| 免费日韩伦理电影| 国产午夜精品久久久久久久| 不卡免费追剧大全电视剧网站| 亚洲柠檬福利资源导航| 56国语精品自产拍在线观看| 韩国毛片一区二区三区| 国产精品国模大尺度视频| 欧美视频三区在线播放| 欧美日韩电影在线播放| 另类综合日韩欧美亚洲| 国产农村妇女毛片精品久久麻豆 | 亚洲国产人成综合网站| 日韩女优电影在线观看| 高清不卡在线观看| 亚洲va天堂va国产va久| 久久久高清一区二区三区| 91蜜桃免费观看视频| 日韩激情视频在线观看| 国产精品久久一级| 在线观看91av| 91在线国内视频| 久久成人精品无人区| 亚洲精品免费看| 日韩一区二区三区四区| 91在线观看美女| 国内精品视频一区二区三区八戒| 夜夜嗨av一区二区三区| 国产夜色精品一区二区av| 欧美人与z0zoxxxx视频| 国产suv精品一区二区6| 婷婷一区二区三区| 国产精品福利av| 日韩精品在线一区二区| 欧美性淫爽ww久久久久无| 成人午夜电影小说| 狠狠色狠狠色综合日日91app| 亚洲男人的天堂在线观看| 精品91自产拍在线观看一区| 欧美体内she精高潮| 99国产精品久久久久久久久久久| 国内精品第一页| 日韩av中文字幕一区二区| 亚洲久草在线视频| 国产精品天干天干在观线| 久久亚洲精华国产精华液| 欧美一区二区三区在线看| 色久优优欧美色久优优| aaa欧美色吧激情视频| 国产精品99久久不卡二区| 极品少妇xxxx精品少妇偷拍| 丝袜亚洲另类欧美| 亚洲国产精品尤物yw在线观看| 国产精品不卡一区| 国产精品毛片无遮挡高清| 亚洲国产高清aⅴ视频| 国产欧美一区二区三区鸳鸯浴| 精品久久久久久久人人人人传媒| 正在播放亚洲一区| 欧美顶级少妇做爰| 91精品国产91热久久久做人人| 欧美日韩国产精品自在自线| 欧美性videosxxxxx| 欧美日韩日日摸| 制服丝袜成人动漫| 日韩欧美二区三区| 久久精品网站免费观看| 欧美激情一区二区三区四区| 中文字幕精品一区| 中文字幕在线免费不卡| 中文字幕在线观看一区二区| 亚洲色图欧美激情| 亚洲一区在线观看免费 | 宅男在线国产精品| 欧美精品vⅰdeose4hd| 欧美一区二区性放荡片| 欧美一区二区三区在线| 欧美成人艳星乳罩| 国产亚洲美州欧州综合国| 国产欧美一区二区三区网站| 国产精品久久久久国产精品日日| 亚洲婷婷综合久久一本伊一区| 亚洲伦理在线免费看| 亚洲成人免费视频| 日本午夜精品视频在线观看 | 精品国产三级a在线观看| 久久精品亚洲一区二区三区浴池| 国产欧美精品一区| 一区二区三国产精华液| 天堂av在线一区| 国产大片一区二区| 972aa.com艺术欧美| 在线成人免费视频| 国产亚洲午夜高清国产拍精品| 日韩毛片视频在线看| 偷拍亚洲欧洲综合| 成人免费三级在线| 69堂国产成人免费视频| 国产性天天综合网| 亚洲福利一二三区| 国产一区二区三区观看| 91黄色在线观看| 精品国产3级a| 一区二区三区产品免费精品久久75| 日韩二区在线观看| av福利精品导航| 欧美一二三四区在线| 亚洲视频免费看| 麻豆成人久久精品二区三区红 | 国产电影一区在线| 91国在线观看| 久久精品视频在线看| 亚洲午夜av在线| 东方欧美亚洲色图在线| 欧美色欧美亚洲另类二区| 久久久精品免费网站| 视频在线在亚洲| 91小视频免费观看| 久久亚洲精精品中文字幕早川悠里| 亚洲在线成人精品| 国产精品小仙女| 制服丝袜亚洲精品中文字幕| 亚洲免费观看高清在线观看| 久久er精品视频| 欧美精品乱人伦久久久久久| 国产精品区一区二区三| 久久国产精品72免费观看| 色偷偷88欧美精品久久久| 久久久不卡影院| 久久99国产精品久久| 777亚洲妇女| 亚洲一区二区av在线| 99re这里只有精品首页| 国产日韩视频一区二区三区| 日本成人在线一区| 欧美日韩高清影院| 亚洲成a人v欧美综合天堂下载| 99国产精品久| 国产精品每日更新在线播放网址| 国产在线精品免费| 精品日韩在线一区| 人妖欧美一区二区| 亚洲人成影院在线观看| 成人黄色大片在线观看| 久久嫩草精品久久久久| 狠狠久久亚洲欧美| 精品人伦一区二区色婷婷| 蜜桃久久av一区| 欧美一级二级在线观看| 秋霞影院一区二区| 日韩午夜激情免费电影| 青青草国产成人99久久| 91精品国产综合久久久久| 婷婷一区二区三区| 777久久久精品| 麻豆一区二区三| 337p粉嫩大胆色噜噜噜噜亚洲| 狠狠色丁香婷综合久久| 制服.丝袜.亚洲.中文.综合| 奇米色777欧美一区二区| 制服丝袜av成人在线看| 喷水一区二区三区| 精品乱人伦小说| 国产精品1区二区.| 国产精品国产三级国产普通话99| 成人在线视频一区| 亚洲视频在线观看三级| 在线视频综合导航| 亚洲国产成人高清精品| 欧美欧美午夜aⅴ在线观看| 欧美96一区二区免费视频| 精品国产乱码久久久久久夜甘婷婷| 狠狠色丁香九九婷婷综合五月| 久久精品免费在线观看| 91老师国产黑色丝袜在线| 亚洲一区二区综合| 欧美一级欧美三级在线观看| 国产高清在线观看免费不卡| 亚洲天堂成人在线观看| 欧美美女一区二区在线观看| 精品一区二区三区欧美| 国产精品午夜春色av| 欧美日韩一级二级| 精品中文av资源站在线观看| 国产精品午夜春色av| 欧美日韩一级二级| 国产成人精品影院|