1 | /*=======================================================/ |
2 | Header file for nsp_cs.c |
3 | By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> |
4 | |
5 | Ver.1.0 : Cut unused lines. |
6 | Ver 0.1 : Initial version. |
7 | |
8 | This software may be used and distributed according to the terms of |
9 | the GNU General Public License. |
10 | |
11 | =========================================================*/ |
12 | |
13 | #ifndef __nsp_cs__ |
14 | #define __nsp_cs__ |
15 | |
16 | /* for debugging */ |
17 | //#define NSP_DEBUG 9 |
18 | |
19 | /* |
20 | #define static |
21 | #define inline |
22 | */ |
23 | |
24 | /************************************ |
25 | * Some useful macros... |
26 | */ |
27 | |
28 | /* SCSI initiator must be ID 7 */ |
29 | #define NSP_INITIATOR_ID 7 |
30 | |
31 | #define NSP_SELTIMEOUT 200 |
32 | |
33 | /*************************************************************************** |
34 | * register definitions |
35 | ***************************************************************************/ |
36 | /*======================================================================== |
37 | * base register |
38 | ========================================================================*/ |
39 | #define IRQCONTROL 0x00 /* R */ |
40 | # define IRQCONTROL_RESELECT_CLEAR BIT(0) |
41 | # define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1) |
42 | # define IRQCONTROL_TIMER_CLEAR BIT(2) |
43 | # define IRQCONTROL_FIFO_CLEAR BIT(3) |
44 | # define IRQCONTROL_ALLMASK 0xff |
45 | # define IRQCONTROL_ALLCLEAR (IRQCONTROL_RESELECT_CLEAR | \ |
46 | IRQCONTROL_PHASE_CHANGE_CLEAR | \ |
47 | IRQCONTROL_TIMER_CLEAR | \ |
48 | IRQCONTROL_FIFO_CLEAR ) |
49 | # define IRQCONTROL_IRQDISABLE 0xf0 |
50 | |
51 | #define IRQSTATUS 0x00 /* W */ |
52 | # define IRQSTATUS_SCSI BIT(0) |
53 | # define IRQSTATUS_TIMER BIT(2) |
54 | # define IRQSTATUS_FIFO BIT(3) |
55 | # define IRQSTATUS_MASK 0x0f |
56 | |
57 | #define IFSELECT 0x01 /* W */ |
58 | # define IF_IFSEL BIT(0) |
59 | # define IF_REGSEL BIT(2) |
60 | |
61 | #define FIFOSTATUS 0x01 /* R */ |
62 | # define FIFOSTATUS_CHIP_REVISION_MASK 0x0f |
63 | # define FIFOSTATUS_CHIP_ID_MASK 0x70 |
64 | # define FIFOSTATUS_FULL_EMPTY BIT(7) |
65 | |
66 | #define INDEXREG 0x02 /* R/W */ |
67 | #define DATAREG 0x03 /* R/W */ |
68 | #define FIFODATA 0x04 /* R/W */ |
69 | #define FIFODATA1 0x05 /* R/W */ |
70 | #define FIFODATA2 0x06 /* R/W */ |
71 | #define FIFODATA3 0x07 /* R/W */ |
72 | |
73 | /*==================================================================== |
74 | * indexed register |
75 | ====================================================================*/ |
76 | #define EXTBUSCTRL 0x10 /* R/W,deleted */ |
77 | |
78 | #define CLOCKDIV 0x11 /* R/W */ |
79 | # define CLOCK_40M 0x02 |
80 | # define CLOCK_20M 0x01 |
81 | # define FAST_20 BIT(2) |
82 | |
83 | #define TERMPWRCTRL 0x13 /* R/W */ |
84 | # define POWER_ON BIT(0) |
85 | |
86 | #define SCSIIRQMODE 0x15 /* R/W */ |
87 | # define SCSI_PHASE_CHANGE_EI BIT(0) |
88 | # define RESELECT_EI BIT(4) |
89 | # define FIFO_IRQ_EI BIT(5) |
90 | # define SCSI_RESET_IRQ_EI BIT(6) |
91 | |
92 | #define IRQPHASESENCE 0x16 /* R */ |
93 | # define LATCHED_MSG BIT(0) |
94 | # define LATCHED_IO BIT(1) |
95 | # define LATCHED_CD BIT(2) |
96 | # define LATCHED_BUS_FREE BIT(3) |
97 | # define PHASE_CHANGE_IRQ BIT(4) |
98 | # define RESELECT_IRQ BIT(5) |
99 | # define FIFO_IRQ BIT(6) |
100 | # define SCSI_RESET_IRQ BIT(7) |
101 | |
102 | #define TIMERCOUNT 0x17 /* R/W */ |
103 | |
104 | #define SCSIBUSCTRL 0x18 /* R/W */ |
105 | # define SCSI_SEL BIT(0) |
106 | # define SCSI_RST BIT(1) |
107 | # define SCSI_DATAOUT_ENB BIT(2) |
108 | # define SCSI_ATN BIT(3) |
109 | # define SCSI_ACK BIT(4) |
110 | # define SCSI_BSY BIT(5) |
111 | # define AUTODIRECTION BIT(6) |
112 | # define ACKENB BIT(7) |
113 | |
114 | #define SCSIBUSMON 0x19 /* R */ |
115 | |
116 | #define SETARBIT 0x1A /* W */ |
117 | # define ARBIT_GO BIT(0) |
118 | # define ARBIT_FLAG_CLEAR BIT(1) |
119 | |
120 | #define ARBITSTATUS 0x1A /* R */ |
121 | /*# define ARBIT_GO BIT(0)*/ |
122 | # define ARBIT_WIN BIT(1) |
123 | # define ARBIT_FAIL BIT(2) |
124 | # define RESELECT_FLAG BIT(3) |
125 | |
126 | #define PARITYCTRL 0x1B /* W */ |
127 | #define PARITYSTATUS 0x1B /* R */ |
128 | |
129 | #define COMMANDCTRL 0x1C /* W */ |
130 | # define CLEAR_COMMAND_POINTER BIT(0) |
131 | # define AUTO_COMMAND_GO BIT(1) |
132 | |
133 | #define RESELECTID 0x1C /* R */ |
134 | #define COMMANDDATA 0x1D /* R/W */ |
135 | |
136 | #define POINTERCLR 0x1E /* W */ |
137 | # define POINTER_CLEAR BIT(0) |
138 | # define ACK_COUNTER_CLEAR BIT(1) |
139 | # define REQ_COUNTER_CLEAR BIT(2) |
140 | # define HOST_COUNTER_CLEAR BIT(3) |
141 | # define READ_SOURCE (BIT(4) | BIT(5)) |
142 | # define ACK_COUNTER (0) |
143 | # define REQ_COUNTER (BIT(4)) |
144 | # define HOST_COUNTER (BIT(5)) |
145 | |
146 | #define TRANSFERCOUNT 0x1E /* R */ |
147 | |
148 | #define TRANSFERMODE 0x20 /* R/W */ |
149 | # define MODE_MEM8 BIT(0) |
150 | # define MODE_MEM32 BIT(1) |
151 | # define MODE_ADR24 BIT(2) |
152 | # define MODE_ADR32 BIT(3) |
153 | # define MODE_IO8 BIT(4) |
154 | # define MODE_IO32 BIT(5) |
155 | # define TRANSFER_GO BIT(6) |
156 | # define BRAIND BIT(7) |
157 | |
158 | #define SYNCREG 0x21 /* R/W */ |
159 | # define SYNCREG_OFFSET_MASK 0x0f |
160 | # define SYNCREG_PERIOD_MASK 0xf0 |
161 | # define SYNCREG_PERIOD_SHIFT 4 |
162 | |
163 | #define SCSIDATALATCH 0x22 /* W */ |
164 | #define SCSIDATAIN 0x22 /* R */ |
165 | #define SCSIDATAWITHACK 0x23 /* R/W */ |
166 | #define SCAMCONTROL 0x24 /* W */ |
167 | #define SCAMSTATUS 0x24 /* R */ |
168 | #define SCAMDATA 0x25 /* R/W */ |
169 | |
170 | #define OTHERCONTROL 0x26 /* R/W */ |
171 | # define TPL_ROM_WRITE_EN BIT(0) |
172 | # define TPWR_OUT BIT(1) |
173 | # define TPWR_SENSE BIT(2) |
174 | # define RA8_CONTROL BIT(3) |
175 | |
176 | #define ACKWIDTH 0x27 /* R/W */ |
177 | #define CLRTESTPNT 0x28 /* W */ |
178 | #define ACKCNTLD 0x29 /* W */ |
179 | #define REQCNTLD 0x2A /* W */ |
180 | #define HSTCNTLD 0x2B /* W */ |
181 | #define CHECKSUM 0x2C /* R/W */ |
182 | |
183 | /************************************************************************ |
184 | * Input status bit definitions. |
185 | ************************************************************************/ |
186 | #define S_MESSAGE BIT(0) /* Message line from SCSI bus */ |
187 | #define S_IO BIT(1) /* Input/Output line from SCSI bus */ |
188 | #define S_CD BIT(2) /* Command/Data line from SCSI bus */ |
189 | #define S_BUSY BIT(3) /* Busy line from SCSI bus */ |
190 | #define S_ACK BIT(4) /* Acknowledge line from SCSI bus */ |
191 | #define S_REQUEST BIT(5) /* Request line from SCSI bus */ |
192 | #define S_SELECT BIT(6) /* */ |
193 | #define S_ATN BIT(7) /* */ |
194 | |
195 | /*********************************************************************** |
196 | * Useful Bus Monitor status combinations. |
197 | ***********************************************************************/ |
198 | #define BUSMON_SEL S_SELECT |
199 | #define BUSMON_BSY S_BUSY |
200 | #define BUSMON_REQ S_REQUEST |
201 | #define BUSMON_IO S_IO |
202 | #define BUSMON_ACK S_ACK |
203 | #define BUSMON_BUS_FREE 0 |
204 | #define BUSMON_COMMAND ( S_BUSY | S_CD | S_REQUEST ) |
205 | #define BUSMON_MESSAGE_IN ( S_BUSY | S_CD | S_IO | S_MESSAGE | S_REQUEST ) |
206 | #define BUSMON_MESSAGE_OUT ( S_BUSY | S_CD | S_MESSAGE | S_REQUEST ) |
207 | #define BUSMON_DATA_IN ( S_BUSY | S_IO | S_REQUEST ) |
208 | #define BUSMON_DATA_OUT ( S_BUSY | S_REQUEST ) |
209 | #define BUSMON_STATUS ( S_BUSY | S_CD | S_IO | S_REQUEST ) |
210 | #define BUSMON_SELECT ( S_IO | S_SELECT ) |
211 | #define BUSMON_RESELECT ( S_IO | S_SELECT ) |
212 | #define BUSMON_PHASE_MASK ( S_CD | S_IO | S_MESSAGE | S_SELECT ) |
213 | |
214 | #define BUSPHASE_SELECT ( BUSMON_SELECT & BUSMON_PHASE_MASK ) |
215 | #define BUSPHASE_COMMAND ( BUSMON_COMMAND & BUSMON_PHASE_MASK ) |
216 | #define BUSPHASE_MESSAGE_IN ( BUSMON_MESSAGE_IN & BUSMON_PHASE_MASK ) |
217 | #define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK ) |
218 | #define BUSPHASE_DATA_IN ( BUSMON_DATA_IN & BUSMON_PHASE_MASK ) |
219 | #define BUSPHASE_DATA_OUT ( BUSMON_DATA_OUT & BUSMON_PHASE_MASK ) |
220 | #define BUSPHASE_STATUS ( BUSMON_STATUS & BUSMON_PHASE_MASK ) |
221 | |
222 | /*====================================================================*/ |
223 | |
224 | typedef struct scsi_info_t { |
225 | struct pcmcia_device *p_dev; |
226 | struct Scsi_Host *host; |
227 | int stop; |
228 | } scsi_info_t; |
229 | |
230 | |
231 | /* synchronous transfer negotiation data */ |
232 | typedef struct _sync_data { |
233 | unsigned int SyncNegotiation; |
234 | #define SYNC_NOT_YET 0 |
235 | #define SYNC_OK 1 |
236 | #define SYNC_NG 2 |
237 | |
238 | unsigned int SyncPeriod; |
239 | unsigned int SyncOffset; |
240 | unsigned char SyncRegister; |
241 | unsigned char AckWidth; |
242 | } sync_data; |
243 | |
244 | typedef struct _nsp_hw_data { |
245 | unsigned int BaseAddress; |
246 | unsigned int NumAddress; |
247 | unsigned int IrqNumber; |
248 | |
249 | unsigned long MmioAddress; |
250 | #define NSP_MMIO_OFFSET 0x0800 |
251 | unsigned long MmioLength; |
252 | |
253 | unsigned char ScsiClockDiv; |
254 | |
255 | unsigned char TransferMode; |
256 | |
257 | int TimerCount; |
258 | int SelectionTimeOut; |
259 | struct scsi_cmnd *CurrentSC; |
260 | //int CurrnetTarget; |
261 | |
262 | int FifoCount; |
263 | |
264 | #define MSGBUF_SIZE 20 |
265 | unsigned char MsgBuffer[MSGBUF_SIZE]; |
266 | int MsgLen; |
267 | |
268 | #define N_TARGET 8 |
269 | sync_data Sync[N_TARGET]; |
270 | |
271 | char nspinfo[110]; /* description */ |
272 | spinlock_t Lock; |
273 | |
274 | scsi_info_t *ScsiInfo; /* attach <-> detect glue */ |
275 | |
276 | |
277 | #ifdef NSP_DEBUG |
278 | int CmdId; /* Accepted command serial number. |
279 | Used for debugging. */ |
280 | #endif |
281 | } nsp_hw_data; |
282 | |
283 | /**************************************************************************** |
284 | * |
285 | */ |
286 | |
287 | /* Card service functions */ |
288 | static void nsp_cs_detach (struct pcmcia_device *p_dev); |
289 | static void nsp_cs_release(struct pcmcia_device *link); |
290 | static int nsp_cs_config (struct pcmcia_device *link); |
291 | |
292 | /* Linux SCSI subsystem specific functions */ |
293 | static struct Scsi_Host *nsp_detect (struct scsi_host_template *sht); |
294 | static const char *nsp_info (struct Scsi_Host *shpnt); |
295 | static int nsp_show_info (struct seq_file *m, |
296 | struct Scsi_Host *host); |
297 | static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt); |
298 | |
299 | /* Error handler */ |
300 | /*static int nsp_eh_abort (struct scsi_cmnd *SCpnt);*/ |
301 | /*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/ |
302 | static int nsp_eh_bus_reset (struct scsi_cmnd *SCpnt); |
303 | static int nsp_eh_host_reset (struct scsi_cmnd *SCpnt); |
304 | static int nsp_bus_reset (nsp_hw_data *data); |
305 | |
306 | /* */ |
307 | static void nsphw_init (nsp_hw_data *data); |
308 | static bool nsphw_start_selection(struct scsi_cmnd *SCpnt); |
309 | static void nsp_start_timer (struct scsi_cmnd *SCpnt, int time); |
310 | static int nsp_fifo_count (struct scsi_cmnd *SCpnt); |
311 | static void nsp_pio_read (struct scsi_cmnd *SCpnt); |
312 | static void nsp_pio_write (struct scsi_cmnd *SCpnt); |
313 | static int nsp_nexus (struct scsi_cmnd *SCpnt); |
314 | static void nsp_scsi_done (struct scsi_cmnd *SCpnt); |
315 | static int nsp_analyze_sdtr (struct scsi_cmnd *SCpnt); |
316 | static int nsp_negate_signal (struct scsi_cmnd *SCpnt, |
317 | unsigned char mask, char *str); |
318 | static int nsp_expect_signal (struct scsi_cmnd *SCpnt, |
319 | unsigned char current_phase, |
320 | unsigned char mask); |
321 | static int nsp_xfer (struct scsi_cmnd *SCpnt, int phase); |
322 | static int nsp_dataphase_bypass (struct scsi_cmnd *SCpnt); |
323 | static void nsp_reselected (struct scsi_cmnd *SCpnt); |
324 | static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht); |
325 | |
326 | /* Interrupt handler */ |
327 | //static irqreturn_t nspintr(int irq, void *dev_id); |
328 | |
329 | /* Debug */ |
330 | #ifdef NSP_DEBUG |
331 | static void show_command (struct scsi_cmnd *SCpnt); |
332 | static void show_phase (struct scsi_cmnd *SCpnt); |
333 | static void show_busphase(unsigned char stat); |
334 | static void show_message (nsp_hw_data *data); |
335 | #else |
336 | # define show_command(ptr) /* */ |
337 | # define show_phase(SCpnt) /* */ |
338 | # define show_busphase(stat) /* */ |
339 | # define show_message(data) /* */ |
340 | #endif |
341 | |
342 | /* |
343 | * SCSI phase |
344 | */ |
345 | enum _scsi_phase { |
346 | PH_UNDETERMINED , |
347 | PH_ARBSTART , |
348 | PH_SELSTART , |
349 | PH_SELECTED , |
350 | PH_COMMAND , |
351 | PH_DATA , |
352 | PH_STATUS , |
353 | PH_MSG_IN , |
354 | PH_MSG_OUT , |
355 | PH_DISCONNECT , |
356 | PH_RESELECT , |
357 | PH_ABORT , |
358 | PH_RESET |
359 | }; |
360 | |
361 | enum _data_in_out { |
362 | IO_UNKNOWN, |
363 | IO_IN, |
364 | IO_OUT |
365 | }; |
366 | |
367 | enum _burst_mode { |
368 | BURST_IO8 = 0, |
369 | BURST_IO32 = 1, |
370 | BURST_MEM32 = 2, |
371 | }; |
372 | |
373 | /* scatter-gather table */ |
374 | #define BUFFER_ADDR(SCpnt) ((char *)(sg_virt(nsp_priv(SCpnt)->buffer))) |
375 | |
376 | #endif /*__nsp_cs__*/ |
377 | /* end */ |
378 | |