X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fscsi%2FNCR_Q720.c;h=778844c3544a81c61caa39b92351f0c90735b6dd;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=d47a86ef5ebd47329a7fb37ed2503b26762ac6d4;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/drivers/scsi/NCR_Q720.c b/drivers/scsi/NCR_Q720.c index d47a86ef5..778844c35 100644 --- a/drivers/scsi/NCR_Q720.c +++ b/drivers/scsi/NCR_Q720.c @@ -39,7 +39,7 @@ MODULE_LICENSE("GPL"); /* We needs this helper because we have up to four hosts per struct device */ struct NCR_Q720_private { struct device *dev; - __u32 mem_base; + void __iomem * mem_base; __u32 phys_mem_base; __u32 mem_size; __u8 irq; @@ -48,13 +48,13 @@ struct NCR_Q720_private { struct Scsi_Host *hosts[4]; }; -struct scsi_host_template NCR_Q720_tpnt = { +static struct scsi_host_template NCR_Q720_tpnt = { .module = THIS_MODULE, .proc_name = "NCR_Q720", }; static irqreturn_t -NCR_Q720_intr(int irq, void *data, struct pt_regs * regs) +NCR_Q720_intr(int irq, void *data) { struct NCR_Q720_private *p = (struct NCR_Q720_private *)data; __u8 sir = (readb(p->mem_base + 0x0d) & 0xf0) >> 4; @@ -68,14 +68,14 @@ NCR_Q720_intr(int irq, void *data, struct pt_regs * regs) while((siop = ffz(sir)) < p->siops) { sir |= 1<hosts[siop], regs); + ncr53c8xx_intr(irq, p->hosts[siop]); } return IRQ_HANDLED; } static int __init NCR_Q720_probe_one(struct NCR_Q720_private *p, int siop, - int irq, int slot, __u32 paddr, __u32 vaddr) + int irq, int slot, __u32 paddr, void __iomem *vaddr) { struct ncr_device device; __u8 scsi_id; @@ -146,7 +146,7 @@ NCR_Q720_probe(struct device *dev) __u8 pos2, pos4, asr2, asr9, asr10; __u16 io_base; __u32 base_addr, mem_size; - __u32 mem_base; + void __iomem *mem_base; p = kmalloc(sizeof(*p), GFP_KERNEL); if (!p) @@ -216,7 +216,21 @@ NCR_Q720_probe(struct device *dev) goto out_free; } - mem_base = (__u32)ioremap(base_addr, mem_size); + if (dma_declare_coherent_memory(dev, base_addr, base_addr, + mem_size, DMA_MEMORY_MAP) + != DMA_MEMORY_MAP) { + printk(KERN_ERR "NCR_Q720: DMA declare memory failed\n"); + goto out_release_region; + } + + /* The first 1k of the memory buffer is a memory map of the registers + */ + mem_base = dma_mark_declared_memory_occupied(dev, base_addr, + 1024); + if (IS_ERR(mem_base)) { + printk("NCR_Q720 failed to reserve memory mapped region\n"); + goto out_release; + } /* now also enable accesses in asr 2 */ asr2 = inb(io_base + 0x0a); @@ -251,13 +265,13 @@ NCR_Q720_probe(struct device *dev) p->irq = irq; p->siops = siops; - if (request_irq(irq, NCR_Q720_intr, SA_SHIRQ, "NCR_Q720", p)) { + if (request_irq(irq, NCR_Q720_intr, IRQF_SHARED, "NCR_Q720", p)) { printk(KERN_ERR "NCR_Q720: request irq %d failed\n", irq); goto out_release; } /* disable all the siop interrupts */ for(i = 0; i < siops; i++) { - __u32 reg_scsr1 = mem_base + NCR_Q720_CHIP_REGISTER_OFFSET + void __iomem *reg_scsr1 = mem_base + NCR_Q720_CHIP_REGISTER_OFFSET + i*NCR_Q720_SIOP_SHIFT + NCR_Q720_SCSR_OFFSET + 1; __u8 scsr1 = readb(reg_scsr1); scsr1 |= 0x01; @@ -266,7 +280,7 @@ NCR_Q720_probe(struct device *dev) /* plumb in all 720 chips */ for (i = 0; i < siops; i++) { - __u32 siop_v_base = mem_base + NCR_Q720_CHIP_REGISTER_OFFSET + void __iomem *siop_v_base = mem_base + NCR_Q720_CHIP_REGISTER_OFFSET + i*NCR_Q720_SIOP_SHIFT; __u32 siop_p_base = base_addr + NCR_Q720_CHIP_REGISTER_OFFSET + i*NCR_Q720_SIOP_SHIFT; @@ -296,7 +310,8 @@ NCR_Q720_probe(struct device *dev) return 0; out_release: - iounmap((void *)mem_base); + dma_release_declared_memory(dev); + out_release_region: release_mem_region(base_addr, mem_size); out_free: kfree(p); @@ -321,7 +336,7 @@ NCR_Q720_remove(struct device *dev) if(p->hosts[i]) NCR_Q720_remove_one(p->hosts[i]); - iounmap((void *)p->mem_base); + dma_release_declared_memory(dev); release_mem_region(p->phys_mem_base, p->mem_size); free_irq(p->irq, p); kfree(p); @@ -330,7 +345,7 @@ NCR_Q720_remove(struct device *dev) static short NCR_Q720_id_table[] = { NCR_Q720_MCA_ID, 0 }; -struct mca_driver NCR_Q720_driver = { +static struct mca_driver NCR_Q720_driver = { .id_table = NCR_Q720_id_table, .driver = { .name = "NCR_Q720", @@ -343,13 +358,19 @@ struct mca_driver NCR_Q720_driver = { static int __init NCR_Q720_init(void) { - return mca_register_driver(&NCR_Q720_driver); + int ret = ncr53c8xx_init(); + if (!ret) + ret = mca_register_driver(&NCR_Q720_driver); + if (ret) + ncr53c8xx_exit(); + return ret; } static void __exit NCR_Q720_exit(void) { mca_unregister_driver(&NCR_Q720_driver); + ncr53c8xx_exit(); } module_init(NCR_Q720_init);