10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/mca.h>
13 #include <linux/slab.h>
14 #include <linux/types.h>
38 #define NCR_Q720_VERSION "0.9"
54 .proc_name =
"NCR_Q720",
58 NCR_Q720_intr(
int irq,
void *
data)
70 while((siop =
ffz(sir)) < p->
siops) {
96 version =
readb(vaddr + 0x18) >> 4;
108 device.differential = differential ? 2 : 0;
109 printk(
"Q720 probe unit %d (siop%d) at 0x%lx, diff = %d, vers = %d\n", unit, siop,
110 (
unsigned long)paddr, differential, version);
123 error = scsi_add_host(p->
hosts[siop], p->
dev);
142 static int banner = 1;
143 struct mca_device *mca_dev = to_mca_device(dev);
144 int slot = mca_dev->slot;
147 __u8 pos2, pos4, asr2, asr9, asr10;
156 pos2 = mca_device_read_pos(mca_dev, 2);
159 mca_device_write_pos(mca_dev, 2, pos2);
170 io_base = mca_device_transform_ioport(mca_dev, io_base);
177 i =
inb(io_base) | (
inb(io_base+1)<<8);
179 printk(
KERN_ERR "NCR_Q720, adapter failed to I/O map registers correctly at 0x%x(0x%x)\n", io_base, i);
185 pos4 =
inb(io_base + 4);
188 outb(pos4, io_base + 4);
189 base_addr = (pos4 & 0x7e) << 20;
190 base_addr += (pos4 & 0x80) << 23;
191 asr10 =
inb(io_base + 0x12);
192 base_addr += (asr10 & 0x80) << 24;
193 base_addr += (asr10 & 0x70) << 23;
197 asr9 =
inb(io_base + 0x11);
198 i = (asr9 & 0xc0) >> 6;
202 mem_size = 1 << (19 +
i);
210 outb(asr9, io_base + 0x11);
213 printk(
KERN_ERR "NCR_Q720: Failed to claim memory region 0x%lx\n-0x%lx",
214 (
unsigned long)base_addr,
215 (
unsigned long)(base_addr + mem_size));
223 goto out_release_region;
230 if (IS_ERR(mem_base)) {
231 printk(
"NCR_Q720 failed to reserve memory mapped region\n");
236 asr2 =
inb(io_base + 0x0a);
240 outb(asr2, io_base + 0x0a);
243 siops = ((asr2 & 0xe0) >> 5) + 1;
248 printk(
KERN_ERR "NCR_Q720, adapter failed to memory map registers correctly at 0x%lx(0x%x)\n", (
unsigned long)base_addr, i);
252 irq =
readb(mem_base + 5) & 0x0f;
256 irq = mca_device_transform_irq(mca_dev, irq);
258 printk(
KERN_NOTICE "NCR Q720: found in slot %d irq = %d mem base = 0x%lx siops = %d\n", slot, irq, (
unsigned long)base_addr, siops);
273 for(i = 0; i < siops; i++) {
282 for (i = 0; i < siops; i++) {
291 outb(0xff, port + 0x40);
292 outb(0x07, port + 0x41);
293 if ((err = NCR_Q720_probe_one(p, i, irq, slot,
294 siop_p_base, siop_v_base)) != 0)
295 printk(
"Q720: SIOP%d: probe failed, error = %d\n",
306 mca_device_set_claim(mca_dev, 1);
307 mca_device_set_name(mca_dev,
"NCR_Q720");
330 NCR_Q720_remove(
struct device *dev)
335 for (i = 0; i < p->
siops; i++)
337 NCR_Q720_remove_one(p->
hosts[i]);
348 static struct mca_driver NCR_Q720_driver = {
349 .id_table = NCR_Q720_id_table,
352 .bus = &mca_bus_type,
353 .probe = NCR_Q720_probe,
363 ret = mca_register_driver(&NCR_Q720_driver);
372 mca_unregister_driver(&NCR_Q720_driver);