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/cs_types.h>
51 #include <pcmcia/cs.h>
52 #include <pcmcia/cistpl.h>
53 #include <pcmcia/cisreg.h>
54 #include <pcmcia/ds.h>
58 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
59 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
60 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
62 MODULE_LICENSE("GPL");
67 /*====================================================================*/
68 /* Parameters that can be set with 'insmod' */
70 static int nsp_burst_mode = BURST_MEM32;
71 module_param(nsp_burst_mode, int, 0);
72 MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
74 /* Release IO ports after configuration? */
75 static int free_ports = 0;
76 module_param(free_ports, bool, 0);
77 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
79 static struct scsi_host_template nsp_driver_template = {
80 .proc_name = "nsp_cs",
81 .proc_info = nsp_proc_info,
82 .name = "WorkBit NinjaSCSI-3/32Bi(16bit)",
84 .queuecommand = nsp_queuecommand,
85 /* .eh_abort_handler = nsp_eh_abort,*/
86 .eh_bus_reset_handler = nsp_eh_bus_reset,
87 .eh_host_reset_handler = nsp_eh_host_reset,
89 .this_id = NSP_INITIATOR_ID,
90 .sg_tablesize = SG_ALL,
92 .use_clustering = DISABLE_CLUSTERING,
95 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
103 # define NSP_DEBUG_MASK 0x000000
104 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
105 # define nsp_dbg(mask, args...) /* */
107 # define NSP_DEBUG_MASK 0xffffff
108 # define nsp_msg(type, args...) \
109 nsp_cs_message (__func__, __LINE__, (type), args)
110 # define nsp_dbg(mask, args...) \
111 nsp_cs_dmessage(__func__, __LINE__, (mask), args)
114 #define NSP_DEBUG_QUEUECOMMAND BIT(0)
115 #define NSP_DEBUG_REGISTER BIT(1)
116 #define NSP_DEBUG_AUTOSCSI BIT(2)
117 #define NSP_DEBUG_INTR BIT(3)
118 #define NSP_DEBUG_SGLIST BIT(4)
119 #define NSP_DEBUG_BUSFREE BIT(5)
120 #define NSP_DEBUG_CDB_CONTENTS BIT(6)
121 #define NSP_DEBUG_RESELECTION BIT(7)
122 #define NSP_DEBUG_MSGINOCCUR BIT(8)
123 #define NSP_DEBUG_EEPROM BIT(9)
124 #define NSP_DEBUG_MSGOUTOCCUR BIT(10)
125 #define NSP_DEBUG_BUSRESET BIT(11)
126 #define NSP_DEBUG_RESTART BIT(12)
127 #define NSP_DEBUG_SYNC BIT(13)
128 #define NSP_DEBUG_WAIT BIT(14)
129 #define NSP_DEBUG_TARGETFLAG BIT(15)
130 #define NSP_DEBUG_PROC BIT(16)
131 #define NSP_DEBUG_INIT BIT(17)
132 #define NSP_DEBUG_DATA_IO BIT(18)
133 #define NSP_SPECIAL_PRINT_REGISTER BIT(20)
135 #define NSP_DEBUG_BUF_LEN 150
137 static inline void nsp_inc_resid(struct scsi_cmnd *SCpnt, int residInc)
139 scsi_set_resid(SCpnt, scsi_get_resid(SCpnt) + residInc);
142 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
145 char buf[NSP_DEBUG_BUF_LEN];
148 vsnprintf(buf, sizeof(buf), fmt, args);
152 printk("%snsp_cs: %s\n", type, buf);
154 printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf);
159 static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...)
162 char buf[NSP_DEBUG_BUF_LEN];
165 vsnprintf(buf, sizeof(buf), fmt, args);
168 if (mask & NSP_DEBUG_MASK) {
169 printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf);
174 /***********************************************************/
176 /*====================================================
177 * Clenaup parameters and call done() functions.
178 * You must be set SCpnt->result before call this function.
180 static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
182 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
184 data->CurrentSC = NULL;
186 SCpnt->scsi_done(SCpnt);
189 static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
190 void (*done)(struct scsi_cmnd *))
193 /*unsigned int host_id = SCpnt->device->host->this_id;*/
194 /*unsigned int base = SCpnt->device->host->io_port;*/
195 unsigned char target = scmd_id(SCpnt);
197 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
199 nsp_dbg(NSP_DEBUG_QUEUECOMMAND,
200 "SCpnt=0x%p target=%d lun=%d sglist=0x%p bufflen=%d sg_count=%d",
201 SCpnt, target, SCpnt->device->lun, scsi_sglist(SCpnt),
202 scsi_bufflen(SCpnt), scsi_sg_count(SCpnt));
203 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
205 SCpnt->scsi_done = done;
207 if (data->CurrentSC != NULL) {
208 nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen");
209 SCpnt->result = DID_BAD_TARGET << 16;
210 nsp_scsi_done(SCpnt);
215 /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
216 This makes kernel crash when suspending... */
217 if (data->ScsiInfo->stop != 0) {
218 nsp_msg(KERN_INFO, "suspending device. reject command.");
219 SCpnt->result = DID_BAD_TARGET << 16;
220 nsp_scsi_done(SCpnt);
221 return SCSI_MLQUEUE_HOST_BUSY;
227 data->CurrentSC = SCpnt;
229 SCpnt->SCp.Status = CHECK_CONDITION;
230 SCpnt->SCp.Message = 0;
231 SCpnt->SCp.have_data_in = IO_UNKNOWN;
232 SCpnt->SCp.sent_command = 0;
233 SCpnt->SCp.phase = PH_UNDETERMINED;
234 scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
236 /* setup scratch area
237 SCp.ptr : buffer pointer
238 SCp.this_residual : buffer length
239 SCp.buffer : next buffer
240 SCp.buffers_residual : left buffers in list
241 SCp.phase : current state of the command */
242 if (scsi_bufflen(SCpnt)) {
243 SCpnt->SCp.buffer = scsi_sglist(SCpnt);
244 SCpnt->SCp.ptr = BUFFER_ADDR;
245 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
246 SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
248 SCpnt->SCp.ptr = NULL;
249 SCpnt->SCp.this_residual = 0;
250 SCpnt->SCp.buffer = NULL;
251 SCpnt->SCp.buffers_residual = 0;
254 if (nsphw_start_selection(SCpnt) == FALSE) {
255 nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail");
256 SCpnt->result = DID_BUS_BUSY << 16;
257 nsp_scsi_done(SCpnt);
262 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
270 * setup PIO FIFO transfer mode and enable/disable to data out
272 static void nsp_setup_fifo(nsp_hw_data *data, int enabled)
274 unsigned int base = data->BaseAddress;
275 unsigned char transfer_mode_reg;
277 //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
279 if (enabled != FALSE) {
280 transfer_mode_reg = TRANSFER_GO | BRAIND;
282 transfer_mode_reg = 0;
285 transfer_mode_reg |= data->TransferMode;
287 nsp_index_write(base, TRANSFERMODE, transfer_mode_reg);
290 static void nsphw_init_sync(nsp_hw_data *data)
292 sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET,
298 /* setup sync data */
299 for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) {
300 data->Sync[i] = tmp_sync;
305 * Initialize Ninja hardware
307 static int nsphw_init(nsp_hw_data *data)
309 unsigned int base = data->BaseAddress;
311 nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base);
313 data->ScsiClockDiv = CLOCK_40M | FAST_20;
314 data->CurrentSC = NULL;
316 data->TransferMode = MODE_IO8;
318 nsphw_init_sync(data);
320 /* block all interrupts */
321 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
323 /* setup SCSI interface */
324 nsp_write(base, IFSELECT, IF_IFSEL);
326 nsp_index_write(base, SCSIIRQMODE, 0);
328 nsp_index_write(base, TRANSFERMODE, MODE_IO8);
329 nsp_index_write(base, CLOCKDIV, data->ScsiClockDiv);
331 nsp_index_write(base, PARITYCTRL, 0);
332 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
337 /* setup fifo asic */
338 nsp_write(base, IFSELECT, IF_REGSEL);
339 nsp_index_write(base, TERMPWRCTRL, 0);
340 if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) {
341 nsp_msg(KERN_INFO, "terminator power on");
342 nsp_index_write(base, TERMPWRCTRL, POWER_ON);
345 nsp_index_write(base, TIMERCOUNT, 0);
346 nsp_index_write(base, TIMERCOUNT, 0); /* requires 2 times!! */
348 nsp_index_write(base, SYNCREG, 0);
349 nsp_index_write(base, ACKWIDTH, 0);
351 /* enable interrupts and ack them */
352 nsp_index_write(base, SCSIIRQMODE, SCSI_PHASE_CHANGE_EI |
355 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
357 nsp_setup_fifo(data, FALSE);
363 * Start selection phase
365 static int nsphw_start_selection(struct scsi_cmnd *SCpnt)
367 unsigned int host_id = SCpnt->device->host->this_id;
368 unsigned int base = SCpnt->device->host->io_port;
369 unsigned char target = scmd_id(SCpnt);
370 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
372 unsigned char phase, arbit;
374 //nsp_dbg(NSP_DEBUG_RESELECTION, "in");
376 phase = nsp_index_read(base, SCSIBUSMON);
377 if(phase != BUSMON_BUS_FREE) {
378 //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
382 /* start arbitration */
383 //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
384 SCpnt->SCp.phase = PH_ARBSTART;
385 nsp_index_write(base, SETARBIT, ARBIT_GO);
389 /* XXX: what a stupid chip! */
390 arbit = nsp_index_read(base, ARBITSTATUS);
391 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
392 udelay(1); /* hold 1.2us */
393 } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 &&
396 if (!(arbit & ARBIT_WIN)) {
397 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
398 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
402 /* assert select line */
403 //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
404 SCpnt->SCp.phase = PH_SELSTART;
405 udelay(3); /* wait 2.4us */
406 nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
407 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN);
408 udelay(2); /* wait >1.2us */
409 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN);
410 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR);
411 /*udelay(1);*/ /* wait >90ns */
412 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN);
414 /* check selection timeout */
415 nsp_start_timer(SCpnt, 1000/51);
416 data->SelectionTimeOut = 1;
421 struct nsp_sync_table {
422 unsigned int min_period;
423 unsigned int max_period;
424 unsigned int chip_period;
425 unsigned int ack_width;
428 static struct nsp_sync_table nsp_sync_table_40M[] = {
429 {0x0c, 0x0c, 0x1, 0}, /* 20MB 50ns*/
430 {0x19, 0x19, 0x3, 1}, /* 10MB 100ns*/
431 {0x1a, 0x25, 0x5, 2}, /* 7.5MB 150ns*/
432 {0x26, 0x32, 0x7, 3}, /* 5MB 200ns*/
436 static struct nsp_sync_table nsp_sync_table_20M[] = {
437 {0x19, 0x19, 0x1, 0}, /* 10MB 100ns*/
438 {0x1a, 0x25, 0x2, 0}, /* 7.5MB 150ns*/
439 {0x26, 0x32, 0x3, 1}, /* 5MB 200ns*/
444 * setup synchronous data transfer mode
446 static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt)
448 unsigned char target = scmd_id(SCpnt);
449 // unsigned char lun = SCpnt->device->lun;
450 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
451 sync_data *sync = &(data->Sync[target]);
452 struct nsp_sync_table *sync_table;
453 unsigned int period, offset;
457 nsp_dbg(NSP_DEBUG_SYNC, "in");
459 period = sync->SyncPeriod;
460 offset = sync->SyncOffset;
462 nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset);
464 if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) {
465 sync_table = nsp_sync_table_20M;
467 sync_table = nsp_sync_table_40M;
470 for ( i = 0; sync_table->max_period != 0; i++, sync_table++) {
471 if ( period >= sync_table->min_period &&
472 period <= sync_table->max_period ) {
477 if (period != 0 && sync_table->max_period == 0) {
479 * No proper period/offset found
481 nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset");
483 sync->SyncPeriod = 0;
484 sync->SyncOffset = 0;
485 sync->SyncRegister = 0;
491 sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) |
492 (offset & SYNCREG_OFFSET_MASK);
493 sync->AckWidth = sync_table->ack_width;
495 nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth);
502 * start ninja hardware timer
504 static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time)
506 unsigned int base = SCpnt->device->host->io_port;
507 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
509 //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
510 data->TimerCount = time;
511 nsp_index_write(base, TIMERCOUNT, time);
515 * wait for bus phase change
517 static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask,
520 unsigned int base = SCpnt->device->host->io_port;
524 //nsp_dbg(NSP_DEBUG_INTR, "in");
529 reg = nsp_index_read(base, SCSIBUSMON);
533 } while ((time_out-- != 0) && (reg & mask) != 0);
536 nsp_msg(KERN_DEBUG, " %s signal off timeut", str);
545 static int nsp_expect_signal(struct scsi_cmnd *SCpnt,
546 unsigned char current_phase,
549 unsigned int base = SCpnt->device->host->io_port;
551 unsigned char phase, i_src;
553 //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
557 phase = nsp_index_read(base, SCSIBUSMON);
559 //nsp_dbg(NSP_DEBUG_INTR, "ret -1");
562 i_src = nsp_read(base, IRQSTATUS);
563 if (i_src & IRQSTATUS_SCSI) {
564 //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
567 if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) {
568 //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
571 } while(time_out-- != 0);
573 //nsp_dbg(NSP_DEBUG_INTR, "timeout");
578 * transfer SCSI message
580 static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
582 unsigned int base = SCpnt->device->host->io_port;
583 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
584 char *buf = data->MsgBuffer;
585 int len = min(MSGBUF_SIZE, data->MsgLen);
589 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
590 for (ptr = 0; len > 0; len--, ptr++) {
592 ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ);
594 nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit");
598 /* if last byte, negate ATN */
599 if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
600 nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
603 /* read & write message */
604 if (phase & BUSMON_IO) {
605 nsp_dbg(NSP_DEBUG_DATA_IO, "read msg");
606 buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK);
608 nsp_dbg(NSP_DEBUG_DATA_IO, "write msg");
609 nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]);
611 nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>");
618 * get extra SCSI data from fifo
620 static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
622 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
625 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
627 if (SCpnt->SCp.have_data_in != IO_IN) {
631 count = nsp_fifo_count(SCpnt);
632 if (data->FifoCount == count) {
633 //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
639 * data phase skip only occures in case of SCSI_LOW_READ
641 nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
642 SCpnt->SCp.phase = PH_DATA;
644 nsp_setup_fifo(data, FALSE);
652 static int nsp_reselected(struct scsi_cmnd *SCpnt)
654 unsigned int base = SCpnt->device->host->io_port;
655 unsigned int host_id = SCpnt->device->host->this_id;
656 //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
657 unsigned char bus_reg;
658 unsigned char id_reg, tmp;
661 nsp_dbg(NSP_DEBUG_RESELECTION, "in");
663 id_reg = nsp_index_read(base, RESELECTID);
664 tmp = id_reg & (~BIT(host_id));
674 if (scmd_id(SCpnt) != target) {
675 nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target);
678 nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>");
681 bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN);
682 nsp_index_write(base, SCSIBUSCTRL, bus_reg);
683 nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB);
689 * count how many data transferd
691 static int nsp_fifo_count(struct scsi_cmnd *SCpnt)
693 unsigned int base = SCpnt->device->host->io_port;
695 unsigned int l, m, h, dummy;
697 nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER);
699 l = nsp_index_read(base, TRANSFERCOUNT);
700 m = nsp_index_read(base, TRANSFERCOUNT);
701 h = nsp_index_read(base, TRANSFERCOUNT);
702 dummy = nsp_index_read(base, TRANSFERCOUNT); /* required this! */
704 count = (h << 16) | (m << 8) | (l << 0);
706 //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
712 #define RFIFO_CRIT 64
713 #define WFIFO_CRIT 64
716 * read data in DATA IN phase
718 static void nsp_pio_read(struct scsi_cmnd *SCpnt)
720 unsigned int base = SCpnt->device->host->io_port;
721 unsigned long mmio_base = SCpnt->device->host->base;
722 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
725 unsigned char stat, fifo_stat;
727 ocount = data->FifoCount;
729 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",
730 SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr,
731 SCpnt->SCp.this_residual, SCpnt->SCp.buffer,
732 SCpnt->SCp.buffers_residual);
736 while ((time_out-- != 0) &&
737 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
739 stat = nsp_index_read(base, SCSIBUSMON);
740 stat &= BUSMON_PHASE_MASK;
743 res = nsp_fifo_count(SCpnt) - ocount;
744 //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);
745 if (res == 0) { /* if some data avilable ? */
746 if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
747 //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
750 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
755 fifo_stat = nsp_read(base, FIFOSTATUS);
756 if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 &&
757 stat == BUSPHASE_DATA_IN) {
761 res = min(res, SCpnt->SCp.this_residual);
763 switch (data->TransferMode) {
765 res &= ~(BIT(1)|BIT(0)); /* align 4 */
766 nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
769 nsp_fifo8_read (base, SCpnt->SCp.ptr, res );
773 res &= ~(BIT(1)|BIT(0)); /* align 4 */
774 nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
778 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode");
782 nsp_inc_resid(SCpnt, -res);
783 SCpnt->SCp.ptr += res;
784 SCpnt->SCp.this_residual -= res;
786 //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 /* go to next scatter list if available */
789 if (SCpnt->SCp.this_residual == 0 &&
790 SCpnt->SCp.buffers_residual != 0 ) {
791 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
792 SCpnt->SCp.buffers_residual--;
794 SCpnt->SCp.ptr = BUFFER_ADDR;
795 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
798 //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
802 data->FifoCount = ocount;
805 nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
806 scsi_get_resid(SCpnt), SCpnt->SCp.this_residual,
807 SCpnt->SCp.buffers_residual);
809 nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
810 nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
811 scsi_get_resid(SCpnt));
815 * write data in DATA OUT phase
817 static void nsp_pio_write(struct scsi_cmnd *SCpnt)
819 unsigned int base = SCpnt->device->host->io_port;
820 unsigned long mmio_base = SCpnt->device->host->base;
821 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
826 ocount = data->FifoCount;
828 nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
829 data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual,
830 SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual,
831 scsi_get_resid(SCpnt));
835 while ((time_out-- != 0) &&
836 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
837 stat = nsp_index_read(base, SCSIBUSMON);
838 stat &= BUSMON_PHASE_MASK;
840 if (stat != BUSPHASE_DATA_OUT) {
841 res = ocount - nsp_fifo_count(SCpnt);
843 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
844 /* Put back pointer */
845 nsp_inc_resid(SCpnt, res);
846 SCpnt->SCp.ptr -= res;
847 SCpnt->SCp.this_residual += res;
853 res = ocount - nsp_fifo_count(SCpnt);
854 if (res > 0) { /* write all data? */
855 nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res);
859 res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
861 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
862 switch (data->TransferMode) {
864 res &= ~(BIT(1)|BIT(0)); /* align 4 */
865 nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
868 nsp_fifo8_write (base, SCpnt->SCp.ptr, res );
872 res &= ~(BIT(1)|BIT(0)); /* align 4 */
873 nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
877 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode");
881 nsp_inc_resid(SCpnt, -res);
882 SCpnt->SCp.ptr += res;
883 SCpnt->SCp.this_residual -= res;
886 /* go to next scatter list if available */
887 if (SCpnt->SCp.this_residual == 0 &&
888 SCpnt->SCp.buffers_residual != 0 ) {
889 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
890 SCpnt->SCp.buffers_residual--;
892 SCpnt->SCp.ptr = BUFFER_ADDR;
893 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
898 data->FifoCount = ocount;
901 nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x",
902 scsi_get_resid(SCpnt));
904 nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
905 nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId,
906 scsi_get_resid(SCpnt));
912 * setup synchronous/asynchronous data transfer mode
914 static int nsp_nexus(struct scsi_cmnd *SCpnt)
916 unsigned int base = SCpnt->device->host->io_port;
917 unsigned char target = scmd_id(SCpnt);
918 // unsigned char lun = SCpnt->device->lun;
919 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
920 sync_data *sync = &(data->Sync[target]);
922 //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
924 /* setup synch transfer registers */
925 nsp_index_write(base, SYNCREG, sync->SyncRegister);
926 nsp_index_write(base, ACKWIDTH, sync->AckWidth);
928 if (scsi_get_resid(SCpnt) % 4 != 0 ||
929 scsi_get_resid(SCpnt) <= PAGE_SIZE ) {
930 data->TransferMode = MODE_IO8;
931 } else if (nsp_burst_mode == BURST_MEM32) {
932 data->TransferMode = MODE_MEM32;
933 } else if (nsp_burst_mode == BURST_IO32) {
934 data->TransferMode = MODE_IO32;
936 data->TransferMode = MODE_IO8;
939 /* setup pdma fifo */
940 nsp_setup_fifo(data, TRUE);
942 /* clear ack counter */
944 nsp_index_write(base, POINTERCLR, POINTER_CLEAR |
952 #include "nsp_message.c"
956 static irqreturn_t nspintr(int irq, void *dev_id)
959 unsigned char irq_status, irq_phase, phase;
960 struct scsi_cmnd *tmpSC;
961 unsigned char target, lun;
962 unsigned int *sync_neg;
967 //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
968 //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
970 if ( dev_id != NULL &&
971 ((scsi_info_t *)dev_id)->host != NULL ) {
972 scsi_info_t *info = (scsi_info_t *)dev_id;
974 data = (nsp_hw_data *)info->host->hostdata;
976 nsp_dbg(NSP_DEBUG_INTR, "host data wrong");
980 //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
982 base = data->BaseAddress;
983 //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
988 nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE);
989 irq_status = nsp_read(base, IRQSTATUS);
990 //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
991 if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) {
992 nsp_write(base, IRQCONTROL, 0);
993 //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
998 * Do not read an irq_phase register if no scsi phase interrupt.
999 * Unless, you should lose a scsi phase interrupt.
1001 phase = nsp_index_read(base, SCSIBUSMON);
1002 if((irq_status & IRQSTATUS_SCSI) != 0) {
1003 irq_phase = nsp_index_read(base, IRQPHASESENCE);
1008 //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1011 * timer interrupt handler (scsi vs timer interrupts)
1013 //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1014 if (data->TimerCount != 0) {
1015 //nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1016 nsp_index_write(base, TIMERCOUNT, 0);
1017 nsp_index_write(base, TIMERCOUNT, 0);
1018 data->TimerCount = 0;
1021 if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER &&
1022 data->SelectionTimeOut == 0) {
1023 //nsp_dbg(NSP_DEBUG_INTR, "timer start");
1024 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR);
1028 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR);
1030 if ((irq_status & IRQSTATUS_SCSI) &&
1031 (irq_phase & SCSI_RESET_IRQ)) {
1032 nsp_msg(KERN_ERR, "bus reset (power off?)");
1035 nsp_bus_reset(data);
1037 if(data->CurrentSC != NULL) {
1038 tmpSC = data->CurrentSC;
1039 tmpSC->result = (DID_RESET << 16) |
1040 ((tmpSC->SCp.Message & 0xff) << 8) |
1041 ((tmpSC->SCp.Status & 0xff) << 0);
1042 nsp_scsi_done(tmpSC);
1047 if (data->CurrentSC == NULL) {
1048 nsp_msg(KERN_ERR, "CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen. reset everything", irq_status, phase, irq_phase);
1050 nsp_bus_reset(data);
1054 tmpSC = data->CurrentSC;
1055 target = tmpSC->device->id;
1056 lun = tmpSC->device->lun;
1057 sync_neg = &(data->Sync[target].SyncNegotiation);
1060 * parse hardware SCSI irq reasons register
1062 if (irq_status & IRQSTATUS_SCSI) {
1063 if (irq_phase & RESELECT_IRQ) {
1064 nsp_dbg(NSP_DEBUG_INTR, "reselect");
1065 nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR);
1066 if (nsp_reselected(tmpSC) != FALSE) {
1071 if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) {
1076 //show_phase(tmpSC);
1078 switch(tmpSC->SCp.phase) {
1080 // *sync_neg = SYNC_NOT_YET;
1081 if ((phase & BUSMON_BSY) == 0) {
1082 //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1083 if (data->SelectionTimeOut >= NSP_SELTIMEOUT) {
1084 nsp_dbg(NSP_DEBUG_INTR, "selection time out");
1085 data->SelectionTimeOut = 0;
1086 nsp_index_write(base, SCSIBUSCTRL, 0);
1088 tmpSC->result = DID_TIME_OUT << 16;
1089 nsp_scsi_done(tmpSC);
1093 data->SelectionTimeOut += 1;
1094 nsp_start_timer(tmpSC, 1000/51);
1098 /* attention assert */
1099 //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1100 data->SelectionTimeOut = 0;
1101 tmpSC->SCp.phase = PH_SELECTED;
1102 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
1104 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
1110 //nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1111 // *sync_neg = SYNC_NOT_YET;
1112 if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) {
1114 tmpSC->result = DID_ABORT << 16;
1115 nsp_scsi_done(tmpSC);
1120 if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) {
1129 //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1131 /* normal disconnect */
1132 if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
1133 (irq_phase & LATCHED_BUS_FREE) != 0 ) {
1134 nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1136 //*sync_neg = SYNC_NOT_YET;
1138 if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) { /* all command complete and return status */
1139 tmpSC->result = (DID_OK << 16) |
1140 ((tmpSC->SCp.Message & 0xff) << 8) |
1141 ((tmpSC->SCp.Status & 0xff) << 0);
1142 nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
1143 nsp_scsi_done(tmpSC);
1152 /* check unexpected bus free state */
1154 nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
1156 *sync_neg = SYNC_NG;
1157 tmpSC->result = DID_ERROR << 16;
1158 nsp_scsi_done(tmpSC);
1162 switch (phase & BUSMON_PHASE_MASK) {
1163 case BUSPHASE_COMMAND:
1164 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND");
1165 if ((phase & BUSMON_REQ) == 0) {
1166 nsp_dbg(NSP_DEBUG_INTR, "REQ == 0");
1170 tmpSC->SCp.phase = PH_COMMAND;
1174 /* write scsi command */
1175 nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len);
1176 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER);
1177 for (i = 0; i < tmpSC->cmd_len; i++) {
1178 nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]);
1180 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO);
1183 case BUSPHASE_DATA_OUT:
1184 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
1186 tmpSC->SCp.phase = PH_DATA;
1187 tmpSC->SCp.have_data_in = IO_OUT;
1189 nsp_pio_write(tmpSC);
1193 case BUSPHASE_DATA_IN:
1194 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
1196 tmpSC->SCp.phase = PH_DATA;
1197 tmpSC->SCp.have_data_in = IO_IN;
1199 nsp_pio_read(tmpSC);
1203 case BUSPHASE_STATUS:
1204 nsp_dataphase_bypass(tmpSC);
1205 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
1207 tmpSC->SCp.phase = PH_STATUS;
1209 tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
1210 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
1214 case BUSPHASE_MESSAGE_OUT:
1215 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT");
1216 if ((phase & BUSMON_REQ) == 0) {
1220 tmpSC->SCp.phase = PH_MSG_OUT;
1222 //*sync_neg = SYNC_NOT_YET;
1224 data->MsgLen = i = 0;
1225 data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++;
1227 if (*sync_neg == SYNC_NOT_YET) {
1228 data->Sync[target].SyncPeriod = 0;
1229 data->Sync[target].SyncOffset = 0;
1232 data->MsgBuffer[i] = MSG_EXTENDED; i++;
1233 data->MsgBuffer[i] = 3; i++;
1234 data->MsgBuffer[i] = MSG_EXT_SDTR; i++;
1235 data->MsgBuffer[i] = 0x0c; i++;
1236 data->MsgBuffer[i] = 15; i++;
1241 nsp_analyze_sdtr(tmpSC);
1243 nsp_message_out(tmpSC);
1246 case BUSPHASE_MESSAGE_IN:
1247 nsp_dataphase_bypass(tmpSC);
1248 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN");
1249 if ((phase & BUSMON_REQ) == 0) {
1253 tmpSC->SCp.phase = PH_MSG_IN;
1254 nsp_message_in(tmpSC);
1257 if (*sync_neg == SYNC_NOT_YET) {
1258 //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1260 if (data->MsgLen >= 5 &&
1261 data->MsgBuffer[0] == MSG_EXTENDED &&
1262 data->MsgBuffer[1] == 3 &&
1263 data->MsgBuffer[2] == MSG_EXT_SDTR ) {
1264 data->Sync[target].SyncPeriod = data->MsgBuffer[3];
1265 data->Sync[target].SyncOffset = data->MsgBuffer[4];
1266 //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1267 *sync_neg = SYNC_OK;
1269 data->Sync[target].SyncPeriod = 0;
1270 data->Sync[target].SyncOffset = 0;
1271 *sync_neg = SYNC_NG;
1273 nsp_analyze_sdtr(tmpSC);
1277 /* search last messeage byte */
1279 for (i = 0; i < data->MsgLen; i++) {
1280 tmp = data->MsgBuffer[i];
1281 if (data->MsgBuffer[i] == MSG_EXTENDED) {
1282 i += (1 + data->MsgBuffer[i+1]);
1285 tmpSC->SCp.Message = tmp;
1287 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
1292 case BUSPHASE_SELECT:
1294 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other");
1299 //nsp_dbg(NSP_DEBUG_INTR, "out");
1303 nsp_start_timer(tmpSC, 1000/102);
1308 #include "nsp_debug.c"
1309 #endif /* NSP_DEBUG */
1311 /*----------------------------------------------------------------*/
1312 /* look for ninja3 card and init if found */
1313 /*----------------------------------------------------------------*/
1314 static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
1316 struct Scsi_Host *host; /* registered host structure */
1317 nsp_hw_data *data_b = &nsp_data_base, *data;
1319 nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
1320 host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
1322 nsp_dbg(NSP_DEBUG_INIT, "host failed");
1326 memcpy(host->hostdata, data_b, sizeof(nsp_hw_data));
1327 data = (nsp_hw_data *)host->hostdata;
1328 data->ScsiInfo->host = host;
1333 nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber);
1335 host->unique_id = data->BaseAddress;
1336 host->io_port = data->BaseAddress;
1337 host->n_io_port = data->NumAddress;
1338 host->irq = data->IrqNumber;
1339 host->base = data->MmioAddress;
1341 spin_lock_init(&(data->Lock));
1343 snprintf(data->nspinfo,
1344 sizeof(data->nspinfo),
1345 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1346 host->io_port, host->io_port + host->n_io_port - 1,
1349 sht->name = data->nspinfo;
1351 nsp_dbg(NSP_DEBUG_INIT, "end");
1354 return host; /* detect done. */
1357 /*----------------------------------------------------------------*/
1358 /* return info string */
1359 /*----------------------------------------------------------------*/
1360 static const char *nsp_info(struct Scsi_Host *shpnt)
1362 nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
1364 return data->nspinfo;
1368 #define SPRINTF(args...) \
1370 if(length > (pos - buffer)) { \
1371 pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1372 nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\
1376 static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1377 off_t offset, int length, int inout)
1383 unsigned long flags;
1391 hostno = host->host_no;
1392 data = (nsp_hw_data *)host->hostdata;
1395 SPRINTF("NinjaSCSI status\n\n");
1396 SPRINTF("Driver version: $Revision: 1.23 $\n");
1397 SPRINTF("SCSI host No.: %d\n", hostno);
1398 SPRINTF("IRQ: %d\n", host->irq);
1399 SPRINTF("IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1);
1400 SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1);
1401 SPRINTF("sg_tablesize: %d\n", host->sg_tablesize);
1403 SPRINTF("burst transfer mode: ");
1404 switch (nsp_burst_mode) {
1421 spin_lock_irqsave(&(data->Lock), flags);
1422 SPRINTF("CurrentSC: 0x%p\n\n", data->CurrentSC);
1423 spin_unlock_irqrestore(&(data->Lock), flags);
1425 SPRINTF("SDTR status\n");
1426 for(id = 0; id < ARRAY_SIZE(data->Sync); id++) {
1428 SPRINTF("id %d: ", id);
1430 if (id == host->this_id) {
1431 SPRINTF("----- NinjaSCSI-3 host adapter\n");
1435 switch(data->Sync[id].SyncNegotiation) {
1450 if (data->Sync[id].SyncPeriod != 0) {
1451 speed = 1000000 / (data->Sync[id].SyncPeriod * 4);
1453 SPRINTF(" transfer %d.%dMB/s, offset %d",
1456 data->Sync[id].SyncOffset
1462 thislength = pos - (buffer + offset);
1464 if(thislength < 0) {
1470 thislength = min(thislength, length);
1471 *start = buffer + offset;
1477 /*---------------------------------------------------------------*/
1479 /*---------------------------------------------------------------*/
1482 static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1484 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1486 return nsp_eh_bus_reset(SCpnt);
1489 static int nsp_bus_reset(nsp_hw_data *data)
1491 unsigned int base = data->BaseAddress;
1494 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK);
1496 nsp_index_write(base, SCSIBUSCTRL, SCSI_RST);
1497 mdelay(100); /* 100ms */
1498 nsp_index_write(base, SCSIBUSCTRL, 0);
1499 for(i = 0; i < 5; i++) {
1500 nsp_index_read(base, IRQPHASESENCE); /* dummy read */
1503 nsphw_init_sync(data);
1505 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR);
1510 static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt)
1512 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1514 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1516 return nsp_bus_reset(data);
1519 static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt)
1521 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
1523 nsp_dbg(NSP_DEBUG_BUSRESET, "in");
1531 /**********************************************************************
1533 **********************************************************************/
1535 /*======================================================================
1536 nsp_cs_attach() creates an "instance" of the driver, allocating
1537 local data structures for one device. The device is registered
1540 The dev_link structure is initialized, but we don't actually
1541 configure the card at this point -- we wait until we receive a
1542 card insertion event.
1543 ======================================================================*/
1544 static int nsp_cs_probe(struct pcmcia_device *link)
1547 nsp_hw_data *data = &nsp_data_base;
1550 nsp_dbg(NSP_DEBUG_INIT, "in");
1552 /* Create new SCSI device */
1553 info = kzalloc(sizeof(*info), GFP_KERNEL);
1554 if (info == NULL) { return -ENOMEM; }
1557 data->ScsiInfo = info;
1559 nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
1561 /* The io structure describes IO port mapping */
1562 link->io.NumPorts1 = 0x10;
1563 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1564 link->io.IOAddrLines = 10; /* not used */
1566 /* Interrupt setup */
1567 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
1568 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
1570 /* Interrupt handler */
1571 link->irq.Handler = &nspintr;
1572 link->irq.Instance = info;
1573 link->irq.Attributes |= IRQF_SHARED;
1575 /* General socket configuration */
1576 link->conf.Attributes = CONF_ENABLE_IRQ;
1577 link->conf.IntType = INT_MEMORY_AND_IO;
1579 ret = nsp_cs_config(link);
1581 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1583 } /* nsp_cs_attach */
1586 /*======================================================================
1587 This deletes a driver "instance". The device is de-registered
1588 with Card Services. If it has been released, all local data
1589 structures are freed. Otherwise, the structures will be freed
1590 when the device is released.
1591 ======================================================================*/
1592 static void nsp_cs_detach(struct pcmcia_device *link)
1594 nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link);
1596 ((scsi_info_t *)link->priv)->stop = 1;
1597 nsp_cs_release(link);
1601 } /* nsp_cs_detach */
1604 /*======================================================================
1605 nsp_cs_config() is scheduled to run after a CARD_INSERTION event
1606 is received, to configure the PCMCIA socket, and to make the
1607 ethernet device available to the system.
1608 ======================================================================*/
1609 #define CS_CHECK(fn, ret) \
1610 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
1611 /*====================================================================*/
1612 static int nsp_cs_config(struct pcmcia_device *link)
1615 scsi_info_t *info = link->priv;
1618 int last_ret, last_fn;
1619 unsigned char tuple_data[64];
1623 cistpl_cftable_entry_t dflt = { 0 };
1624 struct Scsi_Host *host;
1625 nsp_hw_data *data = &nsp_data_base;
1627 nsp_dbg(NSP_DEBUG_INIT, "in");
1629 tuple.Attributes = 0;
1630 tuple.TupleData = tuple_data;
1631 tuple.TupleDataMax = sizeof(tuple_data);
1632 tuple.TupleOffset = 0;
1634 /* Look up the current Vcc */
1635 CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &conf));
1637 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
1638 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
1640 cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
1642 if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
1643 pcmcia_parse_tuple(link, &tuple, &parse) != 0)
1646 if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; }
1647 if (cfg->index == 0) { goto next_entry; }
1648 link->conf.ConfigIndex = cfg->index;
1650 /* Does this card need audio output? */
1651 if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
1652 link->conf.Attributes |= CONF_ENABLE_SPKR;
1653 link->conf.Status = CCSR_AUDIO_ENA;
1656 /* Use power settings for Vcc and Vpp if present */
1657 /* Note that the CIS values need to be rescaled */
1658 if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
1659 if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000) {
1662 } else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {
1663 if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM]/10000) {
1668 if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1670 cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
1671 } else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) {
1673 dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
1676 /* Do we need to allocate an interrupt? */
1677 if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) {
1678 link->conf.Attributes |= CONF_ENABLE_IRQ;
1681 /* IO window settings */
1682 link->io.NumPorts1 = link->io.NumPorts2 = 0;
1683 if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
1684 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
1685 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1686 if (!(io->flags & CISTPL_IO_8BIT))
1687 link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
1688 if (!(io->flags & CISTPL_IO_16BIT))
1689 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
1690 link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
1691 link->io.BasePort1 = io->win[0].base;
1692 link->io.NumPorts1 = io->win[0].len;
1694 link->io.Attributes2 = link->io.Attributes1;
1695 link->io.BasePort2 = io->win[1].base;
1696 link->io.NumPorts2 = io->win[1].len;
1698 /* This reserves IO space but doesn't actually enable it */
1699 if (pcmcia_request_io(link, &link->io) != 0)
1703 if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
1705 (cfg->mem.nwin) ? &cfg->mem : &dflt.mem;
1706 req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
1707 req.Attributes |= WIN_ENABLE;
1708 req.Base = mem->win[0].host_addr;
1709 req.Size = mem->win[0].len;
1710 if (req.Size < 0x1000) {
1713 req.AccessSpeed = 0;
1714 if (pcmcia_request_window(&link, &req, &link->win) != 0)
1716 map.Page = 0; map.CardOffset = mem->win[0].card_addr;
1717 if (pcmcia_map_mem_page(link->win, &map) != 0)
1720 data->MmioAddress = (unsigned long)ioremap_nocache(req.Base, req.Size);
1721 data->MmioLength = req.Size;
1723 /* If we got this far, we're cool! */
1727 nsp_dbg(NSP_DEBUG_INIT, "next");
1728 pcmcia_disable_device(link);
1729 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
1732 if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1733 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
1735 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
1738 if (link->io.BasePort1) {
1739 release_region(link->io.BasePort1, link->io.NumPorts1);
1741 if (link->io.BasePort2) {
1742 release_region(link->io.BasePort2, link->io.NumPorts2);
1746 /* Set port and IRQ */
1747 data->BaseAddress = link->io.BasePort1;
1748 data->NumAddress = link->io.NumPorts1;
1749 data->IrqNumber = link->irq.AssignedIRQ;
1751 nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
1752 data->BaseAddress, data->NumAddress, data->IrqNumber);
1754 if(nsphw_init(data) == FALSE) {
1758 host = nsp_detect(&nsp_driver_template);
1761 nsp_dbg(NSP_DEBUG_INIT, "detect failed");
1766 ret = scsi_add_host (host, NULL);
1770 scsi_scan_host(host);
1772 snprintf(info->node.dev_name, sizeof(info->node.dev_name), "scsi%d", host->host_no);
1773 link->dev_node = &info->node;
1776 /* Finally, report what we've done */
1777 printk(KERN_INFO "nsp_cs: index 0x%02x: ",
1778 link->conf.ConfigIndex);
1779 if (link->conf.Vpp) {
1780 printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
1782 if (link->conf.Attributes & CONF_ENABLE_IRQ) {
1783 printk(", irq %d", link->irq.AssignedIRQ);
1785 if (link->io.NumPorts1) {
1786 printk(", io 0x%04x-0x%04x", link->io.BasePort1,
1787 link->io.BasePort1+link->io.NumPorts1-1);
1789 if (link->io.NumPorts2)
1790 printk(" & 0x%04x-0x%04x", link->io.BasePort2,
1791 link->io.BasePort2+link->io.NumPorts2-1);
1793 printk(", mem 0x%06lx-0x%06lx", req.Base,
1794 req.Base+req.Size-1);
1800 nsp_dbg(NSP_DEBUG_INIT, "config fail");
1801 cs_error(link, last_fn, last_ret);
1802 nsp_cs_release(link);
1805 } /* nsp_cs_config */
1809 /*======================================================================
1810 After a card is removed, nsp_cs_release() will unregister the net
1811 device, and release the PCMCIA configuration. If the device is
1812 still open, this will be postponed until it is closed.
1813 ======================================================================*/
1814 static void nsp_cs_release(struct pcmcia_device *link)
1816 scsi_info_t *info = link->priv;
1817 nsp_hw_data *data = NULL;
1819 if (info->host == NULL) {
1820 nsp_msg(KERN_DEBUG, "unexpected card release call.");
1822 data = (nsp_hw_data *)info->host->hostdata;
1825 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
1827 /* Unlink the device chain */
1828 if (info->host != NULL) {
1829 scsi_remove_host(info->host);
1831 link->dev_node = NULL;
1835 iounmap((void *)(data->MmioAddress));
1838 pcmcia_disable_device(link);
1840 if (info->host != NULL) {
1841 scsi_host_put(info->host);
1843 } /* nsp_cs_release */
1845 static int nsp_cs_suspend(struct pcmcia_device *link)
1847 scsi_info_t *info = link->priv;
1850 nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
1852 if (info->host != NULL) {
1853 nsp_msg(KERN_INFO, "clear SDTR status");
1855 data = (nsp_hw_data *)info->host->hostdata;
1857 nsphw_init_sync(data);
1865 static int nsp_cs_resume(struct pcmcia_device *link)
1867 scsi_info_t *info = link->priv;
1870 nsp_dbg(NSP_DEBUG_INIT, "event: resume");
1874 if (info->host != NULL) {
1875 nsp_msg(KERN_INFO, "reset host and bus");
1877 data = (nsp_hw_data *)info->host->hostdata;
1880 nsp_bus_reset(data);
1886 /*======================================================================*
1887 * module entry point
1888 *====================================================================*/
1889 static struct pcmcia_device_id nsp_cs_ids[] = {
1890 PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16 ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
1891 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
1892 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
1893 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
1894 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
1895 PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
1896 PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
1899 MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids);
1901 static struct pcmcia_driver nsp_driver = {
1902 .owner = THIS_MODULE,
1906 .probe = nsp_cs_probe,
1907 .remove = nsp_cs_detach,
1908 .id_table = nsp_cs_ids,
1909 .suspend = nsp_cs_suspend,
1910 .resume = nsp_cs_resume,
1913 static int __init nsp_cs_init(void)
1915 nsp_msg(KERN_INFO, "loading...");
1917 return pcmcia_register_driver(&nsp_driver);
1920 static void __exit nsp_cs_exit(void)
1922 nsp_msg(KERN_INFO, "unloading...");
1923 pcmcia_unregister_driver(&nsp_driver);
1927 module_init(nsp_cs_init)
1928 module_exit(nsp_cs_exit)