Annotation of sys/arch/mac68k/dev/ncr5380reg.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: ncr5380reg.h,v 1.6 2006/01/16 21:45:58 miod Exp $ */
2: /* $NetBSD: ncr5380reg.h,v 1.9 1996/05/05 06:16:58 briggs Exp $ */
3:
4: /*
5: * Copyright (c) 1995 Leo Weppelman.
6: * All rights reserved.
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 Leo Weppelman.
19: * 4. The name of the author may not be used to endorse or promote products
20: * derived from this software without specific prior written permission
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: */
33:
34: #ifndef _NCR5380REG_H
35: #define _NCR5380REG_H
36: /*
37: * NCR5380 common interface definitions.
38: */
39:
40: /*
41: * Register numbers: (first argument to GET/SET_5380_REG )
42: */
43: #define NCR5380_DATA 0 /* Data register */
44: #define NCR5380_ICOM 1 /* Initiator command register */
45: #define NCR5380_MODE 2 /* Mode register */
46: #define NCR5380_TCOM 3 /* Target command register */
47: #define NCR5380_IDSTAT 4 /* Bus status register */
48: #define NCR5380_DMSTAT 5 /* DMA status register */
49: #define NCR5380_TRCV 6 /* Target receive register */
50: #define NCR5380_IRCV 7 /* Initiator receive register */
51:
52: /*
53: * Definitions for Initiator command register.
54: */
55: #define SC_A_RST 0x80 /* RW - Assert RST */
56: #define SC_TEST 0x40 /* W - Test mode */
57: #define SC_AIP 0x40 /* R - Arbitration in progress */
58: #define SC_LA 0x20 /* R - Lost arbitration */
59: #define SC_A_ACK 0x10 /* RW - Assert ACK */
60: #define SC_A_BSY 0x08 /* RW - Assert BSY */
61: #define SC_A_SEL 0x04 /* RW - Assert SEL */
62: #define SC_A_ATN 0x02 /* RW - Assert ATN */
63: #define SC_ADTB 0x01 /* RW - Assert Data To Bus */
64:
65: /*
66: * Definitions for mode register
67: */
68: #define SC_B_DMA 0x80 /* RW - Block mode DMA (not on TT!) */
69: #define SC_T_MODE 0x40 /* RW - Target mode */
70: #define SC_E_PAR 0x20 /* RW - Enable parity check */
71: #define SC_E_PARI 0x10 /* RW - Enable parity interrupt */
72: #define SC_E_EOPI 0x08 /* RW - Enable End Of Process Interrupt */
73: #define SC_MON_BSY 0x04 /* RW - Monitor BSY */
74: #define SC_M_DMA 0x02 /* RW - Set DMA mode */
75: #define SC_ARBIT 0x01 /* RW - Arbitrate */
76:
77: /*
78: * Definitions for tcom register
79: */
80: #define SC_LBS 0x80 /* RW - Last Byte Send (not on TT!) */
81: #define SC_A_REQ 0x08 /* RW - Assert REQ */
82: #define SC_A_MSG 0x04 /* RW - Assert MSG */
83: #define SC_A_CD 0x02 /* RW - Assert C/D */
84: #define SC_A_IO 0x01 /* RW - Assert I/O */
85:
86: /*
87: * Definitions for idstat register
88: */
89: #define SC_S_RST 0x80 /* R - RST is set */
90: #define SC_S_BSY 0x40 /* R - BSY is set */
91: #define SC_S_REQ 0x20 /* R - REQ is set */
92: #define SC_S_MSG 0x10 /* R - MSG is set */
93: #define SC_S_CD 0x08 /* R - C/D is set */
94: #define SC_S_IO 0x04 /* R - I/O is set */
95: #define SC_S_SEL 0x02 /* R - SEL is set */
96: #define SC_S_PAR 0x01 /* R - Parity bit */
97:
98: /*
99: * Definitions for dmastat register
100: */
101: #define SC_END_DMA 0x80 /* R - End of DMA */
102: #define SC_DMA_REQ 0x40 /* R - DMA request */
103: #define SC_PAR_ERR 0x20 /* R - Parity error */
104: #define SC_IRQ_SET 0x10 /* R - IRQ is active */
105: #define SC_PHS_MTCH 0x08 /* R - Phase Match */
106: #define SC_BSY_ERR 0x04 /* R - Busy error */
107: #define SC_ATN_STAT 0x02 /* R - State of ATN line */
108: #define SC_ACK_STAT 0x01 /* R - State of ACK line */
109: #define SC_S_SEND 0x00 /* W - Start DMA output */
110:
111: #define SC_CLINT { /* Clear interrupts */ \
112: int i = GET_5380_REG(NCR5380_IRCV); \
113: }
114:
115:
116: /*
117: * Definition of SCSI-bus phases. The values are determined by signals
118: * on the SCSI-bus. DO NOT CHANGE!
119: * The values must be used to index the pointers in SCSI-PARMS.
120: */
121: #define NR_PHASE 8
122: #define PH_DATAOUT 0
123: #define PH_DATAIN 1
124: #define PH_CMD 2
125: #define PH_STATUS 3
126: #define PH_RES1 4
127: #define PH_RES2 5
128: #define PH_MSGOUT 6
129: #define PH_MSGIN 7
130:
131: #define PH_OUT(phase) (!(phase & 1)) /* TRUE if output phase */
132: #define PH_IN(phase) (phase & 1) /* TRUE if input phase */
133:
134: /*
135: * Id of Host-adapter
136: */
137: #define SC_HOST_ID 0x80
138:
139: /*
140: * Base setting for 5380 mode register
141: */
142: #define IMODE_BASE SC_E_PAR
143:
144: /*
145: * SCSI completion status codes, should move to sys/scsi/????
146: */
147: #define SCSMASK 0x1e /* status code mask */
148: #define SCSGOOD 0x00 /* good status */
149: #define SCSCHKC 0x02 /* check condition */
150: #define SCSBUSY 0x08 /* busy status */
151: #define SCSCMET 0x04 /* condition met / good */
152:
153: /*
154: * Return values of check_intr()
155: */
156: #define INTR_SPURIOUS 0
157: #define INTR_RESEL 2
158: #define INTR_DMA 3
159:
160: struct ncr_softc {
161: struct device sc_dev;
162: struct scsi_link sc_link;
163:
164: struct via2hand sc_ih_irq, sc_ih_drq;
165:
166: /*
167: * Some (pre-SCSI2) devices don't support select with ATN.
168: * If the device responds to select with ATN by going into
169: * command phase (ignoring ATN), then we flag it in the
170: * following bitmask.
171: * We also keep track of which devices have been selected
172: * before. This allows us to not even try raising ATN if
173: * the target doesn't respond to it the first time.
174: */
175: u_int8_t sc_noselatn;
176: u_int8_t sc_selected;
177: };
178:
179: /*
180: * Max. number of dma-chains per request
181: */
182: #define MAXDMAIO (MAXPHYS/NBPG + 1)
183:
184: /*
185: * Some requests are not contiguous in physical memory. We need to break them
186: * up into contiguous parts for DMA.
187: */
188: struct dma_chain {
189: u_int dm_count;
190: u_long dm_addr;
191: };
192:
193: /*
194: * Define our issue, free and disconnect queue's.
195: */
196: typedef struct req_q {
197: struct req_q *next; /* next in free, issue or discon queue */
198: struct req_q *link; /* next linked command to execute */
199: struct scsi_xfer *xs; /* request from high-level driver */
200: u_short dr_flag; /* driver state */
201: u_char phase; /* current SCSI phase */
202: u_char msgout; /* message to send when requested */
203: u_char targ_id; /* target for command */
204: u_char targ_lun; /* lun for command */
205: u_char status; /* returned status byte */
206: u_char message; /* returned message byte */
207: u_char *bounceb; /* allocated bounce buffer */
208: u_char *bouncerp; /* bounce read-pointer */
209: struct dma_chain dm_chain[MAXDMAIO];
210: struct dma_chain *dm_cur; /* current dma-request */
211: struct dma_chain *dm_last; /* last dma-request */
212: long xdata_len; /* length of transfer */
213: u_char *xdata_ptr; /* virtual address of transfer */
214: struct scsi_generic xcmd; /* command to execute */
215: } SC_REQ;
216:
217: /*
218: * Values for dr_flag:
219: */
220: #define DRIVER_IN_DMA 0x01 /* Non-polled DMA activated */
221: #define DRIVER_AUTOSEN 0x02 /* Doing automatic sense */
222: #define DRIVER_NOINT 0x04 /* We are booting: no interrupts */
223: #define DRIVER_DMAOK 0x08 /* DMA can be used on this request */
224: #define DRIVER_BOUNCING 0x10 /* Using the bounce buffer */
225: #define DRIVER_LINKCHK 0x20 /* Doing the linked command check */
226:
227: /* XXX: Should go to ncr5380var.h */
228: static SC_REQ *issue_q = NULL; /* Commands waiting to be issued*/
229: static SC_REQ *discon_q = NULL; /* Commands disconnected */
230: static SC_REQ *connected = NULL; /* Command currently connected */
231:
232: /*
233: * Function decls:
234: */
235: static int transfer_pio(u_char *, u_char *, u_long *, int);
236: static int wait_req_true(void);
237: static int wait_req_false(void);
238: static int scsi_select(SC_REQ *, int);
239: static int handle_message(SC_REQ *, u_int);
240: static void ack_message(void);
241: static void nack_message(SC_REQ *, u_char);
242: static void finish_req(SC_REQ *reqp);
243: static int command_size(u_char opcode);
244: static int information_transfer(struct ncr_softc *);
245: static void reselect(struct ncr_softc *);
246: static int check_autosense(SC_REQ *, int);
247: static int reach_msg_out(struct ncr_softc *, u_long);
248: static int check_intr(struct ncr_softc *);
249: static void scsi_reset(void);
250: static void scsi_reset_verbose(struct ncr_softc *, const char *);
251: static void run_main(struct ncr_softc *);
252: static void scsi_main(struct ncr_softc *);
253: static void ncr_ctrl_intr(struct ncr_softc *);
254: static void ncr_tprint(SC_REQ *, char *, ...);
255: static void ncr_aprint(struct ncr_softc *, char *, ...);
256:
257: static void show_data_sense(struct scsi_xfer *xs);
258: static void show_request(SC_REQ *, char *);
259: /* static void show_phase(SC_REQ *, int); */
260: static void show_signals(u_char, u_char);
261:
262: #endif /* _NCR5380REG_H */
CVSweb