[BACK]Return to xyreg.h CVS log [TXT][DIR] Up to [local] / sys / arch / sparc / dev

Annotation of sys/arch/sparc/dev/xyreg.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: xyreg.h,v 1.4 2004/04/12 22:12:32 jmc Exp $   */
                      2: /*     $NetBSD: xyreg.h,v 1.3 1996/03/31 22:39:02 pk Exp $     */
                      3:
                      4: /*
                      5:  *
                      6:  * Copyright (c) 1995 Charles D. Cranor
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
                     19:  *      This product includes software developed by Charles D. Cranor.
                     20:  * 4. The name of the author may not be used to endorse or promote products
                     21:  *    derived from this software without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     25:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     26:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     27:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     28:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     29:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     30:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     31:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     32:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     33:  */
                     34:
                     35: /*
                     36:  * x y r e g . h
                     37:  *
                     38:  * this file contains the description of the Xylogics 450/451's hardware
                     39:  * data structures.
                     40:  *
                     41:  * author: Chuck Cranor <chuck@ccrc.wustl.edu>
                     42:  */
                     43:
                     44: #define XYC_MAXDEV    2       /* max devices per controller */
                     45: #define XYC_CTLIOPB   XYC_MAXDEV /* controller's iopb */
                     46: #define XYC_RESETUSEC 1000000 /* max time for xyc reset (same as xdc?) */
                     47: #define XYC_MAXIOPB   (XYC_MAXDEV+1)
                     48:                              /* max number of iopbs that can be active */
                     49: #define XYC_MAXTIME   4*1000000 /* four seconds before we give up and reset */
                     50: #define XYC_MAXTRIES  4       /* max number of times to retry an operation */
                     51: #define XYC_INTERLEAVE 1      /* interleave (from disk label?) */
                     52: #define XYFM_BPS       0x200 /* must be 512! */
                     53:
                     54: /*
                     55:  * xyc device interface
                     56:  * (lives in VME address space)   [note: bytes are swapped!]
                     57:  */
                     58:
                     59: struct xyc {
                     60:   volatile u_char xyc_reloc_hi;        /* iopb relocation (low byte) */
                     61:   volatile u_char xyc_reloc_lo;        /* iopb relocation (high byte) */
                     62:   volatile u_char xyc_addr_hi;         /* iopb address (low byte) */
                     63:   volatile u_char xyc_addr_lo;         /* iopb address (high byte) */
                     64:   volatile u_char xyc_rsetup;          /* reset/update reg */
                     65:   volatile u_char xyc_csr;             /* control and status register */
                     66: };
                     67:
                     68: /*
                     69:  * xyc_csr
                     70:  */
                     71:
                     72: #define XYC_GBSY     0x80     /* go/busy */
                     73: #define XYC_ERR             0x40     /* error */
                     74: #define XYC_DERR     0x20     /* double error! */
                     75: #define XYC_IPND     0x10     /* interrupt pending */
                     76: #define XYC_ADRM     0x08     /* 24-bit addressing */
                     77: #define XYC_AREQ     0x04     /* attention request */
                     78: #define XYC_AACK     0x02     /* attention ack. */
                     79: #define XYC_DRDY     0x01     /* drive ready */
                     80:
                     81: /*
                     82:  * Input/Output Parameter Block (iopb)
                     83:  *
                     84:  * all controller commands are done via iopb's.   to start a command you
                     85:  * must do this:
                     86:  * [1] allocate space in DVMA space for the iopb
                     87:  * [2] fill out all the fields of the iopb
                     88:  * [3] if the controller isn't busy, start the iopb by loading the address
                     89:  *     and reloc in the xyc's registers and setting the "go" bit [done]
                     90:  * [4] controller busy: set AREQ bit, and wait for AACK bit.
                     91:  *     add iopb to the chain, and clear AREQ to resume I/O
                     92:  *
                     93:  * when the controller is done with a command it may interrupt (if you
                     94:  * ask it to) and it will set the XYC_IPND bit in the csr.   clear
                     95:  * the interrupt by writing one to this bit.
                     96:  *
                     97:  * the format of the iopb is described in section 2.4 of the manual.
                     98:  * note that it is byte-swapped on the sun.
                     99:  */
                    100:
                    101: struct xy_iopb {
                    102:                                 /* section 2.4.2: byte 1 */
                    103:   volatile u_char resv1:1;      /* reserved */
                    104:   volatile u_char iei:1;        /* interrupt on each IOPB done */
                    105:   volatile u_char ierr:1;       /* interrupt on error (no effect on 450) */
                    106:   volatile u_char hdp:1;        /* hold dual port drive */
                    107:   volatile u_char asr:1;        /* autoseek retry */
                    108:   volatile u_char eef:1;        /* enable extended fn. (overlap seek) */
                    109:   volatile u_char ecm:2;        /* ECC correction mode */
                    110: #define XY_ECM 2                /* use mode 2 (see section 2.4.2) */
                    111:                                  /* section 2.4.1: byte 0 */
                    112:   volatile u_char aud:1;        /* auto-update iopb */
                    113:   volatile u_char relo:1;       /* enable multibus relocation (>16bit addrs)*/
                    114:   volatile u_char chen:1;        /* chain enable, "next iopb" is valid */
                    115:   volatile u_char ien:1;        /* interrupt enable */
                    116:   volatile u_char com:4;        /* command */
                    117: #define XYCMD_NOP 0x0            /* no-op */
                    118: #define XYCMD_WR  0x1            /* write */
                    119: #define XYCMD_RD  0x2            /* read */
                    120: #define XYCMD_WTH 0x3           /* write track headers */
                    121: #define XYCMD_RTH 0x4           /* read track headers */
                    122: #define XYCMD_SK  0x5            /* seek */
                    123: #define XYCMD_RST 0x6            /* drive reset */
                    124: #define XYCMD_WFM 0x7           /* write format */
                    125: #define XYCMD_RDH 0x8           /* read header, data, and ECC */
                    126: #define XYCMD_RDS 0x9           /* read drive status */
                    127: #define XYCMD_WRH 0xa           /* write header, data, and ECC */
                    128: #define XYCMD_SDS 0xb           /* set drive size */
                    129: #define XYCMD_ST  0xc           /* self test */
                    130: #define XYCMD_R   0xd           /* reserved */
                    131: #define XYCMD_MBL 0xe           /* maint. buffer load */
                    132: #define XYCMD_MBD 0xf           /* main. buffer dump */
                    133:                                  /* section 2.4.4: byte 3 */
                    134:   volatile u_char errno;        /* error or completion code */
                    135:                                  /* section 2.4.3: byte 2 */
                    136:   volatile u_char errs:1;        /* error summary bit */
                    137:   volatile u_char resv2:2;      /* reserved */
                    138:   volatile u_char ctyp:3;       /* controller type */
                    139: #define XYCT_450 1              /* the 450 controller */
                    140:   volatile u_char resv3:1;      /* reserved */
                    141:   volatile u_char done:1;       /* done! */
                    142:                                  /* section 2.4.6: byte 5 */
                    143:   volatile u_char dt:2;                 /* drive type */
                    144: #define XYC_MAXDT 3             /* largest drive type possible */
                    145:   volatile u_char resv4:4;      /* reserved */
                    146:   volatile u_char unit:2;       /* unit # */
                    147:                                  /* section 2.4.5: byte 4 */
                    148:   volatile u_char bw:1;                 /* byte(1)/word(0) xfer size */
                    149:   volatile u_char intlv:4;      /* interleave factor (0=1:1, 1=2:1, etc.) */
                    150:   volatile u_char thro:3;       /* dma throttle (0=2,1=4,2=8, etc...) */
                    151: #define XY_THRO 4               /* 4 == 32 dma cycles */
                    152:                                  /* section 2.4.8: byte 7 */
                    153:   volatile u_char sect;                 /* sector # */
                    154:                                  /* section 2.4.7: byte 6 */
                    155:   volatile u_char head;                 /* head # */
                    156:                                  /* section 2.4.9: byte 8,9 */
                    157:   volatile u_short cyl;                 /* cyl # */
                    158:                                  /* section 2.4.10: byte a,b */
                    159:   volatile u_short scnt;        /* sector count, also drive status */
                    160: #define xy_dr_status scnt
                    161: #define XYS_ONCL 0x80           /* on-cylinder (active LOW) */
                    162: #define XYS_DRDY 0x40           /* drive ready (active LOW) */
                    163: #define XYS_WRPT 0x20           /* write protect */
                    164: #define XYS_DPB  0x10           /* dual-port busy */
                    165: #define XYS_SKER 0x08           /* hard seek error */
                    166: #define XYS_DFLT 0x04           /* disk fault */
                    167:                                  /* section 2.4.11: byte c,d */
                    168:   volatile u_short dataa;       /* data address */
                    169:                                  /* section 2.4.12: byte e,f */
                    170:   volatile u_short datar;       /* data relocation pointer */
                    171:                                 /* section 2.4.14: byte 11 */
                    172:   volatile u_char subfn;        /* sub-function */
                    173:                                 /* section 2.4.13: byte 10 */
                    174:   volatile u_char hoff;                 /* head offset for fixed/removable drives */
                    175:                                 /* section 2.4.15: byte 12,13 */
                    176:   volatile u_short nxtiopb;     /* next iopb address (same relocation) */
                    177:                                 /* section 2.4.16: byte 14,15 */
                    178:   volatile u_short eccpat;      /* ecc pattern */
                    179:                                 /* section 2.4.17: byte 16,17 */
                    180:   volatile u_short eccaddr;     /* ecc address */
                    181: };
                    182:
                    183:
                    184: /*
                    185:  * errors (section 2.4.4.1)
                    186:  */
                    187:
                    188: /* software error codes */
                    189: #define XY_ERR_FAIL 0xff         /* general total failure */
                    190: #define XY_ERR_DERR 0xfe        /* double error */
                    191: /* no error */
                    192: #define XY_ERR_AOK  0x00         /* success */
                    193:
                    194: #define XY_ERR_IPEN 0x01        /* interrupt pending */
                    195: #define XY_ERR_BCFL 0x03        /* busy conflict */
                    196: #define XY_ERR_TIMO 0x04        /* operation timeout */
                    197: #define XY_ERR_NHDR 0x05        /* header not found */
                    198: #define XY_ERR_HARD 0x06        /* hard ECC error */
                    199: #define XY_ERR_ICYL 0x07        /* illegal cylinder address */
                    200: #define XY_ERR_ISEC 0x0a        /* illegal sector address */
                    201: #define XY_ERR_SMAL 0x0d        /* last sector too small */
                    202: #define XY_ERR_SACK 0x0e        /* slave ACK error (non-existent memory) */
                    203: #define XY_ERR_CHER 0x12        /* cylinder and head/header error */
                    204: #define XY_ERR_SRTR 0x13        /* auto-seek retry successful */
                    205: #define XY_ERR_WPRO 0x14        /* write-protect error */
                    206: #define XY_ERR_UIMP 0x15        /* unimplemented command */
                    207: #define XY_ERR_DNRY 0x16        /* drive not ready */
                    208: #define XY_ERR_SZER 0x17        /* sector count zero */
                    209: #define XY_ERR_DFLT 0x18        /* drive faulted */
                    210: #define XY_ERR_ISSZ 0x19        /* illegal sector size */
                    211: #define XY_ERR_SLTA 0x1a        /* self test a */
                    212: #define XY_ERR_SLTB 0x1b        /* self test b */
                    213: #define XY_ERR_SLTC 0x1c        /* self test c */
                    214: #define XY_ERR_SOFT 0x1e        /* soft ECC error */
                    215: #define XY_ERR_SFOK 0x1f        /* soft ECC error recovered */
                    216: #define XY_ERR_IHED 0x20        /* illegal head */
                    217: #define XY_ERR_DSEQ 0x21        /* disk sequencer error */
                    218: #define XY_ERR_SEEK 0x25        /* seek error */
                    219:
                    220:
                    221: /* error actions */
                    222: #define XY_ERA_PROG 0x10        /* program error: quit */
                    223: #define XY_ERA_SOFT 0x30         /* soft error: we recovered */
                    224: #define XY_ERA_HARD 0x40         /* hard error: retry */
                    225: #define XY_ERA_RSET 0x60         /* hard error: reset, then retry */
                    226: #define XY_ERA_WPRO 0x90         /* write protected */
                    227:
                    228:

CVSweb