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