📄 wd7000.h
字号:
#ifndef _WD7000_H/* $Id: $ * * Header file for the WD-7000 driver for Linux * * $Log: $ * Revision 1.1 1992/07/24 06:27:38 root * Initial revision * * Revision 1.1 1992/07/05 08:32:32 root * Initial revision * * Revision 1.1 1992/05/15 18:38:05 root * Initial revision * * Revision 1.1 1992/04/02 03:23:13 drew * Initial revision * * Revision 1.3 1992/01/27 14:46:29 tthorn * *** empty log message *** * */#include <linux/types.h>#undef STATMASK#undef CONTROL#define IO_BASE 0x350#define IRQ_LVL 15#define DMA_CH 6#define OGMB_CNT 8#define ICMB_CNT 16/* I/O Port interface 4.2 *//* READ */#define ASC_STAT IO_BASE#define INT_IM 0x80 /* Interrupt Image Flag */#define CMD_RDY 0x40 /* Command Port Ready */#define CMD_REJ 0x20 /* Command Port Byte Rejected */#define ASC_INI 0x10 /* ASC Initialized Flag */#define STATMASK 0xf0 /* The lower 4 Bytes are reserved *//* This register serves two purposes * Diagnostics error code * Interrupt Status */#define INTR_STAT ASC_STAT+1#define ANYINTR 0x80 /* Mailbox Service possible/required */#define IMB 0x40 /* 1 Incoming / 0 Outgoing */#define MBMASK 0x3f/* if MSb is zero, the lower bits are diagnostic status * * Diagnostics: * 01 No diagnostic error occurred * 02 RAM failure * 03 FIFO R/W failed * 04 SBIC register read/write failed * 05 Initialization D-FF failed * 06 Host IRQ D-FF failed * 07 ROM checksum error * Interrupt status (bitwise): * 10NNNNNN outgoing mailbox NNNNNN is free * 11NNNNNN incoming mailbox NNNNNN needs service *//* WRITE */#define COMMAND ASC_STAT/* * COMMAND opcodes */#define NO_OP 0#define INITIALIZATION 1 /* initialization after reset (10 bytes) */#define DISABLE_UNS_INTR 2 /* disable unsolicited interrupts */#define ENABLE_UNS_INTR 3 /* enable unsolicited interrupts */#define INTR_ON_FREE_OGMB 4 /* interrupt on free OGMB */#define SCSI_SOFT_RESET 5 /* SCSI soft reset */#define SCSI_HARD_RESET 6 /* SCSI hard reset acknowledge */#define START_OGMB 0x80 /* start command in OGMB (n) */#define SCAN_OGMBS 0xc0 /* start multiple commands, signature (n) */ /* where (n) = lower 6 bits *//* * For INITIALIZATION: */#define BUS_ON 48 /* x 125ns, 48 = 6000ns, BIOS uses 8000ns */#define BUS_OFF 24 /* x 125ns, 24 = 3000ns, BIOS uses 1875ns */ #define INTR_ACK ASC_STAT+1#define CONTROL ASC_STAT+2#define INT_EN 0x08 /* Interrupt Enable */#define DMA_EN 0x04 /* DMA Enable */#define SCSI_RES 0x02 /* SCSI Reset */#define ASC_RES 0x01 /* ASC Reset *//* Mailbox Definition */struct wd_mailbox{ unchar status; unchar scbptr[3];};/* These belong in scsi.h also */#undef any2scsi#define any2scsi(up, p) \(up)[0] = (((long)(p)) >> 16); \(up)[1] = ((long)(p)) >> 8; \(up)[2] = ((long)(p));#define scsi2int(up) ( (((long)*(up)) << 16) + (((long)(up)[1]) << 8) + ((long)(up)[2]) )#define xany2scsi(up, p) \(up)[0] = ((long)(p)) >> 24; \(up)[1] = ((long)(p)) >> 16; \(up)[2] = ((long)(p)) >> 8; \(up)[3] = ((long)(p));#define xscsi2int(up) ( (((long)(up)[0]) << 24) + (((long)(up)[1]) << 16) \ + (((long)(up)[2]) << 8) + ((long)(up)[3]) )#define MAX_CDB 12#define MAX_SENSE 14typedef struct scb { /* Command Control Block 5.4.1 */ unchar op; /* Command Control Block Operation Code */ unchar idlun; /* op=0,2:Target Id, op=1:Initiator Id */ /* Outbound data transfer, length is checked*/ /* Inbound data transfer, length is checked */ /* Logical Unit Number */ unchar cdb[12]; /* SCSI Command Block */ unchar status; /* SCSI Return Status */ unchar vue; /* Vendor Unique Error Code */ unchar maxlen[3]; /* Maximum Data Transfer Length */ unchar dataptr[3]; /* SCSI Data Block Pointer */ unchar linkptr[3]; /* Next Command Link Pointer */ unchar direc; /* Transfer Direction */ unchar reserved2[6]; /* SCSI Command Descriptor Block */ /* end of hardware SCB */ Scsi_Cmnd *SCpnt; /* Scsi_Cmnd using this SCB */ struct scb *next; /* for lists of scbs */} Scb;/* * WD7000-specific scatter/gather element structure */typedef struct sgb { unchar len[3]; unchar ptr[3];} Sgb;/* * Note: MAX_SCBS _must_ be defined large enough to keep ahead of the * demand for SCBs, which will be at most WD7000_Q * WD7000_SG. 1 is * added to each because they can be 0. */#define MAX_SCBS ((WD7000_Q+1) * (WD7000_SG+1))/* * The driver is written to allow host-only commands to be executed. These * use a 16-byte block called an ICB. * * (Currently, only wd7000_info uses this, to get the firmware rev. level.) */#define ICB_STATUS 16 /* set to icmb status by wd7000_intr_handle */#define ICB_PHASE 17 /* set to 0 by wd7000_intr_handle */#define ICB_LEN 18 /* actually 16; this includes the above */int wd7000_detect(int);int wd7000_command(Scsi_Cmnd *);int wd7000_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));int wd7000_abort(Scsi_Cmnd *, int);const char *wd7000_info(void);int wd7000_reset(Scsi_Cmnd *);int wd7000_biosparam(int, int, int*);#ifndef NULL #define NULL 0#endif/* * Define WD7000_SG to be the number of Sgbs that will fit in a block of * size WD7000_SCRIBBLE. WD7000_SCRIBBLE must be 512, 1024, 2048, or 4096. * * The sg_tablesize value will default to SG_NONE for older boards (before * rev 7.0), but will be changed to WD7000_SG when a newer board is * detected. */#define WD7000_SCRIBBLE 512#define WD7000_Q OGMB_CNT#define WD7000_SG (WD7000_SCRIBBLE / sizeof(Sgb))#define WD7000 {\ "Western Digital WD-7000", \ wd7000_detect, \ wd7000_info, wd7000_command, \ wd7000_queuecommand, \ wd7000_abort, \ wd7000_reset, \ NULL, \ wd7000_biosparam, \ WD7000_Q, 7, SG_NONE, 1, 0, 1}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -