54 #include <linux/types.h>
55 #include <linux/stddef.h>
56 #include <linux/ctype.h>
59 #include <linux/module.h>
60 #include <linux/signal.h>
69 #include <asm/idprom.h>
70 #include <asm/machines.h>
74 #define NDEBUG_ABORT 0x00100000
75 #define NDEBUG_TAGS 0x00200000
76 #define NDEBUG_MERGING 0x00400000
86 static void NCR5380_print(
struct Scsi_Host *instance);
104 #define ENABLE_IRQ() enable_irq( IRQ_SUN3_SCSI );
108 static inline unsigned char sun3scsi_read(
int reg);
109 static inline void sun3scsi_write(
int reg,
int value);
111 static int setup_can_queue = -1;
113 static int setup_cmd_per_lun = -1;
115 static int setup_sg_tablesize = -1;
118 static int setup_use_tagged_queuing = -1;
121 static int setup_hostid = -1;
126 #define AFTER_RESET_DELAY (HZ/2)
129 #define SUN3_DMA_DELAY 10
132 #define SUN3_DVMA_BUFSIZE 0xe000
135 #define SUN3_DMA_MINSIZE 128
137 static volatile unsigned char *sun3_scsi_regp;
140 static unsigned char *dmabuf =
NULL;
143 static unsigned char *sun3_dma_orig_addr =
NULL;
144 static unsigned long sun3_dma_orig_count = 0;
145 static int sun3_dma_active = 0;
146 static unsigned long last_residual = 0;
152 static inline unsigned char sun3scsi_read(
int reg)
154 return( sun3_scsi_regp[reg] );
157 static inline void sun3scsi_write(
int reg,
int value)
164 static inline unsigned short sun3_udc_read(
unsigned char reg)
176 static inline void sun3_udc_write(
unsigned short val,
unsigned char reg)
187 static struct Scsi_Host *default_instance;
203 unsigned long ioaddr;
204 static int called = 0;
224 (setup_can_queue > 0) ? setup_can_queue :
CAN_QUEUE;
226 (setup_cmd_per_lun > 0) ? setup_cmd_per_lun :
CMD_PER_LUN;
228 (setup_sg_tablesize >= 0) ? setup_sg_tablesize :
SG_TABLESIZE;
230 if (setup_hostid >= 0)
238 sun3_scsi_regp = (
unsigned char *)ioaddr;
240 dregs = (
struct sun3_dma_regs *)(((
unsigned char *)ioaddr) + 8);
244 printk(
"SUN3 Scsi couldn't allocate DVMA memory!\n");
249 printk(
"SUN3 Scsi couldn't allocate DVMA memory!\n");
254 if (setup_use_tagged_queuing < 0)
262 default_instance = instance;
267 NCR5380_init(instance, 0);
274 0,
"Sun3SCSI-5380", instance)) {
276 printk(
"scsi%d: IRQ%d not free, interrupts disabled\n",
280 printk(
"scsi%d: IRQ%d not free, bailing out\n",
291 printk(
" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d",
295 NCR5380_print_options(instance);
307 sun3_scsi_reset_boot(instance);
318 iounmap((
void *)sun3_scsi_regp);
329 static void sun3_scsi_reset_boot(
struct Scsi_Host *instance)
341 printk(
"Sun3 SCSI: resetting the SCSI bus..." );
375 #define CSR_GOOD 0x060f
379 unsigned short csr = dregs->
csr;
384 printk(
"scsi%d: bus error in dma\n", default_instance->
host_no);
408 void sun3_sun3_debug (
void)
413 if (default_instance) {
415 NCR5380_print_status(default_instance);
423 static unsigned long sun3scsi_dma_setup(
void *
data,
unsigned long count,
int write_flag)
427 memcpy(dmabuf, data, count);
429 sun3_dma_orig_addr =
data;
430 sun3_dma_orig_count =
count;
435 if(sun3_dma_orig_addr !=
NULL)
441 sun3_dma_orig_addr =
addr;
442 sun3_dma_orig_count =
count;
467 printk(
"scsi%d: fifo_mismatch %04x not %04x\n",
469 (
unsigned int) count);
470 NCR5380_print(default_instance);
478 udc_regs->
addr_hi = (((
unsigned long)(addr) & 0xff0000) >> 8);
479 udc_regs->
addr_lo = ((
unsigned long)(addr) & 0xffff);
481 udc_regs->
count = count/2;
494 sun3_udc_write(((
dvma_vtob(udc_regs) & 0xff0000) >> 8),
509 static inline unsigned long sun3scsi_dma_count(
struct Scsi_Host *instance)
511 unsigned short resid;
519 return (
unsigned long) resid;
522 static inline unsigned long sun3scsi_dma_residual(
struct Scsi_Host *instance)
524 return last_residual;
527 static inline unsigned long sun3scsi_dma_xfer_len(
unsigned long wanted,
531 if (cmd->
request->cmd_type == REQ_TYPE_FS)
537 static inline int sun3scsi_dma_start(
unsigned long count,
unsigned char *data)
546 static int sun3scsi_dma_finish(
int write_flag)
548 unsigned short count;
563 printk(
"sun3scsi: fifo failed to empty!\n");
572 count = sun3scsi_dma_count(default_instance);
576 if(sun3_dma_orig_addr) {
580 printk(
"scsi%d: sun3_scsi_finish: read overrun baby... ", default_instance->
host_no);
586 memcpy(sun3_dma_orig_addr, dmabuf, sun3_dma_orig_count);
587 sun3_dma_orig_addr =
NULL;
593 last_residual = fifo;
596 if((!write_flag) && (count - fifo) == 2) {
598 unsigned char *
vaddr;
601 vaddr = (
unsigned char *)
dvma_btov(sun3_dma_orig_addr);
603 vaddr += (sun3_dma_orig_count - fifo);
605 vaddr[-2] = (data & 0xff00) >> 8;
606 vaddr[-1] = (data & 0xff);
610 sun3_dma_orig_addr =
NULL;
620 sun3_dma_setup_done =
NULL;
633 .queuecommand = sun3scsi_queue_command,
634 .eh_abort_handler = sun3scsi_abort,
635 .eh_bus_reset_handler = sun3scsi_bus_reset,