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.h>
51 #include <pcmcia/cistpl.h>
52 #include <pcmcia/cisreg.h>
53 #include <pcmcia/ds.h>
57 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
58 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
59 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
61 MODULE_LICENSE("GPL");
66 /*====================================================================*/
67 /* Parameters that can be set with 'insmod' */
69 static int nsp_burst_mode
= BURST_MEM32
;
70 module_param(nsp_burst_mode
, int, 0);
71 MODULE_PARM_DESC(nsp_burst_mode
, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
73 /* Release IO ports after configuration? */
74 static int free_ports
= 0;
75 module_param(free_ports
, bool, 0);
76 MODULE_PARM_DESC(free_ports
, "Release IO ports after configuration? (default: 0 (=no))");
78 static struct scsi_host_template nsp_driver_template
= {
79 .proc_name
= "nsp_cs",
80 .proc_info
= nsp_proc_info
,
81 .name
= "WorkBit NinjaSCSI-3/32Bi(16bit)",
83 .queuecommand
= nsp_queuecommand
,
84 /* .eh_abort_handler = nsp_eh_abort,*/
85 .eh_bus_reset_handler
= nsp_eh_bus_reset
,
86 .eh_host_reset_handler
= nsp_eh_host_reset
,
88 .this_id
= NSP_INITIATOR_ID
,
89 .sg_tablesize
= SG_ALL
,
91 .use_clustering
= DISABLE_CLUSTERING
,
94 static nsp_hw_data nsp_data_base
; /* attach <-> detect glue */
102 # define NSP_DEBUG_MASK 0x000000
103 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
104 # define nsp_dbg(mask, args...) /* */
106 # define NSP_DEBUG_MASK 0xffffff
107 # define nsp_msg(type, args...) \
108 nsp_cs_message (__func__, __LINE__, (type), args)
109 # define nsp_dbg(mask, args...) \
110 nsp_cs_dmessage(__func__, __LINE__, (mask), args)
113 #define NSP_DEBUG_QUEUECOMMAND BIT(0)
114 #define NSP_DEBUG_REGISTER BIT(1)
115 #define NSP_DEBUG_AUTOSCSI BIT(2)
116 #define NSP_DEBUG_INTR BIT(3)
117 #define NSP_DEBUG_SGLIST BIT(4)
118 #define NSP_DEBUG_BUSFREE BIT(5)
119 #define NSP_DEBUG_CDB_CONTENTS BIT(6)
120 #define NSP_DEBUG_RESELECTION BIT(7)
121 #define NSP_DEBUG_MSGINOCCUR BIT(8)
122 #define NSP_DEBUG_EEPROM BIT(9)
123 #define NSP_DEBUG_MSGOUTOCCUR BIT(10)
124 #define NSP_DEBUG_BUSRESET BIT(11)
125 #define NSP_DEBUG_RESTART BIT(12)
126 #define NSP_DEBUG_SYNC BIT(13)
127 #define NSP_DEBUG_WAIT BIT(14)
128 #define NSP_DEBUG_TARGETFLAG BIT(15)
129 #define NSP_DEBUG_PROC BIT(16)
130 #define NSP_DEBUG_INIT BIT(17)
131 #define NSP_DEBUG_DATA_IO BIT(18)
132 #define NSP_SPECIAL_PRINT_REGISTER BIT(20)
134 #define NSP_DEBUG_BUF_LEN 150
136 static inline void nsp_inc_resid(struct scsi_cmnd
*SCpnt
, int residInc
)
138 scsi_set_resid(SCpnt
, scsi_get_resid(SCpnt
) + residInc
);
141 static void nsp_cs_message(const char *func
, int line
, char *type
, char *fmt
, ...)
144 char buf
[NSP_DEBUG_BUF_LEN
];
147 vsnprintf(buf
, sizeof(buf
), fmt
, args
);
151 printk("%snsp_cs: %s\n", type
, buf
);
153 printk("%snsp_cs: %s (%d): %s\n", type
, func
, line
, buf
);
158 static void nsp_cs_dmessage(const char *func
, int line
, int mask
, char *fmt
, ...)
161 char buf
[NSP_DEBUG_BUF_LEN
];
164 vsnprintf(buf
, sizeof(buf
), fmt
, args
);
167 if (mask
& NSP_DEBUG_MASK
) {
168 printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask
, func
, line
, buf
);
173 /***********************************************************/
175 /*====================================================
176 * Clenaup parameters and call done() functions.
177 * You must be set SCpnt->result before call this function.
179 static void nsp_scsi_done(struct scsi_cmnd
*SCpnt
)
181 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
183 data
->CurrentSC
= NULL
;
185 SCpnt
->scsi_done(SCpnt
);
188 static int nsp_queuecommand(struct scsi_cmnd
*SCpnt
,
189 void (*done
)(struct scsi_cmnd
*))
192 /*unsigned int host_id = SCpnt->device->host->this_id;*/
193 /*unsigned int base = SCpnt->device->host->io_port;*/
194 unsigned char target
= scmd_id(SCpnt
);
196 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
198 nsp_dbg(NSP_DEBUG_QUEUECOMMAND
,
199 "SCpnt=0x%p target=%d lun=%d sglist=0x%p bufflen=%d sg_count=%d",
200 SCpnt
, target
, SCpnt
->device
->lun
, scsi_sglist(SCpnt
),
201 scsi_bufflen(SCpnt
), scsi_sg_count(SCpnt
));
202 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
204 SCpnt
->scsi_done
= done
;
206 if (data
->CurrentSC
!= NULL
) {
207 nsp_msg(KERN_DEBUG
, "CurrentSC!=NULL this can't be happen");
208 SCpnt
->result
= DID_BAD_TARGET
<< 16;
209 nsp_scsi_done(SCpnt
);
214 /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
215 This makes kernel crash when suspending... */
216 if (data
->ScsiInfo
->stop
!= 0) {
217 nsp_msg(KERN_INFO
, "suspending device. reject command.");
218 SCpnt
->result
= DID_BAD_TARGET
<< 16;
219 nsp_scsi_done(SCpnt
);
220 return SCSI_MLQUEUE_HOST_BUSY
;
226 data
->CurrentSC
= SCpnt
;
228 SCpnt
->SCp
.Status
= CHECK_CONDITION
;
229 SCpnt
->SCp
.Message
= 0;
230 SCpnt
->SCp
.have_data_in
= IO_UNKNOWN
;
231 SCpnt
->SCp
.sent_command
= 0;
232 SCpnt
->SCp
.phase
= PH_UNDETERMINED
;
233 scsi_set_resid(SCpnt
, scsi_bufflen(SCpnt
));
235 /* setup scratch area
236 SCp.ptr : buffer pointer
237 SCp.this_residual : buffer length
238 SCp.buffer : next buffer
239 SCp.buffers_residual : left buffers in list
240 SCp.phase : current state of the command */
241 if (scsi_bufflen(SCpnt
)) {
242 SCpnt
->SCp
.buffer
= scsi_sglist(SCpnt
);
243 SCpnt
->SCp
.ptr
= BUFFER_ADDR
;
244 SCpnt
->SCp
.this_residual
= SCpnt
->SCp
.buffer
->length
;
245 SCpnt
->SCp
.buffers_residual
= scsi_sg_count(SCpnt
) - 1;
247 SCpnt
->SCp
.ptr
= NULL
;
248 SCpnt
->SCp
.this_residual
= 0;
249 SCpnt
->SCp
.buffer
= NULL
;
250 SCpnt
->SCp
.buffers_residual
= 0;
253 if (nsphw_start_selection(SCpnt
) == FALSE
) {
254 nsp_dbg(NSP_DEBUG_QUEUECOMMAND
, "selection fail");
255 SCpnt
->result
= DID_BUS_BUSY
<< 16;
256 nsp_scsi_done(SCpnt
);
261 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
269 * setup PIO FIFO transfer mode and enable/disable to data out
271 static void nsp_setup_fifo(nsp_hw_data
*data
, int enabled
)
273 unsigned int base
= data
->BaseAddress
;
274 unsigned char transfer_mode_reg
;
276 //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
278 if (enabled
!= FALSE
) {
279 transfer_mode_reg
= TRANSFER_GO
| BRAIND
;
281 transfer_mode_reg
= 0;
284 transfer_mode_reg
|= data
->TransferMode
;
286 nsp_index_write(base
, TRANSFERMODE
, transfer_mode_reg
);
289 static void nsphw_init_sync(nsp_hw_data
*data
)
291 sync_data tmp_sync
= { .SyncNegotiation
= SYNC_NOT_YET
,
297 /* setup sync data */
298 for ( i
= 0; i
< ARRAY_SIZE(data
->Sync
); i
++ ) {
299 data
->Sync
[i
] = tmp_sync
;
304 * Initialize Ninja hardware
306 static int nsphw_init(nsp_hw_data
*data
)
308 unsigned int base
= data
->BaseAddress
;
310 nsp_dbg(NSP_DEBUG_INIT
, "in base=0x%x", base
);
312 data
->ScsiClockDiv
= CLOCK_40M
| FAST_20
;
313 data
->CurrentSC
= NULL
;
315 data
->TransferMode
= MODE_IO8
;
317 nsphw_init_sync(data
);
319 /* block all interrupts */
320 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLMASK
);
322 /* setup SCSI interface */
323 nsp_write(base
, IFSELECT
, IF_IFSEL
);
325 nsp_index_write(base
, SCSIIRQMODE
, 0);
327 nsp_index_write(base
, TRANSFERMODE
, MODE_IO8
);
328 nsp_index_write(base
, CLOCKDIV
, data
->ScsiClockDiv
);
330 nsp_index_write(base
, PARITYCTRL
, 0);
331 nsp_index_write(base
, POINTERCLR
, POINTER_CLEAR
|
336 /* setup fifo asic */
337 nsp_write(base
, IFSELECT
, IF_REGSEL
);
338 nsp_index_write(base
, TERMPWRCTRL
, 0);
339 if ((nsp_index_read(base
, OTHERCONTROL
) & TPWR_SENSE
) == 0) {
340 nsp_msg(KERN_INFO
, "terminator power on");
341 nsp_index_write(base
, TERMPWRCTRL
, POWER_ON
);
344 nsp_index_write(base
, TIMERCOUNT
, 0);
345 nsp_index_write(base
, TIMERCOUNT
, 0); /* requires 2 times!! */
347 nsp_index_write(base
, SYNCREG
, 0);
348 nsp_index_write(base
, ACKWIDTH
, 0);
350 /* enable interrupts and ack them */
351 nsp_index_write(base
, SCSIIRQMODE
, SCSI_PHASE_CHANGE_EI
|
354 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLCLEAR
);
356 nsp_setup_fifo(data
, FALSE
);
362 * Start selection phase
364 static int nsphw_start_selection(struct scsi_cmnd
*SCpnt
)
366 unsigned int host_id
= SCpnt
->device
->host
->this_id
;
367 unsigned int base
= SCpnt
->device
->host
->io_port
;
368 unsigned char target
= scmd_id(SCpnt
);
369 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
371 unsigned char phase
, arbit
;
373 //nsp_dbg(NSP_DEBUG_RESELECTION, "in");
375 phase
= nsp_index_read(base
, SCSIBUSMON
);
376 if(phase
!= BUSMON_BUS_FREE
) {
377 //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
381 /* start arbitration */
382 //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
383 SCpnt
->SCp
.phase
= PH_ARBSTART
;
384 nsp_index_write(base
, SETARBIT
, ARBIT_GO
);
388 /* XXX: what a stupid chip! */
389 arbit
= nsp_index_read(base
, ARBITSTATUS
);
390 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
391 udelay(1); /* hold 1.2us */
392 } while((arbit
& (ARBIT_WIN
| ARBIT_FAIL
)) == 0 &&
395 if (!(arbit
& ARBIT_WIN
)) {
396 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
397 nsp_index_write(base
, SETARBIT
, ARBIT_FLAG_CLEAR
);
401 /* assert select line */
402 //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
403 SCpnt
->SCp
.phase
= PH_SELSTART
;
404 udelay(3); /* wait 2.4us */
405 nsp_index_write(base
, SCSIDATALATCH
, BIT(host_id
) | BIT(target
));
406 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_SEL
| SCSI_BSY
| SCSI_ATN
);
407 udelay(2); /* wait >1.2us */
408 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_SEL
| SCSI_BSY
| SCSI_DATAOUT_ENB
| SCSI_ATN
);
409 nsp_index_write(base
, SETARBIT
, ARBIT_FLAG_CLEAR
);
410 /*udelay(1);*/ /* wait >90ns */
411 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_SEL
| SCSI_DATAOUT_ENB
| SCSI_ATN
);
413 /* check selection timeout */
414 nsp_start_timer(SCpnt
, 1000/51);
415 data
->SelectionTimeOut
= 1;
420 struct nsp_sync_table
{
421 unsigned int min_period
;
422 unsigned int max_period
;
423 unsigned int chip_period
;
424 unsigned int ack_width
;
427 static struct nsp_sync_table nsp_sync_table_40M
[] = {
428 {0x0c, 0x0c, 0x1, 0}, /* 20MB 50ns*/
429 {0x19, 0x19, 0x3, 1}, /* 10MB 100ns*/
430 {0x1a, 0x25, 0x5, 2}, /* 7.5MB 150ns*/
431 {0x26, 0x32, 0x7, 3}, /* 5MB 200ns*/
435 static struct nsp_sync_table nsp_sync_table_20M
[] = {
436 {0x19, 0x19, 0x1, 0}, /* 10MB 100ns*/
437 {0x1a, 0x25, 0x2, 0}, /* 7.5MB 150ns*/
438 {0x26, 0x32, 0x3, 1}, /* 5MB 200ns*/
443 * setup synchronous data transfer mode
445 static int nsp_analyze_sdtr(struct scsi_cmnd
*SCpnt
)
447 unsigned char target
= scmd_id(SCpnt
);
448 // unsigned char lun = SCpnt->device->lun;
449 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
450 sync_data
*sync
= &(data
->Sync
[target
]);
451 struct nsp_sync_table
*sync_table
;
452 unsigned int period
, offset
;
456 nsp_dbg(NSP_DEBUG_SYNC
, "in");
458 period
= sync
->SyncPeriod
;
459 offset
= sync
->SyncOffset
;
461 nsp_dbg(NSP_DEBUG_SYNC
, "period=0x%x, offset=0x%x", period
, offset
);
463 if ((data
->ScsiClockDiv
& (BIT(0)|BIT(1))) == CLOCK_20M
) {
464 sync_table
= nsp_sync_table_20M
;
466 sync_table
= nsp_sync_table_40M
;
469 for ( i
= 0; sync_table
->max_period
!= 0; i
++, sync_table
++) {
470 if ( period
>= sync_table
->min_period
&&
471 period
<= sync_table
->max_period
) {
476 if (period
!= 0 && sync_table
->max_period
== 0) {
478 * No proper period/offset found
480 nsp_dbg(NSP_DEBUG_SYNC
, "no proper period/offset");
482 sync
->SyncPeriod
= 0;
483 sync
->SyncOffset
= 0;
484 sync
->SyncRegister
= 0;
490 sync
->SyncRegister
= (sync_table
->chip_period
<< SYNCREG_PERIOD_SHIFT
) |
491 (offset
& SYNCREG_OFFSET_MASK
);
492 sync
->AckWidth
= sync_table
->ack_width
;
494 nsp_dbg(NSP_DEBUG_SYNC
, "sync_reg=0x%x, ack_width=0x%x", sync
->SyncRegister
, sync
->AckWidth
);
501 * start ninja hardware timer
503 static void nsp_start_timer(struct scsi_cmnd
*SCpnt
, int time
)
505 unsigned int base
= SCpnt
->device
->host
->io_port
;
506 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
508 //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
509 data
->TimerCount
= time
;
510 nsp_index_write(base
, TIMERCOUNT
, time
);
514 * wait for bus phase change
516 static int nsp_negate_signal(struct scsi_cmnd
*SCpnt
, unsigned char mask
,
519 unsigned int base
= SCpnt
->device
->host
->io_port
;
523 //nsp_dbg(NSP_DEBUG_INTR, "in");
528 reg
= nsp_index_read(base
, SCSIBUSMON
);
532 } while ((--time_out
!= 0) && (reg
& mask
) != 0);
535 nsp_msg(KERN_DEBUG
, " %s signal off timeut", str
);
544 static int nsp_expect_signal(struct scsi_cmnd
*SCpnt
,
545 unsigned char current_phase
,
548 unsigned int base
= SCpnt
->device
->host
->io_port
;
550 unsigned char phase
, i_src
;
552 //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
556 phase
= nsp_index_read(base
, SCSIBUSMON
);
558 //nsp_dbg(NSP_DEBUG_INTR, "ret -1");
561 i_src
= nsp_read(base
, IRQSTATUS
);
562 if (i_src
& IRQSTATUS_SCSI
) {
563 //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
566 if ((phase
& mask
) != 0 && (phase
& BUSMON_PHASE_MASK
) == current_phase
) {
567 //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
570 } while(time_out
-- != 0);
572 //nsp_dbg(NSP_DEBUG_INTR, "timeout");
577 * transfer SCSI message
579 static int nsp_xfer(struct scsi_cmnd
*SCpnt
, int phase
)
581 unsigned int base
= SCpnt
->device
->host
->io_port
;
582 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
583 char *buf
= data
->MsgBuffer
;
584 int len
= min(MSGBUF_SIZE
, data
->MsgLen
);
588 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
589 for (ptr
= 0; len
> 0; len
--, ptr
++) {
591 ret
= nsp_expect_signal(SCpnt
, phase
, BUSMON_REQ
);
593 nsp_dbg(NSP_DEBUG_DATA_IO
, "xfer quit");
597 /* if last byte, negate ATN */
598 if (len
== 1 && SCpnt
->SCp
.phase
== PH_MSG_OUT
) {
599 nsp_index_write(base
, SCSIBUSCTRL
, AUTODIRECTION
| ACKENB
);
602 /* read & write message */
603 if (phase
& BUSMON_IO
) {
604 nsp_dbg(NSP_DEBUG_DATA_IO
, "read msg");
605 buf
[ptr
] = nsp_index_read(base
, SCSIDATAWITHACK
);
607 nsp_dbg(NSP_DEBUG_DATA_IO
, "write msg");
608 nsp_index_write(base
, SCSIDATAWITHACK
, buf
[ptr
]);
610 nsp_negate_signal(SCpnt
, BUSMON_ACK
, "xfer<ack>");
617 * get extra SCSI data from fifo
619 static int nsp_dataphase_bypass(struct scsi_cmnd
*SCpnt
)
621 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
624 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
626 if (SCpnt
->SCp
.have_data_in
!= IO_IN
) {
630 count
= nsp_fifo_count(SCpnt
);
631 if (data
->FifoCount
== count
) {
632 //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
638 * data phase skip only occures in case of SCSI_LOW_READ
640 nsp_dbg(NSP_DEBUG_DATA_IO
, "use bypass quirk");
641 SCpnt
->SCp
.phase
= PH_DATA
;
643 nsp_setup_fifo(data
, FALSE
);
651 static int nsp_reselected(struct scsi_cmnd
*SCpnt
)
653 unsigned int base
= SCpnt
->device
->host
->io_port
;
654 unsigned int host_id
= SCpnt
->device
->host
->this_id
;
655 //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
656 unsigned char bus_reg
;
657 unsigned char id_reg
, tmp
;
660 nsp_dbg(NSP_DEBUG_RESELECTION
, "in");
662 id_reg
= nsp_index_read(base
, RESELECTID
);
663 tmp
= id_reg
& (~BIT(host_id
));
673 if (scmd_id(SCpnt
) != target
) {
674 nsp_msg(KERN_ERR
, "XXX: reselect ID must be %d in this implementation.", target
);
677 nsp_negate_signal(SCpnt
, BUSMON_SEL
, "reselect<SEL>");
680 bus_reg
= nsp_index_read(base
, SCSIBUSCTRL
) & ~(SCSI_BSY
| SCSI_ATN
);
681 nsp_index_write(base
, SCSIBUSCTRL
, bus_reg
);
682 nsp_index_write(base
, SCSIBUSCTRL
, bus_reg
| AUTODIRECTION
| ACKENB
);
688 * count how many data transferd
690 static int nsp_fifo_count(struct scsi_cmnd
*SCpnt
)
692 unsigned int base
= SCpnt
->device
->host
->io_port
;
694 unsigned int l
, m
, h
, dummy
;
696 nsp_index_write(base
, POINTERCLR
, POINTER_CLEAR
| ACK_COUNTER
);
698 l
= nsp_index_read(base
, TRANSFERCOUNT
);
699 m
= nsp_index_read(base
, TRANSFERCOUNT
);
700 h
= nsp_index_read(base
, TRANSFERCOUNT
);
701 dummy
= nsp_index_read(base
, TRANSFERCOUNT
); /* required this! */
703 count
= (h
<< 16) | (m
<< 8) | (l
<< 0);
705 //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
711 #define RFIFO_CRIT 64
712 #define WFIFO_CRIT 64
715 * read data in DATA IN phase
717 static void nsp_pio_read(struct scsi_cmnd
*SCpnt
)
719 unsigned int base
= SCpnt
->device
->host
->io_port
;
720 unsigned long mmio_base
= SCpnt
->device
->host
->base
;
721 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
724 unsigned char stat
, fifo_stat
;
726 ocount
= data
->FifoCount
;
728 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",
729 SCpnt
, scsi_get_resid(SCpnt
), ocount
, SCpnt
->SCp
.ptr
,
730 SCpnt
->SCp
.this_residual
, SCpnt
->SCp
.buffer
,
731 SCpnt
->SCp
.buffers_residual
);
735 while ((time_out
-- != 0) &&
736 (SCpnt
->SCp
.this_residual
> 0 || SCpnt
->SCp
.buffers_residual
> 0 ) ) {
738 stat
= nsp_index_read(base
, SCSIBUSMON
);
739 stat
&= BUSMON_PHASE_MASK
;
742 res
= nsp_fifo_count(SCpnt
) - ocount
;
743 //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);
744 if (res
== 0) { /* if some data avilable ? */
745 if (stat
== BUSPHASE_DATA_IN
) { /* phase changed? */
746 //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
749 nsp_dbg(NSP_DEBUG_DATA_IO
, "phase changed stat=0x%x", stat
);
754 fifo_stat
= nsp_read(base
, FIFOSTATUS
);
755 if ((fifo_stat
& FIFOSTATUS_FULL_EMPTY
) == 0 &&
756 stat
== BUSPHASE_DATA_IN
) {
760 res
= min(res
, SCpnt
->SCp
.this_residual
);
762 switch (data
->TransferMode
) {
764 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
765 nsp_fifo32_read(base
, SCpnt
->SCp
.ptr
, res
>> 2);
768 nsp_fifo8_read (base
, SCpnt
->SCp
.ptr
, res
);
772 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
773 nsp_mmio_fifo32_read(mmio_base
, SCpnt
->SCp
.ptr
, res
>> 2);
777 nsp_dbg(NSP_DEBUG_DATA_IO
, "unknown read mode");
781 nsp_inc_resid(SCpnt
, -res
);
782 SCpnt
->SCp
.ptr
+= res
;
783 SCpnt
->SCp
.this_residual
-= res
;
785 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
787 /* go to next scatter list if available */
788 if (SCpnt
->SCp
.this_residual
== 0 &&
789 SCpnt
->SCp
.buffers_residual
!= 0 ) {
790 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
791 SCpnt
->SCp
.buffers_residual
--;
793 SCpnt
->SCp
.ptr
= BUFFER_ADDR
;
794 SCpnt
->SCp
.this_residual
= SCpnt
->SCp
.buffer
->length
;
797 //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
801 data
->FifoCount
= ocount
;
804 nsp_msg(KERN_DEBUG
, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
805 scsi_get_resid(SCpnt
), SCpnt
->SCp
.this_residual
,
806 SCpnt
->SCp
.buffers_residual
);
808 nsp_dbg(NSP_DEBUG_DATA_IO
, "read ocount=0x%x", ocount
);
809 nsp_dbg(NSP_DEBUG_DATA_IO
, "r cmd=%d resid=0x%x\n", data
->CmdId
,
810 scsi_get_resid(SCpnt
));
814 * write data in DATA OUT phase
816 static void nsp_pio_write(struct scsi_cmnd
*SCpnt
)
818 unsigned int base
= SCpnt
->device
->host
->io_port
;
819 unsigned long mmio_base
= SCpnt
->device
->host
->base
;
820 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
825 ocount
= data
->FifoCount
;
827 nsp_dbg(NSP_DEBUG_DATA_IO
, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
828 data
->FifoCount
, SCpnt
->SCp
.ptr
, SCpnt
->SCp
.this_residual
,
829 SCpnt
->SCp
.buffer
, SCpnt
->SCp
.buffers_residual
,
830 scsi_get_resid(SCpnt
));
834 while ((time_out
-- != 0) &&
835 (SCpnt
->SCp
.this_residual
> 0 || SCpnt
->SCp
.buffers_residual
> 0)) {
836 stat
= nsp_index_read(base
, SCSIBUSMON
);
837 stat
&= BUSMON_PHASE_MASK
;
839 if (stat
!= BUSPHASE_DATA_OUT
) {
840 res
= ocount
- nsp_fifo_count(SCpnt
);
842 nsp_dbg(NSP_DEBUG_DATA_IO
, "phase changed stat=0x%x, res=%d\n", stat
, res
);
843 /* Put back pointer */
844 nsp_inc_resid(SCpnt
, res
);
845 SCpnt
->SCp
.ptr
-= res
;
846 SCpnt
->SCp
.this_residual
+= res
;
852 res
= ocount
- nsp_fifo_count(SCpnt
);
853 if (res
> 0) { /* write all data? */
854 nsp_dbg(NSP_DEBUG_DATA_IO
, "wait for all data out. ocount=0x%x res=%d", ocount
, res
);
858 res
= min(SCpnt
->SCp
.this_residual
, WFIFO_CRIT
);
860 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
861 switch (data
->TransferMode
) {
863 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
864 nsp_fifo32_write(base
, SCpnt
->SCp
.ptr
, res
>> 2);
867 nsp_fifo8_write (base
, SCpnt
->SCp
.ptr
, res
);
871 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
872 nsp_mmio_fifo32_write(mmio_base
, SCpnt
->SCp
.ptr
, res
>> 2);
876 nsp_dbg(NSP_DEBUG_DATA_IO
, "unknown write mode");
880 nsp_inc_resid(SCpnt
, -res
);
881 SCpnt
->SCp
.ptr
+= res
;
882 SCpnt
->SCp
.this_residual
-= res
;
885 /* go to next scatter list if available */
886 if (SCpnt
->SCp
.this_residual
== 0 &&
887 SCpnt
->SCp
.buffers_residual
!= 0 ) {
888 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
889 SCpnt
->SCp
.buffers_residual
--;
891 SCpnt
->SCp
.ptr
= BUFFER_ADDR
;
892 SCpnt
->SCp
.this_residual
= SCpnt
->SCp
.buffer
->length
;
897 data
->FifoCount
= ocount
;
900 nsp_msg(KERN_DEBUG
, "pio write timeout resid=0x%x",
901 scsi_get_resid(SCpnt
));
903 nsp_dbg(NSP_DEBUG_DATA_IO
, "write ocount=0x%x", ocount
);
904 nsp_dbg(NSP_DEBUG_DATA_IO
, "w cmd=%d resid=0x%x\n", data
->CmdId
,
905 scsi_get_resid(SCpnt
));
911 * setup synchronous/asynchronous data transfer mode
913 static int nsp_nexus(struct scsi_cmnd
*SCpnt
)
915 unsigned int base
= SCpnt
->device
->host
->io_port
;
916 unsigned char target
= scmd_id(SCpnt
);
917 // unsigned char lun = SCpnt->device->lun;
918 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
919 sync_data
*sync
= &(data
->Sync
[target
]);
921 //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
923 /* setup synch transfer registers */
924 nsp_index_write(base
, SYNCREG
, sync
->SyncRegister
);
925 nsp_index_write(base
, ACKWIDTH
, sync
->AckWidth
);
927 if (scsi_get_resid(SCpnt
) % 4 != 0 ||
928 scsi_get_resid(SCpnt
) <= PAGE_SIZE
) {
929 data
->TransferMode
= MODE_IO8
;
930 } else if (nsp_burst_mode
== BURST_MEM32
) {
931 data
->TransferMode
= MODE_MEM32
;
932 } else if (nsp_burst_mode
== BURST_IO32
) {
933 data
->TransferMode
= MODE_IO32
;
935 data
->TransferMode
= MODE_IO8
;
938 /* setup pdma fifo */
939 nsp_setup_fifo(data
, TRUE
);
941 /* clear ack counter */
943 nsp_index_write(base
, POINTERCLR
, POINTER_CLEAR
|
951 #include "nsp_message.c"
955 static irqreturn_t
nspintr(int irq
, void *dev_id
)
958 unsigned char irq_status
, irq_phase
, phase
;
959 struct scsi_cmnd
*tmpSC
;
960 unsigned char target
, lun
;
961 unsigned int *sync_neg
;
966 //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
967 //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
969 if ( dev_id
!= NULL
&&
970 ((scsi_info_t
*)dev_id
)->host
!= NULL
) {
971 scsi_info_t
*info
= (scsi_info_t
*)dev_id
;
973 data
= (nsp_hw_data
*)info
->host
->hostdata
;
975 nsp_dbg(NSP_DEBUG_INTR
, "host data wrong");
979 //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
981 base
= data
->BaseAddress
;
982 //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
987 nsp_write(base
, IRQCONTROL
, IRQCONTROL_IRQDISABLE
);
988 irq_status
= nsp_read(base
, IRQSTATUS
);
989 //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
990 if ((irq_status
== 0xff) || ((irq_status
& IRQSTATUS_MASK
) == 0)) {
991 nsp_write(base
, IRQCONTROL
, 0);
992 //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
997 * Do not read an irq_phase register if no scsi phase interrupt.
998 * Unless, you should lose a scsi phase interrupt.
1000 phase
= nsp_index_read(base
, SCSIBUSMON
);
1001 if((irq_status
& IRQSTATUS_SCSI
) != 0) {
1002 irq_phase
= nsp_index_read(base
, IRQPHASESENCE
);
1007 //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
1010 * timer interrupt handler (scsi vs timer interrupts)
1012 //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1013 if (data
->TimerCount
!= 0) {
1014 //nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1015 nsp_index_write(base
, TIMERCOUNT
, 0);
1016 nsp_index_write(base
, TIMERCOUNT
, 0);
1017 data
->TimerCount
= 0;
1020 if ((irq_status
& IRQSTATUS_MASK
) == IRQSTATUS_TIMER
&&
1021 data
->SelectionTimeOut
== 0) {
1022 //nsp_dbg(NSP_DEBUG_INTR, "timer start");
1023 nsp_write(base
, IRQCONTROL
, IRQCONTROL_TIMER_CLEAR
);
1027 nsp_write(base
, IRQCONTROL
, IRQCONTROL_TIMER_CLEAR
| IRQCONTROL_FIFO_CLEAR
);
1029 if ((irq_status
& IRQSTATUS_SCSI
) &&
1030 (irq_phase
& SCSI_RESET_IRQ
)) {
1031 nsp_msg(KERN_ERR
, "bus reset (power off?)");
1034 nsp_bus_reset(data
);
1036 if(data
->CurrentSC
!= NULL
) {
1037 tmpSC
= data
->CurrentSC
;
1038 tmpSC
->result
= (DID_RESET
<< 16) |
1039 ((tmpSC
->SCp
.Message
& 0xff) << 8) |
1040 ((tmpSC
->SCp
.Status
& 0xff) << 0);
1041 nsp_scsi_done(tmpSC
);
1046 if (data
->CurrentSC
== NULL
) {
1047 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
);
1049 nsp_bus_reset(data
);
1053 tmpSC
= data
->CurrentSC
;
1054 target
= tmpSC
->device
->id
;
1055 lun
= tmpSC
->device
->lun
;
1056 sync_neg
= &(data
->Sync
[target
].SyncNegotiation
);
1059 * parse hardware SCSI irq reasons register
1061 if (irq_status
& IRQSTATUS_SCSI
) {
1062 if (irq_phase
& RESELECT_IRQ
) {
1063 nsp_dbg(NSP_DEBUG_INTR
, "reselect");
1064 nsp_write(base
, IRQCONTROL
, IRQCONTROL_RESELECT_CLEAR
);
1065 if (nsp_reselected(tmpSC
) != FALSE
) {
1070 if ((irq_phase
& (PHASE_CHANGE_IRQ
| LATCHED_BUS_FREE
)) == 0) {
1075 //show_phase(tmpSC);
1077 switch(tmpSC
->SCp
.phase
) {
1079 // *sync_neg = SYNC_NOT_YET;
1080 if ((phase
& BUSMON_BSY
) == 0) {
1081 //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1082 if (data
->SelectionTimeOut
>= NSP_SELTIMEOUT
) {
1083 nsp_dbg(NSP_DEBUG_INTR
, "selection time out");
1084 data
->SelectionTimeOut
= 0;
1085 nsp_index_write(base
, SCSIBUSCTRL
, 0);
1087 tmpSC
->result
= DID_TIME_OUT
<< 16;
1088 nsp_scsi_done(tmpSC
);
1092 data
->SelectionTimeOut
+= 1;
1093 nsp_start_timer(tmpSC
, 1000/51);
1097 /* attention assert */
1098 //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1099 data
->SelectionTimeOut
= 0;
1100 tmpSC
->SCp
.phase
= PH_SELECTED
;
1101 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_ATN
);
1103 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_ATN
| AUTODIRECTION
| ACKENB
);
1109 //nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1110 // *sync_neg = SYNC_NOT_YET;
1111 if ((phase
& BUSMON_PHASE_MASK
) != BUSPHASE_MESSAGE_IN
) {
1113 tmpSC
->result
= DID_ABORT
<< 16;
1114 nsp_scsi_done(tmpSC
);
1119 if ((irq_status
& (IRQSTATUS_SCSI
| IRQSTATUS_FIFO
)) == 0) {
1128 //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1130 /* normal disconnect */
1131 if (((tmpSC
->SCp
.phase
== PH_MSG_IN
) || (tmpSC
->SCp
.phase
== PH_MSG_OUT
)) &&
1132 (irq_phase
& LATCHED_BUS_FREE
) != 0 ) {
1133 nsp_dbg(NSP_DEBUG_INTR
, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status
, phase
, irq_phase
);
1135 //*sync_neg = SYNC_NOT_YET;
1137 if ((tmpSC
->SCp
.Message
== MSG_COMMAND_COMPLETE
)) { /* all command complete and return status */
1138 tmpSC
->result
= (DID_OK
<< 16) |
1139 ((tmpSC
->SCp
.Message
& 0xff) << 8) |
1140 ((tmpSC
->SCp
.Status
& 0xff) << 0);
1141 nsp_dbg(NSP_DEBUG_INTR
, "command complete result=0x%x", tmpSC
->result
);
1142 nsp_scsi_done(tmpSC
);
1151 /* check unexpected bus free state */
1153 nsp_msg(KERN_DEBUG
, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status
, phase
, irq_phase
);
1155 *sync_neg
= SYNC_NG
;
1156 tmpSC
->result
= DID_ERROR
<< 16;
1157 nsp_scsi_done(tmpSC
);
1161 switch (phase
& BUSMON_PHASE_MASK
) {
1162 case BUSPHASE_COMMAND
:
1163 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_COMMAND");
1164 if ((phase
& BUSMON_REQ
) == 0) {
1165 nsp_dbg(NSP_DEBUG_INTR
, "REQ == 0");
1169 tmpSC
->SCp
.phase
= PH_COMMAND
;
1173 /* write scsi command */
1174 nsp_dbg(NSP_DEBUG_INTR
, "cmd_len=%d", tmpSC
->cmd_len
);
1175 nsp_index_write(base
, COMMANDCTRL
, CLEAR_COMMAND_POINTER
);
1176 for (i
= 0; i
< tmpSC
->cmd_len
; i
++) {
1177 nsp_index_write(base
, COMMANDDATA
, tmpSC
->cmnd
[i
]);
1179 nsp_index_write(base
, COMMANDCTRL
, CLEAR_COMMAND_POINTER
| AUTO_COMMAND_GO
);
1182 case BUSPHASE_DATA_OUT
:
1183 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_DATA_OUT");
1185 tmpSC
->SCp
.phase
= PH_DATA
;
1186 tmpSC
->SCp
.have_data_in
= IO_OUT
;
1188 nsp_pio_write(tmpSC
);
1192 case BUSPHASE_DATA_IN
:
1193 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_DATA_IN");
1195 tmpSC
->SCp
.phase
= PH_DATA
;
1196 tmpSC
->SCp
.have_data_in
= IO_IN
;
1198 nsp_pio_read(tmpSC
);
1202 case BUSPHASE_STATUS
:
1203 nsp_dataphase_bypass(tmpSC
);
1204 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_STATUS");
1206 tmpSC
->SCp
.phase
= PH_STATUS
;
1208 tmpSC
->SCp
.Status
= nsp_index_read(base
, SCSIDATAWITHACK
);
1209 nsp_dbg(NSP_DEBUG_INTR
, "message=0x%x status=0x%x", tmpSC
->SCp
.Message
, tmpSC
->SCp
.Status
);
1213 case BUSPHASE_MESSAGE_OUT
:
1214 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_MESSAGE_OUT");
1215 if ((phase
& BUSMON_REQ
) == 0) {
1219 tmpSC
->SCp
.phase
= PH_MSG_OUT
;
1221 //*sync_neg = SYNC_NOT_YET;
1223 data
->MsgLen
= i
= 0;
1224 data
->MsgBuffer
[i
] = IDENTIFY(TRUE
, lun
); i
++;
1226 if (*sync_neg
== SYNC_NOT_YET
) {
1227 data
->Sync
[target
].SyncPeriod
= 0;
1228 data
->Sync
[target
].SyncOffset
= 0;
1231 data
->MsgBuffer
[i
] = MSG_EXTENDED
; i
++;
1232 data
->MsgBuffer
[i
] = 3; i
++;
1233 data
->MsgBuffer
[i
] = MSG_EXT_SDTR
; i
++;
1234 data
->MsgBuffer
[i
] = 0x0c; i
++;
1235 data
->MsgBuffer
[i
] = 15; i
++;
1240 nsp_analyze_sdtr(tmpSC
);
1242 nsp_message_out(tmpSC
);
1245 case BUSPHASE_MESSAGE_IN
:
1246 nsp_dataphase_bypass(tmpSC
);
1247 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_MESSAGE_IN");
1248 if ((phase
& BUSMON_REQ
) == 0) {
1252 tmpSC
->SCp
.phase
= PH_MSG_IN
;
1253 nsp_message_in(tmpSC
);
1256 if (*sync_neg
== SYNC_NOT_YET
) {
1257 //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1259 if (data
->MsgLen
>= 5 &&
1260 data
->MsgBuffer
[0] == MSG_EXTENDED
&&
1261 data
->MsgBuffer
[1] == 3 &&
1262 data
->MsgBuffer
[2] == MSG_EXT_SDTR
) {
1263 data
->Sync
[target
].SyncPeriod
= data
->MsgBuffer
[3];
1264 data
->Sync
[target
].SyncOffset
= data
->MsgBuffer
[4];
1265 //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1266 *sync_neg
= SYNC_OK
;
1268 data
->Sync
[target
].SyncPeriod
= 0;
1269 data
->Sync
[target
].SyncOffset
= 0;
1270 *sync_neg
= SYNC_NG
;
1272 nsp_analyze_sdtr(tmpSC
);
1276 /* search last messeage byte */
1278 for (i
= 0; i
< data
->MsgLen
; i
++) {
1279 tmp
= data
->MsgBuffer
[i
];
1280 if (data
->MsgBuffer
[i
] == MSG_EXTENDED
) {
1281 i
+= (1 + data
->MsgBuffer
[i
+1]);
1284 tmpSC
->SCp
.Message
= tmp
;
1286 nsp_dbg(NSP_DEBUG_INTR
, "message=0x%x len=%d", tmpSC
->SCp
.Message
, data
->MsgLen
);
1291 case BUSPHASE_SELECT
:
1293 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE other");
1298 //nsp_dbg(NSP_DEBUG_INTR, "out");
1302 nsp_start_timer(tmpSC
, 1000/102);
1307 #include "nsp_debug.c"
1308 #endif /* NSP_DEBUG */
1310 /*----------------------------------------------------------------*/
1311 /* look for ninja3 card and init if found */
1312 /*----------------------------------------------------------------*/
1313 static struct Scsi_Host
*nsp_detect(struct scsi_host_template
*sht
)
1315 struct Scsi_Host
*host
; /* registered host structure */
1316 nsp_hw_data
*data_b
= &nsp_data_base
, *data
;
1318 nsp_dbg(NSP_DEBUG_INIT
, "this_id=%d", sht
->this_id
);
1319 host
= scsi_host_alloc(&nsp_driver_template
, sizeof(nsp_hw_data
));
1321 nsp_dbg(NSP_DEBUG_INIT
, "host failed");
1325 memcpy(host
->hostdata
, data_b
, sizeof(nsp_hw_data
));
1326 data
= (nsp_hw_data
*)host
->hostdata
;
1327 data
->ScsiInfo
->host
= host
;
1332 nsp_dbg(NSP_DEBUG_INIT
, "irq=%d,%d", data_b
->IrqNumber
, ((nsp_hw_data
*)host
->hostdata
)->IrqNumber
);
1334 host
->unique_id
= data
->BaseAddress
;
1335 host
->io_port
= data
->BaseAddress
;
1336 host
->n_io_port
= data
->NumAddress
;
1337 host
->irq
= data
->IrqNumber
;
1338 host
->base
= data
->MmioAddress
;
1340 spin_lock_init(&(data
->Lock
));
1342 snprintf(data
->nspinfo
,
1343 sizeof(data
->nspinfo
),
1344 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1345 host
->io_port
, host
->io_port
+ host
->n_io_port
- 1,
1348 sht
->name
= data
->nspinfo
;
1350 nsp_dbg(NSP_DEBUG_INIT
, "end");
1353 return host
; /* detect done. */
1356 /*----------------------------------------------------------------*/
1357 /* return info string */
1358 /*----------------------------------------------------------------*/
1359 static const char *nsp_info(struct Scsi_Host
*shpnt
)
1361 nsp_hw_data
*data
= (nsp_hw_data
*)shpnt
->hostdata
;
1363 return data
->nspinfo
;
1367 #define SPRINTF(args...) \
1369 if(length > (pos - buffer)) { \
1370 pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1371 nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\
1375 static int nsp_proc_info(struct Scsi_Host
*host
, char *buffer
, char **start
,
1376 off_t offset
, int length
, int inout
)
1382 unsigned long flags
;
1390 hostno
= host
->host_no
;
1391 data
= (nsp_hw_data
*)host
->hostdata
;
1394 SPRINTF("NinjaSCSI status\n\n");
1395 SPRINTF("Driver version: $Revision: 1.23 $\n");
1396 SPRINTF("SCSI host No.: %d\n", hostno
);
1397 SPRINTF("IRQ: %d\n", host
->irq
);
1398 SPRINTF("IO: 0x%lx-0x%lx\n", host
->io_port
, host
->io_port
+ host
->n_io_port
- 1);
1399 SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host
->base
, host
->base
+ data
->MmioLength
- 1);
1400 SPRINTF("sg_tablesize: %d\n", host
->sg_tablesize
);
1402 SPRINTF("burst transfer mode: ");
1403 switch (nsp_burst_mode
) {
1420 spin_lock_irqsave(&(data
->Lock
), flags
);
1421 SPRINTF("CurrentSC: 0x%p\n\n", data
->CurrentSC
);
1422 spin_unlock_irqrestore(&(data
->Lock
), flags
);
1424 SPRINTF("SDTR status\n");
1425 for(id
= 0; id
< ARRAY_SIZE(data
->Sync
); id
++) {
1427 SPRINTF("id %d: ", id
);
1429 if (id
== host
->this_id
) {
1430 SPRINTF("----- NinjaSCSI-3 host adapter\n");
1434 switch(data
->Sync
[id
].SyncNegotiation
) {
1449 if (data
->Sync
[id
].SyncPeriod
!= 0) {
1450 speed
= 1000000 / (data
->Sync
[id
].SyncPeriod
* 4);
1452 SPRINTF(" transfer %d.%dMB/s, offset %d",
1455 data
->Sync
[id
].SyncOffset
1461 thislength
= pos
- (buffer
+ offset
);
1463 if(thislength
< 0) {
1469 thislength
= min(thislength
, length
);
1470 *start
= buffer
+ offset
;
1476 /*---------------------------------------------------------------*/
1478 /*---------------------------------------------------------------*/
1481 static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1483 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1485 return nsp_eh_bus_reset(SCpnt);
1488 static int nsp_bus_reset(nsp_hw_data
*data
)
1490 unsigned int base
= data
->BaseAddress
;
1493 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLMASK
);
1495 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_RST
);
1496 mdelay(100); /* 100ms */
1497 nsp_index_write(base
, SCSIBUSCTRL
, 0);
1498 for(i
= 0; i
< 5; i
++) {
1499 nsp_index_read(base
, IRQPHASESENCE
); /* dummy read */
1502 nsphw_init_sync(data
);
1504 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLCLEAR
);
1509 static int nsp_eh_bus_reset(struct scsi_cmnd
*SCpnt
)
1511 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
1513 nsp_dbg(NSP_DEBUG_BUSRESET
, "SCpnt=0x%p", SCpnt
);
1515 return nsp_bus_reset(data
);
1518 static int nsp_eh_host_reset(struct scsi_cmnd
*SCpnt
)
1520 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
1522 nsp_dbg(NSP_DEBUG_BUSRESET
, "in");
1530 /**********************************************************************
1532 **********************************************************************/
1534 /*======================================================================
1535 nsp_cs_attach() creates an "instance" of the driver, allocating
1536 local data structures for one device. The device is registered
1539 The dev_link structure is initialized, but we don't actually
1540 configure the card at this point -- we wait until we receive a
1541 card insertion event.
1542 ======================================================================*/
1543 static int nsp_cs_probe(struct pcmcia_device
*link
)
1546 nsp_hw_data
*data
= &nsp_data_base
;
1549 nsp_dbg(NSP_DEBUG_INIT
, "in");
1551 /* Create new SCSI device */
1552 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
1553 if (info
== NULL
) { return -ENOMEM
; }
1556 data
->ScsiInfo
= info
;
1558 nsp_dbg(NSP_DEBUG_INIT
, "info=0x%p", info
);
1560 /* The io structure describes IO port mapping */
1561 link
->resource
[0]->end
= 0x10;
1562 link
->resource
[0]->flags
= IO_DATA_PATH_WIDTH_AUTO
;
1564 /* General socket configuration */
1565 link
->conf
.Attributes
= CONF_ENABLE_IRQ
;
1566 link
->conf
.IntType
= INT_MEMORY_AND_IO
;
1568 ret
= nsp_cs_config(link
);
1570 nsp_dbg(NSP_DEBUG_INIT
, "link=0x%p", link
);
1572 } /* nsp_cs_attach */
1575 /*======================================================================
1576 This deletes a driver "instance". The device is de-registered
1577 with Card Services. If it has been released, all local data
1578 structures are freed. Otherwise, the structures will be freed
1579 when the device is released.
1580 ======================================================================*/
1581 static void nsp_cs_detach(struct pcmcia_device
*link
)
1583 nsp_dbg(NSP_DEBUG_INIT
, "in, link=0x%p", link
);
1585 ((scsi_info_t
*)link
->priv
)->stop
= 1;
1586 nsp_cs_release(link
);
1590 } /* nsp_cs_detach */
1593 /*======================================================================
1594 nsp_cs_config() is scheduled to run after a CARD_INSERTION event
1595 is received, to configure the PCMCIA socket, and to make the
1596 ethernet device available to the system.
1597 ======================================================================*/
1599 struct nsp_cs_configdata
{
1604 static int nsp_cs_config_check(struct pcmcia_device
*p_dev
,
1605 cistpl_cftable_entry_t
*cfg
,
1606 cistpl_cftable_entry_t
*dflt
,
1610 struct nsp_cs_configdata
*cfg_mem
= priv_data
;
1612 if (cfg
->index
== 0)
1615 /* Does this card need audio output? */
1616 if (cfg
->flags
& CISTPL_CFTABLE_AUDIO
) {
1617 p_dev
->conf
.Attributes
|= CONF_ENABLE_SPKR
;
1618 p_dev
->conf
.Status
= CCSR_AUDIO_ENA
;
1621 /* Use power settings for Vcc and Vpp if present */
1622 /* Note that the CIS values need to be rescaled */
1623 if (cfg
->vcc
.present
& (1<<CISTPL_POWER_VNOM
)) {
1624 if (vcc
!= cfg
->vcc
.param
[CISTPL_POWER_VNOM
]/10000)
1626 else if (dflt
->vcc
.present
& (1<<CISTPL_POWER_VNOM
)) {
1627 if (vcc
!= dflt
->vcc
.param
[CISTPL_POWER_VNOM
]/10000)
1631 if (cfg
->vpp1
.present
& (1 << CISTPL_POWER_VNOM
)) {
1633 cfg
->vpp1
.param
[CISTPL_POWER_VNOM
] / 10000;
1634 } else if (dflt
->vpp1
.present
& (1 << CISTPL_POWER_VNOM
)) {
1636 dflt
->vpp1
.param
[CISTPL_POWER_VNOM
] / 10000;
1639 /* Do we need to allocate an interrupt? */
1640 p_dev
->conf
.Attributes
|= CONF_ENABLE_IRQ
;
1642 /* IO window settings */
1643 p_dev
->resource
[0]->end
= p_dev
->resource
[1]->end
= 0;
1644 if ((cfg
->io
.nwin
> 0) || (dflt
->io
.nwin
> 0)) {
1645 cistpl_io_t
*io
= (cfg
->io
.nwin
) ? &cfg
->io
: &dflt
->io
;
1646 p_dev
->io_lines
= io
->flags
& CISTPL_IO_LINES_MASK
;
1647 p_dev
->resource
[0]->flags
&= ~IO_DATA_PATH_WIDTH
;
1648 p_dev
->resource
[0]->flags
|=
1649 pcmcia_io_cfg_data_width(io
->flags
);
1650 p_dev
->resource
[0]->start
= io
->win
[0].base
;
1651 p_dev
->resource
[0]->end
= io
->win
[0].len
;
1653 p_dev
->resource
[1]->flags
=
1654 p_dev
->resource
[0]->flags
;
1655 p_dev
->resource
[1]->start
= io
->win
[1].base
;
1656 p_dev
->resource
[1]->end
= io
->win
[1].len
;
1658 /* This reserves IO space but doesn't actually enable it */
1659 if (pcmcia_request_io(p_dev
) != 0)
1663 if ((cfg
->mem
.nwin
> 0) || (dflt
->mem
.nwin
> 0)) {
1665 (cfg
->mem
.nwin
) ? &cfg
->mem
: &dflt
->mem
;
1666 cfg_mem
->req
.Attributes
= WIN_DATA_WIDTH_16
|WIN_MEMORY_TYPE_CM
;
1667 cfg_mem
->req
.Attributes
|= WIN_ENABLE
;
1668 cfg_mem
->req
.Base
= mem
->win
[0].host_addr
;
1669 cfg_mem
->req
.Size
= mem
->win
[0].len
;
1670 if (cfg_mem
->req
.Size
< 0x1000)
1671 cfg_mem
->req
.Size
= 0x1000;
1672 cfg_mem
->req
.AccessSpeed
= 0;
1673 if (pcmcia_request_window(p_dev
, &cfg_mem
->req
, &p_dev
->win
) != 0)
1675 if (pcmcia_map_mem_page(p_dev
, p_dev
->win
,
1676 mem
->win
[0].card_addr
) != 0)
1679 cfg_mem
->data
->MmioAddress
= (unsigned long) ioremap_nocache(cfg_mem
->req
.Base
, cfg_mem
->req
.Size
);
1680 cfg_mem
->data
->MmioLength
= cfg_mem
->req
.Size
;
1682 /* If we got this far, we're cool! */
1687 nsp_dbg(NSP_DEBUG_INIT
, "next");
1688 pcmcia_disable_device(p_dev
);
1692 static int nsp_cs_config(struct pcmcia_device
*link
)
1695 scsi_info_t
*info
= link
->priv
;
1696 struct nsp_cs_configdata
*cfg_mem
;
1697 struct Scsi_Host
*host
;
1698 nsp_hw_data
*data
= &nsp_data_base
;
1700 nsp_dbg(NSP_DEBUG_INIT
, "in");
1702 cfg_mem
= kzalloc(sizeof(*cfg_mem
), GFP_KERNEL
);
1705 cfg_mem
->data
= data
;
1707 ret
= pcmcia_loop_config(link
, nsp_cs_config_check
, cfg_mem
);
1711 if (pcmcia_request_irq(link
, nspintr
))
1714 ret
= pcmcia_request_configuration(link
, &link
->conf
);
1719 if (link
->resource
[0]) {
1720 release_region(link
->resource
[0]->start
,
1721 resource_size(link
->resource
[0]));
1723 if (link
->resource
[1]) {
1724 release_region(link
->resource
[1]->start
,
1725 resource_size(link
->resource
[1]));
1729 /* Set port and IRQ */
1730 data
->BaseAddress
= link
->resource
[0]->start
;
1731 data
->NumAddress
= resource_size(link
->resource
[0]);
1732 data
->IrqNumber
= link
->irq
;
1734 nsp_dbg(NSP_DEBUG_INIT
, "I/O[0x%x+0x%x] IRQ %d",
1735 data
->BaseAddress
, data
->NumAddress
, data
->IrqNumber
);
1737 if(nsphw_init(data
) == FALSE
) {
1741 host
= nsp_detect(&nsp_driver_template
);
1744 nsp_dbg(NSP_DEBUG_INIT
, "detect failed");
1749 ret
= scsi_add_host (host
, NULL
);
1753 scsi_scan_host(host
);
1757 /* Finally, report what we've done */
1758 printk(KERN_INFO
"nsp_cs: index 0x%02x: ",
1759 link
->conf
.ConfigIndex
);
1760 if (link
->conf
.Vpp
) {
1761 printk(", Vpp %d.%d", link
->conf
.Vpp
/10, link
->conf
.Vpp
%10);
1763 if (link
->conf
.Attributes
& CONF_ENABLE_IRQ
) {
1764 printk(", irq %d", link
->irq
);
1766 if (link
->resource
[0])
1767 printk(", io %pR", link
->resource
[0]);
1768 if (link
->resource
[1])
1769 printk(" & %pR", link
->resource
[1]);
1771 printk(", mem 0x%06lx-0x%06lx", cfg_mem
->req
.Base
,
1772 cfg_mem
->req
.Base
+cfg_mem
->req
.Size
-1);
1779 nsp_dbg(NSP_DEBUG_INIT
, "config fail");
1780 nsp_cs_release(link
);
1784 } /* nsp_cs_config */
1787 /*======================================================================
1788 After a card is removed, nsp_cs_release() will unregister the net
1789 device, and release the PCMCIA configuration. If the device is
1790 still open, this will be postponed until it is closed.
1791 ======================================================================*/
1792 static void nsp_cs_release(struct pcmcia_device
*link
)
1794 scsi_info_t
*info
= link
->priv
;
1795 nsp_hw_data
*data
= NULL
;
1797 if (info
->host
== NULL
) {
1798 nsp_msg(KERN_DEBUG
, "unexpected card release call.");
1800 data
= (nsp_hw_data
*)info
->host
->hostdata
;
1803 nsp_dbg(NSP_DEBUG_INIT
, "link=0x%p", link
);
1805 /* Unlink the device chain */
1806 if (info
->host
!= NULL
) {
1807 scsi_remove_host(info
->host
);
1812 iounmap((void *)(data
->MmioAddress
));
1815 pcmcia_disable_device(link
);
1817 if (info
->host
!= NULL
) {
1818 scsi_host_put(info
->host
);
1820 } /* nsp_cs_release */
1822 static int nsp_cs_suspend(struct pcmcia_device
*link
)
1824 scsi_info_t
*info
= link
->priv
;
1827 nsp_dbg(NSP_DEBUG_INIT
, "event: suspend");
1829 if (info
->host
!= NULL
) {
1830 nsp_msg(KERN_INFO
, "clear SDTR status");
1832 data
= (nsp_hw_data
*)info
->host
->hostdata
;
1834 nsphw_init_sync(data
);
1842 static int nsp_cs_resume(struct pcmcia_device
*link
)
1844 scsi_info_t
*info
= link
->priv
;
1847 nsp_dbg(NSP_DEBUG_INIT
, "event: resume");
1851 if (info
->host
!= NULL
) {
1852 nsp_msg(KERN_INFO
, "reset host and bus");
1854 data
= (nsp_hw_data
*)info
->host
->hostdata
;
1857 nsp_bus_reset(data
);
1863 /*======================================================================*
1864 * module entry point
1865 *====================================================================*/
1866 static struct pcmcia_device_id nsp_cs_ids
[] = {
1867 PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16 ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
1868 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
1869 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
1870 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
1871 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
1872 PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
1873 PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
1876 MODULE_DEVICE_TABLE(pcmcia
, nsp_cs_ids
);
1878 static struct pcmcia_driver nsp_driver
= {
1879 .owner
= THIS_MODULE
,
1883 .probe
= nsp_cs_probe
,
1884 .remove
= nsp_cs_detach
,
1885 .id_table
= nsp_cs_ids
,
1886 .suspend
= nsp_cs_suspend
,
1887 .resume
= nsp_cs_resume
,
1890 static int __init
nsp_cs_init(void)
1892 nsp_msg(KERN_INFO
, "loading...");
1894 return pcmcia_register_driver(&nsp_driver
);
1897 static void __exit
nsp_cs_exit(void)
1899 nsp_msg(KERN_INFO
, "unloading...");
1900 pcmcia_unregister_driver(&nsp_driver
);
1904 module_init(nsp_cs_init
)
1905 module_exit(nsp_cs_exit
)