if (dev->vendor == PCI_VENDOR_ID_AL)
                ata_pci_clear_simplex(dev);
 
-       return ata_pci_init_one(dev, ppi, &generic_sht);
+       return ata_pci_init_one(dev, ppi, &generic_sht, NULL);
 }
 
 static struct pci_device_id ata_generic[] = {
 
 
                if (!host->ops && (pi->port_ops != &ata_dummy_port_ops))
                        host->ops = pi->port_ops;
-               if (!host->private_data && pi->private_data)
-                       host->private_data = pi->private_data;
        }
 
        return host;
 
  *     @pdev: Controller to be initialized
  *     @ppi: array of port_info, must be enough for two ports
  *     @sht: scsi_host_template to use when registering the host
+ *     @host_priv: host private_data
  *
  *     This is a helper function which can be called from a driver's
  *     xxx_init_one() probe function if the hardware uses traditional
  */
 int ata_pci_init_one(struct pci_dev *pdev,
                     const struct ata_port_info * const * ppi,
-                    struct scsi_host_template *sht)
+                    struct scsi_host_template *sht, void *host_priv)
 {
        struct device *dev = &pdev->dev;
        const struct ata_port_info *pi = NULL;
        rc = ata_pci_prepare_sff_host(pdev, ppi, &host);
        if (rc)
                goto out;
+       host->private_data = host_priv;
 
        pci_set_master(pdev);
        rc = ata_pci_activate_sff_host(host, ata_interrupt, sht);
 
                return ATA_CBL_PATA40;
 }
 
-/**
- *     pacpi_error_handler - Setup and error handler
- *     @ap: Port to handle
- *
- *     LOCKING:
- *     None (inherited from caller).
- */
-
-static void pacpi_error_handler(struct ata_port *ap)
-{
-       ata_bmdma_drive_eh(ap, pacpi_pre_reset, ata_std_softreset, NULL,
-                          ata_std_postreset);
-}
-
 /**
  *     pacpi_discover_modes    -       filter non ACPI modes
  *     @adev: ATA device
        .mode_filter            = pacpi_mode_filter,
        .set_piomode            = pacpi_set_piomode,
        .set_dmamode            = pacpi_set_dmamode,
-       .error_handler          = pacpi_error_handler,
+       .prereset               = pacpi_pre_reset,
        .port_start             = pacpi_port_start,
 };
 
                .port_ops       = &pacpi_ops,
        };
        const struct ata_port_info *ppi[] = { &info, NULL };
-       return ata_pci_init_one(pdev, ppi, &pacpi_sht);
+       return ata_pci_init_one(pdev, ppi, &pacpi_sht, NULL);
 }
 
 static const struct pci_device_id pacpi_pci_tbl[] = {
 
                        ppi[0] = &info_20_udma;
                pci_dev_put(isa_bridge);
        }
-       return ata_pci_init_one(pdev, ppi, &ali_sht);
+       return ata_pci_init_one(pdev, ppi, &ali_sht, NULL);
 }
 
 #ifdef CONFIG_PM
 
        return ata_std_prereset(link, deadline);
 }
 
-static void amd_error_handler(struct ata_port *ap)
-{
-       ata_bmdma_drive_eh(ap, amd_pre_reset, ata_std_softreset, NULL,
-                          ata_std_postreset);
-}
-
 static int amd_cable_detect(struct ata_port *ap)
 {
        static const u32 bitmask[2] = {0x03, 0x0C};
        return ata_std_prereset(link, deadline);
 }
 
-static void nv_error_handler(struct ata_port *ap)
-{
-       ata_bmdma_drive_eh(ap, nv_pre_reset,
-                              ata_std_softreset, NULL,
-                              ata_std_postreset);
-}
-
 /**
  *     nv100_set_piomode       -       set initial PIO mode data
  *     @ap: ATA interface
 
 static const struct ata_port_operations amd_base_port_ops = {
        .inherits       = &ata_bmdma_port_ops,
-       .error_handler  = amd_error_handler,
+       .prereset       = amd_pre_reset,
 };
 
 static struct ata_port_operations amd33_port_ops = {
        .inherits       = &ata_bmdma_port_ops,
        .cable_detect   = ata_cable_ignore,
        .mode_filter    = nv_mode_filter,
-       .error_handler  = nv_error_handler,
+       .prereset       = nv_pre_reset,
        .host_stop      = nv_host_stop,
 };
 
                        .port_ops = &amd100_port_ops
                }
        };
-       struct ata_port_info pi;
-       const struct ata_port_info *ppi[] = { &pi, NULL };
+       const struct ata_port_info *ppi[] = { NULL, NULL };
        static int printed_version;
        int type = id->driver_data;
+       void *hpriv = NULL;
        u8 fifo;
        int rc;
 
        /*
         * Okay, type is determined now.  Apply type-specific workarounds.
         */
-       pi = info[type];
+       ppi[0] = &info[type];
 
        if (type < 3)
                ata_pci_clear_simplex(pdev);
                u32 udma;
 
                pci_read_config_dword(pdev, 0x60, &udma);
-               pi.private_data = (void *)(unsigned long)udma;
+               hpriv = (void *)(unsigned long)udma;
        }
 
        /* And fire it up */
-       return ata_pci_init_one(pdev, ppi, &amd_sht);
+       return ata_pci_init_one(pdev, ppi, &amd_sht, hpriv);
 }
 
 #ifdef CONFIG_PM
 
 
        BUG_ON(ppi[0] == NULL);
 
-       return ata_pci_init_one(pdev, ppi, &artop_sht);
+       return ata_pci_init_one(pdev, ppi, &artop_sht, NULL);
 }
 
 static const struct pci_device_id artop_pci_tbl[] = {
 
                .port_ops = &atiixp_port_ops
        };
        const struct ata_port_info *ppi[] = { &info, NULL };
-       return ata_pci_init_one(dev, ppi, &atiixp_sht);
+       return ata_pci_init_one(dev, ppi, &atiixp_sht, NULL);
 }
 
 static const struct pci_device_id atiixp[] = {
 
 
        cmd640_hardware_init(pdev);
 
-       return ata_pci_init_one(pdev, ppi, &cmd640_sht);
+       return ata_pci_init_one(pdev, ppi, &cmd640_sht, NULL);
 }
 
 #ifdef CONFIG_PM
 
        pci_write_config_byte(pdev, UDIDETCR0, 0xF0);
 #endif
 
-       return ata_pci_init_one(pdev, ppi, &cmd64x_sht);
+       return ata_pci_init_one(pdev, ppi, &cmd64x_sht, NULL);
 }
 
 #ifdef CONFIG_PM
 
                ppi[1] = &info_palmax_secondary;
 
        /* Now kick off ATA set up */
-       return ata_pci_init_one(pdev, ppi, &cs5530_sht);
+       return ata_pci_init_one(pdev, ppi, &cs5530_sht, NULL);
 }
 
 #ifdef CONFIG_PM
 
        rdmsr(ATAC_CH0D1_PIO, timings, dummy);
        if (CS5535_BAD_PIO(timings))
                wrmsr(ATAC_CH0D1_PIO, 0xF7F4F7F4UL, 0);
-       return ata_pci_init_one(dev, ppi, &cs5535_sht);
+       return ata_pci_init_one(dev, ppi, &cs5535_sht, NULL);
 }
 
 static const struct pci_device_id cs5535[] = {
 
                return -ENODEV;
        }
 
-       return ata_pci_init_one(dev, ppi, &cs5536_sht);
+       return ata_pci_init_one(dev, ppi, &cs5536_sht, NULL);
 }
 
 static const struct pci_device_id cs5536[] = {
 
        if (PCI_FUNC(pdev->devfn) != 1)
                return -ENODEV;
 
-       return ata_pci_init_one(pdev, ppi, &cy82c693_sht);
+       return ata_pci_init_one(pdev, ppi, &cy82c693_sht, NULL);
 }
 
 static const struct pci_device_id cy82c693[] = {
 
                dev_printk(KERN_DEBUG, &pdev->dev,
                           "version " DRV_VERSION "\n");
 
-       return ata_pci_init_one(pdev, ppi, &efar_sht);
+       return ata_pci_init_one(pdev, ppi, &efar_sht, NULL);
 }
 
 static const struct pci_device_id efar_pci_tbl[] = {
 
                .udma_mask = ATA_UDMA4,
                .port_ops = &hpt366_port_ops
        };
-       struct ata_port_info info = info_hpt366;
-       const struct ata_port_info *ppi[] = { &info, NULL };
+       const struct ata_port_info *ppi[] = { &info_hpt366, NULL };
 
+       void *hpriv = NULL;
        u32 class_rev;
        u32 reg1;
        int rc;
        /* info_hpt366 is safe against re-entry so we can scribble on it */
        switch((reg1 & 0x700) >> 8) {
                case 5:
-                       info.private_data = &hpt366_40;
+                       hpriv = &hpt366_40;
                        break;
                case 9:
-                       info.private_data = &hpt366_25;
+                       hpriv = &hpt366_25;
                        break;
                default:
-                       info.private_data = &hpt366_33;
+                       hpriv = &hpt366_33;
                        break;
        }
        /* Now kick off ATA set up */
-       return ata_pci_init_one(dev, ppi, &hpt36x_sht);
+       return ata_pci_init_one(dev, ppi, &hpt36x_sht, hpriv);
 }
 
 #ifdef CONFIG_PM
 
        };
 
        static const int MHz[4] = { 33, 40, 50, 66 };
-       const struct ata_port_info *port;
        void *private_data = NULL;
-       struct ata_port_info port_info;
-       const struct ata_port_info *ppi[] = { &port_info, NULL };
+       const struct ata_port_info *ppi[] = { NULL, NULL };
 
        u8 irqmask;
        u32 class_rev;
 
                switch(class_rev) {
                        case 3:
-                               port = &info_hpt370;
+                               ppi[0] = &info_hpt370;
                                chip_table = &hpt370;
                                prefer_dpll = 0;
                                break;
                        case 4:
-                               port = &info_hpt370a;
+                               ppi[0] = &info_hpt370a;
                                chip_table = &hpt370a;
                                prefer_dpll = 0;
                                break;
                        case 5:
-                               port = &info_hpt372;
+                               ppi[0] = &info_hpt372;
                                chip_table = &hpt372;
                                break;
                        default:
                                /* 372N if rev >= 2*/
                                if (class_rev >= 2)
                                        return -ENODEV;
-                               port = &info_hpt372;
+                               ppi[0] = &info_hpt372;
                                chip_table = &hpt372a;
                                break;
                        case PCI_DEVICE_ID_TTI_HPT302:
                                /* 302N if rev > 1 */
                                if (class_rev > 1)
                                        return -ENODEV;
-                               port = &info_hpt372;
+                               ppi[0] = &info_hpt372;
                                /* Check this */
                                chip_table = &hpt302;
                                break;
                        case PCI_DEVICE_ID_TTI_HPT371:
                                if (class_rev > 1)
                                        return -ENODEV;
-                               port = &info_hpt372;
+                               ppi[0] = &info_hpt372;
                                chip_table = &hpt371;
                                /* Single channel device, master is not present
                                   but the BIOS (or us for non x86) must mark it
                                break;
                        case PCI_DEVICE_ID_TTI_HPT374:
                                chip_table = &hpt374;
-                               port = &info_hpt374;
+                               ppi[0] = &info_hpt374;
                                break;
                        default:
                                printk(KERN_ERR "pata_hpt37x: PCI table is bogus please report (%d).\n", dev->device);
                int dpll, adjust;
 
                /* Compute DPLL */
-               dpll = (port->udma_mask & 0xC0) ? 3 : 2;
+               dpll = (ppi[0]->udma_mask & 0xC0) ? 3 : 2;
 
                f_low = (MHz[clock_slot] * 48) / MHz[dpll];
                f_high = f_low + 2;
                 *      about lack of UDMA133 support on lower clocks
                 */
 
-               if (clock_slot < 2 && port == &info_hpt370)
-                       port = &info_hpt370_33;
-               if (clock_slot < 2 && port == &info_hpt370a)
-                       port = &info_hpt370a_33;
+               if (clock_slot < 2 && ppi[0] == &info_hpt370)
+                       ppi[0] = &info_hpt370_33;
+               if (clock_slot < 2 && ppi[0] == &info_hpt370a)
+                       ppi[0] = &info_hpt370a_33;
                printk(KERN_INFO "pata_hpt37x: %s using %dMHz bus clock.\n",
                       chip_table->name, MHz[clock_slot]);
        }
 
        /* Now kick off ATA set up */
-       port_info = *port;
-       port_info.private_data = private_data;
-
-       return ata_pci_init_one(dev, ppi, &hpt37x_sht);
+       return ata_pci_init_one(dev, ppi, &hpt37x_sht, private_data);
 }
 
 static const struct pci_device_id hpt37x[] = {
 
                .udma_mask = ATA_UDMA6,
                .port_ops = &hpt3x2n_port_ops
        };
-       struct ata_port_info port = info;
-       const struct ata_port_info *ppi[] = { &port, NULL };
+       const struct ata_port_info *ppi[] = { &info, NULL };
 
        u8 irqmask;
        u32 class_rev;
        unsigned int f_low, f_high;
        int adjust;
        unsigned long iobase = pci_resource_start(dev, 4);
+       void *hpriv = NULL;
        int rc;
 
        rc = pcim_enable_device(dev);
               pci_mhz);
        /* Set our private data up. We only need a few flags so we use
           it directly */
-       port.private_data = NULL;
        if (pci_mhz > 60) {
-               port.private_data = (void *)PCI66;
+               hpriv = (void *)PCI66;
                /*
                 * On  HPT371N, if ATA clock is 66 MHz we must set bit 2 in
                 * the MISC. register to stretch the UltraDMA Tss timing.
        }
 
        /* Now kick off ATA set up */
-       return ata_pci_init_one(dev, ppi, &hpt3x2n_sht);
+       return ata_pci_init_one(dev, ppi, &hpt3x2n_sht, hpriv);
 }
 
 static const struct pci_device_id hpt3x2n[] = {
 
                dev_printk(KERN_DEBUG, &pdev->dev,
                           "version " DRV_VERSION "\n");
 
-       return ata_pci_init_one(pdev, ppi, &it8213_sht);
+       return ata_pci_init_one(pdev, ppi, &it8213_sht, NULL);
 }
 
 static const struct pci_device_id it8213_pci_tbl[] = {
 
        else
                ppi[0] = &info_smart;
 
-       return ata_pci_init_one(pdev, ppi, &it821x_sht);
+       return ata_pci_init_one(pdev, ppi, &it821x_sht, NULL);
 }
 
 #ifdef CONFIG_PM
 
        return ata_std_prereset(link, deadline);
 }
 
-/**
- *     jmicron_error_handler - Setup and error handler
- *     @ap: Port to handle
- *
- *     LOCKING:
- *     None (inherited from caller).
- */
-
-static void jmicron_error_handler(struct ata_port *ap)
-{
-       ata_bmdma_drive_eh(ap, jmicron_pre_reset, ata_std_softreset, NULL,
-                          ata_std_postreset);
-}
-
 /* No PIO or DMA methods needed for this device */
 
 static struct scsi_host_template jmicron_sht = {
 
 static struct ata_port_operations jmicron_ops = {
        .inherits               = &ata_bmdma_port_ops,
-       .error_handler          = jmicron_error_handler,
+       .prereset               = jmicron_pre_reset,
 };
 
 
        };
        const struct ata_port_info *ppi[] = { &info, NULL };
 
-       return ata_pci_init_one(pdev, ppi, &jmicron_sht);
+       return ata_pci_init_one(pdev, ppi, &jmicron_sht, NULL);
 }
 
 static const struct pci_device_id jmicron_pci_tbl[] = {
 
        return 0;       /* Our BUG macro needs the right markup */
 }
 
-/**
- *     marvell_error_handler - Setup and error handler
- *     @ap: Port to handle
- *
- *     LOCKING:
- *     None (inherited from caller).
- */
-
-static void marvell_error_handler(struct ata_port *ap)
-{
-       ata_bmdma_drive_eh(ap, marvell_pre_reset, ata_std_softreset, NULL,
-                          ata_std_postreset);
-}
-
 /* No PIO or DMA methods needed for this device */
 
 static struct scsi_host_template marvell_sht = {
 static struct ata_port_operations marvell_ops = {
        .inherits               = &ata_bmdma_port_ops,
        .cable_detect           = marvell_cable_detect,
-       .error_handler          = marvell_error_handler,
+       .prereset               = marvell_pre_reset,
 };
 
 
        if (pdev->device == 0x6101)
                ppi[1] = &ata_dummy_port_info;
 
-       return ata_pci_init_one(pdev, ppi, &marvell_sht);
+       return ata_pci_init_one(pdev, ppi, &marvell_sht, NULL);
 }
 
 static const struct pci_device_id marvell_pci_tbl[] = {
 
        ata_pci_clear_simplex(pdev);
 
        /* And let the library code do the work */
-       return ata_pci_init_one(pdev, port_info, &netcell_sht);
+       return ata_pci_init_one(pdev, port_info, &netcell_sht, NULL);
 }
 
 static const struct pci_device_id netcell_pci_tbl[] = {
 
                .port_ops = &ns87410_port_ops
        };
        const struct ata_port_info *ppi[] = { &info, NULL };
-       return ata_pci_init_one(dev, ppi, &ns87410_sht);
+       return ata_pci_init_one(dev, ppi, &ns87410_sht, NULL);
 }
 
 static const struct pci_device_id ns87410[] = {
 
        pci_write_config_byte(pdev, 0x55, 0xEE);
        /* Select PIO0 8bit clocking */
        pci_write_config_byte(pdev, 0x54, 0xB7);
-       return ata_pci_init_one(pdev, ppi, &ns87415_sht);
+       return ata_pci_init_one(pdev, ppi, &ns87415_sht, NULL);
 }
 
 static const struct pci_device_id ns87415_pci_tbl[] = {
 
                dev_printk(KERN_DEBUG, &pdev->dev,
                           "version " DRV_VERSION "\n");
 
-       return ata_pci_init_one(pdev, ppi, &oldpiix_sht);
+       return ata_pci_init_one(pdev, ppi, &oldpiix_sht, NULL);
 }
 
 static const struct pci_device_id oldpiix_pci_tbl[] = {
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &dev->dev, "version " DRV_VERSION "\n");
 
-       return ata_pci_init_one(dev, ppi, &opti_sht);
+       return ata_pci_init_one(dev, ppi, &opti_sht, NULL);
 }
 
 static const struct pci_device_id opti[] = {
 
        if (optiplus_with_udma(dev))
                ppi[0] = &info_82c700_udma;
 
-       return ata_pci_init_one(dev, ppi, &optidma_sht);
+       return ata_pci_init_one(dev, ppi, &optidma_sht, NULL);
 }
 
 static const struct pci_device_id optidma[] = {
 
                                return -ENODEV;
                }
        }
-       return ata_pci_init_one(dev, ppi, &pdc202xx_sht);
+       return ata_pci_init_one(dev, ppi, &pdc202xx_sht, NULL);
 }
 
 static const struct pci_device_id pdc202xx[] = {
 
                dev_printk(KERN_DEBUG, &pdev->dev,
                           "version " DRV_VERSION "\n");
 
-       return ata_pci_init_one(pdev, ppi, &radisys_sht);
+       return ata_pci_init_one(pdev, ppi, &radisys_sht, NULL);
 }
 
 static const struct pci_device_id radisys_pci_tbl[] = {
 
                printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
 
        if (rz1000_fifo_disable(pdev) == 0)
-               return ata_pci_init_one(pdev, ppi, &rz1000_sht);
+               return ata_pci_init_one(pdev, ppi, &rz1000_sht, NULL);
 
        printk(KERN_ERR DRV_NAME ": failed to disable read-ahead on chipset..\n");
        /* Not safe to use so skip */
 
        /* Can't enable port 2 yet, see top comments */
        const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info };
 
-       return ata_pci_init_one(dev, ppi, &sc1200_sht);
+       return ata_pci_init_one(dev, ppi, &sc1200_sht, NULL);
 }
 
 static const struct pci_device_id sc1200[] = {
 
        if (pdev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE)
                ata_pci_clear_simplex(pdev);
 
-       return ata_pci_init_one(pdev, ppi, &serverworks_sht);
+       return ata_pci_init_one(pdev, ppi, &serverworks_sht, NULL);
 }
 
 #ifdef CONFIG_PM
 
                                 &sil680_sht);
 
 use_ioports:
-       return ata_pci_init_one(pdev, ppi, &sil680_sht);
+       return ata_pci_init_one(pdev, ppi, &sil680_sht, NULL);
 }
 
 #ifdef CONFIG_PM
 
 static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_port_info port;
-       const struct ata_port_info *ppi[] = { &port, NULL };
+       const struct ata_port_info *ppi[] = { NULL, NULL };
        struct pci_dev *host = NULL;
        struct sis_chipset *chipset = NULL;
        struct sis_chipset *sets;
        if (chipset == NULL)
                return -ENODEV;
 
-       port = *chipset->info;
-       port.private_data = chipset;
+       ppi[0] = chipset->info;
 
        sis_fixup(pdev, chipset);
 
-       return ata_pci_init_one(pdev, ppi, &sis_sht);
+       return ata_pci_init_one(pdev, ppi, &sis_sht, chipset);
 }
 
 static const struct pci_device_id sis_pci_tbl[] = {
 
        val |= CTRL_P0EN | CTRL_P0F16 | CTRL_P1F16;
        pci_write_config_dword(dev, 0x40, val);
 
-       return ata_pci_init_one(dev, ppi, &sl82c105_sht);
+       return ata_pci_init_one(dev, ppi, &sl82c105_sht, NULL);
 }
 
 static const struct pci_device_id sl82c105[] = {
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &dev->dev, "version " DRV_VERSION "\n");
 
-       return ata_pci_init_one(dev, ppi, &triflex_sht);
+       return ata_pci_init_one(dev, ppi, &triflex_sht, NULL);
 }
 
 static const struct pci_device_id triflex[] = {
 
                .udma_mask = ATA_UDMA6, /* FIXME: should check north bridge */
                .port_ops = &via_port_ops
        };
-       struct ata_port_info type;
-       const struct ata_port_info *ppi[] = { &type, NULL };
+       const struct ata_port_info *ppi[] = { NULL, NULL };
        struct pci_dev *isa = NULL;
        const struct via_isa_bridge *config;
        static int printed_version;
        switch(config->flags & VIA_UDMA) {
                case VIA_UDMA_NONE:
                        if (config->flags & VIA_NO_UNMASK)
-                               type = via_mwdma_info_borked;
+                               ppi[0] = &via_mwdma_info_borked;
                        else
-                               type = via_mwdma_info;
+                               ppi[0] = &via_mwdma_info;
                        break;
                case VIA_UDMA_33:
-                       type = via_udma33_info;
+                       ppi[0] = &via_udma33_info;
                        break;
                case VIA_UDMA_66:
-                       type = via_udma66_info;
+                       ppi[0] = &via_udma66_info;
                        /* The 66 MHz devices require we enable the clock */
                        pci_read_config_dword(pdev, 0x50, &timing);
                        timing |= 0x80008;
                        pci_write_config_dword(pdev, 0x50, timing);
                        break;
                case VIA_UDMA_100:
-                       type = via_udma100_info;
+                       ppi[0] = &via_udma100_info;
                        break;
                case VIA_UDMA_133:
-                       type = via_udma133_info;
+                       ppi[0] = &via_udma133_info;
                        break;
                default:
                        WARN_ON(1);
        }
 
        /* We have established the device type, now fire it up */
-       type.private_data = (void *)config;
-
-       return ata_pci_init_one(pdev, ppi, &via_sht);
+       return ata_pci_init_one(pdev, ppi, &via_sht, (void *)config);
 }
 
 #ifdef CONFIG_PM
 
 
 extern int ata_pci_init_one(struct pci_dev *pdev,
                            const struct ata_port_info * const * ppi,
-                           struct scsi_host_template *sht);
+                           struct scsi_host_template *sht, void *host_priv);
 extern void ata_pci_remove_one(struct pci_dev *pdev);
 #ifdef CONFIG_PM
 extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg);