xref: /linux/drivers/scsi/arm/acornscsi.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  *  linux/drivers/acorn/scsi/acornscsi.h
4  *
5  *  Copyright (C) 1997 Russell King
6  *
7  *  Acorn SCSI driver
8  */
9 #ifndef ACORNSCSI_H
10 #define ACORNSCSI_H
11 
12 /* SBIC registers */
13 #define SBIC_OWNID		0
14 #define OWNID_FS1		(1<<7)
15 #define OWNID_FS2		(1<<6)
16 #define OWNID_EHP		(1<<4)
17 #define OWNID_EAF		(1<<3)
18 
19 #define SBIC_CTRL		1
20 #define CTRL_DMAMODE		(1<<7)
21 #define CTRL_DMADBAMODE		(1<<6)
22 #define CTRL_DMABURST		(1<<5)
23 #define CTRL_DMAPOLLED		0
24 #define CTRL_HHP		(1<<4)
25 #define CTRL_EDI		(1<<3)
26 #define CTRL_IDI		(1<<2)
27 #define CTRL_HA			(1<<1)
28 #define CTRL_HSP		(1<<0)
29 
30 #define SBIC_TIMEOUT		2
31 #define SBIC_TOTSECTS		3
32 #define SBIC_TOTHEADS		4
33 #define SBIC_TOTCYLH		5
34 #define SBIC_TOTCYLL		6
35 #define SBIC_LOGADDRH		7
36 #define SBIC_LOGADDRM2		8
37 #define SBIC_LOGADDRM1		9
38 #define SBIC_LOGADDRL		10
39 #define SBIC_SECTORNUM		11
40 #define SBIC_HEADNUM		12
41 #define SBIC_CYLH		13
42 #define SBIC_CYLL		14
43 #define SBIC_TARGETLUN		15
44 #define TARGETLUN_TLV		(1<<7)
45 #define TARGETLUN_DOK		(1<<6)
46 
47 #define SBIC_CMNDPHASE		16
48 #define SBIC_SYNCHTRANSFER	17
49 #define SYNCHTRANSFER_OF0	0x00
50 #define SYNCHTRANSFER_OF1	0x01
51 #define SYNCHTRANSFER_OF2	0x02
52 #define SYNCHTRANSFER_OF3	0x03
53 #define SYNCHTRANSFER_OF4	0x04
54 #define SYNCHTRANSFER_OF5	0x05
55 #define SYNCHTRANSFER_OF6	0x06
56 #define SYNCHTRANSFER_OF7	0x07
57 #define SYNCHTRANSFER_OF8	0x08
58 #define SYNCHTRANSFER_OF9	0x09
59 #define SYNCHTRANSFER_OF10	0x0A
60 #define SYNCHTRANSFER_OF11	0x0B
61 #define SYNCHTRANSFER_OF12	0x0C
62 #define SYNCHTRANSFER_8DBA	0x00
63 #define SYNCHTRANSFER_2DBA	0x20
64 #define SYNCHTRANSFER_3DBA	0x30
65 #define SYNCHTRANSFER_4DBA	0x40
66 #define SYNCHTRANSFER_5DBA	0x50
67 #define SYNCHTRANSFER_6DBA	0x60
68 #define SYNCHTRANSFER_7DBA	0x70
69 
70 #define SBIC_TRANSCNTH		18
71 #define SBIC_TRANSCNTM		19
72 #define SBIC_TRANSCNTL		20
73 #define SBIC_DESTID		21
74 #define DESTID_SCC		(1<<7)
75 #define DESTID_DPD		(1<<6)
76 
77 #define SBIC_SOURCEID		22
78 #define SOURCEID_ER		(1<<7)
79 #define SOURCEID_ES		(1<<6)
80 #define SOURCEID_DSP		(1<<5)
81 #define SOURCEID_SIV		(1<<4)
82 
83 #define SBIC_SSR		23
84 #define SBIC_CMND		24
85 #define CMND_RESET		0x00
86 #define CMND_ABORT		0x01
87 #define CMND_ASSERTATN		0x02
88 #define CMND_NEGATEACK		0x03
89 #define CMND_DISCONNECT		0x04
90 #define CMND_RESELECT		0x05
91 #define CMND_SELWITHATN		0x06
92 #define CMND_SELECT		0x07
93 #define CMND_SELECTATNTRANSFER	0x08
94 #define CMND_SELECTTRANSFER	0x09
95 #define CMND_RESELECTRXDATA	0x0A
96 #define CMND_RESELECTTXDATA	0x0B
97 #define CMND_WAITFORSELRECV	0x0C
98 #define CMND_SENDSTATCMD	0x0D
99 #define CMND_SENDDISCONNECT	0x0E
100 #define CMND_SETIDI		0x0F
101 #define CMND_RECEIVECMD		0x10
102 #define CMND_RECEIVEDTA		0x11
103 #define CMND_RECEIVEMSG		0x12
104 #define CMND_RECEIVEUSP		0x13
105 #define CMND_SENDCMD		0x14
106 #define CMND_SENDDATA		0x15
107 #define CMND_SENDMSG		0x16
108 #define CMND_SENDUSP		0x17
109 #define CMND_TRANSLATEADDR	0x18
110 #define CMND_XFERINFO		0x20
111 #define CMND_SBT		(1<<7)
112 
113 #define SBIC_DATA		25
114 #define SBIC_ASR		26
115 #define ASR_INT			(1<<7)
116 #define ASR_LCI			(1<<6)
117 #define ASR_BSY			(1<<5)
118 #define ASR_CIP			(1<<4)
119 #define ASR_PE			(1<<1)
120 #define ASR_DBR			(1<<0)
121 
122 /* DMAC registers */
123 #define DMAC_INIT		0x00
124 #define INIT_8BIT		(1)
125 
126 #define DMAC_CHANNEL		0x80
127 #define CHANNEL_0		0x00
128 #define CHANNEL_1		0x01
129 #define CHANNEL_2		0x02
130 #define CHANNEL_3		0x03
131 
132 #define DMAC_TXCNTLO		0x01
133 #define DMAC_TXCNTHI		0x81
134 #define DMAC_TXADRLO		0x02
135 #define DMAC_TXADRMD		0x82
136 #define DMAC_TXADRHI		0x03
137 
138 #define DMAC_DEVCON0		0x04
139 #define DEVCON0_AKL		(1<<7)
140 #define DEVCON0_RQL		(1<<6)
141 #define DEVCON0_EXW		(1<<5)
142 #define DEVCON0_ROT		(1<<4)
143 #define DEVCON0_CMP		(1<<3)
144 #define DEVCON0_DDMA		(1<<2)
145 #define DEVCON0_AHLD		(1<<1)
146 #define DEVCON0_MTM		(1<<0)
147 
148 #define DMAC_DEVCON1		0x84
149 #define DEVCON1_WEV		(1<<1)
150 #define DEVCON1_BHLD		(1<<0)
151 
152 #define DMAC_MODECON		0x05
153 #define MODECON_WOED		0x01
154 #define MODECON_VERIFY		0x00
155 #define MODECON_READ		0x04
156 #define MODECON_WRITE		0x08
157 #define MODECON_AUTOINIT	0x10
158 #define MODECON_ADDRDIR		0x20
159 #define MODECON_DEMAND		0x00
160 #define MODECON_SINGLE		0x40
161 #define MODECON_BLOCK		0x80
162 #define MODECON_CASCADE		0xC0
163 
164 #define DMAC_STATUS		0x85
165 #define STATUS_TC0		(1<<0)
166 #define STATUS_RQ0		(1<<4)
167 
168 #define DMAC_TEMPLO		0x06
169 #define DMAC_TEMPHI		0x86
170 #define DMAC_REQREG		0x07
171 #define DMAC_MASKREG		0x87
172 #define MASKREG_M0		0x01
173 #define MASKREG_M1		0x02
174 #define MASKREG_M2		0x04
175 #define MASKREG_M3		0x08
176 
177 /* miscellaneous internal variables */
178 
179 #define MASK_ON		(MASKREG_M3|MASKREG_M2|MASKREG_M1|MASKREG_M0)
180 #define MASK_OFF	(MASKREG_M3|MASKREG_M2|MASKREG_M1)
181 
182 /*
183  * SCSI driver phases
184  */
185 typedef enum {
186     PHASE_IDLE,					/* we're not planning on doing anything	 */
187     PHASE_CONNECTING,				/* connecting to a target		 */
188     PHASE_CONNECTED,				/* connected to a target		 */
189     PHASE_MSGOUT,				/* message out to device		 */
190     PHASE_RECONNECTED,				/* reconnected				 */
191     PHASE_COMMANDPAUSED,			/* command partly sent			 */
192     PHASE_COMMAND,				/* command all sent			 */
193     PHASE_DATAOUT,				/* data out to device			 */
194     PHASE_DATAIN,				/* data in from device			 */
195     PHASE_STATUSIN,				/* status in from device		 */
196     PHASE_MSGIN,				/* message in from device		 */
197     PHASE_DONE,					/* finished				 */
198     PHASE_ABORTED,				/* aborted				 */
199     PHASE_DISCONNECT,				/* disconnecting			 */
200 } phase_t;
201 
202 /*
203  * After interrupt, what to do now
204  */
205 typedef enum {
206     INTR_IDLE,					/* not expecting another IRQ		 */
207     INTR_NEXT_COMMAND,				/* start next command			 */
208     INTR_PROCESSING,				/* interrupt routine still processing	 */
209 } intr_ret_t;
210 
211 /*
212  * DMA direction
213  */
214 typedef enum {
215     DMA_OUT,					/* DMA from memory to chip		*/
216     DMA_IN					/* DMA from chip to memory		*/
217 } dmadir_t;
218 
219 /*
220  * Synchronous transfer state
221  */
222 typedef enum {					/* Synchronous transfer state		*/
223     SYNC_ASYNCHRONOUS,				/* don't negotiate synchronous transfers*/
224     SYNC_NEGOCIATE,				/* start negotiation			*/
225     SYNC_SENT_REQUEST,				/* sent SDTR message			*/
226     SYNC_COMPLETED,				/* received SDTR reply			*/
227 } syncxfer_t;
228 
229 /*
230  * Command type
231  */
232 typedef enum {					/* command type				*/
233     CMD_READ,					/* READ_6, READ_10, READ_12		*/
234     CMD_WRITE,					/* WRITE_6, WRITE_10, WRITE_12		*/
235     CMD_MISC,					/* Others				*/
236 } cmdtype_t;
237 
238 /*
239  * Data phase direction
240  */
241 typedef enum {					/* Data direction			*/
242     DATADIR_IN,					/* Data in phase expected		*/
243     DATADIR_OUT					/* Data out phase expected		*/
244 } datadir_t;
245 
246 #include "queue.h"
247 #include "msgqueue.h"
248 
249 #define STATUS_BUFFER_SIZE	32
250 /*
251  * This is used to dump the previous states of the SBIC
252  */
253 struct status_entry {
254 	unsigned long	when;
255 	unsigned char	ssr;
256 	unsigned char	ph;
257 	unsigned char	irq;
258 	unsigned char	unused;
259 };
260 
261 #define ADD_STATUS(_q,_ssr,_ph,_irq) \
262 ({									\
263 	host->status[(_q)][host->status_ptr[(_q)]].when = jiffies;	\
264 	host->status[(_q)][host->status_ptr[(_q)]].ssr  = (_ssr);	\
265 	host->status[(_q)][host->status_ptr[(_q)]].ph   = (_ph);	\
266 	host->status[(_q)][host->status_ptr[(_q)]].irq  = (_irq);	\
267 	host->status_ptr[(_q)] = (host->status_ptr[(_q)] + 1) & (STATUS_BUFFER_SIZE - 1); \
268 })
269 
270 /*
271  * AcornSCSI host specific data
272  */
273 typedef struct acornscsi_hostdata {
274     /* miscellaneous */
275     struct Scsi_Host	*host;			/* host					*/
276     struct scsi_cmnd	*SCpnt;			/* currently processing command		*/
277     struct scsi_cmnd	*origSCpnt;		/* original connecting command		*/
278     void __iomem	*base;			/* memc base address 			*/
279     void __iomem	*fast;			/* fast ioc base address		*/
280 
281     /* driver information */
282     struct {
283 	unsigned int	irq;			/* interrupt				*/
284 	phase_t		phase;			/* current phase			*/
285 
286 	struct {
287 	    unsigned char	target;		/* reconnected target			*/
288 	    unsigned char	lun;		/* reconnected lun			*/
289 	    unsigned char	tag;		/* reconnected tag			*/
290 	} reconnected;
291 
292 	struct scsi_pointer	SCp;			/* current commands data pointer	*/
293 
294 	MsgQueue_t	msgs;
295 
296 	unsigned short	last_message;		/* last message to be sent		*/
297 	unsigned char	disconnectable:1;	/* this command can be disconnected	*/
298     } scsi;
299 
300     /* statistics information */
301     struct {
302 	unsigned int	queues;
303 	unsigned int	removes;
304 	unsigned int	fins;
305 	unsigned int	reads;
306 	unsigned int	writes;
307 	unsigned int	miscs;
308 	unsigned int	disconnects;
309 	unsigned int	aborts;
310 	unsigned int	resets;
311     } stats;
312 
313     /* queue handling */
314     struct {
315 	Queue_t		issue;			/* issue queue				*/
316 	Queue_t		disconnected;		/* disconnected command queue		*/
317     } queues;
318 
319     /* per-device info */
320     struct {
321 	unsigned char	sync_xfer;		/* synchronous transfer (SBIC value)	*/
322 	syncxfer_t	sync_state;		/* sync xfer negotiation state		*/
323 	unsigned char	disconnect_ok:1;	/* device can disconnect		*/
324     } device[8];
325     unsigned long	busyluns[64 / sizeof(unsigned long)];/* array of bits indicating LUNs busy	*/
326 
327     /* DMA info */
328     struct {
329 	unsigned int	free_addr;		/* next free address			*/
330 	unsigned int	start_addr;		/* start address of current transfer	*/
331 	dmadir_t	direction;		/* dma direction			*/
332 	unsigned int	transferred;		/* number of bytes transferred		*/
333 	unsigned int	xfer_start;		/* scheduled DMA transfer start		*/
334 	unsigned int	xfer_length;		/* scheduled DMA transfer length	*/
335 	char		*xfer_ptr;		/* pointer to area			*/
336 	unsigned char	xfer_required:1;	/* set if we need to transfer something	*/
337 	unsigned char	xfer_setup:1;		/* set if DMA is setup			*/
338 	unsigned char	xfer_done:1;		/* set if DMA reached end of BH list	*/
339     } dma;
340 
341     /* card info */
342     struct {
343 	unsigned char	page_reg;		/* current setting of page reg		*/
344     } card;
345 
346     unsigned char status_ptr[9];
347     struct status_entry status[9][STATUS_BUFFER_SIZE];
348 } AS_Host;
349 
350 #endif /* ACORNSCSI_H */
351