11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/drivers/acorn/scsi/acornscsi.h
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (C) 1997 Russell King
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Acorn SCSI driver
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ACORNSCSI_H
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACORNSCSI_H
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SBIC registers */
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_OWNID		0
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OWNID_FS1		(1<<7)
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OWNID_FS2		(1<<6)
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OWNID_EHP		(1<<4)
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OWNID_EAF		(1<<3)
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_CTRL		1
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_DMAMODE		(1<<7)
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_DMADBAMODE		(1<<6)
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_DMABURST		(1<<5)
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_DMAPOLLED		0
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_HHP		(1<<4)
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_EDI		(1<<3)
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_IDI		(1<<2)
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_HA			(1<<1)
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CTRL_HSP		(1<<0)
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TIMEOUT		2
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TOTSECTS		3
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TOTHEADS		4
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TOTCYLH		5
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TOTCYLL		6
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_LOGADDRH		7
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_LOGADDRM2		8
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_LOGADDRM1		9
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_LOGADDRL		10
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_SECTORNUM		11
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_HEADNUM		12
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_CYLH		13
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_CYLL		14
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TARGETLUN		15
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TARGETLUN_TLV		(1<<7)
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TARGETLUN_DOK		(1<<6)
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_CMNDPHASE		16
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_SYNCHTRANSFER	17
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF0	0x00
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF1	0x01
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF2	0x02
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF3	0x03
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF4	0x04
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF5	0x05
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF6	0x06
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF7	0x07
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF8	0x08
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF9	0x09
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF10	0x0A
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF11	0x0B
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_OF12	0x0C
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_8DBA	0x00
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_2DBA	0x20
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_3DBA	0x30
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_4DBA	0x40
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_5DBA	0x50
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_6DBA	0x60
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SYNCHTRANSFER_7DBA	0x70
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TRANSCNTH		18
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TRANSCNTM		19
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_TRANSCNTL		20
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_DESTID		21
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DESTID_SCC		(1<<7)
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DESTID_DPD		(1<<6)
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_SOURCEID		22
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SOURCEID_ER		(1<<7)
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SOURCEID_ES		(1<<6)
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SOURCEID_DSP		(1<<5)
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SOURCEID_SIV		(1<<4)
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_SSR		23
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_CMND		24
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RESET		0x00
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_ABORT		0x01
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_ASSERTATN		0x02
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_NEGATEACK		0x03
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_DISCONNECT		0x04
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RESELECT		0x05
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SELWITHATN		0x06
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SELECT		0x07
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SELECTATNTRANSFER	0x08
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SELECTTRANSFER	0x09
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RESELECTRXDATA	0x0A
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RESELECTTXDATA	0x0B
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_WAITFORSELRECV	0x0C
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SENDSTATCMD	0x0D
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SENDDISCONNECT	0x0E
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SETIDI		0x0F
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RECEIVECMD		0x10
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RECEIVEDTA		0x11
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RECEIVEMSG		0x12
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_RECEIVEUSP		0x13
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SENDCMD		0x14
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SENDDATA		0x15
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SENDMSG		0x16
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SENDUSP		0x17
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_TRANSLATEADDR	0x18
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_XFERINFO		0x20
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMND_SBT		(1<<7)
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_DATA		25
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SBIC_ASR		26
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ASR_INT			(1<<7)
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ASR_LCI			(1<<6)
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ASR_BSY			(1<<5)
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ASR_CIP			(1<<4)
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ASR_PE			(1<<1)
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ASR_DBR			(1<<0)
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DMAC registers */
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_INIT		0x00
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INIT_8BIT		(1)
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_CHANNEL		0x80
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CHANNEL_0		0x00
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CHANNEL_1		0x01
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CHANNEL_2		0x02
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CHANNEL_3		0x03
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_TXCNTLO		0x01
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_TXCNTHI		0x81
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_TXADRLO		0x02
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_TXADRMD		0x82
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_TXADRHI		0x03
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_DEVCON0		0x04
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_AKL		(1<<7)
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_RQL		(1<<6)
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_EXW		(1<<5)
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_ROT		(1<<4)
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_CMP		(1<<3)
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_DDMA		(1<<2)
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_AHLD		(1<<1)
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON0_MTM		(1<<0)
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_DEVCON1		0x84
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON1_WEV		(1<<1)
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVCON1_BHLD		(1<<0)
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_MODECON		0x05
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_WOED		0x01
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_VERIFY		0x00
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_READ		0x04
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_WRITE		0x08
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_AUTOINIT	0x10
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_ADDRDIR		0x20
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_DEMAND		0x00
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_SINGLE		0x40
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_BLOCK		0x80
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODECON_CASCADE		0xC0
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_STATUS		0x85
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STATUS_TC0		(1<<0)
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STATUS_RQ0		(1<<4)
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_TEMPLO		0x06
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_TEMPHI		0x86
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_REQREG		0x07
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMAC_MASKREG		0x87
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MASKREG_M0		0x01
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MASKREG_M1		0x02
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MASKREG_M2		0x04
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MASKREG_M3		0x08
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* miscellaneous internal variables */
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MASK_ON		(MASKREG_M3|MASKREG_M2|MASKREG_M1|MASKREG_M0)
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MASK_OFF	(MASKREG_M3|MASKREG_M2|MASKREG_M1)
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SCSI driver phases
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum {
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_IDLE,					/* we're not planning on doing anything	 */
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_CONNECTING,				/* connecting to a target		 */
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_CONNECTED,				/* connected to a target		 */
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_MSGOUT,				/* message out to device		 */
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_RECONNECTED,				/* reconnected				 */
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_COMMANDPAUSED,			/* command partly sent			 */
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_COMMAND,				/* command all sent			 */
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_DATAOUT,				/* data out to device			 */
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_DATAIN,				/* data in from device			 */
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_STATUSIN,				/* status in from device		 */
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_MSGIN,				/* message in from device		 */
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_DONE,					/* finished				 */
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_ABORTED,				/* aborted				 */
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PHASE_DISCONNECT,				/* disconnecting			 */
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} phase_t;
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * After interrupt, what to do now
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum {
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    INTR_IDLE,					/* not expecting another IRQ		 */
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    INTR_NEXT_COMMAND,				/* start next command			 */
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    INTR_PROCESSING,				/* interrupt routine still processing	 */
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} intr_ret_t;
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DMA direction
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum {
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    DMA_OUT,					/* DMA from memory to chip		*/
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    DMA_IN					/* DMA from chip to memory		*/
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} dmadir_t;
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Synchronous transfer state
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum {					/* Synchronous transfer state		*/
22625985edcedea6396277003854657b5f3cb31a628Lucas De Marchi    SYNC_ASYNCHRONOUS,				/* don't negotiate synchronous transfers*/
22725985edcedea6396277003854657b5f3cb31a628Lucas De Marchi    SYNC_NEGOCIATE,				/* start negotiation			*/
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    SYNC_SENT_REQUEST,				/* sent SDTR message			*/
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    SYNC_COMPLETED,				/* received SDTR reply			*/
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} syncxfer_t;
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Command type
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum {					/* command type				*/
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    CMD_READ,					/* READ_6, READ_10, READ_12		*/
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    CMD_WRITE,					/* WRITE_6, WRITE_10, WRITE_12		*/
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    CMD_MISC,					/* Others				*/
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} cmdtype_t;
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Data phase direction
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum {					/* Data direction			*/
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    DATADIR_IN,					/* Data in phase expected		*/
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    DATADIR_OUT					/* Data out phase expected		*/
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} datadir_t;
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "queue.h"
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "msgqueue.h"
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STATUS_BUFFER_SIZE	32
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is used to dump the previous states of the SBIC
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct status_entry {
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	when;
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	ssr;
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	ph;
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	irq;
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	unused;
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ADD_STATUS(_q,_ssr,_ph,_irq) \
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds({									\
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	host->status[(_q)][host->status_ptr[(_q)]].when = jiffies;	\
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	host->status[(_q)][host->status_ptr[(_q)]].ssr  = (_ssr);	\
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	host->status[(_q)][host->status_ptr[(_q)]].ph   = (_ph);	\
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	host->status[(_q)][host->status_ptr[(_q)]].irq  = (_irq);	\
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	host->status_ptr[(_q)] = (host->status_ptr[(_q)] + 1) & (STATUS_BUFFER_SIZE - 1); \
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds})
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AcornSCSI host specific data
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct acornscsi_hostdata {
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /* miscellaneous */
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct Scsi_Host	*host;			/* host					*/
279ee0ca6bab394fe41a2b4de58c4532b09a41c9165Henrik Kretzschmar    struct scsi_cmnd	*SCpnt;			/* currently processing command		*/
280ee0ca6bab394fe41a2b4de58c4532b09a41c9165Henrik Kretzschmar    struct scsi_cmnd	*origSCpnt;		/* original connecting command		*/
281e95a1b656a9809acd8ba8eb867ac6a7759d6180eRussell King    void __iomem	*base;			/* memc base address 			*/
282e95a1b656a9809acd8ba8eb867ac6a7759d6180eRussell King    void __iomem	*fast;			/* fast ioc base address		*/
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /* driver information */
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct {
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	irq;			/* interrupt				*/
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	phase_t		phase;			/* current phase			*/
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	    unsigned char	target;		/* reconnected target			*/
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	    unsigned char	lun;		/* reconnected lun			*/
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	    unsigned char	tag;		/* reconnected tag			*/
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} reconnected;
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2950a04137e75204e370dbdf2376033853eea126de7Christoph Hellwig	struct scsi_pointer	SCp;			/* current commands data pointer	*/
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MsgQueue_t	msgs;
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short	last_message;		/* last message to be sent		*/
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	disconnectable:1;	/* this command can be disconnected	*/
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } scsi;
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /* statistics information */
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct {
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	queues;
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	removes;
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	fins;
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	reads;
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	writes;
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	miscs;
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	disconnects;
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	aborts;
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	resets;
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } stats;
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /* queue handling */
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct {
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Queue_t		issue;			/* issue queue				*/
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Queue_t		disconnected;		/* disconnected command queue		*/
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } queues;
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /* per-device info */
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct {
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	sync_xfer;		/* synchronous transfer (SBIC value)	*/
32525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi	syncxfer_t	sync_state;		/* sync xfer negotiation state		*/
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	disconnect_ok:1;	/* device can disconnect		*/
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } device[8];
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    unsigned long	busyluns[64 / sizeof(unsigned long)];/* array of bits indicating LUNs busy	*/
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /* DMA info */
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct {
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	free_addr;		/* next free address			*/
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	start_addr;		/* start address of current transfer	*/
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dmadir_t	direction;		/* dma direction			*/
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	transferred;		/* number of bytes transferred		*/
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	xfer_start;		/* scheduled DMA transfer start		*/
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int	xfer_length;		/* scheduled DMA transfer length	*/
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char		*xfer_ptr;		/* pointer to area			*/
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	xfer_required:1;	/* set if we need to transfer something	*/
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	xfer_setup:1;		/* set if DMA is setup			*/
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	xfer_done:1;		/* set if DMA reached end of BH list	*/
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } dma;
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /* card info */
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct {
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char	page_reg;		/* current setting of page reg		*/
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } card;
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    unsigned char status_ptr[9];
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    struct status_entry status[9][STATUS_BUFFER_SIZE];
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} AS_Host;
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* ACORNSCSI_H */
354