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

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

?? c64xx_pci.c

?? 6000系列的dsp的mini-pci驅(qū)動
?? C
?? 第 1 頁 / 共 2 頁
字號:
 */
static Int mdSubmitChan(Ptr chanp, IOM_Packet *pPacket)
{
    ChanHandle          chan = (ChanHandle)chanp;
    IOM_Packet*         packet = pPacket;
    Uns                 imask;
    C64XX_PCI_Request  *req;    
    C64XX_PCI_Request  *curReq; 

    req = (C64XX_PCI_Request *)packet->addr;
    req->reserved = chan;
    
    /* IOM_READ or IOM_WRITE command handle in the same way */ 
    if (packet->cmd == IOM_READ || packet->cmd == IOM_WRITE) {

        imask = HWI_disable();
        QUE_enqueue(chan->queue, packet);

        if (device.curPacket == NULL) {
#ifndef TEST_RESET
            processQueue();
#endif
        }
        HWI_restore(imask);
        return (IOM_PENDING);
    } 

    if (packet->cmd == IOM_FLUSH || packet->cmd == IOM_ABORT) { 
        
        imask = HWI_disable();
        chan->flushAbortIop = packet;

        /* check the channel of pending packet */ 
        if (device.curPacket != NULL) {
                curReq = (C64XX_PCI_Request *)device.curPacket->addr;

            /* The pending packet is this channel. Let isr handles it */
            if ((ChanHandle)curReq->reserved == chan) {
                HWI_restore(imask);         
                return (IOM_PENDING);
            } 
        }         
        
        /* the pending packet is not FLUSH/ABORT channel */
        removePackets(chan, packet->cmd);

        /* FLUSH/ABORT done */
        if (chan->writeCount == 0) {
            chan->flushAbortIop = NULL;
            HWI_restore(imask); 
            return (IOM_COMPLETED);
        }                   

        HWI_restore(imask);         
        return (IOM_PENDING);
    }   
    return (IOM_EBADIO); 
}

/*
 *  ======== mdUnBindDev ========
 *  return status
 */

static Int mdUnBindDev(Ptr devp)
{
    /* empty for now */
    return (IOM_COMPLETED);
}

/*
 *  ======== C64XX_PCI_init ========
 */
Void C64XX_PCI_init(Void)
{
    /* empty for now */
}


/*
 *  ======== isr ========
 *  interrupt service routine is runtime pluged in
 */
static Void isr(Void)
{
    ChanHandle          chan;
    IOM_Packet          *oldPacket;
    C64XX_PCI_Request   *oldReq;         
    Int                 status = IOM_EBADIO;
    
    if (PCI_FGET(PCIIS, MASTEROK)) {
        /* pci master transfer complete */       
        PCI_FSET(PCIIS, MASTEROK, 1);
        status = IOM_COMPLETED;
        
    } 
    else if (PCI_FGET(PCIIS, PCIMASTER)) { 
        /* pci master abort */
        PCI_FSET(PCIIS, PCIMASTER, 1);
        
    } 
    else if (PCI_FGET(PCIIS, PCITARGET)) {
        /* pci target abort */
        PCI_FSET(PCIIS, PCITARGET, 1);
        
    } 
    else {
        /* not registered interrupt, clear intr here */
        PCI_RSET(PCIIS, 0x00000FFF);
        /* error handling TBD */
        return;
    }

    if (device.curPacket != NULL) {
        oldPacket = device.curPacket;
        oldReq = (C64XX_PCI_Request *)oldPacket->addr; 
        chan = (ChanHandle)oldReq->reserved;
         
        device.curPacket = NULL;

        if (chan->flushAbortIop == NULL) {
            /* normal. process next request in the queues */
            processQueue();
            
            /* callback */
            CALLBACK(chan,oldPacket,status);   
            return;
        } 
        
        /* flush or abort cmd */
        /* first do callback */
        CALLBACK(chan,oldPacket,status); 
                     
        if (chan->writeCount) { 
           chan->writeCount--;              
        } 
        else {
           removePackets(chan, chan->flushAbortIop->cmd);
        }
            
        /* process next request in the queues */
        processQueue();    

        /* if all write IOPs are done, call the callback for the FLUSH IOP */
        if (chan->writeCount == 0) {
           CALLBACK(chan,chan->flushAbortIop,IOM_COMPLETED);
           chan->flushAbortIop = NULL;   
        } 
        return; 
    } 

    /* process next request in the queues */
    processQueue(); 
}

/*
 *  ======== pciErrorIsr ========
 *  interrupt service routine is runtime pluged in for asynchronous error TBD
 */
#ifdef PCI_ERROR_ISR_IMPL
static Void pciErrorIsr(Void)
{
    /* How to check PCI status register to identify the error source --
    parity/system: TBD (on C6416, not accessable) use 'event' here to 
    represent the status register related content */ 
    
    Bool report = FALSE;
    Uns error = 0;
    C64XX_PCI_Request *req;
    IOM_Packet *packet;

    if (device.errCallback == NULL) {
        return;
    }
    if ((event == C64XX_PCI_EVT_PARITY_ERR) && 
            (device.evtMask & C64XX_PCI_EVT_PARITY_ERR)) {
        error = error | C64XX_PCI_EVT_PARITY_ERR;
        report = TRUE;
    } 
    else if ((event == C64XX_PCI_EVT_SYSTEM_ERR) && 
            (device.evtMask & C64XX_PCI_EVT_SYSTEM_ERR)) {
        error = error | C64XX_PCI_EVT_SYSTEM_ERR;
        report = TRUE;
    } 

    if (!report) {
        return;
    }

    if (device.curPacket != NULL) {
        packet = device.curPacket;
        req = (C64XX_PCI_Request *)packet->addr;
        device.errInfo->inprogressDstAddr = req->dstAddr;
        device.errInfo->inprogressSrcAddr = req->srcAddr;
        device.errInfo->statusReg = PCI_STATUS_REGISTER;
    } 
    else {
        device.errInfo->inprogressDstAddr = NULL;
        device.errInfo->inprogressSrcAddr = NULL;
        device.errInfo->statusReg = PCI_STATUS_REGISTER;
    }

    (device.errCallback)(error, (Ptr)device.errorInfo);
     
}
#endif


/*
 *  ======== doTransfer ========
 */
static Void doTransfer(C64XX_PCI_Request *request)
{
    C64XX_PCI_Request   *req = request;
    PCI_ConfigXfr       config;
    Uns                 xfrMode;
         
    xfrMode = C64XX_PCI_GETXFERMODE(request->options);
        
    if (xfrMode == PCI_WRITE) {
        config.dspma = (Uns)req->srcAddr;
        config.pcima = (Uns)req->dstAddr; 
        config.pcimc = GET_BYTE_COUNT(req->byteCnt);
                                  
    } 
    else if (xfrMode ==  PCI_READ_PREF || xfrMode ==  PCI_READ_NOPREF) {
        config.dspma = (Uns)req->dstAddr;
        config.pcima = (Uns)req->srcAddr; 
        config.pcimc = GET_BYTE_COUNT(req->byteCnt);                    
    }
        
    PCI_xfrConfig(&config);
    PCI_xfrStart(xfrMode);      
}


/*
 *  ======== processQueue ========
 */
static Void processQueue()
{
    QUE_Handle          que;
    C64XX_PCI_Request   *req;

    que = &device.highPrioQue;
    /* process next packet in queue */  
    if (QUE_empty(que)) {
        que = &device.lowPrioQue;
        if (QUE_empty(que)) {
            return;
        }
    } 
    device.curPacket = QUE_dequeue(que);
    req = (C64XX_PCI_Request *)device.curPacket->addr;
    doTransfer(req);                     
}

/*
 *  ======== removePackets ========
 */
static Void removePackets(Ptr chanp, Int cmd) 
{           
    ChanHandle          chan = (ChanHandle)chanp;
    QUE_Elem            *next;
    QUE_Elem            *current;
    C64XX_PCI_Request  *curReq;  
    Int                 status;

    if (cmd != IOM_FLUSH && cmd != IOM_ABORT) {
        return;
    } 
    
    current = QUE_head(chan->queue);
    curReq = (C64XX_PCI_Request *)((IOM_Packet *)current)->addr;
   
    while (chan->queue != current) {
        next = QUE_next(current);
          
        /* check the channel of the each IOM_Packet in the queue */
        /* find the match. The packet and remove channels are identical */ 
        if ((ChanHandle)curReq->reserved == chan) {
            /* for write flush wait for complete */
            if ( cmd == IOM_FLUSH && 
                    ((IOM_Packet *)current)->cmd == IOM_WRITE ) {
                chan->writeCount++;
            } else {
                /* for read flush or abort, do flush */
                if (cmd == IOM_FLUSH) {
                    status = IOM_FLUSHED;
                }
                else {
                    status = IOM_ABORTED;
                }
                QUE_remove(current);
                CALLBACK(chan, (IOM_Packet *)current, status); 
            }
        } 
          
        current = next;
        curReq = (C64XX_PCI_Request*)((IOM_Packet *)current)->addr;      
    } /* end while */
}

/*
 *  ======== resetChannel ========
 */
static Void resetChannel(Ptr chanp)
{
    ChanHandle          chan = (ChanHandle)chanp;
    C64XX_PCI_Request  *curReq;
    Uns                 imask;
    
    imask = HWI_disable();
    /* assume reset async ? */
    if (device.curPacket != NULL) {       
        curReq = (C64XX_PCI_Request *)((IOM_Packet *)device.curPacket)->addr; 
        if ((ChanHandle)curReq->reserved == chan) {
            CALLBACK((ChanHandle)curReq->reserved, 
                    (IOM_Packet *)device.curPacket, IOM_ABORTED); 
            device.curPacket = NULL; 
        }     
    }
    
    removePackets(chanp, IOM_ABORT);
    HWI_restore(imask); 
}

/*
 *  ======== resetDevice ========
 */
static Void resetDevice()
{
    QUE_Elem            *next;
    QUE_Elem            *current;
    QUE_Handle          queue;
    C64XX_PCI_Request  *curReq;
    Int                 i;  
    Uns                 imask;
    
    imask = HWI_disable();
    /* assume reset async ? */
    if (device.curPacket != NULL) {       
        curReq = (C64XX_PCI_Request *)((IOM_Packet *)device.curPacket)->addr; 
         CALLBACK((ChanHandle)curReq->reserved, 
                    (IOM_Packet *)device.curPacket, IOM_ABORTED); 
        device.curPacket = NULL;      
    }
    
    for (i = 0; i < 2; i++) {
        if (i == 0 ) {
            queue = &device.highPrioQue;      
        } 
        else {
            queue = &device.lowPrioQue; 
        }
        /* remove all the elements in the high/low priority queue */
        current = QUE_head(queue);
        curReq = (C64XX_PCI_Request *)((IOM_Packet *)current)->addr;
    
        while (queue != current) {
            next = QUE_next(current);
          
            QUE_remove(current);
            CALLBACK((ChanHandle)curReq->reserved, 
                    (IOM_Packet *)current, IOM_ABORTED);
                 
            current = next;
            curReq = (C64XX_PCI_Request*)((IOM_Packet *)current)->addr; 
        } /* end while */        
    } /* end for */
    
    HWI_restore(imask); 
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美私人免费视频| 日本一区二区三区四区在线视频| 日韩精品一区二区在线观看| 色噜噜狠狠色综合中国| 91精品国产乱| 亚洲欧美色综合| 亚洲欧美成aⅴ人在线观看| 亚洲欧美在线aaa| 日韩在线一二三区| 七七婷婷婷婷精品国产| 99r国产精品| 99久久99久久精品免费观看| 日韩欧美一区在线| 亚洲18女电影在线观看| 东方aⅴ免费观看久久av| 欧美一区二区三区成人| 精品免费视频.| 视频一区二区国产| 激情国产一区二区| 欧美日产在线观看| 亚洲尤物在线视频观看| 奇米精品一区二区三区在线观看| 九九**精品视频免费播放| 欧美午夜精品免费| 日韩精品一区二区在线| 丝袜国产日韩另类美女| 91国偷自产一区二区三区观看| 国产欧美一区二区三区在线老狼| 精品中文字幕一区二区| 国产成a人亚洲精品| 日韩午夜电影av| 视频一区中文字幕国产| 欧美色爱综合网| 亚洲高清免费视频| 欧美日韩亚洲综合| 一区二区视频在线| 久久福利资源站| 亚洲精品一线二线三线| 精品一区二区在线免费观看| 日韩精品一区二区三区四区| 久久se精品一区精品二区| 91麻豆123| 夜色激情一区二区| 欧美日韩国产首页| 青椒成人免费视频| 日韩一区二区三区观看| 久久99国产精品久久99| 欧美国产日本韩| 婷婷六月综合亚洲| 99国产一区二区三精品乱码| 亚洲人吸女人奶水| 国产精品一级二级三级| 欧美嫩在线观看| 精品综合久久久久久8888| 亚洲国产精品成人综合 | 日韩美女一区二区三区| 一区在线播放视频| 国内一区二区在线| 欧美精选一区二区| 精品一区二区三区免费播放| 欧美三区免费完整视频在线观看| 午夜精品久久久久久久久| av一区二区三区在线| 国产视频一区二区三区在线观看| 日本成人在线看| 久久久久久免费网| 久久精品国产亚洲一区二区三区| 精品精品国产高清a毛片牛牛| 国产91精品在线观看| 一区二区在线免费| 色八戒一区二区三区| 日韩精品乱码免费| 欧美日韩1234| 成人免费黄色大片| 天堂久久一区二区三区| 欧美性感一区二区三区| 韩国女主播一区二区三区| 日韩视频在线你懂得| 国产黄色精品视频| 日本一区二区不卡视频| 成人av电影在线观看| 爽好多水快深点欧美视频| 国产精品久久久久一区| 欧美一区二区三区四区五区| 欧美一区二区精美| 99国产麻豆精品| 精品一区二区日韩| 亚洲一区二区综合| 在线精品视频一区二区三四| 国产精品综合久久| 日韩电影免费在线观看网站| 欧美精品一区二| 欧美日韩另类国产亚洲欧美一级| 五月天国产精品| 亚洲人成7777| 欧美性三三影院| www.欧美日韩| 亚洲资源在线观看| 国产精品欧美极品| 亚洲精品一区二区三区蜜桃下载 | 欧美综合一区二区三区| 九九精品视频在线看| 亚洲精品一区二区三区在线观看 | 亚洲久草在线视频| 成人国产亚洲欧美成人综合网| 欧美在线观看视频一区二区| 国产一区二三区好的| 日本欧美韩国一区三区| 欧美精品久久一区| 韩国av一区二区三区在线观看| 午夜精品久久久久久久久久久 | xvideos.蜜桃一区二区| 91精品国产乱| 国产传媒欧美日韩成人| 激情偷乱视频一区二区三区| 狠狠色综合播放一区二区| 日本大胆欧美人术艺术动态| 一区二区免费在线| 欧美成人高清电影在线| 日韩一区二区三区电影| 99麻豆久久久国产精品免费| 国产·精品毛片| 不卡欧美aaaaa| 91丨九色丨国产丨porny| 美女一区二区在线观看| 国产精品热久久久久夜色精品三区| 欧美最猛黑人xxxxx猛交| 欧美色男人天堂| 国产成人免费视频一区| 婷婷中文字幕综合| 免费在线观看一区二区三区| 久久精品国产在热久久| 国产成人在线影院| 91麻豆精品在线观看| 欧美性猛交xxxx乱大交退制版| 欧美一区二区三区小说| 久久久久久久网| 国产精品久久久久影视| 亚洲第一福利一区| 久久精品国产成人一区二区三区 | 亚洲电影视频在线| 美女国产一区二区三区| 狠狠色丁香久久婷婷综合_中| 国产大片一区二区| 色婷婷av一区| 激情国产一区二区| 色综合 综合色| 亚洲美女偷拍久久| 青青国产91久久久久久| 高清在线不卡av| 极品少妇xxxx偷拍精品少妇| 成人免费视频免费观看| 黑人巨大精品欧美黑白配亚洲| 亚洲图片自拍偷拍| 韩国在线一区二区| 韩国毛片一区二区三区| 色综合一区二区| 99视频热这里只有精品免费| 欧美精品高清视频| 欧美日本韩国一区二区三区视频| 欧美本精品男人aⅴ天堂| 亚洲男人天堂av| 亚洲欧美偷拍卡通变态| 国产精品成人免费| 免费成人在线网站| 蜜臀av一区二区| 日韩av午夜在线观看| 日本欧美肥老太交大片| 麻豆精品一区二区| 韩国精品主播一区二区在线观看| 精彩视频一区二区三区| 欧美在线你懂的| 国产亚洲一二三区| 日本麻豆一区二区三区视频| 色婷婷综合久色| 欧美国产欧美综合| 韩国欧美国产一区| 日韩午夜小视频| 国产欧美va欧美不卡在线| 国产精品久久久久久一区二区三区 | 1024国产精品| 亚洲一区二区三区美女| 成人丝袜视频网| 99久久精品99国产精品| 色狠狠桃花综合| ㊣最新国产の精品bt伙计久久| 国模一区二区三区白浆| 99久久伊人精品| 久久久九九九九| 悠悠色在线精品| 成人免费福利片| 欧美三级日韩三级| 亚洲精品在线观看视频| 精品一区二区三区免费观看 | 日韩精品一二三区| 欧美三级资源在线| 精品国产91久久久久久久妲己 | 欧美一区二区三区色| 日韩va亚洲va欧美va久久| 欧美乱妇15p|