nsp_cs.c revision dd00cc486ab1c17049a535413d1751ef3482141c
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/slab.h>
35#include <linux/string.h>
36#include <linux/timer.h>
37#include <linux/ioport.h>
38#include <linux/delay.h>
39#include <linux/interrupt.h>
40#include <linux/major.h>
41#include <linux/blkdev.h>
42#include <linux/stat.h>
43
44#include <asm/io.h>
45#include <asm/irq.h>
46
47#include <../drivers/scsi/scsi.h>
48#include <scsi/scsi_host.h>
49
50#include <scsi/scsi.h>
51#include <scsi/scsi_ioctl.h>
52
53#include <pcmcia/cs_types.h>
54#include <pcmcia/cs.h>
55#include <pcmcia/cistpl.h>
56#include <pcmcia/cisreg.h>
57#include <pcmcia/ds.h>
58
59#include "nsp_cs.h"
60
61MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
62MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module $Revision: 1.23 $");
63MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
64#ifdef MODULE_LICENSE
65MODULE_LICENSE("GPL");
66#endif
67
68#include "nsp_io.h"
69
70/*====================================================================*/
71/* Parameters that can be set with 'insmod' */
72
73static int       nsp_burst_mode = BURST_MEM32;
74module_param(nsp_burst_mode, int, 0);
75MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
76
77/* Release IO ports after configuration? */
78static int       free_ports = 0;
79module_param(free_ports, bool, 0);
80MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
81
82static struct scsi_host_template nsp_driver_template = {
83	.proc_name	         = "nsp_cs",
84	.proc_info		 = nsp_proc_info,
85	.name			 = "WorkBit NinjaSCSI-3/32Bi(16bit)",
86#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
87	.detect			 = nsp_detect_old,
88	.release		 = nsp_release_old,
89#endif
90	.info			 = nsp_info,
91	.queuecommand		 = nsp_queuecommand,
92/*	.eh_abort_handler	 = nsp_eh_abort,*/
93	.eh_bus_reset_handler	 = nsp_eh_bus_reset,
94	.eh_host_reset_handler	 = nsp_eh_host_reset,
95	.can_queue		 = 1,
96	.this_id		 = NSP_INITIATOR_ID,
97	.sg_tablesize		 = SG_ALL,
98	.cmd_per_lun		 = 1,
99	.use_clustering		 = DISABLE_CLUSTERING,
100#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2))
101	.use_new_eh_code	 = 1,
102#endif
103};
104
105static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
106
107
108
109/*
110 * debug, error print
111 */
112#ifndef NSP_DEBUG
113# define NSP_DEBUG_MASK		0x000000
114# define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
115# define nsp_dbg(mask, args...) /* */
116#else
117# define NSP_DEBUG_MASK		0xffffff
118# define nsp_msg(type, args...) \
119	nsp_cs_message (__FUNCTION__, __LINE__, (type), args)
120# define nsp_dbg(mask, args...) \
121	nsp_cs_dmessage(__FUNCTION__, __LINE__, (mask), args)
122#endif
123
124#define NSP_DEBUG_QUEUECOMMAND		BIT(0)
125#define NSP_DEBUG_REGISTER		BIT(1)
126#define NSP_DEBUG_AUTOSCSI		BIT(2)
127#define NSP_DEBUG_INTR			BIT(3)
128#define NSP_DEBUG_SGLIST		BIT(4)
129#define NSP_DEBUG_BUSFREE		BIT(5)
130#define NSP_DEBUG_CDB_CONTENTS		BIT(6)
131#define NSP_DEBUG_RESELECTION		BIT(7)
132#define NSP_DEBUG_MSGINOCCUR		BIT(8)
133#define NSP_DEBUG_EEPROM		BIT(9)
134#define NSP_DEBUG_MSGOUTOCCUR		BIT(10)
135#define NSP_DEBUG_BUSRESET		BIT(11)
136#define NSP_DEBUG_RESTART		BIT(12)
137#define NSP_DEBUG_SYNC			BIT(13)
138#define NSP_DEBUG_WAIT			BIT(14)
139#define NSP_DEBUG_TARGETFLAG		BIT(15)
140#define NSP_DEBUG_PROC			BIT(16)
141#define NSP_DEBUG_INIT			BIT(17)
142#define NSP_DEBUG_DATA_IO      		BIT(18)
143#define NSP_SPECIAL_PRINT_REGISTER	BIT(20)
144
145#define NSP_DEBUG_BUF_LEN		150
146
147static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
148{
149	va_list args;
150	char buf[NSP_DEBUG_BUF_LEN];
151
152	va_start(args, fmt);
153	vsnprintf(buf, sizeof(buf), fmt, args);
154	va_end(args);
155
156#ifndef NSP_DEBUG
157	printk("%snsp_cs: %s\n", type, buf);
158#else
159	printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
160#endif
161}
162
163#ifdef NSP_DEBUG
164static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
165{
166	va_list args;
167	char buf[NSP_DEBUG_BUF_LEN];
168
169	va_start(args, fmt);
170	vsnprintf(buf, sizeof(buf), fmt, args);
171	va_end(args);
172
173	if (mask & NSP_DEBUG_MASK) {
174		printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
175	}
176}
177#endif
178
179/***********************************************************/
180
181/*====================================================
182 * Clenaup parameters and call done() functions.
183 * You must be set SCpnt->result before call this function.
184 */
185static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
186{
187	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
188
189	data->CurrentSC = NULL;
190
191	SCpnt->scsi_done(SCpnt);
192}
193
194static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
195			    void (*done)(struct scsi_cmnd *))
196{
197#ifdef NSP_DEBUG
198	/*unsigned int host_id = SCpnt->device->host->this_id;*/
199	/*unsigned int base    = SCpnt->device->host->io_port;*/
200	unsigned char target = scmd_id(SCpnt);
201#endif
202	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
203
204	nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d",
205		   SCpnt, target, SCpnt->device->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg);
206	//nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
207
208	SCpnt->scsi_done	= done;
209
210	if (data->CurrentSC != NULL) {
211		nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
212		SCpnt->result   = DID_BAD_TARGET << 16;
213		nsp_scsi_done(SCpnt);
214		return 0;
215	}
216
217#if 0
218	/* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
219	        This makes kernel crash when suspending... */
220	if (data->ScsiInfo->stop != 0) {
221		nsp_msg(KERN_INFO, "suspending device. reject command.");
222		SCpnt->result  = DID_BAD_TARGET << 16;
223		nsp_scsi_done(SCpnt);
224		return SCSI_MLQUEUE_HOST_BUSY;
225	}
226#endif
227
228	show_command(SCpnt);
229
230	data->CurrentSC		= SCpnt;
231
232	SCpnt->SCp.Status	= CHECK_CONDITION;
233	SCpnt->SCp.Message	= 0;
234	SCpnt->SCp.have_data_in = IO_UNKNOWN;
235	SCpnt->SCp.sent_command = 0;
236	SCpnt->SCp.phase	= PH_UNDETERMINED;
237	SCpnt->resid	        = SCpnt->request_bufflen;
238
239	/* setup scratch area
240	   SCp.ptr		: buffer pointer
241	   SCp.this_residual	: buffer length
242	   SCp.buffer		: next buffer
243	   SCp.buffers_residual : left buffers in list
244	   SCp.phase		: current state of the command */
245	if (SCpnt->use_sg) {
246		SCpnt->SCp.buffer	    = (struct scatterlist *) SCpnt->request_buffer;
247		SCpnt->SCp.ptr		    = BUFFER_ADDR;
248		SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
249		SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
250	} else {
251		SCpnt->SCp.ptr		    = (char *) SCpnt->request_buffer;
252		SCpnt->SCp.this_residual    = SCpnt->request_bufflen;
253		SCpnt->SCp.buffer	    = NULL;
254		SCpnt->SCp.buffers_residual = 0;
255	}
256
257	if (nsphw_start_selection(SCpnt) == FALSE) {
258		nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
259		SCpnt->result   = DID_BUS_BUSY << 16;
260		nsp_scsi_done(SCpnt);
261		return 0;
262	}
263
264
265	//nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
266#ifdef NSP_DEBUG
267	data->CmdId++;
268#endif
269	return 0;
270}
271
272/*
273 * setup PIO FIFO transfer mode and enable/disable to data out
274 */
275static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
276{
277	unsigned int  base = data->BaseAddress;
278	unsigned char transfer_mode_reg;
279
280	//nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
281
282	if (enabled != FALSE) {
283		transfer_mode_reg = TRANSFER_GO | BRAIND;
284	} else {
285		transfer_mode_reg = 0;
286	}
287
288	transfer_mode_reg |= data->TransferMode;
289
290	nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
291}
292
293static void nsphw_init_sync(nsp_hw_data *data)
294{
295	sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
296			       .SyncPeriod      = 0,
297			       .SyncOffset      = 0
298	};
299	int i;
300
301	/* setup sync data */
302	for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
303		data->Sync[i] = tmp_sync;
304	}
305}
306
307/*
308 * Initialize Ninja hardware
309 */
310static int nsphw_init(nsp_hw_data *data)
311{
312	unsigned int base     = data->BaseAddress;
313
314	nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
315
316	data->ScsiClockDiv = CLOCK_40M | FAST_20;
317	data->CurrentSC    = NULL;
318	data->FifoCount    = 0;
319	data->TransferMode = MODE_IO8;
320
321	nsphw_init_sync(data);
322
323	/* block all interrupts */
324	nsp_write(base,	      IRQCONTROL,   IRQCONTROL_ALLMASK);
325
326	/* setup SCSI interface */
327	nsp_write(base,	      IFSELECT,	    IF_IFSEL);
328
329	nsp_index_write(base, SCSIIRQMODE,  0);
330
331	nsp_index_write(base, TRANSFERMODE, MODE_IO8);
332	nsp_index_write(base, CLOCKDIV,	    data->ScsiClockDiv);
333
334	nsp_index_write(base, PARITYCTRL,   0);
335	nsp_index_write(base, POINTERCLR,   POINTER_CLEAR     |
336					    ACK_COUNTER_CLEAR |
337					    REQ_COUNTER_CLEAR |
338					    HOST_COUNTER_CLEAR);
339
340	/* setup fifo asic */
341	nsp_write(base,	      IFSELECT,	    IF_REGSEL);
342	nsp_index_write(base, TERMPWRCTRL,  0);
343	if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
344		nsp_msg(KERN_INFO, "terminator power on");
345		nsp_index_write(base, TERMPWRCTRL, POWER_ON);
346	}
347
348	nsp_index_write(base, TIMERCOUNT,   0);
349	nsp_index_write(base, TIMERCOUNT,   0); /* requires 2 times!! */
350
351	nsp_index_write(base, SYNCREG,	    0);
352	nsp_index_write(base, ACKWIDTH,	    0);
353
354	/* enable interrupts and ack them */
355	nsp_index_write(base, SCSIIRQMODE,  SCSI_PHASE_CHANGE_EI |
356					    RESELECT_EI		 |
357					    SCSI_RESET_IRQ_EI	 );
358	nsp_write(base,	      IRQCONTROL,   IRQCONTROL_ALLCLEAR);
359
360	nsp_setup_fifo(data, FALSE);
361
362	return TRUE;
363}
364
365/*
366 * Start selection phase
367 */
368static int nsphw_start_selection(struct scsi_cmnd *SCpnt)
369{
370	unsigned int  host_id	 = SCpnt->device->host->this_id;
371	unsigned int  base	 = SCpnt->device->host->io_port;
372	unsigned char target	 = scmd_id(SCpnt);
373	nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
374	int	      time_out;
375	unsigned char phase, arbit;
376
377	//nsp_dbg(NSP_DEBUG_RESELECTION, "in");
378
379	phase = nsp_index_read(base, SCSIBUSMON);
380	if(phase != BUSMON_BUS_FREE) {
381		//nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
382		return FALSE;
383	}
384
385	/* start arbitration */
386	//nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
387	SCpnt->SCp.phase = PH_ARBSTART;
388	nsp_index_write(base, SETARBIT, ARBIT_GO);
389
390	time_out = 1000;
391	do {
392		/* XXX: what a stupid chip! */
393		arbit = nsp_index_read(base, ARBITSTATUS);
394		//nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
395		udelay(1); /* hold 1.2us */
396	} while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
397		(time_out-- != 0));
398
399	if (!(arbit & ARBIT_WIN)) {
400		//nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
401		nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
402		return FALSE;
403	}
404
405	/* assert select line */
406	//nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
407	SCpnt->SCp.phase = PH_SELSTART;
408	udelay(3); /* wait 2.4us */
409	nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
410	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY                    | SCSI_ATN);
411	udelay(2); /* wait >1.2us */
412	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
413	nsp_index_write(base, SETARBIT,	     ARBIT_FLAG_CLEAR);
414	/*udelay(1);*/ /* wait >90ns */
415	nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL            | SCSI_DATAOUT_ENB | SCSI_ATN);
416
417	/* check selection timeout */
418	nsp_start_timer(SCpnt, 1000/51);
419	data->SelectionTimeOut = 1;
420
421	return TRUE;
422}
423
424struct nsp_sync_table {
425	unsigned int min_period;
426	unsigned int max_period;
427	unsigned int chip_period;
428	unsigned int ack_width;
429};
430
431static struct nsp_sync_table nsp_sync_table_40M[] = {
432	{0x0c, 0x0c, 0x1, 0},	/* 20MB	  50ns*/
433	{0x19, 0x19, 0x3, 1},	/* 10MB	 100ns*/
434	{0x1a, 0x25, 0x5, 2},	/* 7.5MB 150ns*/
435	{0x26, 0x32, 0x7, 3},	/* 5MB	 200ns*/
436	{   0,    0,   0, 0},
437};
438
439static struct nsp_sync_table nsp_sync_table_20M[] = {
440	{0x19, 0x19, 0x1, 0},	/* 10MB	 100ns*/
441	{0x1a, 0x25, 0x2, 0},	/* 7.5MB 150ns*/
442	{0x26, 0x32, 0x3, 1},	/* 5MB	 200ns*/
443	{   0,    0,   0, 0},
444};
445
446/*
447 * setup synchronous data transfer mode
448 */
449static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt)
450{
451	unsigned char	       target = scmd_id(SCpnt);
452//	unsigned char	       lun    = SCpnt->device->lun;
453	nsp_hw_data           *data   = (nsp_hw_data *)SCpnt->device->host->hostdata;
454	sync_data	      *sync   = &(data->Sync[target]);
455	struct nsp_sync_table *sync_table;
456	unsigned int	       period, offset;
457	int		       i;
458
459
460	nsp_dbg(NSP_DEBUG_SYNC, "in");
461
462	period = sync->SyncPeriod;
463	offset = sync->SyncOffset;
464
465	nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
466
467	if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
468		sync_table = nsp_sync_table_20M;
469	} else {
470		sync_table = nsp_sync_table_40M;
471	}
472
473	for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
474		if ( period >= sync_table->min_period &&
475		     period <= sync_table->max_period	 ) {
476			break;
477		}
478	}
479
480	if (period != 0 && sync_table->max_period == 0) {
481		/*
482		 * No proper period/offset found
483		 */
484		nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
485
486		sync->SyncPeriod      = 0;
487		sync->SyncOffset      = 0;
488		sync->SyncRegister    = 0;
489		sync->AckWidth	      = 0;
490
491		return FALSE;
492	}
493
494	sync->SyncRegister    = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
495		                (offset & SYNCREG_OFFSET_MASK);
496	sync->AckWidth	      = sync_table->ack_width;
497
498	nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
499
500	return TRUE;
501}
502
503
504/*
505 * start ninja hardware timer
506 */
507static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time)
508{
509	unsigned int base = SCpnt->device->host->io_port;
510	nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
511
512	//nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
513	data->TimerCount = time;
514	nsp_index_write(base, TIMERCOUNT, time);
515}
516
517/*
518 * wait for bus phase change
519 */
520static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask,
521			     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 */
548static int nsp_expect_signal(struct 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 */
583static int nsp_xfer(struct 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 */
623static int nsp_dataphase_bypass(struct 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 */
655static int nsp_reselected(struct 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 */
694static int nsp_fifo_count(struct 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 */
721static void nsp_pio_read(struct 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 */
816static void nsp_pio_write(struct 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 */
909static int nsp_nexus(struct 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 */
952static irqreturn_t nspintr(int irq, void *dev_id)
953{
954	unsigned int   base;
955	unsigned char  irq_status, irq_phase, phase;
956	struct 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
1298timer_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/*----------------------------------------------------------------*/
1310static 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))
1358static 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
1369static 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/*----------------------------------------------------------------*/
1391static 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)
1406static int
1407nsp_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/*
1534static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1535{
1536	nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1537
1538	return nsp_eh_bus_reset(SCpnt);
1539}*/
1540
1541static 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
1562static int nsp_eh_bus_reset(struct 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
1571static int nsp_eh_host_reset(struct 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======================================================================*/
1596static 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 = kzalloc(sizeof(*info), GFP_KERNEL);
1606	if (info == NULL) { return -ENOMEM; }
1607	info->p_dev = link;
1608	link->priv = info;
1609	data->ScsiInfo = info;
1610
1611	nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1612
1613	/* The io structure describes IO port mapping */
1614	link->io.NumPorts1	 = 0x10;
1615	link->io.Attributes1	 = IO_DATA_PATH_WIDTH_AUTO;
1616	link->io.IOAddrLines	 = 10;	/* not used */
1617
1618	/* Interrupt setup */
1619	link->irq.Attributes	 = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
1620	link->irq.IRQInfo1	 = IRQ_LEVEL_ID;
1621
1622	/* Interrupt handler */
1623	link->irq.Handler	 = &nspintr;
1624	link->irq.Instance       = info;
1625	link->irq.Attributes     |= IRQF_SHARED;
1626
1627	/* General socket configuration */
1628	link->conf.Attributes	 = CONF_ENABLE_IRQ;
1629	link->conf.IntType	 = INT_MEMORY_AND_IO;
1630
1631	ret = nsp_cs_config(link);
1632
1633	nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1634	return ret;
1635} /* nsp_cs_attach */
1636
1637
1638/*======================================================================
1639    This deletes a driver "instance".  The device is de-registered
1640    with Card Services.	 If it has been released, all local data
1641    structures are freed.  Otherwise, the structures will be freed
1642    when the device is released.
1643======================================================================*/
1644static void nsp_cs_detach(struct pcmcia_device *link)
1645{
1646	nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1647
1648	((scsi_info_t *)link->priv)->stop = 1;
1649	nsp_cs_release(link);
1650
1651	kfree(link->priv);
1652	link->priv = NULL;
1653} /* nsp_cs_detach */
1654
1655
1656/*======================================================================
1657    nsp_cs_config() is scheduled to run after a CARD_INSERTION event
1658    is received, to configure the PCMCIA socket, and to make the
1659    ethernet device available to the system.
1660======================================================================*/
1661#define CS_CHECK(fn, ret) \
1662do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
1663/*====================================================================*/
1664static int nsp_cs_config(struct pcmcia_device *link)
1665{
1666	int		  ret;
1667	scsi_info_t	 *info	 = link->priv;
1668	tuple_t		  tuple;
1669	cisparse_t	  parse;
1670	int		  last_ret, last_fn;
1671	unsigned char	  tuple_data[64];
1672	config_info_t	  conf;
1673	win_req_t         req;
1674	memreq_t          map;
1675	cistpl_cftable_entry_t dflt = { 0 };
1676	struct Scsi_Host *host;
1677	nsp_hw_data      *data = &nsp_data_base;
1678#if !(LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
1679	struct scsi_device	 *dev;
1680	dev_node_t	**tail, *node;
1681#endif
1682
1683	nsp_dbg(NSP_DEBUG_INIT, "in");
1684
1685	tuple.Attributes      = 0;
1686	tuple.TupleData	      = tuple_data;
1687	tuple.TupleDataMax    = sizeof(tuple_data);
1688	tuple.TupleOffset     = 0;
1689
1690	/* Look up the current Vcc */
1691	CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &conf));
1692
1693	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
1694	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
1695	while (1) {
1696		cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
1697
1698		if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
1699				pcmcia_parse_tuple(link, &tuple, &parse) != 0)
1700			goto next_entry;
1701
1702		if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; }
1703		if (cfg->index == 0) { goto next_entry; }
1704		link->conf.ConfigIndex = cfg->index;
1705
1706		/* Does this card need audio output? */
1707		if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
1708			link->conf.Attributes |= CONF_ENABLE_SPKR;
1709			link->conf.Status = CCSR_AUDIO_ENA;
1710		}
1711
1712		/* Use power settings for Vcc and Vpp if present */
1713		/*  Note that the CIS values need to be rescaled */
1714		if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
1715			if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) {
1716				goto next_entry;
1717			}
1718		} else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {
1719			if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM]/10000) {
1720				goto next_entry;
1721			}
1722		}
1723
1724		if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1725			link->conf.Vpp =
1726				cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
1727		} else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1728			link->conf.Vpp =
1729				dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
1730		}
1731
1732		/* Do we need to allocate an interrupt? */
1733		if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) {
1734			link->conf.Attributes |= CONF_ENABLE_IRQ;
1735		}
1736
1737		/* IO window settings */
1738		link->io.NumPorts1 = link->io.NumPorts2 = 0;
1739		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
1740			cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
1741			link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1742			if (!(io->flags & CISTPL_IO_8BIT))
1743				link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
1744			if (!(io->flags & CISTPL_IO_16BIT))
1745				link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
1746			link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
1747			link->io.BasePort1 = io->win[0].base;
1748			link->io.NumPorts1 = io->win[0].len;
1749			if (io->nwin > 1) {
1750				link->io.Attributes2 = link->io.Attributes1;
1751				link->io.BasePort2 = io->win[1].base;
1752				link->io.NumPorts2 = io->win[1].len;
1753			}
1754			/* This reserves IO space but doesn't actually enable it */
1755			if (pcmcia_request_io(link, &link->io) != 0)
1756				goto next_entry;
1757		}
1758
1759		if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
1760			cistpl_mem_t *mem =
1761				(cfg->mem.nwin) ? &cfg->mem : &dflt.mem;
1762			req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
1763			req.Attributes |= WIN_ENABLE;
1764			req.Base = mem->win[0].host_addr;
1765			req.Size = mem->win[0].len;
1766			if (req.Size < 0x1000) {
1767				req.Size = 0x1000;
1768			}
1769			req.AccessSpeed = 0;
1770			if (pcmcia_request_window(&link, &req, &link->win) != 0)
1771				goto next_entry;
1772			map.Page = 0; map.CardOffset = mem->win[0].card_addr;
1773			if (pcmcia_map_mem_page(link->win, &map) != 0)
1774				goto next_entry;
1775
1776			data->MmioAddress = (unsigned long)ioremap_nocache(req.Base, req.Size);
1777			data->MmioLength  = req.Size;
1778		}
1779		/* If we got this far, we're cool! */
1780		break;
1781
1782	next_entry:
1783		nsp_dbg(NSP_DEBUG_INIT, "next");
1784		pcmcia_disable_device(link);
1785		CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
1786	}
1787
1788	if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1789		CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
1790	}
1791	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
1792
1793	if (free_ports) {
1794		if (link->io.BasePort1) {
1795			release_region(link->io.BasePort1, link->io.NumPorts1);
1796		}
1797		if (link->io.BasePort2) {
1798			release_region(link->io.BasePort2, link->io.NumPorts2);
1799		}
1800	}
1801
1802	/* Set port and IRQ */
1803	data->BaseAddress = link->io.BasePort1;
1804	data->NumAddress  = link->io.NumPorts1;
1805	data->IrqNumber   = link->irq.AssignedIRQ;
1806
1807	nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1808		data->BaseAddress, data->NumAddress, data->IrqNumber);
1809
1810	if(nsphw_init(data) == FALSE) {
1811		goto cs_failed;
1812	}
1813
1814#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2))
1815	host = nsp_detect(&nsp_driver_template);
1816#else
1817	scsi_register_host(&nsp_driver_template);
1818	for (host = scsi_host_get_next(NULL); host != NULL;
1819	     host = scsi_host_get_next(host)) {
1820		if (host->hostt == &nsp_driver_template) {
1821			break;
1822		}
1823	}
1824#endif
1825
1826	if (host == NULL) {
1827		nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1828		goto cs_failed;
1829	}
1830
1831
1832#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
1833	ret = scsi_add_host (host, NULL);
1834	if (ret)
1835		goto cs_failed;
1836
1837	scsi_scan_host(host);
1838
1839	snprintf(info->node.dev_name, sizeof(info->node.dev_name), "scsi%d", host->host_no);
1840	link->dev_node  = &info->node;
1841	info->host = host;
1842
1843#else
1844	nsp_dbg(NSP_DEBUG_INIT, "GET_SCSI_INFO");
1845	tail = &link->dev_node;
1846	info->ndev = 0;
1847
1848	nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
1849
1850	for (dev = host->host_queue; dev != NULL; dev = dev->next) {
1851		unsigned long id;
1852		id = (dev->id & 0x0f) + ((dev->lun & 0x0f) << 4) +
1853			((dev->channel & 0x0f) << 8) +
1854			((dev->host->host_no & 0x0f) << 12);
1855		node = &info->node[info->ndev];
1856		node->minor = 0;
1857		switch (dev->type) {
1858		case TYPE_TAPE:
1859			node->major = SCSI_TAPE_MAJOR;
1860			snprintf(node->dev_name, sizeof(node->dev_name), "st#%04lx", id);
1861			break;
1862		case TYPE_DISK:
1863		case TYPE_MOD:
1864			node->major = SCSI_DISK0_MAJOR;
1865			snprintf(node->dev_name, sizeof(node->dev_name), "sd#%04lx", id);
1866			break;
1867		case TYPE_ROM:
1868		case TYPE_WORM:
1869			node->major = SCSI_CDROM_MAJOR;
1870			snprintf(node->dev_name, sizeof(node->dev_name), "sr#%04lx", id);
1871			break;
1872		default:
1873			node->major = SCSI_GENERIC_MAJOR;
1874			snprintf(node->dev_name, sizeof(node->dev_name), "sg#%04lx", id);
1875			break;
1876		}
1877		*tail = node; tail = &node->next;
1878		info->ndev++;
1879		info->host = dev->host;
1880	}
1881
1882	*tail = NULL;
1883	if (info->ndev == 0) {
1884		nsp_msg(KERN_INFO, "no SCSI devices found");
1885	}
1886	nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
1887#endif
1888
1889	/* Finally, report what we've done */
1890	printk(KERN_INFO "nsp_cs: index 0x%02x: ",
1891	       link->conf.ConfigIndex);
1892	if (link->conf.Vpp) {
1893		printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
1894	}
1895	if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1896		printk(", irq %d", link->irq.AssignedIRQ);
1897	}
1898	if (link->io.NumPorts1) {
1899		printk(", io 0x%04x-0x%04x", link->io.BasePort1,
1900		       link->io.BasePort1+link->io.NumPorts1-1);
1901	}
1902	if (link->io.NumPorts2)
1903		printk(" & 0x%04x-0x%04x", link->io.BasePort2,
1904		       link->io.BasePort2+link->io.NumPorts2-1);
1905	if (link->win)
1906		printk(", mem 0x%06lx-0x%06lx", req.Base,
1907		       req.Base+req.Size-1);
1908	printk("\n");
1909
1910	return 0;
1911
1912 cs_failed:
1913	nsp_dbg(NSP_DEBUG_INIT, "config fail");
1914	cs_error(link, last_fn, last_ret);
1915	nsp_cs_release(link);
1916
1917	return -ENODEV;
1918} /* nsp_cs_config */
1919#undef CS_CHECK
1920
1921
1922/*======================================================================
1923    After a card is removed, nsp_cs_release() will unregister the net
1924    device, and release the PCMCIA configuration.  If the device is
1925    still open, this will be postponed until it is closed.
1926======================================================================*/
1927static void nsp_cs_release(struct pcmcia_device *link)
1928{
1929	scsi_info_t *info = link->priv;
1930	nsp_hw_data *data = NULL;
1931
1932	if (info->host == NULL) {
1933		nsp_msg(KERN_DEBUG, "unexpected card release call.");
1934	} else {
1935		data = (nsp_hw_data *)info->host->hostdata;
1936	}
1937
1938	nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1939
1940	/* Unlink the device chain */
1941#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
1942	if (info->host != NULL) {
1943		scsi_remove_host(info->host);
1944	}
1945#else
1946	scsi_unregister_host(&nsp_driver_template);
1947#endif
1948	link->dev_node = NULL;
1949
1950	if (link->win) {
1951		if (data != NULL) {
1952			iounmap((void *)(data->MmioAddress));
1953		}
1954	}
1955	pcmcia_disable_device(link);
1956
1957#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
1958	if (info->host != NULL) {
1959		scsi_host_put(info->host);
1960	}
1961#endif
1962} /* nsp_cs_release */
1963
1964static int nsp_cs_suspend(struct pcmcia_device *link)
1965{
1966	scsi_info_t *info = link->priv;
1967	nsp_hw_data *data;
1968
1969	nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
1970
1971	if (info->host != NULL) {
1972		nsp_msg(KERN_INFO, "clear SDTR status");
1973
1974		data = (nsp_hw_data *)info->host->hostdata;
1975
1976		nsphw_init_sync(data);
1977	}
1978
1979	info->stop = 1;
1980
1981	return 0;
1982}
1983
1984static int nsp_cs_resume(struct pcmcia_device *link)
1985{
1986	scsi_info_t *info = link->priv;
1987	nsp_hw_data *data;
1988
1989	nsp_dbg(NSP_DEBUG_INIT, "event: resume");
1990
1991	info->stop = 0;
1992
1993	if (info->host != NULL) {
1994		nsp_msg(KERN_INFO, "reset host and bus");
1995
1996		data = (nsp_hw_data *)info->host->hostdata;
1997
1998		nsphw_init   (data);
1999		nsp_bus_reset(data);
2000	}
2001
2002	return 0;
2003}
2004
2005/*======================================================================*
2006 *	module entry point
2007 *====================================================================*/
2008#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
2009static struct pcmcia_device_id nsp_cs_ids[] = {
2010	PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16       ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
2011	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
2012	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
2013	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
2014	PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
2015	PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
2016	PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
2017	PCMCIA_DEVICE_NULL
2018};
2019MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids);
2020
2021static struct pcmcia_driver nsp_driver = {
2022	.owner		= THIS_MODULE,
2023	.drv		= {
2024		.name	= "nsp_cs",
2025	},
2026	.probe		= nsp_cs_probe,
2027	.remove		= nsp_cs_detach,
2028	.id_table	= nsp_cs_ids,
2029	.suspend	= nsp_cs_suspend,
2030	.resume		= nsp_cs_resume,
2031};
2032#endif
2033
2034static int __init nsp_cs_init(void)
2035{
2036#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
2037	nsp_msg(KERN_INFO, "loading...");
2038
2039	return pcmcia_register_driver(&nsp_driver);
2040#else
2041	servinfo_t serv;
2042
2043	nsp_msg(KERN_INFO, "loading...");
2044	pcmcia_get_card_services_info(&serv);
2045	if (serv.Revision != CS_RELEASE_CODE) {
2046		nsp_msg(KERN_DEBUG, "Card Services release does not match!");
2047		return -EINVAL;
2048	}
2049	register_pcmcia_driver(&dev_info, &nsp_cs_attach, &nsp_cs_detach);
2050
2051	nsp_dbg(NSP_DEBUG_INIT, "out");
2052	return 0;
2053#endif
2054}
2055
2056static void __exit nsp_cs_exit(void)
2057{
2058	nsp_msg(KERN_INFO, "unloading...");
2059	pcmcia_unregister_driver(&nsp_driver);
2060}
2061
2062
2063module_init(nsp_cs_init)
2064module_exit(nsp_cs_exit)
2065
2066/* end */
2067