xref: /openbmc/linux/drivers/scsi/pcmcia/nsp_cs.c (revision 31eeb6b0)
1 /*======================================================================
2 
3     NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver
4       By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
5 
6     Ver.2.8   Support 32bit MMIO mode
7               Support Synchronous Data Transfer Request (SDTR) mode
8     Ver.2.0   Support 32bit PIO mode
9     Ver.1.1.2 Fix for scatter list buffer exceeds
10     Ver.1.1   Support scatter list
11     Ver.0.1   Initial version
12 
13     This software may be used and distributed according to the terms of
14     the GNU General Public License.
15 
16 ======================================================================*/
17 
18 /***********************************************************************
19     This driver is for these PCcards.
20 
21 	I-O DATA PCSC-F	 (Workbit NinjaSCSI-3)
22 			"WBT", "NinjaSCSI-3", "R1.0"
23 	I-O DATA CBSC-II (Workbit NinjaSCSI-32Bi in 16bit mode)
24 			"IO DATA", "CBSC16	 ", "1"
25 
26 ***********************************************************************/
27 
28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/init.h>
31 #include <linux/slab.h>
32 #include <linux/string.h>
33 #include <linux/timer.h>
34 #include <linux/ioport.h>
35 #include <linux/delay.h>
36 #include <linux/interrupt.h>
37 #include <linux/major.h>
38 #include <linux/blkdev.h>
39 #include <linux/stat.h>
40 
41 #include <asm/io.h>
42 #include <asm/irq.h>
43 
44 #include <../drivers/scsi/scsi.h>
45 #include <scsi/scsi_host.h>
46 
47 #include <scsi/scsi.h>
48 #include <scsi/scsi_ioctl.h>
49 
50 #include <pcmcia/cistpl.h>
51 #include <pcmcia/cisreg.h>
52 #include <pcmcia/ds.h>
53 
54 #include "nsp_cs.h"
55 
56 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
57 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
58 MODULE_LICENSE("GPL");
59 
60 #include "nsp_io.h"
61 
62 /*====================================================================*/
63 /* Parameters that can be set with 'insmod' */
64 
65 static int       nsp_burst_mode = BURST_MEM32;
66 module_param(nsp_burst_mode, int, 0);
67 MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
68 
69 /* Release IO ports after configuration? */
70 static bool       free_ports = 0;
71 module_param(free_ports, bool, 0);
72 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
73 
74 static struct scsi_host_template nsp_driver_template = {
75 	.proc_name	         = "nsp_cs",
76 	.show_info		 = nsp_show_info,
77 	.name			 = "WorkBit NinjaSCSI-3/32Bi(16bit)",
78 	.info			 = nsp_info,
79 	.queuecommand		 = nsp_queuecommand,
80 /*	.eh_abort_handler	 = nsp_eh_abort,*/
81 	.eh_bus_reset_handler	 = nsp_eh_bus_reset,
82 	.eh_host_reset_handler	 = nsp_eh_host_reset,
83 	.can_queue		 = 1,
84 	.this_id		 = NSP_INITIATOR_ID,
85 	.sg_tablesize		 = SG_ALL,
86 	.dma_boundary		 = PAGE_SIZE - 1,
87 };
88 
89 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
90 
91 
92 
93 /*
94  * debug, error print
95  */
96 #ifndef NSP_DEBUG
97 # define NSP_DEBUG_MASK		0x000000
98 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
99 # define nsp_dbg(mask, args...) /* */
100 #else
101 # define NSP_DEBUG_MASK		0xffffff
102 # define nsp_msg(type, args...) \
103 	nsp_cs_message (__func__, __LINE__, (type), args)
104 # define nsp_dbg(mask, args...) \
105 	nsp_cs_dmessage(__func__, __LINE__, (mask), args)
106 #endif
107 
108 #define NSP_DEBUG_QUEUECOMMAND		BIT(0)
109 #define NSP_DEBUG_REGISTER		BIT(1)
110 #define NSP_DEBUG_AUTOSCSI		BIT(2)
111 #define NSP_DEBUG_INTR			BIT(3)
112 #define NSP_DEBUG_SGLIST		BIT(4)
113 #define NSP_DEBUG_BUSFREE		BIT(5)
114 #define NSP_DEBUG_CDB_CONTENTS		BIT(6)
115 #define NSP_DEBUG_RESELECTION		BIT(7)
116 #define NSP_DEBUG_MSGINOCCUR		BIT(8)
117 #define NSP_DEBUG_EEPROM		BIT(9)
118 #define NSP_DEBUG_MSGOUTOCCUR		BIT(10)
119 #define NSP_DEBUG_BUSRESET		BIT(11)
120 #define NSP_DEBUG_RESTART		BIT(12)
121 #define NSP_DEBUG_SYNC			BIT(13)
122 #define NSP_DEBUG_WAIT			BIT(14)
123 #define NSP_DEBUG_TARGETFLAG		BIT(15)
124 #define NSP_DEBUG_PROC			BIT(16)
125 #define NSP_DEBUG_INIT			BIT(17)
126 #define NSP_DEBUG_DATA_IO      		BIT(18)
127 #define NSP_SPECIAL_PRINT_REGISTER	BIT(20)
128 
129 #define NSP_DEBUG_BUF_LEN		150
130 
131 static inline void nsp_inc_resid(struct scsi_cmnd *SCpnt, int residInc)
132 {
133 	scsi_set_resid(SCpnt, scsi_get_resid(SCpnt) + residInc);
134 }
135 
136 __printf(4, 5)
137 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
138 {
139 	va_list args;
140 	char buf[NSP_DEBUG_BUF_LEN];
141 
142 	va_start(args, fmt);
143 	vsnprintf(buf, sizeof(buf), fmt, args);
144 	va_end(args);
145 
146 #ifndef NSP_DEBUG
147 	printk("%snsp_cs: %s\n", type, buf);
148 #else
149 	printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
150 #endif
151 }
152 
153 #ifdef NSP_DEBUG
154 static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
155 {
156 	va_list args;
157 	char buf[NSP_DEBUG_BUF_LEN];
158 
159 	va_start(args, fmt);
160 	vsnprintf(buf, sizeof(buf), fmt, args);
161 	va_end(args);
162 
163 	if (mask & NSP_DEBUG_MASK) {
164 		printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
165 	}
166 }
167 #endif
168 
169 /***********************************************************/
170 
171 /*====================================================
172  * Clenaup parameters and call done() functions.
173  * You must be set SCpnt->result before call this function.
174  */
175 static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
176 {
177 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
178 
179 	data->CurrentSC = NULL;
180 
181 	scsi_done(SCpnt);
182 }
183 
184 static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt)
185 {
186 #ifdef NSP_DEBUG
187 	/*unsigned int host_id = SCpnt->device->host->this_id;*/
188 	/*unsigned int base    = SCpnt->device->host->io_port;*/
189 	unsigned char target = scmd_id(SCpnt);
190 #endif
191 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
192 
193 	nsp_dbg(NSP_DEBUG_QUEUECOMMAND,
194 		"SCpnt=0x%p target=%d lun=%llu sglist=0x%p bufflen=%d sg_count=%d",
195 		SCpnt, target, SCpnt->device->lun, scsi_sglist(SCpnt),
196 		scsi_bufflen(SCpnt), scsi_sg_count(SCpnt));
197 	//nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
198 
199 	if (data->CurrentSC != NULL) {
200 		nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
201 		SCpnt->result   = DID_BAD_TARGET << 16;
202 		nsp_scsi_done(SCpnt);
203 		return 0;
204 	}
205 
206 #if 0
207 	/* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
208 	        This makes kernel crash when suspending... */
209 	if (data->ScsiInfo->stop != 0) {
210 		nsp_msg(KERN_INFO, "suspending device. reject command.");
211 		SCpnt->result  = DID_BAD_TARGET << 16;
212 		nsp_scsi_done(SCpnt);
213 		return SCSI_MLQUEUE_HOST_BUSY;
214 	}
215 #endif
216 
217 	show_command(SCpnt);
218 
219 	data->CurrentSC		= SCpnt;
220 
221 	SCpnt->SCp.Status	= SAM_STAT_CHECK_CONDITION;
222 	SCpnt->SCp.Message	= 0;
223 	SCpnt->SCp.have_data_in = IO_UNKNOWN;
224 	SCpnt->SCp.sent_command = 0;
225 	SCpnt->SCp.phase	= PH_UNDETERMINED;
226 	scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
227 
228 	/* setup scratch area
229 	   SCp.ptr		: buffer pointer
230 	   SCp.this_residual	: buffer length
231 	   SCp.buffer		: next buffer
232 	   SCp.buffers_residual : left buffers in list
233 	   SCp.phase		: current state of the command */
234 	if (scsi_bufflen(SCpnt)) {
235 		SCpnt->SCp.buffer	    = scsi_sglist(SCpnt);
236 		SCpnt->SCp.ptr		    = BUFFER_ADDR;
237 		SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
238 		SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
239 	} else {
240 		SCpnt->SCp.ptr		    = NULL;
241 		SCpnt->SCp.this_residual    = 0;
242 		SCpnt->SCp.buffer	    = NULL;
243 		SCpnt->SCp.buffers_residual = 0;
244 	}
245 
246 	if (nsphw_start_selection(SCpnt) == FALSE) {
247 		nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
248 		SCpnt->result   = DID_BUS_BUSY << 16;
249 		nsp_scsi_done(SCpnt);
250 		return 0;
251 	}
252 
253 
254 	//nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
255 #ifdef NSP_DEBUG
256 	data->CmdId++;
257 #endif
258 	return 0;
259 }
260 
261 static DEF_SCSI_QCMD(nsp_queuecommand)
262 
263 /*
264  * setup PIO FIFO transfer mode and enable/disable to data out
265  */
266 static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
267 {
268 	unsigned int  base = data->BaseAddress;
269 	unsigned char transfer_mode_reg;
270 
271 	//nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
272 
273 	if (enabled != FALSE) {
274 		transfer_mode_reg = TRANSFER_GO | BRAIND;
275 	} else {
276 		transfer_mode_reg = 0;
277 	}
278 
279 	transfer_mode_reg |= data->TransferMode;
280 
281 	nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
282 }
283 
284 static void nsphw_init_sync(nsp_hw_data *data)
285 {
286 	sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
287 			       .SyncPeriod      = 0,
288 			       .SyncOffset      = 0
289 	};
290 	int i;
291 
292 	/* setup sync data */
293 	for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
294 		data->Sync[i] = tmp_sync;
295 	}
296 }
297 
298 /*
299  * Initialize Ninja hardware
300  */
301 static int nsphw_init(nsp_hw_data *data)
302 {
303 	unsigned int base     = data->BaseAddress;
304 
305 	nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
306 
307 	data->ScsiClockDiv = CLOCK_40M | FAST_20;
308 	data->CurrentSC    = NULL;
309 	data->FifoCount    = 0;
310 	data->TransferMode = MODE_IO8;
311 
312 	nsphw_init_sync(data);
313 
314 	/* block all interrupts */
315 	nsp_write(base,	      IRQCONTROL,   IRQCONTROL_ALLMASK);
316 
317 	/* setup SCSI interface */
318 	nsp_write(base,	      IFSELECT,	    IF_IFSEL);
319 
320 	nsp_index_write(base, SCSIIRQMODE,  0);
321 
322 	nsp_index_write(base, TRANSFERMODE, MODE_IO8);
323 	nsp_index_write(base, CLOCKDIV,	    data->ScsiClockDiv);
324 
325 	nsp_index_write(base, PARITYCTRL,   0);
326 	nsp_index_write(base, POINTERCLR,   POINTER_CLEAR     |
327 					    ACK_COUNTER_CLEAR |
328 					    REQ_COUNTER_CLEAR |
329 					    HOST_COUNTER_CLEAR);
330 
331 	/* setup fifo asic */
332 	nsp_write(base,	      IFSELECT,	    IF_REGSEL);
333 	nsp_index_write(base, TERMPWRCTRL,  0);
334 	if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
335 		nsp_msg(KERN_INFO, "terminator power on");
336 		nsp_index_write(base, TERMPWRCTRL, POWER_ON);
337 	}
338 
339 	nsp_index_write(base, TIMERCOUNT,   0);
340 	nsp_index_write(base, TIMERCOUNT,   0); /* requires 2 times!! */
341 
342 	nsp_index_write(base, SYNCREG,	    0);
343 	nsp_index_write(base, ACKWIDTH,	    0);
344 
345 	/* enable interrupts and ack them */
346 	nsp_index_write(base, SCSIIRQMODE,  SCSI_PHASE_CHANGE_EI |
347 					    RESELECT_EI		 |
348 					    SCSI_RESET_IRQ_EI	 );
349 	nsp_write(base,	      IRQCONTROL,   IRQCONTROL_ALLCLEAR);
350 
351 	nsp_setup_fifo(data, FALSE);
352 
353 	return TRUE;
354 }
355 
356 /*
357  * Start selection phase
358  */
359 static int nsphw_start_selection(struct scsi_cmnd *SCpnt)
360 {
361 	unsigned int  host_id	 = SCpnt->device->host->this_id;
362 	unsigned int  base	 = SCpnt->device->host->io_port;
363 	unsigned char target	 = scmd_id(SCpnt);
364 	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
365 	int	      time_out;
366 	unsigned char phase, arbit;
367 
368 	//nsp_dbg(NSP_DEBUG_RESELECTION, "in");
369 
370 	phase = nsp_index_read(base, SCSIBUSMON);
371 	if(phase != BUSMON_BUS_FREE) {
372 		//nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
373 		return FALSE;
374 	}
375 
376 	/* start arbitration */
377 	//nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
378 	SCpnt->SCp.phase = PH_ARBSTART;
379 	nsp_index_write(base, SETARBIT, ARBIT_GO);
380 
381 	time_out = 1000;
382 	do {
383 		/* XXX: what a stupid chip! */
384 		arbit = nsp_index_read(base, ARBITSTATUS);
385 		//nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
386 		udelay(1); /* hold 1.2us */
387 	} while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
388 		(time_out-- != 0));
389 
390 	if (!(arbit & ARBIT_WIN)) {
391 		//nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
392 		nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
393 		return FALSE;
394 	}
395 
396 	/* assert select line */
397 	//nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
398 	SCpnt->SCp.phase = PH_SELSTART;
399 	udelay(3); /* wait 2.4us */
400 	nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
401 	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY                    | SCSI_ATN);
402 	udelay(2); /* wait >1.2us */
403 	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
404 	nsp_index_write(base, SETARBIT,	     ARBIT_FLAG_CLEAR);
405 	/*udelay(1);*/ /* wait >90ns */
406 	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL            | SCSI_DATAOUT_ENB | SCSI_ATN);
407 
408 	/* check selection timeout */
409 	nsp_start_timer(SCpnt, 1000/51);
410 	data->SelectionTimeOut = 1;
411 
412 	return TRUE;
413 }
414 
415 struct nsp_sync_table {
416 	unsigned int min_period;
417 	unsigned int max_period;
418 	unsigned int chip_period;
419 	unsigned int ack_width;
420 };
421 
422 static struct nsp_sync_table nsp_sync_table_40M[] = {
423 	{0x0c, 0x0c, 0x1, 0},	/* 20MB	  50ns*/
424 	{0x19, 0x19, 0x3, 1},	/* 10MB	 100ns*/
425 	{0x1a, 0x25, 0x5, 2},	/* 7.5MB 150ns*/
426 	{0x26, 0x32, 0x7, 3},	/* 5MB	 200ns*/
427 	{   0,    0,   0, 0},
428 };
429 
430 static struct nsp_sync_table nsp_sync_table_20M[] = {
431 	{0x19, 0x19, 0x1, 0},	/* 10MB	 100ns*/
432 	{0x1a, 0x25, 0x2, 0},	/* 7.5MB 150ns*/
433 	{0x26, 0x32, 0x3, 1},	/* 5MB	 200ns*/
434 	{   0,    0,   0, 0},
435 };
436 
437 /*
438  * setup synchronous data transfer mode
439  */
440 static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt)
441 {
442 	unsigned char	       target = scmd_id(SCpnt);
443 //	unsigned char	       lun    = SCpnt->device->lun;
444 	nsp_hw_data           *data   = (nsp_hw_data *)SCpnt->device->host->hostdata;
445 	sync_data	      *sync   = &(data->Sync[target]);
446 	struct nsp_sync_table *sync_table;
447 	unsigned int	       period, offset;
448 	int		       i;
449 
450 
451 	nsp_dbg(NSP_DEBUG_SYNC, "in");
452 
453 	period = sync->SyncPeriod;
454 	offset = sync->SyncOffset;
455 
456 	nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
457 
458 	if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
459 		sync_table = nsp_sync_table_20M;
460 	} else {
461 		sync_table = nsp_sync_table_40M;
462 	}
463 
464 	for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
465 		if ( period >= sync_table->min_period &&
466 		     period <= sync_table->max_period	 ) {
467 			break;
468 		}
469 	}
470 
471 	if (period != 0 && sync_table->max_period == 0) {
472 		/*
473 		 * No proper period/offset found
474 		 */
475 		nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
476 
477 		sync->SyncPeriod      = 0;
478 		sync->SyncOffset      = 0;
479 		sync->SyncRegister    = 0;
480 		sync->AckWidth	      = 0;
481 
482 		return FALSE;
483 	}
484 
485 	sync->SyncRegister    = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
486 		                (offset & SYNCREG_OFFSET_MASK);
487 	sync->AckWidth	      = sync_table->ack_width;
488 
489 	nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
490 
491 	return TRUE;
492 }
493 
494 
495 /*
496  * start ninja hardware timer
497  */
498 static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time)
499 {
500 	unsigned int base = SCpnt->device->host->io_port;
501 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
502 
503 	//nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
504 	data->TimerCount = time;
505 	nsp_index_write(base, TIMERCOUNT, time);
506 }
507 
508 /*
509  * wait for bus phase change
510  */
511 static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask,
512 			     char *str)
513 {
514 	unsigned int  base = SCpnt->device->host->io_port;
515 	unsigned char reg;
516 	int	      time_out;
517 
518 	//nsp_dbg(NSP_DEBUG_INTR, "in");
519 
520 	time_out = 100;
521 
522 	do {
523 		reg = nsp_index_read(base, SCSIBUSMON);
524 		if (reg == 0xff) {
525 			break;
526 		}
527 	} while ((--time_out != 0) && (reg & mask) != 0);
528 
529 	if (time_out == 0) {
530 		nsp_msg(KERN_DEBUG, " %s signal off timeout", str);
531 	}
532 
533 	return 0;
534 }
535 
536 /*
537  * expect Ninja Irq
538  */
539 static int nsp_expect_signal(struct scsi_cmnd *SCpnt,
540 			     unsigned char current_phase,
541 			     unsigned char mask)
542 {
543 	unsigned int  base	 = SCpnt->device->host->io_port;
544 	int	      time_out;
545 	unsigned char phase, i_src;
546 
547 	//nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
548 
549 	time_out = 100;
550 	do {
551 		phase = nsp_index_read(base, SCSIBUSMON);
552 		if (phase == 0xff) {
553 			//nsp_dbg(NSP_DEBUG_INTR, "ret -1");
554 			return -1;
555 		}
556 		i_src = nsp_read(base, IRQSTATUS);
557 		if (i_src & IRQSTATUS_SCSI) {
558 			//nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
559 			return 0;
560 		}
561 		if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) {
562 			//nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
563 			return 1;
564 		}
565 	} while(time_out-- != 0);
566 
567 	//nsp_dbg(NSP_DEBUG_INTR, "timeout");
568 	return -1;
569 }
570 
571 /*
572  * transfer SCSI message
573  */
574 static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
575 {
576 	unsigned int  base = SCpnt->device->host->io_port;
577 	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
578 	char	     *buf  = data->MsgBuffer;
579 	int	      len  = min(MSGBUF_SIZE, data->MsgLen);
580 	int	      ptr;
581 	int	      ret;
582 
583 	//nsp_dbg(NSP_DEBUG_DATA_IO, "in");
584 	for (ptr = 0; len > 0; len--, ptr++) {
585 
586 		ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ);
587 		if (ret <= 0) {
588 			nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit");
589 			return 0;
590 		}
591 
592 		/* if last byte, negate ATN */
593 		if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
594 			nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
595 		}
596 
597 		/* read & write message */
598 		if (phase & BUSMON_IO) {
599 			nsp_dbg(NSP_DEBUG_DATA_IO, "read msg");
600 			buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK);
601 		} else {
602 			nsp_dbg(NSP_DEBUG_DATA_IO, "write msg");
603 			nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]);
604 		}
605 		nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>");
606 
607 	}
608 	return len;
609 }
610 
611 /*
612  * get extra SCSI data from fifo
613  */
614 static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
615 {
616 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
617 	unsigned int count;
618 
619 	//nsp_dbg(NSP_DEBUG_DATA_IO, "in");
620 
621 	if (SCpnt->SCp.have_data_in != IO_IN) {
622 		return 0;
623 	}
624 
625 	count = nsp_fifo_count(SCpnt);
626 	if (data->FifoCount == count) {
627 		//nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
628 		return 0;
629 	}
630 
631 	/*
632 	 * XXX: NSP_QUIRK
633 	 * data phase skip only occures in case of SCSI_LOW_READ
634 	 */
635 	nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
636 	SCpnt->SCp.phase = PH_DATA;
637 	nsp_pio_read(SCpnt);
638 	nsp_setup_fifo(data, FALSE);
639 
640 	return 0;
641 }
642 
643 /*
644  * accept reselection
645  */
646 static int nsp_reselected(struct scsi_cmnd *SCpnt)
647 {
648 	unsigned int  base    = SCpnt->device->host->io_port;
649 	unsigned int  host_id = SCpnt->device->host->this_id;
650 	//nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
651 	unsigned char bus_reg;
652 	unsigned char id_reg, tmp;
653 	int target;
654 
655 	nsp_dbg(NSP_DEBUG_RESELECTION, "in");
656 
657 	id_reg = nsp_index_read(base, RESELECTID);
658 	tmp    = id_reg & (~BIT(host_id));
659 	target = 0;
660 	while(tmp != 0) {
661 		if (tmp & BIT(0)) {
662 			break;
663 		}
664 		tmp >>= 1;
665 		target++;
666 	}
667 
668 	if (scmd_id(SCpnt) != target) {
669 		nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target);
670 	}
671 
672 	nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>");
673 
674 	nsp_nexus(SCpnt);
675 	bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN);
676 	nsp_index_write(base, SCSIBUSCTRL, bus_reg);
677 	nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB);
678 
679 	return TRUE;
680 }
681 
682 /*
683  * count how many data transferd
684  */
685 static int nsp_fifo_count(struct scsi_cmnd *SCpnt)
686 {
687 	unsigned int base = SCpnt->device->host->io_port;
688 	unsigned int count;
689 	unsigned int l, m, h;
690 
691 	nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER);
692 
693 	l     = nsp_index_read(base, TRANSFERCOUNT);
694 	m     = nsp_index_read(base, TRANSFERCOUNT);
695 	h     = nsp_index_read(base, TRANSFERCOUNT);
696 	nsp_index_read(base, TRANSFERCOUNT); /* required this! */
697 
698 	count = (h << 16) | (m << 8) | (l << 0);
699 
700 	//nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
701 
702 	return count;
703 }
704 
705 /* fifo size */
706 #define RFIFO_CRIT 64
707 #define WFIFO_CRIT 64
708 
709 /*
710  * read data in DATA IN phase
711  */
712 static void nsp_pio_read(struct scsi_cmnd *SCpnt)
713 {
714 	unsigned int  base      = SCpnt->device->host->io_port;
715 	unsigned long mmio_base = SCpnt->device->host->base;
716 	nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
717 	long	      time_out;
718 	int	      ocount, res;
719 	unsigned char stat, fifo_stat;
720 
721 	ocount = data->FifoCount;
722 
723 	nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d",
724 		SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr,
725 		SCpnt->SCp.this_residual, SCpnt->SCp.buffer,
726 		SCpnt->SCp.buffers_residual);
727 
728 	time_out = 1000;
729 
730 	while ((time_out-- != 0) &&
731 	       (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
732 
733 		stat = nsp_index_read(base, SCSIBUSMON);
734 		stat &= BUSMON_PHASE_MASK;
735 
736 
737 		res = nsp_fifo_count(SCpnt) - ocount;
738 		//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res);
739 		if (res == 0) { /* if some data available ? */
740 			if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
741 				//nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
742 				continue;
743 			} else {
744 				nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
745 				break;
746 			}
747 		}
748 
749 		fifo_stat = nsp_read(base, FIFOSTATUS);
750 		if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 &&
751 		    stat                                == BUSPHASE_DATA_IN) {
752 			continue;
753 		}
754 
755 		res = min(res, SCpnt->SCp.this_residual);
756 
757 		switch (data->TransferMode) {
758 		case MODE_IO32:
759 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
760 			nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
761 			break;
762 		case MODE_IO8:
763 			nsp_fifo8_read (base, SCpnt->SCp.ptr, res     );
764 			break;
765 
766 		case MODE_MEM32:
767 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
768 			nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
769 			break;
770 
771 		default:
772 			nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode");
773 			return;
774 		}
775 
776 		nsp_inc_resid(SCpnt, -res);
777 		SCpnt->SCp.ptr		 += res;
778 		SCpnt->SCp.this_residual -= res;
779 		ocount			 += res;
780 		//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
781 
782 		/* go to next scatter list if available */
783 		if (SCpnt->SCp.this_residual	== 0 &&
784 		    SCpnt->SCp.buffers_residual != 0 ) {
785 			//nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
786 			SCpnt->SCp.buffers_residual--;
787 			SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer);
788 			SCpnt->SCp.ptr		 = BUFFER_ADDR;
789 			SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
790 			time_out = 1000;
791 
792 			//nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
793 		}
794 	}
795 
796 	data->FifoCount = ocount;
797 
798 	if (time_out < 0) {
799 		nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
800 			scsi_get_resid(SCpnt), SCpnt->SCp.this_residual,
801 			SCpnt->SCp.buffers_residual);
802 	}
803 	nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
804 	nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
805 	                                                scsi_get_resid(SCpnt));
806 }
807 
808 /*
809  * write data in DATA OUT phase
810  */
811 static void nsp_pio_write(struct scsi_cmnd *SCpnt)
812 {
813 	unsigned int  base      = SCpnt->device->host->io_port;
814 	unsigned long mmio_base = SCpnt->device->host->base;
815 	nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
816 	int	      time_out;
817 	int           ocount, res;
818 	unsigned char stat;
819 
820 	ocount	 = data->FifoCount;
821 
822 	nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
823 		data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual,
824 		SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual,
825 		scsi_get_resid(SCpnt));
826 
827 	time_out = 1000;
828 
829 	while ((time_out-- != 0) &&
830 	       (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
831 		stat = nsp_index_read(base, SCSIBUSMON);
832 		stat &= BUSMON_PHASE_MASK;
833 
834 		if (stat != BUSPHASE_DATA_OUT) {
835 			res = ocount - nsp_fifo_count(SCpnt);
836 
837 			nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
838 			/* Put back pointer */
839 			nsp_inc_resid(SCpnt, res);
840 			SCpnt->SCp.ptr		 -= res;
841 			SCpnt->SCp.this_residual += res;
842 			ocount			 -= res;
843 
844 			break;
845 		}
846 
847 		res = ocount - nsp_fifo_count(SCpnt);
848 		if (res > 0) { /* write all data? */
849 			nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res);
850 			continue;
851 		}
852 
853 		res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
854 
855 		//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
856 		switch (data->TransferMode) {
857 		case MODE_IO32:
858 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
859 			nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
860 			break;
861 		case MODE_IO8:
862 			nsp_fifo8_write (base, SCpnt->SCp.ptr, res     );
863 			break;
864 
865 		case MODE_MEM32:
866 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
867 			nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
868 			break;
869 
870 		default:
871 			nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode");
872 			break;
873 		}
874 
875 		nsp_inc_resid(SCpnt, -res);
876 		SCpnt->SCp.ptr		 += res;
877 		SCpnt->SCp.this_residual -= res;
878 		ocount			 += res;
879 
880 		/* go to next scatter list if available */
881 		if (SCpnt->SCp.this_residual	== 0 &&
882 		    SCpnt->SCp.buffers_residual != 0 ) {
883 			//nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
884 			SCpnt->SCp.buffers_residual--;
885 			SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer);
886 			SCpnt->SCp.ptr		 = BUFFER_ADDR;
887 			SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
888 			time_out = 1000;
889 		}
890 	}
891 
892 	data->FifoCount = ocount;
893 
894 	if (time_out < 0) {
895 		nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x",
896 		                                        scsi_get_resid(SCpnt));
897 	}
898 	nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
899 	nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId,
900 	                                                scsi_get_resid(SCpnt));
901 }
902 #undef RFIFO_CRIT
903 #undef WFIFO_CRIT
904 
905 /*
906  * setup synchronous/asynchronous data transfer mode
907  */
908 static int nsp_nexus(struct scsi_cmnd *SCpnt)
909 {
910 	unsigned int   base   = SCpnt->device->host->io_port;
911 	unsigned char  target = scmd_id(SCpnt);
912 //	unsigned char  lun    = SCpnt->device->lun;
913 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
914 	sync_data     *sync   = &(data->Sync[target]);
915 
916 	//nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
917 
918 	/* setup synch transfer registers */
919 	nsp_index_write(base, SYNCREG,	sync->SyncRegister);
920 	nsp_index_write(base, ACKWIDTH, sync->AckWidth);
921 
922 	if (scsi_get_resid(SCpnt) % 4 != 0 ||
923 	    scsi_get_resid(SCpnt) <= PAGE_SIZE ) {
924 		data->TransferMode = MODE_IO8;
925 	} else if (nsp_burst_mode == BURST_MEM32) {
926 		data->TransferMode = MODE_MEM32;
927 	} else if (nsp_burst_mode == BURST_IO32) {
928 		data->TransferMode = MODE_IO32;
929 	} else {
930 		data->TransferMode = MODE_IO8;
931 	}
932 
933 	/* setup pdma fifo */
934 	nsp_setup_fifo(data, TRUE);
935 
936 	/* clear ack counter */
937  	data->FifoCount = 0;
938 	nsp_index_write(base, POINTERCLR, POINTER_CLEAR	    |
939 					  ACK_COUNTER_CLEAR |
940 					  REQ_COUNTER_CLEAR |
941 					  HOST_COUNTER_CLEAR);
942 
943 	return 0;
944 }
945 
946 #include "nsp_message.c"
947 /*
948  * interrupt handler
949  */
950 static irqreturn_t nspintr(int irq, void *dev_id)
951 {
952 	unsigned int   base;
953 	unsigned char  irq_status, irq_phase, phase;
954 	struct scsi_cmnd *tmpSC;
955 	unsigned char  target, lun;
956 	unsigned int  *sync_neg;
957 	int            i, tmp;
958 	nsp_hw_data   *data;
959 
960 
961 	//nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
962 	//nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
963 
964 	if (                dev_id        != NULL &&
965 	    ((scsi_info_t *)dev_id)->host != NULL  ) {
966 		scsi_info_t *info = (scsi_info_t *)dev_id;
967 
968 		data = (nsp_hw_data *)info->host->hostdata;
969 	} else {
970 		nsp_dbg(NSP_DEBUG_INTR, "host data wrong");
971 		return IRQ_NONE;
972 	}
973 
974 	//nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
975 
976 	base = data->BaseAddress;
977 	//nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
978 
979 	/*
980 	 * interrupt check
981 	 */
982 	nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE);
983 	irq_status = nsp_read(base, IRQSTATUS);
984 	//nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
985 	if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) {
986 		nsp_write(base, IRQCONTROL, 0);
987 		//nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
988 		return IRQ_NONE;
989 	}
990 
991 	/* XXX: IMPORTANT
992 	 * Do not read an irq_phase register if no scsi phase interrupt.
993 	 * Unless, you should lose a scsi phase interrupt.
994 	 */
995 	phase = nsp_index_read(base, SCSIBUSMON);
996 	if((irq_status & IRQSTATUS_SCSI) != 0) {
997 		irq_phase = nsp_index_read(base, IRQPHASESENCE);
998 	} else {
999 		irq_phase = 0;
1000 	}
1001 
1002 	//nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1003 
1004 	/*
1005 	 * timer interrupt handler (scsi vs timer interrupts)
1006 	 */
1007 	//nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1008 	if (data->TimerCount != 0) {
1009 		//nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1010 		nsp_index_write(base, TIMERCOUNT, 0);
1011 		nsp_index_write(base, TIMERCOUNT, 0);
1012 		data->TimerCount = 0;
1013 	}
1014 
1015 	if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER &&
1016 	    data->SelectionTimeOut == 0) {
1017 		//nsp_dbg(NSP_DEBUG_INTR, "timer start");
1018 		nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR);
1019 		return IRQ_HANDLED;
1020 	}
1021 
1022 	nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR);
1023 
1024 	if ((irq_status & IRQSTATUS_SCSI) &&
1025 	    (irq_phase  & SCSI_RESET_IRQ)) {
1026 		nsp_msg(KERN_ERR, "bus reset (power off?)");
1027 
1028 		nsphw_init(data);
1029 		nsp_bus_reset(data);
1030 
1031 		if(data->CurrentSC != NULL) {
1032 			tmpSC = data->CurrentSC;
1033 			tmpSC->result  = (DID_RESET                   << 16) |
1034 				         ((tmpSC->SCp.Message & 0xff) <<  8) |
1035 				         ((tmpSC->SCp.Status  & 0xff) <<  0);
1036 			nsp_scsi_done(tmpSC);
1037 		}
1038 		return IRQ_HANDLED;
1039 	}
1040 
1041 	if (data->CurrentSC == NULL) {
1042 		nsp_msg(KERN_ERR, "CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen. reset everything", irq_status, phase, irq_phase);
1043 		nsphw_init(data);
1044 		nsp_bus_reset(data);
1045 		return IRQ_HANDLED;
1046 	}
1047 
1048 	tmpSC    = data->CurrentSC;
1049 	target   = tmpSC->device->id;
1050 	lun      = tmpSC->device->lun;
1051 	sync_neg = &(data->Sync[target].SyncNegotiation);
1052 
1053 	/*
1054 	 * parse hardware SCSI irq reasons register
1055 	 */
1056 	if (irq_status & IRQSTATUS_SCSI) {
1057 		if (irq_phase & RESELECT_IRQ) {
1058 			nsp_dbg(NSP_DEBUG_INTR, "reselect");
1059 			nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR);
1060 			if (nsp_reselected(tmpSC) != FALSE) {
1061 				return IRQ_HANDLED;
1062 			}
1063 		}
1064 
1065 		if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) {
1066 			return IRQ_HANDLED;
1067 		}
1068 	}
1069 
1070 	//show_phase(tmpSC);
1071 
1072 	switch(tmpSC->SCp.phase) {
1073 	case PH_SELSTART:
1074 		// *sync_neg = SYNC_NOT_YET;
1075 		if ((phase & BUSMON_BSY) == 0) {
1076 			//nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1077 			if (data->SelectionTimeOut >= NSP_SELTIMEOUT) {
1078 				nsp_dbg(NSP_DEBUG_INTR, "selection time out");
1079 				data->SelectionTimeOut = 0;
1080 				nsp_index_write(base, SCSIBUSCTRL, 0);
1081 
1082 				tmpSC->result   = DID_TIME_OUT << 16;
1083 				nsp_scsi_done(tmpSC);
1084 
1085 				return IRQ_HANDLED;
1086 			}
1087 			data->SelectionTimeOut += 1;
1088 			nsp_start_timer(tmpSC, 1000/51);
1089 			return IRQ_HANDLED;
1090 		}
1091 
1092 		/* attention assert */
1093 		//nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1094 		data->SelectionTimeOut = 0;
1095 		tmpSC->SCp.phase       = PH_SELECTED;
1096 		nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
1097 		udelay(1);
1098 		nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
1099 		return IRQ_HANDLED;
1100 
1101 	case PH_RESELECT:
1102 		//nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1103 		// *sync_neg = SYNC_NOT_YET;
1104 		if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) {
1105 
1106 			tmpSC->result	= DID_ABORT << 16;
1107 			nsp_scsi_done(tmpSC);
1108 			return IRQ_HANDLED;
1109 		}
1110 		fallthrough;
1111 	default:
1112 		if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) {
1113 			return IRQ_HANDLED;
1114 		}
1115 		break;
1116 	}
1117 
1118 	/*
1119 	 * SCSI sequencer
1120 	 */
1121 	//nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1122 
1123 	/* normal disconnect */
1124 	if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
1125 	    (irq_phase & LATCHED_BUS_FREE) != 0 ) {
1126 		nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1127 
1128 		//*sync_neg       = SYNC_NOT_YET;
1129 
1130 		/* all command complete and return status */
1131 		if (tmpSC->SCp.Message == COMMAND_COMPLETE) {
1132 			tmpSC->result = (DID_OK		             << 16) |
1133 					((tmpSC->SCp.Message & 0xff) <<  8) |
1134 					((tmpSC->SCp.Status  & 0xff) <<  0);
1135 			nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
1136 			nsp_scsi_done(tmpSC);
1137 
1138 			return IRQ_HANDLED;
1139 		}
1140 
1141 		return IRQ_HANDLED;
1142 	}
1143 
1144 
1145 	/* check unexpected bus free state */
1146 	if (phase == 0) {
1147 		nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1148 
1149 		*sync_neg       = SYNC_NG;
1150 		tmpSC->result   = DID_ERROR << 16;
1151 		nsp_scsi_done(tmpSC);
1152 		return IRQ_HANDLED;
1153 	}
1154 
1155 	switch (phase & BUSMON_PHASE_MASK) {
1156 	case BUSPHASE_COMMAND:
1157 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND");
1158 		if ((phase & BUSMON_REQ) == 0) {
1159 			nsp_dbg(NSP_DEBUG_INTR, "REQ == 0");
1160 			return IRQ_HANDLED;
1161 		}
1162 
1163 		tmpSC->SCp.phase = PH_COMMAND;
1164 
1165 		nsp_nexus(tmpSC);
1166 
1167 		/* write scsi command */
1168 		nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len);
1169 		nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER);
1170 		for (i = 0; i < tmpSC->cmd_len; i++) {
1171 			nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]);
1172 		}
1173 		nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO);
1174 		break;
1175 
1176 	case BUSPHASE_DATA_OUT:
1177 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
1178 
1179 		tmpSC->SCp.phase        = PH_DATA;
1180 		tmpSC->SCp.have_data_in = IO_OUT;
1181 
1182 		nsp_pio_write(tmpSC);
1183 
1184 		break;
1185 
1186 	case BUSPHASE_DATA_IN:
1187 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
1188 
1189 		tmpSC->SCp.phase        = PH_DATA;
1190 		tmpSC->SCp.have_data_in = IO_IN;
1191 
1192 		nsp_pio_read(tmpSC);
1193 
1194 		break;
1195 
1196 	case BUSPHASE_STATUS:
1197 		nsp_dataphase_bypass(tmpSC);
1198 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
1199 
1200 		tmpSC->SCp.phase = PH_STATUS;
1201 
1202 		tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
1203 		nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
1204 
1205 		break;
1206 
1207 	case BUSPHASE_MESSAGE_OUT:
1208 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT");
1209 		if ((phase & BUSMON_REQ) == 0) {
1210 			goto timer_out;
1211 		}
1212 
1213 		tmpSC->SCp.phase = PH_MSG_OUT;
1214 
1215 		//*sync_neg = SYNC_NOT_YET;
1216 
1217 		data->MsgLen = i = 0;
1218 		data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++;
1219 
1220 		if (*sync_neg == SYNC_NOT_YET) {
1221 			data->Sync[target].SyncPeriod = 0;
1222 			data->Sync[target].SyncOffset = 0;
1223 
1224 			/**/
1225 			data->MsgBuffer[i] = EXTENDED_MESSAGE; i++;
1226 			data->MsgBuffer[i] = 3;            i++;
1227 			data->MsgBuffer[i] = EXTENDED_SDTR; i++;
1228 			data->MsgBuffer[i] = 0x0c;         i++;
1229 			data->MsgBuffer[i] = 15;           i++;
1230 			/**/
1231 		}
1232 		data->MsgLen = i;
1233 
1234 		nsp_analyze_sdtr(tmpSC);
1235 		show_message(data);
1236 		nsp_message_out(tmpSC);
1237 		break;
1238 
1239 	case BUSPHASE_MESSAGE_IN:
1240 		nsp_dataphase_bypass(tmpSC);
1241 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN");
1242 		if ((phase & BUSMON_REQ) == 0) {
1243 			goto timer_out;
1244 		}
1245 
1246 		tmpSC->SCp.phase = PH_MSG_IN;
1247 		nsp_message_in(tmpSC);
1248 
1249 		/**/
1250 		if (*sync_neg == SYNC_NOT_YET) {
1251 			//nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1252 
1253 			if (data->MsgLen       >= 5            &&
1254 			    data->MsgBuffer[0] == EXTENDED_MESSAGE &&
1255 			    data->MsgBuffer[1] == 3            &&
1256 			    data->MsgBuffer[2] == EXTENDED_SDTR ) {
1257 				data->Sync[target].SyncPeriod = data->MsgBuffer[3];
1258 				data->Sync[target].SyncOffset = data->MsgBuffer[4];
1259 				//nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1260 				*sync_neg = SYNC_OK;
1261 			} else {
1262 				data->Sync[target].SyncPeriod = 0;
1263 				data->Sync[target].SyncOffset = 0;
1264 				*sync_neg = SYNC_NG;
1265 			}
1266 			nsp_analyze_sdtr(tmpSC);
1267 		}
1268 		/**/
1269 
1270 		/* search last messeage byte */
1271 		tmp = -1;
1272 		for (i = 0; i < data->MsgLen; i++) {
1273 			tmp = data->MsgBuffer[i];
1274 			if (data->MsgBuffer[i] == EXTENDED_MESSAGE) {
1275 				i += (1 + data->MsgBuffer[i+1]);
1276 			}
1277 		}
1278 		tmpSC->SCp.Message = tmp;
1279 
1280 		nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
1281 		show_message(data);
1282 
1283 		break;
1284 
1285 	case BUSPHASE_SELECT:
1286 	default:
1287 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other");
1288 
1289 		break;
1290 	}
1291 
1292 	//nsp_dbg(NSP_DEBUG_INTR, "out");
1293 	return IRQ_HANDLED;
1294 
1295 timer_out:
1296 	nsp_start_timer(tmpSC, 1000/102);
1297 	return IRQ_HANDLED;
1298 }
1299 
1300 #ifdef NSP_DEBUG
1301 #include "nsp_debug.c"
1302 #endif	/* NSP_DEBUG */
1303 
1304 /*----------------------------------------------------------------*/
1305 /* look for ninja3 card and init if found			  */
1306 /*----------------------------------------------------------------*/
1307 static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
1308 {
1309 	struct Scsi_Host *host;	/* registered host structure */
1310 	nsp_hw_data *data_b = &nsp_data_base, *data;
1311 
1312 	nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
1313 	host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
1314 	if (host == NULL) {
1315 		nsp_dbg(NSP_DEBUG_INIT, "host failed");
1316 		return NULL;
1317 	}
1318 
1319 	memcpy(host->hostdata, data_b, sizeof(nsp_hw_data));
1320 	data = (nsp_hw_data *)host->hostdata;
1321 	data->ScsiInfo->host = host;
1322 #ifdef NSP_DEBUG
1323 	data->CmdId = 0;
1324 #endif
1325 
1326 	nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber);
1327 
1328 	host->unique_id	  = data->BaseAddress;
1329 	host->io_port	  = data->BaseAddress;
1330 	host->n_io_port	  = data->NumAddress;
1331 	host->irq	  = data->IrqNumber;
1332 	host->base        = data->MmioAddress;
1333 
1334 	spin_lock_init(&(data->Lock));
1335 
1336 	snprintf(data->nspinfo,
1337 		 sizeof(data->nspinfo),
1338 		 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1339 		 host->io_port, host->io_port + host->n_io_port - 1,
1340 		 host->base,
1341 		 host->irq);
1342 	sht->name	  = data->nspinfo;
1343 
1344 	nsp_dbg(NSP_DEBUG_INIT, "end");
1345 
1346 
1347 	return host; /* detect done. */
1348 }
1349 
1350 /*----------------------------------------------------------------*/
1351 /* return info string						  */
1352 /*----------------------------------------------------------------*/
1353 static const char *nsp_info(struct Scsi_Host *shpnt)
1354 {
1355 	nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1356 
1357 	return data->nspinfo;
1358 }
1359 
1360 static int nsp_show_info(struct seq_file *m, struct Scsi_Host *host)
1361 {
1362 	int id;
1363 	int speed;
1364 	unsigned long flags;
1365 	nsp_hw_data *data;
1366 	int hostno;
1367 
1368 	hostno = host->host_no;
1369 	data = (nsp_hw_data *)host->hostdata;
1370 
1371 	seq_puts(m, "NinjaSCSI status\n\n"
1372 		"Driver version:        $Revision: 1.23 $\n");
1373 	seq_printf(m, "SCSI host No.:         %d\n",          hostno);
1374 	seq_printf(m, "IRQ:                   %d\n",          host->irq);
1375 	seq_printf(m, "IO:                    0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1);
1376 	seq_printf(m, "MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1);
1377 	seq_printf(m, "sg_tablesize:          %d\n",          host->sg_tablesize);
1378 
1379 	seq_puts(m, "burst transfer mode:   ");
1380 	switch (nsp_burst_mode) {
1381 	case BURST_IO8:
1382 		seq_puts(m, "io8");
1383 		break;
1384 	case BURST_IO32:
1385 		seq_puts(m, "io32");
1386 		break;
1387 	case BURST_MEM32:
1388 		seq_puts(m, "mem32");
1389 		break;
1390 	default:
1391 		seq_puts(m, "???");
1392 		break;
1393 	}
1394 	seq_putc(m, '\n');
1395 
1396 
1397 	spin_lock_irqsave(&(data->Lock), flags);
1398 	seq_printf(m, "CurrentSC:             0x%p\n\n",      data->CurrentSC);
1399 	spin_unlock_irqrestore(&(data->Lock), flags);
1400 
1401 	seq_puts(m, "SDTR status\n");
1402 	for(id = 0; id < ARRAY_SIZE(data->Sync); id++) {
1403 
1404 		seq_printf(m, "id %d: ", id);
1405 
1406 		if (id == host->this_id) {
1407 			seq_puts(m, "----- NinjaSCSI-3 host adapter\n");
1408 			continue;
1409 		}
1410 
1411 		switch(data->Sync[id].SyncNegotiation) {
1412 		case SYNC_OK:
1413 			seq_puts(m, " sync");
1414 			break;
1415 		case SYNC_NG:
1416 			seq_puts(m, "async");
1417 			break;
1418 		case SYNC_NOT_YET:
1419 			seq_puts(m, " none");
1420 			break;
1421 		default:
1422 			seq_puts(m, "?????");
1423 			break;
1424 		}
1425 
1426 		if (data->Sync[id].SyncPeriod != 0) {
1427 			speed = 1000000 / (data->Sync[id].SyncPeriod * 4);
1428 
1429 			seq_printf(m, " transfer %d.%dMB/s, offset %d",
1430 				speed / 1000,
1431 				speed % 1000,
1432 				data->Sync[id].SyncOffset
1433 				);
1434 		}
1435 		seq_putc(m, '\n');
1436 	}
1437 	return 0;
1438 }
1439 
1440 /*---------------------------------------------------------------*/
1441 /* error handler                                                 */
1442 /*---------------------------------------------------------------*/
1443 
1444 /*
1445 static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1446 {
1447 	nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1448 
1449 	return nsp_eh_bus_reset(SCpnt);
1450 }*/
1451 
1452 static int nsp_bus_reset(nsp_hw_data *data)
1453 {
1454 	unsigned int base = data->BaseAddress;
1455 	int	     i;
1456 
1457 	nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
1458 
1459 	nsp_index_write(base, SCSIBUSCTRL, SCSI_RST);
1460 	mdelay(100); /* 100ms */
1461 	nsp_index_write(base, SCSIBUSCTRL, 0);
1462 	for(i = 0; i < 5; i++) {
1463 		nsp_index_read(base, IRQPHASESENCE); /* dummy read */
1464 	}
1465 
1466 	nsphw_init_sync(data);
1467 
1468 	nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
1469 
1470 	return SUCCESS;
1471 }
1472 
1473 static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt)
1474 {
1475 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1476 
1477 	nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1478 
1479 	return nsp_bus_reset(data);
1480 }
1481 
1482 static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt)
1483 {
1484 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1485 
1486 	nsp_dbg(NSP_DEBUG_BUSRESET, "in");
1487 
1488 	nsphw_init(data);
1489 
1490 	return SUCCESS;
1491 }
1492 
1493 
1494 /**********************************************************************
1495   PCMCIA functions
1496 **********************************************************************/
1497 
1498 static int nsp_cs_probe(struct pcmcia_device *link)
1499 {
1500 	scsi_info_t  *info;
1501 	nsp_hw_data  *data = &nsp_data_base;
1502 	int ret;
1503 
1504 	nsp_dbg(NSP_DEBUG_INIT, "in");
1505 
1506 	/* Create new SCSI device */
1507 	info = kzalloc(sizeof(*info), GFP_KERNEL);
1508 	if (info == NULL) { return -ENOMEM; }
1509 	info->p_dev = link;
1510 	link->priv = info;
1511 	data->ScsiInfo = info;
1512 
1513 	nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1514 
1515 	ret = nsp_cs_config(link);
1516 
1517 	nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1518 	return ret;
1519 } /* nsp_cs_attach */
1520 
1521 
1522 static void nsp_cs_detach(struct pcmcia_device *link)
1523 {
1524 	nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1525 
1526 	((scsi_info_t *)link->priv)->stop = 1;
1527 	nsp_cs_release(link);
1528 
1529 	kfree(link->priv);
1530 	link->priv = NULL;
1531 } /* nsp_cs_detach */
1532 
1533 
1534 static int nsp_cs_config_check(struct pcmcia_device *p_dev, void *priv_data)
1535 {
1536 	nsp_hw_data		*data = priv_data;
1537 
1538 	if (p_dev->config_index == 0)
1539 		return -ENODEV;
1540 
1541 	/* This reserves IO space but doesn't actually enable it */
1542 	if (pcmcia_request_io(p_dev) != 0)
1543 		goto next_entry;
1544 
1545 	if (resource_size(p_dev->resource[2])) {
1546 		p_dev->resource[2]->flags |= (WIN_DATA_WIDTH_16 |
1547 					WIN_MEMORY_TYPE_CM |
1548 					WIN_ENABLE);
1549 		if (p_dev->resource[2]->end < 0x1000)
1550 			p_dev->resource[2]->end = 0x1000;
1551 		if (pcmcia_request_window(p_dev, p_dev->resource[2], 0) != 0)
1552 			goto next_entry;
1553 		if (pcmcia_map_mem_page(p_dev, p_dev->resource[2],
1554 						p_dev->card_addr) != 0)
1555 			goto next_entry;
1556 
1557 		data->MmioAddress = (unsigned long)
1558 			ioremap(p_dev->resource[2]->start,
1559 					resource_size(p_dev->resource[2]));
1560 		if (!data->MmioAddress)
1561 			goto next_entry;
1562 
1563 		data->MmioLength  = resource_size(p_dev->resource[2]);
1564 	}
1565 	/* If we got this far, we're cool! */
1566 	return 0;
1567 
1568 next_entry:
1569 	nsp_dbg(NSP_DEBUG_INIT, "next");
1570 	pcmcia_disable_device(p_dev);
1571 	return -ENODEV;
1572 }
1573 
1574 static int nsp_cs_config(struct pcmcia_device *link)
1575 {
1576 	int		  ret;
1577 	scsi_info_t	 *info	 = link->priv;
1578 	struct Scsi_Host *host;
1579 	nsp_hw_data      *data = &nsp_data_base;
1580 
1581 	nsp_dbg(NSP_DEBUG_INIT, "in");
1582 
1583 	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
1584 		CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IOMEM |
1585 		CONF_AUTO_SET_IO;
1586 
1587 	ret = pcmcia_loop_config(link, nsp_cs_config_check, data);
1588 	if (ret)
1589 		goto cs_failed;
1590 
1591 	if (pcmcia_request_irq(link, nspintr))
1592 		goto cs_failed;
1593 
1594 	ret = pcmcia_enable_device(link);
1595 	if (ret)
1596 		goto cs_failed;
1597 
1598 	if (free_ports) {
1599 		if (link->resource[0]) {
1600 			release_region(link->resource[0]->start,
1601 					resource_size(link->resource[0]));
1602 		}
1603 		if (link->resource[1]) {
1604 			release_region(link->resource[1]->start,
1605 					resource_size(link->resource[1]));
1606 		}
1607 	}
1608 
1609 	/* Set port and IRQ */
1610 	data->BaseAddress = link->resource[0]->start;
1611 	data->NumAddress  = resource_size(link->resource[0]);
1612 	data->IrqNumber   = link->irq;
1613 
1614 	nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1615 		data->BaseAddress, data->NumAddress, data->IrqNumber);
1616 
1617 	if(nsphw_init(data) == FALSE) {
1618 		goto cs_failed;
1619 	}
1620 
1621 	host = nsp_detect(&nsp_driver_template);
1622 
1623 	if (host == NULL) {
1624 		nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1625 		goto cs_failed;
1626 	}
1627 
1628 
1629 	ret = scsi_add_host (host, NULL);
1630 	if (ret)
1631 		goto cs_failed;
1632 
1633 	scsi_scan_host(host);
1634 
1635 	info->host = host;
1636 
1637 	return 0;
1638 
1639  cs_failed:
1640 	nsp_dbg(NSP_DEBUG_INIT, "config fail");
1641 	nsp_cs_release(link);
1642 
1643 	return -ENODEV;
1644 } /* nsp_cs_config */
1645 
1646 
1647 static void nsp_cs_release(struct pcmcia_device *link)
1648 {
1649 	scsi_info_t *info = link->priv;
1650 	nsp_hw_data *data = NULL;
1651 
1652 	if (info->host == NULL) {
1653 		nsp_msg(KERN_DEBUG, "unexpected card release call.");
1654 	} else {
1655 		data = (nsp_hw_data *)info->host->hostdata;
1656 	}
1657 
1658 	nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1659 
1660 	/* Unlink the device chain */
1661 	if (info->host != NULL) {
1662 		scsi_remove_host(info->host);
1663 	}
1664 
1665 	if (resource_size(link->resource[2])) {
1666 		if (data != NULL) {
1667 			iounmap((void *)(data->MmioAddress));
1668 		}
1669 	}
1670 	pcmcia_disable_device(link);
1671 
1672 	if (info->host != NULL) {
1673 		scsi_host_put(info->host);
1674 	}
1675 } /* nsp_cs_release */
1676 
1677 static int nsp_cs_suspend(struct pcmcia_device *link)
1678 {
1679 	scsi_info_t *info = link->priv;
1680 	nsp_hw_data *data;
1681 
1682 	nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
1683 
1684 	if (info->host != NULL) {
1685 		nsp_msg(KERN_INFO, "clear SDTR status");
1686 
1687 		data = (nsp_hw_data *)info->host->hostdata;
1688 
1689 		nsphw_init_sync(data);
1690 	}
1691 
1692 	info->stop = 1;
1693 
1694 	return 0;
1695 }
1696 
1697 static int nsp_cs_resume(struct pcmcia_device *link)
1698 {
1699 	scsi_info_t *info = link->priv;
1700 	nsp_hw_data *data;
1701 
1702 	nsp_dbg(NSP_DEBUG_INIT, "event: resume");
1703 
1704 	info->stop = 0;
1705 
1706 	if (info->host != NULL) {
1707 		nsp_msg(KERN_INFO, "reset host and bus");
1708 
1709 		data = (nsp_hw_data *)info->host->hostdata;
1710 
1711 		nsphw_init   (data);
1712 		nsp_bus_reset(data);
1713 	}
1714 
1715 	return 0;
1716 }
1717 
1718 /*======================================================================*
1719  *	module entry point
1720  *====================================================================*/
1721 static const struct pcmcia_device_id nsp_cs_ids[] = {
1722 	PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16       ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
1723 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
1724 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
1725 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
1726 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
1727 	PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
1728 	PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
1729 	PCMCIA_DEVICE_NULL
1730 };
1731 MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids);
1732 
1733 static struct pcmcia_driver nsp_driver = {
1734 	.owner		= THIS_MODULE,
1735 	.name		= "nsp_cs",
1736 	.probe		= nsp_cs_probe,
1737 	.remove		= nsp_cs_detach,
1738 	.id_table	= nsp_cs_ids,
1739 	.suspend	= nsp_cs_suspend,
1740 	.resume		= nsp_cs_resume,
1741 };
1742 module_pcmcia_driver(nsp_driver);
1743 
1744 /* end */
1745