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

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

?? wd7000.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
        wd7000_intr_ack();
	return;
    }
    /* The interrupt is for an incoming mailbox */
    icmb = flag & 0x3f;
    scb = (struct scb *) scsi2int(mb.icmb[icmb].scbptr);
    icmb_status = mb.icmb[icmb].status;
    mb.icmb[icmb].status = 0;

#ifdef DEBUG
    printk(" ICMB %d posted for SCB/ICB %06x, status %02x, vue %02x",
 	   icmb, scb, icmb_status, scb->vue );
#endif

    if (!(scb->op & 0x80))  {   /* an SCB is done */
        SCpnt = scb->SCpnt;
	if (--(SCpnt->SCp.phase) <= 0)  {  /* all scbs for SCpnt are done */
	    host_error = scb->vue | (icmb_status << 8);
	    scsi_error = scb->status;
	    errstatus = make_code(host_error,scsi_error);    
	    SCpnt->result = errstatus;

 	    if (SCpnt->host_scribble != NULL)
 	        scsi_free(SCpnt->host_scribble,WD7000_SCRIBBLE);
 	    free_scb(scb);

	    SCpnt->scsi_done(SCpnt);
	}
    }  else  {    /* an ICB is done */
        icb = (unchar *) scb;
        icb[ICB_STATUS] = icmb_status;
	icb[ICB_PHASE] = 0;
    }

    wd7000_intr_ack();
    DEB(printk(".\n");)
    return;
}


int wd7000_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
{
    Scb *scb;
    Sgb *sgb;
    unchar *cdb;
    unchar idlun;
    short cdblen;

    cdb = (unchar *) SCpnt->cmnd;
    cdblen = COMMAND_SIZE(*cdb);
    idlun = ((SCpnt->target << 5) & 0xe0) | (SCpnt->lun & 7);
    SCpnt->scsi_done = done;
    SCpnt->SCp.phase = 1;
    scb = alloc_scb();
    scb->idlun = idlun;
    memcpy(scb->cdb, cdb, cdblen);
    scb->direc = 0x40;		/* Disable direction check */
    scb->SCpnt = SCpnt;         /* so we can find stuff later */
    SCpnt->host_scribble = NULL;
    DEB(printk("request_bufflen is %x, bufflen is %x\n",\
        SCpnt->request_bufflen, SCpnt->bufflen);)

    if (SCpnt->use_sg)  {
        struct scatterlist *sg = (struct scatterlist *) SCpnt->request_buffer;
        unsigned i;

        if (scsi_hosts[wd7000_host].sg_tablesize <= 0)  {
	    panic("wd7000_queuecommand: scatter/gather not supported.\n");
	}
#ifdef DEBUG
 	printk("Using scatter/gather with %d elements.\n",SCpnt->use_sg);
#endif
  	/*
 	    Allocate memory for a scatter/gather-list in wd7000 format.
 	    Save the pointer at host_scribble.
  	*/
#ifdef DEBUG
 	if (SCpnt->use_sg > WD7000_SG)
 	    panic("WD7000: requesting too many scatterblocks\n");
#endif
 	SCpnt->host_scribble = (unsigned char *) scsi_malloc(WD7000_SCRIBBLE);
	sgb = (Sgb *) SCpnt->host_scribble;
 	if (sgb == NULL)
            panic("wd7000_queuecommand: scsi_malloc() failed.\n");

 	scb->op = 1;
 	any2scsi(scb->dataptr, sgb);
 	any2scsi(scb->maxlen, SCpnt->use_sg * sizeof (Sgb) );

	for (i = 0;  i < SCpnt->use_sg;  i++)  {
 	    any2scsi(sgb->ptr, sg[i].address);
 	    any2scsi(sgb->len, sg[i].length);
 	    sgb++;
        }
 	DEB(printk("Using %d bytes for %d scatter/gather blocks\n",\
 	    scsi2int(scb->maxlen), SCpnt->use_sg);)
    }  else  {
	scb->op = 0;
	any2scsi(scb->dataptr, SCpnt->request_buffer);
	any2scsi(scb->maxlen, SCpnt->request_bufflen);
    }

    return mail_out(scb);
}


int wd7000_command(Scsi_Cmnd *SCpnt)
{
    wd7000_queuecommand(SCpnt, wd7000_scsi_done);

    while (SCpnt->SCp.phase > 0);  /* phase counts scbs down to 0 */

    return SCpnt->result;
}


int wd7000_init(void)
{   int i;
    unchar init_block[] = {
        INITIALIZATION, 7, BUS_ON, BUS_OFF, 0, 0, 0, 0, OGMB_CNT, ICMB_CNT
    };

    /* Reset the adapter. */
    outb(SCSI_RES|ASC_RES, CONTROL);
    delay(1);  /* reset pulse: this is 10ms, only need 25us */
    outb(0,CONTROL);  controlstat = 0;
    /*
       Wait 2 seconds, then expect Command Port Ready.

       I suspect something else needs to be done here, but I don't know
       what.  The OEM doc says power-up diagnostics take 2 seconds, and
       indeed, SCSI commands submitted before then will time out, but
       none of what follows seems deterred by _not_ waiting 2 secs.
    */
    delay(200);

    WAIT(ASC_STAT, STATMASK, CMD_RDY, 0);
    DEB(printk("wd7000_init: Power-on Diagnostics finished\n");)
    if (((i=inb(INTR_STAT)) != 1) && (i != 7)) {
	panic("wd7000_init: Power-on Diagnostics error\n"); 
	return 0;
    }
    
    /* Clear mailboxes */
    memset(&mb,0,sizeof (mb));
    /* Set up SCB free list */
    init_scbs();

    /* Set up init block */
    any2scsi(init_block+5,&mb);
    /* Execute init command */
    if (!command_out(init_block,sizeof(init_block)))  {
	panic("WD-7000 Initialization failed.\n"); 
	return 0;
    }
    
    /* Wait until init finished */
    WAIT(ASC_STAT, STATMASK, CMD_RDY | ASC_INI, 0);
    outb(DISABLE_UNS_INTR, COMMAND); 
    WAIT(ASC_STAT, STATMASK, CMD_RDY | ASC_INI, 0);

    /* Enable Interrupt and DMA */
    if (request_irq(IRQ_LVL, wd7000_intr_handle)) {
      panic("Unable to allocate IRQ for WD-7000.\n");
      return 0;
    };
    if(request_dma(DMA_CH)) {
      panic("Unable to allocate DMA channel for WD-7000.\n");
      free_irq(IRQ_LVL);
      return 0;
    };
    wd7000_enable_dma();
    wd7000_enable_intr();

    printk("WD-7000 initialized.\n");
    return 1;
  fail:
    return 0;					/* 0 = not ok */
}


void wd7000_revision(void)
{
    volatile unchar icb[ICB_LEN] = {0x8c};  /* read firmware revision level */

    icb[ICB_PHASE] = 1;
    mail_out( (struct scb *) icb );
    while (icb[ICB_PHASE]) /* wait for completion */;
    rev_1 = icb[1];
    rev_2 = icb[2];

    /*
        For boards at rev 7.0 or later, enable scatter/gather.
    */
    if (rev_1 >= 7)  scsi_hosts[wd7000_host].sg_tablesize = WD7000_SG;
}


static const char *wd_bases[] = {(char *)0xce000,(char *)0xd8000};

typedef struct {
    char * signature;
    unsigned offset;
    unsigned length;
} Signature;

static const Signature signatures[] = {{"SSTBIOS",0xd,0x7}};

#define NUM_SIGNATURES (sizeof(signatures)/sizeof(Signature))


int wd7000_detect(int hostnum)
/* 
 *  return non-zero on detection
 */
{
    int i,j;
    char const *base_address = NULL;

    if(check_region(IO_BASE, 4)) return 0;  /* IO ports in use */
    for(i=0;i<(sizeof(wd_bases)/sizeof(char *));i++){
	for(j=0;j<NUM_SIGNATURES;j++){
	    if(!memcmp((void *)(wd_bases[i] + signatures[j].offset),
		(void *) signatures[j].signature,signatures[j].length)){
		    base_address=wd_bases[i];
		    printk("WD-7000 detected.\n");
	    }	
	}
    }
    if (base_address == NULL) return 0;

    snarf_region(IO_BASE, 4); /* Register our ports */
    /* Store our host number */
    wd7000_host = hostnum;

    wd7000_init();    
    wd7000_revision();  /* will set scatter/gather by rev level */

    return 1;
}



static void wd7000_append_info( char *info, const char *fmt, ... )
/*
 *  This is just so I can use vsprintf...
 */
{
    va_list args;
    extern int vsprintf(char *buf, const char *fmt, va_list args);

    va_start(args, fmt);
    vsprintf(info, fmt, args);
    va_end(args);

    return;
}


const char *wd7000_info(void)
{
    static char info[80] = "Western Digital WD-7000, Firmware Revision ";

    wd7000_revision();
    wd7000_append_info( info+strlen(info), "%d.%d.\n", rev_1, rev_2 );

    return info;
}

int wd7000_abort(Scsi_Cmnd * SCpnt, int i)
{
#ifdef DEBUG
    printk("wd7000_abort: Scsi_Cmnd = 0x%08x, code = %d ", SCpnt, i);
    printk("id %d lun %d cdb", SCpnt->target, SCpnt->lun);
    {  int j;  unchar *cdbj = (unchar *) SCpnt->cmnd;
       for (j=0; j < COMMAND_SIZE(*cdbj);  j++)  printk(" %02x", *(cdbj++));
       printk(" result %08x\n", SCpnt->result);
    }
#endif
    return 0;
}


/* We do not implement a reset function here, but the upper level code assumes
   that it will get some kind of response for the command in SCpnt.  We must
   oblige, or the command will hang the scsi system */

int wd7000_reset(Scsi_Cmnd * SCpnt)
{
#ifdef DEBUG
    printk("wd7000_reset\n");
#endif
    if (SCpnt) SCpnt->flags |= NEEDS_JUMPSTART;
    return 0;
}


int wd7000_biosparam(int size, int dev, int* ip)
/*
 *  This is borrowed directly from aha1542.c, but my disks are organized
 *   this way, so I think it will work OK.
 */
{
  ip[0] = 64;
  ip[1] = 32;
  ip[2] = size >> 11;
/*  if (ip[2] >= 1024) ip[2] = 1024; */
  return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人h精品动漫一区二区三区| 日韩国产高清在线| 欧美精品一区二区久久婷婷| 欧洲国产伦久久久久久久| 一区二区在线观看av| 国产视频一区在线观看| 99久久国产免费看| 韩国av一区二区| 久久超碰97人人做人人爱| 久久精品免视看| 国产丝袜欧美中文另类| 91社区在线播放| 成人看片黄a免费看在线| 国产一区二区在线观看视频| 成人黄色在线视频| 国产99久久久国产精品潘金网站| 青青草伊人久久| 男男成人高潮片免费网站| 蜜桃视频在线观看一区二区| 老司机精品视频线观看86| 激情五月婷婷综合网| 国产成人午夜99999| 成人av电影免费观看| 一本久道中文字幕精品亚洲嫩| 色综合天天综合网天天狠天天| 欧美在线观看一区二区| 91精品欧美福利在线观看| 亚洲精品一区二区在线观看| 国产日产亚洲精品系列| 综合电影一区二区三区| 亚洲综合在线观看视频| 日本一不卡视频| 国产一区二区不卡老阿姨| av成人免费在线观看| 欧美精品精品一区| 久久精品一区二区| 亚洲欧美福利一区二区| 日本一不卡视频| 成人aaaa免费全部观看| 欧美在线free| 精品久久久久久久久久久院品网| 国产精品久久久久久妇女6080| 一区二区三区精密机械公司| 免费久久99精品国产| 成人美女视频在线观看| 欧美日韩精品免费观看视频| 精品国产电影一区二区| 亚洲视频1区2区| 日韩va欧美va亚洲va久久| 成人免费av网站| 91精品国产综合久久精品图片 | 91免费视频大全| 欧美精品乱码久久久久久按摩| 久久久美女艺术照精彩视频福利播放| 综合久久久久综合| 久久99国产精品久久99 | 另类的小说在线视频另类成人小视频在线 | 成人ar影院免费观看视频| 国产精品一区不卡| 在线中文字幕不卡| 久久久久国产精品人| 亚洲一区av在线| 成人午夜激情在线| 7777精品伊人久久久大香线蕉超级流畅| 欧美一级生活片| 国产精品的网站| 九九精品一区二区| 欧美日韩精品一区视频| 中文字幕五月欧美| 国产一区二区91| 欧美大胆一级视频| 天堂va蜜桃一区二区三区漫画版| 成人国产精品免费网站| 精品对白一区国产伦| 国内精品在线播放| 久久久久久黄色| 欧美午夜免费电影| 激情五月激情综合网| 亚洲一区二区高清| 精品美女被调教视频大全网站| 国产精品免费视频观看| 亚洲自拍偷拍网站| 欧美一级在线免费| 欧美亚洲国产bt| 欧美一区二区三区小说| 777亚洲妇女| 有码一区二区三区| 波多野结衣中文字幕一区| 精品国产乱码久久久久久牛牛| 无吗不卡中文字幕| 欧美少妇性性性| 亚洲一区影音先锋| 91老司机福利 在线| 自拍视频在线观看一区二区| 国产精品亚洲视频| 亚洲国产乱码最新视频| youjizz久久| 中文字幕精品—区二区四季| 国产一区二区网址| 欧美精品一区二区三区高清aⅴ| 美国av一区二区| 日韩精品中文字幕一区二区三区| 日韩成人伦理电影在线观看| 欧美精品一卡二卡| 日本女优在线视频一区二区| 91麻豆精品国产91| 另类中文字幕网| 日韩女优视频免费观看| 久久精品国产77777蜜臀| 精品处破学生在线二十三| 久久er精品视频| 亚洲精品在线三区| 国产一区二区免费看| 欧美激情一区在线观看| 95精品视频在线| 一区二区三区免费网站| 欧美日韩午夜在线| 日韩精品91亚洲二区在线观看| 日韩一区二区在线看片| 精品在线你懂的| 欧美激情一区二区三区全黄| 99vv1com这只有精品| 亚洲成av人片观看| 欧美一卡二卡三卡| 国产成人av网站| 中文字幕欧美一| 欧美日韩午夜影院| 国内成人免费视频| 1区2区3区精品视频| 欧美少妇bbb| 久久精品国产亚洲a| 国产丝袜欧美中文另类| 91丝袜国产在线播放| 亚洲va中文字幕| 欧美videossexotv100| 福利一区在线观看| 樱花草国产18久久久久| 91精品国产综合久久精品| 国产一区二区美女| 亚洲一区中文日韩| 26uuu精品一区二区| av毛片久久久久**hd| 日韩精品电影在线| 亚洲国产精品成人综合色在线婷婷| 91国产免费看| 黄色小说综合网站| 一区二区在线看| 欧美成人伊人久久综合网| av不卡一区二区三区| 日韩高清在线电影| 国产精品网站在线| 8x福利精品第一导航| 不卡一区二区三区四区| 日日夜夜精品免费视频| 国产精品福利一区| 日韩一区二区免费在线电影| av不卡在线播放| 九色|91porny| 亚洲国产综合人成综合网站| 国产片一区二区| 欧美日韩高清一区二区| 成人一级片在线观看| 日本亚洲电影天堂| 亚洲天堂精品视频| 欧美精品一区二区三区蜜桃视频| 91原创在线视频| 日韩一级片网站| 欧美影视一区在线| 成人黄色小视频| 久久国产精品72免费观看| 一区二区三区日韩精品视频| 国产欧美一区二区三区网站| 欧美一级爆毛片| 欧美日韩亚洲丝袜制服| www.欧美精品一二区| 欧美年轻男男videosbes| 精品国产伦一区二区三区观看体验| 欧美激情中文字幕| 天堂精品中文字幕在线| caoporn国产精品| 精品人在线二区三区| 亚洲一区二区视频在线| 国产一区二区不卡| 日韩一区二区在线免费观看| 亚洲一卡二卡三卡四卡| 91网站黄www| 国产精品久久久久久一区二区三区 | 久久精品国产99久久6| a在线播放不卡| 国产精品国产三级国产专播品爱网| 久久99精品久久久| 日韩一级片在线播放| 亚洲成人三级小说| 精品视频一区三区九区| 亚欧色一区w666天堂| 欧美mv日韩mv| 色婷婷精品大在线视频| 韩国欧美国产1区| 久久69国产一区二区蜜臀| 日韩电影在线免费观看|