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

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

?? wd7000.c

?? 內核是系統的心臟
?? 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 3000000


static 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一区二区三区免费野_久草精品视频
日韩国产欧美在线视频| 国产日韩亚洲欧美综合| 国产精选一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 欧美性视频一区二区三区| 九九**精品视频免费播放| 亚洲综合精品久久| 欧美激情中文字幕一区二区| 在线播放国产精品二区一二区四区| 国产不卡在线一区| 久久精品国产精品青草| 一二三四社区欧美黄| 亚洲欧美自拍偷拍色图| 久久亚洲精华国产精华液 | 国产成人自拍在线| 日日夜夜精品免费视频| 亚洲精品伦理在线| 欧美国产欧美亚州国产日韩mv天天看完整 | 5566中文字幕一区二区电影| 99久久国产免费看| 国产精品一级在线| 麻豆一区二区在线| 日韩精品一二三| 午夜影视日本亚洲欧洲精品| 亚洲美女免费视频| 亚洲少妇最新在线视频| 国产精品妹子av| 久久精品夜色噜噜亚洲aⅴ| 日韩欧美一区二区视频| 欧美一区二区三区电影| 制服丝袜一区二区三区| 欧美日韩免费在线视频| 欧美亚洲综合网| 欧美视频一区二区三区四区| 欧美在线高清视频| 欧美亚洲综合另类| 欧美精品vⅰdeose4hd| 欧美日韩精品久久久| 欧美日韩在线电影| 91精品国产综合久久婷婷香蕉| 欧美日韩国产经典色站一区二区三区| 欧美日韩一二三区| 制服丝袜中文字幕亚洲| 日韩欧美视频在线| 欧美tickle裸体挠脚心vk| 精品国产凹凸成av人导航| 久久免费视频一区| 国产欧美视频一区二区| 欧美极品美女视频| 成人免费一区二区三区在线观看| 国产精品夫妻自拍| 亚洲一区二区黄色| 日本vs亚洲vs韩国一区三区 | 久久精品国产99国产| 国产麻豆精品视频| 9人人澡人人爽人人精品| 91成人在线免费观看| 欧美日韩精品免费观看视频| 欧美电影免费观看高清完整版| 精品国产露脸精彩对白| 中文字幕在线不卡一区二区三区| 自拍偷在线精品自拍偷无码专区| 亚洲综合成人在线| 美女视频免费一区| 国产不卡在线播放| 欧洲中文字幕精品| 日韩精品一区二| 国产精品福利一区| 日韩电影在线观看网站| 国产东北露脸精品视频| 91久久精品国产91性色tv | 亚洲欧美日韩国产手机在线| 日本一区免费视频| 国产精品久久久久久久裸模| 亚洲一区精品在线| 日韩福利视频导航| 丰满少妇在线播放bd日韩电影| 在线精品观看国产| 精品av久久707| 亚洲欧美日韩在线| 免费在线观看不卡| 粉嫩av一区二区三区在线播放| 色噜噜狠狠一区二区三区果冻| 国产成人亚洲综合a∨猫咪| 精品久久免费看| 日韩视频中午一区| 51精品视频一区二区三区| 久久美女高清视频| 亚洲一区电影777| 国产不卡在线一区| 欧美性生活一区| 国产精品视频在线看| 蜜桃一区二区三区在线| 色哦色哦哦色天天综合| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲精选视频免费看| 国产精品亚洲人在线观看| 欧美蜜桃一区二区三区| 亚洲欧美怡红院| 国内久久精品视频| 欧美丰满高潮xxxx喷水动漫| 国产精品久久久久久福利一牛影视| 蜜桃久久久久久久| 欧美亚洲日本国产| 欧美国产欧美综合| 激情成人午夜视频| 日韩视频一区二区三区在线播放| 亚洲精品国产视频| av动漫一区二区| 久久色在线观看| 九九九久久久精品| 欧美一区二区高清| 亚洲mv大片欧洲mv大片精品| 91香蕉视频污| 国产精品久久网站| 福利电影一区二区三区| 久久久99精品免费观看不卡| 看国产成人h片视频| 欧美夫妻性生活| 婷婷夜色潮精品综合在线| 91免费观看视频| 亚洲欧洲日韩一区二区三区| 成人免费视频caoporn| 久久精品在这里| 国产精品456| 久久精品夜夜夜夜久久| 国产乱子伦视频一区二区三区| 欧美va在线播放| 久久草av在线| 亚洲精品一区二区三区在线观看| 美女视频黄 久久| 精品少妇一区二区三区在线视频| 秋霞电影网一区二区| 91精品综合久久久久久| 日韩二区三区四区| 日韩免费一区二区| 国产精品综合一区二区三区| 精品免费国产一区二区三区四区| 六月丁香婷婷色狠狠久久| 日韩免费看的电影| 国产中文字幕一区| 久久精品男人天堂av| 大胆欧美人体老妇| 成人欧美一区二区三区小说| 色综合天天综合| 亚洲第一av色| 精品国产91乱码一区二区三区 | 成人自拍视频在线观看| 国产精品视频九色porn| 99视频精品在线| 亚洲丶国产丶欧美一区二区三区| 欧美精品欧美精品系列| 久久aⅴ国产欧美74aaa| 国产视频一区在线播放| caoporen国产精品视频| 一区二区三区免费观看| 这里是久久伊人| 国产酒店精品激情| 亚洲人亚洲人成电影网站色| 欧美日韩专区在线| 久久精品国产99久久6| 国产精品丝袜在线| 欧美三片在线视频观看| 精品一区二区三区影院在线午夜| 国产亚洲成年网址在线观看| 色域天天综合网| 奇米影视一区二区三区小说| 国产蜜臀av在线一区二区三区| 91国产福利在线| 奇米精品一区二区三区在线观看一| 久久精品亚洲精品国产欧美| 欧美写真视频网站| 国产一区二区三区免费在线观看| 亚洲天堂免费在线观看视频| 日韩一区二区三区在线视频| 不卡视频一二三| 青青草精品视频| 国产精品对白交换视频 | 91性感美女视频| 欧美aⅴ一区二区三区视频| 欧美韩日一区二区三区四区| 欧美色视频在线| 国产乱妇无码大片在线观看| 一区二区三区国产豹纹内裤在线| 日韩欧美一级在线播放| 色94色欧美sute亚洲线路二| 狠狠色丁香婷综合久久| 一区二区三区高清在线| 久久久久成人黄色影片| 欧美日韩一区二区在线观看| 成人美女视频在线观看18| 肉色丝袜一区二区| 亚洲欧洲综合另类| 欧美精品一区二区在线播放| 精品视频在线免费看| 99久久99久久精品免费看蜜桃| 美女视频黄a大片欧美| 亚洲成人动漫av| 国产精品国产三级国产普通话三级| 日韩亚洲欧美综合|