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

Annotation of sys/arch/mvme68k/dev/sbicvar.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: sbicvar.h,v 1.7 2004/07/02 17:57:29 miod Exp $ */
                      2:
                      3: /*
                      4:  * Copyright (c) 1990 The Regents of the University of California.
                      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to Berkeley by
                      8:  * Van Jacobson of Lawrence Berkeley Laboratory.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. Neither the name of the University nor the names of its contributors
                     19:  *    may be used to endorse or promote products derived from this software
                     20:  *    without specific prior written permission.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     23:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     24:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     25:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     26:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     27:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     28:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     29:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     30:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     31:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     32:  * SUCH DAMAGE.
                     33:  *
                     34:  *  @(#)scsivar.h   7.1 (Berkeley) 5/8/90
                     35:  */
                     36: #ifndef _SBICVAR_H_
                     37: #define _SBICVAR_H_
                     38: #include <sys/malloc.h>
                     39:
                     40:
                     41: /*
                     42:  * DMA chains are used for Scatter-Gather DMA.
                     43:  */
                     44: struct  dma_chain {
                     45:     int     dc_count;
                     46:     char    *dc_addr;
                     47: };
                     48:
                     49: /*
                     50:  * ACB. Holds additional information for each SCSI command Comments: We
                     51:  * need a separate scsi command block because we may need to overwrite it
                     52:  * with a request sense command.  Basicly, we refrain from fiddling with
                     53:  * the scsi_xfer struct (except do the expected updating of return values).
                     54:  * We'll generally update: xs->{flags,resid,error,sense,status} and
                     55:  * occasionally xs->retries.
                     56:  */
                     57: struct sbic_acb {
                     58:     TAILQ_ENTRY(sbic_acb)   chain;
                     59:     struct scsi_xfer        *xs;        /* SCSI xfer ctrl block from above */
                     60:     int                     flags;      /* Status */
                     61: #define ACB_FREE        0x00
                     62: #define ACB_ACTIVE      0x01
                     63: #define ACB_DONE        0x04
                     64: #define ACB_CHKSENSE    0x08
                     65: #define ACB_BBUF        0x10    /* DMA input needs to be copied from bounce */
                     66: #define ACB_DATAIN      0x20    /* DMA direction flag */
                     67:
                     68:     struct  scsi_generic    cmd;        /* SCSI command block */
                     69:     int                     clen;
                     70:     struct  dma_chain       sc_kv;      /* Virtual address of whole DMA */
                     71:     struct  dma_chain       sc_pa;      /* Physical address of DMA segment */
                     72:     u_long                  sc_tcnt;    /* number of bytes for this DMA */
                     73:     u_short                 sc_dmacmd;  /* Internal data for this DMA */
                     74:     char                    *pa_addr;   /* XXXX initial phys addr */
                     75: };
                     76:
                     77: /*
                     78:  * Some info about each (possible) target on the SCSI bus.  This should
                     79:  * probably have been a "per target+lunit" structure, but we'll leave it at
                     80:  * this for now.  Is there a way to reliably hook it up to sc->fordriver??
                     81:  */
                     82: struct sbic_tinfo {
                     83:     int                     cmds;       /* #commands processed */
                     84:     int                     dconns;     /* #disconnects */
                     85:     int                     senses;     /* #request sense commands sent */
                     86:     int                     lubusy;     /* What local units/subr. are busy? */
                     87: } tinfo_t;
                     88:
                     89: struct  sbic_softc {
                     90:     struct  device          sc_dev;
                     91:     struct  intrhand       sc_dmaih;
                     92:     struct  intrhand       sc_sbicih;
                     93:     struct  target_sync {
                     94:         u_char  state;
                     95:         u_char  period;
                     96:         u_char  offset;
                     97:     } sc_sync[8];
                     98:     u_char                  target;     /* Currently active target */
                     99:     u_char                  lun;
                    100:     struct  scsi_link       sc_link;    /* proto for sub devices */
                    101:     sbic_regmap_p           sc_sbicp;   /* the SBIC */
                    102:     int                     sc_ipl;
                    103:
                    104:     /* Lists of command blocks */
                    105:     TAILQ_HEAD(acb_list, sbic_acb)  free_list,
                    106:                                     ready_list,
                    107:                                     nexus_list;
                    108:
                    109:     struct sbic_acb         *sc_nexus;  /* current command */
                    110:     struct sbic_acb         sc_acb[8];  /* the real command blocks */
                    111:     struct sbic_tinfo       sc_tinfo[8];
                    112:
                    113:     struct  scsi_xfer       *sc_xs;     /* transfer from high level code */
                    114:     u_char                  sc_flags;
                    115:     u_char                  sc_stat[2];
                    116:     u_char                  sc_msg[7];
                    117:     u_long                  sc_clkfreq;
                    118:     u_long                  sc_tcnt;    /* number of bytes transferred */
                    119:     u_short                 sc_dmacmd;  /* used by dma drivers */
                    120:     u_long                  sc_dmamask; /* dma valid mem mask */
                    121: #ifdef DEBUG
                    122:     u_short                 sc_dmatimo; /* dma timeout */
                    123: #endif
                    124:     struct  dma_chain       *sc_cur;
                    125:     struct  dma_chain       *sc_last;
                    126:     int  (*sc_dmago)(struct sbic_softc *, char *, int, int);
                    127:     int  (*sc_dmanext)(struct sbic_softc *);
                    128:     void (*sc_enintr)(struct sbic_softc *);
                    129:     void (*sc_dmastop)(struct sbic_softc *);
                    130: };
                    131:
                    132: /*
                    133:  * sc_flags
                    134:  */
                    135: #define SBICF_ALIVE         0x01    /* controller initialized */
                    136: #define SBICF_DCFLUSH       0x02    /* need flush for overlap after dma finishes */
                    137: #define SBICF_SELECTED      0x04    /* bus is in selected state. */
                    138: #define SBICF_ICMD          0x08    /* Immediate command in execution */
                    139: #define SBICF_BADDMA        0x10    /* controller can only DMA to ztwobus space */
                    140: #define SBICF_INTR          0x40    /* SBICF interrupt expected */
                    141: #define SBICF_INDMA         0x80    /* not used yet, DMA I/O in progress */
                    142:
                    143: /*
                    144:  * sync states
                    145:  */
                    146: #define SYNC_START          0   /* no sync handshake started */
                    147: #define SYNC_SENT           1   /* we sent sync request, no answer yet */
                    148: #define SYNC_DONE           2   /* target accepted our (or inferior) settings,
                    149:                                    or it rejected the request and we stay async */
                    150:
                    151: #define PHASE               0x07    /* mask for psns/pctl phase */
                    152: #define DATA_OUT_PHASE      0x00
                    153: #define DATA_IN_PHASE       0x01
                    154: #define CMD_PHASE           0x02
                    155: #define STATUS_PHASE        0x03
                    156: #define BUS_FREE_PHASE      0x04
                    157: #define ARB_SEL_PHASE       0x05    /* Fuji chip combines arbitration with sel. */
                    158: #define MESG_OUT_PHASE      0x06
                    159: #define MESG_IN_PHASE       0x07
                    160:
                    161: #define MSG_CMD_COMPLETE    0x00
                    162: #define MSG_EXT_MESSAGE     0x01
                    163: #define MSG_SAVE_DATA_PTR   0x02
                    164: #define MSG_RESTORE_PTR     0x03
                    165: #define MSG_DISCONNECT      0x04
                    166: #define MSG_INIT_DETECT_ERROR   0x05
                    167: #define MSG_ABORT           0x06
                    168: #define MSG_REJECT          0x07
                    169: #define MSG_NOOP            0x08
                    170: #define MSG_PARITY_ERROR    0x09
                    171: #define MSG_BUS_DEVICE_RESET    0x0C
                    172: #define MSG_IDENTIFY        0x80
                    173: #define MSG_IDENTIFY_DR     0xc0    /* (disconnect/reconnect allowed) */
                    174: #define MSG_SYNC_REQ        0x01
                    175:
                    176: #define MSG_ISIDENTIFY(x)   ((x) & MSG_IDENTIFY)
                    177:
                    178:
                    179: #define STS_CHECKCOND       0x02    /* Check Condition (ie., read sense) */
                    180: #define STS_CONDMET         0x04    /* Condition Met (ie., search worked) */
                    181: #define STS_BUSY            0x08
                    182: #define STS_INTERMED        0x10    /* Intermediate status sent */
                    183: #define STS_EXT             0x80    /* Extended status valid */
                    184:
                    185:
                    186: /*
                    187:  * States returned by our state machine
                    188:  */
                    189:
                    190: #define SBIC_STATE_ERROR    -1
                    191: #define SBIC_STATE_DONE     0
                    192: #define SBIC_STATE_RUNNING  1
                    193: #define SBIC_STATE_DISCONNECT   2
                    194:
                    195:
                    196: struct buf;
                    197: struct scsi_xfer;
                    198:
                    199: void sbic_minphys(struct buf *bp);
                    200: int sbic_scsicmd(struct scsi_xfer *);
                    201:
                    202: #endif /* _SBICVAR_H_ */

CVSweb