ata_piix: Add HP Compaq nc6000 to the broken poweroff list
[safe/jmp/linux-2.6] / drivers / scsi / NCR_D700.c
index 5077519..c889d84 100644 (file)
@@ -97,7 +97,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/mca.h>
-#include <linux/interrupt.h>
 #include <asm/io.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_device.h>
@@ -114,7 +113,7 @@ MODULE_DESCRIPTION("NCR Dual700 SCSI Driver");
 MODULE_LICENSE("GPL");
 module_param(NCR_D700, charp, 0);
 
-static __u8 __initdata id_array[2*(MCA_MAX_SLOT_NR + 1)] =
+static __u8 __devinitdata id_array[2*(MCA_MAX_SLOT_NR + 1)] =
        { [0 ... 2*(MCA_MAX_SLOT_NR + 1)-1] = 7 };
 
 #ifdef MODULE
@@ -173,7 +172,7 @@ struct NCR_D700_private {
        char                    pad;
 };
 
-static int 
+static int __devinit
 NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq,
                   int slot, u32 region, int differential)
 {
@@ -181,13 +180,12 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq,
        struct Scsi_Host *host;
        int ret;
 
-       hostdata = kmalloc(sizeof(*hostdata), GFP_KERNEL);
+       hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
        if (!hostdata) {
                printk(KERN_ERR "NCR D700: SIOP%d: Failed to allocate host"
                       "data, detatching\n", siop);
                return -ENOMEM;
        }
-       memset(hostdata, 0, sizeof(*hostdata));
 
        if (!request_region(region, 64, "NCR_D700")) {
                printk(KERN_ERR "NCR D700: Failed to reserve IO region 0x%x\n",
@@ -197,11 +195,10 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq,
        }
                
        /* Fill in the three required pieces of hostdata */
-       hostdata->base = region;
+       hostdata->base = ioport_map(region, 64);
        hostdata->differential = (((1<<siop) & differential) != 0);
        hostdata->clock = NCR_D700_CLOCK_MHZ;
-
-       NCR_700_set_io_mapped(hostdata);
+       hostdata->burst_length = 8;
 
        /* and register the siop */
        host = NCR_700_detect(&NCR_D700_driver_template, hostdata, p->dev);
@@ -214,12 +211,13 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq,
        /* FIXME: read this from SUS */
        host->this_id = id_array[slot * 2 + siop];
        host->irq = irq;
+       host->base = region;
        scsi_scan_host(host);
 
        return 0;
 
  detect_failed:
-       release_region(host->base, 64);
+       release_region(region, 64);
  region_failed:
        kfree(hostdata);
 
@@ -227,14 +225,14 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq,
 }
 
 static int
-NCR_D700_intr(int irq, void *data, struct pt_regs *regs)
+NCR_D700_intr(int irq, void *data)
 {
        struct NCR_D700_private *p = (struct NCR_D700_private *)data;
        int i, found = 0;
 
        for (i = 0; i < 2; i++)
                if (p->hosts[i] &&
-                   NCR_700_intr(irq, p->hosts[i], regs) == IRQ_HANDLED)
+                   NCR_700_intr(irq, p->hosts[i]) == IRQ_HANDLED)
                        found++;
 
        return found ? IRQ_HANDLED : IRQ_NONE;
@@ -244,7 +242,7 @@ NCR_D700_intr(int irq, void *data, struct pt_regs *regs)
  * essentially connectecd to the MCA bus independently, it is easier
  * to set them up as two separate host adapters, rather than one
  * adapter with two channels */
-static int
+static int __devinit
 NCR_D700_probe(struct device *dev)
 {
        struct NCR_D700_private *p;
@@ -315,13 +313,13 @@ NCR_D700_probe(struct device *dev)
                break;
        }
 
-       p = kmalloc(sizeof(*p), GFP_KERNEL);
+       p = kzalloc(sizeof(*p), GFP_KERNEL);
        if (!p)
                return -ENOMEM;
-       memset(p, '\0', sizeof(*p));
+
        p->dev = dev;
-       snprintf(p->name, sizeof(p->name), "D700(%s)", dev->bus_id);
-       if (request_irq(irq, NCR_D700_intr, SA_SHIRQ, p->name, p)) {
+       snprintf(p->name, sizeof(p->name), "D700(%s)", dev_name(dev));
+       if (request_irq(irq, NCR_D700_intr, IRQF_SHARED, p->name, p)) {
                printk(KERN_ERR "D700: request_irq failed\n");
                kfree(p);
                return -EBUSY;
@@ -330,7 +328,7 @@ NCR_D700_probe(struct device *dev)
        for (i = 0; i < 2; i++) {
                int err;
 
-               if ((err = NCR_D700_probe_one(p, i, slot, irq,
+               if ((err = NCR_D700_probe_one(p, i, irq, slot,
                                              offset_addr + (0x80 * i),
                                              differential)) != 0)
                        printk("D700: SIOP%d: probe failed, error = %d\n",
@@ -350,7 +348,7 @@ NCR_D700_probe(struct device *dev)
        return 0;
 }
 
-static void
+static void __devexit
 NCR_D700_remove_one(struct Scsi_Host *host)
 {
        scsi_remove_host(host);
@@ -360,7 +358,7 @@ NCR_D700_remove_one(struct Scsi_Host *host)
        release_region(host->base, 64);
 }
 
-static int
+static int __devexit
 NCR_D700_remove(struct device *dev)
 {
        struct NCR_D700_private *p = dev_get_drvdata(dev);
@@ -381,7 +379,7 @@ static struct mca_driver NCR_D700_driver = {
                .name           = "NCR_D700",
                .bus            = &mca_bus_type,
                .probe          = NCR_D700_probe,
-               .remove         = NCR_D700_remove,
+               .remove         = __devexit_p(NCR_D700_remove),
        },
 };