Home | History | Annotate | Line # | Download | only in isa
      1 /*	$NetBSD: wdsreg.h,v 1.8 2005/12/11 12:22:03 christos Exp $	*/
      2 
      3 typedef u_char physaddr[3];
      4 typedef u_char physlen[3];
      5 #define	ltophys	_lto3b
      6 #define	phystol	_3btol
      7 
      8 /* WD7000 registers */
      9 #define WDS_STAT		0	/* read */
     10 #define WDS_IRQSTAT		1	/* read */
     11 
     12 #define WDS_CMD			0	/* write */
     13 #define WDS_IRQACK		1	/* write */
     14 #define WDS_HCR			2	/* write */
     15 
     16 /* WDS_STAT (read) defs */
     17 #define WDSS_IRQ		0x80
     18 #define WDSS_RDY		0x40
     19 #define WDSS_REJ		0x20
     20 #define WDSS_INIT		0x10
     21 
     22 /* WDS_IRQSTAT (read) defs */
     23 #define WDSI_MASK		0xc0
     24 #define WDSI_ERR		0x00
     25 #define WDSI_MFREE		0x80
     26 #define WDSI_MSVC		0xc0
     27 
     28 /* WDS_CMD (write) defs */
     29 #define WDSC_NOOP		0x00
     30 #define WDSC_INIT		0x01
     31 #define WDSC_DISUNSOL		0x02
     32 #define WDSC_ENAUNSOL		0x03
     33 #define WDSC_IRQMFREE		0x04
     34 #define WDSC_SCSIRESETSOFT	0x05
     35 #define WDSC_SCSIRESETHARD	0x06
     36 #define WDSC_MSTART(m)		(0x80 + (m))
     37 #define WDSC_MMSTART(m)		(0xc0 + (m))
     38 
     39 /* WDS_HCR (write) defs */
     40 #define WDSH_IRQEN		0x08
     41 #define WDSH_DRQEN		0x04
     42 #define WDSH_SCSIRESET		0x02
     43 #define WDSH_ASCRESET		0x01
     44 
     45 #define WDS_NSEG	17
     46 
     47 struct wds_scat_gath {
     48 	physlen seg_len;
     49 	physaddr seg_addr;
     50 };
     51 
     52 struct wds_cmd {
     53 	u_char opcode;
     54 	u_char targ;
     55 	u_char scb[12];
     56 	u_char stat;
     57 	u_char venderr;
     58 	physlen len;
     59 	physaddr data;
     60 	physaddr link;
     61 	u_char write;
     62 	u_char xx[6];
     63 };
     64 
     65 struct wds_scb {
     66 	struct wds_cmd cmd;
     67 	struct wds_cmd sense;
     68 
     69 	struct wds_scat_gath scat_gath[WDS_NSEG];
     70 	struct scsi_sense_data sense_data;
     71 
     72 	TAILQ_ENTRY(wds_scb) chain;
     73 	struct wds_scb *nexthash;
     74 	u_long hashkey;
     75 	struct scsipi_xfer *xs;
     76 	int flags;
     77 #define	SCB_ALLOC	0x01
     78 #define	SCB_ABORT	0x02
     79 #ifdef WDSDIAG
     80 #define	SCB_SENDING	0x04
     81 #endif
     82 #define	SCB_POLLED	0x08
     83 #define	SCB_SENSE	0x10
     84 #define	SCB_DONE	0x20	/* for internal commands only */
     85 #define	SCB_BUFFER	0x40
     86 	int timeout;
     87 
     88 	/*
     89 	 * DMA maps used by the SCB.  These maps are created in
     90 	 * wds_init_scb().
     91 	 */
     92 
     93 	/*
     94 	 * The DMA map maps an individual SCB.  This map is permanently
     95 	 * loaded in wds_init_scb().
     96 	 */
     97 	bus_dmamap_t	dmamap_self;
     98 
     99 	/*
    100 	 * This map maps the buffer involved in the transfer.
    101 	 * Its contents are loaded into "scat_gath" above.
    102 	 */
    103 	bus_dmamap_t	dmamap_xfer;
    104 };
    105 
    106 #define WDSX_SCSICMD		0x00
    107 #define WDSX_SCSISG		0x01
    108 #define WDSX_OPEN_RCVBUF	0x80
    109 #define WDSX_RCV_CMD		0x81
    110 #define WDSX_RCV_DATA		0x82
    111 #define WDSX_RCV_DATASTAT	0x83
    112 #define WDSX_SND_DATA		0x84
    113 #define WDSX_SND_DATASTAT	0x85
    114 #define WDSX_SND_CMDSTAT	0x86
    115 #define WDSX_READINIT		0x88
    116 #define WDSX_READSCSIID		0x89
    117 #define WDSX_SETUNSOLIRQMASK	0x8a
    118 #define WDSX_GETUNSOLIRQMASK	0x8b
    119 #define WDSX_GETFIRMREV		0x8c
    120 #define WDSX_EXECDIAG		0x8d
    121 #define WDSX_SETEXECPARM	0x8e
    122 #define WDSX_GETEXECPARM	0x8f
    123 
    124 struct wds_mbx_out {
    125 	u_char cmd;
    126 	physaddr scb_addr;
    127 };
    128 
    129 struct wds_mbx_in {
    130 	u_char stat;
    131 	physaddr scb_addr;
    132 };
    133 
    134 /*
    135  * mbo.cmd values
    136  */
    137 #define	WDS_MBO_FREE		0x0	/* MBO entry is free */
    138 #define	WDS_MBO_START		0x1	/* MBO activate entry */
    139 
    140 /*
    141  * mbi.stat values
    142  */
    143 #define	WDS_MBI_FREE		0x00	/* MBI entry is free */
    144 #define WDS_MBI_OK		0x01	/* completed without error */
    145 #define WDS_MBI_OKERR		0x02	/* completed with error */
    146 #define WDS_MBI_ETIME		0x04
    147 #define WDS_MBI_ERESET		0x05
    148 #define WDS_MBI_ETARCMD		0x06
    149 #define WDS_MBI_ERESEL		0x80
    150 #define WDS_MBI_ESEL		0x81
    151 #define WDS_MBI_EABORT		0x82
    152 #define WDS_MBI_ESRESET		0x83
    153 #define WDS_MBI_EHRESET		0x84
    154 
    155 struct wds_setup {
    156 	u_char opcode;
    157 	u_char scsi_id;
    158 	u_char buson_t;
    159 	u_char busoff_t;
    160 	u_char xx;
    161 	physaddr mbaddr;
    162 	u_char nomb;
    163 	u_char nimb;
    164 };
    165