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