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/version.h>
29 #include <linux/module.h>
30 #include <linux/kernel.h>
31 #include <linux/init.h>
32 #include <linux/slab.h>
33 #include <linux/string.h>
34 #include <linux/timer.h>
35 #include <linux/ioport.h>
36 #include <linux/delay.h>
37 #include <linux/interrupt.h>
38 #include <linux/major.h>
39 #include <linux/blkdev.h>
40 #include <linux/stat.h>
45 #include <../drivers/scsi/scsi.h>
46 #include <scsi/scsi_host.h>
48 #include <scsi/scsi.h>
49 #include <scsi/scsi_ioctl.h>
51 #include <pcmcia/cs_types.h>
52 #include <pcmcia/cs.h>
53 #include <pcmcia/cistpl.h>
54 #include <pcmcia/cisreg.h>
55 #include <pcmcia/ds.h>
59 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
60 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
61 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
63 MODULE_LICENSE("GPL");
68 /*====================================================================*/
69 /* Parameters that can be set with 'insmod' */
71 static int nsp_burst_mode
= BURST_MEM32
;
72 module_param(nsp_burst_mode
, int, 0);
73 MODULE_PARM_DESC(nsp_burst_mode
, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))");
75 /* Release IO ports after configuration? */
76 static int free_ports
= 0;
77 module_param(free_ports
, bool, 0);
78 MODULE_PARM_DESC(free_ports
, "Release IO ports after configuration? (default: 0 (=no))");
80 static struct scsi_host_template nsp_driver_template
= {
81 .proc_name
= "nsp_cs",
82 .proc_info
= nsp_proc_info
,
83 .name
= "WorkBit NinjaSCSI-3/32Bi(16bit)",
85 .queuecommand
= nsp_queuecommand
,
86 /* .eh_abort_handler = nsp_eh_abort,*/
87 .eh_bus_reset_handler
= nsp_eh_bus_reset
,
88 .eh_host_reset_handler
= nsp_eh_host_reset
,
90 .this_id
= NSP_INITIATOR_ID
,
91 .sg_tablesize
= SG_ALL
,
93 .use_clustering
= DISABLE_CLUSTERING
,
96 static nsp_hw_data nsp_data_base
; /* attach <-> detect glue */
104 # define NSP_DEBUG_MASK 0x000000
105 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args)
106 # define nsp_dbg(mask, args...) /* */
108 # define NSP_DEBUG_MASK 0xffffff
109 # define nsp_msg(type, args...) \
110 nsp_cs_message (__FUNCTION__, __LINE__, (type), args)
111 # define nsp_dbg(mask, args...) \
112 nsp_cs_dmessage(__FUNCTION__, __LINE__, (mask), args)
115 #define NSP_DEBUG_QUEUECOMMAND BIT(0)
116 #define NSP_DEBUG_REGISTER BIT(1)
117 #define NSP_DEBUG_AUTOSCSI BIT(2)
118 #define NSP_DEBUG_INTR BIT(3)
119 #define NSP_DEBUG_SGLIST BIT(4)
120 #define NSP_DEBUG_BUSFREE BIT(5)
121 #define NSP_DEBUG_CDB_CONTENTS BIT(6)
122 #define NSP_DEBUG_RESELECTION BIT(7)
123 #define NSP_DEBUG_MSGINOCCUR BIT(8)
124 #define NSP_DEBUG_EEPROM BIT(9)
125 #define NSP_DEBUG_MSGOUTOCCUR BIT(10)
126 #define NSP_DEBUG_BUSRESET BIT(11)
127 #define NSP_DEBUG_RESTART BIT(12)
128 #define NSP_DEBUG_SYNC BIT(13)
129 #define NSP_DEBUG_WAIT BIT(14)
130 #define NSP_DEBUG_TARGETFLAG BIT(15)
131 #define NSP_DEBUG_PROC BIT(16)
132 #define NSP_DEBUG_INIT BIT(17)
133 #define NSP_DEBUG_DATA_IO BIT(18)
134 #define NSP_SPECIAL_PRINT_REGISTER BIT(20)
136 #define NSP_DEBUG_BUF_LEN 150
138 static void nsp_cs_message(const char *func
, int line
, char *type
, char *fmt
, ...)
141 char buf
[NSP_DEBUG_BUF_LEN
];
144 vsnprintf(buf
, sizeof(buf
), fmt
, args
);
148 printk("%snsp_cs: %s\n", type
, buf
);
150 printk("%snsp_cs: %s (%d): %s\n", type
, func
, line
, buf
);
155 static void nsp_cs_dmessage(const char *func
, int line
, int mask
, char *fmt
, ...)
158 char buf
[NSP_DEBUG_BUF_LEN
];
161 vsnprintf(buf
, sizeof(buf
), fmt
, args
);
164 if (mask
& NSP_DEBUG_MASK
) {
165 printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask
, func
, line
, buf
);
170 /***********************************************************/
172 /*====================================================
173 * Clenaup parameters and call done() functions.
174 * You must be set SCpnt->result before call this function.
176 static void nsp_scsi_done(struct scsi_cmnd
*SCpnt
)
178 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
180 data
->CurrentSC
= NULL
;
182 SCpnt
->scsi_done(SCpnt
);
185 static int nsp_queuecommand(struct scsi_cmnd
*SCpnt
,
186 void (*done
)(struct scsi_cmnd
*))
189 /*unsigned int host_id = SCpnt->device->host->this_id;*/
190 /*unsigned int base = SCpnt->device->host->io_port;*/
191 unsigned char target
= scmd_id(SCpnt
);
193 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
195 nsp_dbg(NSP_DEBUG_QUEUECOMMAND
, "SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d",
196 SCpnt
, target
, SCpnt
->device
->lun
, SCpnt
->request_buffer
, SCpnt
->request_bufflen
, SCpnt
->use_sg
);
197 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
199 SCpnt
->scsi_done
= done
;
201 if (data
->CurrentSC
!= NULL
) {
202 nsp_msg(KERN_DEBUG
, "CurrentSC!=NULL this can't be happen");
203 SCpnt
->result
= DID_BAD_TARGET
<< 16;
204 nsp_scsi_done(SCpnt
);
209 /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility.
210 This makes kernel crash when suspending... */
211 if (data
->ScsiInfo
->stop
!= 0) {
212 nsp_msg(KERN_INFO
, "suspending device. reject command.");
213 SCpnt
->result
= DID_BAD_TARGET
<< 16;
214 nsp_scsi_done(SCpnt
);
215 return SCSI_MLQUEUE_HOST_BUSY
;
221 data
->CurrentSC
= SCpnt
;
223 SCpnt
->SCp
.Status
= CHECK_CONDITION
;
224 SCpnt
->SCp
.Message
= 0;
225 SCpnt
->SCp
.have_data_in
= IO_UNKNOWN
;
226 SCpnt
->SCp
.sent_command
= 0;
227 SCpnt
->SCp
.phase
= PH_UNDETERMINED
;
228 SCpnt
->resid
= SCpnt
->request_bufflen
;
230 /* setup scratch area
231 SCp.ptr : buffer pointer
232 SCp.this_residual : buffer length
233 SCp.buffer : next buffer
234 SCp.buffers_residual : left buffers in list
235 SCp.phase : current state of the command */
237 SCpnt
->SCp
.buffer
= (struct scatterlist
*) SCpnt
->request_buffer
;
238 SCpnt
->SCp
.ptr
= BUFFER_ADDR
;
239 SCpnt
->SCp
.this_residual
= SCpnt
->SCp
.buffer
->length
;
240 SCpnt
->SCp
.buffers_residual
= SCpnt
->use_sg
- 1;
242 SCpnt
->SCp
.ptr
= (char *) SCpnt
->request_buffer
;
243 SCpnt
->SCp
.this_residual
= SCpnt
->request_bufflen
;
244 SCpnt
->SCp
.buffer
= NULL
;
245 SCpnt
->SCp
.buffers_residual
= 0;
248 if (nsphw_start_selection(SCpnt
) == FALSE
) {
249 nsp_dbg(NSP_DEBUG_QUEUECOMMAND
, "selection fail");
250 SCpnt
->result
= DID_BUS_BUSY
<< 16;
251 nsp_scsi_done(SCpnt
);
256 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out");
264 * setup PIO FIFO transfer mode and enable/disable to data out
266 static void nsp_setup_fifo(nsp_hw_data
*data
, int enabled
)
268 unsigned int base
= data
->BaseAddress
;
269 unsigned char transfer_mode_reg
;
271 //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled);
273 if (enabled
!= FALSE
) {
274 transfer_mode_reg
= TRANSFER_GO
| BRAIND
;
276 transfer_mode_reg
= 0;
279 transfer_mode_reg
|= data
->TransferMode
;
281 nsp_index_write(base
, TRANSFERMODE
, transfer_mode_reg
);
284 static void nsphw_init_sync(nsp_hw_data
*data
)
286 sync_data tmp_sync
= { .SyncNegotiation
= SYNC_NOT_YET
,
292 /* setup sync data */
293 for ( i
= 0; i
< ARRAY_SIZE(data
->Sync
); i
++ ) {
294 data
->Sync
[i
] = tmp_sync
;
299 * Initialize Ninja hardware
301 static int nsphw_init(nsp_hw_data
*data
)
303 unsigned int base
= data
->BaseAddress
;
305 nsp_dbg(NSP_DEBUG_INIT
, "in base=0x%x", base
);
307 data
->ScsiClockDiv
= CLOCK_40M
| FAST_20
;
308 data
->CurrentSC
= NULL
;
310 data
->TransferMode
= MODE_IO8
;
312 nsphw_init_sync(data
);
314 /* block all interrupts */
315 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLMASK
);
317 /* setup SCSI interface */
318 nsp_write(base
, IFSELECT
, IF_IFSEL
);
320 nsp_index_write(base
, SCSIIRQMODE
, 0);
322 nsp_index_write(base
, TRANSFERMODE
, MODE_IO8
);
323 nsp_index_write(base
, CLOCKDIV
, data
->ScsiClockDiv
);
325 nsp_index_write(base
, PARITYCTRL
, 0);
326 nsp_index_write(base
, POINTERCLR
, POINTER_CLEAR
|
331 /* setup fifo asic */
332 nsp_write(base
, IFSELECT
, IF_REGSEL
);
333 nsp_index_write(base
, TERMPWRCTRL
, 0);
334 if ((nsp_index_read(base
, OTHERCONTROL
) & TPWR_SENSE
) == 0) {
335 nsp_msg(KERN_INFO
, "terminator power on");
336 nsp_index_write(base
, TERMPWRCTRL
, POWER_ON
);
339 nsp_index_write(base
, TIMERCOUNT
, 0);
340 nsp_index_write(base
, TIMERCOUNT
, 0); /* requires 2 times!! */
342 nsp_index_write(base
, SYNCREG
, 0);
343 nsp_index_write(base
, ACKWIDTH
, 0);
345 /* enable interrupts and ack them */
346 nsp_index_write(base
, SCSIIRQMODE
, SCSI_PHASE_CHANGE_EI
|
349 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLCLEAR
);
351 nsp_setup_fifo(data
, FALSE
);
357 * Start selection phase
359 static int nsphw_start_selection(struct scsi_cmnd
*SCpnt
)
361 unsigned int host_id
= SCpnt
->device
->host
->this_id
;
362 unsigned int base
= SCpnt
->device
->host
->io_port
;
363 unsigned char target
= scmd_id(SCpnt
);
364 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
366 unsigned char phase
, arbit
;
368 //nsp_dbg(NSP_DEBUG_RESELECTION, "in");
370 phase
= nsp_index_read(base
, SCSIBUSMON
);
371 if(phase
!= BUSMON_BUS_FREE
) {
372 //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy");
376 /* start arbitration */
377 //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
378 SCpnt
->SCp
.phase
= PH_ARBSTART
;
379 nsp_index_write(base
, SETARBIT
, ARBIT_GO
);
383 /* XXX: what a stupid chip! */
384 arbit
= nsp_index_read(base
, ARBITSTATUS
);
385 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count);
386 udelay(1); /* hold 1.2us */
387 } while((arbit
& (ARBIT_WIN
| ARBIT_FAIL
)) == 0 &&
390 if (!(arbit
& ARBIT_WIN
)) {
391 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail");
392 nsp_index_write(base
, SETARBIT
, ARBIT_FLAG_CLEAR
);
396 /* assert select line */
397 //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
398 SCpnt
->SCp
.phase
= PH_SELSTART
;
399 udelay(3); /* wait 2.4us */
400 nsp_index_write(base
, SCSIDATALATCH
, BIT(host_id
) | BIT(target
));
401 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_SEL
| SCSI_BSY
| SCSI_ATN
);
402 udelay(2); /* wait >1.2us */
403 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_SEL
| SCSI_BSY
| SCSI_DATAOUT_ENB
| SCSI_ATN
);
404 nsp_index_write(base
, SETARBIT
, ARBIT_FLAG_CLEAR
);
405 /*udelay(1);*/ /* wait >90ns */
406 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_SEL
| SCSI_DATAOUT_ENB
| SCSI_ATN
);
408 /* check selection timeout */
409 nsp_start_timer(SCpnt
, 1000/51);
410 data
->SelectionTimeOut
= 1;
415 struct nsp_sync_table
{
416 unsigned int min_period
;
417 unsigned int max_period
;
418 unsigned int chip_period
;
419 unsigned int ack_width
;
422 static struct nsp_sync_table nsp_sync_table_40M
[] = {
423 {0x0c, 0x0c, 0x1, 0}, /* 20MB 50ns*/
424 {0x19, 0x19, 0x3, 1}, /* 10MB 100ns*/
425 {0x1a, 0x25, 0x5, 2}, /* 7.5MB 150ns*/
426 {0x26, 0x32, 0x7, 3}, /* 5MB 200ns*/
430 static struct nsp_sync_table nsp_sync_table_20M
[] = {
431 {0x19, 0x19, 0x1, 0}, /* 10MB 100ns*/
432 {0x1a, 0x25, 0x2, 0}, /* 7.5MB 150ns*/
433 {0x26, 0x32, 0x3, 1}, /* 5MB 200ns*/
438 * setup synchronous data transfer mode
440 static int nsp_analyze_sdtr(struct scsi_cmnd
*SCpnt
)
442 unsigned char target
= scmd_id(SCpnt
);
443 // unsigned char lun = SCpnt->device->lun;
444 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
445 sync_data
*sync
= &(data
->Sync
[target
]);
446 struct nsp_sync_table
*sync_table
;
447 unsigned int period
, offset
;
451 nsp_dbg(NSP_DEBUG_SYNC
, "in");
453 period
= sync
->SyncPeriod
;
454 offset
= sync
->SyncOffset
;
456 nsp_dbg(NSP_DEBUG_SYNC
, "period=0x%x, offset=0x%x", period
, offset
);
458 if ((data
->ScsiClockDiv
& (BIT(0)|BIT(1))) == CLOCK_20M
) {
459 sync_table
= nsp_sync_table_20M
;
461 sync_table
= nsp_sync_table_40M
;
464 for ( i
= 0; sync_table
->max_period
!= 0; i
++, sync_table
++) {
465 if ( period
>= sync_table
->min_period
&&
466 period
<= sync_table
->max_period
) {
471 if (period
!= 0 && sync_table
->max_period
== 0) {
473 * No proper period/offset found
475 nsp_dbg(NSP_DEBUG_SYNC
, "no proper period/offset");
477 sync
->SyncPeriod
= 0;
478 sync
->SyncOffset
= 0;
479 sync
->SyncRegister
= 0;
485 sync
->SyncRegister
= (sync_table
->chip_period
<< SYNCREG_PERIOD_SHIFT
) |
486 (offset
& SYNCREG_OFFSET_MASK
);
487 sync
->AckWidth
= sync_table
->ack_width
;
489 nsp_dbg(NSP_DEBUG_SYNC
, "sync_reg=0x%x, ack_width=0x%x", sync
->SyncRegister
, sync
->AckWidth
);
496 * start ninja hardware timer
498 static void nsp_start_timer(struct scsi_cmnd
*SCpnt
, int time
)
500 unsigned int base
= SCpnt
->device
->host
->io_port
;
501 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
503 //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time);
504 data
->TimerCount
= time
;
505 nsp_index_write(base
, TIMERCOUNT
, time
);
509 * wait for bus phase change
511 static int nsp_negate_signal(struct scsi_cmnd
*SCpnt
, unsigned char mask
,
514 unsigned int base
= SCpnt
->device
->host
->io_port
;
518 //nsp_dbg(NSP_DEBUG_INTR, "in");
523 reg
= nsp_index_read(base
, SCSIBUSMON
);
527 } while ((time_out
-- != 0) && (reg
& mask
) != 0);
530 nsp_msg(KERN_DEBUG
, " %s signal off timeut", str
);
539 static int nsp_expect_signal(struct scsi_cmnd
*SCpnt
,
540 unsigned char current_phase
,
543 unsigned int base
= SCpnt
->device
->host
->io_port
;
545 unsigned char phase
, i_src
;
547 //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask);
551 phase
= nsp_index_read(base
, SCSIBUSMON
);
553 //nsp_dbg(NSP_DEBUG_INTR, "ret -1");
556 i_src
= nsp_read(base
, IRQSTATUS
);
557 if (i_src
& IRQSTATUS_SCSI
) {
558 //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal");
561 if ((phase
& mask
) != 0 && (phase
& BUSMON_PHASE_MASK
) == current_phase
) {
562 //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase);
565 } while(time_out
-- != 0);
567 //nsp_dbg(NSP_DEBUG_INTR, "timeout");
572 * transfer SCSI message
574 static int nsp_xfer(struct scsi_cmnd
*SCpnt
, int phase
)
576 unsigned int base
= SCpnt
->device
->host
->io_port
;
577 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
578 char *buf
= data
->MsgBuffer
;
579 int len
= min(MSGBUF_SIZE
, data
->MsgLen
);
583 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
584 for (ptr
= 0; len
> 0; len
--, ptr
++) {
586 ret
= nsp_expect_signal(SCpnt
, phase
, BUSMON_REQ
);
588 nsp_dbg(NSP_DEBUG_DATA_IO
, "xfer quit");
592 /* if last byte, negate ATN */
593 if (len
== 1 && SCpnt
->SCp
.phase
== PH_MSG_OUT
) {
594 nsp_index_write(base
, SCSIBUSCTRL
, AUTODIRECTION
| ACKENB
);
597 /* read & write message */
598 if (phase
& BUSMON_IO
) {
599 nsp_dbg(NSP_DEBUG_DATA_IO
, "read msg");
600 buf
[ptr
] = nsp_index_read(base
, SCSIDATAWITHACK
);
602 nsp_dbg(NSP_DEBUG_DATA_IO
, "write msg");
603 nsp_index_write(base
, SCSIDATAWITHACK
, buf
[ptr
]);
605 nsp_negate_signal(SCpnt
, BUSMON_ACK
, "xfer<ack>");
612 * get extra SCSI data from fifo
614 static int nsp_dataphase_bypass(struct scsi_cmnd
*SCpnt
)
616 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
619 //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
621 if (SCpnt
->SCp
.have_data_in
!= IO_IN
) {
625 count
= nsp_fifo_count(SCpnt
);
626 if (data
->FifoCount
== count
) {
627 //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk");
633 * data phase skip only occures in case of SCSI_LOW_READ
635 nsp_dbg(NSP_DEBUG_DATA_IO
, "use bypass quirk");
636 SCpnt
->SCp
.phase
= PH_DATA
;
638 nsp_setup_fifo(data
, FALSE
);
646 static int nsp_reselected(struct scsi_cmnd
*SCpnt
)
648 unsigned int base
= SCpnt
->device
->host
->io_port
;
649 unsigned int host_id
= SCpnt
->device
->host
->this_id
;
650 //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
651 unsigned char bus_reg
;
652 unsigned char id_reg
, tmp
;
655 nsp_dbg(NSP_DEBUG_RESELECTION
, "in");
657 id_reg
= nsp_index_read(base
, RESELECTID
);
658 tmp
= id_reg
& (~BIT(host_id
));
668 if (scmd_id(SCpnt
) != target
) {
669 nsp_msg(KERN_ERR
, "XXX: reselect ID must be %d in this implementation.", target
);
672 nsp_negate_signal(SCpnt
, BUSMON_SEL
, "reselect<SEL>");
675 bus_reg
= nsp_index_read(base
, SCSIBUSCTRL
) & ~(SCSI_BSY
| SCSI_ATN
);
676 nsp_index_write(base
, SCSIBUSCTRL
, bus_reg
);
677 nsp_index_write(base
, SCSIBUSCTRL
, bus_reg
| AUTODIRECTION
| ACKENB
);
683 * count how many data transferd
685 static int nsp_fifo_count(struct scsi_cmnd
*SCpnt
)
687 unsigned int base
= SCpnt
->device
->host
->io_port
;
689 unsigned int l
, m
, h
, dummy
;
691 nsp_index_write(base
, POINTERCLR
, POINTER_CLEAR
| ACK_COUNTER
);
693 l
= nsp_index_read(base
, TRANSFERCOUNT
);
694 m
= nsp_index_read(base
, TRANSFERCOUNT
);
695 h
= nsp_index_read(base
, TRANSFERCOUNT
);
696 dummy
= nsp_index_read(base
, TRANSFERCOUNT
); /* required this! */
698 count
= (h
<< 16) | (m
<< 8) | (l
<< 0);
700 //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count);
706 #define RFIFO_CRIT 64
707 #define WFIFO_CRIT 64
710 * read data in DATA IN phase
712 static void nsp_pio_read(struct scsi_cmnd
*SCpnt
)
714 unsigned int base
= SCpnt
->device
->host
->io_port
;
715 unsigned long mmio_base
= SCpnt
->device
->host
->base
;
716 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
719 unsigned char stat
, fifo_stat
;
721 ocount
= data
->FifoCount
;
723 nsp_dbg(NSP_DEBUG_DATA_IO
, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d",
724 SCpnt
, SCpnt
->resid
, ocount
, SCpnt
->SCp
.ptr
, SCpnt
->SCp
.this_residual
, SCpnt
->SCp
.buffer
, SCpnt
->SCp
.buffers_residual
);
728 while ((time_out
-- != 0) &&
729 (SCpnt
->SCp
.this_residual
> 0 || SCpnt
->SCp
.buffers_residual
> 0 ) ) {
731 stat
= nsp_index_read(base
, SCSIBUSMON
);
732 stat
&= BUSMON_PHASE_MASK
;
735 res
= nsp_fifo_count(SCpnt
) - ocount
;
736 //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);
737 if (res
== 0) { /* if some data avilable ? */
738 if (stat
== BUSPHASE_DATA_IN
) { /* phase changed? */
739 //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
742 nsp_dbg(NSP_DEBUG_DATA_IO
, "phase changed stat=0x%x", stat
);
747 fifo_stat
= nsp_read(base
, FIFOSTATUS
);
748 if ((fifo_stat
& FIFOSTATUS_FULL_EMPTY
) == 0 &&
749 stat
== BUSPHASE_DATA_IN
) {
753 res
= min(res
, SCpnt
->SCp
.this_residual
);
755 switch (data
->TransferMode
) {
757 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
758 nsp_fifo32_read(base
, SCpnt
->SCp
.ptr
, res
>> 2);
761 nsp_fifo8_read (base
, SCpnt
->SCp
.ptr
, res
);
765 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
766 nsp_mmio_fifo32_read(mmio_base
, SCpnt
->SCp
.ptr
, res
>> 2);
770 nsp_dbg(NSP_DEBUG_DATA_IO
, "unknown read mode");
775 SCpnt
->SCp
.ptr
+= res
;
776 SCpnt
->SCp
.this_residual
-= res
;
778 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
780 /* go to next scatter list if available */
781 if (SCpnt
->SCp
.this_residual
== 0 &&
782 SCpnt
->SCp
.buffers_residual
!= 0 ) {
783 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
784 SCpnt
->SCp
.buffers_residual
--;
786 SCpnt
->SCp
.ptr
= BUFFER_ADDR
;
787 SCpnt
->SCp
.this_residual
= SCpnt
->SCp
.buffer
->length
;
790 //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
794 data
->FifoCount
= ocount
;
797 nsp_msg(KERN_DEBUG
, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
798 SCpnt
->resid
, SCpnt
->SCp
.this_residual
, SCpnt
->SCp
.buffers_residual
);
800 nsp_dbg(NSP_DEBUG_DATA_IO
, "read ocount=0x%x", ocount
);
801 nsp_dbg(NSP_DEBUG_DATA_IO
, "r cmd=%d resid=0x%x\n", data
->CmdId
, SCpnt
->resid
);
805 * write data in DATA OUT phase
807 static void nsp_pio_write(struct scsi_cmnd
*SCpnt
)
809 unsigned int base
= SCpnt
->device
->host
->io_port
;
810 unsigned long mmio_base
= SCpnt
->device
->host
->base
;
811 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
816 ocount
= data
->FifoCount
;
818 nsp_dbg(NSP_DEBUG_DATA_IO
, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
819 data
->FifoCount
, SCpnt
->SCp
.ptr
, SCpnt
->SCp
.this_residual
, SCpnt
->SCp
.buffer
, SCpnt
->SCp
.buffers_residual
, SCpnt
->resid
);
823 while ((time_out
-- != 0) &&
824 (SCpnt
->SCp
.this_residual
> 0 || SCpnt
->SCp
.buffers_residual
> 0)) {
825 stat
= nsp_index_read(base
, SCSIBUSMON
);
826 stat
&= BUSMON_PHASE_MASK
;
828 if (stat
!= BUSPHASE_DATA_OUT
) {
829 res
= ocount
- nsp_fifo_count(SCpnt
);
831 nsp_dbg(NSP_DEBUG_DATA_IO
, "phase changed stat=0x%x, res=%d\n", stat
, res
);
832 /* Put back pointer */
834 SCpnt
->SCp
.ptr
-= res
;
835 SCpnt
->SCp
.this_residual
+= res
;
841 res
= ocount
- nsp_fifo_count(SCpnt
);
842 if (res
> 0) { /* write all data? */
843 nsp_dbg(NSP_DEBUG_DATA_IO
, "wait for all data out. ocount=0x%x res=%d", ocount
, res
);
847 res
= min(SCpnt
->SCp
.this_residual
, WFIFO_CRIT
);
849 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
850 switch (data
->TransferMode
) {
852 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
853 nsp_fifo32_write(base
, SCpnt
->SCp
.ptr
, res
>> 2);
856 nsp_fifo8_write (base
, SCpnt
->SCp
.ptr
, res
);
860 res
&= ~(BIT(1)|BIT(0)); /* align 4 */
861 nsp_mmio_fifo32_write(mmio_base
, SCpnt
->SCp
.ptr
, res
>> 2);
865 nsp_dbg(NSP_DEBUG_DATA_IO
, "unknown write mode");
870 SCpnt
->SCp
.ptr
+= res
;
871 SCpnt
->SCp
.this_residual
-= res
;
874 /* go to next scatter list if available */
875 if (SCpnt
->SCp
.this_residual
== 0 &&
876 SCpnt
->SCp
.buffers_residual
!= 0 ) {
877 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
878 SCpnt
->SCp
.buffers_residual
--;
880 SCpnt
->SCp
.ptr
= BUFFER_ADDR
;
881 SCpnt
->SCp
.this_residual
= SCpnt
->SCp
.buffer
->length
;
886 data
->FifoCount
= ocount
;
889 nsp_msg(KERN_DEBUG
, "pio write timeout resid=0x%x", SCpnt
->resid
);
891 nsp_dbg(NSP_DEBUG_DATA_IO
, "write ocount=0x%x", ocount
);
892 nsp_dbg(NSP_DEBUG_DATA_IO
, "w cmd=%d resid=0x%x\n", data
->CmdId
, SCpnt
->resid
);
898 * setup synchronous/asynchronous data transfer mode
900 static int nsp_nexus(struct scsi_cmnd
*SCpnt
)
902 unsigned int base
= SCpnt
->device
->host
->io_port
;
903 unsigned char target
= scmd_id(SCpnt
);
904 // unsigned char lun = SCpnt->device->lun;
905 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
906 sync_data
*sync
= &(data
->Sync
[target
]);
908 //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt);
910 /* setup synch transfer registers */
911 nsp_index_write(base
, SYNCREG
, sync
->SyncRegister
);
912 nsp_index_write(base
, ACKWIDTH
, sync
->AckWidth
);
914 if (SCpnt
->use_sg
== 0 ||
915 SCpnt
->resid
% 4 != 0 ||
916 SCpnt
->resid
<= PAGE_SIZE
) {
917 data
->TransferMode
= MODE_IO8
;
918 } else if (nsp_burst_mode
== BURST_MEM32
) {
919 data
->TransferMode
= MODE_MEM32
;
920 } else if (nsp_burst_mode
== BURST_IO32
) {
921 data
->TransferMode
= MODE_IO32
;
923 data
->TransferMode
= MODE_IO8
;
926 /* setup pdma fifo */
927 nsp_setup_fifo(data
, TRUE
);
929 /* clear ack counter */
931 nsp_index_write(base
, POINTERCLR
, POINTER_CLEAR
|
939 #include "nsp_message.c"
943 static irqreturn_t
nspintr(int irq
, void *dev_id
)
946 unsigned char irq_status
, irq_phase
, phase
;
947 struct scsi_cmnd
*tmpSC
;
948 unsigned char target
, lun
;
949 unsigned int *sync_neg
;
954 //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id);
955 //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host);
957 if ( dev_id
!= NULL
&&
958 ((scsi_info_t
*)dev_id
)->host
!= NULL
) {
959 scsi_info_t
*info
= (scsi_info_t
*)dev_id
;
961 data
= (nsp_hw_data
*)info
->host
->hostdata
;
963 nsp_dbg(NSP_DEBUG_INTR
, "host data wrong");
967 //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id);
969 base
= data
->BaseAddress
;
970 //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base);
975 nsp_write(base
, IRQCONTROL
, IRQCONTROL_IRQDISABLE
);
976 irq_status
= nsp_read(base
, IRQSTATUS
);
977 //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status);
978 if ((irq_status
== 0xff) || ((irq_status
& IRQSTATUS_MASK
) == 0)) {
979 nsp_write(base
, IRQCONTROL
, 0);
980 //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq");
985 * Do not read an irq_phase register if no scsi phase interrupt.
986 * Unless, you should lose a scsi phase interrupt.
988 phase
= nsp_index_read(base
, SCSIBUSMON
);
989 if((irq_status
& IRQSTATUS_SCSI
) != 0) {
990 irq_phase
= nsp_index_read(base
, IRQPHASESENCE
);
995 //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase);
998 * timer interrupt handler (scsi vs timer interrupts)
1000 //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount);
1001 if (data
->TimerCount
!= 0) {
1002 //nsp_dbg(NSP_DEBUG_INTR, "stop timer");
1003 nsp_index_write(base
, TIMERCOUNT
, 0);
1004 nsp_index_write(base
, TIMERCOUNT
, 0);
1005 data
->TimerCount
= 0;
1008 if ((irq_status
& IRQSTATUS_MASK
) == IRQSTATUS_TIMER
&&
1009 data
->SelectionTimeOut
== 0) {
1010 //nsp_dbg(NSP_DEBUG_INTR, "timer start");
1011 nsp_write(base
, IRQCONTROL
, IRQCONTROL_TIMER_CLEAR
);
1015 nsp_write(base
, IRQCONTROL
, IRQCONTROL_TIMER_CLEAR
| IRQCONTROL_FIFO_CLEAR
);
1017 if ((irq_status
& IRQSTATUS_SCSI
) &&
1018 (irq_phase
& SCSI_RESET_IRQ
)) {
1019 nsp_msg(KERN_ERR
, "bus reset (power off?)");
1022 nsp_bus_reset(data
);
1024 if(data
->CurrentSC
!= NULL
) {
1025 tmpSC
= data
->CurrentSC
;
1026 tmpSC
->result
= (DID_RESET
<< 16) |
1027 ((tmpSC
->SCp
.Message
& 0xff) << 8) |
1028 ((tmpSC
->SCp
.Status
& 0xff) << 0);
1029 nsp_scsi_done(tmpSC
);
1034 if (data
->CurrentSC
== NULL
) {
1035 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
);
1037 nsp_bus_reset(data
);
1041 tmpSC
= data
->CurrentSC
;
1042 target
= tmpSC
->device
->id
;
1043 lun
= tmpSC
->device
->lun
;
1044 sync_neg
= &(data
->Sync
[target
].SyncNegotiation
);
1047 * parse hardware SCSI irq reasons register
1049 if (irq_status
& IRQSTATUS_SCSI
) {
1050 if (irq_phase
& RESELECT_IRQ
) {
1051 nsp_dbg(NSP_DEBUG_INTR
, "reselect");
1052 nsp_write(base
, IRQCONTROL
, IRQCONTROL_RESELECT_CLEAR
);
1053 if (nsp_reselected(tmpSC
) != FALSE
) {
1058 if ((irq_phase
& (PHASE_CHANGE_IRQ
| LATCHED_BUS_FREE
)) == 0) {
1063 //show_phase(tmpSC);
1065 switch(tmpSC
->SCp
.phase
) {
1067 // *sync_neg = SYNC_NOT_YET;
1068 if ((phase
& BUSMON_BSY
) == 0) {
1069 //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut);
1070 if (data
->SelectionTimeOut
>= NSP_SELTIMEOUT
) {
1071 nsp_dbg(NSP_DEBUG_INTR
, "selection time out");
1072 data
->SelectionTimeOut
= 0;
1073 nsp_index_write(base
, SCSIBUSCTRL
, 0);
1075 tmpSC
->result
= DID_TIME_OUT
<< 16;
1076 nsp_scsi_done(tmpSC
);
1080 data
->SelectionTimeOut
+= 1;
1081 nsp_start_timer(tmpSC
, 1000/51);
1085 /* attention assert */
1086 //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
1087 data
->SelectionTimeOut
= 0;
1088 tmpSC
->SCp
.phase
= PH_SELECTED
;
1089 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_ATN
);
1091 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_ATN
| AUTODIRECTION
| ACKENB
);
1097 //nsp_dbg(NSP_DEBUG_INTR, "phase reselect");
1098 // *sync_neg = SYNC_NOT_YET;
1099 if ((phase
& BUSMON_PHASE_MASK
) != BUSPHASE_MESSAGE_IN
) {
1101 tmpSC
->result
= DID_ABORT
<< 16;
1102 nsp_scsi_done(tmpSC
);
1107 if ((irq_status
& (IRQSTATUS_SCSI
| IRQSTATUS_FIFO
)) == 0) {
1116 //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
1118 /* normal disconnect */
1119 if (((tmpSC
->SCp
.phase
== PH_MSG_IN
) || (tmpSC
->SCp
.phase
== PH_MSG_OUT
)) &&
1120 (irq_phase
& LATCHED_BUS_FREE
) != 0 ) {
1121 nsp_dbg(NSP_DEBUG_INTR
, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status
, phase
, irq_phase
);
1123 //*sync_neg = SYNC_NOT_YET;
1125 if ((tmpSC
->SCp
.Message
== MSG_COMMAND_COMPLETE
)) { /* all command complete and return status */
1126 tmpSC
->result
= (DID_OK
<< 16) |
1127 ((tmpSC
->SCp
.Message
& 0xff) << 8) |
1128 ((tmpSC
->SCp
.Status
& 0xff) << 0);
1129 nsp_dbg(NSP_DEBUG_INTR
, "command complete result=0x%x", tmpSC
->result
);
1130 nsp_scsi_done(tmpSC
);
1139 /* check unexpected bus free state */
1141 nsp_msg(KERN_DEBUG
, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status
, phase
, irq_phase
);
1143 *sync_neg
= SYNC_NG
;
1144 tmpSC
->result
= DID_ERROR
<< 16;
1145 nsp_scsi_done(tmpSC
);
1149 switch (phase
& BUSMON_PHASE_MASK
) {
1150 case BUSPHASE_COMMAND
:
1151 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_COMMAND");
1152 if ((phase
& BUSMON_REQ
) == 0) {
1153 nsp_dbg(NSP_DEBUG_INTR
, "REQ == 0");
1157 tmpSC
->SCp
.phase
= PH_COMMAND
;
1161 /* write scsi command */
1162 nsp_dbg(NSP_DEBUG_INTR
, "cmd_len=%d", tmpSC
->cmd_len
);
1163 nsp_index_write(base
, COMMANDCTRL
, CLEAR_COMMAND_POINTER
);
1164 for (i
= 0; i
< tmpSC
->cmd_len
; i
++) {
1165 nsp_index_write(base
, COMMANDDATA
, tmpSC
->cmnd
[i
]);
1167 nsp_index_write(base
, COMMANDCTRL
, CLEAR_COMMAND_POINTER
| AUTO_COMMAND_GO
);
1170 case BUSPHASE_DATA_OUT
:
1171 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_DATA_OUT");
1173 tmpSC
->SCp
.phase
= PH_DATA
;
1174 tmpSC
->SCp
.have_data_in
= IO_OUT
;
1176 nsp_pio_write(tmpSC
);
1180 case BUSPHASE_DATA_IN
:
1181 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_DATA_IN");
1183 tmpSC
->SCp
.phase
= PH_DATA
;
1184 tmpSC
->SCp
.have_data_in
= IO_IN
;
1186 nsp_pio_read(tmpSC
);
1190 case BUSPHASE_STATUS
:
1191 nsp_dataphase_bypass(tmpSC
);
1192 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_STATUS");
1194 tmpSC
->SCp
.phase
= PH_STATUS
;
1196 tmpSC
->SCp
.Status
= nsp_index_read(base
, SCSIDATAWITHACK
);
1197 nsp_dbg(NSP_DEBUG_INTR
, "message=0x%x status=0x%x", tmpSC
->SCp
.Message
, tmpSC
->SCp
.Status
);
1201 case BUSPHASE_MESSAGE_OUT
:
1202 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_MESSAGE_OUT");
1203 if ((phase
& BUSMON_REQ
) == 0) {
1207 tmpSC
->SCp
.phase
= PH_MSG_OUT
;
1209 //*sync_neg = SYNC_NOT_YET;
1211 data
->MsgLen
= i
= 0;
1212 data
->MsgBuffer
[i
] = IDENTIFY(TRUE
, lun
); i
++;
1214 if (*sync_neg
== SYNC_NOT_YET
) {
1215 data
->Sync
[target
].SyncPeriod
= 0;
1216 data
->Sync
[target
].SyncOffset
= 0;
1219 data
->MsgBuffer
[i
] = MSG_EXTENDED
; i
++;
1220 data
->MsgBuffer
[i
] = 3; i
++;
1221 data
->MsgBuffer
[i
] = MSG_EXT_SDTR
; i
++;
1222 data
->MsgBuffer
[i
] = 0x0c; i
++;
1223 data
->MsgBuffer
[i
] = 15; i
++;
1228 nsp_analyze_sdtr(tmpSC
);
1230 nsp_message_out(tmpSC
);
1233 case BUSPHASE_MESSAGE_IN
:
1234 nsp_dataphase_bypass(tmpSC
);
1235 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE_MESSAGE_IN");
1236 if ((phase
& BUSMON_REQ
) == 0) {
1240 tmpSC
->SCp
.phase
= PH_MSG_IN
;
1241 nsp_message_in(tmpSC
);
1244 if (*sync_neg
== SYNC_NOT_YET
) {
1245 //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun);
1247 if (data
->MsgLen
>= 5 &&
1248 data
->MsgBuffer
[0] == MSG_EXTENDED
&&
1249 data
->MsgBuffer
[1] == 3 &&
1250 data
->MsgBuffer
[2] == MSG_EXT_SDTR
) {
1251 data
->Sync
[target
].SyncPeriod
= data
->MsgBuffer
[3];
1252 data
->Sync
[target
].SyncOffset
= data
->MsgBuffer
[4];
1253 //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]);
1254 *sync_neg
= SYNC_OK
;
1256 data
->Sync
[target
].SyncPeriod
= 0;
1257 data
->Sync
[target
].SyncOffset
= 0;
1258 *sync_neg
= SYNC_NG
;
1260 nsp_analyze_sdtr(tmpSC
);
1264 /* search last messeage byte */
1266 for (i
= 0; i
< data
->MsgLen
; i
++) {
1267 tmp
= data
->MsgBuffer
[i
];
1268 if (data
->MsgBuffer
[i
] == MSG_EXTENDED
) {
1269 i
+= (1 + data
->MsgBuffer
[i
+1]);
1272 tmpSC
->SCp
.Message
= tmp
;
1274 nsp_dbg(NSP_DEBUG_INTR
, "message=0x%x len=%d", tmpSC
->SCp
.Message
, data
->MsgLen
);
1279 case BUSPHASE_SELECT
:
1281 nsp_dbg(NSP_DEBUG_INTR
, "BUSPHASE other");
1286 //nsp_dbg(NSP_DEBUG_INTR, "out");
1290 nsp_start_timer(tmpSC
, 1000/102);
1295 #include "nsp_debug.c"
1296 #endif /* NSP_DEBUG */
1298 /*----------------------------------------------------------------*/
1299 /* look for ninja3 card and init if found */
1300 /*----------------------------------------------------------------*/
1301 static struct Scsi_Host
*nsp_detect(struct scsi_host_template
*sht
)
1303 struct Scsi_Host
*host
; /* registered host structure */
1304 nsp_hw_data
*data_b
= &nsp_data_base
, *data
;
1306 nsp_dbg(NSP_DEBUG_INIT
, "this_id=%d", sht
->this_id
);
1307 host
= scsi_host_alloc(&nsp_driver_template
, sizeof(nsp_hw_data
));
1309 nsp_dbg(NSP_DEBUG_INIT
, "host failed");
1313 memcpy(host
->hostdata
, data_b
, sizeof(nsp_hw_data
));
1314 data
= (nsp_hw_data
*)host
->hostdata
;
1315 data
->ScsiInfo
->host
= host
;
1320 nsp_dbg(NSP_DEBUG_INIT
, "irq=%d,%d", data_b
->IrqNumber
, ((nsp_hw_data
*)host
->hostdata
)->IrqNumber
);
1322 host
->unique_id
= data
->BaseAddress
;
1323 host
->io_port
= data
->BaseAddress
;
1324 host
->n_io_port
= data
->NumAddress
;
1325 host
->irq
= data
->IrqNumber
;
1326 host
->base
= data
->MmioAddress
;
1328 spin_lock_init(&(data
->Lock
));
1330 snprintf(data
->nspinfo
,
1331 sizeof(data
->nspinfo
),
1332 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d",
1333 host
->io_port
, host
->io_port
+ host
->n_io_port
- 1,
1336 sht
->name
= data
->nspinfo
;
1338 nsp_dbg(NSP_DEBUG_INIT
, "end");
1341 return host
; /* detect done. */
1344 /*----------------------------------------------------------------*/
1345 /* return info string */
1346 /*----------------------------------------------------------------*/
1347 static const char *nsp_info(struct Scsi_Host
*shpnt
)
1349 nsp_hw_data
*data
= (nsp_hw_data
*)shpnt
->hostdata
;
1351 return data
->nspinfo
;
1355 #define SPRINTF(args...) \
1357 if(length > (pos - buffer)) { \
1358 pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1359 nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\
1363 static int nsp_proc_info(struct Scsi_Host
*host
, char *buffer
, char **start
,
1364 off_t offset
, int length
, int inout
)
1370 unsigned long flags
;
1378 hostno
= host
->host_no
;
1379 data
= (nsp_hw_data
*)host
->hostdata
;
1382 SPRINTF("NinjaSCSI status\n\n");
1383 SPRINTF("Driver version: $Revision: 1.23 $\n");
1384 SPRINTF("SCSI host No.: %d\n", hostno
);
1385 SPRINTF("IRQ: %d\n", host
->irq
);
1386 SPRINTF("IO: 0x%lx-0x%lx\n", host
->io_port
, host
->io_port
+ host
->n_io_port
- 1);
1387 SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host
->base
, host
->base
+ data
->MmioLength
- 1);
1388 SPRINTF("sg_tablesize: %d\n", host
->sg_tablesize
);
1390 SPRINTF("burst transfer mode: ");
1391 switch (nsp_burst_mode
) {
1408 spin_lock_irqsave(&(data
->Lock
), flags
);
1409 SPRINTF("CurrentSC: 0x%p\n\n", data
->CurrentSC
);
1410 spin_unlock_irqrestore(&(data
->Lock
), flags
);
1412 SPRINTF("SDTR status\n");
1413 for(id
= 0; id
< ARRAY_SIZE(data
->Sync
); id
++) {
1415 SPRINTF("id %d: ", id
);
1417 if (id
== host
->this_id
) {
1418 SPRINTF("----- NinjaSCSI-3 host adapter\n");
1422 switch(data
->Sync
[id
].SyncNegotiation
) {
1437 if (data
->Sync
[id
].SyncPeriod
!= 0) {
1438 speed
= 1000000 / (data
->Sync
[id
].SyncPeriod
* 4);
1440 SPRINTF(" transfer %d.%dMB/s, offset %d",
1443 data
->Sync
[id
].SyncOffset
1449 thislength
= pos
- (buffer
+ offset
);
1451 if(thislength
< 0) {
1457 thislength
= min(thislength
, length
);
1458 *start
= buffer
+ offset
;
1464 /*---------------------------------------------------------------*/
1466 /*---------------------------------------------------------------*/
1469 static int nsp_eh_abort(struct scsi_cmnd *SCpnt)
1471 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt);
1473 return nsp_eh_bus_reset(SCpnt);
1476 static int nsp_bus_reset(nsp_hw_data
*data
)
1478 unsigned int base
= data
->BaseAddress
;
1481 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLMASK
);
1483 nsp_index_write(base
, SCSIBUSCTRL
, SCSI_RST
);
1484 mdelay(100); /* 100ms */
1485 nsp_index_write(base
, SCSIBUSCTRL
, 0);
1486 for(i
= 0; i
< 5; i
++) {
1487 nsp_index_read(base
, IRQPHASESENCE
); /* dummy read */
1490 nsphw_init_sync(data
);
1492 nsp_write(base
, IRQCONTROL
, IRQCONTROL_ALLCLEAR
);
1497 static int nsp_eh_bus_reset(struct scsi_cmnd
*SCpnt
)
1499 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
1501 nsp_dbg(NSP_DEBUG_BUSRESET
, "SCpnt=0x%p", SCpnt
);
1503 return nsp_bus_reset(data
);
1506 static int nsp_eh_host_reset(struct scsi_cmnd
*SCpnt
)
1508 nsp_hw_data
*data
= (nsp_hw_data
*)SCpnt
->device
->host
->hostdata
;
1510 nsp_dbg(NSP_DEBUG_BUSRESET
, "in");
1518 /**********************************************************************
1520 **********************************************************************/
1522 /*======================================================================
1523 nsp_cs_attach() creates an "instance" of the driver, allocating
1524 local data structures for one device. The device is registered
1527 The dev_link structure is initialized, but we don't actually
1528 configure the card at this point -- we wait until we receive a
1529 card insertion event.
1530 ======================================================================*/
1531 static int nsp_cs_probe(struct pcmcia_device
*link
)
1534 nsp_hw_data
*data
= &nsp_data_base
;
1537 nsp_dbg(NSP_DEBUG_INIT
, "in");
1539 /* Create new SCSI device */
1540 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
1541 if (info
== NULL
) { return -ENOMEM
; }
1544 data
->ScsiInfo
= info
;
1546 nsp_dbg(NSP_DEBUG_INIT
, "info=0x%p", info
);
1548 /* The io structure describes IO port mapping */
1549 link
->io
.NumPorts1
= 0x10;
1550 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_AUTO
;
1551 link
->io
.IOAddrLines
= 10; /* not used */
1553 /* Interrupt setup */
1554 link
->irq
.Attributes
= IRQ_TYPE_EXCLUSIVE
| IRQ_HANDLE_PRESENT
;
1555 link
->irq
.IRQInfo1
= IRQ_LEVEL_ID
;
1557 /* Interrupt handler */
1558 link
->irq
.Handler
= &nspintr
;
1559 link
->irq
.Instance
= info
;
1560 link
->irq
.Attributes
|= IRQF_SHARED
;
1562 /* General socket configuration */
1563 link
->conf
.Attributes
= CONF_ENABLE_IRQ
;
1564 link
->conf
.IntType
= INT_MEMORY_AND_IO
;
1566 ret
= nsp_cs_config(link
);
1568 nsp_dbg(NSP_DEBUG_INIT
, "link=0x%p", link
);
1570 } /* nsp_cs_attach */
1573 /*======================================================================
1574 This deletes a driver "instance". The device is de-registered
1575 with Card Services. If it has been released, all local data
1576 structures are freed. Otherwise, the structures will be freed
1577 when the device is released.
1578 ======================================================================*/
1579 static void nsp_cs_detach(struct pcmcia_device
*link
)
1581 nsp_dbg(NSP_DEBUG_INIT
, "in, link=0x%p", link
);
1583 ((scsi_info_t
*)link
->priv
)->stop
= 1;
1584 nsp_cs_release(link
);
1588 } /* nsp_cs_detach */
1591 /*======================================================================
1592 nsp_cs_config() is scheduled to run after a CARD_INSERTION event
1593 is received, to configure the PCMCIA socket, and to make the
1594 ethernet device available to the system.
1595 ======================================================================*/
1596 #define CS_CHECK(fn, ret) \
1597 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
1598 /*====================================================================*/
1599 static int nsp_cs_config(struct pcmcia_device
*link
)
1602 scsi_info_t
*info
= link
->priv
;
1605 int last_ret
, last_fn
;
1606 unsigned char tuple_data
[64];
1610 cistpl_cftable_entry_t dflt
= { 0 };
1611 struct Scsi_Host
*host
;
1612 nsp_hw_data
*data
= &nsp_data_base
;
1614 nsp_dbg(NSP_DEBUG_INIT
, "in");
1616 tuple
.Attributes
= 0;
1617 tuple
.TupleData
= tuple_data
;
1618 tuple
.TupleDataMax
= sizeof(tuple_data
);
1619 tuple
.TupleOffset
= 0;
1621 /* Look up the current Vcc */
1622 CS_CHECK(GetConfigurationInfo
, pcmcia_get_configuration_info(link
, &conf
));
1624 tuple
.DesiredTuple
= CISTPL_CFTABLE_ENTRY
;
1625 CS_CHECK(GetFirstTuple
, pcmcia_get_first_tuple(link
, &tuple
));
1627 cistpl_cftable_entry_t
*cfg
= &(parse
.cftable_entry
);
1629 if (pcmcia_get_tuple_data(link
, &tuple
) != 0 ||
1630 pcmcia_parse_tuple(link
, &tuple
, &parse
) != 0)
1633 if (cfg
->flags
& CISTPL_CFTABLE_DEFAULT
) { dflt
= *cfg
; }
1634 if (cfg
->index
== 0) { goto next_entry
; }
1635 link
->conf
.ConfigIndex
= cfg
->index
;
1637 /* Does this card need audio output? */
1638 if (cfg
->flags
& CISTPL_CFTABLE_AUDIO
) {
1639 link
->conf
.Attributes
|= CONF_ENABLE_SPKR
;
1640 link
->conf
.Status
= CCSR_AUDIO_ENA
;
1643 /* Use power settings for Vcc and Vpp if present */
1644 /* Note that the CIS values need to be rescaled */
1645 if (cfg
->vcc
.present
& (1<<CISTPL_POWER_VNOM
)) {
1646 if (conf
.Vcc
!= cfg
->vcc
.param
[CISTPL_POWER_VNOM
]/10000) {
1649 } else if (dflt
.vcc
.present
& (1<<CISTPL_POWER_VNOM
)) {
1650 if (conf
.Vcc
!= dflt
.vcc
.param
[CISTPL_POWER_VNOM
]/10000) {
1655 if (cfg
->vpp1
.present
& (1 << CISTPL_POWER_VNOM
)) {
1657 cfg
->vpp1
.param
[CISTPL_POWER_VNOM
] / 10000;
1658 } else if (dflt
.vpp1
.present
& (1 << CISTPL_POWER_VNOM
)) {
1660 dflt
.vpp1
.param
[CISTPL_POWER_VNOM
] / 10000;
1663 /* Do we need to allocate an interrupt? */
1664 if (cfg
->irq
.IRQInfo1
|| dflt
.irq
.IRQInfo1
) {
1665 link
->conf
.Attributes
|= CONF_ENABLE_IRQ
;
1668 /* IO window settings */
1669 link
->io
.NumPorts1
= link
->io
.NumPorts2
= 0;
1670 if ((cfg
->io
.nwin
> 0) || (dflt
.io
.nwin
> 0)) {
1671 cistpl_io_t
*io
= (cfg
->io
.nwin
) ? &cfg
->io
: &dflt
.io
;
1672 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_AUTO
;
1673 if (!(io
->flags
& CISTPL_IO_8BIT
))
1674 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_16
;
1675 if (!(io
->flags
& CISTPL_IO_16BIT
))
1676 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_8
;
1677 link
->io
.IOAddrLines
= io
->flags
& CISTPL_IO_LINES_MASK
;
1678 link
->io
.BasePort1
= io
->win
[0].base
;
1679 link
->io
.NumPorts1
= io
->win
[0].len
;
1681 link
->io
.Attributes2
= link
->io
.Attributes1
;
1682 link
->io
.BasePort2
= io
->win
[1].base
;
1683 link
->io
.NumPorts2
= io
->win
[1].len
;
1685 /* This reserves IO space but doesn't actually enable it */
1686 if (pcmcia_request_io(link
, &link
->io
) != 0)
1690 if ((cfg
->mem
.nwin
> 0) || (dflt
.mem
.nwin
> 0)) {
1692 (cfg
->mem
.nwin
) ? &cfg
->mem
: &dflt
.mem
;
1693 req
.Attributes
= WIN_DATA_WIDTH_16
|WIN_MEMORY_TYPE_CM
;
1694 req
.Attributes
|= WIN_ENABLE
;
1695 req
.Base
= mem
->win
[0].host_addr
;
1696 req
.Size
= mem
->win
[0].len
;
1697 if (req
.Size
< 0x1000) {
1700 req
.AccessSpeed
= 0;
1701 if (pcmcia_request_window(&link
, &req
, &link
->win
) != 0)
1703 map
.Page
= 0; map
.CardOffset
= mem
->win
[0].card_addr
;
1704 if (pcmcia_map_mem_page(link
->win
, &map
) != 0)
1707 data
->MmioAddress
= (unsigned long)ioremap_nocache(req
.Base
, req
.Size
);
1708 data
->MmioLength
= req
.Size
;
1710 /* If we got this far, we're cool! */
1714 nsp_dbg(NSP_DEBUG_INIT
, "next");
1715 pcmcia_disable_device(link
);
1716 CS_CHECK(GetNextTuple
, pcmcia_get_next_tuple(link
, &tuple
));
1719 if (link
->conf
.Attributes
& CONF_ENABLE_IRQ
) {
1720 CS_CHECK(RequestIRQ
, pcmcia_request_irq(link
, &link
->irq
));
1722 CS_CHECK(RequestConfiguration
, pcmcia_request_configuration(link
, &link
->conf
));
1725 if (link
->io
.BasePort1
) {
1726 release_region(link
->io
.BasePort1
, link
->io
.NumPorts1
);
1728 if (link
->io
.BasePort2
) {
1729 release_region(link
->io
.BasePort2
, link
->io
.NumPorts2
);
1733 /* Set port and IRQ */
1734 data
->BaseAddress
= link
->io
.BasePort1
;
1735 data
->NumAddress
= link
->io
.NumPorts1
;
1736 data
->IrqNumber
= link
->irq
.AssignedIRQ
;
1738 nsp_dbg(NSP_DEBUG_INIT
, "I/O[0x%x+0x%x] IRQ %d",
1739 data
->BaseAddress
, data
->NumAddress
, data
->IrqNumber
);
1741 if(nsphw_init(data
) == FALSE
) {
1745 host
= nsp_detect(&nsp_driver_template
);
1748 nsp_dbg(NSP_DEBUG_INIT
, "detect failed");
1753 ret
= scsi_add_host (host
, NULL
);
1757 scsi_scan_host(host
);
1759 snprintf(info
->node
.dev_name
, sizeof(info
->node
.dev_name
), "scsi%d", host
->host_no
);
1760 link
->dev_node
= &info
->node
;
1763 /* Finally, report what we've done */
1764 printk(KERN_INFO
"nsp_cs: index 0x%02x: ",
1765 link
->conf
.ConfigIndex
);
1766 if (link
->conf
.Vpp
) {
1767 printk(", Vpp %d.%d", link
->conf
.Vpp
/10, link
->conf
.Vpp
%10);
1769 if (link
->conf
.Attributes
& CONF_ENABLE_IRQ
) {
1770 printk(", irq %d", link
->irq
.AssignedIRQ
);
1772 if (link
->io
.NumPorts1
) {
1773 printk(", io 0x%04x-0x%04x", link
->io
.BasePort1
,
1774 link
->io
.BasePort1
+link
->io
.NumPorts1
-1);
1776 if (link
->io
.NumPorts2
)
1777 printk(" & 0x%04x-0x%04x", link
->io
.BasePort2
,
1778 link
->io
.BasePort2
+link
->io
.NumPorts2
-1);
1780 printk(", mem 0x%06lx-0x%06lx", req
.Base
,
1781 req
.Base
+req
.Size
-1);
1787 nsp_dbg(NSP_DEBUG_INIT
, "config fail");
1788 cs_error(link
, last_fn
, last_ret
);
1789 nsp_cs_release(link
);
1792 } /* nsp_cs_config */
1796 /*======================================================================
1797 After a card is removed, nsp_cs_release() will unregister the net
1798 device, and release the PCMCIA configuration. If the device is
1799 still open, this will be postponed until it is closed.
1800 ======================================================================*/
1801 static void nsp_cs_release(struct pcmcia_device
*link
)
1803 scsi_info_t
*info
= link
->priv
;
1804 nsp_hw_data
*data
= NULL
;
1806 if (info
->host
== NULL
) {
1807 nsp_msg(KERN_DEBUG
, "unexpected card release call.");
1809 data
= (nsp_hw_data
*)info
->host
->hostdata
;
1812 nsp_dbg(NSP_DEBUG_INIT
, "link=0x%p", link
);
1814 /* Unlink the device chain */
1815 if (info
->host
!= NULL
) {
1816 scsi_remove_host(info
->host
);
1818 link
->dev_node
= NULL
;
1822 iounmap((void *)(data
->MmioAddress
));
1825 pcmcia_disable_device(link
);
1827 if (info
->host
!= NULL
) {
1828 scsi_host_put(info
->host
);
1830 } /* nsp_cs_release */
1832 static int nsp_cs_suspend(struct pcmcia_device
*link
)
1834 scsi_info_t
*info
= link
->priv
;
1837 nsp_dbg(NSP_DEBUG_INIT
, "event: suspend");
1839 if (info
->host
!= NULL
) {
1840 nsp_msg(KERN_INFO
, "clear SDTR status");
1842 data
= (nsp_hw_data
*)info
->host
->hostdata
;
1844 nsphw_init_sync(data
);
1852 static int nsp_cs_resume(struct pcmcia_device
*link
)
1854 scsi_info_t
*info
= link
->priv
;
1857 nsp_dbg(NSP_DEBUG_INIT
, "event: resume");
1861 if (info
->host
!= NULL
) {
1862 nsp_msg(KERN_INFO
, "reset host and bus");
1864 data
= (nsp_hw_data
*)info
->host
->hostdata
;
1867 nsp_bus_reset(data
);
1873 /*======================================================================*
1874 * module entry point
1875 *====================================================================*/
1876 static struct pcmcia_device_id nsp_cs_ids
[] = {
1877 PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16 ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
1878 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
1879 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a),
1880 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a),
1881 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a),
1882 PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e),
1883 PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a),
1886 MODULE_DEVICE_TABLE(pcmcia
, nsp_cs_ids
);
1888 static struct pcmcia_driver nsp_driver
= {
1889 .owner
= THIS_MODULE
,
1893 .probe
= nsp_cs_probe
,
1894 .remove
= nsp_cs_detach
,
1895 .id_table
= nsp_cs_ids
,
1896 .suspend
= nsp_cs_suspend
,
1897 .resume
= nsp_cs_resume
,
1900 static int __init
nsp_cs_init(void)
1902 nsp_msg(KERN_INFO
, "loading...");
1904 return pcmcia_register_driver(&nsp_driver
);
1907 static void __exit
nsp_cs_exit(void)
1909 nsp_msg(KERN_INFO
, "unloading...");
1910 pcmcia_unregister_driver(&nsp_driver
);
1914 module_init(nsp_cs_init
)
1915 module_exit(nsp_cs_exit
)