1 #include <linux/types.h>
4 #include <linux/sched.h>
5 #include <linux/version.h>
8 #include <asm/pgtable.h>
9 #include <asm/mvme147hw.h>
17 #include<linux/stat.h>
19 #define HDATA(ptr) ((struct WD33C93_hostdata *)((ptr)->hostdata))
21 static struct Scsi_Host
*mvme147_host
= NULL
;
23 static void mvme147_intr (int irq
, void *dummy
, struct pt_regs
*fp
)
25 if (irq
== MVME147_IRQ_SCSI_PORT
)
26 wd33c93_intr (mvme147_host
);
28 m147_pcc
->dma_intr
= 0x89; /* Ack and enable ints */
31 static int dma_setup (Scsi_Cmnd
*cmd
, int dir_in
)
33 unsigned char flags
= 0x01;
34 unsigned long addr
= virt_to_bus(cmd
->SCp
.ptr
);
36 /* setup dma direction */
40 /* remember direction */
41 HDATA(mvme147_host
)->dma_dir
= dir_in
;
44 /* invalidate any cache */
45 cache_clear (addr
, cmd
->SCp
.this_residual
);
47 /* push any dirty cache */
48 cache_push (addr
, cmd
->SCp
.this_residual
);
51 m147_pcc
->dma_bcr
= cmd
->SCp
.this_residual
| (1<<24);
52 m147_pcc
->dma_dadr
= addr
;
53 m147_pcc
->dma_cntrl
= flags
;
59 static void dma_stop (struct Scsi_Host
*instance
, Scsi_Cmnd
*SCpnt
,
62 m147_pcc
->dma_cntrl
= 0;
65 int mvme147_detect(Scsi_Host_Template
*tpnt
)
67 static unsigned char called
= 0;
69 if (!MACH_IS_MVME147
|| called
)
73 tpnt
->proc_name
= "MVME147";
74 tpnt
->proc_info
= &wd33c93_proc_info
;
76 mvme147_host
= scsi_register (tpnt
, sizeof(struct WD33C93_hostdata
));
77 mvme147_host
->base
= 0xfffe4000;
78 mvme147_host
->irq
= MVME147_IRQ_SCSI_PORT
;
79 wd33c93_init(mvme147_host
, (wd33c93_regs
*)0xfffe4000,
80 dma_setup
, dma_stop
, WD33C93_FS_8_10
);
82 request_irq(MVME147_IRQ_SCSI_PORT
, mvme147_intr
, 0, "MVME147 SCSI PORT", mvme147_intr
);
83 request_irq(MVME147_IRQ_SCSI_DMA
, mvme147_intr
, 0, "MVME147 SCSI DMA", mvme147_intr
);
84 #if 0 /* Disabled; causes problems booting */
85 m147_pcc
->scsi_interrupt
= 0x10; /* Assert SCSI bus reset */
87 m147_pcc
->scsi_interrupt
= 0x00; /* Negate SCSI bus reset */
89 m147_pcc
->scsi_interrupt
= 0x40; /* Clear bus reset interrupt */
91 m147_pcc
->scsi_interrupt
= 0x09; /* Enable interrupt */
93 m147_pcc
->dma_cntrl
= 0x00; /* ensure DMA is stopped */
94 m147_pcc
->dma_intr
= 0x89; /* Ack and enable ints */
103 static Scsi_Host_Template driver_template
= MVME147_SCSI
;
105 #include "scsi_module.c"
107 int mvme147_release(struct Scsi_Host
*instance
)
110 /* XXX Make sure DMA is stopped! */
112 free_irq(MVME147_IRQ_SCSI_PORT
, mvme147_intr
);
113 free_irq(MVME147_IRQ_SCSI_DMA
, mvme147_intr
);