1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
|
/*
* mac53c94.h: definitions for the driver for the 53c94 SCSI bus adaptor
* found on Power Macintosh computers, controlling the external SCSI chain.
*
* Copyright (C) 1996 Paul Mackerras.
*/
#ifndef _MAC53C94_H
#define _MAC53C94_H
extern struct proc_dir_entry proc_scsi_mac53c94;
int mac53c94_detect(Scsi_Host_Template *);
int mac53c94_command(Scsi_Cmnd *);
int mac53c94_queue(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int mac53c94_abort(Scsi_Cmnd *);
int mac53c94_reset(Scsi_Cmnd *, unsigned int);
#define SCSI_MAC53C94 { \
NULL, /* next */ \
NULL, /* usage_count */ \
&proc_scsi_mac53c94, /* proc_dir */ \
NULL, /* proc_info */ \
"53C94", /* name */ \
mac53c94_detect, /* detect */ \
NULL, /* release */ \
NULL, /* info */ \
mac53c94_command, /* command */ \
mac53c94_queue, /* queuecommand */ \
mac53c94_abort, /* abort */ \
mac53c94_reset, /* reset */ \
NULL, /* slave_attach */ \
NULL, /* bios_param */ \
1, /* can_queue */ \
7, /* this_id */ \
SG_ALL, /* sg_tablesize */ \
1, /* cmd_per_lun */ \
0, /* present */ \
0, /* unchecked_isa_dma */ \
DISABLE_CLUSTERING, /* use_clustering */ \
}
/*
* Registers in the 53C94 controller.
*/
struct mac53c94_regs {
unsigned char count_lo;
char pad0[15];
unsigned char count_mid;
char pad1[15];
unsigned char fifo;
char pad2[15];
unsigned char command;
char pad3[15];
unsigned char status;
char pad4[15];
unsigned char interrupt;
char pad5[15];
unsigned char seqstep;
char pad6[15];
unsigned char flags;
char pad7[15];
unsigned char config1;
char pad8[15];
unsigned char clk_factor;
char pad9[15];
unsigned char test;
char pad10[15];
unsigned char config2;
char pad11[15];
unsigned char config3;
char pad12[15];
unsigned char config4;
char pad13[15];
unsigned char count_hi;
char pad14[15];
unsigned char fifo_res;
char pad15[15];
};
/*
* Alternate functions for some registers.
*/
#define dest_id status
#define sel_timeout interrupt
#define sync_period seqstep
#define sync_offset flags
/*
* Bits in command register.
*/
#define CMD_DMA_MODE 0x80
#define CMD_MODE_MASK 0x70
#define CMD_MODE_INIT 0x10
#define CMD_MODE_TARG 0x20
#define CMD_MODE_DISC 0x40
#define CMD_NOP 0
#define CMD_FLUSH 1
#define CMD_RESET 2
#define CMD_SCSI_RESET 3
#define CMD_XFER_DATA 0x10
#define CMD_I_COMPLETE 0x11
#define CMD_ACCEPT_MSG 0x12
#define CMD_XFER_PAD 0x18
#define CMD_SET_ATN 0x1a
#define CMD_CLR_ATN 0x1b
#define CMD_SEND_MSG 0x20
#define CMD_SEND_STATUS 0x21
#define CMD_SEND_DATA 0x22
#define CMD_DISC_SEQ 0x23
#define CMD_TERMINATE 0x24
#define CMD_T_COMPLETE 0x25
#define CMD_DISCONNECT 0x27
#define CMD_RECV_MSG 0x28
#define CMD_RECV_CDB 0x29
#define CMD_RECV_DATA 0x2a
#define CMD_RECV_CMD 0x2b
#define CMD_ABORT_DMA 0x04
#define CMD_RESELECT 0x40
#define CMD_SELECT 0x41
#define CMD_SELECT_ATN 0x42
#define CMD_SELATN_STOP 0x43
#define CMD_ENABLE_SEL 0x44
#define CMD_DISABLE_SEL 0x45
#define CMD_SEL_ATN3 0x46
#define CMD_RESEL_ATN3 0x47
/*
* Bits in status register.
*/
#define STAT_IRQ 0x80
#define STAT_ERROR 0x40
#define STAT_PARITY 0x20
#define STAT_TC_ZERO 0x10
#define STAT_DONE 0x08
#define STAT_PHASE 0x07
#define STAT_MSG 0x04
#define STAT_CD 0x02
#define STAT_IO 0x01
/*
* Bits in interrupt register.
*/
#define INTR_RESET 0x80 /* SCSI bus was reset */
#define INTR_ILL_CMD 0x40 /* illegal command */
#define INTR_DISCONNECT 0x20 /* we got disconnected */
#define INTR_BUS_SERV 0x10 /* bus service requested */
#define INTR_DONE 0x08 /* function completed */
#define INTR_RESELECTED 0x04 /* we were reselected */
#define INTR_SEL_ATN 0x02 /* we were selected, ATN asserted */
#define INTR_SELECT 0x01 /* we were selected, ATN negated */
/*
* Encoding for the select timeout.
*/
#define TIMO_VAL(x) ((x) * 5000 / 7682)
/*
* Bits in sequence step register.
*/
#define SS_MASK 7
#define SS_ARB_SEL 0 /* Selection & arbitration complete */
#define SS_MSG_SENT 1 /* One message byte sent */
#define SS_NOT_CMD 2 /* Not in command phase */
#define SS_PHASE_CHG 3 /* Early phase change, cmd bytes lost */
#define SS_DONE 4 /* Command was sent OK */
/*
* Encoding for sync transfer period.
*/
#define SYNCP_MASK 0x1f
#define SYNCP_MIN 4
#define SYNCP_MAX 31
/*
* Bits in flags register.
*/
#define FLAGS_FIFO_LEV 0x1f
#define FLAGS_SEQ_STEP 0xe0
/*
* Encoding for sync offset.
*/
#define SYNCO_MASK 0x0f
#define SYNCO_ASS_CTRL 0x30 /* REQ/ACK assertion control */
#define SYNCO_NEG_CTRL 0xc0 /* REQ/ACK negation control */
/*
* Bits in config1 register.
*/
#define CF1_SLOW_CABLE 0x80 /* Slow cable mode */
#define CF1_NO_RES_REP 0x40 /* Disable SCSI reset reports */
#define CF1_PAR_TEST 0x20 /* Parity test mode enable */
#define CF1_PAR_ENABLE 0x10 /* Enable parity checks */
#define CF1_TEST 0x08 /* Chip tests */
#define CF1_MY_ID 0x07 /* Controller's address on bus */
/*
* Encoding for clk_factor register.
*/
#define CLKF_MASK 7
#define CLKF_VAL(freq) ((((freq) + 4999999) / 5000000) & CLKF_MASK)
/*
* Bits in test mode register.
*/
#define TEST_TARGET 1 /* target test mode */
#define TEST_INITIATOR 2 /* initiator test mode */
#define TEST_TRISTATE 4 /* tristate (hi-z) test mode */
/*
* Bits in config2 register.
*/
#define CF2_RFB 0x80
#define CF2_FEATURE_EN 0x40 /* enable features / phase latch */
#define CF2_BYTECTRL 0x20
#define CF2_DREQ_HIZ 0x10
#define CF2_SCSI2 0x08
#define CF2_PAR_ABORT 0x04 /* bad parity target abort */
#define CF2_REG_PARERR 0x02 /* register parity error */
#define CF2_DMA_PARERR 0x01 /* DMA parity error */
/*
* Bits in the config3 register.
*/
#define CF3_ID_MSG_CHK 0x80
#define CF3_3B_MSGS 0x40
#define CF3_CDB10 0x20
#define CF3_FASTSCSI 0x10 /* enable fast SCSI support */
#define CF3_FASTCLOCK 0x08
#define CF3_SAVERESID 0x04
#define CF3_ALT_DMA 0x02
#define CF3_THRESH_8 0x01
/*
* Bits in the config4 register.
*/
#define CF4_EAN 0x04
#define CF4_TEST 0x02
#define CF4_BBTE 0x01
#endif /* _MAC53C94_H */
|