0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef ACORNSCSI_H
0010 #define ACORNSCSI_H
0011
0012
0013 #define SBIC_OWNID 0
0014 #define OWNID_FS1 (1<<7)
0015 #define OWNID_FS2 (1<<6)
0016 #define OWNID_EHP (1<<4)
0017 #define OWNID_EAF (1<<3)
0018
0019 #define SBIC_CTRL 1
0020 #define CTRL_DMAMODE (1<<7)
0021 #define CTRL_DMADBAMODE (1<<6)
0022 #define CTRL_DMABURST (1<<5)
0023 #define CTRL_DMAPOLLED 0
0024 #define CTRL_HHP (1<<4)
0025 #define CTRL_EDI (1<<3)
0026 #define CTRL_IDI (1<<2)
0027 #define CTRL_HA (1<<1)
0028 #define CTRL_HSP (1<<0)
0029
0030 #define SBIC_TIMEOUT 2
0031 #define SBIC_TOTSECTS 3
0032 #define SBIC_TOTHEADS 4
0033 #define SBIC_TOTCYLH 5
0034 #define SBIC_TOTCYLL 6
0035 #define SBIC_LOGADDRH 7
0036 #define SBIC_LOGADDRM2 8
0037 #define SBIC_LOGADDRM1 9
0038 #define SBIC_LOGADDRL 10
0039 #define SBIC_SECTORNUM 11
0040 #define SBIC_HEADNUM 12
0041 #define SBIC_CYLH 13
0042 #define SBIC_CYLL 14
0043 #define SBIC_TARGETLUN 15
0044 #define TARGETLUN_TLV (1<<7)
0045 #define TARGETLUN_DOK (1<<6)
0046
0047 #define SBIC_CMNDPHASE 16
0048 #define SBIC_SYNCHTRANSFER 17
0049 #define SYNCHTRANSFER_OF0 0x00
0050 #define SYNCHTRANSFER_OF1 0x01
0051 #define SYNCHTRANSFER_OF2 0x02
0052 #define SYNCHTRANSFER_OF3 0x03
0053 #define SYNCHTRANSFER_OF4 0x04
0054 #define SYNCHTRANSFER_OF5 0x05
0055 #define SYNCHTRANSFER_OF6 0x06
0056 #define SYNCHTRANSFER_OF7 0x07
0057 #define SYNCHTRANSFER_OF8 0x08
0058 #define SYNCHTRANSFER_OF9 0x09
0059 #define SYNCHTRANSFER_OF10 0x0A
0060 #define SYNCHTRANSFER_OF11 0x0B
0061 #define SYNCHTRANSFER_OF12 0x0C
0062 #define SYNCHTRANSFER_8DBA 0x00
0063 #define SYNCHTRANSFER_2DBA 0x20
0064 #define SYNCHTRANSFER_3DBA 0x30
0065 #define SYNCHTRANSFER_4DBA 0x40
0066 #define SYNCHTRANSFER_5DBA 0x50
0067 #define SYNCHTRANSFER_6DBA 0x60
0068 #define SYNCHTRANSFER_7DBA 0x70
0069
0070 #define SBIC_TRANSCNTH 18
0071 #define SBIC_TRANSCNTM 19
0072 #define SBIC_TRANSCNTL 20
0073 #define SBIC_DESTID 21
0074 #define DESTID_SCC (1<<7)
0075 #define DESTID_DPD (1<<6)
0076
0077 #define SBIC_SOURCEID 22
0078 #define SOURCEID_ER (1<<7)
0079 #define SOURCEID_ES (1<<6)
0080 #define SOURCEID_DSP (1<<5)
0081 #define SOURCEID_SIV (1<<4)
0082
0083 #define SBIC_SSR 23
0084 #define SBIC_CMND 24
0085 #define CMND_RESET 0x00
0086 #define CMND_ABORT 0x01
0087 #define CMND_ASSERTATN 0x02
0088 #define CMND_NEGATEACK 0x03
0089 #define CMND_DISCONNECT 0x04
0090 #define CMND_RESELECT 0x05
0091 #define CMND_SELWITHATN 0x06
0092 #define CMND_SELECT 0x07
0093 #define CMND_SELECTATNTRANSFER 0x08
0094 #define CMND_SELECTTRANSFER 0x09
0095 #define CMND_RESELECTRXDATA 0x0A
0096 #define CMND_RESELECTTXDATA 0x0B
0097 #define CMND_WAITFORSELRECV 0x0C
0098 #define CMND_SENDSTATCMD 0x0D
0099 #define CMND_SENDDISCONNECT 0x0E
0100 #define CMND_SETIDI 0x0F
0101 #define CMND_RECEIVECMD 0x10
0102 #define CMND_RECEIVEDTA 0x11
0103 #define CMND_RECEIVEMSG 0x12
0104 #define CMND_RECEIVEUSP 0x13
0105 #define CMND_SENDCMD 0x14
0106 #define CMND_SENDDATA 0x15
0107 #define CMND_SENDMSG 0x16
0108 #define CMND_SENDUSP 0x17
0109 #define CMND_TRANSLATEADDR 0x18
0110 #define CMND_XFERINFO 0x20
0111 #define CMND_SBT (1<<7)
0112
0113 #define SBIC_DATA 25
0114 #define SBIC_ASR 26
0115 #define ASR_INT (1<<7)
0116 #define ASR_LCI (1<<6)
0117 #define ASR_BSY (1<<5)
0118 #define ASR_CIP (1<<4)
0119 #define ASR_PE (1<<1)
0120 #define ASR_DBR (1<<0)
0121
0122
0123 #define DMAC_INIT 0x00
0124 #define INIT_8BIT (1)
0125
0126 #define DMAC_CHANNEL 0x80
0127 #define CHANNEL_0 0x00
0128 #define CHANNEL_1 0x01
0129 #define CHANNEL_2 0x02
0130 #define CHANNEL_3 0x03
0131
0132 #define DMAC_TXCNTLO 0x01
0133 #define DMAC_TXCNTHI 0x81
0134 #define DMAC_TXADRLO 0x02
0135 #define DMAC_TXADRMD 0x82
0136 #define DMAC_TXADRHI 0x03
0137
0138 #define DMAC_DEVCON0 0x04
0139 #define DEVCON0_AKL (1<<7)
0140 #define DEVCON0_RQL (1<<6)
0141 #define DEVCON0_EXW (1<<5)
0142 #define DEVCON0_ROT (1<<4)
0143 #define DEVCON0_CMP (1<<3)
0144 #define DEVCON0_DDMA (1<<2)
0145 #define DEVCON0_AHLD (1<<1)
0146 #define DEVCON0_MTM (1<<0)
0147
0148 #define DMAC_DEVCON1 0x84
0149 #define DEVCON1_WEV (1<<1)
0150 #define DEVCON1_BHLD (1<<0)
0151
0152 #define DMAC_MODECON 0x05
0153 #define MODECON_WOED 0x01
0154 #define MODECON_VERIFY 0x00
0155 #define MODECON_READ 0x04
0156 #define MODECON_WRITE 0x08
0157 #define MODECON_AUTOINIT 0x10
0158 #define MODECON_ADDRDIR 0x20
0159 #define MODECON_DEMAND 0x00
0160 #define MODECON_SINGLE 0x40
0161 #define MODECON_BLOCK 0x80
0162 #define MODECON_CASCADE 0xC0
0163
0164 #define DMAC_STATUS 0x85
0165 #define STATUS_TC0 (1<<0)
0166 #define STATUS_RQ0 (1<<4)
0167
0168 #define DMAC_TEMPLO 0x06
0169 #define DMAC_TEMPHI 0x86
0170 #define DMAC_REQREG 0x07
0171 #define DMAC_MASKREG 0x87
0172 #define MASKREG_M0 0x01
0173 #define MASKREG_M1 0x02
0174 #define MASKREG_M2 0x04
0175 #define MASKREG_M3 0x08
0176
0177
0178
0179 #define MASK_ON (MASKREG_M3|MASKREG_M2|MASKREG_M1|MASKREG_M0)
0180 #define MASK_OFF (MASKREG_M3|MASKREG_M2|MASKREG_M1)
0181
0182
0183
0184
0185 typedef enum {
0186 PHASE_IDLE,
0187 PHASE_CONNECTING,
0188 PHASE_CONNECTED,
0189 PHASE_MSGOUT,
0190 PHASE_RECONNECTED,
0191 PHASE_COMMANDPAUSED,
0192 PHASE_COMMAND,
0193 PHASE_DATAOUT,
0194 PHASE_DATAIN,
0195 PHASE_STATUSIN,
0196 PHASE_MSGIN,
0197 PHASE_DONE,
0198 PHASE_ABORTED,
0199 PHASE_DISCONNECT,
0200 } phase_t;
0201
0202
0203
0204
0205 typedef enum {
0206 INTR_IDLE,
0207 INTR_NEXT_COMMAND,
0208 INTR_PROCESSING,
0209 } intr_ret_t;
0210
0211
0212
0213
0214 typedef enum {
0215 DMA_OUT,
0216 DMA_IN
0217 } dmadir_t;
0218
0219
0220
0221
0222 typedef enum {
0223 SYNC_ASYNCHRONOUS,
0224 SYNC_NEGOCIATE,
0225 SYNC_SENT_REQUEST,
0226 SYNC_COMPLETED,
0227 } syncxfer_t;
0228
0229
0230
0231
0232 typedef enum {
0233 CMD_READ,
0234 CMD_WRITE,
0235 CMD_MISC,
0236 } cmdtype_t;
0237
0238
0239
0240
0241 typedef enum {
0242 DATADIR_IN,
0243 DATADIR_OUT
0244 } datadir_t;
0245
0246 #include "queue.h"
0247 #include "msgqueue.h"
0248
0249 #define STATUS_BUFFER_SIZE 32
0250
0251
0252
0253 struct status_entry {
0254 unsigned long when;
0255 unsigned char ssr;
0256 unsigned char ph;
0257 unsigned char irq;
0258 unsigned char unused;
0259 };
0260
0261 #define ADD_STATUS(_q,_ssr,_ph,_irq) \
0262 ({ \
0263 host->status[(_q)][host->status_ptr[(_q)]].when = jiffies; \
0264 host->status[(_q)][host->status_ptr[(_q)]].ssr = (_ssr); \
0265 host->status[(_q)][host->status_ptr[(_q)]].ph = (_ph); \
0266 host->status[(_q)][host->status_ptr[(_q)]].irq = (_irq); \
0267 host->status_ptr[(_q)] = (host->status_ptr[(_q)] + 1) & (STATUS_BUFFER_SIZE - 1); \
0268 })
0269
0270
0271
0272
0273 typedef struct acornscsi_hostdata {
0274
0275 struct Scsi_Host *host;
0276 struct scsi_cmnd *SCpnt;
0277 struct scsi_cmnd *origSCpnt;
0278 void __iomem *base;
0279 void __iomem *fast;
0280
0281
0282 struct {
0283 unsigned int irq;
0284 phase_t phase;
0285
0286 struct {
0287 unsigned char target;
0288 unsigned char lun;
0289 unsigned char tag;
0290 } reconnected;
0291
0292 struct scsi_pointer SCp;
0293
0294 MsgQueue_t msgs;
0295
0296 unsigned short last_message;
0297 unsigned char disconnectable:1;
0298 } scsi;
0299
0300
0301 struct {
0302 unsigned int queues;
0303 unsigned int removes;
0304 unsigned int fins;
0305 unsigned int reads;
0306 unsigned int writes;
0307 unsigned int miscs;
0308 unsigned int disconnects;
0309 unsigned int aborts;
0310 unsigned int resets;
0311 } stats;
0312
0313
0314 struct {
0315 Queue_t issue;
0316 Queue_t disconnected;
0317 } queues;
0318
0319
0320 struct {
0321 unsigned char sync_xfer;
0322 syncxfer_t sync_state;
0323 unsigned char disconnect_ok:1;
0324 } device[8];
0325 unsigned long busyluns[64 / sizeof(unsigned long)];
0326
0327
0328 struct {
0329 unsigned int free_addr;
0330 unsigned int start_addr;
0331 dmadir_t direction;
0332 unsigned int transferred;
0333 unsigned int xfer_start;
0334 unsigned int xfer_length;
0335 char *xfer_ptr;
0336 unsigned char xfer_required:1;
0337 unsigned char xfer_setup:1;
0338 unsigned char xfer_done:1;
0339 } dma;
0340
0341
0342 struct {
0343 unsigned char page_reg;
0344 } card;
0345
0346 unsigned char status_ptr[9];
0347 struct status_entry status[9][STATUS_BUFFER_SIZE];
0348 } AS_Host;
0349
0350 #endif