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

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

?? wd7000.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* $Id: wd7000.c,v 1.2 1994/01/15 06:02:32 drew Exp $ *  linux/kernel/wd7000.c * *  Copyright (C) 1992  Thomas Wuensche *	closely related to the aha1542 driver from Tommy Thorn *	( as close as different hardware allows on a lowlevel-driver :-) ) * *  Revised (and renamed) by John Boyd <boyd@cis.ohio-state.edu> to *  accomodate Eric Youngdale's modifications to scsi.c.  Nov 1992. * *  Additional changes to support scatter/gather.  Dec. 1992.  tw/jb */#include <stdarg.h>#include <linux/kernel.h>#include <linux/head.h>#include <linux/types.h>#include <linux/string.h>#include <linux/sched.h>#include <asm/system.h>#include <asm/dma.h>#include <asm/io.h>#include <linux/ioport.h>#include "../block/blk.h"#include "scsi.h"#include "hosts.h"/* #define DEBUG  */#include "wd7000.h"#ifdef DEBUG#define DEB(x) x#else#define DEB(x)#endif/*   Driver data structures:   - mb and scbs are required for interfacing with the host adapter.     An SCB has extra fields not visible to the adapter; mb's     _cannot_ do this, since the adapter assumes they are contiguous in     memory, 4 bytes each, with ICMBs following OGMBs, and uses this fact     to access them.   - An icb is for host-only (non-SCSI) commands.  ICBs are 16 bytes each;     the additional bytes are used only by the driver.   - For now, a pool of SCBs are kept in global storage by this driver,     and are allocated and freed as needed.  The 7000-FASST2 marks OGMBs empty as soon as it has _started_ a command,  not when it has finished.  Since the SCB must be around for completion,  problems arise when SCBs correspond to OGMBs, which may be reallocated  earlier (or delayed unnecessarily until a command completes).  Mailboxes are used as transient data structures, simply for  carrying SCB addresses to/from the 7000-FASST2.  Note also since SCBs are not "permanently" associated with mailboxes,  there is no need to keep a global list of Scsi_Cmnd pointers indexed  by OGMB.   Again, SCBs reference their Scsi_Cmnds directly, so mailbox  indices need not be involved.*/static struct {       struct wd_mailbox ogmb[OGMB_CNT];        struct wd_mailbox icmb[ICMB_CNT];} mb;static int next_ogmb = 0;   /* to reduce contention at mailboxes */static Scb scbs[MAX_SCBS];static Scb *scbfree = NULL;static int wd7000_host = 0;static unchar controlstat = 0;static unchar rev_1 = 0, rev_2 = 0;  /* filled in by wd7000_revision */#define wd7000_intr_ack()  outb(0,INTR_ACK)#define WAITnexttimeout 3000000static inline void wd7000_enable_intr(void){    controlstat |= INT_EN;    outb(controlstat,CONTROL);}static inline void wd7000_enable_dma(void){    controlstat |= DMA_EN;    outb(controlstat,CONTROL);    set_dma_mode(DMA_CH, DMA_MODE_CASCADE);    enable_dma(DMA_CH);}#define WAIT(port, mask, allof, noneof)					\ { register WAITbits;							\   register WAITtimeout = WAITnexttimeout;				\   while (1) {								\     WAITbits = inb(port) & (mask);					\     if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \       break;                                                         	\     if (--WAITtimeout == 0) goto fail;					\   }									\ }static inline void delay( unsigned how_long ){     unsigned long time = jiffies + how_long;     while (jiffies < time);}static inline int command_out(unchar *cmdp, int len){    while (len--)  {        WAIT(ASC_STAT, STATMASK, CMD_RDY, 0);	outb(*cmdp++, COMMAND);    }    return 1;fail:    printk("wd7000_out WAIT failed(%d): ", len+1);    return 0;}static inline Scb *alloc_scb(void){    Scb *scb;    unsigned long flags;    save_flags(flags);    cli();    if (scbfree == NULL)  {        panic("wd7000: can't allocate free SCB.\n");	restore_flags(flags);	return NULL;    }    scb = scbfree;  scbfree = scb->next;    memset(scb, 0, sizeof(Scb));  scb->next = NULL;    restore_flags(flags);    return scb;}static inline void free_scb( Scb *scb ){    unsigned long flags;    save_flags(flags);    cli();    memset(scb, 0, sizeof(Scb));    scb->next = scbfree;  scbfree = scb;    restore_flags(flags);}static inline void init_scbs(void){    int i;    unsigned long flags;    save_flags(flags);    cli();    scbfree = &(scbs[0]);    for (i = 0;  i < MAX_SCBS-1;  i++)  scbs[i].next = &(scbs[i+1]);    scbs[MAX_SCBS-1].next = NULL;    restore_flags(flags);}        static int mail_out( Scb *scbptr )/* *  Note: this can also be used for ICBs; just cast to the parm type. */{    int i, ogmb;    unsigned long flags;    DEB(printk("wd7000_scb_out: %06x");)    /* We first look for a free outgoing mailbox */    save_flags(flags);    cli();    ogmb = next_ogmb;    for (i = 0; i < OGMB_CNT; i++) {	if (mb.ogmb[ogmb].status == 0)  {	    DEB(printk(" using OGMB %x",ogmb));	    mb.ogmb[ogmb].status = 1;	    any2scsi(mb.ogmb[ogmb].scbptr, scbptr);	    next_ogmb = (ogmb+1) % OGMB_CNT;	    break;	}  else	    ogmb = (++ogmb) % OGMB_CNT;    }    restore_flags(flags);    DEB(printk(", scb is %x",scbptr);)    if (i >= OGMB_CNT) {        DEB(printk(", no free OGMBs.\n");)	/* Alternatively, issue "interrupt on free OGMB", and sleep... */        return 0;    }    wd7000_enable_intr();     do  {        WAIT(ASC_STAT,STATMASK,CMD_RDY,0);	outb(START_OGMB|ogmb, COMMAND);	WAIT(ASC_STAT,STATMASK,CMD_RDY,0);    }  while (inb(ASC_STAT) & CMD_REJ);    DEB(printk(", awaiting interrupt.\n");)    return 1;fail:    DEB(printk(", WAIT timed out.\n");)    return 0;}int make_code(unsigned hosterr, unsigned scsierr){   #ifdef DEBUG    int in_error = hosterr;#endif    switch ((hosterr>>8)&0xff){	case 0:	/* Reserved */		hosterr = DID_ERROR;		break;	case 1:	/* Command Complete, no errors */		hosterr = DID_OK;		break;	case 2: /* Command complete, error logged in scb status (scsierr) */ 		hosterr = DID_OK;		break;	case 4:	/* Command failed to complete - timeout */		hosterr = DID_TIME_OUT;		break;	case 5:	/* Command terminated; Bus reset by external device */		hosterr = DID_RESET;		break;	case 6:	/* Unexpected Command Received w/ host as target */		hosterr = DID_BAD_TARGET;		break;	case 80: /* Unexpected Reselection */        case 81: /* Unexpected Selection */		hosterr = DID_BAD_INTR;		break;        case 82: /* Abort Command Message  */		hosterr = DID_ABORT;		break;	case 83: /* SCSI Bus Software Reset */	case 84: /* SCSI Bus Hardware Reset */		hosterr = DID_RESET;		break;        default: /* Reserved */		hosterr = DID_ERROR;		break;	}#ifdef DEBUG    if (scsierr||hosterr)        printk("\nSCSI command error: SCSI %02x host %04x return %d",	       scsierr,in_error,hosterr);#endif    return scsierr | (hosterr << 16);}static void wd7000_scsi_done(Scsi_Cmnd * SCpnt){    DEB(printk("wd7000_scsi_done: %06x\n",SCpnt);)    SCpnt->SCp.phase = 0;}void wd7000_intr_handle(int irq){    int flag, icmb, errstatus, icmb_status;    int host_error, scsi_error;    Scb *scb;             /* for SCSI commands */    unchar *icb;          /* for host commands */    Scsi_Cmnd *SCpnt;    flag = inb(INTR_STAT);    DEB(printk("wd7000_intr_handle: intr stat = %02x",flag);)    if (!(inb(ASC_STAT)&0x80)){ 	DEB(printk("\nwd7000_intr_handle: phantom interrupt...\n");)	wd7000_intr_ack();	return;     }    /* check for an incoming mailbox */    if ((flag & 0x40) == 0) {        /*  for a free OGMB - need code for this case... */        DEB(printk("wd7000_intr_handle: free outgoing mailbox\n");)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久久网| 久久午夜国产精品| 亚洲精品一区二区三区蜜桃下载| 国产日韩影视精品| 日本欧美一区二区在线观看| 91美女福利视频| 2022国产精品视频| 日韩成人午夜精品| 欧美在线免费视屏| 中文av一区二区| 国产精品88888| 欧美不卡视频一区| 免费观看日韩av| 欧美日韩一级视频| 一区二区三区 在线观看视频| 丁香激情综合国产| 久久综合色天天久久综合图片| 亚洲高清不卡在线| 色婷婷亚洲精品| 亚洲乱码国产乱码精品精98午夜| 国产成人自拍网| 久久久午夜电影| 精品无人区卡一卡二卡三乱码免费卡| 欧美日韩亚洲综合| 亚洲国产成人va在线观看天堂| 色综合久久久久久久| 国产精品久久久久久妇女6080| 国产一区二区三区免费看| 精品福利在线导航| 麻豆一区二区99久久久久| 欧美日韩一区二区不卡| 亚洲国产精品一区二区久久| 91浏览器入口在线观看| 亚洲婷婷在线视频| 91久久精品日日躁夜夜躁欧美| 日韩美女久久久| 99在线精品视频| 亚洲天堂精品视频| 色婷婷亚洲婷婷| 亚洲成av人片在www色猫咪| 欧美性色黄大片手机版| 午夜欧美大尺度福利影院在线看| 在线免费亚洲电影| 亚洲成人第一页| 日韩视频在线你懂得| 韩国精品主播一区二区在线观看| 精品国产乱码久久久久久老虎| 久久99精品久久久久婷婷| 欧美精品一区二区三区在线| 国产精品456| 一区二区三区中文字幕电影| 精品视频1区2区| 激情偷乱视频一区二区三区| 国产欧美日韩精品a在线观看| 成人性生交大片| 亚洲电影在线播放| 精品国产乱码久久久久久久| 成人黄色在线看| 午夜影院久久久| 久久综合久色欧美综合狠狠| av成人老司机| 免费xxxx性欧美18vr| 亚洲综合在线免费观看| 欧美美女视频在线观看| 国产一区二区三区免费播放| 中文字幕亚洲电影| 欧美一级精品在线| www.一区二区| 欧美bbbbb| 亚洲欧美日韩久久| 精品国产91久久久久久久妲己| 不卡的电影网站| 天堂成人免费av电影一区| 国产日韩欧美不卡在线| 欧美日韩国产欧美日美国产精品| 韩国成人福利片在线播放| 亚洲一区二区偷拍精品| 久久精品欧美一区二区三区不卡| 在线日韩一区二区| 国产精品91xxx| 青青草原综合久久大伊人精品优势| 国产精品不卡视频| 久久免费的精品国产v∧| 欧美亚洲国产怡红院影院| 国产成人综合自拍| 久久精品国产99| 亚洲动漫第一页| 亚洲精品午夜久久久| 欧美国产综合一区二区| 日韩美女视频一区二区在线观看| 91免费精品国自产拍在线不卡| 麻豆91在线播放免费| 亚洲成人中文在线| 亚洲欧洲制服丝袜| 国产精品家庭影院| 久久久久久免费网| 日韩一区二区三| 日韩一级完整毛片| 欧美日本免费一区二区三区| 色婷婷精品久久二区二区蜜臀av| 国产成人在线免费观看| 久久99国产精品久久99果冻传媒| 亚洲动漫第一页| 亚洲一区二区免费视频| 亚洲精品日韩一| 国产精品久久久久影院老司| 国产欧美精品在线观看| 国产婷婷精品av在线| 久久综合精品国产一区二区三区| 欧美一三区三区四区免费在线看 | 欧美日韩一区二区三区在线 | 欧美高清激情brazzers| 色婷婷综合久久久久中文一区二区 | 欧美中文字幕一二三区视频| 91浏览器在线视频| 色欧美片视频在线观看在线视频| 99视频一区二区三区| 91香蕉视频污在线| 欧美体内she精高潮| 555www色欧美视频| 日韩欧美的一区| 久久婷婷国产综合国色天香| 精品国产网站在线观看| 欧美哺乳videos| 久久久久成人黄色影片| 中文字幕av在线一区二区三区| 国产精品第四页| 亚洲精品中文字幕乱码三区| 亚洲成av人片一区二区三区| 丝袜国产日韩另类美女| 国产一区二区三区不卡在线观看 | 在线成人av影院| 精品少妇一区二区三区日产乱码 | 久久久久久久久久久久久久久99| 久久先锋影音av| 亚洲免费在线电影| 亚洲成av人片在www色猫咪| 麻豆精品精品国产自在97香蕉 | 麻豆成人av在线| 国产又黄又大久久| 99久久精品免费| 欧美日韩精品一区二区三区蜜桃 | 欧美日韩成人在线一区| 欧美一区二区精美| 国产欧美日韩亚州综合| 亚洲一区在线视频观看| 激情五月激情综合网| 色综合久久综合中文综合网| 欧美日本精品一区二区三区| 国产欧美一区二区三区在线老狼| ...av二区三区久久精品| 日韩精品三区四区| av电影在线观看完整版一区二区| 色婷婷国产精品久久包臀| 欧美成人精品福利| 亚洲蜜臀av乱码久久精品蜜桃| 美国av一区二区| 一本到一区二区三区| 久久美女艺术照精彩视频福利播放| 亚洲综合一区二区| 国产中文字幕精品| 欧美日韩亚洲不卡| 中文字幕欧美激情一区| 久久精品久久精品| 在线观看国产91| 中文字幕在线观看不卡视频| 爽爽淫人综合网网站| 成人爱爱电影网址| 日韩欧美成人激情| 亚洲成人第一页| 97久久精品人人做人人爽| 日韩一区二区在线看片| 一区二区三区四区在线免费观看| 狠狠狠色丁香婷婷综合激情 | 久久精品视频在线看| 午夜精品成人在线视频| 97久久精品人人做人人爽| 91精品国产综合久久精品性色| 亚洲人123区| av中文字幕在线不卡| 久久免费电影网| 极品少妇xxxx精品少妇偷拍| 欧美日韩精品免费观看视频| 亚洲欧美日韩人成在线播放| 成人激情黄色小说| 中文字幕国产一区二区| 国产精品亚洲一区二区三区妖精| 欧美一卡2卡三卡4卡5免费| 一级做a爱片久久| 日本精品一区二区三区四区的功能| 国产无一区二区| 国产精品中文字幕欧美| 久久精品欧美一区二区三区不卡| 久久精品国产亚洲5555| 精品少妇一区二区三区免费观看| 蜜臀久久久久久久| 欧美电视剧在线观看完整版| 美女爽到高潮91| 精品国产一区二区三区四区四| 久久国产精品99精品国产 |