1 /*======================================================================
3 NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver
4 By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
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
13 This software may be used and distributed according to the terms of
14 the GNU General Public License.
16 ======================================================================*/
18 /***********************************************************************
19 This driver is for these PCcards.
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"
26 ***********************************************************************/
28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/init.h>
31 #include <linux/slab.h>
32 #include <linux/string.h>
33 #include <linux/timer.h>
34 #include <linux/ioport.h>
35 #include <linux/delay.h>
36 #include <linux/interrupt.h>
37 #include <linux/major.h>
38 #include <linux/blkdev.h>
39 #include <linux/stat.h>
44 #include <../drivers/scsi/scsi.h>
45 #include <scsi/scsi_host.h>
47 #include <scsi/scsi.h>
48 #include <scsi/scsi_ioctl.h>
50 #include <pcmcia/cistpl.h>
51 #include <pcmcia/cisreg.h>
52 #include <pcmcia/ds.h>
56 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
57 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
58 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
60 MODULE_LICENSE("GPL");
65 /*====================================================================*/
66 /* Parameters that can be set with 'insmod' */
68 static int nsp_burst_mode = BURST_MEM32;
69 module_param(nsp_burst_mode, int, 0);
70 MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
72 /* Release IO ports after configuration? */
73 static int free_ports = 0;
74 module_param(free_ports, bool, 0);
75 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
77 static struct scsi_host_template nsp_driver_template = {
78 .proc_name = "nsp_cs",
79 .proc_info = nsp_proc_info,
80 .name = "WorkBit NinjaSCSI-3/32Bi(16bit)",
82 .queuecommand = nsp_queuecommand,
83 /* .eh_abort_handler = nsp_eh_abort,*/
84 .eh_bus_reset_handler = nsp_eh_bus_reset,
85 .eh_host_reset_handler = nsp_eh_host_reset,
87 .this_id = NSP_INITIATOR_ID,
88 .sg_tablesize = SG_ALL,
90 .use_clustering = DISABLE_CLUSTERING,
93 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
101 # define NSP_DEBUG_MASK 0x000000
102 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
103 # define nsp_dbg(mask, args...) /* */
105 # define NSP_DEBUG_MASK 0xffffff
106 # define nsp_msg(type, args...) \
107 nsp_cs_message (__func__, __LINE__, (type), args)
108 # define nsp_dbg(mask, args...) \
109 nsp_cs_dmessage(__func__, __LINE__, (mask), args)
112 #define NSP_DEBUG_QUEUECOMMAND BIT(0)
113 #define NSP_DEBUG_REGISTER BIT(1)
114 #define NSP_DEBUG_AUTOSCSI BIT(2)
115 #define NSP_DEBUG_INTR BIT(3)
116 #define NSP_DEBUG_SGLIST BIT(4)
117 #define NSP_DEBUG_BUSFREE BIT(5)
118 #define NSP_DEBUG_CDB_CONTENTS BIT(6)
119 #define NSP_DEBUG_RESELECTION BIT(7)
120 #define NSP_DEBUG_MSGINOCCUR BIT(8)
121 #define NSP_DEBUG_EEPROM BIT(9)
122 #define NSP_DEBUG_MSGOUTOCCUR BIT(10)
123 #define NSP_DEBUG_BUSRESET BIT(11)
124 #define NSP_DEBUG_RESTART BIT(12)
125 #define NSP_DEBUG_SYNC BIT(13)
126 #define NSP_DEBUG_WAIT BIT(14)
127 #define NSP_DEBUG_TARGETFLAG BIT(15)
128 #define NSP_DEBUG_PROC BIT(16)
129 #define NSP_DEBUG_INIT BIT(17)
130 #define NSP_DEBUG_DATA_IO BIT(18)
131 #define NSP_SPECIAL_PRINT_REGISTER BIT(20)
133 #define NSP_DEBUG_BUF_LEN 150
135 static inline void nsp_inc_resid(struct scsi_cmnd *SCpnt, int residInc)
137 scsi_set_resid(SCpnt, scsi_get_resid(SCpnt) + residInc);
140 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
143 char buf[NSP_DEBUG_BUF_LEN];
146 vsnprintf(buf, sizeof(buf), fmt, args);
150 printk("%snsp_cs: %s\n", type, buf);
152 printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
157 static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
160 char buf[NSP_DEBUG_BUF_LEN];
163 vsnprintf(buf, sizeof(buf), fmt, args);
166 if (mask & NSP_DEBUG_MASK) {
167 printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
172 /***********************************************************/
174 /*====================================================
175 * Clenaup parameters and call done() functions.
176 * You must be set SCpnt->result before call this function.
178 static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
180 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
182 data->CurrentSC = NULL;
184 SCpnt->scsi_done(SCpnt);
187 static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
188 void (*done)(struct scsi_cmnd *))
191 /*unsigned int host_id = SCpnt->device->host->this_id;*/
192 /*unsigned int base = SCpnt->device->host->io_port;*/
193 unsigned char target = scmd_id(SCpnt);
195 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
197 nsp_dbg(NSP_DEBUG_QUEUECOMMAND,
198 "SCpnt=0x%p target=%d lun=%d sglist=0x%p bufflen=%d sg_count=%d",
199 SCpnt, target, SCpnt->device->lun, scsi_sglist(SCpnt),
200 scsi_bufflen(SCpnt), scsi_sg_count(SCpnt));
201 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
203 SCpnt->scsi_done = done;
205 if (data->CurrentSC != NULL) {
206 nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
207 SCpnt->result = DID_BAD_TARGET << 16;
208 nsp_scsi_done(SCpnt);
213 /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
214 This makes kernel crash when suspending... */
215 if (data->ScsiInfo->stop != 0) {
216 nsp_msg(KERN_INFO, "suspending device. reject command.");
217 SCpnt->result = DID_BAD_TARGET << 16;
218 nsp_scsi_done(SCpnt);
219 return SCSI_MLQUEUE_HOST_BUSY;
225 data->CurrentSC = SCpnt;
227 SCpnt->SCp.Status = CHECK_CONDITION;
228 SCpnt->SCp.Message = 0;
229 SCpnt->SCp.have_data_in = IO_UNKNOWN;
230 SCpnt->SCp.sent_command = 0;
231 SCpnt->SCp.phase = PH_UNDETERMINED;
232 scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
234 /* setup scratch area
235 SCp.ptr : buffer pointer
236 SCp.this_residual : buffer length
237 SCp.buffer : next buffer
238 SCp.buffers_residual : left buffers in list
239 SCp.phase : current state of the command */
240 if (scsi_bufflen(SCpnt)) {
241 SCpnt->SCp.buffer = scsi_sglist(SCpnt);
242 SCpnt->SCp.ptr = BUFFER_ADDR;
243 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
244 SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
246 SCpnt->SCp.ptr = NULL;
247 SCpnt->SCp.this_residual = 0;
248 SCpnt->SCp.buffer = NULL;
249 SCpnt->SCp.buffers_residual = 0;
252 if (nsphw_start_selection(SCpnt) == FALSE) {
253 nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
254 SCpnt->result = DID_BUS_BUSY << 16;
255 nsp_scsi_done(SCpnt);
260 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
268 * setup PIO FIFO transfer mode and enable/disable to data out
270 static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
272 unsigned int base = data->BaseAddress;
273 unsigned char transfer_mode_reg;
275 //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
277 if (enabled != FALSE) {
278 transfer_mode_reg = TRANSFER_GO | BRAIND;
280 transfer_mode_reg = 0;
283 transfer_mode_reg |= data->TransferMode;
285 nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
288 static void nsphw_init_sync(nsp_hw_data *data)
290 sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
296 /* setup sync data */
297 for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
298 data->Sync[i] = tmp_sync;
303 * Initialize Ninja hardware
305 static int nsphw_init(nsp_hw_data *data)
307 unsigned int base = data->BaseAddress;
309 nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
311 data->ScsiClockDiv = CLOCK_40M | FAST_20;
312 data->CurrentSC = NULL;
314 data->TransferMode = MODE_IO8;
316 nsphw_init_sync(data);
318 /* block all interrupts */
319 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
321 /* setup SCSI interface */
322 nsp_write(base, IFSELECT, IF_IFSEL);
324 nsp_index_write(base, SCSIIRQMODE, 0);
326 nsp_index_write(base, TRANSFERMODE, MODE_IO8);
327 nsp_index_write(base, CLOCKDIV, data->ScsiClockDiv);
329 nsp_index_write(base, PARITYCTRL, 0);
330 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
335 /* setup fifo asic */
336 nsp_write(base, IFSELECT, IF_REGSEL);
337 nsp_index_write(base, TERMPWRCTRL, 0);
338 if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
339 nsp_msg(KERN_INFO, "terminator power on");
340 nsp_index_write(base, TERMPWRCTRL, POWER_ON);
343 nsp_index_write(base, TIMERCOUNT, 0);
344 nsp_index_write(base, TIMERCOUNT, 0); /* requires 2 times!! */
346 nsp_index_write(base, SYNCREG, 0);
347 nsp_index_write(base, ACKWIDTH, 0);
349 /* enable interrupts and ack them */
350 nsp_index_write(base, SCSIIRQMODE, SCSI_PHASE_CHANGE_EI |
353 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
355 nsp_setup_fifo(data, FALSE);
361 * Start selection phase
363 static int nsphw_start_selection(struct scsi_cmnd *SCpnt)
365 unsigned int host_id = SCpnt->device->host->this_id;
366 unsigned int base = SCpnt->device->host->io_port;
367 unsigned char target = scmd_id(SCpnt);
368 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
370 unsigned char phase, arbit;
372 //nsp_dbg(NSP_DEBUG_RESELECTION, "in");
374 phase = nsp_index_read(base, SCSIBUSMON);
375 if(phase != BUSMON_BUS_FREE) {
376 //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
380 /* start arbitration */
381 //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
382 SCpnt->SCp.phase = PH_ARBSTART;
383 nsp_index_write(base, SETARBIT, ARBIT_GO);
387 /* XXX: what a stupid chip! */
388 arbit = nsp_index_read(base, ARBITSTATUS);
389 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
390 udelay(1); /* hold 1.2us */
391 } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
394 if (!(arbit & ARBIT_WIN)) {
395 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
396 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
400 /* assert select line */
401 //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
402 SCpnt->SCp.phase = PH_SELSTART;
403 udelay(3); /* wait 2.4us */
404 nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
405 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN);
406 udelay(2); /* wait >1.2us */
407 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
408 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
409 /*udelay(1);*/ /* wait >90ns */
410 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN);
412 /* check selection timeout */
413 nsp_start_timer(SCpnt, 1000/51);
414 data->SelectionTimeOut = 1;
419 struct nsp_sync_table {
420 unsigned int min_period;
421 unsigned int max_period;
422 unsigned int chip_period;
423 unsigned int ack_width;
426 static struct nsp_sync_table nsp_sync_table_40M[] = {
427 {0x0c, 0x0c, 0x1, 0}, /* 20MB 50ns*/
428 {0x19, 0x19, 0x3, 1}, /* 10MB 100ns*/
429 {0x1a, 0x25, 0x5, 2}, /* 7.5MB 150ns*/
430 {0x26, 0x32, 0x7, 3}, /* 5MB 200ns*/
434 static struct nsp_sync_table nsp_sync_table_20M[] = {
435 {0x19, 0x19, 0x1, 0}, /* 10MB 100ns*/
436 {0x1a, 0x25, 0x2, 0}, /* 7.5MB 150ns*/
437 {0x26, 0x32, 0x3, 1}, /* 5MB 200ns*/
442 * setup synchronous data transfer mode
444 static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt)
446 unsigned char target = scmd_id(SCpnt);
447 // unsigned char lun = SCpnt->device->lun;
448 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
449 sync_data *sync = &(data->Sync[target]);
450 struct nsp_sync_table *sync_table;
451 unsigned int period, offset;
455 nsp_dbg(NSP_DEBUG_SYNC, "in");
457 period = sync->SyncPeriod;
458 offset = sync->SyncOffset;
460 nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
462 if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
463 sync_table = nsp_sync_table_20M;
465 sync_table = nsp_sync_table_40M;
468 for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
469 if ( period >= sync_table->min_period &&
470 period <= sync_table->max_period ) {
475 if (period != 0 && sync_table->max_period == 0) {
477 * No proper period/offset found
479 nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
481 sync->SyncPeriod = 0;
482 sync->SyncOffset = 0;
483 sync->SyncRegister = 0;
489 sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
490 (offset & SYNCREG_OFFSET_MASK);
491 sync->AckWidth = sync_table->ack_width;
493 nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
500 * start ninja hardware timer
502 static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time)
504 unsigned int base = SCpnt->device->host->io_port;
505 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
507 //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
508 data->TimerCount = time;
509 nsp_index_write(base, TIMERCOUNT, time);
513 * wait for bus phase change
515 static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask,
518 unsigned int base = SCpnt->device->host->io_port;
522 //nsp_dbg(NSP_DEBUG_INTR, "in");
527 reg = nsp_index_read(base, SCSIBUSMON);
531 } while ((--time_out != 0) && (reg & mask) != 0);
534 nsp_msg(KERN_DEBUG, " %s signal off timeut", str);
543 static int nsp_expect_signal(struct scsi_cmnd *SCpnt,
544 unsigned char current_phase,
547 unsigned int base = SCpnt->device->host->io_port;
549 unsigned char phase, i_src;
551 //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
555 phase = nsp_index_read(base, SCSIBUSMON);
557 //nsp_dbg(NSP_DEBUG_INTR, "ret -1");
560 i_src = nsp_read(base, IRQSTATUS);
561 if (i_src & IRQSTATUS_SCSI) {
562 //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
565 if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) {
566 //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
569 } while(time_out-- != 0);
571 //nsp_dbg(NSP_DEBUG_INTR, "timeout");
576 * transfer SCSI message
578 static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
580 unsigned int base = SCpnt->device->host->io_port;
581 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
582 char *buf = data->MsgBuffer;
583 int len = min(MSGBUF_SIZE, data->MsgLen);
587 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
588 for (ptr = 0; len > 0; len--, ptr++) {
590 ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ);
592 nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit");
596 /* if last byte, negate ATN */
597 if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
598 nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
601 /* read & write message */
602 if (phase & BUSMON_IO) {
603 nsp_dbg(NSP_DEBUG_DATA_IO, "read msg");
604 buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK);
606 nsp_dbg(NSP_DEBUG_DATA_IO, "write msg");
607 nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]);
609 nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>");
616 * get extra SCSI data from fifo
618 static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
620 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
623 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
625 if (SCpnt->SCp.have_data_in != IO_IN) {
629 count = nsp_fifo_count(SCpnt);
630 if (data->FifoCount == count) {
631 //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
637 * data phase skip only occures in case of SCSI_LOW_READ
639 nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
640 SCpnt->SCp.phase = PH_DATA;
642 nsp_setup_fifo(data, FALSE);
650 static int nsp_reselected(struct scsi_cmnd *SCpnt)
652 unsigned int base = SCpnt->device->host->io_port;
653 unsigned int host_id = SCpnt->device->host->this_id;
654 //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
655 unsigned char bus_reg;
656 unsigned char id_reg, tmp;
659 nsp_dbg(NSP_DEBUG_RESELECTION, "in");
661 id_reg = nsp_index_read(base, RESELECTID);
662 tmp = id_reg & (~BIT(host_id));
672 if (scmd_id(SCpnt) != target) {
673 nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target);
676 nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>");
679 bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN);
680 nsp_index_write(base, SCSIBUSCTRL, bus_reg);
681 nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB);
687 * count how many data transferd
689 static int nsp_fifo_count(struct scsi_cmnd *SCpnt)
691 unsigned int base = SCpnt->device->host->io_port;
693 unsigned int l, m, h, dummy;
695 nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER);
697 l = nsp_index_read(base, TRANSFERCOUNT);
698 m = nsp_index_read(base, TRANSFERCOUNT);
699 h = nsp_index_read(base, TRANSFERCOUNT);
700 dummy = nsp_index_read(base, TRANSFERCOUNT); /* required this! */
702 count = (h << 16) | (m << 8) | (l << 0);
704 //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
710 #define RFIFO_CRIT 64
711 #define WFIFO_CRIT 64
714 * read data in DATA IN phase
716 static void nsp_pio_read(struct scsi_cmnd *SCpnt)
718 unsigned int base = SCpnt->device->host->io_port;
719 unsigned long mmio_base = SCpnt->device->host->base;
720 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
723 unsigned char stat, fifo_stat;
725 ocount = data->FifoCount;
727 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",
728 SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr,
729 SCpnt->SCp.this_residual, SCpnt->SCp.buffer,
730 SCpnt->SCp.buffers_residual);
734 while ((time_out-- != 0) &&
735 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
737 stat = nsp_index_read(base, SCSIBUSMON);
738 stat &= BUSMON_PHASE_MASK;
741 res = nsp_fifo_count(SCpnt) - ocount;
742 //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);
743 if (res == 0) { /* if some data avilable ? */
744 if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
745 //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
748 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
753 fifo_stat = nsp_read(base, FIFOSTATUS);
754 if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 &&
755 stat == BUSPHASE_DATA_IN) {
759 res = min(res, SCpnt->SCp.this_residual);
761 switch (data->TransferMode) {
763 res &= ~(BIT(1)|BIT(0)); /* align 4 */
764 nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
767 nsp_fifo8_read (base, SCpnt->SCp.ptr, res );
771 res &= ~(BIT(1)|BIT(0)); /* align 4 */
772 nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
776 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode");
780 nsp_inc_resid(SCpnt, -res);
781 SCpnt->SCp.ptr += res;
782 SCpnt->SCp.this_residual -= res;
784 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
786 /* go to next scatter list if available */
787 if (SCpnt->SCp.this_residual == 0 &&
788 SCpnt->SCp.buffers_residual != 0 ) {
789 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
790 SCpnt->SCp.buffers_residual--;
792 SCpnt->SCp.ptr = BUFFER_ADDR;
793 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
796 //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
800 data->FifoCount = ocount;
803 nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
804 scsi_get_resid(SCpnt), SCpnt->SCp.this_residual,
805 SCpnt->SCp.buffers_residual);
807 nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
808 nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
809 scsi_get_resid(SCpnt));
813 * write data in DATA OUT phase
815 static void nsp_pio_write(struct scsi_cmnd *SCpnt)
817 unsigned int base = SCpnt->device->host->io_port;
818 unsigned long mmio_base = SCpnt->device->host->base;
819 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
824 ocount = data->FifoCount;
826 nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
827 data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual,
828 SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual,
829 scsi_get_resid(SCpnt));
833 while ((time_out-- != 0) &&
834 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
835 stat = nsp_index_read(base, SCSIBUSMON);
836 stat &= BUSMON_PHASE_MASK;
838 if (stat != BUSPHASE_DATA_OUT) {
839 res = ocount - nsp_fifo_count(SCpnt);
841 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
842 /* Put back pointer */
843 nsp_inc_resid(SCpnt, res);
844 SCpnt->SCp.ptr -= res;
845 SCpnt->SCp.this_residual += res;
851 res = ocount - nsp_fifo_count(SCpnt);
852 if (res > 0) { /* write all data? */
853 nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res);
857 res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
859 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
860 switch (data->TransferMode) {
862 res &= ~(BIT(1)|BIT(0)); /* align 4 */
863 nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
866 nsp_fifo8_write (base, SCpnt->SCp.ptr, res );
870 res &= ~(BIT(1)|BIT(0)); /* align 4 */
871 nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
875 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode");
879 nsp_inc_resid(SCpnt, -res);
880 SCpnt->SCp.ptr += res;
881 SCpnt->SCp.this_residual -= res;
884 /* go to next scatter list if available */
885 if (SCpnt->SCp.this_residual == 0 &&
886 SCpnt->SCp.buffers_residual != 0 ) {
887 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
888 SCpnt->SCp.buffers_residual--;
890 SCpnt->SCp.ptr = BUFFER_ADDR;
891 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
896 data->FifoCount = ocount;
899 nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x",
900 scsi_get_resid(SCpnt));
902 nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
903 nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId,
904 scsi_get_resid(SCpnt));
910 * setup synchronous/asynchronous data transfer mode
912 static int nsp_nexus(struct scsi_cmnd *SCpnt)
914 unsigned int base = SCpnt->device->host->io_port;
915 unsigned char target = scmd_id(SCpnt);
916 // unsigned char lun = SCpnt->device->lun;
917 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
918 sync_data *sync = &(data->Sync[target]);
920 //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
922 /* setup synch transfer registers */
923 nsp_index_write(base, SYNCREG, sync->SyncRegister);
924 nsp_index_write(base, ACKWIDTH, sync->AckWidth);
926 if (scsi_get_resid(SCpnt) % 4 != 0 ||
927 scsi_get_resid(SCpnt) <= PAGE_SIZE ) {
928 data->TransferMode = MODE_IO8;
929 } else if (nsp_burst_mode == BURST_MEM32) {
930 data->TransferMode = MODE_MEM32;
931 } else if (nsp_burst_mode == BURST_IO32) {
932 data->TransferMode = MODE_IO32;
934 data->TransferMode = MODE_IO8;
937 /* setup pdma fifo */
938 nsp_setup_fifo(data, TRUE);
940 /* clear ack counter */
942 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
950 #include "nsp_message.c"
954 static irqreturn_t nspintr(int irq, void *dev_id)
957 unsigned char irq_status, irq_phase, phase;
958 struct scsi_cmnd *tmpSC;
959 unsigned char target, lun;
960 unsigned int *sync_neg;
965 //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
966 //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
968 if ( dev_id != NULL &&
969 ((scsi_info_t *)dev_id)->host != NULL ) {
970 scsi_info_t *info = (scsi_info_t *)dev_id;
972 data = (nsp_hw_data *)info->host->hostdata;
974 nsp_dbg(NSP_DEBUG_INTR, "host data wrong");
978 //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
980 base = data->BaseAddress;
981 //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
986 nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE);
987 irq_status = nsp_read(base, IRQSTATUS);
988 //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
989 if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) {
990 nsp_write(base, IRQCONTROL, 0);
991 //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
996 * Do not read an irq_phase register if no scsi phase interrupt.
997 * Unless, you should lose a scsi phase interrupt.
999 phase = nsp_index_read(base, SCSIBUSMON);
1000 if((irq_status & IRQSTATUS_SCSI) != 0) {
1001 irq_phase = nsp_index_read(base, IRQPHASESENCE);
1006 //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1009 * timer interrupt handler (scsi vs timer interrupts)
1011 //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1012 if (data->TimerCount != 0) {
1013 //nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1014 nsp_index_write(base, TIMERCOUNT, 0);
1015 nsp_index_write(base, TIMERCOUNT, 0);
1016 data->TimerCount = 0;
1019 if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER &&
1020 data->SelectionTimeOut == 0) {
1021 //nsp_dbg(NSP_DEBUG_INTR, "timer start");
1022 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR);
1026 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR);
1028 if ((irq_status & IRQSTATUS_SCSI) &&
1029 (irq_phase & SCSI_RESET_IRQ)) {
1030 nsp_msg(KERN_ERR, "bus reset (power off?)");
1033 nsp_bus_reset(data);
1035 if(data->CurrentSC != NULL) {
1036 tmpSC = data->CurrentSC;
1037 tmpSC->result = (DID_RESET << 16) |
1038 ((tmpSC->SCp.Message & 0xff) << 8) |
1039 ((tmpSC->SCp.Status & 0xff) << 0);
1040 nsp_scsi_done(tmpSC);
1045 if (data->CurrentSC == NULL) {
1046 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);
1048 nsp_bus_reset(data);
1052 tmpSC = data->CurrentSC;
1053 target = tmpSC->device->id;
1054 lun = tmpSC->device->lun;
1055 sync_neg = &(data->Sync[target].SyncNegotiation);
1058 * parse hardware SCSI irq reasons register
1060 if (irq_status & IRQSTATUS_SCSI) {
1061 if (irq_phase & RESELECT_IRQ) {
1062 nsp_dbg(NSP_DEBUG_INTR, "reselect");
1063 nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR);
1064 if (nsp_reselected(tmpSC) != FALSE) {
1069 if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) {
1074 //show_phase(tmpSC);
1076 switch(tmpSC->SCp.phase) {
1078 // *sync_neg = SYNC_NOT_YET;
1079 if ((phase & BUSMON_BSY) == 0) {
1080 //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1081 if (data->SelectionTimeOut >= NSP_SELTIMEOUT) {
1082 nsp_dbg(NSP_DEBUG_INTR, "selection time out");
1083 data->SelectionTimeOut = 0;
1084 nsp_index_write(base, SCSIBUSCTRL, 0);
1086 tmpSC->result = DID_TIME_OUT << 16;
1087 nsp_scsi_done(tmpSC);
1091 data->SelectionTimeOut += 1;
1092 nsp_start_timer(tmpSC, 1000/51);
1096 /* attention assert */
1097 //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1098 data->SelectionTimeOut = 0;
1099 tmpSC->SCp.phase = PH_SELECTED;
1100 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
1102 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
1108 //nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1109 // *sync_neg = SYNC_NOT_YET;
1110 if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) {
1112 tmpSC->result = DID_ABORT << 16;
1113 nsp_scsi_done(tmpSC);
1118 if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) {
1127 //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1129 /* normal disconnect */
1130 if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
1131 (irq_phase & LATCHED_BUS_FREE) != 0 ) {
1132 nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1134 //*sync_neg = SYNC_NOT_YET;
1136 if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) { /* all command complete and return status */
1137 tmpSC->result = (DID_OK << 16) |
1138 ((tmpSC->SCp.Message & 0xff) << 8) |
1139 ((tmpSC->SCp.Status & 0xff) << 0);
1140 nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
1141 nsp_scsi_done(tmpSC);
1150 /* check unexpected bus free state */
1152 nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1154 *sync_neg = SYNC_NG;
1155 tmpSC->result = DID_ERROR << 16;
1156 nsp_scsi_done(tmpSC);
1160 switch (phase & BUSMON_PHASE_MASK) {
1161 case BUSPHASE_COMMAND:
1162 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND");
1163 if ((phase & BUSMON_REQ) == 0) {
1164 nsp_dbg(NSP_DEBUG_INTR, "REQ == 0");
1168 tmpSC->SCp.phase = PH_COMMAND;
1172 /* write scsi command */
1173 nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len);
1174 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER);
1175 for (i = 0; i < tmpSC->cmd_len; i++) {
1176 nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]);
1178 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO);
1181 case BUSPHASE_DATA_OUT:
1182 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
1184 tmpSC->SCp.phase = PH_DATA;
1185 tmpSC->SCp.have_data_in = IO_OUT;
1187 nsp_pio_write(tmpSC);
1191 case BUSPHASE_DATA_IN:
1192 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
1194 tmpSC->SCp.phase = PH_DATA;
1195 tmpSC->SCp.have_data_in = IO_IN;
1197 nsp_pio_read(tmpSC);
1201 case BUSPHASE_STATUS:
1202 nsp_dataphase_bypass(tmpSC);
1203 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
1205 tmpSC->SCp.phase = PH_STATUS;
1207 tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
1208 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
1212 case BUSPHASE_MESSAGE_OUT:
1213 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT");
1214 if ((phase & BUSMON_REQ) == 0) {
1218 tmpSC->SCp.phase = PH_MSG_OUT;
1220 //*sync_neg = SYNC_NOT_YET;
1222 data->MsgLen = i = 0;
1223 data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++;
1225 if (*sync_neg == SYNC_NOT_YET) {
1226 data->Sync[target].SyncPeriod = 0;
1227 data->Sync[target].SyncOffset = 0;
1230 data->MsgBuffer[i] = MSG_EXTENDED; i++;
1231 data->MsgBuffer[i] = 3; i++;
1232 data->MsgBuffer[i] = MSG_EXT_SDTR; i++;
1233 data->MsgBuffer[i] = 0x0c; i++;
1234 data->MsgBuffer[i] = 15; i++;
1239 nsp_analyze_sdtr(tmpSC);
1241 nsp_message_out(tmpSC);
1244 case BUSPHASE_MESSAGE_IN:
1245 nsp_dataphase_bypass(tmpSC);
1246 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN");
1247 if ((phase & BUSMON_REQ) == 0) {
1251 tmpSC->SCp.phase = PH_MSG_IN;
1252 nsp_message_in(tmpSC);
1255 if (*sync_neg == SYNC_NOT_YET) {
1256 //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1258 if (data->MsgLen >= 5 &&
1259 data->MsgBuffer[0] == MSG_EXTENDED &&
1260 data->MsgBuffer[1] == 3 &&
1261 data->MsgBuffer[2] == MSG_EXT_SDTR ) {
1262 data->Sync[target].SyncPeriod = data->MsgBuffer[3];
1263 data->Sync[target].SyncOffset = data->MsgBuffer[4];
1264 //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1265 *sync_neg = SYNC_OK;
1267 data->Sync[target].SyncPeriod = 0;
1268 data->Sync[target].SyncOffset = 0;
1269 *sync_neg = SYNC_NG;
1271 nsp_analyze_sdtr(tmpSC);
1275 /* search last messeage byte */
1277 for (i = 0; i < data->MsgLen; i++) {
1278 tmp = data->MsgBuffer[i];
1279 if (data->MsgBuffer[i] == MSG_EXTENDED) {
1280 i += (1 + data->MsgBuffer[i+1]);
1283 tmpSC->SCp.Message = tmp;
1285 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
1290 case BUSPHASE_SELECT:
1292 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other");
1297 //nsp_dbg(NSP_DEBUG_INTR, "out");
1301 nsp_start_timer(tmpSC, 1000/102);
1306 #include "nsp_debug.c"
1307 #endif /* NSP_DEBUG */
1309 /*----------------------------------------------------------------*/
1310 /* look for ninja3 card and init if found */
1311 /*----------------------------------------------------------------*/
1312 static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
1314 struct Scsi_Host *host; /* registered host structure */
1315 nsp_hw_data *data_b = &nsp_data_base, *data;
1317 nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
1318 host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
1320 nsp_dbg(NSP_DEBUG_INIT, "host failed");
1324 memcpy(host->hostdata, data_b, sizeof(nsp_hw_data));
1325 data = (nsp_hw_data *)host->hostdata;
1326 data->ScsiInfo->host = host;
1331 nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber);
1333 host->unique_id = data->BaseAddress;
1334 host->io_port = data->BaseAddress;
1335 host->n_io_port = data->NumAddress;
1336 host->irq = data->IrqNumber;
1337 host->base = data->MmioAddress;
1339 spin_lock_init(&(data->Lock));
1341 snprintf(data->nspinfo,
1342 sizeof(data->nspinfo),
1343 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1344 host->io_port, host->io_port + host->n_io_port - 1,
1347 sht->name = data->nspinfo;
1349 nsp_dbg(NSP_DEBUG_INIT, "end");
1352 return host; /* detect done. */
1355 /*----------------------------------------------------------------*/
1356 /* return info string */
1357 /*----------------------------------------------------------------*/
1358 static const char *nsp_info(struct Scsi_Host *shpnt)
1360 nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1362 return data->nspinfo;
1366 #define SPRINTF(args...) \
1368 if(length > (pos - buffer)) { \
1369 pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1370 nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\
1374 static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1375 off_t offset, int length, int inout)
1381 unsigned long flags;
1389 hostno = host->host_no;
1390 data = (nsp_hw_data *)host->hostdata;
1393 SPRINTF("NinjaSCSI status\n\n");
1394 SPRINTF("Driver version: $Revision: 1.23 $\n");
1395 SPRINTF("SCSI host No.: %d\n", hostno);
1396 SPRINTF("IRQ: %d\n", host->irq);
1397 SPRINTF("IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1);
1398 SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1);
1399 SPRINTF("sg_tablesize: %d\n", host->sg_tablesize);
1401 SPRINTF("burst transfer mode: ");
1402 switch (nsp_burst_mode) {
1419 spin_lock_irqsave(&(data->Lock), flags);
1420 SPRINTF("CurrentSC: 0x%p\n\n", data->CurrentSC);
1421 spin_unlock_irqrestore(&(data->Lock), flags);
1423 SPRINTF("SDTR status\n");
1424 for(id = 0; id < ARRAY_SIZE(data->Sync); id++) {
1426 SPRINTF("id %d: ", id);
1428 if (id == host->this_id) {
1429 SPRINTF("----- NinjaSCSI-3 host adapter\n");
1433 switch(data->Sync[id].SyncNegotiation) {
1448 if (data->Sync[id].SyncPeriod != 0) {
1449 speed = 1000000 / (data->Sync[id].SyncPeriod * 4);
1451 SPRINTF(" transfer %d.%dMB/s, offset %d",
1454 data->Sync[id].SyncOffset
1460 thislength = pos - (buffer + offset);
1462 if(thislength < 0) {
1468 thislength = min(thislength, length);
1469 *start = buffer + offset;
1475 /*---------------------------------------------------------------*/
1477 /*---------------------------------------------------------------*/
1480 static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1482 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1484 return nsp_eh_bus_reset(SCpnt);
1487 static int nsp_bus_reset(nsp_hw_data *data)
1489 unsigned int base = data->BaseAddress;
1492 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
1494 nsp_index_write(base, SCSIBUSCTRL, SCSI_RST);
1495 mdelay(100); /* 100ms */
1496 nsp_index_write(base, SCSIBUSCTRL, 0);
1497 for(i = 0; i < 5; i++) {
1498 nsp_index_read(base, IRQPHASESENCE); /* dummy read */
1501 nsphw_init_sync(data);
1503 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
1508 static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt)
1510 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1512 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1514 return nsp_bus_reset(data);
1517 static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt)
1519 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1521 nsp_dbg(NSP_DEBUG_BUSRESET, "in");
1529 /**********************************************************************
1531 **********************************************************************/
1533 static int nsp_cs_probe(struct pcmcia_device *link)
1536 nsp_hw_data *data = &nsp_data_base;
1539 nsp_dbg(NSP_DEBUG_INIT, "in");
1541 /* Create new SCSI device */
1542 info = kzalloc(sizeof(*info), GFP_KERNEL);
1543 if (info == NULL) { return -ENOMEM; }
1546 data->ScsiInfo = info;
1548 nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1550 ret = nsp_cs_config(link);
1552 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1554 } /* nsp_cs_attach */
1557 static void nsp_cs_detach(struct pcmcia_device *link)
1559 nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1561 ((scsi_info_t *)link->priv)->stop = 1;
1562 nsp_cs_release(link);
1566 } /* nsp_cs_detach */
1569 static int nsp_cs_config_check(struct pcmcia_device *p_dev, void *priv_data)
1571 nsp_hw_data *data = priv_data;
1573 if (p_dev->config_index == 0)
1576 /* This reserves IO space but doesn't actually enable it */
1577 if (pcmcia_request_io(p_dev) != 0)
1580 if (resource_size(p_dev->resource[2])) {
1581 p_dev->resource[2]->flags |= (WIN_DATA_WIDTH_16 |
1582 WIN_MEMORY_TYPE_CM |
1584 if (p_dev->resource[2]->end < 0x1000)
1585 p_dev->resource[2]->end = 0x1000;
1586 if (pcmcia_request_window(p_dev, p_dev->resource[2], 0) != 0)
1588 if (pcmcia_map_mem_page(p_dev, p_dev->resource[2],
1589 p_dev->card_addr) != 0)
1592 data->MmioAddress = (unsigned long)
1593 ioremap_nocache(p_dev->resource[2]->start,
1594 resource_size(p_dev->resource[2]));
1595 data->MmioLength = resource_size(p_dev->resource[2]);
1597 /* If we got this far, we're cool! */
1601 nsp_dbg(NSP_DEBUG_INIT, "next");
1602 pcmcia_disable_device(p_dev);
1606 static int nsp_cs_config(struct pcmcia_device *link)
1609 scsi_info_t *info = link->priv;
1610 struct Scsi_Host *host;
1611 nsp_hw_data *data = &nsp_data_base;
1613 nsp_dbg(NSP_DEBUG_INIT, "in");
1615 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
1616 CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IOMEM |
1619 ret = pcmcia_loop_config(link, nsp_cs_config_check, data);
1623 if (pcmcia_request_irq(link, nspintr))
1626 ret = pcmcia_enable_device(link);
1631 if (link->resource[0]) {
1632 release_region(link->resource[0]->start,
1633 resource_size(link->resource[0]));
1635 if (link->resource[1]) {
1636 release_region(link->resource[1]->start,
1637 resource_size(link->resource[1]));
1641 /* Set port and IRQ */
1642 data->BaseAddress = link->resource[0]->start;
1643 data->NumAddress = resource_size(link->resource[0]);
1644 data->IrqNumber = link->irq;
1646 nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1647 data->BaseAddress, data->NumAddress, data->IrqNumber);
1649 if(nsphw_init(data) == FALSE) {
1653 host = nsp_detect(&nsp_driver_template);
1656 nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1661 ret = scsi_add_host (host, NULL);
1665 scsi_scan_host(host);
1672 nsp_dbg(NSP_DEBUG_INIT, "config fail");
1673 nsp_cs_release(link);
1676 } /* nsp_cs_config */
1679 static void nsp_cs_release(struct pcmcia_device *link)
1681 scsi_info_t *info = link->priv;
1682 nsp_hw_data *data = NULL;
1684 if (info->host == NULL) {
1685 nsp_msg(KERN_DEBUG, "unexpected card release call.");
1687 data = (nsp_hw_data *)info->host->hostdata;
1690 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1692 /* Unlink the device chain */
1693 if (info->host != NULL) {
1694 scsi_remove_host(info->host);
1697 if (resource_size(link->resource[2])) {
1699 iounmap((void *)(data->MmioAddress));
1702 pcmcia_disable_device(link);
1704 if (info->host != NULL) {
1705 scsi_host_put(info->host);
1707 } /* nsp_cs_release */
1709 static int nsp_cs_suspend(struct pcmcia_device *link)
1711 scsi_info_t *info = link->priv;
1714 nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
1716 if (info->host != NULL) {
1717 nsp_msg(KERN_INFO, "clear SDTR status");
1719 data = (nsp_hw_data *)info->host->hostdata;
1721 nsphw_init_sync(data);
1729 static int nsp_cs_resume(struct pcmcia_device *link)
1731 scsi_info_t *info = link->priv;
1734 nsp_dbg(NSP_DEBUG_INIT, "event: resume");
1738 if (info->host != NULL) {
1739 nsp_msg(KERN_INFO, "reset host and bus");
1741 data = (nsp_hw_data *)info->host->hostdata;
1744 nsp_bus_reset(data);
1750 /*======================================================================*
1751 * module entry point
1752 *====================================================================*/
1753 static struct pcmcia_device_id nsp_cs_ids[] = {
1754 PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16 ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
1755 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
1756 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
1757 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
1758 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
1759 PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
1760 PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
1763 MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids);
1765 static struct pcmcia_driver nsp_driver = {
1766 .owner = THIS_MODULE,
1768 .probe = nsp_cs_probe,
1769 .remove = nsp_cs_detach,
1770 .id_table = nsp_cs_ids,
1771 .suspend = nsp_cs_suspend,
1772 .resume = nsp_cs_resume,
1775 static int __init nsp_cs_init(void)
1777 return pcmcia_register_driver(&nsp_driver);
1780 static void __exit nsp_cs_exit(void)
1782 pcmcia_unregister_driver(&nsp_driver);
1786 module_init(nsp_cs_init)
1787 module_exit(nsp_cs_exit)