1 /*======================================================================
3 NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver
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>
57 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
58 MODULE_LICENSE("GPL");
62 /*====================================================================*/
63 /* Parameters that can be set with 'insmod' */
65 static int nsp_burst_mode = BURST_MEM32;
66 module_param(nsp_burst_mode, int, 0);
67 MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
69 /* Release IO ports after configuration? */
70 static bool free_ports = 0;
71 module_param(free_ports, bool, 0);
72 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
74 static struct scsi_host_template nsp_driver_template = {
75 .proc_name = "nsp_cs",
76 .show_info = nsp_show_info,
77 .name = "WorkBit NinjaSCSI-3/32Bi(16bit)",
79 .queuecommand = nsp_queuecommand,
80 /* .eh_abort_handler = nsp_eh_abort,*/
81 .eh_bus_reset_handler = nsp_eh_bus_reset,
82 .eh_host_reset_handler = nsp_eh_host_reset,
84 .this_id = NSP_INITIATOR_ID,
85 .sg_tablesize = SG_ALL,
86 .dma_boundary = PAGE_SIZE - 1,
89 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
97 # define NSP_DEBUG_MASK 0x000000
98 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
99 # define nsp_dbg(mask, args...) /* */
101 # define NSP_DEBUG_MASK 0xffffff
102 # define nsp_msg(type, args...) \
103 nsp_cs_message (__func__, __LINE__, (type), args)
104 # define nsp_dbg(mask, args...) \
105 nsp_cs_dmessage(__func__, __LINE__, (mask), args)
108 #define NSP_DEBUG_QUEUECOMMAND BIT(0)
109 #define NSP_DEBUG_REGISTER BIT(1)
110 #define NSP_DEBUG_AUTOSCSI BIT(2)
111 #define NSP_DEBUG_INTR BIT(3)
112 #define NSP_DEBUG_SGLIST BIT(4)
113 #define NSP_DEBUG_BUSFREE BIT(5)
114 #define NSP_DEBUG_CDB_CONTENTS BIT(6)
115 #define NSP_DEBUG_RESELECTION BIT(7)
116 #define NSP_DEBUG_MSGINOCCUR BIT(8)
117 #define NSP_DEBUG_EEPROM BIT(9)
118 #define NSP_DEBUG_MSGOUTOCCUR BIT(10)
119 #define NSP_DEBUG_BUSRESET BIT(11)
120 #define NSP_DEBUG_RESTART BIT(12)
121 #define NSP_DEBUG_SYNC BIT(13)
122 #define NSP_DEBUG_WAIT BIT(14)
123 #define NSP_DEBUG_TARGETFLAG BIT(15)
124 #define NSP_DEBUG_PROC BIT(16)
125 #define NSP_DEBUG_INIT BIT(17)
126 #define NSP_DEBUG_DATA_IO BIT(18)
127 #define NSP_SPECIAL_PRINT_REGISTER BIT(20)
129 #define NSP_DEBUG_BUF_LEN 150
131 static inline void nsp_inc_resid(struct scsi_cmnd *SCpnt, int residInc)
133 scsi_set_resid(SCpnt, scsi_get_resid(SCpnt) + residInc);
137 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
140 char buf[NSP_DEBUG_BUF_LEN];
143 vsnprintf(buf, sizeof(buf), fmt, args);
147 printk("%snsp_cs: %s\n", type, buf);
149 printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
154 static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
157 char buf[NSP_DEBUG_BUF_LEN];
160 vsnprintf(buf, sizeof(buf), fmt, args);
163 if (mask & NSP_DEBUG_MASK) {
164 printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
169 /***********************************************************/
171 /*====================================================
172 * Clenaup parameters and call done() functions.
173 * You must be set SCpnt->result before call this function.
175 static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
177 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
179 data->CurrentSC = NULL;
184 static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt)
187 /*unsigned int host_id = SCpnt->device->host->this_id;*/
188 /*unsigned int base = SCpnt->device->host->io_port;*/
189 unsigned char target = scmd_id(SCpnt);
191 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
193 nsp_dbg(NSP_DEBUG_QUEUECOMMAND,
194 "SCpnt=0x%p target=%d lun=%llu sglist=0x%p bufflen=%d sg_count=%d",
195 SCpnt, target, SCpnt->device->lun, scsi_sglist(SCpnt),
196 scsi_bufflen(SCpnt), scsi_sg_count(SCpnt));
197 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
199 if (data->CurrentSC != NULL) {
200 nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
201 SCpnt->result = DID_BAD_TARGET << 16;
202 nsp_scsi_done(SCpnt);
207 /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
208 This makes kernel crash when suspending... */
209 if (data->ScsiInfo->stop != 0) {
210 nsp_msg(KERN_INFO, "suspending device. reject command.");
211 SCpnt->result = DID_BAD_TARGET << 16;
212 nsp_scsi_done(SCpnt);
213 return SCSI_MLQUEUE_HOST_BUSY;
219 data->CurrentSC = SCpnt;
221 SCpnt->SCp.Status = SAM_STAT_CHECK_CONDITION;
222 SCpnt->SCp.Message = 0;
223 SCpnt->SCp.have_data_in = IO_UNKNOWN;
224 SCpnt->SCp.sent_command = 0;
225 SCpnt->SCp.phase = PH_UNDETERMINED;
226 scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
228 /* setup scratch area
229 SCp.ptr : buffer pointer
230 SCp.this_residual : buffer length
231 SCp.buffer : next buffer
232 SCp.buffers_residual : left buffers in list
233 SCp.phase : current state of the command */
234 if (scsi_bufflen(SCpnt)) {
235 SCpnt->SCp.buffer = scsi_sglist(SCpnt);
236 SCpnt->SCp.ptr = BUFFER_ADDR;
237 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
238 SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
240 SCpnt->SCp.ptr = NULL;
241 SCpnt->SCp.this_residual = 0;
242 SCpnt->SCp.buffer = NULL;
243 SCpnt->SCp.buffers_residual = 0;
246 if (nsphw_start_selection(SCpnt) == FALSE) {
247 nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
248 SCpnt->result = DID_BUS_BUSY << 16;
249 nsp_scsi_done(SCpnt);
254 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
261 static DEF_SCSI_QCMD(nsp_queuecommand)
264 * setup PIO FIFO transfer mode and enable/disable to data out
266 static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
268 unsigned int base = data->BaseAddress;
269 unsigned char transfer_mode_reg;
271 //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
273 if (enabled != FALSE) {
274 transfer_mode_reg = TRANSFER_GO | BRAIND;
276 transfer_mode_reg = 0;
279 transfer_mode_reg |= data->TransferMode;
281 nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
284 static void nsphw_init_sync(nsp_hw_data *data)
286 sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
292 /* setup sync data */
293 for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
294 data->Sync[i] = tmp_sync;
299 * Initialize Ninja hardware
301 static int nsphw_init(nsp_hw_data *data)
303 unsigned int base = data->BaseAddress;
305 nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
307 data->ScsiClockDiv = CLOCK_40M | FAST_20;
308 data->CurrentSC = NULL;
310 data->TransferMode = MODE_IO8;
312 nsphw_init_sync(data);
314 /* block all interrupts */
315 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
317 /* setup SCSI interface */
318 nsp_write(base, IFSELECT, IF_IFSEL);
320 nsp_index_write(base, SCSIIRQMODE, 0);
322 nsp_index_write(base, TRANSFERMODE, MODE_IO8);
323 nsp_index_write(base, CLOCKDIV, data->ScsiClockDiv);
325 nsp_index_write(base, PARITYCTRL, 0);
326 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
331 /* setup fifo asic */
332 nsp_write(base, IFSELECT, IF_REGSEL);
333 nsp_index_write(base, TERMPWRCTRL, 0);
334 if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
335 nsp_msg(KERN_INFO, "terminator power on");
336 nsp_index_write(base, TERMPWRCTRL, POWER_ON);
339 nsp_index_write(base, TIMERCOUNT, 0);
340 nsp_index_write(base, TIMERCOUNT, 0); /* requires 2 times!! */
342 nsp_index_write(base, SYNCREG, 0);
343 nsp_index_write(base, ACKWIDTH, 0);
345 /* enable interrupts and ack them */
346 nsp_index_write(base, SCSIIRQMODE, SCSI_PHASE_CHANGE_EI |
349 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
351 nsp_setup_fifo(data, FALSE);
357 * Start selection phase
359 static int nsphw_start_selection(struct scsi_cmnd *SCpnt)
361 unsigned int host_id = SCpnt->device->host->this_id;
362 unsigned int base = SCpnt->device->host->io_port;
363 unsigned char target = scmd_id(SCpnt);
364 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
366 unsigned char phase, arbit;
368 //nsp_dbg(NSP_DEBUG_RESELECTION, "in");
370 phase = nsp_index_read(base, SCSIBUSMON);
371 if(phase != BUSMON_BUS_FREE) {
372 //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
376 /* start arbitration */
377 //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
378 SCpnt->SCp.phase = PH_ARBSTART;
379 nsp_index_write(base, SETARBIT, ARBIT_GO);
383 /* XXX: what a stupid chip! */
384 arbit = nsp_index_read(base, ARBITSTATUS);
385 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
386 udelay(1); /* hold 1.2us */
387 } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
390 if (!(arbit & ARBIT_WIN)) {
391 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
392 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
396 /* assert select line */
397 //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
398 SCpnt->SCp.phase = PH_SELSTART;
399 udelay(3); /* wait 2.4us */
400 nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
401 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN);
402 udelay(2); /* wait >1.2us */
403 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
404 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
405 /*udelay(1);*/ /* wait >90ns */
406 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN);
408 /* check selection timeout */
409 nsp_start_timer(SCpnt, 1000/51);
410 data->SelectionTimeOut = 1;
415 struct nsp_sync_table {
416 unsigned int min_period;
417 unsigned int max_period;
418 unsigned int chip_period;
419 unsigned int ack_width;
422 static struct nsp_sync_table nsp_sync_table_40M[] = {
423 {0x0c, 0x0c, 0x1, 0}, /* 20MB 50ns*/
424 {0x19, 0x19, 0x3, 1}, /* 10MB 100ns*/
425 {0x1a, 0x25, 0x5, 2}, /* 7.5MB 150ns*/
426 {0x26, 0x32, 0x7, 3}, /* 5MB 200ns*/
430 static struct nsp_sync_table nsp_sync_table_20M[] = {
431 {0x19, 0x19, 0x1, 0}, /* 10MB 100ns*/
432 {0x1a, 0x25, 0x2, 0}, /* 7.5MB 150ns*/
433 {0x26, 0x32, 0x3, 1}, /* 5MB 200ns*/
438 * setup synchronous data transfer mode
440 static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt)
442 unsigned char target = scmd_id(SCpnt);
443 // unsigned char lun = SCpnt->device->lun;
444 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
445 sync_data *sync = &(data->Sync[target]);
446 struct nsp_sync_table *sync_table;
447 unsigned int period, offset;
451 nsp_dbg(NSP_DEBUG_SYNC, "in");
453 period = sync->SyncPeriod;
454 offset = sync->SyncOffset;
456 nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
458 if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
459 sync_table = nsp_sync_table_20M;
461 sync_table = nsp_sync_table_40M;
464 for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
465 if ( period >= sync_table->min_period &&
466 period <= sync_table->max_period ) {
471 if (period != 0 && sync_table->max_period == 0) {
473 * No proper period/offset found
475 nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
477 sync->SyncPeriod = 0;
478 sync->SyncOffset = 0;
479 sync->SyncRegister = 0;
485 sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
486 (offset & SYNCREG_OFFSET_MASK);
487 sync->AckWidth = sync_table->ack_width;
489 nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
496 * start ninja hardware timer
498 static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time)
500 unsigned int base = SCpnt->device->host->io_port;
501 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
503 //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
504 data->TimerCount = time;
505 nsp_index_write(base, TIMERCOUNT, time);
509 * wait for bus phase change
511 static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask,
514 unsigned int base = SCpnt->device->host->io_port;
518 //nsp_dbg(NSP_DEBUG_INTR, "in");
523 reg = nsp_index_read(base, SCSIBUSMON);
527 } while ((--time_out != 0) && (reg & mask) != 0);
530 nsp_msg(KERN_DEBUG, " %s signal off timeout", str);
539 static int nsp_expect_signal(struct scsi_cmnd *SCpnt,
540 unsigned char current_phase,
543 unsigned int base = SCpnt->device->host->io_port;
545 unsigned char phase, i_src;
547 //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
551 phase = nsp_index_read(base, SCSIBUSMON);
553 //nsp_dbg(NSP_DEBUG_INTR, "ret -1");
556 i_src = nsp_read(base, IRQSTATUS);
557 if (i_src & IRQSTATUS_SCSI) {
558 //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
561 if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) {
562 //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
565 } while(time_out-- != 0);
567 //nsp_dbg(NSP_DEBUG_INTR, "timeout");
572 * transfer SCSI message
574 static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
576 unsigned int base = SCpnt->device->host->io_port;
577 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
578 char *buf = data->MsgBuffer;
579 int len = min(MSGBUF_SIZE, data->MsgLen);
583 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
584 for (ptr = 0; len > 0; len--, ptr++) {
586 ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ);
588 nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit");
592 /* if last byte, negate ATN */
593 if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
594 nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
597 /* read & write message */
598 if (phase & BUSMON_IO) {
599 nsp_dbg(NSP_DEBUG_DATA_IO, "read msg");
600 buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK);
602 nsp_dbg(NSP_DEBUG_DATA_IO, "write msg");
603 nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]);
605 nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>");
612 * get extra SCSI data from fifo
614 static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
616 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
619 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
621 if (SCpnt->SCp.have_data_in != IO_IN) {
625 count = nsp_fifo_count(SCpnt);
626 if (data->FifoCount == count) {
627 //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
633 * data phase skip only occures in case of SCSI_LOW_READ
635 nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
636 SCpnt->SCp.phase = PH_DATA;
638 nsp_setup_fifo(data, FALSE);
646 static int nsp_reselected(struct scsi_cmnd *SCpnt)
648 unsigned int base = SCpnt->device->host->io_port;
649 unsigned int host_id = SCpnt->device->host->this_id;
650 //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
651 unsigned char bus_reg;
652 unsigned char id_reg, tmp;
655 nsp_dbg(NSP_DEBUG_RESELECTION, "in");
657 id_reg = nsp_index_read(base, RESELECTID);
658 tmp = id_reg & (~BIT(host_id));
668 if (scmd_id(SCpnt) != target) {
669 nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target);
672 nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>");
675 bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN);
676 nsp_index_write(base, SCSIBUSCTRL, bus_reg);
677 nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB);
683 * count how many data transferd
685 static int nsp_fifo_count(struct scsi_cmnd *SCpnt)
687 unsigned int base = SCpnt->device->host->io_port;
689 unsigned int l, m, h;
691 nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER);
693 l = nsp_index_read(base, TRANSFERCOUNT);
694 m = nsp_index_read(base, TRANSFERCOUNT);
695 h = nsp_index_read(base, TRANSFERCOUNT);
696 nsp_index_read(base, TRANSFERCOUNT); /* required this! */
698 count = (h << 16) | (m << 8) | (l << 0);
700 //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
706 #define RFIFO_CRIT 64
707 #define WFIFO_CRIT 64
710 * read data in DATA IN phase
712 static void nsp_pio_read(struct scsi_cmnd *SCpnt)
714 unsigned int base = SCpnt->device->host->io_port;
715 unsigned long mmio_base = SCpnt->device->host->base;
716 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
719 unsigned char stat, fifo_stat;
721 ocount = data->FifoCount;
723 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",
724 SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr,
725 SCpnt->SCp.this_residual, SCpnt->SCp.buffer,
726 SCpnt->SCp.buffers_residual);
730 while ((time_out-- != 0) &&
731 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
733 stat = nsp_index_read(base, SCSIBUSMON);
734 stat &= BUSMON_PHASE_MASK;
737 res = nsp_fifo_count(SCpnt) - ocount;
738 //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);
739 if (res == 0) { /* if some data available ? */
740 if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
741 //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
744 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
749 fifo_stat = nsp_read(base, FIFOSTATUS);
750 if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 &&
751 stat == BUSPHASE_DATA_IN) {
755 res = min(res, SCpnt->SCp.this_residual);
757 switch (data->TransferMode) {
759 res &= ~(BIT(1)|BIT(0)); /* align 4 */
760 nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
763 nsp_fifo8_read (base, SCpnt->SCp.ptr, res );
767 res &= ~(BIT(1)|BIT(0)); /* align 4 */
768 nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
772 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode");
776 nsp_inc_resid(SCpnt, -res);
777 SCpnt->SCp.ptr += res;
778 SCpnt->SCp.this_residual -= res;
780 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
782 /* go to next scatter list if available */
783 if (SCpnt->SCp.this_residual == 0 &&
784 SCpnt->SCp.buffers_residual != 0 ) {
785 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
786 SCpnt->SCp.buffers_residual--;
787 SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer);
788 SCpnt->SCp.ptr = BUFFER_ADDR;
789 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
792 //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
796 data->FifoCount = ocount;
799 nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
800 scsi_get_resid(SCpnt), SCpnt->SCp.this_residual,
801 SCpnt->SCp.buffers_residual);
803 nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
804 nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
805 scsi_get_resid(SCpnt));
809 * write data in DATA OUT phase
811 static void nsp_pio_write(struct scsi_cmnd *SCpnt)
813 unsigned int base = SCpnt->device->host->io_port;
814 unsigned long mmio_base = SCpnt->device->host->base;
815 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
820 ocount = data->FifoCount;
822 nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
823 data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual,
824 SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual,
825 scsi_get_resid(SCpnt));
829 while ((time_out-- != 0) &&
830 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
831 stat = nsp_index_read(base, SCSIBUSMON);
832 stat &= BUSMON_PHASE_MASK;
834 if (stat != BUSPHASE_DATA_OUT) {
835 res = ocount - nsp_fifo_count(SCpnt);
837 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
838 /* Put back pointer */
839 nsp_inc_resid(SCpnt, res);
840 SCpnt->SCp.ptr -= res;
841 SCpnt->SCp.this_residual += res;
847 res = ocount - nsp_fifo_count(SCpnt);
848 if (res > 0) { /* write all data? */
849 nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res);
853 res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
855 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
856 switch (data->TransferMode) {
858 res &= ~(BIT(1)|BIT(0)); /* align 4 */
859 nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
862 nsp_fifo8_write (base, SCpnt->SCp.ptr, res );
866 res &= ~(BIT(1)|BIT(0)); /* align 4 */
867 nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
871 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode");
875 nsp_inc_resid(SCpnt, -res);
876 SCpnt->SCp.ptr += res;
877 SCpnt->SCp.this_residual -= res;
880 /* go to next scatter list if available */
881 if (SCpnt->SCp.this_residual == 0 &&
882 SCpnt->SCp.buffers_residual != 0 ) {
883 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
884 SCpnt->SCp.buffers_residual--;
885 SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer);
886 SCpnt->SCp.ptr = BUFFER_ADDR;
887 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
892 data->FifoCount = ocount;
895 nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x",
896 scsi_get_resid(SCpnt));
898 nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
899 nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId,
900 scsi_get_resid(SCpnt));
906 * setup synchronous/asynchronous data transfer mode
908 static int nsp_nexus(struct scsi_cmnd *SCpnt)
910 unsigned int base = SCpnt->device->host->io_port;
911 unsigned char target = scmd_id(SCpnt);
912 // unsigned char lun = SCpnt->device->lun;
913 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
914 sync_data *sync = &(data->Sync[target]);
916 //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
918 /* setup synch transfer registers */
919 nsp_index_write(base, SYNCREG, sync->SyncRegister);
920 nsp_index_write(base, ACKWIDTH, sync->AckWidth);
922 if (scsi_get_resid(SCpnt) % 4 != 0 ||
923 scsi_get_resid(SCpnt) <= PAGE_SIZE ) {
924 data->TransferMode = MODE_IO8;
925 } else if (nsp_burst_mode == BURST_MEM32) {
926 data->TransferMode = MODE_MEM32;
927 } else if (nsp_burst_mode == BURST_IO32) {
928 data->TransferMode = MODE_IO32;
930 data->TransferMode = MODE_IO8;
933 /* setup pdma fifo */
934 nsp_setup_fifo(data, TRUE);
936 /* clear ack counter */
938 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
946 #include "nsp_message.c"
950 static irqreturn_t nspintr(int irq, void *dev_id)
953 unsigned char irq_status, irq_phase, phase;
954 struct scsi_cmnd *tmpSC;
955 unsigned char target, lun;
956 unsigned int *sync_neg;
961 //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
962 //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
964 if ( dev_id != NULL &&
965 ((scsi_info_t *)dev_id)->host != NULL ) {
966 scsi_info_t *info = (scsi_info_t *)dev_id;
968 data = (nsp_hw_data *)info->host->hostdata;
970 nsp_dbg(NSP_DEBUG_INTR, "host data wrong");
974 //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
976 base = data->BaseAddress;
977 //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
982 nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE);
983 irq_status = nsp_read(base, IRQSTATUS);
984 //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
985 if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) {
986 nsp_write(base, IRQCONTROL, 0);
987 //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
992 * Do not read an irq_phase register if no scsi phase interrupt.
993 * Unless, you should lose a scsi phase interrupt.
995 phase = nsp_index_read(base, SCSIBUSMON);
996 if((irq_status & IRQSTATUS_SCSI) != 0) {
997 irq_phase = nsp_index_read(base, IRQPHASESENCE);
1002 //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1005 * timer interrupt handler (scsi vs timer interrupts)
1007 //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1008 if (data->TimerCount != 0) {
1009 //nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1010 nsp_index_write(base, TIMERCOUNT, 0);
1011 nsp_index_write(base, TIMERCOUNT, 0);
1012 data->TimerCount = 0;
1015 if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER &&
1016 data->SelectionTimeOut == 0) {
1017 //nsp_dbg(NSP_DEBUG_INTR, "timer start");
1018 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR);
1022 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR);
1024 if ((irq_status & IRQSTATUS_SCSI) &&
1025 (irq_phase & SCSI_RESET_IRQ)) {
1026 nsp_msg(KERN_ERR, "bus reset (power off?)");
1029 nsp_bus_reset(data);
1031 if(data->CurrentSC != NULL) {
1032 tmpSC = data->CurrentSC;
1033 tmpSC->result = (DID_RESET << 16) |
1034 ((tmpSC->SCp.Message & 0xff) << 8) |
1035 ((tmpSC->SCp.Status & 0xff) << 0);
1036 nsp_scsi_done(tmpSC);
1041 if (data->CurrentSC == NULL) {
1042 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);
1044 nsp_bus_reset(data);
1048 tmpSC = data->CurrentSC;
1049 target = tmpSC->device->id;
1050 lun = tmpSC->device->lun;
1051 sync_neg = &(data->Sync[target].SyncNegotiation);
1054 * parse hardware SCSI irq reasons register
1056 if (irq_status & IRQSTATUS_SCSI) {
1057 if (irq_phase & RESELECT_IRQ) {
1058 nsp_dbg(NSP_DEBUG_INTR, "reselect");
1059 nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR);
1060 if (nsp_reselected(tmpSC) != FALSE) {
1065 if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) {
1070 //show_phase(tmpSC);
1072 switch(tmpSC->SCp.phase) {
1074 // *sync_neg = SYNC_NOT_YET;
1075 if ((phase & BUSMON_BSY) == 0) {
1076 //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1077 if (data->SelectionTimeOut >= NSP_SELTIMEOUT) {
1078 nsp_dbg(NSP_DEBUG_INTR, "selection time out");
1079 data->SelectionTimeOut = 0;
1080 nsp_index_write(base, SCSIBUSCTRL, 0);
1082 tmpSC->result = DID_TIME_OUT << 16;
1083 nsp_scsi_done(tmpSC);
1087 data->SelectionTimeOut += 1;
1088 nsp_start_timer(tmpSC, 1000/51);
1092 /* attention assert */
1093 //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1094 data->SelectionTimeOut = 0;
1095 tmpSC->SCp.phase = PH_SELECTED;
1096 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
1098 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
1102 //nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1103 // *sync_neg = SYNC_NOT_YET;
1104 if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) {
1106 tmpSC->result = DID_ABORT << 16;
1107 nsp_scsi_done(tmpSC);
1112 if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) {
1121 //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1123 /* normal disconnect */
1124 if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
1125 (irq_phase & LATCHED_BUS_FREE) != 0 ) {
1126 nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1128 //*sync_neg = SYNC_NOT_YET;
1130 /* all command complete and return status */
1131 if (tmpSC->SCp.Message == COMMAND_COMPLETE) {
1132 tmpSC->result = (DID_OK << 16) |
1133 ((tmpSC->SCp.Message & 0xff) << 8) |
1134 ((tmpSC->SCp.Status & 0xff) << 0);
1135 nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
1136 nsp_scsi_done(tmpSC);
1145 /* check unexpected bus free state */
1147 nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1149 *sync_neg = SYNC_NG;
1150 tmpSC->result = DID_ERROR << 16;
1151 nsp_scsi_done(tmpSC);
1155 switch (phase & BUSMON_PHASE_MASK) {
1156 case BUSPHASE_COMMAND:
1157 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND");
1158 if ((phase & BUSMON_REQ) == 0) {
1159 nsp_dbg(NSP_DEBUG_INTR, "REQ == 0");
1163 tmpSC->SCp.phase = PH_COMMAND;
1167 /* write scsi command */
1168 nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len);
1169 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER);
1170 for (i = 0; i < tmpSC->cmd_len; i++) {
1171 nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]);
1173 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO);
1176 case BUSPHASE_DATA_OUT:
1177 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
1179 tmpSC->SCp.phase = PH_DATA;
1180 tmpSC->SCp.have_data_in = IO_OUT;
1182 nsp_pio_write(tmpSC);
1186 case BUSPHASE_DATA_IN:
1187 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
1189 tmpSC->SCp.phase = PH_DATA;
1190 tmpSC->SCp.have_data_in = IO_IN;
1192 nsp_pio_read(tmpSC);
1196 case BUSPHASE_STATUS:
1197 nsp_dataphase_bypass(tmpSC);
1198 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
1200 tmpSC->SCp.phase = PH_STATUS;
1202 tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
1203 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
1207 case BUSPHASE_MESSAGE_OUT:
1208 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT");
1209 if ((phase & BUSMON_REQ) == 0) {
1213 tmpSC->SCp.phase = PH_MSG_OUT;
1215 //*sync_neg = SYNC_NOT_YET;
1217 data->MsgLen = i = 0;
1218 data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++;
1220 if (*sync_neg == SYNC_NOT_YET) {
1221 data->Sync[target].SyncPeriod = 0;
1222 data->Sync[target].SyncOffset = 0;
1225 data->MsgBuffer[i] = EXTENDED_MESSAGE; i++;
1226 data->MsgBuffer[i] = 3; i++;
1227 data->MsgBuffer[i] = EXTENDED_SDTR; i++;
1228 data->MsgBuffer[i] = 0x0c; i++;
1229 data->MsgBuffer[i] = 15; i++;
1234 nsp_analyze_sdtr(tmpSC);
1236 nsp_message_out(tmpSC);
1239 case BUSPHASE_MESSAGE_IN:
1240 nsp_dataphase_bypass(tmpSC);
1241 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN");
1242 if ((phase & BUSMON_REQ) == 0) {
1246 tmpSC->SCp.phase = PH_MSG_IN;
1247 nsp_message_in(tmpSC);
1250 if (*sync_neg == SYNC_NOT_YET) {
1251 //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1253 if (data->MsgLen >= 5 &&
1254 data->MsgBuffer[0] == EXTENDED_MESSAGE &&
1255 data->MsgBuffer[1] == 3 &&
1256 data->MsgBuffer[2] == EXTENDED_SDTR ) {
1257 data->Sync[target].SyncPeriod = data->MsgBuffer[3];
1258 data->Sync[target].SyncOffset = data->MsgBuffer[4];
1259 //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1260 *sync_neg = SYNC_OK;
1262 data->Sync[target].SyncPeriod = 0;
1263 data->Sync[target].SyncOffset = 0;
1264 *sync_neg = SYNC_NG;
1266 nsp_analyze_sdtr(tmpSC);
1270 /* search last messeage byte */
1272 for (i = 0; i < data->MsgLen; i++) {
1273 tmp = data->MsgBuffer[i];
1274 if (data->MsgBuffer[i] == EXTENDED_MESSAGE) {
1275 i += (1 + data->MsgBuffer[i+1]);
1278 tmpSC->SCp.Message = tmp;
1280 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
1285 case BUSPHASE_SELECT:
1287 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other");
1292 //nsp_dbg(NSP_DEBUG_INTR, "out");
1296 nsp_start_timer(tmpSC, 1000/102);
1301 #include "nsp_debug.c"
1302 #endif /* NSP_DEBUG */
1304 /*----------------------------------------------------------------*/
1305 /* look for ninja3 card and init if found */
1306 /*----------------------------------------------------------------*/
1307 static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
1309 struct Scsi_Host *host; /* registered host structure */
1310 nsp_hw_data *data_b = &nsp_data_base, *data;
1312 nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
1313 host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
1315 nsp_dbg(NSP_DEBUG_INIT, "host failed");
1319 memcpy(host->hostdata, data_b, sizeof(nsp_hw_data));
1320 data = (nsp_hw_data *)host->hostdata;
1321 data->ScsiInfo->host = host;
1326 nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber);
1328 host->unique_id = data->BaseAddress;
1329 host->io_port = data->BaseAddress;
1330 host->n_io_port = data->NumAddress;
1331 host->irq = data->IrqNumber;
1332 host->base = data->MmioAddress;
1334 spin_lock_init(&(data->Lock));
1336 snprintf(data->nspinfo,
1337 sizeof(data->nspinfo),
1338 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1339 host->io_port, host->io_port + host->n_io_port - 1,
1342 sht->name = data->nspinfo;
1344 nsp_dbg(NSP_DEBUG_INIT, "end");
1347 return host; /* detect done. */
1350 /*----------------------------------------------------------------*/
1351 /* return info string */
1352 /*----------------------------------------------------------------*/
1353 static const char *nsp_info(struct Scsi_Host *shpnt)
1355 nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1357 return data->nspinfo;
1360 static int nsp_show_info(struct seq_file *m, struct Scsi_Host *host)
1364 unsigned long flags;
1368 hostno = host->host_no;
1369 data = (nsp_hw_data *)host->hostdata;
1371 seq_puts(m, "NinjaSCSI status\n\n"
1372 "Driver version: $Revision: 1.23 $\n");
1373 seq_printf(m, "SCSI host No.: %d\n", hostno);
1374 seq_printf(m, "IRQ: %d\n", host->irq);
1375 seq_printf(m, "IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1);
1376 seq_printf(m, "MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1);
1377 seq_printf(m, "sg_tablesize: %d\n", host->sg_tablesize);
1379 seq_puts(m, "burst transfer mode: ");
1380 switch (nsp_burst_mode) {
1385 seq_puts(m, "io32");
1388 seq_puts(m, "mem32");
1397 spin_lock_irqsave(&(data->Lock), flags);
1398 seq_printf(m, "CurrentSC: 0x%p\n\n", data->CurrentSC);
1399 spin_unlock_irqrestore(&(data->Lock), flags);
1401 seq_puts(m, "SDTR status\n");
1402 for(id = 0; id < ARRAY_SIZE(data->Sync); id++) {
1404 seq_printf(m, "id %d: ", id);
1406 if (id == host->this_id) {
1407 seq_puts(m, "----- NinjaSCSI-3 host adapter\n");
1411 switch(data->Sync[id].SyncNegotiation) {
1413 seq_puts(m, " sync");
1416 seq_puts(m, "async");
1419 seq_puts(m, " none");
1422 seq_puts(m, "?????");
1426 if (data->Sync[id].SyncPeriod != 0) {
1427 speed = 1000000 / (data->Sync[id].SyncPeriod * 4);
1429 seq_printf(m, " transfer %d.%dMB/s, offset %d",
1432 data->Sync[id].SyncOffset
1440 /*---------------------------------------------------------------*/
1442 /*---------------------------------------------------------------*/
1445 static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1447 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1449 return nsp_eh_bus_reset(SCpnt);
1452 static int nsp_bus_reset(nsp_hw_data *data)
1454 unsigned int base = data->BaseAddress;
1457 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
1459 nsp_index_write(base, SCSIBUSCTRL, SCSI_RST);
1460 mdelay(100); /* 100ms */
1461 nsp_index_write(base, SCSIBUSCTRL, 0);
1462 for(i = 0; i < 5; i++) {
1463 nsp_index_read(base, IRQPHASESENCE); /* dummy read */
1466 nsphw_init_sync(data);
1468 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
1473 static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt)
1475 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1477 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1479 return nsp_bus_reset(data);
1482 static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt)
1484 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1486 nsp_dbg(NSP_DEBUG_BUSRESET, "in");
1494 /**********************************************************************
1496 **********************************************************************/
1498 static int nsp_cs_probe(struct pcmcia_device *link)
1501 nsp_hw_data *data = &nsp_data_base;
1504 nsp_dbg(NSP_DEBUG_INIT, "in");
1506 /* Create new SCSI device */
1507 info = kzalloc(sizeof(*info), GFP_KERNEL);
1508 if (info == NULL) { return -ENOMEM; }
1511 data->ScsiInfo = info;
1513 nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1515 ret = nsp_cs_config(link);
1517 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1519 } /* nsp_cs_attach */
1522 static void nsp_cs_detach(struct pcmcia_device *link)
1524 nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1526 ((scsi_info_t *)link->priv)->stop = 1;
1527 nsp_cs_release(link);
1531 } /* nsp_cs_detach */
1534 static int nsp_cs_config_check(struct pcmcia_device *p_dev, void *priv_data)
1536 nsp_hw_data *data = priv_data;
1538 if (p_dev->config_index == 0)
1541 /* This reserves IO space but doesn't actually enable it */
1542 if (pcmcia_request_io(p_dev) != 0)
1545 if (resource_size(p_dev->resource[2])) {
1546 p_dev->resource[2]->flags |= (WIN_DATA_WIDTH_16 |
1547 WIN_MEMORY_TYPE_CM |
1549 if (p_dev->resource[2]->end < 0x1000)
1550 p_dev->resource[2]->end = 0x1000;
1551 if (pcmcia_request_window(p_dev, p_dev->resource[2], 0) != 0)
1553 if (pcmcia_map_mem_page(p_dev, p_dev->resource[2],
1554 p_dev->card_addr) != 0)
1557 data->MmioAddress = (unsigned long)
1558 ioremap(p_dev->resource[2]->start,
1559 resource_size(p_dev->resource[2]));
1560 data->MmioLength = resource_size(p_dev->resource[2]);
1562 /* If we got this far, we're cool! */
1566 nsp_dbg(NSP_DEBUG_INIT, "next");
1567 pcmcia_disable_device(p_dev);
1571 static int nsp_cs_config(struct pcmcia_device *link)
1574 scsi_info_t *info = link->priv;
1575 struct Scsi_Host *host;
1576 nsp_hw_data *data = &nsp_data_base;
1578 nsp_dbg(NSP_DEBUG_INIT, "in");
1580 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
1581 CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IOMEM |
1584 ret = pcmcia_loop_config(link, nsp_cs_config_check, data);
1588 if (pcmcia_request_irq(link, nspintr))
1591 ret = pcmcia_enable_device(link);
1596 if (link->resource[0]) {
1597 release_region(link->resource[0]->start,
1598 resource_size(link->resource[0]));
1600 if (link->resource[1]) {
1601 release_region(link->resource[1]->start,
1602 resource_size(link->resource[1]));
1606 /* Set port and IRQ */
1607 data->BaseAddress = link->resource[0]->start;
1608 data->NumAddress = resource_size(link->resource[0]);
1609 data->IrqNumber = link->irq;
1611 nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1612 data->BaseAddress, data->NumAddress, data->IrqNumber);
1614 if(nsphw_init(data) == FALSE) {
1618 host = nsp_detect(&nsp_driver_template);
1621 nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1626 ret = scsi_add_host (host, NULL);
1630 scsi_scan_host(host);
1637 nsp_dbg(NSP_DEBUG_INIT, "config fail");
1638 nsp_cs_release(link);
1641 } /* nsp_cs_config */
1644 static void nsp_cs_release(struct pcmcia_device *link)
1646 scsi_info_t *info = link->priv;
1647 nsp_hw_data *data = NULL;
1649 if (info->host == NULL) {
1650 nsp_msg(KERN_DEBUG, "unexpected card release call.");
1652 data = (nsp_hw_data *)info->host->hostdata;
1655 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1657 /* Unlink the device chain */
1658 if (info->host != NULL) {
1659 scsi_remove_host(info->host);
1662 if (resource_size(link->resource[2])) {
1664 iounmap((void *)(data->MmioAddress));
1667 pcmcia_disable_device(link);
1669 if (info->host != NULL) {
1670 scsi_host_put(info->host);
1672 } /* nsp_cs_release */
1674 static int nsp_cs_suspend(struct pcmcia_device *link)
1676 scsi_info_t *info = link->priv;
1679 nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
1681 if (info->host != NULL) {
1682 nsp_msg(KERN_INFO, "clear SDTR status");
1684 data = (nsp_hw_data *)info->host->hostdata;
1686 nsphw_init_sync(data);
1694 static int nsp_cs_resume(struct pcmcia_device *link)
1696 scsi_info_t *info = link->priv;
1699 nsp_dbg(NSP_DEBUG_INIT, "event: resume");
1703 if (info->host != NULL) {
1704 nsp_msg(KERN_INFO, "reset host and bus");
1706 data = (nsp_hw_data *)info->host->hostdata;
1709 nsp_bus_reset(data);
1715 /*======================================================================*
1716 * module entry point
1717 *====================================================================*/
1718 static const struct pcmcia_device_id nsp_cs_ids[] = {
1719 PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16 ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
1720 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
1721 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
1722 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
1723 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
1724 PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
1725 PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
1728 MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids);
1730 static struct pcmcia_driver nsp_driver = {
1731 .owner = THIS_MODULE,
1733 .probe = nsp_cs_probe,
1734 .remove = nsp_cs_detach,
1735 .id_table = nsp_cs_ids,
1736 .suspend = nsp_cs_suspend,
1737 .resume = nsp_cs_resume,
1739 module_pcmcia_driver(nsp_driver);