Annotation of sys/arch/mvme68k/dev/sbicvar.h, Revision 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