xref: /linux/drivers/scsi/pcmcia/nsp_cs.c (revision 14b42963f64b98ab61fa9723c03d71aa5ef4f862)
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 /* $Id: nsp_cs.c,v 1.23 2003/08/18 11:09:19 elca Exp $ */
29 
30 #include <linux/version.h>
31 #include <linux/module.h>
32 #include <linux/kernel.h>
33 #include <linux/init.h>
34 #include <linux/sched.h>
35 #include <linux/slab.h>
36 #include <linux/string.h>
37 #include <linux/timer.h>
38 #include <linux/ioport.h>
39 #include <linux/delay.h>
40 #include <linux/interrupt.h>
41 #include <linux/major.h>
42 #include <linux/blkdev.h>
43 #include <linux/stat.h>
44 
45 #include <asm/io.h>
46 #include <asm/irq.h>
47 
48 #include <../drivers/scsi/scsi.h>
49 #include <scsi/scsi_host.h>
50 
51 #include <scsi/scsi.h>
52 #include <scsi/scsi_ioctl.h>
53 
54 #include <pcmcia/cs_types.h>
55 #include <pcmcia/cs.h>
56 #include <pcmcia/cistpl.h>
57 #include <pcmcia/cisreg.h>
58 #include <pcmcia/ds.h>
59 
60 #include "nsp_cs.h"
61 
62 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
63 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module $Revision: 1.23 $");
64 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
65 #ifdef MODULE_LICENSE
66 MODULE_LICENSE("GPL");
67 #endif
68 
69 #include "nsp_io.h"
70 
71 /*====================================================================*/
72 /* Parameters that can be set with 'insmod' */
73 
74 static int       nsp_burst_mode = BURST_MEM32;
75 module_param(nsp_burst_mode, int, 0);
76 MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
77 
78 /* Release IO ports after configuration? */
79 static int       free_ports = 0;
80 module_param(free_ports, bool, 0);
81 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
82 
83 /* /usr/src/linux/drivers/scsi/hosts.h */
84 static struct scsi_host_template nsp_driver_template = {
85 	.proc_name	         = "nsp_cs",
86 	.proc_info		 = nsp_proc_info,
87 	.name			 = "WorkBit NinjaSCSI-3/32Bi(16bit)",
88 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
89 	.detect			 = nsp_detect_old,
90 	.release		 = nsp_release_old,
91 #endif
92 	.info			 = nsp_info,
93 	.queuecommand		 = nsp_queuecommand,
94 /*	.eh_abort_handler	 = nsp_eh_abort,*/
95 	.eh_bus_reset_handler	 = nsp_eh_bus_reset,
96 	.eh_host_reset_handler	 = nsp_eh_host_reset,
97 	.can_queue		 = 1,
98 	.this_id		 = NSP_INITIATOR_ID,
99 	.sg_tablesize		 = SG_ALL,
100 	.cmd_per_lun		 = 1,
101 	.use_clustering		 = DISABLE_CLUSTERING,
102 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2))
103 	.use_new_eh_code	 = 1,
104 #endif
105 };
106 
107 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
108 
109 
110 
111 /*
112  * debug, error print
113  */
114 #ifndef NSP_DEBUG
115 # define NSP_DEBUG_MASK		0x000000
116 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
117 # define nsp_dbg(mask, args...) /* */
118 #else
119 # define NSP_DEBUG_MASK		0xffffff
120 # define nsp_msg(type, args...) \
121 	nsp_cs_message (__FUNCTION__, __LINE__, (type), args)
122 # define nsp_dbg(mask, args...) \
123 	nsp_cs_dmessage(__FUNCTION__, __LINE__, (mask), args)
124 #endif
125 
126 #define NSP_DEBUG_QUEUECOMMAND		BIT(0)
127 #define NSP_DEBUG_REGISTER		BIT(1)
128 #define NSP_DEBUG_AUTOSCSI		BIT(2)
129 #define NSP_DEBUG_INTR			BIT(3)
130 #define NSP_DEBUG_SGLIST		BIT(4)
131 #define NSP_DEBUG_BUSFREE		BIT(5)
132 #define NSP_DEBUG_CDB_CONTENTS		BIT(6)
133 #define NSP_DEBUG_RESELECTION		BIT(7)
134 #define NSP_DEBUG_MSGINOCCUR		BIT(8)
135 #define NSP_DEBUG_EEPROM		BIT(9)
136 #define NSP_DEBUG_MSGOUTOCCUR		BIT(10)
137 #define NSP_DEBUG_BUSRESET		BIT(11)
138 #define NSP_DEBUG_RESTART		BIT(12)
139 #define NSP_DEBUG_SYNC			BIT(13)
140 #define NSP_DEBUG_WAIT			BIT(14)
141 #define NSP_DEBUG_TARGETFLAG		BIT(15)
142 #define NSP_DEBUG_PROC			BIT(16)
143 #define NSP_DEBUG_INIT			BIT(17)
144 #define NSP_DEBUG_DATA_IO      		BIT(18)
145 #define NSP_SPECIAL_PRINT_REGISTER	BIT(20)
146 
147 #define NSP_DEBUG_BUF_LEN		150
148 
149 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
150 {
151 	va_list args;
152 	char buf[NSP_DEBUG_BUF_LEN];
153 
154 	va_start(args, fmt);
155 	vsnprintf(buf, sizeof(buf), fmt, args);
156 	va_end(args);
157 
158 #ifndef NSP_DEBUG
159 	printk("%snsp_cs: %s\n", type, buf);
160 #else
161 	printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
162 #endif
163 }
164 
165 #ifdef NSP_DEBUG
166 static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
167 {
168 	va_list args;
169 	char buf[NSP_DEBUG_BUF_LEN];
170 
171 	va_start(args, fmt);
172 	vsnprintf(buf, sizeof(buf), fmt, args);
173 	va_end(args);
174 
175 	if (mask & NSP_DEBUG_MASK) {
176 		printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
177 	}
178 }
179 #endif
180 
181 /***********************************************************/
182 
183 /*====================================================
184  * Clenaup parameters and call done() functions.
185  * You must be set SCpnt->result before call this function.
186  */
187 static void nsp_scsi_done(Scsi_Cmnd *SCpnt)
188 {
189 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
190 
191 	data->CurrentSC = NULL;
192 
193 	SCpnt->scsi_done(SCpnt);
194 }
195 
196 static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
197 {
198 #ifdef NSP_DEBUG
199 	/*unsigned int host_id = SCpnt->device->host->this_id;*/
200 	/*unsigned int base    = SCpnt->device->host->io_port;*/
201 	unsigned char target = scmd_id(SCpnt);
202 #endif
203 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
204 
205 	nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d",
206 		   SCpnt, target, SCpnt->device->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg);
207 	//nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
208 
209 	SCpnt->scsi_done	= done;
210 
211 	if (data->CurrentSC != NULL) {
212 		nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
213 		SCpnt->result   = DID_BAD_TARGET << 16;
214 		nsp_scsi_done(SCpnt);
215 		return 0;
216 	}
217 
218 #if 0
219 	/* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
220 	        This makes kernel crash when suspending... */
221 	if (data->ScsiInfo->stop != 0) {
222 		nsp_msg(KERN_INFO, "suspending device. reject command.");
223 		SCpnt->result  = DID_BAD_TARGET << 16;
224 		nsp_scsi_done(SCpnt);
225 		return SCSI_MLQUEUE_HOST_BUSY;
226 	}
227 #endif
228 
229 	show_command(SCpnt);
230 
231 	data->CurrentSC		= SCpnt;
232 
233 	SCpnt->SCp.Status	= CHECK_CONDITION;
234 	SCpnt->SCp.Message	= 0;
235 	SCpnt->SCp.have_data_in = IO_UNKNOWN;
236 	SCpnt->SCp.sent_command = 0;
237 	SCpnt->SCp.phase	= PH_UNDETERMINED;
238 	SCpnt->resid	        = SCpnt->request_bufflen;
239 
240 	/* setup scratch area
241 	   SCp.ptr		: buffer pointer
242 	   SCp.this_residual	: buffer length
243 	   SCp.buffer		: next buffer
244 	   SCp.buffers_residual : left buffers in list
245 	   SCp.phase		: current state of the command */
246 	if (SCpnt->use_sg) {
247 		SCpnt->SCp.buffer	    = (struct scatterlist *) SCpnt->request_buffer;
248 		SCpnt->SCp.ptr		    = BUFFER_ADDR;
249 		SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
250 		SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
251 	} else {
252 		SCpnt->SCp.ptr		    = (char *) SCpnt->request_buffer;
253 		SCpnt->SCp.this_residual    = SCpnt->request_bufflen;
254 		SCpnt->SCp.buffer	    = NULL;
255 		SCpnt->SCp.buffers_residual = 0;
256 	}
257 
258 	if (nsphw_start_selection(SCpnt) == FALSE) {
259 		nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
260 		SCpnt->result   = DID_BUS_BUSY << 16;
261 		nsp_scsi_done(SCpnt);
262 		return 0;
263 	}
264 
265 
266 	//nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
267 #ifdef NSP_DEBUG
268 	data->CmdId++;
269 #endif
270 	return 0;
271 }
272 
273 /*
274  * setup PIO FIFO transfer mode and enable/disable to data out
275  */
276 static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
277 {
278 	unsigned int  base = data->BaseAddress;
279 	unsigned char transfer_mode_reg;
280 
281 	//nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
282 
283 	if (enabled != FALSE) {
284 		transfer_mode_reg = TRANSFER_GO | BRAIND;
285 	} else {
286 		transfer_mode_reg = 0;
287 	}
288 
289 	transfer_mode_reg |= data->TransferMode;
290 
291 	nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
292 }
293 
294 static void nsphw_init_sync(nsp_hw_data *data)
295 {
296 	sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
297 			       .SyncPeriod      = 0,
298 			       .SyncOffset      = 0
299 	};
300 	int i;
301 
302 	/* setup sync data */
303 	for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
304 		data->Sync[i] = tmp_sync;
305 	}
306 }
307 
308 /*
309  * Initialize Ninja hardware
310  */
311 static int nsphw_init(nsp_hw_data *data)
312 {
313 	unsigned int base     = data->BaseAddress;
314 
315 	nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
316 
317 	data->ScsiClockDiv = CLOCK_40M | FAST_20;
318 	data->CurrentSC    = NULL;
319 	data->FifoCount    = 0;
320 	data->TransferMode = MODE_IO8;
321 
322 	nsphw_init_sync(data);
323 
324 	/* block all interrupts */
325 	nsp_write(base,	      IRQCONTROL,   IRQCONTROL_ALLMASK);
326 
327 	/* setup SCSI interface */
328 	nsp_write(base,	      IFSELECT,	    IF_IFSEL);
329 
330 	nsp_index_write(base, SCSIIRQMODE,  0);
331 
332 	nsp_index_write(base, TRANSFERMODE, MODE_IO8);
333 	nsp_index_write(base, CLOCKDIV,	    data->ScsiClockDiv);
334 
335 	nsp_index_write(base, PARITYCTRL,   0);
336 	nsp_index_write(base, POINTERCLR,   POINTER_CLEAR     |
337 					    ACK_COUNTER_CLEAR |
338 					    REQ_COUNTER_CLEAR |
339 					    HOST_COUNTER_CLEAR);
340 
341 	/* setup fifo asic */
342 	nsp_write(base,	      IFSELECT,	    IF_REGSEL);
343 	nsp_index_write(base, TERMPWRCTRL,  0);
344 	if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
345 		nsp_msg(KERN_INFO, "terminator power on");
346 		nsp_index_write(base, TERMPWRCTRL, POWER_ON);
347 	}
348 
349 	nsp_index_write(base, TIMERCOUNT,   0);
350 	nsp_index_write(base, TIMERCOUNT,   0); /* requires 2 times!! */
351 
352 	nsp_index_write(base, SYNCREG,	    0);
353 	nsp_index_write(base, ACKWIDTH,	    0);
354 
355 	/* enable interrupts and ack them */
356 	nsp_index_write(base, SCSIIRQMODE,  SCSI_PHASE_CHANGE_EI |
357 					    RESELECT_EI		 |
358 					    SCSI_RESET_IRQ_EI	 );
359 	nsp_write(base,	      IRQCONTROL,   IRQCONTROL_ALLCLEAR);
360 
361 	nsp_setup_fifo(data, FALSE);
362 
363 	return TRUE;
364 }
365 
366 /*
367  * Start selection phase
368  */
369 static int nsphw_start_selection(Scsi_Cmnd *SCpnt)
370 {
371 	unsigned int  host_id	 = SCpnt->device->host->this_id;
372 	unsigned int  base	 = SCpnt->device->host->io_port;
373 	unsigned char target	 = scmd_id(SCpnt);
374 	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
375 	int	      time_out;
376 	unsigned char phase, arbit;
377 
378 	//nsp_dbg(NSP_DEBUG_RESELECTION, "in");
379 
380 	phase = nsp_index_read(base, SCSIBUSMON);
381 	if(phase != BUSMON_BUS_FREE) {
382 		//nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
383 		return FALSE;
384 	}
385 
386 	/* start arbitration */
387 	//nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
388 	SCpnt->SCp.phase = PH_ARBSTART;
389 	nsp_index_write(base, SETARBIT, ARBIT_GO);
390 
391 	time_out = 1000;
392 	do {
393 		/* XXX: what a stupid chip! */
394 		arbit = nsp_index_read(base, ARBITSTATUS);
395 		//nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
396 		udelay(1); /* hold 1.2us */
397 	} while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
398 		(time_out-- != 0));
399 
400 	if (!(arbit & ARBIT_WIN)) {
401 		//nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
402 		nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
403 		return FALSE;
404 	}
405 
406 	/* assert select line */
407 	//nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
408 	SCpnt->SCp.phase = PH_SELSTART;
409 	udelay(3); /* wait 2.4us */
410 	nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
411 	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY                    | SCSI_ATN);
412 	udelay(2); /* wait >1.2us */
413 	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
414 	nsp_index_write(base, SETARBIT,	     ARBIT_FLAG_CLEAR);
415 	/*udelay(1);*/ /* wait >90ns */
416 	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL            | SCSI_DATAOUT_ENB | SCSI_ATN);
417 
418 	/* check selection timeout */
419 	nsp_start_timer(SCpnt, 1000/51);
420 	data->SelectionTimeOut = 1;
421 
422 	return TRUE;
423 }
424 
425 struct nsp_sync_table {
426 	unsigned int min_period;
427 	unsigned int max_period;
428 	unsigned int chip_period;
429 	unsigned int ack_width;
430 };
431 
432 static struct nsp_sync_table nsp_sync_table_40M[] = {
433 	{0x0c, 0x0c, 0x1, 0},	/* 20MB	  50ns*/
434 	{0x19, 0x19, 0x3, 1},	/* 10MB	 100ns*/
435 	{0x1a, 0x25, 0x5, 2},	/* 7.5MB 150ns*/
436 	{0x26, 0x32, 0x7, 3},	/* 5MB	 200ns*/
437 	{   0,    0,   0, 0},
438 };
439 
440 static struct nsp_sync_table nsp_sync_table_20M[] = {
441 	{0x19, 0x19, 0x1, 0},	/* 10MB	 100ns*/
442 	{0x1a, 0x25, 0x2, 0},	/* 7.5MB 150ns*/
443 	{0x26, 0x32, 0x3, 1},	/* 5MB	 200ns*/
444 	{   0,    0,   0, 0},
445 };
446 
447 /*
448  * setup synchronous data transfer mode
449  */
450 static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt)
451 {
452 	unsigned char	       target = scmd_id(SCpnt);
453 //	unsigned char	       lun    = SCpnt->device->lun;
454 	nsp_hw_data           *data   = (nsp_hw_data *)SCpnt->device->host->hostdata;
455 	sync_data	      *sync   = &(data->Sync[target]);
456 	struct nsp_sync_table *sync_table;
457 	unsigned int	       period, offset;
458 	int		       i;
459 
460 
461 	nsp_dbg(NSP_DEBUG_SYNC, "in");
462 
463 	period = sync->SyncPeriod;
464 	offset = sync->SyncOffset;
465 
466 	nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
467 
468 	if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
469 		sync_table = nsp_sync_table_20M;
470 	} else {
471 		sync_table = nsp_sync_table_40M;
472 	}
473 
474 	for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
475 		if ( period >= sync_table->min_period &&
476 		     period <= sync_table->max_period	 ) {
477 			break;
478 		}
479 	}
480 
481 	if (period != 0 && sync_table->max_period == 0) {
482 		/*
483 		 * No proper period/offset found
484 		 */
485 		nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
486 
487 		sync->SyncPeriod      = 0;
488 		sync->SyncOffset      = 0;
489 		sync->SyncRegister    = 0;
490 		sync->AckWidth	      = 0;
491 
492 		return FALSE;
493 	}
494 
495 	sync->SyncRegister    = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
496 		                (offset & SYNCREG_OFFSET_MASK);
497 	sync->AckWidth	      = sync_table->ack_width;
498 
499 	nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
500 
501 	return TRUE;
502 }
503 
504 
505 /*
506  * start ninja hardware timer
507  */
508 static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time)
509 {
510 	unsigned int base = SCpnt->device->host->io_port;
511 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
512 
513 	//nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
514 	data->TimerCount = time;
515 	nsp_index_write(base, TIMERCOUNT, time);
516 }
517 
518 /*
519  * wait for bus phase change
520  */
521 static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str)
522 {
523 	unsigned int  base = SCpnt->device->host->io_port;
524 	unsigned char reg;
525 	int	      time_out;
526 
527 	//nsp_dbg(NSP_DEBUG_INTR, "in");
528 
529 	time_out = 100;
530 
531 	do {
532 		reg = nsp_index_read(base, SCSIBUSMON);
533 		if (reg == 0xff) {
534 			break;
535 		}
536 	} while ((time_out-- != 0) && (reg & mask) != 0);
537 
538 	if (time_out == 0) {
539 		nsp_msg(KERN_DEBUG, " %s signal off timeut", str);
540 	}
541 
542 	return 0;
543 }
544 
545 /*
546  * expect Ninja Irq
547  */
548 static int nsp_expect_signal(Scsi_Cmnd	   *SCpnt,
549 			     unsigned char  current_phase,
550 			     unsigned char  mask)
551 {
552 	unsigned int  base	 = SCpnt->device->host->io_port;
553 	int	      time_out;
554 	unsigned char phase, i_src;
555 
556 	//nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
557 
558 	time_out = 100;
559 	do {
560 		phase = nsp_index_read(base, SCSIBUSMON);
561 		if (phase == 0xff) {
562 			//nsp_dbg(NSP_DEBUG_INTR, "ret -1");
563 			return -1;
564 		}
565 		i_src = nsp_read(base, IRQSTATUS);
566 		if (i_src & IRQSTATUS_SCSI) {
567 			//nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
568 			return 0;
569 		}
570 		if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) {
571 			//nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
572 			return 1;
573 		}
574 	} while(time_out-- != 0);
575 
576 	//nsp_dbg(NSP_DEBUG_INTR, "timeout");
577 	return -1;
578 }
579 
580 /*
581  * transfer SCSI message
582  */
583 static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase)
584 {
585 	unsigned int  base = SCpnt->device->host->io_port;
586 	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
587 	char	     *buf  = data->MsgBuffer;
588 	int	      len  = min(MSGBUF_SIZE, data->MsgLen);
589 	int	      ptr;
590 	int	      ret;
591 
592 	//nsp_dbg(NSP_DEBUG_DATA_IO, "in");
593 	for (ptr = 0; len > 0; len--, ptr++) {
594 
595 		ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ);
596 		if (ret <= 0) {
597 			nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit");
598 			return 0;
599 		}
600 
601 		/* if last byte, negate ATN */
602 		if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
603 			nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
604 		}
605 
606 		/* read & write message */
607 		if (phase & BUSMON_IO) {
608 			nsp_dbg(NSP_DEBUG_DATA_IO, "read msg");
609 			buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK);
610 		} else {
611 			nsp_dbg(NSP_DEBUG_DATA_IO, "write msg");
612 			nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]);
613 		}
614 		nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>");
615 
616 	}
617 	return len;
618 }
619 
620 /*
621  * get extra SCSI data from fifo
622  */
623 static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt)
624 {
625 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
626 	unsigned int count;
627 
628 	//nsp_dbg(NSP_DEBUG_DATA_IO, "in");
629 
630 	if (SCpnt->SCp.have_data_in != IO_IN) {
631 		return 0;
632 	}
633 
634 	count = nsp_fifo_count(SCpnt);
635 	if (data->FifoCount == count) {
636 		//nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
637 		return 0;
638 	}
639 
640 	/*
641 	 * XXX: NSP_QUIRK
642 	 * data phase skip only occures in case of SCSI_LOW_READ
643 	 */
644 	nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
645 	SCpnt->SCp.phase = PH_DATA;
646 	nsp_pio_read(SCpnt);
647 	nsp_setup_fifo(data, FALSE);
648 
649 	return 0;
650 }
651 
652 /*
653  * accept reselection
654  */
655 static int nsp_reselected(Scsi_Cmnd *SCpnt)
656 {
657 	unsigned int  base    = SCpnt->device->host->io_port;
658 	unsigned int  host_id = SCpnt->device->host->this_id;
659 	//nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
660 	unsigned char bus_reg;
661 	unsigned char id_reg, tmp;
662 	int target;
663 
664 	nsp_dbg(NSP_DEBUG_RESELECTION, "in");
665 
666 	id_reg = nsp_index_read(base, RESELECTID);
667 	tmp    = id_reg & (~BIT(host_id));
668 	target = 0;
669 	while(tmp != 0) {
670 		if (tmp & BIT(0)) {
671 			break;
672 		}
673 		tmp >>= 1;
674 		target++;
675 	}
676 
677 	if (scmd_id(SCpnt) != target) {
678 		nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target);
679 	}
680 
681 	nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>");
682 
683 	nsp_nexus(SCpnt);
684 	bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN);
685 	nsp_index_write(base, SCSIBUSCTRL, bus_reg);
686 	nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB);
687 
688 	return TRUE;
689 }
690 
691 /*
692  * count how many data transferd
693  */
694 static int nsp_fifo_count(Scsi_Cmnd *SCpnt)
695 {
696 	unsigned int base = SCpnt->device->host->io_port;
697 	unsigned int count;
698 	unsigned int l, m, h, dummy;
699 
700 	nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER);
701 
702 	l     = nsp_index_read(base, TRANSFERCOUNT);
703 	m     = nsp_index_read(base, TRANSFERCOUNT);
704 	h     = nsp_index_read(base, TRANSFERCOUNT);
705 	dummy = nsp_index_read(base, TRANSFERCOUNT); /* required this! */
706 
707 	count = (h << 16) | (m << 8) | (l << 0);
708 
709 	//nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
710 
711 	return count;
712 }
713 
714 /* fifo size */
715 #define RFIFO_CRIT 64
716 #define WFIFO_CRIT 64
717 
718 /*
719  * read data in DATA IN phase
720  */
721 static void nsp_pio_read(Scsi_Cmnd *SCpnt)
722 {
723 	unsigned int  base      = SCpnt->device->host->io_port;
724 	unsigned long mmio_base = SCpnt->device->host->base;
725 	nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
726 	long	      time_out;
727 	int	      ocount, res;
728 	unsigned char stat, fifo_stat;
729 
730 	ocount = data->FifoCount;
731 
732 	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",
733 		SCpnt, SCpnt->resid, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual);
734 
735 	time_out = 1000;
736 
737 	while ((time_out-- != 0) &&
738 	       (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
739 
740 		stat = nsp_index_read(base, SCSIBUSMON);
741 		stat &= BUSMON_PHASE_MASK;
742 
743 
744 		res = nsp_fifo_count(SCpnt) - ocount;
745 		//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);
746 		if (res == 0) { /* if some data avilable ? */
747 			if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
748 				//nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
749 				continue;
750 			} else {
751 				nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
752 				break;
753 			}
754 		}
755 
756 		fifo_stat = nsp_read(base, FIFOSTATUS);
757 		if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 &&
758 		    stat                                == BUSPHASE_DATA_IN) {
759 			continue;
760 		}
761 
762 		res = min(res, SCpnt->SCp.this_residual);
763 
764 		switch (data->TransferMode) {
765 		case MODE_IO32:
766 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
767 			nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
768 			break;
769 		case MODE_IO8:
770 			nsp_fifo8_read (base, SCpnt->SCp.ptr, res     );
771 			break;
772 
773 		case MODE_MEM32:
774 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
775 			nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
776 			break;
777 
778 		default:
779 			nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode");
780 			return;
781 		}
782 
783 		SCpnt->resid	       	 -= res;
784 		SCpnt->SCp.ptr		 += res;
785 		SCpnt->SCp.this_residual -= res;
786 		ocount			 += res;
787 		//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
788 
789 		/* go to next scatter list if available */
790 		if (SCpnt->SCp.this_residual	== 0 &&
791 		    SCpnt->SCp.buffers_residual != 0 ) {
792 			//nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
793 			SCpnt->SCp.buffers_residual--;
794 			SCpnt->SCp.buffer++;
795 			SCpnt->SCp.ptr		 = BUFFER_ADDR;
796 			SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
797 			time_out = 1000;
798 
799 			//nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
800 		}
801 	}
802 
803 	data->FifoCount = ocount;
804 
805 	if (time_out == 0) {
806 		nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
807 			SCpnt->resid, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual);
808 	}
809 	nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
810 	nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid);
811 }
812 
813 /*
814  * write data in DATA OUT phase
815  */
816 static void nsp_pio_write(Scsi_Cmnd *SCpnt)
817 {
818 	unsigned int  base      = SCpnt->device->host->io_port;
819 	unsigned long mmio_base = SCpnt->device->host->base;
820 	nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
821 	int	      time_out;
822 	int           ocount, res;
823 	unsigned char stat;
824 
825 	ocount	 = data->FifoCount;
826 
827 	nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
828 		data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, SCpnt->resid);
829 
830 	time_out = 1000;
831 
832 	while ((time_out-- != 0) &&
833 	       (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
834 		stat = nsp_index_read(base, SCSIBUSMON);
835 		stat &= BUSMON_PHASE_MASK;
836 
837 		if (stat != BUSPHASE_DATA_OUT) {
838 			res = ocount - nsp_fifo_count(SCpnt);
839 
840 			nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
841 			/* Put back pointer */
842 			SCpnt->resid	       	 += res;
843 			SCpnt->SCp.ptr		 -= res;
844 			SCpnt->SCp.this_residual += res;
845 			ocount			 -= res;
846 
847 			break;
848 		}
849 
850 		res = ocount - nsp_fifo_count(SCpnt);
851 		if (res > 0) { /* write all data? */
852 			nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res);
853 			continue;
854 		}
855 
856 		res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
857 
858 		//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
859 		switch (data->TransferMode) {
860 		case MODE_IO32:
861 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
862 			nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
863 			break;
864 		case MODE_IO8:
865 			nsp_fifo8_write (base, SCpnt->SCp.ptr, res     );
866 			break;
867 
868 		case MODE_MEM32:
869 			res &= ~(BIT(1)|BIT(0)); /* align 4 */
870 			nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
871 			break;
872 
873 		default:
874 			nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode");
875 			break;
876 		}
877 
878 		SCpnt->resid	       	 -= res;
879 		SCpnt->SCp.ptr		 += res;
880 		SCpnt->SCp.this_residual -= res;
881 		ocount			 += res;
882 
883 		/* go to next scatter list if available */
884 		if (SCpnt->SCp.this_residual	== 0 &&
885 		    SCpnt->SCp.buffers_residual != 0 ) {
886 			//nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
887 			SCpnt->SCp.buffers_residual--;
888 			SCpnt->SCp.buffer++;
889 			SCpnt->SCp.ptr		 = BUFFER_ADDR;
890 			SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
891 			time_out = 1000;
892 		}
893 	}
894 
895 	data->FifoCount = ocount;
896 
897 	if (time_out == 0) {
898 		nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x", SCpnt->resid);
899 	}
900 	nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
901 	nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid);
902 }
903 #undef RFIFO_CRIT
904 #undef WFIFO_CRIT
905 
906 /*
907  * setup synchronous/asynchronous data transfer mode
908  */
909 static int nsp_nexus(Scsi_Cmnd *SCpnt)
910 {
911 	unsigned int   base   = SCpnt->device->host->io_port;
912 	unsigned char  target = scmd_id(SCpnt);
913 //	unsigned char  lun    = SCpnt->device->lun;
914 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
915 	sync_data     *sync   = &(data->Sync[target]);
916 
917 	//nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
918 
919 	/* setup synch transfer registers */
920 	nsp_index_write(base, SYNCREG,	sync->SyncRegister);
921 	nsp_index_write(base, ACKWIDTH, sync->AckWidth);
922 
923 	if (SCpnt->use_sg    == 0        ||
924 	    SCpnt->resid % 4 != 0        ||
925 	    SCpnt->resid     <= PAGE_SIZE ) {
926 		data->TransferMode = MODE_IO8;
927 	} else if (nsp_burst_mode == BURST_MEM32) {
928 		data->TransferMode = MODE_MEM32;
929 	} else if (nsp_burst_mode == BURST_IO32) {
930 		data->TransferMode = MODE_IO32;
931 	} else {
932 		data->TransferMode = MODE_IO8;
933 	}
934 
935 	/* setup pdma fifo */
936 	nsp_setup_fifo(data, TRUE);
937 
938 	/* clear ack counter */
939  	data->FifoCount = 0;
940 	nsp_index_write(base, POINTERCLR, POINTER_CLEAR	    |
941 					  ACK_COUNTER_CLEAR |
942 					  REQ_COUNTER_CLEAR |
943 					  HOST_COUNTER_CLEAR);
944 
945 	return 0;
946 }
947 
948 #include "nsp_message.c"
949 /*
950  * interrupt handler
951  */
952 static irqreturn_t nspintr(int irq, void *dev_id, struct pt_regs *regs)
953 {
954 	unsigned int   base;
955 	unsigned char  irq_status, irq_phase, phase;
956 	Scsi_Cmnd     *tmpSC;
957 	unsigned char  target, lun;
958 	unsigned int  *sync_neg;
959 	int            i, tmp;
960 	nsp_hw_data   *data;
961 
962 
963 	//nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
964 	//nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
965 
966 	if (                dev_id        != NULL &&
967 	    ((scsi_info_t *)dev_id)->host != NULL  ) {
968 		scsi_info_t *info = (scsi_info_t *)dev_id;
969 
970 		data = (nsp_hw_data *)info->host->hostdata;
971 	} else {
972 		nsp_dbg(NSP_DEBUG_INTR, "host data wrong");
973 		return IRQ_NONE;
974 	}
975 
976 	//nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
977 
978 	base = data->BaseAddress;
979 	//nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
980 
981 	/*
982 	 * interrupt check
983 	 */
984 	nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE);
985 	irq_status = nsp_read(base, IRQSTATUS);
986 	//nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
987 	if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) {
988 		nsp_write(base, IRQCONTROL, 0);
989 		//nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
990 		return IRQ_NONE;
991 	}
992 
993 	/* XXX: IMPORTANT
994 	 * Do not read an irq_phase register if no scsi phase interrupt.
995 	 * Unless, you should lose a scsi phase interrupt.
996 	 */
997 	phase = nsp_index_read(base, SCSIBUSMON);
998 	if((irq_status & IRQSTATUS_SCSI) != 0) {
999 		irq_phase = nsp_index_read(base, IRQPHASESENCE);
1000 	} else {
1001 		irq_phase = 0;
1002 	}
1003 
1004 	//nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1005 
1006 	/*
1007 	 * timer interrupt handler (scsi vs timer interrupts)
1008 	 */
1009 	//nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1010 	if (data->TimerCount != 0) {
1011 		//nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1012 		nsp_index_write(base, TIMERCOUNT, 0);
1013 		nsp_index_write(base, TIMERCOUNT, 0);
1014 		data->TimerCount = 0;
1015 	}
1016 
1017 	if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER &&
1018 	    data->SelectionTimeOut == 0) {
1019 		//nsp_dbg(NSP_DEBUG_INTR, "timer start");
1020 		nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR);
1021 		return IRQ_HANDLED;
1022 	}
1023 
1024 	nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR);
1025 
1026 	if ((irq_status & IRQSTATUS_SCSI) &&
1027 	    (irq_phase  & SCSI_RESET_IRQ)) {
1028 		nsp_msg(KERN_ERR, "bus reset (power off?)");
1029 
1030 		nsphw_init(data);
1031 		nsp_bus_reset(data);
1032 
1033 		if(data->CurrentSC != NULL) {
1034 			tmpSC = data->CurrentSC;
1035 			tmpSC->result  = (DID_RESET                   << 16) |
1036 				         ((tmpSC->SCp.Message & 0xff) <<  8) |
1037 				         ((tmpSC->SCp.Status  & 0xff) <<  0);
1038 			nsp_scsi_done(tmpSC);
1039 		}
1040 		return IRQ_HANDLED;
1041 	}
1042 
1043 	if (data->CurrentSC == NULL) {
1044 		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);
1045 		nsphw_init(data);
1046 		nsp_bus_reset(data);
1047 		return IRQ_HANDLED;
1048 	}
1049 
1050 	tmpSC    = data->CurrentSC;
1051 	target   = tmpSC->device->id;
1052 	lun      = tmpSC->device->lun;
1053 	sync_neg = &(data->Sync[target].SyncNegotiation);
1054 
1055 	/*
1056 	 * parse hardware SCSI irq reasons register
1057 	 */
1058 	if (irq_status & IRQSTATUS_SCSI) {
1059 		if (irq_phase & RESELECT_IRQ) {
1060 			nsp_dbg(NSP_DEBUG_INTR, "reselect");
1061 			nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR);
1062 			if (nsp_reselected(tmpSC) != FALSE) {
1063 				return IRQ_HANDLED;
1064 			}
1065 		}
1066 
1067 		if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) {
1068 			return IRQ_HANDLED;
1069 		}
1070 	}
1071 
1072 	//show_phase(tmpSC);
1073 
1074 	switch(tmpSC->SCp.phase) {
1075 	case PH_SELSTART:
1076 		// *sync_neg = SYNC_NOT_YET;
1077 		if ((phase & BUSMON_BSY) == 0) {
1078 			//nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1079 			if (data->SelectionTimeOut >= NSP_SELTIMEOUT) {
1080 				nsp_dbg(NSP_DEBUG_INTR, "selection time out");
1081 				data->SelectionTimeOut = 0;
1082 				nsp_index_write(base, SCSIBUSCTRL, 0);
1083 
1084 				tmpSC->result   = DID_TIME_OUT << 16;
1085 				nsp_scsi_done(tmpSC);
1086 
1087 				return IRQ_HANDLED;
1088 			}
1089 			data->SelectionTimeOut += 1;
1090 			nsp_start_timer(tmpSC, 1000/51);
1091 			return IRQ_HANDLED;
1092 		}
1093 
1094 		/* attention assert */
1095 		//nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1096 		data->SelectionTimeOut = 0;
1097 		tmpSC->SCp.phase       = PH_SELECTED;
1098 		nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
1099 		udelay(1);
1100 		nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
1101 		return IRQ_HANDLED;
1102 
1103 		break;
1104 
1105 	case PH_RESELECT:
1106 		//nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1107 		// *sync_neg = SYNC_NOT_YET;
1108 		if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) {
1109 
1110 			tmpSC->result	= DID_ABORT << 16;
1111 			nsp_scsi_done(tmpSC);
1112 			return IRQ_HANDLED;
1113 		}
1114 		/* fall thru */
1115 	default:
1116 		if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) {
1117 			return IRQ_HANDLED;
1118 		}
1119 		break;
1120 	}
1121 
1122 	/*
1123 	 * SCSI sequencer
1124 	 */
1125 	//nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1126 
1127 	/* normal disconnect */
1128 	if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
1129 	    (irq_phase & LATCHED_BUS_FREE) != 0 ) {
1130 		nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1131 
1132 		//*sync_neg       = SYNC_NOT_YET;
1133 
1134 		if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) {     /* all command complete and return status */
1135 			tmpSC->result = (DID_OK		             << 16) |
1136 					((tmpSC->SCp.Message & 0xff) <<  8) |
1137 					((tmpSC->SCp.Status  & 0xff) <<  0);
1138 			nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
1139 			nsp_scsi_done(tmpSC);
1140 
1141 			return IRQ_HANDLED;
1142 		}
1143 
1144 		return IRQ_HANDLED;
1145 	}
1146 
1147 
1148 	/* check unexpected bus free state */
1149 	if (phase == 0) {
1150 		nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1151 
1152 		*sync_neg       = SYNC_NG;
1153 		tmpSC->result   = DID_ERROR << 16;
1154 		nsp_scsi_done(tmpSC);
1155 		return IRQ_HANDLED;
1156 	}
1157 
1158 	switch (phase & BUSMON_PHASE_MASK) {
1159 	case BUSPHASE_COMMAND:
1160 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND");
1161 		if ((phase & BUSMON_REQ) == 0) {
1162 			nsp_dbg(NSP_DEBUG_INTR, "REQ == 0");
1163 			return IRQ_HANDLED;
1164 		}
1165 
1166 		tmpSC->SCp.phase = PH_COMMAND;
1167 
1168 		nsp_nexus(tmpSC);
1169 
1170 		/* write scsi command */
1171 		nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len);
1172 		nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER);
1173 		for (i = 0; i < tmpSC->cmd_len; i++) {
1174 			nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]);
1175 		}
1176 		nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO);
1177 		break;
1178 
1179 	case BUSPHASE_DATA_OUT:
1180 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
1181 
1182 		tmpSC->SCp.phase        = PH_DATA;
1183 		tmpSC->SCp.have_data_in = IO_OUT;
1184 
1185 		nsp_pio_write(tmpSC);
1186 
1187 		break;
1188 
1189 	case BUSPHASE_DATA_IN:
1190 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
1191 
1192 		tmpSC->SCp.phase        = PH_DATA;
1193 		tmpSC->SCp.have_data_in = IO_IN;
1194 
1195 		nsp_pio_read(tmpSC);
1196 
1197 		break;
1198 
1199 	case BUSPHASE_STATUS:
1200 		nsp_dataphase_bypass(tmpSC);
1201 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
1202 
1203 		tmpSC->SCp.phase = PH_STATUS;
1204 
1205 		tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
1206 		nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
1207 
1208 		break;
1209 
1210 	case BUSPHASE_MESSAGE_OUT:
1211 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT");
1212 		if ((phase & BUSMON_REQ) == 0) {
1213 			goto timer_out;
1214 		}
1215 
1216 		tmpSC->SCp.phase = PH_MSG_OUT;
1217 
1218 		//*sync_neg = SYNC_NOT_YET;
1219 
1220 		data->MsgLen = i = 0;
1221 		data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++;
1222 
1223 		if (*sync_neg == SYNC_NOT_YET) {
1224 			data->Sync[target].SyncPeriod = 0;
1225 			data->Sync[target].SyncOffset = 0;
1226 
1227 			/**/
1228 			data->MsgBuffer[i] = MSG_EXTENDED; i++;
1229 			data->MsgBuffer[i] = 3;            i++;
1230 			data->MsgBuffer[i] = MSG_EXT_SDTR; i++;
1231 			data->MsgBuffer[i] = 0x0c;         i++;
1232 			data->MsgBuffer[i] = 15;           i++;
1233 			/**/
1234 		}
1235 		data->MsgLen = i;
1236 
1237 		nsp_analyze_sdtr(tmpSC);
1238 		show_message(data);
1239 		nsp_message_out(tmpSC);
1240 		break;
1241 
1242 	case BUSPHASE_MESSAGE_IN:
1243 		nsp_dataphase_bypass(tmpSC);
1244 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN");
1245 		if ((phase & BUSMON_REQ) == 0) {
1246 			goto timer_out;
1247 		}
1248 
1249 		tmpSC->SCp.phase = PH_MSG_IN;
1250 		nsp_message_in(tmpSC);
1251 
1252 		/**/
1253 		if (*sync_neg == SYNC_NOT_YET) {
1254 			//nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1255 
1256 			if (data->MsgLen       >= 5            &&
1257 			    data->MsgBuffer[0] == MSG_EXTENDED &&
1258 			    data->MsgBuffer[1] == 3            &&
1259 			    data->MsgBuffer[2] == MSG_EXT_SDTR ) {
1260 				data->Sync[target].SyncPeriod = data->MsgBuffer[3];
1261 				data->Sync[target].SyncOffset = data->MsgBuffer[4];
1262 				//nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1263 				*sync_neg = SYNC_OK;
1264 			} else {
1265 				data->Sync[target].SyncPeriod = 0;
1266 				data->Sync[target].SyncOffset = 0;
1267 				*sync_neg = SYNC_NG;
1268 			}
1269 			nsp_analyze_sdtr(tmpSC);
1270 		}
1271 		/**/
1272 
1273 		/* search last messeage byte */
1274 		tmp = -1;
1275 		for (i = 0; i < data->MsgLen; i++) {
1276 			tmp = data->MsgBuffer[i];
1277 			if (data->MsgBuffer[i] == MSG_EXTENDED) {
1278 				i += (1 + data->MsgBuffer[i+1]);
1279 			}
1280 		}
1281 		tmpSC->SCp.Message = tmp;
1282 
1283 		nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
1284 		show_message(data);
1285 
1286 		break;
1287 
1288 	case BUSPHASE_SELECT:
1289 	default:
1290 		nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other");
1291 
1292 		break;
1293 	}
1294 
1295 	//nsp_dbg(NSP_DEBUG_INTR, "out");
1296 	return IRQ_HANDLED;
1297 
1298 timer_out:
1299 	nsp_start_timer(tmpSC, 1000/102);
1300 	return IRQ_HANDLED;
1301 }
1302 
1303 #ifdef NSP_DEBUG
1304 #include "nsp_debug.c"
1305 #endif	/* NSP_DEBUG */
1306 
1307 /*----------------------------------------------------------------*/
1308 /* look for ninja3 card and init if found			  */
1309 /*----------------------------------------------------------------*/
1310 static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
1311 {
1312 	struct Scsi_Host *host;	/* registered host structure */
1313 	nsp_hw_data *data_b = &nsp_data_base, *data;
1314 
1315 	nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
1316 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1317 	host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
1318 #else
1319 	host = scsi_register(sht, sizeof(nsp_hw_data));
1320 #endif
1321 	if (host == NULL) {
1322 		nsp_dbg(NSP_DEBUG_INIT, "host failed");
1323 		return NULL;
1324 	}
1325 
1326 	memcpy(host->hostdata, data_b, sizeof(nsp_hw_data));
1327 	data = (nsp_hw_data *)host->hostdata;
1328 	data->ScsiInfo->host = host;
1329 #ifdef NSP_DEBUG
1330 	data->CmdId = 0;
1331 #endif
1332 
1333 	nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber);
1334 
1335 	host->unique_id	  = data->BaseAddress;
1336 	host->io_port	  = data->BaseAddress;
1337 	host->n_io_port	  = data->NumAddress;
1338 	host->irq	  = data->IrqNumber;
1339 	host->base        = data->MmioAddress;
1340 
1341 	spin_lock_init(&(data->Lock));
1342 
1343 	snprintf(data->nspinfo,
1344 		 sizeof(data->nspinfo),
1345 		 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1346 		 host->io_port, host->io_port + host->n_io_port - 1,
1347 		 host->base,
1348 		 host->irq);
1349 	sht->name	  = data->nspinfo;
1350 
1351 	nsp_dbg(NSP_DEBUG_INIT, "end");
1352 
1353 
1354 	return host; /* detect done. */
1355 }
1356 
1357 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
1358 static int nsp_detect_old(struct scsi_host_template *sht)
1359 {
1360 	if (nsp_detect(sht) == NULL) {
1361 		return 0;
1362 	} else {
1363 		//MOD_INC_USE_COUNT;
1364 		return 1;
1365 	}
1366 }
1367 
1368 
1369 static int nsp_release_old(struct Scsi_Host *shpnt)
1370 {
1371 	//nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1372 
1373 	/* PCMCIA Card Service dose same things below. */
1374 	/* So we do nothing.                           */
1375 	//if (shpnt->irq) {
1376 	//	free_irq(shpnt->irq, data->ScsiInfo);
1377 	//}
1378 	//if (shpnt->io_port) {
1379 	//	release_region(shpnt->io_port, shpnt->n_io_port);
1380 	//}
1381 
1382 	//MOD_DEC_USE_COUNT;
1383 
1384 	return 0;
1385 }
1386 #endif
1387 
1388 /*----------------------------------------------------------------*/
1389 /* return info string						  */
1390 /*----------------------------------------------------------------*/
1391 static const char *nsp_info(struct Scsi_Host *shpnt)
1392 {
1393 	nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1394 
1395 	return data->nspinfo;
1396 }
1397 
1398 #undef SPRINTF
1399 #define SPRINTF(args...) \
1400         do { \
1401 		if(length > (pos - buffer)) { \
1402 			pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1403 			nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length,  length - (pos - buffer));\
1404 		} \
1405 	} while(0)
1406 static int
1407 nsp_proc_info(
1408 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1409 	struct Scsi_Host *host,
1410 #endif
1411 	char  *buffer,
1412 	char **start,
1413 	off_t  offset,
1414 	int    length,
1415 #if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1416 	int    hostno,
1417 #endif
1418 	int    inout)
1419 {
1420 	int id;
1421 	char *pos = buffer;
1422 	int thislength;
1423 	int speed;
1424 	unsigned long flags;
1425 	nsp_hw_data *data;
1426 #if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1427 	struct Scsi_Host *host;
1428 #else
1429 	int hostno;
1430 #endif
1431 	if (inout) {
1432 		return -EINVAL;
1433 	}
1434 
1435 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
1436 	hostno = host->host_no;
1437 #else
1438 	/* search this HBA host */
1439 	host = scsi_host_hn_get(hostno);
1440 	if (host == NULL) {
1441 		return -ESRCH;
1442 	}
1443 #endif
1444 	data = (nsp_hw_data *)host->hostdata;
1445 
1446 
1447 	SPRINTF("NinjaSCSI status\n\n");
1448 	SPRINTF("Driver version:        $Revision: 1.23 $\n");
1449 	SPRINTF("SCSI host No.:         %d\n",          hostno);
1450 	SPRINTF("IRQ:                   %d\n",          host->irq);
1451 	SPRINTF("IO:                    0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1);
1452 	SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1);
1453 	SPRINTF("sg_tablesize:          %d\n",          host->sg_tablesize);
1454 
1455 	SPRINTF("burst transfer mode:   ");
1456 	switch (nsp_burst_mode) {
1457 	case BURST_IO8:
1458 		SPRINTF("io8");
1459 		break;
1460 	case BURST_IO32:
1461 		SPRINTF("io32");
1462 		break;
1463 	case BURST_MEM32:
1464 		SPRINTF("mem32");
1465 		break;
1466 	default:
1467 		SPRINTF("???");
1468 		break;
1469 	}
1470 	SPRINTF("\n");
1471 
1472 
1473 	spin_lock_irqsave(&(data->Lock), flags);
1474 	SPRINTF("CurrentSC:             0x%p\n\n",      data->CurrentSC);
1475 	spin_unlock_irqrestore(&(data->Lock), flags);
1476 
1477 	SPRINTF("SDTR status\n");
1478 	for(id = 0; id < ARRAY_SIZE(data->Sync); id++) {
1479 
1480 		SPRINTF("id %d: ", id);
1481 
1482 		if (id == host->this_id) {
1483 			SPRINTF("----- NinjaSCSI-3 host adapter\n");
1484 			continue;
1485 		}
1486 
1487 		switch(data->Sync[id].SyncNegotiation) {
1488 		case SYNC_OK:
1489 			SPRINTF(" sync");
1490 			break;
1491 		case SYNC_NG:
1492 			SPRINTF("async");
1493 			break;
1494 		case SYNC_NOT_YET:
1495 			SPRINTF(" none");
1496 			break;
1497 		default:
1498 			SPRINTF("?????");
1499 			break;
1500 		}
1501 
1502 		if (data->Sync[id].SyncPeriod != 0) {
1503 			speed = 1000000 / (data->Sync[id].SyncPeriod * 4);
1504 
1505 			SPRINTF(" transfer %d.%dMB/s, offset %d",
1506 				speed / 1000,
1507 				speed % 1000,
1508 				data->Sync[id].SyncOffset
1509 				);
1510 		}
1511 		SPRINTF("\n");
1512 	}
1513 
1514 	thislength = pos - (buffer + offset);
1515 
1516 	if(thislength < 0) {
1517 		*start = NULL;
1518                 return 0;
1519         }
1520 
1521 
1522 	thislength = min(thislength, length);
1523 	*start = buffer + offset;
1524 
1525 	return thislength;
1526 }
1527 #undef SPRINTF
1528 
1529 /*---------------------------------------------------------------*/
1530 /* error handler                                                 */
1531 /*---------------------------------------------------------------*/
1532 
1533 /*
1534 static int nsp_eh_abort(Scsi_Cmnd *SCpnt)
1535 {
1536 	nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1537 
1538 	return nsp_eh_bus_reset(SCpnt);
1539 }*/
1540 
1541 static int nsp_bus_reset(nsp_hw_data *data)
1542 {
1543 	unsigned int base = data->BaseAddress;
1544 	int	     i;
1545 
1546 	nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
1547 
1548 	nsp_index_write(base, SCSIBUSCTRL, SCSI_RST);
1549 	mdelay(100); /* 100ms */
1550 	nsp_index_write(base, SCSIBUSCTRL, 0);
1551 	for(i = 0; i < 5; i++) {
1552 		nsp_index_read(base, IRQPHASESENCE); /* dummy read */
1553 	}
1554 
1555 	nsphw_init_sync(data);
1556 
1557 	nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
1558 
1559 	return SUCCESS;
1560 }
1561 
1562 static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt)
1563 {
1564 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1565 
1566 	nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1567 
1568 	return nsp_bus_reset(data);
1569 }
1570 
1571 static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt)
1572 {
1573 	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1574 
1575 	nsp_dbg(NSP_DEBUG_BUSRESET, "in");
1576 
1577 	nsphw_init(data);
1578 
1579 	return SUCCESS;
1580 }
1581 
1582 
1583 /**********************************************************************
1584   PCMCIA functions
1585 **********************************************************************/
1586 
1587 /*======================================================================
1588     nsp_cs_attach() creates an "instance" of the driver, allocating
1589     local data structures for one device.  The device is registered
1590     with Card Services.
1591 
1592     The dev_link structure is initialized, but we don't actually
1593     configure the card at this point -- we wait until we receive a
1594     card insertion event.
1595 ======================================================================*/
1596 static int nsp_cs_probe(struct pcmcia_device *link)
1597 {
1598 	scsi_info_t  *info;
1599 	nsp_hw_data  *data = &nsp_data_base;
1600 	int ret;
1601 
1602 	nsp_dbg(NSP_DEBUG_INIT, "in");
1603 
1604 	/* Create new SCSI device */
1605 	info = kmalloc(sizeof(*info), GFP_KERNEL);
1606 	if (info == NULL) { return -ENOMEM; }
1607 	memset(info, 0, sizeof(*info));
1608 	info->p_dev = link;
1609 	link->priv = info;
1610 	data->ScsiInfo = info;
1611 
1612 	nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1613 
1614 	/* The io structure describes IO port mapping */
1615 	link->io.NumPorts1	 = 0x10;
1616 	link->io.Attributes1	 = IO_DATA_PATH_WIDTH_AUTO;
1617 	link->io.IOAddrLines	 = 10;	/* not used */
1618 
1619 	/* Interrupt setup */
1620 	link->irq.Attributes	 = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
1621 	link->irq.IRQInfo1	 = IRQ_LEVEL_ID;
1622 
1623 	/* Interrupt handler */
1624 	link->irq.Handler	 = &nspintr;
1625 	link->irq.Instance       = info;
1626 	link->irq.Attributes     |= IRQF_SHARED;
1627 
1628 	/* General socket configuration */
1629 	link->conf.Attributes	 = CONF_ENABLE_IRQ;
1630 	link->conf.IntType	 = INT_MEMORY_AND_IO;
1631 	link->conf.Present	 = PRESENT_OPTION;
1632 
1633 	ret = nsp_cs_config(link);
1634 
1635 	nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1636 	return ret;
1637 } /* nsp_cs_attach */
1638 
1639 
1640 /*======================================================================
1641     This deletes a driver "instance".  The device is de-registered
1642     with Card Services.	 If it has been released, all local data
1643     structures are freed.  Otherwise, the structures will be freed
1644     when the device is released.
1645 ======================================================================*/
1646 static void nsp_cs_detach(struct pcmcia_device *link)
1647 {
1648 	nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1649 
1650 	((scsi_info_t *)link->priv)->stop = 1;
1651 	nsp_cs_release(link);
1652 
1653 	kfree(link->priv);
1654 	link->priv = NULL;
1655 } /* nsp_cs_detach */
1656 
1657 
1658 /*======================================================================
1659     nsp_cs_config() is scheduled to run after a CARD_INSERTION event
1660     is received, to configure the PCMCIA socket, and to make the
1661     ethernet device available to the system.
1662 ======================================================================*/
1663 #define CS_CHECK(fn, ret) \
1664 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
1665 /*====================================================================*/
1666 static int nsp_cs_config(struct pcmcia_device *link)
1667 {
1668 	int		  ret;
1669 	scsi_info_t	 *info	 = link->priv;
1670 	tuple_t		  tuple;
1671 	cisparse_t	  parse;
1672 	int		  last_ret, last_fn;
1673 	unsigned char	  tuple_data[64];
1674 	config_info_t	  conf;
1675 	win_req_t         req;
1676 	memreq_t          map;
1677 	cistpl_cftable_entry_t dflt = { 0 };
1678 	struct Scsi_Host *host;
1679 	nsp_hw_data      *data = &nsp_data_base;
1680 #if !(LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
1681 	struct scsi_device	 *dev;
1682 	dev_node_t	**tail, *node;
1683 #endif
1684 
1685 	nsp_dbg(NSP_DEBUG_INIT, "in");
1686 
1687 	tuple.DesiredTuple    = CISTPL_CONFIG;
1688 	tuple.Attributes      = 0;
1689 	tuple.TupleData	      = tuple_data;
1690 	tuple.TupleDataMax    = sizeof(tuple_data);
1691 	tuple.TupleOffset     = 0;
1692 	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
1693 	CS_CHECK(GetTupleData,	pcmcia_get_tuple_data(link, &tuple));
1694 	CS_CHECK(ParseTuple,	pcmcia_parse_tuple(link, &tuple, &parse));
1695 	link->conf.ConfigBase = parse.config.base;
1696 	link->conf.Present    = parse.config.rmask[0];
1697 
1698 	/* Look up the current Vcc */
1699 	CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &conf));
1700 
1701 	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
1702 	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
1703 	while (1) {
1704 		cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
1705 
1706 		if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
1707 				pcmcia_parse_tuple(link, &tuple, &parse) != 0)
1708 			goto next_entry;
1709 
1710 		if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; }
1711 		if (cfg->index == 0) { goto next_entry; }
1712 		link->conf.ConfigIndex = cfg->index;
1713 
1714 		/* Does this card need audio output? */
1715 		if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
1716 			link->conf.Attributes |= CONF_ENABLE_SPKR;
1717 			link->conf.Status = CCSR_AUDIO_ENA;
1718 		}
1719 
1720 		/* Use power settings for Vcc and Vpp if present */
1721 		/*  Note that the CIS values need to be rescaled */
1722 		if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
1723 			if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) {
1724 				goto next_entry;
1725 			}
1726 		} else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {
1727 			if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM]/10000) {
1728 				goto next_entry;
1729 			}
1730 		}
1731 
1732 		if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1733 			link->conf.Vpp =
1734 				cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
1735 		} else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1736 			link->conf.Vpp =
1737 				dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
1738 		}
1739 
1740 		/* Do we need to allocate an interrupt? */
1741 		if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) {
1742 			link->conf.Attributes |= CONF_ENABLE_IRQ;
1743 		}
1744 
1745 		/* IO window settings */
1746 		link->io.NumPorts1 = link->io.NumPorts2 = 0;
1747 		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
1748 			cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
1749 			link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1750 			if (!(io->flags & CISTPL_IO_8BIT))
1751 				link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
1752 			if (!(io->flags & CISTPL_IO_16BIT))
1753 				link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
1754 			link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
1755 			link->io.BasePort1 = io->win[0].base;
1756 			link->io.NumPorts1 = io->win[0].len;
1757 			if (io->nwin > 1) {
1758 				link->io.Attributes2 = link->io.Attributes1;
1759 				link->io.BasePort2 = io->win[1].base;
1760 				link->io.NumPorts2 = io->win[1].len;
1761 			}
1762 			/* This reserves IO space but doesn't actually enable it */
1763 			if (pcmcia_request_io(link, &link->io) != 0)
1764 				goto next_entry;
1765 		}
1766 
1767 		if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
1768 			cistpl_mem_t *mem =
1769 				(cfg->mem.nwin) ? &cfg->mem : &dflt.mem;
1770 			req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
1771 			req.Attributes |= WIN_ENABLE;
1772 			req.Base = mem->win[0].host_addr;
1773 			req.Size = mem->win[0].len;
1774 			if (req.Size < 0x1000) {
1775 				req.Size = 0x1000;
1776 			}
1777 			req.AccessSpeed = 0;
1778 			if (pcmcia_request_window(&link, &req, &link->win) != 0)
1779 				goto next_entry;
1780 			map.Page = 0; map.CardOffset = mem->win[0].card_addr;
1781 			if (pcmcia_map_mem_page(link->win, &map) != 0)
1782 				goto next_entry;
1783 
1784 			data->MmioAddress = (unsigned long)ioremap_nocache(req.Base, req.Size);
1785 			data->MmioLength  = req.Size;
1786 		}
1787 		/* If we got this far, we're cool! */
1788 		break;
1789 
1790 	next_entry:
1791 		nsp_dbg(NSP_DEBUG_INIT, "next");
1792 		pcmcia_disable_device(link);
1793 		CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
1794 	}
1795 
1796 	if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1797 		CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
1798 	}
1799 	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
1800 
1801 	if (free_ports) {
1802 		if (link->io.BasePort1) {
1803 			release_region(link->io.BasePort1, link->io.NumPorts1);
1804 		}
1805 		if (link->io.BasePort2) {
1806 			release_region(link->io.BasePort2, link->io.NumPorts2);
1807 		}
1808 	}
1809 
1810 	/* Set port and IRQ */
1811 	data->BaseAddress = link->io.BasePort1;
1812 	data->NumAddress  = link->io.NumPorts1;
1813 	data->IrqNumber   = link->irq.AssignedIRQ;
1814 
1815 	nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1816 		data->BaseAddress, data->NumAddress, data->IrqNumber);
1817 
1818 	if(nsphw_init(data) == FALSE) {
1819 		goto cs_failed;
1820 	}
1821 
1822 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2))
1823 	host = nsp_detect(&nsp_driver_template);
1824 #else
1825 	scsi_register_host(&nsp_driver_template);
1826 	for (host = scsi_host_get_next(NULL); host != NULL;
1827 	     host = scsi_host_get_next(host)) {
1828 		if (host->hostt == &nsp_driver_template) {
1829 			break;
1830 		}
1831 	}
1832 #endif
1833 
1834 	if (host == NULL) {
1835 		nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1836 		goto cs_failed;
1837 	}
1838 
1839 
1840 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
1841 	ret = scsi_add_host (host, NULL);
1842 	if (ret)
1843 		goto cs_failed;
1844 
1845 	scsi_scan_host(host);
1846 
1847 	snprintf(info->node.dev_name, sizeof(info->node.dev_name), "scsi%d", host->host_no);
1848 	link->dev_node  = &info->node;
1849 	info->host = host;
1850 
1851 #else
1852 	nsp_dbg(NSP_DEBUG_INIT, "GET_SCSI_INFO");
1853 	tail = &link->dev_node;
1854 	info->ndev = 0;
1855 
1856 	nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
1857 
1858 	for (dev = host->host_queue; dev != NULL; dev = dev->next) {
1859 		unsigned long id;
1860 		id = (dev->id & 0x0f) + ((dev->lun & 0x0f) << 4) +
1861 			((dev->channel & 0x0f) << 8) +
1862 			((dev->host->host_no & 0x0f) << 12);
1863 		node = &info->node[info->ndev];
1864 		node->minor = 0;
1865 		switch (dev->type) {
1866 		case TYPE_TAPE:
1867 			node->major = SCSI_TAPE_MAJOR;
1868 			snprintf(node->dev_name, sizeof(node->dev_name), "st#%04lx", id);
1869 			break;
1870 		case TYPE_DISK:
1871 		case TYPE_MOD:
1872 			node->major = SCSI_DISK0_MAJOR;
1873 			snprintf(node->dev_name, sizeof(node->dev_name), "sd#%04lx", id);
1874 			break;
1875 		case TYPE_ROM:
1876 		case TYPE_WORM:
1877 			node->major = SCSI_CDROM_MAJOR;
1878 			snprintf(node->dev_name, sizeof(node->dev_name), "sr#%04lx", id);
1879 			break;
1880 		default:
1881 			node->major = SCSI_GENERIC_MAJOR;
1882 			snprintf(node->dev_name, sizeof(node->dev_name), "sg#%04lx", id);
1883 			break;
1884 		}
1885 		*tail = node; tail = &node->next;
1886 		info->ndev++;
1887 		info->host = dev->host;
1888 	}
1889 
1890 	*tail = NULL;
1891 	if (info->ndev == 0) {
1892 		nsp_msg(KERN_INFO, "no SCSI devices found");
1893 	}
1894 	nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
1895 #endif
1896 
1897 	/* Finally, report what we've done */
1898 	printk(KERN_INFO "nsp_cs: index 0x%02x: ",
1899 	       link->conf.ConfigIndex);
1900 	if (link->conf.Vpp) {
1901 		printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
1902 	}
1903 	if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1904 		printk(", irq %d", link->irq.AssignedIRQ);
1905 	}
1906 	if (link->io.NumPorts1) {
1907 		printk(", io 0x%04x-0x%04x", link->io.BasePort1,
1908 		       link->io.BasePort1+link->io.NumPorts1-1);
1909 	}
1910 	if (link->io.NumPorts2)
1911 		printk(" & 0x%04x-0x%04x", link->io.BasePort2,
1912 		       link->io.BasePort2+link->io.NumPorts2-1);
1913 	if (link->win)
1914 		printk(", mem 0x%06lx-0x%06lx", req.Base,
1915 		       req.Base+req.Size-1);
1916 	printk("\n");
1917 
1918 	return 0;
1919 
1920  cs_failed:
1921 	nsp_dbg(NSP_DEBUG_INIT, "config fail");
1922 	cs_error(link, last_fn, last_ret);
1923 	nsp_cs_release(link);
1924 
1925 	return -ENODEV;
1926 } /* nsp_cs_config */
1927 #undef CS_CHECK
1928 
1929 
1930 /*======================================================================
1931     After a card is removed, nsp_cs_release() will unregister the net
1932     device, and release the PCMCIA configuration.  If the device is
1933     still open, this will be postponed until it is closed.
1934 ======================================================================*/
1935 static void nsp_cs_release(struct pcmcia_device *link)
1936 {
1937 	scsi_info_t *info = link->priv;
1938 	nsp_hw_data *data = NULL;
1939 
1940 	if (info->host == NULL) {
1941 		nsp_msg(KERN_DEBUG, "unexpected card release call.");
1942 	} else {
1943 		data = (nsp_hw_data *)info->host->hostdata;
1944 	}
1945 
1946 	nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1947 
1948 	/* Unlink the device chain */
1949 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
1950 	if (info->host != NULL) {
1951 		scsi_remove_host(info->host);
1952 	}
1953 #else
1954 	scsi_unregister_host(&nsp_driver_template);
1955 #endif
1956 	link->dev_node = NULL;
1957 
1958 	if (link->win) {
1959 		if (data != NULL) {
1960 			iounmap((void *)(data->MmioAddress));
1961 		}
1962 	}
1963 	pcmcia_disable_device(link);
1964 
1965 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
1966 	if (info->host != NULL) {
1967 		scsi_host_put(info->host);
1968 	}
1969 #endif
1970 } /* nsp_cs_release */
1971 
1972 static int nsp_cs_suspend(struct pcmcia_device *link)
1973 {
1974 	scsi_info_t *info = link->priv;
1975 	nsp_hw_data *data;
1976 
1977 	nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
1978 
1979 	if (info->host != NULL) {
1980 		nsp_msg(KERN_INFO, "clear SDTR status");
1981 
1982 		data = (nsp_hw_data *)info->host->hostdata;
1983 
1984 		nsphw_init_sync(data);
1985 	}
1986 
1987 	info->stop = 1;
1988 
1989 	return 0;
1990 }
1991 
1992 static int nsp_cs_resume(struct pcmcia_device *link)
1993 {
1994 	scsi_info_t *info = link->priv;
1995 	nsp_hw_data *data;
1996 
1997 	nsp_dbg(NSP_DEBUG_INIT, "event: resume");
1998 
1999 	info->stop = 0;
2000 
2001 	if (info->host != NULL) {
2002 		nsp_msg(KERN_INFO, "reset host and bus");
2003 
2004 		data = (nsp_hw_data *)info->host->hostdata;
2005 
2006 		nsphw_init   (data);
2007 		nsp_bus_reset(data);
2008 	}
2009 
2010 	return 0;
2011 }
2012 
2013 /*======================================================================*
2014  *	module entry point
2015  *====================================================================*/
2016 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
2017 static struct pcmcia_device_id nsp_cs_ids[] = {
2018 	PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16       ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
2019 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
2020 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
2021 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
2022 	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
2023 	PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
2024 	PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
2025 	PCMCIA_DEVICE_NULL
2026 };
2027 MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids);
2028 
2029 static struct pcmcia_driver nsp_driver = {
2030 	.owner		= THIS_MODULE,
2031 	.drv		= {
2032 		.name	= "nsp_cs",
2033 	},
2034 	.probe		= nsp_cs_probe,
2035 	.remove		= nsp_cs_detach,
2036 	.id_table	= nsp_cs_ids,
2037 	.suspend	= nsp_cs_suspend,
2038 	.resume		= nsp_cs_resume,
2039 };
2040 #endif
2041 
2042 static int __init nsp_cs_init(void)
2043 {
2044 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
2045 	nsp_msg(KERN_INFO, "loading...");
2046 
2047 	return pcmcia_register_driver(&nsp_driver);
2048 #else
2049 	servinfo_t serv;
2050 
2051 	nsp_msg(KERN_INFO, "loading...");
2052 	pcmcia_get_card_services_info(&serv);
2053 	if (serv.Revision != CS_RELEASE_CODE) {
2054 		nsp_msg(KERN_DEBUG, "Card Services release does not match!");
2055 		return -EINVAL;
2056 	}
2057 	register_pcmcia_driver(&dev_info, &nsp_cs_attach, &nsp_cs_detach);
2058 
2059 	nsp_dbg(NSP_DEBUG_INIT, "out");
2060 	return 0;
2061 #endif
2062 }
2063 
2064 static void __exit nsp_cs_exit(void)
2065 {
2066 	nsp_msg(KERN_INFO, "unloading...");
2067 	pcmcia_unregister_driver(&nsp_driver);
2068 }
2069 
2070 
2071 module_init(nsp_cs_init)
2072 module_exit(nsp_cs_exit)
2073 
2074 /* end */
2075