Annotation of Net2/arch/amiga/dev/scsireg.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1990 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * Van Jacobson of Lawrence Berkeley Laboratory.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *     This product includes software developed by the University of
                     19:  *     California, Berkeley and its contributors.
                     20:  * 4. Neither the name of the University nor the names of its contributors
                     21:  *    may be used to endorse or promote products derived from this software
                     22:  *    without specific prior written permission.
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     25:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     26:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     27:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     28:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     29:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     30:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     31:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     32:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     33:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     34:  * SUCH DAMAGE.
                     35:  *
                     36:  *     @(#)scsireg.h   7.3 (Berkeley) 2/5/91
                     37:  */
                     38: 
                     39: /*
                     40:  * AMD AM33C93A SCSI interface hardware description.
                     41:  *
                     42:  * Using parts of the Mach scsi driver for the 33C93
                     43:  */
                     44: 
                     45: #define        SBIC_myid       0
                     46: #define        SBIC_cdbsize    0
                     47: #define        SBIC_control    1
                     48: #define        SBIC_timeo      2
                     49: #define        SBIC_cdb1       3
                     50: #define        SBIC_tsecs      3
                     51: #define        SBIC_cdb2       4
                     52: #define        SBIC_theads     4
                     53: #define        SBIC_cdb3       5
                     54: #define        SBIC_tcyl_hi    5
                     55: #define        SBIC_cdb4       6
                     56: #define        SBIC_tcyl_lo    6
                     57: #define        SBIC_cdb5       7
                     58: #define        SBIC_addr_hi    7
                     59: #define        SBIC_cdb6       8
                     60: #define        SBIC_addr_2     8
                     61: #define        SBIC_cdb7       9
                     62: #define        SBIC_addr_3     9
                     63: #define        SBIC_cdb8       10
                     64: #define        SBIC_addr_lo    10
                     65: #define        SBIC_cdb9       11
                     66: #define        SBIC_secno      11
                     67: #define        SBIC_cdb10      12
                     68: #define        SBIC_headno     12
                     69: #define        SBIC_cdb11      13
                     70: #define        SBIC_cylno_hi   13
                     71: #define        SBIC_cdb12      14
                     72: #define        SBIC_cylno_lo   14
                     73: #define        SBIC_tlun       15
                     74: #define        SBIC_cmd_phase  16
                     75: #define        SBIC_syn        17
                     76: #define        SBIC_count_hi   18
                     77: #define        SBIC_count_med  19
                     78: #define        SBIC_count_lo   20
                     79: #define        SBIC_selid      21
                     80: #define        SBIC_rselid     22
                     81: #define        SBIC_csr        23
                     82: #define        SBIC_cmd        24
                     83: #define        SBIC_data       25
                     84: /* sbic_asr is addressed directly */
                     85: 
                     86: /*
                     87:  *     Register defines
                     88:  */
                     89: 
                     90: /*
                     91:  * Auxiliary Status Register
                     92:  */
                     93: 
                     94: #define SBIC_ASR_INT           0x80    /* Interrupt pending */
                     95: #define SBIC_ASR_LCI           0x40    /* Last command ignored */
                     96: #define SBIC_ASR_BSY           0x20    /* Busy, only cmd/data/asr readable */
                     97: #define SBIC_ASR_CIP           0x10    /* Busy, cmd unavail also */
                     98: #define SBIC_ASR_xxx           0x0c
                     99: #define SBIC_ASR_PE            0x02    /* Parity error (even) */
                    100: #define SBIC_ASR_DBR           0x01    /* Data Buffer Ready */
                    101: 
                    102: /*
                    103:  * My ID register, and/or CDB Size
                    104:  */
                    105: 
                    106: #define SBIC_ID_FS_8_10                0x00    /* Input clock is  8-10 Mhz */
                    107:                                        /* 11 Mhz is invalid */
                    108: #define SBIC_ID_FS_12_15       0x40    /* Input clock is 12-15 Mhz */
                    109: #define SBIC_ID_FS_16_20       0x80    /* Input clock is 16-20 Mhz */
                    110: #define SBIC_ID_EHP            0x10    /* Enable host parity */
                    111: #define SBIC_ID_EAF            0x08    /* Enable Advanced Features */
                    112: #define SBIC_ID_MASK           0x07
                    113: #define SBIC_ID_CBDSIZE_MASK   0x0f    /* if unk SCSI cmd group */
                    114: 
                    115: /*
                    116:  * Control register
                    117:  */
                    118: 
                    119: #define SBIC_CTL_DMA           0x80    /* Single byte dma */
                    120: #define SBIC_CTL_DBA_DMA       0x40    /* direct buffer acces (bus master)*/
                    121: #define SBIC_CTL_BURST_DMA     0x20    /* continuous mode (8237) */
                    122: #define SBIC_CTL_NO_DMA                0x00    /* Programmed I/O */
                    123: #define SBIC_CTL_HHP           0x10    /* Halt on host parity error */
                    124: #define SBIC_CTL_EDI           0x08    /* Ending disconnect interrupt */
                    125: #define SBIC_CTL_IDI           0x04    /* Intermediate disconnect interrupt*/
                    126: #define SBIC_CTL_HA            0x02    /* Halt on ATN */
                    127: #define SBIC_CTL_HSP           0x01    /* Halt on SCSI parity error */
                    128: 
                    129: /*
                    130:  * Timeout period register
                    131:  * [val in msecs, input clk in 0.1 Mhz]
                    132:  */
                    133: 
                    134: #define        SBIC_TIMEOUT(val,clk)   ((((val)*(clk))/800)+1)
                    135: 
                    136: /*
                    137:  * CDBn registers, note that
                    138:  *     cdb11 is used for status byte in target mode (send-status-and-cc)
                    139:  *     cdb12 sez if linked command complete, and w/flag if so
                    140:  */
                    141: 
                    142: /*
                    143:  * Target LUN register
                    144:  * [holds target status when select-and-xfer]
                    145:  */
                    146: 
                    147: #define        SBIC_TLUN_VALID         0x80    /* did we receive an Identify msg */
                    148: #define        SBIC_TLUN_DOK           0x40    /* Disconnect OK */
                    149: #define        SBIC_TLUN_xxx           0x38
                    150: #define        SBIC_TLUN_MASK          0x07
                    151: 
                    152: /*
                    153:  * Command Phase register
                    154:  */
                    155: 
                    156: #define        SBIC_CPH_MASK           0x7f    /* values/restarts are cmd specific */
                    157: #define        SBIC_CPH(p)             ((p)&SBIC_CPH_MASK)
                    158: 
                    159: /*
                    160:  * FIFO register
                    161:  */
                    162: 
                    163: #define SBIC_FIFO_DEEP         12
                    164: 
                    165: /*
                    166:  * maximum possible size in TC registers. Since this is 24 bit, it's easy
                    167:  */
                    168: #define SBIC_TC_MAX            ((1<<24) - 1)
                    169: 
                    170: /*
                    171:  * Synchronous xfer register
                    172:  */
                    173: 
                    174: #define        SBIC_SYN_OFF_MASK       0x0f
                    175: #define        SBIC_SYN_MAX_OFFSET     SBIC_FIFO_DEEP
                    176: #define        SBIC_SYN_PER_MASK       0x70
                    177: #define        SBIC_SYN_MIN_PERIOD     2               /* upto 8, encoded as 0 */
                    178: 
                    179: #define        SBIC_SYN(o,p)           (((o)&SBIC_SYN_OFF_MASK)|(((p)<<4)&SBIC_SYN_PER_MASK))
                    180: 
                    181: /*
                    182:  * Transfer count register
                    183:  * optimal access macros depend on addressing
                    184:  */
                    185: 
                    186: /*
                    187:  * Destination ID (selid) register
                    188:  */
                    189: 
                    190: #define        SBIC_SID_SCC            0x80    /* Select command chaining (tgt) */
                    191: #define        SBIC_SID_DPD            0x40    /* Data phase direction (inittor) */
                    192: #      define  SBIC_SID_FROM_SCSI              0x40
                    193: #      define  SBIC_SID_TO_SCSI                0x00
                    194: #define        SBIC_SID_xxx            0x38
                    195: #define        SBIC_SID_IDMASK         0x07
                    196: 
                    197: /*
                    198:  * Source ID (rselid) register
                    199:  */
                    200: 
                    201: #define        SBIC_RID_ER             0x80    /* Enable reselection */
                    202: #define        SBIC_RID_ES             0x40    /* Enable selection */
                    203: #define        SBIC_RID_DSP            0x20    /* Disable select parity */
                    204: #define        SBIC_RID_SIV            0x08    /* Source ID valid */
                    205: #define        SBIC_RID_MASK           0x07
                    206: 
                    207: /*
                    208:  * Status register
                    209:  */
                    210: 
                    211: #define        SBIC_CSR_CAUSE          0xf0
                    212: #      define  SBIC_CSR_RESET          0x00    /* chip was reset */
                    213: #      define  SBIC_CSR_CMD_DONE       0x10    /* cmd completed */
                    214: #      define  SBIC_CSR_CMD_STOPPED    0x20    /* interrupted or abrted*/
                    215: #      define  SBIC_CSR_CMD_ERR        0x40    /* end with error */
                    216: #      define  SBIC_CSR_BUS_SERVICE    0x80    /* REQ pending on the bus */
                    217: 
                    218: #define        SBIC_CSR_QUALIFIER      0x0f
                    219: 
                    220:        /* Reset State Interrupts */
                    221: #      define  SBIC_CSR_RESET          0x00    /* reset w/advanced features*/
                    222: #      define  SBIC_CSR_RESET_AM       0x01    /* reset w/advanced features*/
                    223: 
                    224:        /* Successful Completion Interrupts */
                    225: #      define  SBIC_CSR_TARGET         0x10    /* reselect complete */
                    226: #      define  SBIC_CSR_INITIATOR      0x11    /* select complete */
                    227: #      define  SBIC_CSR_WO_ATN         0x13    /* tgt mode completion */
                    228: #      define  SBIC_CSR_W_ATN          0x14    /* ditto */
                    229: #      define  SBIC_CSR_XLATED         0x15    /* translate address cmd */
                    230: #      define  SBIC_CSR_S_XFERRED      0x16    /* initiator mode completion*/
                    231: #      define  SBIC_CSR_XFERRED                0x18    /* phase in low bits */
                    232: 
                    233:        /* Paused or Aborted Interrupts */
                    234: #      define  SBIC_CSR_MSGIN_W_ACK    0x20    /* (I) msgin, ACK asserted*/
                    235: #      define  SBIC_CSR_SDP            0x21    /* (I) SDP msg received */
                    236: #      define  SBIC_CSR_SEL_ABRT       0x22    /* sel/resel aborted */
                    237: #      define  SBIC_CSR_XFR_PAUSED     0x23    /* (T) no ATN */
                    238: #      define  SBIC_CSR_XFR_PAUSED_ATN 0x24    /* (T) ATN is asserted */
                    239: #      define  SBIC_CSR_RSLT_AM        0x27    /* (I) lost selection (AM) */
                    240: #      define  SBIC_CSR_MIS            0x28    /* (I) xfer aborted, ph mis */
                    241: 
                    242:        /* Terminated Interrupts */
                    243: #      define  SBIC_CSR_CMD_INVALID    0x40
                    244: #      define  SBIC_CSR_DISC           0x41    /* (I) tgt disconnected */
                    245: #      define  SBIC_CSR_SEL_TIMEO      0x42
                    246: #      define  SBIC_CSR_PE             0x43    /* parity error */
                    247: #      define  SBIC_CSR_PE_ATN         0x44    /* ditto, ATN is asserted */
                    248: #      define  SBIC_CSR_XLATE_TOOBIG   0x45
                    249: #      define  SBIC_CSR_RSLT_NOAM      0x46    /* (I) lost sel, no AM mode */
                    250: #      define  SBIC_CSR_BAD_STATUS     0x47    /* status byte was nok */
                    251: #      define  SBIC_CSR_MIS_1          0x48    /* ph mis, see low bits */
                    252: 
                    253:        /* Service Required Interrupts */
                    254: #      define  SBIC_CSR_RSLT_NI        0x80    /* reselected, no ify msg */
                    255: #      define  SBIC_CSR_RSLT_IFY       0x81    /* ditto, AM mode, got ify */
                    256: #      define  SBIC_CSR_SLT            0x82    /* selected, no ATN */
                    257: #      define  SBIC_CSR_SLT_ATN        0x83    /* selected with ATN */
                    258: #      define  SBIC_CSR_ATN            0x84    /* (T) ATN asserted */
                    259: #      define  SBIC_CSR_DISC_1         0x85    /* (I) bus is free */
                    260: #      define  SBIC_CSR_UNK_GROUP      0x87    /* strange CDB1 */
                    261: #      define  SBIC_CSR_MIS_2          0x88    /* (I) ph mis, see low bits */
                    262: 
                    263: #define        SBIC_PHASE(csr)         SCSI_PHASE(csr)
                    264: 
                    265: /*
                    266:  * Command register (command codes)
                    267:  */
                    268: 
                    269: #define SBIC_CMD_SBT           0x80    /* Single byte xfer qualifier */
                    270: #define        SBIC_CMD_MASK           0x7f
                    271: 
                    272:                                        /* Miscellaneous */
                    273: #define SBIC_CMD_RESET         0x00            /* (DTI) lev I */
                    274: #define SBIC_CMD_ABORT         0x01            /* (DTI) lev I */
                    275: #define SBIC_CMD_DISC          0x04            /* ( TI) lev I */
                    276: #define SBIC_CMD_SSCC          0x0d            /* ( TI) lev I */
                    277: #define SBIC_CMD_SET_IDI       0x0f            /* (DTI) lev I */
                    278: #define SBIC_CMD_XLATE         0x18            /* (DT ) lev II */
                    279: 
                    280:                                        /* Initiator state */
                    281: #define SBIC_CMD_SET_ATN       0x02            /* (  I) lev I */
                    282: #define SBIC_CMD_CLR_ACK       0x03            /* (  I) lev I */
                    283: #define SBIC_CMD_XFER_PAD      0x19            /* (  I) lev II */
                    284: #define SBIC_CMD_XFER_INFO     0x20            /* (  I) lev II */
                    285: 
                    286:                                        /* Target state */
                    287: #define SBIC_CMD_SND_DISC      0x0e            /* ( T ) lev II */
                    288: #define SBIC_CMD_RCV_CMD       0x10            /* ( T ) lev II */
                    289: #define SBIC_CMD_RCV_DATA      0x11            /* ( T ) lev II */
                    290: #define SBIC_CMD_RCV_MSG_OUT   0x12            /* ( T ) lev II */
                    291: #define SBIC_CMD_RCV           0x13            /* ( T ) lev II */
                    292: #define SBIC_CMD_SND_STATUS    0x14            /* ( T ) lev II */
                    293: #define SBIC_CMD_SND_DATA      0x15            /* ( T ) lev II */
                    294: #define SBIC_CMD_SND_MSG_IN    0x16            /* ( T ) lev II */
                    295: #define SBIC_CMD_SND           0x17            /* ( T ) lev II */
                    296: 
                    297:                                        /* Disconnected state */
                    298: #define SBIC_CMD_RESELECT      0x05            /* (D  ) lev II */
                    299: #define SBIC_CMD_SEL_ATN       0x06            /* (D  ) lev II */
                    300: #define SBIC_CMD_SEL           0x07            /* (D  ) lev II */
                    301: #define SBIC_CMD_SEL_ATN_XFER  0x08            /* (D I) lev II */
                    302: #define SBIC_CMD_SEL_XFER      0x09            /* (D I) lev II */
                    303: #define SBIC_CMD_RESELECT_RECV 0x0a            /* (DT ) lev II */
                    304: #define SBIC_CMD_RESELECT_SEND 0x0b            /* (DT ) lev II */
                    305: #define SBIC_CMD_WAIT_SEL_RECV 0x0c            /* (DT ) lev II */
                    306: 
                    307: /* approximate, but we won't do SBT on selects */
                    308: #define        sbic_isa_select(cmd)    (((cmd)>0x5)&&((cmd)<0xa))
                    309: 
                    310: #define PAD(n)          char n;
                    311: #ifdef A3000
                    312: #define SBIC_CLOCK_FREQUENCY    143    /* according to A3000T service manual */
                    313: #endif
                    314: #ifdef A2091
                    315: #define SBIC_CLOCK_FREQUENCY    77
                    316: #endif
                    317: #define SBIC_MACHINE_DMA_MODE   SBIC_CTL_DMA
                    318: 
                    319: typedef struct {
                    320:         volatile unsigned char  sbic_asr;       /* r : Aux Status Register */
                    321: #define               sbic_address sbic_asr     /* w : desired register no */
                    322:         PAD(pad1);
                    323:         volatile unsigned char  sbic_value;     /* rw: register value */
                    324: } sbic_padded_ind_regmap_t;
                    325: 
                    326: 
                    327: typedef sbic_padded_ind_regmap_t        sbic_padded_regmap_t;
                    328: 
                    329: #define        sbic_read_reg(regs,regno,val)   do { \
                    330:                (regs)->sbic_address = (regno); \
                    331:                (val) = (regs)->sbic_value;     \
                    332:        } while (0)
                    333: 
                    334: #define        sbic_write_reg(regs,regno,val)  do { \
                    335:                (regs)->sbic_address = (regno); \
                    336:                (regs)->sbic_value = (val);     \
                    337:        } while (0)
                    338: 
                    339: #define SET_SBIC_myid(regs,val)         sbic_write_reg(regs,SBIC_myid,val)
                    340: #define GET_SBIC_myid(regs,val)         sbic_read_reg(regs,SBIC_myid,val)
                    341: #define SET_SBIC_cdbsize(regs,val)      sbic_write_reg(regs,SBIC_cdbsize,val)
                    342: #define GET_SBIC_cdbsize(regs,val)      sbic_read_reg(regs,SBIC_cdbsize,val)
                    343: #define SET_SBIC_control(regs,val)      sbic_write_reg(regs,SBIC_control,val)
                    344: #define GET_SBIC_control(regs,val)      sbic_read_reg(regs,SBIC_control,val)
                    345: #define SET_SBIC_timeo(regs,val)        sbic_write_reg(regs,SBIC_timeo,val)
                    346: #define GET_SBIC_timeo(regs,val)        sbic_read_reg(regs,SBIC_timeo,val)
                    347: #define SET_SBIC_cdb1(regs,val)         sbic_write_reg(regs,SBIC_cdb1,val)
                    348: #define GET_SBIC_cdb1(regs,val)         sbic_read_reg(regs,SBIC_cdb1,val)
                    349: #define SET_SBIC_cdb2(regs,val)         sbic_write_reg(regs,SBIC_cdb2,val)
                    350: #define GET_SBIC_cdb2(regs,val)         sbic_read_reg(regs,SBIC_cdb2,val)
                    351: #define SET_SBIC_cdb3(regs,val)         sbic_write_reg(regs,SBIC_cdb3,val)
                    352: #define GET_SBIC_cdb3(regs,val)         sbic_read_reg(regs,SBIC_cdb3,val)
                    353: #define SET_SBIC_cdb4(regs,val)         sbic_write_reg(regs,SBIC_cdb4,val)
                    354: #define GET_SBIC_cdb4(regs,val)         sbic_read_reg(regs,SBIC_cdb4,val)
                    355: #define SET_SBIC_cdb5(regs,val)         sbic_write_reg(regs,SBIC_cdb5,val)
                    356: #define GET_SBIC_cdb5(regs,val)         sbic_read_reg(regs,SBIC_cdb5,val)
                    357: #define SET_SBIC_cdb6(regs,val)         sbic_write_reg(regs,SBIC_cdb6,val)
                    358: #define GET_SBIC_cdb6(regs,val)         sbic_read_reg(regs,SBIC_cdb6,val)
                    359: #define SET_SBIC_cdb7(regs,val)         sbic_write_reg(regs,SBIC_cdb7,val)
                    360: #define GET_SBIC_cdb7(regs,val)         sbic_read_reg(regs,SBIC_cdb7,val)
                    361: #define SET_SBIC_cdb8(regs,val)         sbic_write_reg(regs,SBIC_cdb8,val)
                    362: #define GET_SBIC_cdb8(regs,val)         sbic_read_reg(regs,SBIC_cdb8,val)
                    363: #define SET_SBIC_cdb9(regs,val)         sbic_write_reg(regs,SBIC_cdb9,val)
                    364: #define GET_SBIC_cdb9(regs,val)         sbic_read_reg(regs,SBIC_cdb9,val)
                    365: #define SET_SBIC_cdb10(regs,val)        sbic_write_reg(regs,SBIC_cdb10,val)
                    366: #define GET_SBIC_cdb10(regs,val)        sbic_read_reg(regs,SBIC_cdb10,val)
                    367: #define SET_SBIC_cdb11(regs,val)        sbic_write_reg(regs,SBIC_cdb11,val)
                    368: #define GET_SBIC_cdb11(regs,val)        sbic_read_reg(regs,SBIC_cdb11,val)
                    369: #define SET_SBIC_cdb12(regs,val)        sbic_write_reg(regs,SBIC_cdb12,val)
                    370: #define GET_SBIC_cdb12(regs,val)        sbic_read_reg(regs,SBIC_cdb12,val)
                    371: #define SET_SBIC_tlun(regs,val)         sbic_write_reg(regs,SBIC_tlun,val)
                    372: #define GET_SBIC_tlun(regs,val)         sbic_read_reg(regs,SBIC_tlun,val)
                    373: #define SET_SBIC_cmd_phase(regs,val)    sbic_write_reg(regs,SBIC_cmd_phase,val)
                    374: #define GET_SBIC_cmd_phase(regs,val)    sbic_read_reg(regs,SBIC_cmd_phase,val)
                    375: #define SET_SBIC_syn(regs,val)          sbic_write_reg(regs,SBIC_syn,val)
                    376: #define GET_SBIC_syn(regs,val)          sbic_read_reg(regs,SBIC_syn,val)
                    377: #define SET_SBIC_count_hi(regs,val)     sbic_write_reg(regs,SBIC_count_hi,val)
                    378: #define GET_SBIC_count_hi(regs,val)     sbic_read_reg(regs,SBIC_count_hi,val)
                    379: #define SET_SBIC_count_med(regs,val)    sbic_write_reg(regs,SBIC_count_med,val)
                    380: #define GET_SBIC_count_med(regs,val)    sbic_read_reg(regs,SBIC_count_med,val)
                    381: #define SET_SBIC_count_lo(regs,val)     sbic_write_reg(regs,SBIC_count_lo,val)
                    382: #define GET_SBIC_count_lo(regs,val)     sbic_read_reg(regs,SBIC_count_lo,val)
                    383: #define SET_SBIC_selid(regs,val)        sbic_write_reg(regs,SBIC_selid,val)
                    384: #define GET_SBIC_selid(regs,val)        sbic_read_reg(regs,SBIC_selid,val)
                    385: #define SET_SBIC_rselid(regs,val)       sbic_write_reg(regs,SBIC_rselid,val)
                    386: #define GET_SBIC_rselid(regs,val)       sbic_read_reg(regs,SBIC_rselid,val)
                    387: #define SET_SBIC_csr(regs,val)          sbic_write_reg(regs,SBIC_csr,val)
                    388: #define GET_SBIC_csr(regs,val)          sbic_read_reg(regs,SBIC_csr,val)
                    389: #define SET_SBIC_cmd(regs,val)          sbic_write_reg(regs,SBIC_cmd,val)
                    390: #define GET_SBIC_cmd(regs,val)          sbic_read_reg(regs,SBIC_cmd,val)
                    391: #define SET_SBIC_data(regs,val)         sbic_write_reg(regs,SBIC_data,val)
                    392: #define GET_SBIC_data(regs,val)         sbic_read_reg(regs,SBIC_data,val)
                    393: 
                    394: #define SBIC_TC_PUT(regs,val)   {                               \
                    395:                 sbic_write_reg(regs,SBIC_count_hi,((val)>>16)); \
                    396:                 (regs)->sbic_value = (val)>>8;                 \
                    397:                 (regs)->sbic_value = (val);                     \
                    398:         }
                    399: #define SBIC_TC_GET(regs,val)   {                               \
                    400:                 sbic_read_reg(regs,SBIC_count_hi,(val));        \
                    401:                 (val) = ((val)<<8) | (regs)->sbic_value;        \
                    402:                 (val) = ((val)<<8) | (regs)->sbic_value;        \
                    403:         }
                    404: 
                    405: #define SBIC_LOAD_COMMAND(regs,cmd,cmdsize)     {              \
                    406:                 register int n=cmdsize-1;                       \
                    407:                 register char *ptr = (char*)(cmd);              \
                    408:                 sbic_write_reg(regs,SBIC_cdb1,*ptr++);          \
                    409:                 while (n-- > 0) (regs)->sbic_value = *ptr++;    \
                    410:         }
                    411: 
                    412: #define GET_SBIC_asr(regs,val)          (val) = (regs)->sbic_asr
                    413: 
                    414: #define WAIT_CIP(regs) do ; while ((regs)->sbic_asr & SBIC_ASR_CIP)
                    415: 
                    416: /* transmit a byte in programmed I/O mode */
                    417: #define SEND_BYTE(regs, ch) \
                    418:   WAIT_CIP (regs); \
                    419:   SET_SBIC_cmd (regs, SBIC_CMD_SBT | SBIC_CMD_XFER_INFO); \
                    420:   SBIC_WAIT (regs, SBIC_ASR_DBR, 0); \
                    421:   SET_SBIC_data (regs, ch);
                    422: 
                    423: /* receive a byte in programmed I/O mode */
                    424: #define RECV_BYTE(regs, ch) \
                    425:   WAIT_CIP (regs); \
                    426:   SET_SBIC_cmd (regs, SBIC_CMD_SBT | SBIC_CMD_XFER_INFO); \
                    427:   SBIC_WAIT (regs, SBIC_ASR_DBR, 0); \
                    428:   GET_SBIC_data (regs, ch);
                    429: 
                    430: 
                    431: 
                    432: 
                    433: 
                    434: /* psns/pctl phase lines as bits */
                    435: #define        PHASE_MSG       0x04
                    436: #define        PHASE_CD        0x02            /* =1 if 'command' */
                    437: #define        PHASE_IO        0x01            /* =1 if data inbound */
                    438: /* Phase lines as values */
                    439: #define        PHASE           0x07            /* mask for psns/pctl phase */
                    440: #define        DATA_OUT_PHASE  0x00
                    441: #define        DATA_IN_PHASE   0x01
                    442: #define        CMD_PHASE       0x02
                    443: #define        STATUS_PHASE    0x03
                    444: #define        BUS_FREE_PHASE  0x04
                    445: #define        ARB_SEL_PHASE   0x05    /* Fuji chip combines arbitration with sel. */
                    446: #define        MESG_OUT_PHASE  0x06
                    447: #define        MESG_IN_PHASE   0x07
                    448: 
                    449: /* SCSI Messages */
                    450: 
                    451: #define        MSG_CMD_COMPLETE        0x00
                    452: #define MSG_EXT_MESSAGE                0x01
                    453: #define        MSG_SAVE_DATA_PTR       0x02
                    454: #define        MSG_RESTORE_PTR         0x03
                    455: #define        MSG_DISCONNECT          0x04
                    456: #define        MSG_INIT_DETECT_ERROR   0x05
                    457: #define        MSG_ABORT               0x06
                    458: #define        MSG_REJECT              0x07
                    459: #define        MSG_NOOP                0x08
                    460: #define        MSG_PARITY_ERROR        0x09
                    461: #define        MSG_BUS_DEVICE_RESET    0x0C
                    462: #define        MSG_IDENTIFY            0x80
                    463: #define        MSG_IDENTIFY_DR         0xc0    /* (disconnect/reconnect allowed) */
                    464: #define        MSG_SYNC_REQ            0x01
                    465: 
                    466: /* SCSI Commands */
                    467: 
                    468: #define CMD_TEST_UNIT_READY    0x00
                    469: #define CMD_REQUEST_SENSE      0x03
                    470: #define        CMD_INQUIRY             0x12
                    471: #define CMD_SEND_DIAGNOSTIC    0x1D
                    472: 
                    473: #define CMD_REWIND             0x01
                    474: #define CMD_FORMAT_UNIT                0x04
                    475: #define CMD_READ_BLOCK_LIMITS  0x05
                    476: #define CMD_REASSIGN_BLOCKS    0x07
                    477: #define CMD_READ               0x08
                    478: #define CMD_WRITE              0x0A
                    479: #define CMD_WRITE_FILEMARK     0x10
                    480: #define CMD_SPACE              0x11
                    481: #define CMD_MODE_SELECT                0x15
                    482: #define CMD_RELEASE_UNIT       0x17
                    483: #define CMD_ERASE              0x19
                    484: #define CMD_MODE_SENSE         0x1A
                    485: #define CMD_LOADUNLOAD         0x1B
                    486: #define CMD_RECEIVE_DIAG       0x1C
                    487: #define CMD_SEND_DIAG          0x1D
                    488: #define CMD_P_A_MEDIA_REMOVAL  0x1E
                    489: #define CMD_READ_CAPACITY      0x25
                    490: #define CMD_READ_EXT           0x28
                    491: #define CMD_WRITE_EXT          0x2A
                    492: #define CMD_READ_DEFECT_DATA   0x37
                    493: #define                SD_MANUFAC_DEFECTS      0x14000000
                    494: #define                SD_GROWN_DEFECTS        0x0c000000
                    495: #define CMD_READ_BUFFER                0x3B
                    496: #define CMD_WRITE_BUFFER       0x3C
                    497: #define CMD_READ_FULL          0xF0
                    498: #define CMD_MEDIA_TEST         0xF1
                    499: #define CMD_ACCESS_LOG         0xF2
                    500: #define CMD_WRITE_FULL         0xFC
                    501: #define CMD_MANAGE_PRIMARY     0xFD
                    502: #define CMD_EXECUTE_DATA       0xFE
                    503: 
                    504: /* SCSI status bits */
                    505: 
                    506: #define        STS_CHECKCOND   0x02    /* Check Condition (ie., read sense) */
                    507: #define        STS_CONDMET     0x04    /* Condition Met (ie., search worked) */
                    508: #define        STS_BUSY        0x08
                    509: #define        STS_INTERMED    0x10    /* Intermediate status sent */
                    510: #define        STS_EXT         0x80    /* Extended status valid */
                    511: 
                    512: /* command descriptor blocks */
                    513: 
                    514: struct scsi_cdb6 {
                    515:        u_char  cmd;            /* command code */
                    516:        u_char  lun:  3,        /* logical unit on ctlr */
                    517:                lbah: 5;        /* msb of read/write logical block addr */
                    518:        u_char  lbam;           /* middle byte of l.b.a. */
                    519:        u_char  lbal;           /* lsb of l.b.a. */
                    520:        u_char  len;            /* transfer length */
                    521:        u_char  xtra;
                    522: };
                    523: 
                    524: struct scsi_cdb10 {
                    525:        u_char  cmd;            /* command code */
                    526:        u_char  lun: 3,         /* logical unit on ctlr */
                    527:                   : 4,
                    528:                rel: 1;         /* l.b.a. is relative addr if =1 */
                    529:        u_char  lbah;           /* msb of read/write logical block addr */
                    530:        u_char  lbahm;          /* high middle byte of l.b.a. */
                    531:        u_char  lbalm;          /* low middle byte of l.b.a. */
                    532:        u_char  lbal;           /* lsb of l.b.a. */
                    533:        u_char  reserved;
                    534:        u_char  lenh;           /* msb transfer length */
                    535:        u_char  lenl;           /* lsb transfer length */
                    536:        u_char  xtra;
                    537: };
                    538: 
                    539: /* basic sense data */
                    540: 
                    541: struct scsi_sense {
                    542:        u_char  valid: 1,       /* l.b.a. is valid */
                    543:                class: 3,
                    544:                code:  4;
                    545:        u_char  vu:    4,       /* vendor unique */
                    546:                lbah:  4;
                    547:        u_char  lbam;
                    548:        u_char  lbal;
                    549: };
                    550: 
                    551: struct scsi_xsense {
                    552:        u_char  valid: 1,       /* l.b.a. is valid */
                    553:                class: 3,
                    554:                code:  4;
                    555:        u_char  segment;
                    556:        u_char  filemark: 1,
                    557:                eom:      1,
                    558:                ili:      1,    /* illegal length indicator */
                    559:                rsvd:     1,
                    560:                key:      4;
                    561:        u_char  info1;
                    562:        u_char  info2;
                    563:        u_char  info3;
                    564:        u_char  info4;
                    565:        u_char  len;            /* additional sense length */
                    566: };
                    567: 
                    568: /* inquiry data */
                    569: struct scsi_inquiry {
                    570:        u_char  type;
                    571:        u_char  qual;
                    572:        u_char  version;
                    573:        u_char  rsvd;
                    574:        u_char  len;
                    575:        char    class[3];
                    576:        char    vendor_id[8];
                    577:        char    product_id[16];
                    578:        char    rev[4];
                    579: };
                    580: 
                    581: struct scsi_format_parms {             /* physical BFI format */
                    582:        u_short reserved;
                    583:        u_short list_len;
                    584:        struct defect {
                    585:                unsigned cyl  : 24;
                    586:                unsigned head : 8;
                    587:                long    bytes_from_index;
                    588:        } defect[127];
                    589: } format_parms;
                    590: 
                    591: struct scsi_reassign_parms {
                    592:        u_short reserved;
                    593:        u_short list_len;       /* length in bytes of defects only */
                    594:        struct new_defect {
                    595:                unsigned lba;   /* logical block address */
                    596:        } new_defect[2];
                    597: } reassign_parms;
                    598: 
                    599: struct scsi_modesel_hdr {
                    600:        u_char  rsvd1;
                    601:        u_char  media_type;
                    602:        u_char  rsvd2;
                    603:        u_char  block_desc_len;
                    604:        u_int   density         : 8;
                    605:        u_int   number_blocks   :24;
                    606:        u_int   rsvd3           : 8;
                    607:        u_int   block_length    :24;
                    608: }; 
                    609: 
                    610: struct scsi_modesense_hdr {
                    611:        u_char  len;
                    612:        u_char  media_type;
                    613:        u_char  wp    : 1;
                    614:        u_char  rsvd1 : 7;
                    615:        u_char  block_desc_len;
                    616:        u_int   density         : 8;
                    617:        u_int   number_blocks   :24;
                    618:        u_int   rsvd2           : 8;
                    619:        u_int   block_length    :24;
                    620: }; 
                    621: 
                    622: /*
                    623:  * Mode Select / Mode sense "pages"
                    624:  */
                    625: 
                    626: /*
                    627:  * Page One - Error Recovery Parameters 
                    628:  */
                    629: struct scsi_err_recovery {
                    630:        u_char  page_savable    : 1;    /* save parameters */
                    631:        u_char  reserved        : 1;
                    632:        u_char  page_code       : 6;    /* = 0x01 */
                    633:        u_char  page_length;            /* = 6 */
                    634:        u_char  awre            : 1;    /* auto write realloc enabled */
                    635:        u_char  arre            : 1;    /* auto read realloc enabled */
                    636:        u_char  tb              : 1;    /* transfer block */
                    637:        u_char  rc              : 1;    /* read continuous */
                    638:        u_char  eec             : 1;    /* enable early correction */
                    639:        u_char  per             : 1;    /* post error */
                    640:        u_char  dte             : 1;    /* disable transfer on error */
                    641:        u_char  dcr             : 1;    /* disable correction */
                    642:        u_char  retry_count;
                    643:        u_char  correction_span;
                    644:        u_char  head_offset_count;
                    645:        u_char  strobe_offset_count;
                    646:        u_char  recovery_time_limit;
                    647: };
                    648: 
                    649: /*
                    650:  * Page Two - Disconnect / Reconnect Control Parameters
                    651:  */
                    652: struct scsi_disco_reco {
                    653:        u_char  page_savable    : 1;    /* save parameters */
                    654:        u_char  rsvd            : 1;
                    655:        u_char  page_code       : 6;    /* = 0x02 */
                    656:        u_char  page_length;            /* = 10 */
                    657:        u_char  buffer_full_ratio;      /* write, how full before reconnect? */
                    658:        u_char  buffer_empty_ratio;     /* read, how full before reconnect? */
                    659: 
                    660:        u_short bus_inactivity_limit;   /* how much bus time for busy */
                    661:        u_short disconnect_time_limit;  /* min to remain disconnected */
                    662:        u_short connect_time_limit;     /* min to remain connected */
                    663:        u_short reserved_1;
                    664: };
                    665: 
                    666: /*
                    667:  * Page Three - Direct Access Device Format Parameters
                    668:  */
                    669: struct scsi_format {
                    670:        u_char  page_savable    : 1;    /* save parameters */
                    671:        u_char  rsvd            : 1;
                    672:        u_char  page_code       : 6;    /* = 0x03 */
                    673:        u_char  page_length;            /* = 22 */
                    674:        u_short tracks_per_zone;        /*  Handling of Defects Fields */
                    675:        u_short alt_sect_zone;
                    676:        u_short alt_tracks_zone;
                    677:        u_short alt_tracks_vol;
                    678:        u_short sect_track;             /* Track Format Field */
                    679:        u_short data_sect;              /* Sector Format Fields */
                    680:        u_short interleave;
                    681:        u_short track_skew_factor;
                    682:        u_short cyl_skew_factor;
                    683:        u_char  ssec            : 1;    /* Drive Type Field */
                    684:        u_char  hsec            : 1;
                    685:        u_char  rmb             : 1;
                    686:        u_char  surf            : 1;
                    687:        u_char  ins             : 1;
                    688:        u_char  reserved_1      : 3;
                    689:        u_char  reserved_2;
                    690:        u_char  reserved_3;
                    691:        u_char  reserved_4;
                    692: };
                    693: 
                    694: /*
                    695:  * Page Four - Rigid Disk Drive Geometry Parameters 
                    696:  */
                    697: struct scsi_geometry {
                    698:        u_char  page_savable    : 1;    /* save parameters */
                    699:        u_char  rsvd            : 1;
                    700:        u_char  page_code       : 6;    /* = 0x04 */
                    701:        u_char  page_length;            /* = 18 */
                    702:        u_char  cyl_ub;                 /* number of cylinders */
                    703:        u_char  cyl_mb;
                    704:        u_char  cyl_lb;
                    705:        u_char  heads;                  /* number of heads */
                    706:        u_char  precomp_cyl_ub;         /* cylinder to start precomp */
                    707:        u_char  precomp_cyl_mb;
                    708:        u_char  precomp_cyl_lb;
                    709:        u_char  current_cyl_ub;         /* cyl to start reduced current */
                    710:        u_char  current_cyl_mb;
                    711:        u_char  current_cyl_lb;
                    712:        u_short step_rate;              /* drive step rate */
                    713:        u_char  landing_cyl_ub;         /* landing zone cylinder */
                    714:        u_char  landing_cyl_mb;
                    715:        u_char  landing_cyl_lb;
                    716:        u_char  reserved_1;
                    717:        u_char  reserved_2;
                    718:        u_char  reserved_3;
                    719: };
                    720: 
                    721: /*
                    722:  * Page 0x38 - Cache Control Parameters
                    723:  */
                    724: struct scsi_cache {
                    725:        u_char  page_savable    : 1;    /* save parameters */
                    726:        u_char  rsvd            : 1;
                    727:        u_char  page_code       : 6;    /* = 0x38 */
                    728:        u_char  page_length;            /* = 14 */
                    729:        u_char rsvd_1   : 1;
                    730:        u_char wie      : 1;            /* write index enable */
                    731:        u_char rsvd_2   : 1;
                    732:        u_char ce       : 1;            /* cache enable */
                    733:        u_char table_size : 4;
                    734:        u_char  prefetch_threshold;
                    735:        u_char  maximum_threshold;
                    736:        u_char  maximumprefetch_multiplier;
                    737:        u_char  minimum_threshold;
                    738:        u_char  minimum_prefetch_multiplier;
                    739:        u_char  reserved[8];
                    740: };
                    741: 
                    742: /*
                    743:  * Driver ioctl's for various scsi operations.
                    744:  */
                    745: #ifndef _IOCTL_
                    746: #include "ioctl.h"
                    747: #endif
                    748: 
                    749: /*
                    750:  * Control for SCSI "format" mode.
                    751:  *
                    752:  * "Format" mode allows a privileged process to issue direct SCSI
                    753:  * commands to a drive (it is intended primarily to allow on-line
                    754:  * formatting).  SDIOCSFORMAT with a non-zero arg will put the drive
                    755:  * into format mode; a zero arg will take it out.  When in format
                    756:  * mode, only the process that issued the SDIOCFORMAT can read or
                    757:  * write the drive.
                    758:  *
                    759:  * In format mode, process is expected to
                    760:  *     - do SDIOCSCSICOMMAND to supply cdb for next SCSI op
                    761:  *     - do read or write as appropriate for cdb
                    762:  *     - if i/o error, optionally do SDIOCSENSE to get completion
                    763:  *       status and sense data from last scsi operation.
                    764:  */
                    765: 
                    766: struct scsi_fmt_cdb {
                    767:        int len;                /* cdb length (in bytes) */
                    768:        u_char cdb[28];         /* cdb to use on next read/write */
                    769: };
                    770: 
                    771: struct scsi_fmt_sense {
                    772:        u_int status;           /* completion status of last op */
                    773:        u_char sense[28];       /* sense data (if any) from last op */
                    774: };
                    775: 
                    776: #define        SDIOCSFORMAT            _IOW('S', 0x1, int)
                    777: #define        SDIOCGFORMAT            _IOR('S', 0x2, int)
                    778: #define        SDIOCSCSICOMMAND        _IOW('S', 0x3, struct scsi_fmt_cdb)
                    779: #define        SDIOCSENSE              _IOR('S', 0x4, struct scsi_fmt_sense)
                    780: 
                    781: extern void scsi_delay (int delay);
                    782: extern int scsiinit (register struct amiga_ctlr *ac);
                    783: extern void scsireset (void);
                    784: extern int scsi_test_unit_rdy (int slave);
                    785: extern int scsi_request_sense (int slave, u_char *buf, unsigned int len);
                    786: extern int scsi_immed_command (int slave, struct scsi_fmt_cdb *cdb, u_char *buf, unsigned int len, int rd);
                    787: extern int scsi_tt_read (int slave, u_char *buf, u_int len, daddr_t blk, int bshift);
                    788: extern int scsi_tt_write (int slave, u_char *buf, u_int len, daddr_t blk, int bshift);
                    789: extern int scsireq (register struct devqueue *dq);
                    790: extern int scsiustart (int unit);
                    791: extern void scsistart (int unit);
                    792: extern int scsigo (int unit, int slave, struct buf *bp, struct scsi_fmt_cdb *cdb, int pad);
                    793: extern void scsidone (int unit);
                    794: extern int scsiintr (int unit);
                    795: extern void scsifree (register struct devqueue *dq);
                    796: extern int scsi_tt_oddio (int slave, u_char *buf, u_int len, int b_flags, int freedma);

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.