lkml.org 
[lkml]   [2012]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[git patches] libata updates

    Please pull 641589bff714f39b33ef1d7f02eaa009f2993b64 from
    git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git tags/upstream

    (text copied from the upstream-linus tag)
    Notable changes:

    * Updating libata to directly bind with ACPI / runtime power mgmt.
    This is a pre-req for SATA ZPODD (CD-ROM power management).

    Touches ACPI (exports++) and SCSI in minor ways. Has been in linux-next
    for weeks.

    The rest of [ZPODD] will probably come via SCSI tree, as it involves
    a lot of updates to the 'sr' driver etc.

    Other, minor changes:

    * module_pci_driver() removes a lot of common boilerplate from each
    PCI driver

    * minor coding style, whitespace cleanups

    * pata_pcmcia bug fix, caught by Coccinelle

    * pata_imx, sata_dwc_460ex minor vendor updates

    * ahci_platform: use simple PM ops, and thereby add hibernation cb's

    * Add a few device-specific quirks


    to receive the following updates:

    drivers/acpi/glue.c | 4 +-
    drivers/acpi/power.c | 2 +
    drivers/acpi/sleep.c | 2 +
    drivers/ata/acard-ahci.c | 13 +--
    drivers/ata/ahci.c | 63 +++----
    drivers/ata/ahci_platform.c | 10 +-
    drivers/ata/ata_generic.c | 15 +--
    drivers/ata/libata-acpi.c | 408 ++++++++++++++++++++++++++++-----------
    drivers/ata/libata-core.c | 12 +-
    drivers/ata/libata-eh.c | 2 +-
    drivers/ata/libata-pmp.c | 4 -
    drivers/ata/libata-scsi.c | 3 +
    drivers/ata/libata-transport.c | 6 +-
    drivers/ata/libata.h | 15 +-
    drivers/ata/pata_acpi.c | 18 +--
    drivers/ata/pata_amd.c | 13 +--
    drivers/ata/pata_artop.c | 13 +--
    drivers/ata/pata_atiixp.c | 14 +--
    drivers/ata/pata_atp867x.c | 13 +--
    drivers/ata/pata_cmd640.c | 13 +--
    drivers/ata/pata_cmd64x.c | 17 +--
    drivers/ata/pata_cs5520.c | 14 +--
    drivers/ata/pata_cs5530.c | 13 +--
    drivers/ata/pata_cs5535.c | 13 +--
    drivers/ata/pata_cs5536.c | 13 +--
    drivers/ata/pata_cypress.c | 15 +--
    drivers/ata/pata_efar.c | 14 +--
    drivers/ata/pata_hpt366.c | 13 +--
    drivers/ata/pata_hpt37x.c | 13 +--
    drivers/ata/pata_hpt3x2n.c | 13 +--
    drivers/ata/pata_hpt3x3.c | 15 +--
    drivers/ata/pata_imx.c | 10 +-
    drivers/ata/pata_it8213.c | 13 +--
    drivers/ata/pata_it821x.c | 14 +--
    drivers/ata/pata_jmicron.c | 13 +--
    drivers/ata/pata_marvell.c | 14 +--
    drivers/ata/pata_mpiix.c | 13 +--
    drivers/ata/pata_netcell.c | 14 +--
    drivers/ata/pata_ninja32.c | 13 +--
    drivers/ata/pata_ns87410.c | 13 +--
    drivers/ata/pata_ns87415.c | 13 +--
    drivers/ata/pata_oldpiix.c | 14 +--
    drivers/ata/pata_opti.c | 14 +--
    drivers/ata/pata_optidma.c | 13 +--
    drivers/ata/pata_pcmcia.c | 3 +-
    drivers/ata/pata_pdc2027x.c | 19 +--
    drivers/ata/pata_pdc202xx_old.c | 13 +--
    drivers/ata/pata_piccolo.c | 16 +--
    drivers/ata/pata_radisys.c | 14 +--
    drivers/ata/pata_rdc.c | 13 +--
    drivers/ata/pata_rz1000.c | 14 +--
    drivers/ata/pata_sc1200.c | 13 +--
    drivers/ata/pata_scc.c | 21 +--
    drivers/ata/pata_sch.c | 13 +--
    drivers/ata/pata_serverworks.c | 13 +--
    drivers/ata/pata_sil680.c | 13 +--
    drivers/ata/pata_sis.c | 14 +--
    drivers/ata/pata_sl82c105.c | 13 +--
    drivers/ata/pata_triflex.c | 13 +--
    drivers/ata/pata_via.c | 13 +--
    drivers/ata/pdc_adma.c | 13 +--
    drivers/ata/sata_dwc_460ex.c | 72 +++++--
    drivers/ata/sata_inic162x.c | 13 +--
    drivers/ata/sata_nv.c | 13 +--
    drivers/ata/sata_promise.c | 13 +--
    drivers/ata/sata_qstor.c | 13 +--
    drivers/ata/sata_sil.c | 14 +--
    drivers/ata/sata_sil24.c | 13 +--
    drivers/ata/sata_sis.c | 13 +--
    drivers/ata/sata_svw.c | 13 +--
    drivers/ata/sata_sx4.c | 16 +--
    drivers/ata/sata_uli.c | 14 +--
    drivers/ata/sata_via.c | 13 +--
    drivers/ata/sata_vsc.c | 13 +--
    drivers/scsi/scsi_lib.c | 17 ++
    include/linux/ata.h | 1 +
    include/linux/libata.h | 9 +-
    include/scsi/scsi.h | 10 +
    include/scsi/scsi_device.h | 1 +
    79 files changed, 510 insertions(+), 959 deletions(-)
    mode change 100644 => 100755 drivers/ata/sata_dwc_460ex.c

    Aaron Lu (1):
    libata: tell scsi layer device supports runtime power off

    Axel Lin (1):
    ata: use module_pci_driver

    Daniel J Blueman (1):
    [libata] Prevent interface errors with Seagate FreeAgent GoFlex

    Fabio Estevam (1):
    pata_imx: Convert to clk_prepare_enable/clk_disable_unprepare

    H Hartley Sweeten (2):
    libata-transport.c: local functions should not be exposed globally
    libata-eh.c: local functions should not be exposed globally

    Holger Macht (1):
    [SCSI] add wrapper to access and set scsi_bus_type in struct acpi_bus_type

    Jeff Garzik (2):
    drivers/acpi/glue: revert accidental license-related 6b66d95895c bits
    [libata] pata_cmd64x: whitespace cleanup

    Jeffrin Jose (1):
    ahci, trivial: fixed coding style issues related to braces

    Julia Lawall (1):
    drivers/ata/pata_pcmcia.c: adjust suspicious bit operation

    Lin Ming (5):
    libata-acpi: set acpi state for SATA port
    libata-acpi: add ata port runtime D3Cold support
    libata-acpi: register/unregister device to/from power resource
    libata: detect Device Attention support
    libata-acpi: add missing inlines in libata.h

    Mark Nelson (1):
    ahci: Enable SB600 64bit DMA on MSI K9AGM2 (MS-7327) v2

    Matthew Garrett (2):
    libata: bind the Linux device tree to the ACPI device tree
    libata: migrate ACPI code over to new bindings

    Shiraz Hashim (1):
    ahci_platform: add hibernation callbacks

    Stephen Rothwell (1):
    libata-acpi: fix up for acpi_pm_device_sleep_state API

    Thang Q. Nguyen (2):
    sata_dwc_460ex: support hardreset
    sata_dwc_460ex: device tree may specify dma_channel

    diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
    index 1564e09..243ee85 100644
    --- a/drivers/acpi/glue.c
    +++ b/drivers/acpi/glue.c
    @@ -39,6 +39,7 @@ int register_acpi_bus_type(struct acpi_bus_type *type)
    }
    return -ENODEV;
    }
    +EXPORT_SYMBOL_GPL(register_acpi_bus_type);

    int unregister_acpi_bus_type(struct acpi_bus_type *type)
    {
    @@ -54,6 +55,7 @@ int unregister_acpi_bus_type(struct acpi_bus_type *type)
    }
    return -ENODEV;
    }
    +EXPORT_SYMBOL_GPL(unregister_acpi_bus_type);

    static struct acpi_bus_type *acpi_get_bus_type(struct bus_type *type)
    {
    @@ -69,7 +71,6 @@ static struct acpi_bus_type *acpi_get_bus_type(struct bus_type *type)
    up_read(&bus_type_sem);
    return ret;
    }
    -EXPORT_SYMBOL_GPL(register_acpi_bus_type);

    static int acpi_find_bridge_device(struct device *dev, acpi_handle * handle)
    {
    @@ -86,7 +87,6 @@ static int acpi_find_bridge_device(struct device *dev, acpi_handle * handle)
    up_read(&bus_type_sem);
    return ret;
    }
    -EXPORT_SYMBOL_GPL(unregister_acpi_bus_type);

    /* Get device's handler per its address under its parent */
    struct acpi_find_child {
    diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
    index 894d45c..215ecd0 100644
    --- a/drivers/acpi/power.c
    +++ b/drivers/acpi/power.c
    @@ -392,6 +392,7 @@ void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handl
    __acpi_power_resource_unregister_device(dev,
    list->handles[i]);
    }
    +EXPORT_SYMBOL_GPL(acpi_power_resource_unregister_device);

    static int __acpi_power_resource_register_device(
    struct acpi_power_managed_device *powered_device, acpi_handle handle)
    @@ -462,6 +463,7 @@ no_power_resource:
    printk(KERN_WARNING PREFIX "Invalid Power Resource to register!");
    return -ENODEV;
    }
    +EXPORT_SYMBOL_GPL(acpi_power_resource_register_device);

    /**
    * acpi_device_sleep_wake - execute _DSW (Device Sleep Wake) or (deprecated in
    diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
    index 1cc02ca..028dd42 100644
    --- a/drivers/acpi/sleep.c
    +++ b/drivers/acpi/sleep.c
    @@ -809,6 +809,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in)
    }
    return d_max;
    }
    +EXPORT_SYMBOL(acpi_pm_device_sleep_state);
    #endif /* CONFIG_PM */

    #ifdef CONFIG_PM_SLEEP
    @@ -845,6 +846,7 @@ int acpi_pm_device_run_wake(struct device *phys_dev, bool enable)

    return 0;
    }
    +EXPORT_SYMBOL(acpi_pm_device_run_wake);

    /**
    * acpi_pm_device_sleep_wake - enable or disable the system wake-up
    diff --git a/drivers/ata/acard-ahci.c b/drivers/ata/acard-ahci.c
    index 3bc8c79..4e94ba2 100644
    --- a/drivers/ata/acard-ahci.c
    +++ b/drivers/ata/acard-ahci.c
    @@ -503,21 +503,10 @@ static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id
    &acard_ahci_sht);
    }

    -static int __init acard_ahci_init(void)
    -{
    - return pci_register_driver(&acard_ahci_pci_driver);
    -}
    -
    -static void __exit acard_ahci_exit(void)
    -{
    - pci_unregister_driver(&acard_ahci_pci_driver);
    -}
    +module_pci_driver(acard_ahci_pci_driver);

    MODULE_AUTHOR("Jeff Garzik");
    MODULE_DESCRIPTION("ACard AHCI SATA low-level driver");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, acard_ahci_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(acard_ahci_init);
    -module_exit(acard_ahci_exit);
    diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
    index ebaf67e..062e6a1 100644
    --- a/drivers/ata/ahci.c
    +++ b/drivers/ata/ahci.c
    @@ -105,31 +105,27 @@ static struct ata_port_operations ahci_p5wdh_ops = {

    static const struct ata_port_info ahci_port_info[] = {
    /* by features */
    - [board_ahci] =
    - {
    + [board_ahci] = {
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_ops,
    },
    - [board_ahci_ign_iferr] =
    - {
    + [board_ahci_ign_iferr] = {
    AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_ops,
    },
    - [board_ahci_nosntf] =
    - {
    + [board_ahci_nosntf] = {
    AHCI_HFLAGS (AHCI_HFLAG_NO_SNTF),
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_ops,
    },
    - [board_ahci_yes_fbs] =
    - {
    + [board_ahci_yes_fbs] = {
    AHCI_HFLAGS (AHCI_HFLAG_YES_FBS),
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    @@ -137,8 +133,7 @@ static const struct ata_port_info ahci_port_info[] = {
    .port_ops = &ahci_ops,
    },
    /* by chipsets */
    - [board_ahci_mcp65] =
    - {
    + [board_ahci_mcp65] = {
    AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP |
    AHCI_HFLAG_YES_NCQ),
    .flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM,
    @@ -146,24 +141,21 @@ static const struct ata_port_info ahci_port_info[] = {
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_ops,
    },
    - [board_ahci_mcp77] =
    - {
    + [board_ahci_mcp77] = {
    AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA | AHCI_HFLAG_NO_PMP),
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_ops,
    },
    - [board_ahci_mcp89] =
    - {
    + [board_ahci_mcp89] = {
    AHCI_HFLAGS (AHCI_HFLAG_NO_FPDMA_AA),
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_ops,
    },
    - [board_ahci_mv] =
    - {
    + [board_ahci_mv] = {
    AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_MSI |
    AHCI_HFLAG_MV_PATA | AHCI_HFLAG_NO_PMP),
    .flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA,
    @@ -171,8 +163,7 @@ static const struct ata_port_info ahci_port_info[] = {
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_ops,
    },
    - [board_ahci_sb600] =
    - {
    + [board_ahci_sb600] = {
    AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL |
    AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255 |
    AHCI_HFLAG_32BIT_ONLY),
    @@ -181,16 +172,14 @@ static const struct ata_port_info ahci_port_info[] = {
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_pmp_retry_srst_ops,
    },
    - [board_ahci_sb700] = /* for SB700 and SB800 */
    - {
    + [board_ahci_sb700] = { /* for SB700 and SB800 */
    AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL),
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    .udma_mask = ATA_UDMA6,
    .port_ops = &ahci_pmp_retry_srst_ops,
    },
    - [board_ahci_vt8251] =
    - {
    + [board_ahci_vt8251] = {
    AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ | AHCI_HFLAG_NO_PMP),
    .flags = AHCI_FLAG_COMMON,
    .pio_mask = ATA_PIO4,
    @@ -777,6 +766,22 @@ static bool ahci_sb600_enable_64bit(struct pci_dev *pdev)
    },
    },
    /*
    + * All BIOS versions for the MSI K9AGM2 (MS-7327) support
    + * 64bit DMA.
    + *
    + * This board also had the typo mentioned above in the
    + * Manufacturer DMI field (fixed in BIOS version 1.5), so
    + * match on DMI_BOARD_VENDOR of "MICRO-STAR INTER" again.
    + */
    + {
    + .ident = "MSI K9AGM2",
    + .matches = {
    + DMI_MATCH(DMI_BOARD_VENDOR,
    + "MICRO-STAR INTER"),
    + DMI_MATCH(DMI_BOARD_NAME, "MS-7327"),
    + },
    + },
    + /*
    * All BIOS versions for the Asus M3A support 64bit DMA.
    * (all release versions from 0301 to 1206 were tested)
    */
    @@ -1233,22 +1238,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
    &ahci_sht);
    }

    -static int __init ahci_init(void)
    -{
    - return pci_register_driver(&ahci_pci_driver);
    -}
    -
    -static void __exit ahci_exit(void)
    -{
    - pci_unregister_driver(&ahci_pci_driver);
    -}
    -
    +module_pci_driver(ahci_pci_driver);

    MODULE_AUTHOR("Jeff Garzik");
    MODULE_DESCRIPTION("AHCI SATA low-level driver");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(ahci_init);
    -module_exit(ahci_exit);
    diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
    index 9e419e1..09728e0 100644
    --- a/drivers/ata/ahci_platform.c
    +++ b/drivers/ata/ahci_platform.c
    @@ -15,6 +15,7 @@
    #include <linux/kernel.h>
    #include <linux/gfp.h>
    #include <linux/module.h>
    +#include <linux/pm.h>
    #include <linux/init.h>
    #include <linux/interrupt.h>
    #include <linux/device.h>
    @@ -271,13 +272,10 @@ static int ahci_resume(struct device *dev)

    return 0;
    }
    -
    -static struct dev_pm_ops ahci_pm_ops = {
    - .suspend = &ahci_suspend,
    - .resume = &ahci_resume,
    -};
    #endif

    +SIMPLE_DEV_PM_OPS(ahci_pm_ops, ahci_suspend, ahci_resume);
    +
    static const struct of_device_id ahci_of_match[] = {
    { .compatible = "calxeda,hb-ahci", },
    { .compatible = "snps,spear-ahci", },
    @@ -291,9 +289,7 @@ static struct platform_driver ahci_driver = {
    .name = "ahci",
    .owner = THIS_MODULE,
    .of_match_table = ahci_of_match,
    -#ifdef CONFIG_PM
    .pm = &ahci_pm_ops,
    -#endif
    },
    .id_table = ahci_devtype,
    };
    diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
    index aae1156..f8f38a0 100644
    --- a/drivers/ata/ata_generic.c
    +++ b/drivers/ata/ata_generic.c
    @@ -255,17 +255,7 @@ static struct pci_driver ata_generic_pci_driver = {
    #endif
    };

    -static int __init ata_generic_init(void)
    -{
    - return pci_register_driver(&ata_generic_pci_driver);
    -}
    -
    -
    -static void __exit ata_generic_exit(void)
    -{
    - pci_unregister_driver(&ata_generic_pci_driver);
    -}
    -
    +module_pci_driver(ata_generic_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for generic ATA");
    @@ -273,7 +263,4 @@ MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, ata_generic);
    MODULE_VERSION(DRV_VERSION);

    -module_init(ata_generic_init);
    -module_exit(ata_generic_exit);
    -
    module_param(all_generic_ide, int, 0);
    diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
    index bb7c5f1..902b5a4 100644
    --- a/drivers/ata/libata-acpi.c
    +++ b/drivers/ata/libata-acpi.c
    @@ -16,6 +16,7 @@
    #include <linux/libata.h>
    #include <linux/pci.h>
    #include <linux/slab.h>
    +#include <linux/pm_runtime.h>
    #include <scsi/scsi_device.h>
    #include "libata.h"

    @@ -48,62 +49,53 @@ static void ata_acpi_clear_gtf(struct ata_device *dev)
    }

    /**
    - * ata_acpi_associate_sata_port - associate SATA port with ACPI objects
    - * @ap: target SATA port
    + * ata_ap_acpi_handle - provide the acpi_handle for an ata_port
    + * @ap: the acpi_handle returned will correspond to this port
    *
    - * Look up ACPI objects associated with @ap and initialize acpi_handle
    - * fields of @ap, the port and devices accordingly.
    - *
    - * LOCKING:
    - * EH context.
    - *
    - * RETURNS:
    - * 0 on success, -errno on failure.
    + * Returns the acpi_handle for the ACPI namespace object corresponding to
    + * the ata_port passed into the function, or NULL if no such object exists
    */
    -void ata_acpi_associate_sata_port(struct ata_port *ap)
    +acpi_handle ata_ap_acpi_handle(struct ata_port *ap)
    {
    - WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA));
    -
    - if (!sata_pmp_attached(ap)) {
    - u64 adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
    -
    - ap->link.device->acpi_handle =
    - acpi_get_child(ap->host->acpi_handle, adr);
    - } else {
    - struct ata_link *link;
    -
    - ap->link.device->acpi_handle = NULL;
    -
    - ata_for_each_link(link, ap, EDGE) {
    - u64 adr = SATA_ADR(ap->port_no, link->pmp);
    + if (ap->flags & ATA_FLAG_ACPI_SATA)
    + return NULL;

    - link->device->acpi_handle =
    - acpi_get_child(ap->host->acpi_handle, adr);
    - }
    - }
    + /*
    + * If acpi bind operation has already happened, we can get the handle
    + * for the port by checking the corresponding scsi_host device's
    + * firmware node, otherwise we will need to find out the handle from
    + * its parent's acpi node.
    + */
    + if (ap->scsi_host)
    + return DEVICE_ACPI_HANDLE(&ap->scsi_host->shost_gendev);
    + else
    + return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev),
    + ap->port_no);
    }
    +EXPORT_SYMBOL(ata_ap_acpi_handle);

    -static void ata_acpi_associate_ide_port(struct ata_port *ap)
    +/**
    + * ata_dev_acpi_handle - provide the acpi_handle for an ata_device
    + * @dev: the acpi_device returned will correspond to this port
    + *
    + * Returns the acpi_handle for the ACPI namespace object corresponding to
    + * the ata_device passed into the function, or NULL if no such object exists
    + */
    +acpi_handle ata_dev_acpi_handle(struct ata_device *dev)
    {
    - int max_devices, i;
    -
    - ap->acpi_handle = acpi_get_child(ap->host->acpi_handle, ap->port_no);
    - if (!ap->acpi_handle)
    - return;
    -
    - max_devices = 1;
    - if (ap->flags & ATA_FLAG_SLAVE_POSS)
    - max_devices++;
    -
    - for (i = 0; i < max_devices; i++) {
    - struct ata_device *dev = &ap->link.device[i];
    -
    - dev->acpi_handle = acpi_get_child(ap->acpi_handle, i);
    - }
    + acpi_integer adr;
    + struct ata_port *ap = dev->link->ap;

    - if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0)
    - ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
    + if (ap->flags & ATA_FLAG_ACPI_SATA) {
    + if (!sata_pmp_attached(ap))
    + adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
    + else
    + adr = SATA_ADR(ap->port_no, dev->link->pmp);
    + return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), adr);
    + } else
    + return acpi_get_child(ata_ap_acpi_handle(ap), dev->devno);
    }
    +EXPORT_SYMBOL(ata_dev_acpi_handle);

    /* @ap and @dev are the same as ata_acpi_handle_hotplug() */
    static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev)
    @@ -229,56 +221,6 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = {
    };

    /**
    - * ata_acpi_associate - associate ATA host with ACPI objects
    - * @host: target ATA host
    - *
    - * Look up ACPI objects associated with @host and initialize
    - * acpi_handle fields of @host, its ports and devices accordingly.
    - *
    - * LOCKING:
    - * EH context.
    - *
    - * RETURNS:
    - * 0 on success, -errno on failure.
    - */
    -void ata_acpi_associate(struct ata_host *host)
    -{
    - int i, j;
    -
    - if (!is_pci_dev(host->dev) || libata_noacpi)
    - return;
    -
    - host->acpi_handle = DEVICE_ACPI_HANDLE(host->dev);
    - if (!host->acpi_handle)
    - return;
    -
    - for (i = 0; i < host->n_ports; i++) {
    - struct ata_port *ap = host->ports[i];
    -
    - if (host->ports[0]->flags & ATA_FLAG_ACPI_SATA)
    - ata_acpi_associate_sata_port(ap);
    - else
    - ata_acpi_associate_ide_port(ap);
    -
    - if (ap->acpi_handle) {
    - /* we might be on a docking station */
    - register_hotplug_dock_device(ap->acpi_handle,
    - &ata_acpi_ap_dock_ops, ap);
    - }
    -
    - for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
    - struct ata_device *dev = &ap->link.device[j];
    -
    - if (dev->acpi_handle) {
    - /* we might be on a docking station */
    - register_hotplug_dock_device(dev->acpi_handle,
    - &ata_acpi_dev_dock_ops, dev);
    - }
    - }
    - }
    -}
    -
    -/**
    * ata_acpi_dissociate - dissociate ATA host from ACPI objects
    * @host: target ATA host
    *
    @@ -299,7 +241,7 @@ void ata_acpi_dissociate(struct ata_host *host)
    struct ata_port *ap = host->ports[i];
    const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);

    - if (ap->acpi_handle && gtm)
    + if (ata_ap_acpi_handle(ap) && gtm)
    ata_acpi_stm(ap, gtm);
    }
    }
    @@ -324,7 +266,8 @@ int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm)
    acpi_status status;
    int rc = 0;

    - status = acpi_evaluate_object(ap->acpi_handle, "_GTM", NULL, &output);
    + status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_GTM", NULL,
    + &output);

    rc = -ENOENT;
    if (status == AE_NOT_FOUND)
    @@ -394,7 +337,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm)
    input.count = 3;
    input.pointer = in_params;

    - status = acpi_evaluate_object(ap->acpi_handle, "_STM", &input, NULL);
    + status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_STM", &input,
    + NULL);

    if (status == AE_NOT_FOUND)
    return -ENOENT;
    @@ -451,7 +395,8 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
    __func__, ap->port_no);

    /* _GTF has no input parameters */
    - status = acpi_evaluate_object(dev->acpi_handle, "_GTF", NULL, &output);
    + status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_GTF", NULL,
    + &output);
    out_obj = dev->gtf_cache = output.pointer;

    if (ACPI_FAILURE(status)) {
    @@ -817,7 +762,8 @@ static int ata_acpi_push_id(struct ata_device *dev)

    /* It's OK for _SDD to be missing too. */
    swap_buf_le16(dev->id, ATA_ID_WORDS);
    - status = acpi_evaluate_object(dev->acpi_handle, "_SDD", &input, NULL);
    + status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_SDD", &input,
    + NULL);
    swap_buf_le16(dev->id, ATA_ID_WORDS);

    if (status == AE_NOT_FOUND)
    @@ -867,7 +813,7 @@ void ata_acpi_on_resume(struct ata_port *ap)
    const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
    struct ata_device *dev;

    - if (ap->acpi_handle && gtm) {
    + if (ata_ap_acpi_handle(ap) && gtm) {
    /* _GTM valid */

    /* restore timing parameters */
    @@ -907,23 +853,39 @@ void ata_acpi_on_resume(struct ata_port *ap)
    void ata_acpi_set_state(struct ata_port *ap, pm_message_t state)
    {
    struct ata_device *dev;
    -
    - if (!ap->acpi_handle || (ap->flags & ATA_FLAG_ACPI_SATA))
    - return;
    + acpi_handle handle;
    + int acpi_state;

    /* channel first and then drives for power on and vica versa
    for power off */
    - if (state.event == PM_EVENT_ON)
    - acpi_bus_set_power(ap->acpi_handle, ACPI_STATE_D0);
    + handle = ata_ap_acpi_handle(ap);
    + if (handle && state.event == PM_EVENT_ON)
    + acpi_bus_set_power(handle, ACPI_STATE_D0);

    ata_for_each_dev(dev, &ap->link, ENABLED) {
    - if (dev->acpi_handle)
    - acpi_bus_set_power(dev->acpi_handle,
    - state.event == PM_EVENT_ON ?
    - ACPI_STATE_D0 : ACPI_STATE_D3);
    + handle = ata_dev_acpi_handle(dev);
    + if (!handle)
    + continue;
    +
    + if (state.event != PM_EVENT_ON) {
    + acpi_state = acpi_pm_device_sleep_state(
    + &dev->sdev->sdev_gendev, NULL, ACPI_STATE_D3);
    + if (acpi_state > 0)
    + acpi_bus_set_power(handle, acpi_state);
    + /* TBD: need to check if it's runtime pm request */
    + acpi_pm_device_run_wake(
    + &dev->sdev->sdev_gendev, true);
    + } else {
    + /* Ditto */
    + acpi_pm_device_run_wake(
    + &dev->sdev->sdev_gendev, false);
    + acpi_bus_set_power(handle, ACPI_STATE_D0);
    + }
    }
    - if (state.event != PM_EVENT_ON)
    - acpi_bus_set_power(ap->acpi_handle, ACPI_STATE_D3);
    +
    + handle = ata_ap_acpi_handle(ap);
    + if (handle && state.event != PM_EVENT_ON)
    + acpi_bus_set_power(handle, ACPI_STATE_D3);
    }

    /**
    @@ -948,7 +910,7 @@ int ata_acpi_on_devcfg(struct ata_device *dev)
    int nr_executed = 0;
    int rc;

    - if (!dev->acpi_handle)
    + if (!ata_dev_acpi_handle(dev))
    return 0;

    /* do we need to do _GTF? */
    @@ -994,7 +956,6 @@ int ata_acpi_on_devcfg(struct ata_device *dev)
    }

    ata_dev_warn(dev, "ACPI: failed the second time, disabled\n");
    - dev->acpi_handle = NULL;

    /* We can safely continue if no _GTF command has been executed
    * and port is not frozen.
    @@ -1018,3 +979,218 @@ void ata_acpi_on_disable(struct ata_device *dev)
    {
    ata_acpi_clear_gtf(dev);
    }
    +
    +static void ata_acpi_wake_dev(acpi_handle handle, u32 event, void *context)
    +{
    + struct ata_device *ata_dev = context;
    +
    + if (event == ACPI_NOTIFY_DEVICE_WAKE && ata_dev &&
    + pm_runtime_suspended(&ata_dev->sdev->sdev_gendev))
    + scsi_autopm_get_device(ata_dev->sdev);
    +}
    +
    +static void ata_acpi_add_pm_notifier(struct ata_device *dev)
    +{
    + struct acpi_device *acpi_dev;
    + acpi_handle handle;
    + acpi_status status;
    +
    + handle = ata_dev_acpi_handle(dev);
    + if (!handle)
    + return;
    +
    + status = acpi_bus_get_device(handle, &acpi_dev);
    + if (ACPI_FAILURE(status))
    + return;
    +
    + if (dev->sdev->can_power_off) {
    + acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
    + ata_acpi_wake_dev, dev);
    + device_set_run_wake(&dev->sdev->sdev_gendev, true);
    + }
    +}
    +
    +static void ata_acpi_remove_pm_notifier(struct ata_device *dev)
    +{
    + struct acpi_device *acpi_dev;
    + acpi_handle handle;
    + acpi_status status;
    +
    + handle = ata_dev_acpi_handle(dev);
    + if (!handle)
    + return;
    +
    + status = acpi_bus_get_device(handle, &acpi_dev);
    + if (ACPI_FAILURE(status))
    + return;
    +
    + if (dev->sdev->can_power_off) {
    + device_set_run_wake(&dev->sdev->sdev_gendev, false);
    + acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
    + ata_acpi_wake_dev);
    + }
    +}
    +
    +static void ata_acpi_register_power_resource(struct ata_device *dev)
    +{
    + struct scsi_device *sdev = dev->sdev;
    + acpi_handle handle;
    + struct device *device;
    +
    + handle = ata_dev_acpi_handle(dev);
    + if (!handle)
    + return;
    +
    + device = &sdev->sdev_gendev;
    +
    + acpi_power_resource_register_device(device, handle);
    +}
    +
    +static void ata_acpi_unregister_power_resource(struct ata_device *dev)
    +{
    + struct scsi_device *sdev = dev->sdev;
    + acpi_handle handle;
    + struct device *device;
    +
    + handle = ata_dev_acpi_handle(dev);
    + if (!handle)
    + return;
    +
    + device = &sdev->sdev_gendev;
    +
    + acpi_power_resource_unregister_device(device, handle);
    +}
    +
    +void ata_acpi_bind(struct ata_device *dev)
    +{
    + ata_acpi_add_pm_notifier(dev);
    + ata_acpi_register_power_resource(dev);
    +}
    +
    +void ata_acpi_unbind(struct ata_device *dev)
    +{
    + ata_acpi_remove_pm_notifier(dev);
    + ata_acpi_unregister_power_resource(dev);
    +}
    +
    +static int compat_pci_ata(struct ata_port *ap)
    +{
    + struct device *dev = ap->tdev.parent;
    + struct pci_dev *pdev;
    +
    + if (!is_pci_dev(dev))
    + return 0;
    +
    + pdev = to_pci_dev(dev);
    +
    + if ((pdev->class >> 8) != PCI_CLASS_STORAGE_SATA &&
    + (pdev->class >> 8) != PCI_CLASS_STORAGE_IDE)
    + return 0;
    +
    + return 1;
    +}
    +
    +static int ata_acpi_bind_host(struct ata_port *ap, acpi_handle *handle)
    +{
    + if (ap->flags & ATA_FLAG_ACPI_SATA)
    + return -ENODEV;
    +
    + *handle = acpi_get_child(DEVICE_ACPI_HANDLE(ap->tdev.parent),
    + ap->port_no);
    +
    + if (!*handle)
    + return -ENODEV;
    +
    + return 0;
    +}
    +
    +static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev,
    + acpi_handle *handle)
    +{
    + struct ata_device *ata_dev;
    + acpi_status status;
    + struct acpi_device *acpi_dev;
    + struct acpi_device_power_state *states;
    +
    + if (ap->flags & ATA_FLAG_ACPI_SATA)
    + ata_dev = &ap->link.device[sdev->channel];
    + else
    + ata_dev = &ap->link.device[sdev->id];
    +
    + *handle = ata_dev_acpi_handle(ata_dev);
    +
    + if (!*handle)
    + return -ENODEV;
    +
    + status = acpi_bus_get_device(*handle, &acpi_dev);
    + if (ACPI_FAILURE(status))
    + return 0;
    +
    + /*
    + * If firmware has _PS3 or _PR3 for this device,
    + * and this ata ODD device support device attention,
    + * it means this device can be powered off
    + */
    + states = acpi_dev->power.states;
    + if ((states[ACPI_STATE_D3_HOT].flags.valid ||
    + states[ACPI_STATE_D3_COLD].flags.explicit_set) &&
    + ata_dev->flags & ATA_DFLAG_DA)
    + sdev->can_power_off = 1;
    +
    + return 0;
    +}
    +
    +static int is_ata_port(const struct device *dev)
    +{
    + return dev->type == &ata_port_type;
    +}
    +
    +static struct ata_port *dev_to_ata_port(struct device *dev)
    +{
    + while (!is_ata_port(dev)) {
    + if (!dev->parent)
    + return NULL;
    + dev = dev->parent;
    + }
    + return to_ata_port(dev);
    +}
    +
    +static int ata_acpi_find_device(struct device *dev, acpi_handle *handle)
    +{
    + struct ata_port *ap = dev_to_ata_port(dev);
    +
    + if (!ap)
    + return -ENODEV;
    +
    + if (!compat_pci_ata(ap))
    + return -ENODEV;
    +
    + if (scsi_is_host_device(dev))
    + return ata_acpi_bind_host(ap, handle);
    + else if (scsi_is_sdev_device(dev)) {
    + struct scsi_device *sdev = to_scsi_device(dev);
    +
    + return ata_acpi_bind_device(ap, sdev, handle);
    + } else
    + return -ENODEV;
    +}
    +
    +static int ata_acpi_find_dummy(struct device *dev, acpi_handle *handle)
    +{
    + return -ENODEV;
    +}
    +
    +static struct acpi_bus_type ata_acpi_bus = {
    + .find_bridge = ata_acpi_find_dummy,
    + .find_device = ata_acpi_find_device,
    +};
    +
    +int ata_acpi_register(void)
    +{
    + return scsi_register_acpi_bus_type(&ata_acpi_bus);
    +}
    +
    +void ata_acpi_unregister(void)
    +{
    + scsi_unregister_acpi_bus_type(&ata_acpi_bus);
    +}
    diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
    index 3fe1202..fadd586 100644
    --- a/drivers/ata/libata-core.c
    +++ b/drivers/ata/libata-core.c
    @@ -2376,6 +2376,9 @@ int ata_dev_configure(struct ata_device *dev)
    dma_dir_string = ", DMADIR";
    }

    + if (ata_id_has_da(dev->id))
    + dev->flags |= ATA_DFLAG_DA;
    +
    /* print device info to dmesg */
    if (ata_msg_drv(ap) && print_info)
    ata_dev_info(dev,
    @@ -4128,6 +4131,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {

    /* Devices which aren't very happy with higher link speeds */
    { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, },
    + { "Seagate FreeAgent GoFlex", NULL, ATA_HORKAGE_1_5_GBPS, },

    /*
    * Devices which choke on SETXFER. Applies only if both the
    @@ -5290,8 +5294,6 @@ static int ata_port_request_pm(struct ata_port *ap, pm_message_t mesg,
    return rc;
    }

    -#define to_ata_port(d) container_of(d, struct ata_port, tdev)
    -
    static int ata_port_suspend_common(struct device *dev, pm_message_t mesg)
    {
    struct ata_port *ap = to_ata_port(dev);
    @@ -6053,9 +6055,6 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
    if (rc)
    goto err_tadd;

    - /* associate with ACPI nodes */
    - ata_acpi_associate(host);
    -
    /* set cable, sata_spd_limit and report */
    for (i = 0; i < host->n_ports; i++) {
    struct ata_port *ap = host->ports[i];
    @@ -6515,6 +6514,8 @@ static int __init ata_init(void)

    ata_parse_force_param();

    + ata_acpi_register();
    +
    rc = ata_sff_init();
    if (rc) {
    kfree(ata_force_tbl);
    @@ -6541,6 +6542,7 @@ static void __exit ata_exit(void)
    ata_release_transport(ata_scsi_transport_template);
    libata_transport_exit();
    ata_sff_exit();
    + ata_acpi_unregister();
    kfree(ata_force_tbl);
    }

    diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
    index 77fc806..7d4535e 100644
    --- a/drivers/ata/libata-eh.c
    +++ b/drivers/ata/libata-eh.c
    @@ -419,7 +419,7 @@ int ata_ering_map(struct ata_ering *ering,
    return rc;
    }

    -int ata_ering_clear_cb(struct ata_ering_entry *ent, void *void_arg)
    +static int ata_ering_clear_cb(struct ata_ering_entry *ent, void *void_arg)
    {
    ent->eflags |= ATA_EFLAG_OLD_ER;
    return 0;
    diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
    index 21b80c5..61c59ee 100644
    --- a/drivers/ata/libata-pmp.c
    +++ b/drivers/ata/libata-pmp.c
    @@ -529,8 +529,6 @@ int sata_pmp_attach(struct ata_device *dev)
    ata_for_each_link(tlink, ap, EDGE)
    sata_link_init_spd(tlink);

    - ata_acpi_associate_sata_port(ap);
    -
    return 0;

    fail:
    @@ -570,8 +568,6 @@ static void sata_pmp_detach(struct ata_device *dev)
    ap->nr_pmp_links = 0;
    link->pmp = 0;
    spin_unlock_irqrestore(ap->lock, flags);
    -
    - ata_acpi_associate_sata_port(ap);
    }

    /**
    diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
    index 2222635..8ec81ca 100644
    --- a/drivers/ata/libata-scsi.c
    +++ b/drivers/ata/libata-scsi.c
    @@ -3445,6 +3445,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
    if (!IS_ERR(sdev)) {
    dev->sdev = sdev;
    scsi_device_put(sdev);
    + ata_acpi_bind(dev);
    } else {
    dev->sdev = NULL;
    }
    @@ -3541,6 +3542,8 @@ static void ata_scsi_remove_dev(struct ata_device *dev)
    mutex_lock(&ap->scsi_host->scan_mutex);
    spin_lock_irqsave(ap->lock, flags);

    + ata_acpi_unbind(dev);
    +
    /* clearing dev->sdev is protected by host lock */
    sdev = dev->sdev;
    dev->sdev = NULL;
    diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c
    index c341904..c04d393 100644
    --- a/drivers/ata/libata-transport.c
    +++ b/drivers/ata/libata-transport.c
    @@ -232,7 +232,7 @@ static void ata_tport_release(struct device *dev)
    * Returns:
    * %1 if the device represents a ATA Port, %0 else
    */
    -int ata_is_port(const struct device *dev)
    +static int ata_is_port(const struct device *dev)
    {
    return dev->release == ata_tport_release;
    }
    @@ -355,7 +355,7 @@ static void ata_tlink_release(struct device *dev)
    * Returns:
    * %1 if the device represents a ATA link, %0 else
    */
    -int ata_is_link(const struct device *dev)
    +static int ata_is_link(const struct device *dev)
    {
    return dev->release == ata_tlink_release;
    }
    @@ -572,7 +572,7 @@ static void ata_tdev_release(struct device *dev)
    * Returns:
    * %1 if the device represents a ATA device, %0 else
    */
    -int ata_is_ata_dev(const struct device *dev)
    +static int ata_is_ata_dev(const struct device *dev)
    {
    return dev->release == ata_tdev_release;
    }
    diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
    index 9d0fd0b..50e4dff 100644
    --- a/drivers/ata/libata.h
    +++ b/drivers/ata/libata.h
    @@ -107,21 +107,22 @@ extern const char *sata_spd_string(unsigned int spd);
    extern int ata_port_probe(struct ata_port *ap);
    extern void __ata_port_probe(struct ata_port *ap);

    +#define to_ata_port(d) container_of(d, struct ata_port, tdev)
    +
    /* libata-acpi.c */
    #ifdef CONFIG_ATA_ACPI
    extern unsigned int ata_acpi_gtf_filter;
    -
    -extern void ata_acpi_associate_sata_port(struct ata_port *ap);
    -extern void ata_acpi_associate(struct ata_host *host);
    extern void ata_acpi_dissociate(struct ata_host *host);
    extern int ata_acpi_on_suspend(struct ata_port *ap);
    extern void ata_acpi_on_resume(struct ata_port *ap);
    extern int ata_acpi_on_devcfg(struct ata_device *dev);
    extern void ata_acpi_on_disable(struct ata_device *dev);
    extern void ata_acpi_set_state(struct ata_port *ap, pm_message_t state);
    +extern int ata_acpi_register(void);
    +extern void ata_acpi_unregister(void);
    +extern void ata_acpi_bind(struct ata_device *dev);
    +extern void ata_acpi_unbind(struct ata_device *dev);
    #else
    -static inline void ata_acpi_associate_sata_port(struct ata_port *ap) { }
    -static inline void ata_acpi_associate(struct ata_host *host) { }
    static inline void ata_acpi_dissociate(struct ata_host *host) { }
    static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
    static inline void ata_acpi_on_resume(struct ata_port *ap) { }
    @@ -129,6 +130,10 @@ static inline int ata_acpi_on_devcfg(struct ata_device *dev) { return 0; }
    static inline void ata_acpi_on_disable(struct ata_device *dev) { }
    static inline void ata_acpi_set_state(struct ata_port *ap,
    pm_message_t state) { }
    +static inline int ata_acpi_register(void) { return 0; }
    +static inline void ata_acpi_unregister(void) { }
    +static inline void ata_acpi_bind(struct ata_device *dev) { }
    +static inline void ata_acpi_unbind(struct ata_device *dev) { }
    #endif

    /* libata-scsi.c */
    diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c
    index 54145ed..09723b7 100644
    --- a/drivers/ata/pata_acpi.c
    +++ b/drivers/ata/pata_acpi.c
    @@ -39,7 +39,7 @@ static int pacpi_pre_reset(struct ata_link *link, unsigned long deadline)
    {
    struct ata_port *ap = link->ap;
    struct pata_acpi *acpi = ap->private_data;
    - if (ap->acpi_handle == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0)
    + if (ata_ap_acpi_handle(ap) == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0)
    return -ENODEV;

    return ata_sff_prereset(link, deadline);
    @@ -195,7 +195,7 @@ static int pacpi_port_start(struct ata_port *ap)
    struct pci_dev *pdev = to_pci_dev(ap->host->dev);
    struct pata_acpi *acpi;

    - if (ap->acpi_handle == NULL)
    + if (ata_ap_acpi_handle(ap) == NULL)
    return -ENODEV;

    acpi = ap->private_data = devm_kzalloc(&pdev->dev, sizeof(struct pata_acpi), GFP_KERNEL);
    @@ -273,22 +273,10 @@ static struct pci_driver pacpi_pci_driver = {
    #endif
    };

    -static int __init pacpi_init(void)
    -{
    - return pci_register_driver(&pacpi_pci_driver);
    -}
    -
    -static void __exit pacpi_exit(void)
    -{
    - pci_unregister_driver(&pacpi_pci_driver);
    -}
    -
    -module_init(pacpi_init);
    -module_exit(pacpi_exit);
    +module_pci_driver(pacpi_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for ATA in ACPI mode");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, pacpi_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
    index dc6b5da..82a0892 100644
    --- a/drivers/ata/pata_amd.c
    +++ b/drivers/ata/pata_amd.c
    @@ -632,21 +632,10 @@ static struct pci_driver amd_pci_driver = {
    #endif
    };

    -static int __init amd_init(void)
    -{
    - return pci_register_driver(&amd_pci_driver);
    -}
    -
    -static void __exit amd_exit(void)
    -{
    - pci_unregister_driver(&amd_pci_driver);
    -}
    +module_pci_driver(amd_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for AMD and Nvidia PATA IDE");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, amd);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(amd_init);
    -module_exit(amd_exit);
    diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c
    index 4b8b22e..74b215c 100644
    --- a/drivers/ata/pata_artop.c
    +++ b/drivers/ata/pata_artop.c
    @@ -451,18 +451,7 @@ static struct pci_driver artop_pci_driver = {
    #endif
    };

    -static int __init artop_init(void)
    -{
    - return pci_register_driver(&artop_pci_driver);
    -}
    -
    -static void __exit artop_exit(void)
    -{
    - pci_unregister_driver(&artop_pci_driver);
    -}
    -
    -module_init(artop_init);
    -module_exit(artop_exit);
    +module_pci_driver(artop_pci_driver);

    MODULE_AUTHOR("Alan Cox, Bartlomiej Zolnierkiewicz");
    MODULE_DESCRIPTION("SCSI low-level driver for ARTOP PATA");
    diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c
    index be1aa14..361c75c 100644
    --- a/drivers/ata/pata_atiixp.c
    +++ b/drivers/ata/pata_atiixp.c
    @@ -289,22 +289,10 @@ static struct pci_driver atiixp_pci_driver = {
    #endif
    };

    -static int __init atiixp_init(void)
    -{
    - return pci_register_driver(&atiixp_pci_driver);
    -}
    -
    -
    -static void __exit atiixp_exit(void)
    -{
    - pci_unregister_driver(&atiixp_pci_driver);
    -}
    +module_pci_driver(atiixp_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for ATI IXP200/300/400");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, atiixp);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(atiixp_init);
    -module_exit(atiixp_exit);
    diff --git a/drivers/ata/pata_atp867x.c b/drivers/ata/pata_atp867x.c
    index 3cfabb2..041f50d 100644
    --- a/drivers/ata/pata_atp867x.c
    +++ b/drivers/ata/pata_atp867x.c
    @@ -565,21 +565,10 @@ static struct pci_driver atp867x_driver = {
    #endif
    };

    -static int __init atp867x_init(void)
    -{
    - return pci_register_driver(&atp867x_driver);
    -}
    -
    -static void __exit atp867x_exit(void)
    -{
    - pci_unregister_driver(&atp867x_driver);
    -}
    +module_pci_driver(atp867x_driver);

    MODULE_AUTHOR("John(Jung-Ik) Lee, Google Inc.");
    MODULE_DESCRIPTION("low level driver for Artop/Acard 867x ATA controller");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, atp867x_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(atp867x_init);
    -module_exit(atp867x_exit);
    diff --git a/drivers/ata/pata_cmd640.c b/drivers/ata/pata_cmd640.c
    index 549d28d..504b98b 100644
    --- a/drivers/ata/pata_cmd640.c
    +++ b/drivers/ata/pata_cmd640.c
    @@ -263,21 +263,10 @@ static struct pci_driver cmd640_pci_driver = {
    #endif
    };

    -static int __init cmd640_init(void)
    -{
    - return pci_register_driver(&cmd640_pci_driver);
    -}
    -
    -static void __exit cmd640_exit(void)
    -{
    - pci_unregister_driver(&cmd640_pci_driver);
    -}
    +module_pci_driver(cmd640_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for CMD640 PATA controllers");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, cmd640);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(cmd640_init);
    -module_exit(cmd640_exit);
    diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c
    index 1c17cd1..7ba0141 100644
    --- a/drivers/ata/pata_cmd64x.c
    +++ b/drivers/ata/pata_cmd64x.c
    @@ -423,7 +423,7 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
    .port_ops = &cmd648_port_ops
    }
    };
    - const struct ata_port_info *ppi[] = {
    + const struct ata_port_info *ppi[] = {
    &cmd_info[id->driver_data],
    &cmd_info[id->driver_data],
    NULL
    @@ -478,7 +478,7 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
    if (port_ok && cntrl_ch0_ok && !(reg & CNTRL_CH0)) {
    dev_printk(KERN_NOTICE, &pdev->dev, "Primary port is disabled\n");
    ppi[0] = &ata_dummy_port_info;
    -
    +
    }
    if (port_ok && !(reg & CNTRL_CH1)) {
    dev_printk(KERN_NOTICE, &pdev->dev, "Secondary port is disabled\n");
    @@ -525,21 +525,10 @@ static struct pci_driver cmd64x_pci_driver = {
    #endif
    };

    -static int __init cmd64x_init(void)
    -{
    - return pci_register_driver(&cmd64x_pci_driver);
    -}
    -
    -static void __exit cmd64x_exit(void)
    -{
    - pci_unregister_driver(&cmd64x_pci_driver);
    -}
    +module_pci_driver(cmd64x_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for CMD64x series PATA controllers");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, cmd64x);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(cmd64x_init);
    -module_exit(cmd64x_exit);
    diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c
    index 9ddcddc..de74d80 100644
    --- a/drivers/ata/pata_cs5520.c
    +++ b/drivers/ata/pata_cs5520.c
    @@ -302,22 +302,10 @@ static struct pci_driver cs5520_pci_driver = {
    #endif
    };

    -static int __init cs5520_init(void)
    -{
    - return pci_register_driver(&cs5520_pci_driver);
    -}
    -
    -static void __exit cs5520_exit(void)
    -{
    - pci_unregister_driver(&cs5520_pci_driver);
    -}
    +module_pci_driver(cs5520_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Cyrix CS5510/5520");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, pata_cs5520);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(cs5520_init);
    -module_exit(cs5520_exit);
    -
    diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c
    index f792330..48389ae 100644
    --- a/drivers/ata/pata_cs5530.c
    +++ b/drivers/ata/pata_cs5530.c
    @@ -363,21 +363,10 @@ static struct pci_driver cs5530_pci_driver = {
    #endif
    };

    -static int __init cs5530_init(void)
    -{
    - return pci_register_driver(&cs5530_pci_driver);
    -}
    -
    -static void __exit cs5530_exit(void)
    -{
    - pci_unregister_driver(&cs5530_pci_driver);
    -}
    +module_pci_driver(cs5530_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for the Cyrix/NS/AMD 5530");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, cs5530);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(cs5530_init);
    -module_exit(cs5530_exit);
    diff --git a/drivers/ata/pata_cs5535.c b/drivers/ata/pata_cs5535.c
    index a0b4640..997e16a 100644
    --- a/drivers/ata/pata_cs5535.c
    +++ b/drivers/ata/pata_cs5535.c
    @@ -207,21 +207,10 @@ static struct pci_driver cs5535_pci_driver = {
    #endif
    };

    -static int __init cs5535_init(void)
    -{
    - return pci_register_driver(&cs5535_pci_driver);
    -}
    -
    -static void __exit cs5535_exit(void)
    -{
    - pci_unregister_driver(&cs5535_pci_driver);
    -}
    +module_pci_driver(cs5535_pci_driver);

    MODULE_AUTHOR("Alan Cox, Jens Altmann, Wolfgan Zuleger, Alexander Kiausch");
    MODULE_DESCRIPTION("low-level driver for the NS/AMD 5535");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, cs5535);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(cs5535_init);
    -module_exit(cs5535_exit);
    diff --git a/drivers/ata/pata_cs5536.c b/drivers/ata/pata_cs5536.c
    index 7a402c7..dec1b6c 100644
    --- a/drivers/ata/pata_cs5536.c
    +++ b/drivers/ata/pata_cs5536.c
    @@ -274,21 +274,10 @@ static struct pci_driver cs5536_pci_driver = {
    #endif
    };

    -static int __init cs5536_init(void)
    -{
    - return pci_register_driver(&cs5536_pci_driver);
    -}
    -
    -static void __exit cs5536_exit(void)
    -{
    - pci_unregister_driver(&cs5536_pci_driver);
    -}
    +module_pci_driver(cs5536_pci_driver);

    MODULE_AUTHOR("Martin K. Petersen");
    MODULE_DESCRIPTION("low-level driver for the CS5536 IDE controller");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, cs5536);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(cs5536_init);
    -module_exit(cs5536_exit);
    diff --git a/drivers/ata/pata_cypress.c b/drivers/ata/pata_cypress.c
    index 6d915b0..810bc99 100644
    --- a/drivers/ata/pata_cypress.c
    +++ b/drivers/ata/pata_cypress.c
    @@ -158,23 +158,10 @@ static struct pci_driver cy82c693_pci_driver = {
    #endif
    };

    -static int __init cy82c693_init(void)
    -{
    - return pci_register_driver(&cy82c693_pci_driver);
    -}
    -
    -
    -static void __exit cy82c693_exit(void)
    -{
    - pci_unregister_driver(&cy82c693_pci_driver);
    -}
    -
    +module_pci_driver(cy82c693_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for the CY82C693 PATA controller");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, cy82c693);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(cy82c693_init);
    -module_exit(cy82c693_exit);
    diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c
    index f0243ed..3c12fd7 100644
    --- a/drivers/ata/pata_efar.c
    +++ b/drivers/ata/pata_efar.c
    @@ -295,22 +295,10 @@ static struct pci_driver efar_pci_driver = {
    #endif
    };

    -static int __init efar_init(void)
    -{
    - return pci_register_driver(&efar_pci_driver);
    -}
    -
    -static void __exit efar_exit(void)
    -{
    - pci_unregister_driver(&efar_pci_driver);
    -}
    -
    -module_init(efar_init);
    -module_exit(efar_exit);
    +module_pci_driver(efar_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for EFAR PIIX clones");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, efar_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c
    index 42cffd3..4be884a 100644
    --- a/drivers/ata/pata_hpt366.c
    +++ b/drivers/ata/pata_hpt366.c
    @@ -418,21 +418,10 @@ static struct pci_driver hpt36x_pci_driver = {
    #endif
    };

    -static int __init hpt36x_init(void)
    -{
    - return pci_register_driver(&hpt36x_pci_driver);
    -}
    -
    -static void __exit hpt36x_exit(void)
    -{
    - pci_unregister_driver(&hpt36x_pci_driver);
    -}
    +module_pci_driver(hpt36x_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for the Highpoint HPT366/368");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, hpt36x);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(hpt36x_init);
    -module_exit(hpt36x_exit);
    diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
    index 9620636..a9d74ef 100644
    --- a/drivers/ata/pata_hpt37x.c
    +++ b/drivers/ata/pata_hpt37x.c
    @@ -1058,21 +1058,10 @@ static struct pci_driver hpt37x_pci_driver = {
    .remove = ata_pci_remove_one
    };

    -static int __init hpt37x_init(void)
    -{
    - return pci_register_driver(&hpt37x_pci_driver);
    -}
    -
    -static void __exit hpt37x_exit(void)
    -{
    - pci_unregister_driver(&hpt37x_pci_driver);
    -}
    +module_pci_driver(hpt37x_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for the Highpoint HPT37x/30x");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, hpt37x);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(hpt37x_init);
    -module_exit(hpt37x_exit);
    diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c
    index 765f136..4be0398 100644
    --- a/drivers/ata/pata_hpt3x2n.c
    +++ b/drivers/ata/pata_hpt3x2n.c
    @@ -621,21 +621,10 @@ static struct pci_driver hpt3x2n_pci_driver = {
    .remove = ata_pci_remove_one
    };

    -static int __init hpt3x2n_init(void)
    -{
    - return pci_register_driver(&hpt3x2n_pci_driver);
    -}
    -
    -static void __exit hpt3x2n_exit(void)
    -{
    - pci_unregister_driver(&hpt3x2n_pci_driver);
    -}
    +module_pci_driver(hpt3x2n_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for the Highpoint HPT3xxN");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, hpt3x2n);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(hpt3x2n_init);
    -module_exit(hpt3x2n_exit);
    diff --git a/drivers/ata/pata_hpt3x3.c b/drivers/ata/pata_hpt3x3.c
    index b3042da..76c9314 100644
    --- a/drivers/ata/pata_hpt3x3.c
    +++ b/drivers/ata/pata_hpt3x3.c
    @@ -284,23 +284,10 @@ static struct pci_driver hpt3x3_pci_driver = {
    #endif
    };

    -static int __init hpt3x3_init(void)
    -{
    - return pci_register_driver(&hpt3x3_pci_driver);
    -}
    -
    -
    -static void __exit hpt3x3_exit(void)
    -{
    - pci_unregister_driver(&hpt3x3_pci_driver);
    -}
    -
    +module_pci_driver(hpt3x3_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for the Highpoint HPT343/363");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, hpt3x3);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(hpt3x3_init);
    -module_exit(hpt3x3_exit);
    diff --git a/drivers/ata/pata_imx.c b/drivers/ata/pata_imx.c
    index c5af97f..87bb05b 100644
    --- a/drivers/ata/pata_imx.c
    +++ b/drivers/ata/pata_imx.c
    @@ -118,7 +118,7 @@ static int __devinit pata_imx_probe(struct platform_device *pdev)
    return PTR_ERR(priv->clk);
    }

    - clk_enable(priv->clk);
    + clk_prepare_enable(priv->clk);

    host = ata_host_alloc(&pdev->dev, 1);
    if (!host)
    @@ -162,7 +162,7 @@ static int __devinit pata_imx_probe(struct platform_device *pdev)
    &pata_imx_sht);

    free_priv:
    - clk_disable(priv->clk);
    + clk_disable_unprepare(priv->clk);
    clk_put(priv->clk);
    return -ENOMEM;
    }
    @@ -176,7 +176,7 @@ static int __devexit pata_imx_remove(struct platform_device *pdev)

    __raw_writel(0, priv->host_regs + PATA_IMX_ATA_INT_EN);

    - clk_disable(priv->clk);
    + clk_disable_unprepare(priv->clk);
    clk_put(priv->clk);

    return 0;
    @@ -194,7 +194,7 @@ static int pata_imx_suspend(struct device *dev)
    __raw_writel(0, priv->host_regs + PATA_IMX_ATA_INT_EN);
    priv->ata_ctl =
    __raw_readl(priv->host_regs + PATA_IMX_ATA_CONTROL);
    - clk_disable(priv->clk);
    + clk_disable_unprepare(priv->clk);
    }

    return ret;
    @@ -205,7 +205,7 @@ static int pata_imx_resume(struct device *dev)
    struct ata_host *host = dev_get_drvdata(dev);
    struct pata_imx_priv *priv = host->private_data;

    - clk_enable(priv->clk);
    + clk_prepare_enable(priv->clk);

    __raw_writel(priv->ata_ctl, priv->host_regs + PATA_IMX_ATA_CONTROL);

    diff --git a/drivers/ata/pata_it8213.c b/drivers/ata/pata_it8213.c
    index cf9164d..2a8dd95 100644
    --- a/drivers/ata/pata_it8213.c
    +++ b/drivers/ata/pata_it8213.c
    @@ -290,18 +290,7 @@ static struct pci_driver it8213_pci_driver = {
    #endif
    };

    -static int __init it8213_init(void)
    -{
    - return pci_register_driver(&it8213_pci_driver);
    -}
    -
    -static void __exit it8213_exit(void)
    -{
    - pci_unregister_driver(&it8213_pci_driver);
    -}
    -
    -module_init(it8213_init);
    -module_exit(it8213_exit);
    +module_pci_driver(it8213_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for the ITE 8213");
    diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c
    index 62c5d00..9cc05d8 100644
    --- a/drivers/ata/pata_it821x.c
    +++ b/drivers/ata/pata_it821x.c
    @@ -972,15 +972,7 @@ static struct pci_driver it821x_pci_driver = {
    #endif
    };

    -static int __init it821x_init(void)
    -{
    - return pci_register_driver(&it821x_pci_driver);
    -}
    -
    -static void __exit it821x_exit(void)
    -{
    - pci_unregister_driver(&it821x_pci_driver);
    -}
    +module_pci_driver(it821x_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for the IT8211/IT8212 IDE RAID controller");
    @@ -988,9 +980,5 @@ MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, it821x);
    MODULE_VERSION(DRV_VERSION);

    -
    module_param_named(noraid, it8212_noraid, int, S_IRUGO);
    MODULE_PARM_DESC(noraid, "Force card into bypass mode");
    -
    -module_init(it821x_init);
    -module_exit(it821x_exit);
    diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c
    index cb3babb..76e739b0 100644
    --- a/drivers/ata/pata_jmicron.c
    +++ b/drivers/ata/pata_jmicron.c
    @@ -164,18 +164,7 @@ static struct pci_driver jmicron_pci_driver = {
    #endif
    };

    -static int __init jmicron_init(void)
    -{
    - return pci_register_driver(&jmicron_pci_driver);
    -}
    -
    -static void __exit jmicron_exit(void)
    -{
    - pci_unregister_driver(&jmicron_pci_driver);
    -}
    -
    -module_init(jmicron_init);
    -module_exit(jmicron_exit);
    +module_pci_driver(jmicron_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for Jmicron PATA ports");
    diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c
    index 5d7f58a..a4f5e78 100644
    --- a/drivers/ata/pata_marvell.c
    +++ b/drivers/ata/pata_marvell.c
    @@ -178,22 +178,10 @@ static struct pci_driver marvell_pci_driver = {
    #endif
    };

    -static int __init marvell_init(void)
    -{
    - return pci_register_driver(&marvell_pci_driver);
    -}
    -
    -static void __exit marvell_exit(void)
    -{
    - pci_unregister_driver(&marvell_pci_driver);
    -}
    -
    -module_init(marvell_init);
    -module_exit(marvell_exit);
    +module_pci_driver(marvell_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for Marvell ATA in legacy mode");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, marvell_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c
    index 9dc16df..1f5f28b 100644
    --- a/drivers/ata/pata_mpiix.c
    +++ b/drivers/ata/pata_mpiix.c
    @@ -230,21 +230,10 @@ static struct pci_driver mpiix_pci_driver = {
    #endif
    };

    -static int __init mpiix_init(void)
    -{
    - return pci_register_driver(&mpiix_pci_driver);
    -}
    -
    -static void __exit mpiix_exit(void)
    -{
    - pci_unregister_driver(&mpiix_pci_driver);
    -}
    +module_pci_driver(mpiix_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Intel MPIIX");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, mpiix);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(mpiix_init);
    -module_exit(mpiix_exit);
    diff --git a/drivers/ata/pata_netcell.c b/drivers/ata/pata_netcell.c
    index 9979a43..ad1a0fe 100644
    --- a/drivers/ata/pata_netcell.c
    +++ b/drivers/ata/pata_netcell.c
    @@ -99,22 +99,10 @@ static struct pci_driver netcell_pci_driver = {
    #endif
    };

    -static int __init netcell_init(void)
    -{
    - return pci_register_driver(&netcell_pci_driver);
    -}
    -
    -static void __exit netcell_exit(void)
    -{
    - pci_unregister_driver(&netcell_pci_driver);
    -}
    -
    -module_init(netcell_init);
    -module_exit(netcell_exit);
    +module_pci_driver(netcell_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for Netcell PATA RAID");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, netcell_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    diff --git a/drivers/ata/pata_ninja32.c b/drivers/ata/pata_ninja32.c
    index e277a14..12010ed 100644
    --- a/drivers/ata/pata_ninja32.c
    +++ b/drivers/ata/pata_ninja32.c
    @@ -190,21 +190,10 @@ static struct pci_driver ninja32_pci_driver = {
    #endif
    };

    -static int __init ninja32_init(void)
    -{
    - return pci_register_driver(&ninja32_pci_driver);
    -}
    -
    -static void __exit ninja32_exit(void)
    -{
    - pci_unregister_driver(&ninja32_pci_driver);
    -}
    +module_pci_driver(ninja32_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Ninja32 ATA");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, ninja32);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(ninja32_init);
    -module_exit(ninja32_exit);
    diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c
    index 31d5986..0c424da 100644
    --- a/drivers/ata/pata_ns87410.c
    +++ b/drivers/ata/pata_ns87410.c
    @@ -168,21 +168,10 @@ static struct pci_driver ns87410_pci_driver = {
    #endif
    };

    -static int __init ns87410_init(void)
    -{
    - return pci_register_driver(&ns87410_pci_driver);
    -}
    -
    -static void __exit ns87410_exit(void)
    -{
    - pci_unregister_driver(&ns87410_pci_driver);
    -}
    +module_pci_driver(ns87410_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Nat Semi 87410");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, ns87410);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(ns87410_init);
    -module_exit(ns87410_exit);
    diff --git a/drivers/ata/pata_ns87415.c b/drivers/ata/pata_ns87415.c
    index f1d517b..6f6fa10 100644
    --- a/drivers/ata/pata_ns87415.c
    +++ b/drivers/ata/pata_ns87415.c
    @@ -414,18 +414,7 @@ static struct pci_driver ns87415_pci_driver = {
    #endif
    };

    -static int __init ns87415_init(void)
    -{
    - return pci_register_driver(&ns87415_pci_driver);
    -}
    -
    -static void __exit ns87415_exit(void)
    -{
    - pci_unregister_driver(&ns87415_pci_driver);
    -}
    -
    -module_init(ns87415_init);
    -module_exit(ns87415_exit);
    +module_pci_driver(ns87415_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("ATA low-level driver for NS87415 controllers");
    diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c
    index 98cdf50..d77b2e1 100644
    --- a/drivers/ata/pata_oldpiix.c
    +++ b/drivers/ata/pata_oldpiix.c
    @@ -265,22 +265,10 @@ static struct pci_driver oldpiix_pci_driver = {
    #endif
    };

    -static int __init oldpiix_init(void)
    -{
    - return pci_register_driver(&oldpiix_pci_driver);
    -}
    -
    -static void __exit oldpiix_exit(void)
    -{
    - pci_unregister_driver(&oldpiix_pci_driver);
    -}
    -
    -module_init(oldpiix_init);
    -module_exit(oldpiix_exit);
    +module_pci_driver(oldpiix_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for early PIIX series controllers");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, oldpiix_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c
    index accc033..4ea70cd 100644
    --- a/drivers/ata/pata_opti.c
    +++ b/drivers/ata/pata_opti.c
    @@ -191,22 +191,10 @@ static struct pci_driver opti_pci_driver = {
    #endif
    };

    -static int __init opti_init(void)
    -{
    - return pci_register_driver(&opti_pci_driver);
    -}
    -
    -static void __exit opti_exit(void)
    -{
    - pci_unregister_driver(&opti_pci_driver);
    -}
    -
    +module_pci_driver(opti_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Opti 621/621X");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, opti);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(opti_init);
    -module_exit(opti_exit);
    diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c
    index 77cb914..78ede3f 100644
    --- a/drivers/ata/pata_optidma.c
    +++ b/drivers/ata/pata_optidma.c
    @@ -447,21 +447,10 @@ static struct pci_driver optidma_pci_driver = {
    #endif
    };

    -static int __init optidma_init(void)
    -{
    - return pci_register_driver(&optidma_pci_driver);
    -}
    -
    -static void __exit optidma_exit(void)
    -{
    - pci_unregister_driver(&optidma_pci_driver);
    -}
    +module_pci_driver(optidma_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Opti Firestar/Firestar Plus");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, optidma);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(optidma_init);
    -module_exit(optidma_exit);
    diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
    index a808ba0..958238d 100644
    --- a/drivers/ata/pata_pcmcia.c
    +++ b/drivers/ata/pata_pcmcia.c
    @@ -170,7 +170,8 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev, void *priv_data)
    {
    int *is_kme = priv_data;

    - if (!(pdev->resource[0]->flags & IO_DATA_PATH_WIDTH_8)) {
    + if ((pdev->resource[0]->flags & IO_DATA_PATH_WIDTH)
    + != IO_DATA_PATH_WIDTH_8) {
    pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
    pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
    }
    diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c
    index 7d63f24..c9399c8 100644
    --- a/drivers/ata/pata_pdc2027x.c
    +++ b/drivers/ata/pata_pdc2027x.c
    @@ -784,21 +784,4 @@ static int pdc2027x_reinit_one(struct pci_dev *pdev)
    }
    #endif

    -/**
    - * pdc2027x_init - Called after this module is loaded into the kernel.
    - */
    -static int __init pdc2027x_init(void)
    -{
    - return pci_register_driver(&pdc2027x_pci_driver);
    -}
    -
    -/**
    - * pdc2027x_exit - Called before this module unloaded from the kernel
    - */
    -static void __exit pdc2027x_exit(void)
    -{
    - pci_unregister_driver(&pdc2027x_pci_driver);
    -}
    -
    -module_init(pdc2027x_init);
    -module_exit(pdc2027x_exit);
    +module_pci_driver(pdc2027x_pci_driver);
    diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c
    index c2ed586..c34fc50 100644
    --- a/drivers/ata/pata_pdc202xx_old.c
    +++ b/drivers/ata/pata_pdc202xx_old.c
    @@ -384,21 +384,10 @@ static struct pci_driver pdc202xx_pci_driver = {
    #endif
    };

    -static int __init pdc202xx_init(void)
    -{
    - return pci_register_driver(&pdc202xx_pci_driver);
    -}
    -
    -static void __exit pdc202xx_exit(void)
    -{
    - pci_unregister_driver(&pdc202xx_pci_driver);
    -}
    +module_pci_driver(pdc202xx_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Promise 2024x and 20262-20267");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, pdc202xx);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(pdc202xx_init);
    -module_exit(pdc202xx_exit);
    diff --git a/drivers/ata/pata_piccolo.c b/drivers/ata/pata_piccolo.c
    index cb01bf9..2beb6b5 100644
    --- a/drivers/ata/pata_piccolo.c
    +++ b/drivers/ata/pata_piccolo.c
    @@ -117,24 +117,10 @@ static struct pci_driver ata_tosh_pci_driver = {
    #endif
    };

    -static int __init ata_tosh_init(void)
    -{
    - return pci_register_driver(&ata_tosh_pci_driver);
    -}
    -
    -
    -static void __exit ata_tosh_exit(void)
    -{
    - pci_unregister_driver(&ata_tosh_pci_driver);
    -}
    -
    +module_pci_driver(ata_tosh_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("Low level driver for Toshiba Piccolo ATA");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, ata_tosh);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(ata_tosh_init);
    -module_exit(ata_tosh_exit);
    -
    diff --git a/drivers/ata/pata_radisys.c b/drivers/ata/pata_radisys.c
    index b2d3a2b..f582ba1 100644
    --- a/drivers/ata/pata_radisys.c
    +++ b/drivers/ata/pata_radisys.c
    @@ -244,22 +244,10 @@ static struct pci_driver radisys_pci_driver = {
    #endif
    };

    -static int __init radisys_init(void)
    -{
    - return pci_register_driver(&radisys_pci_driver);
    -}
    -
    -static void __exit radisys_exit(void)
    -{
    - pci_unregister_driver(&radisys_pci_driver);
    -}
    -
    -module_init(radisys_init);
    -module_exit(radisys_exit);
    +module_pci_driver(radisys_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for Radisys R82600 controllers");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, radisys_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    diff --git a/drivers/ata/pata_rdc.c b/drivers/ata/pata_rdc.c
    index e6a2dd7..32a3499 100644
    --- a/drivers/ata/pata_rdc.c
    +++ b/drivers/ata/pata_rdc.c
    @@ -394,18 +394,7 @@ static struct pci_driver rdc_pci_driver = {
    };


    -static int __init rdc_init(void)
    -{
    - return pci_register_driver(&rdc_pci_driver);
    -}
    -
    -static void __exit rdc_exit(void)
    -{
    - pci_unregister_driver(&rdc_pci_driver);
    -}
    -
    -module_init(rdc_init);
    -module_exit(rdc_exit);
    +module_pci_driver(rdc_pci_driver);

    MODULE_AUTHOR("Alan Cox (based on ata_piix)");
    MODULE_DESCRIPTION("SCSI low-level driver for RDC PATA controllers");
    diff --git a/drivers/ata/pata_rz1000.c b/drivers/ata/pata_rz1000.c
    index aca321e..60f4de2 100644
    --- a/drivers/ata/pata_rz1000.c
    +++ b/drivers/ata/pata_rz1000.c
    @@ -140,22 +140,10 @@ static struct pci_driver rz1000_pci_driver = {
    #endif
    };

    -static int __init rz1000_init(void)
    -{
    - return pci_register_driver(&rz1000_pci_driver);
    -}
    -
    -static void __exit rz1000_exit(void)
    -{
    - pci_unregister_driver(&rz1000_pci_driver);
    -}
    +module_pci_driver(rz1000_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for RZ1000 PCI ATA");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, pata_rz1000);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(rz1000_init);
    -module_exit(rz1000_exit);
    -
    diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c
    index c0e603a..ce2f828 100644
    --- a/drivers/ata/pata_sc1200.c
    +++ b/drivers/ata/pata_sc1200.c
    @@ -261,21 +261,10 @@ static struct pci_driver sc1200_pci_driver = {
    #endif
    };

    -static int __init sc1200_init(void)
    -{
    - return pci_register_driver(&sc1200_pci_driver);
    -}
    -
    -static void __exit sc1200_exit(void)
    -{
    - pci_unregister_driver(&sc1200_pci_driver);
    -}
    +module_pci_driver(sc1200_pci_driver);

    MODULE_AUTHOR("Alan Cox, Mark Lord");
    MODULE_DESCRIPTION("low-level driver for the NS/AMD SC1200");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, sc1200);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(sc1200_init);
    -module_exit(sc1200_exit);
    diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c
    index e265f83..f35f15f 100644
    --- a/drivers/ata/pata_scc.c
    +++ b/drivers/ata/pata_scc.c
    @@ -1103,26 +1103,7 @@ static struct pci_driver scc_pci_driver = {
    #endif
    };

    -static int __init scc_init (void)
    -{
    - int rc;
    -
    - DPRINTK("pci_register_driver\n");
    - rc = pci_register_driver(&scc_pci_driver);
    - if (rc)
    - return rc;
    -
    - DPRINTK("done\n");
    - return 0;
    -}
    -
    -static void __exit scc_exit (void)
    -{
    - pci_unregister_driver(&scc_pci_driver);
    -}
    -
    -module_init(scc_init);
    -module_exit(scc_exit);
    +module_pci_driver(scc_pci_driver);

    MODULE_AUTHOR("Toshiba corp");
    MODULE_DESCRIPTION("SCSI low-level driver for Toshiba SCC PATA controller");
    diff --git a/drivers/ata/pata_sch.c b/drivers/ata/pata_sch.c
    index 7c78b99..db0d18c 100644
    --- a/drivers/ata/pata_sch.c
    +++ b/drivers/ata/pata_sch.c
    @@ -179,15 +179,4 @@ static int __devinit sch_init_one(struct pci_dev *pdev,
    return ata_pci_bmdma_init_one(pdev, ppi, &sch_sht, NULL, 0);
    }

    -static int __init sch_init(void)
    -{
    - return pci_register_driver(&sch_pci_driver);
    -}
    -
    -static void __exit sch_exit(void)
    -{
    - pci_unregister_driver(&sch_pci_driver);
    -}
    -
    -module_init(sch_init);
    -module_exit(sch_exit);
    +module_pci_driver(sch_pci_driver);
    diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c
    index 71eaf38..f3febbc 100644
    --- a/drivers/ata/pata_serverworks.c
    +++ b/drivers/ata/pata_serverworks.c
    @@ -475,21 +475,10 @@ static struct pci_driver serverworks_pci_driver = {
    #endif
    };

    -static int __init serverworks_init(void)
    -{
    - return pci_register_driver(&serverworks_pci_driver);
    -}
    -
    -static void __exit serverworks_exit(void)
    -{
    - pci_unregister_driver(&serverworks_pci_driver);
    -}
    +module_pci_driver(serverworks_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Serverworks OSB4/CSB5/CSB6");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, serverworks);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(serverworks_init);
    -module_exit(serverworks_exit);
    diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c
    index b92eacf..5cfdf94 100644
    --- a/drivers/ata/pata_sil680.c
    +++ b/drivers/ata/pata_sil680.c
    @@ -437,21 +437,10 @@ static struct pci_driver sil680_pci_driver = {
    #endif
    };

    -static int __init sil680_init(void)
    -{
    - return pci_register_driver(&sil680_pci_driver);
    -}
    -
    -static void __exit sil680_exit(void)
    -{
    - pci_unregister_driver(&sil680_pci_driver);
    -}
    +module_pci_driver(sil680_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for SI680 PATA");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, sil680);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(sil680_init);
    -module_exit(sil680_exit);
    diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c
    index b0edc7d..2d5ac13 100644
    --- a/drivers/ata/pata_sis.c
    +++ b/drivers/ata/pata_sis.c
    @@ -906,22 +906,10 @@ static struct pci_driver sis_pci_driver = {
    #endif
    };

    -static int __init sis_init(void)
    -{
    - return pci_register_driver(&sis_pci_driver);
    -}
    -
    -static void __exit sis_exit(void)
    -{
    - pci_unregister_driver(&sis_pci_driver);
    -}
    -
    -module_init(sis_init);
    -module_exit(sis_exit);
    +module_pci_driver(sis_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("SCSI low-level driver for SiS ATA");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, sis_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c
    index 24cf200..738e000 100644
    --- a/drivers/ata/pata_sl82c105.c
    +++ b/drivers/ata/pata_sl82c105.c
    @@ -372,21 +372,10 @@ static struct pci_driver sl82c105_pci_driver = {
    #endif
    };

    -static int __init sl82c105_init(void)
    -{
    - return pci_register_driver(&sl82c105_pci_driver);
    -}
    -
    -static void __exit sl82c105_exit(void)
    -{
    - pci_unregister_driver(&sl82c105_pci_driver);
    -}
    +module_pci_driver(sl82c105_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Sl82c105");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, sl82c105);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(sl82c105_init);
    -module_exit(sl82c105_exit);
    diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c
    index 28da1c6..c8e589d 100644
    --- a/drivers/ata/pata_triflex.c
    +++ b/drivers/ata/pata_triflex.c
    @@ -240,21 +240,10 @@ static struct pci_driver triflex_pci_driver = {
    #endif
    };

    -static int __init triflex_init(void)
    -{
    - return pci_register_driver(&triflex_pci_driver);
    -}
    -
    -static void __exit triflex_exit(void)
    -{
    - pci_unregister_driver(&triflex_pci_driver);
    -}
    +module_pci_driver(triflex_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for Compaq Triflex");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, triflex);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(triflex_init);
    -module_exit(triflex_exit);
    diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
    index 255f336..8d2a9fd 100644
    --- a/drivers/ata/pata_via.c
    +++ b/drivers/ata/pata_via.c
    @@ -711,21 +711,10 @@ static struct pci_driver via_pci_driver = {
    #endif
    };

    -static int __init via_init(void)
    -{
    - return pci_register_driver(&via_pci_driver);
    -}
    -
    -static void __exit via_exit(void)
    -{
    - pci_unregister_driver(&via_pci_driver);
    -}
    +module_pci_driver(via_pci_driver);

    MODULE_AUTHOR("Alan Cox");
    MODULE_DESCRIPTION("low-level driver for VIA PATA");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, via);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(via_init);
    -module_exit(via_exit);
    diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
    index 04911d5..5053333 100644
    --- a/drivers/ata/pdc_adma.c
    +++ b/drivers/ata/pdc_adma.c
    @@ -660,21 +660,10 @@ static int adma_ata_init_one(struct pci_dev *pdev,
    &adma_ata_sht);
    }

    -static int __init adma_ata_init(void)
    -{
    - return pci_register_driver(&adma_ata_pci_driver);
    -}
    -
    -static void __exit adma_ata_exit(void)
    -{
    - pci_unregister_driver(&adma_ata_pci_driver);
    -}
    +module_pci_driver(adma_ata_pci_driver);

    MODULE_AUTHOR("Mark Lord");
    MODULE_DESCRIPTION("Pacific Digital Corporation ADMA low-level driver");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, adma_ata_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(adma_ata_init);
    -module_exit(adma_ata_exit);
    diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c
    old mode 100644
    new mode 100755
    index 69f7cde..937aeb3
    --- a/drivers/ata/sata_dwc_460ex.c
    +++ b/drivers/ata/sata_dwc_460ex.c
    @@ -158,6 +158,7 @@ enum {
    /* Assign HW handshaking interface (x) to destination / source peripheral */
    #define DMA_CFG_HW_HS_DEST(int_num) (((int_num) & 0xF) << 11)
    #define DMA_CFG_HW_HS_SRC(int_num) (((int_num) & 0xF) << 7)
    +#define DMA_CFG_HW_CH_PRIOR(int_num) (((int_num) & 0xF) << 5)
    #define DMA_LLP_LMS(addr, master) (((addr) & 0xfffffffc) | (master))

    /*
    @@ -318,6 +319,7 @@ struct sata_dwc_host_priv {
    u32 dma_interrupt_count;
    struct ahb_dma_regs *sata_dma_regs;
    struct device *dwc_dev;
    + int dma_channel;
    };
    struct sata_dwc_host_priv host_pvt;
    /*
    @@ -437,15 +439,12 @@ static void clear_chan_interrupts(int c)
    */
    static int dma_request_channel(void)
    {
    - int i;
    -
    - for (i = 0; i < DMA_NUM_CHANS; i++) {
    - if (!(in_le32(&(host_pvt.sata_dma_regs->dma_chan_en.low)) &\
    - DMA_CHANNEL(i)))
    - return i;
    - }
    - dev_err(host_pvt.dwc_dev, "%s NO channel chan_en: 0x%08x\n", __func__,
    - in_le32(&(host_pvt.sata_dma_regs->dma_chan_en.low)));
    + /* Check if the channel is not currently in use */
    + if (!(in_le32(&(host_pvt.sata_dma_regs->dma_chan_en.low)) &
    + DMA_CHANNEL(host_pvt.dma_channel)))
    + return host_pvt.dma_channel;
    + dev_err(host_pvt.dwc_dev, "%s Channel %d is currently in use\n",
    + __func__, host_pvt.dma_channel);
    return -1;
    }

    @@ -481,7 +480,8 @@ static irqreturn_t dma_dwc_interrupt(int irq, void *hsdev_instance)
    dev_dbg(ap->dev, "eot=0x%08x err=0x%08x pending=%d active port=%d\n",
    tfr_reg, err_reg, hsdevp->dma_pending[tag], port);

    - for (chan = 0; chan < DMA_NUM_CHANS; chan++) {
    + chan = host_pvt.dma_channel;
    + if (chan >= 0) {
    /* Check for end-of-transfer interrupt. */
    if (tfr_reg & DMA_CHANNEL(chan)) {
    /*
    @@ -534,9 +534,9 @@ static irqreturn_t dma_dwc_interrupt(int irq, void *hsdev_instance)
    static int dma_request_interrupts(struct sata_dwc_device *hsdev, int irq)
    {
    int retval = 0;
    - int chan;
    + int chan = host_pvt.dma_channel;

    - for (chan = 0; chan < DMA_NUM_CHANS; chan++) {
    + if (chan >= 0) {
    /* Unmask error interrupt */
    out_le32(&(host_pvt.sata_dma_regs)->interrupt_mask.error.low,
    DMA_ENABLE_CHAN(chan));
    @@ -575,7 +575,10 @@ static int map_sg_to_lli(struct scatterlist *sg, int num_elems,
    int fis_len = 0;
    dma_addr_t next_llp;
    int bl;
    + int sms_val, dms_val;

    + sms_val = 0;
    + dms_val = 1 + host_pvt.dma_channel;
    dev_dbg(host_pvt.dwc_dev, "%s: sg=%p nelem=%d lli=%p dma_lli=0x%08x"
    " dmadr=0x%08x\n", __func__, sg, num_elems, lli, (u32)dma_lli,
    (u32)dmadr_addr);
    @@ -635,8 +638,8 @@ static int map_sg_to_lli(struct scatterlist *sg, int num_elems,

    lli[idx].ctl.low = cpu_to_le32(
    DMA_CTL_TTFC(DMA_CTL_TTFC_P2M_DMAC) |
    - DMA_CTL_SMS(0) |
    - DMA_CTL_DMS(1) |
    + DMA_CTL_SMS(sms_val) |
    + DMA_CTL_DMS(dms_val) |
    DMA_CTL_SRC_MSIZE(bl) |
    DMA_CTL_DST_MSIZE(bl) |
    DMA_CTL_SINC_NOCHANGE |
    @@ -651,8 +654,8 @@ static int map_sg_to_lli(struct scatterlist *sg, int num_elems,

    lli[idx].ctl.low = cpu_to_le32(
    DMA_CTL_TTFC(DMA_CTL_TTFC_M2P_PER) |
    - DMA_CTL_SMS(1) |
    - DMA_CTL_DMS(0) |
    + DMA_CTL_SMS(dms_val) |
    + DMA_CTL_DMS(sms_val) |
    DMA_CTL_SRC_MSIZE(bl) |
    DMA_CTL_DST_MSIZE(bl) |
    DMA_CTL_DINC_NOCHANGE |
    @@ -744,8 +747,10 @@ static int dma_dwc_xfer_setup(struct scatterlist *sg, int num_elems,

    /* Program the CFG register. */
    out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].cfg.high),
    + DMA_CFG_HW_HS_SRC(dma_ch) | DMA_CFG_HW_HS_DEST(dma_ch) |
    DMA_CFG_PROTCTL | DMA_CFG_FCMOD_REQ);
    - out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].cfg.low), 0);
    + out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].cfg.low),
    + DMA_CFG_HW_CH_PRIOR(dma_ch));

    /* Program the address of the linked list */
    out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].llp.low),
    @@ -1581,10 +1586,31 @@ static void sata_dwc_qc_prep(struct ata_queued_cmd *qc)

    static void sata_dwc_error_handler(struct ata_port *ap)
    {
    - ap->link.flags |= ATA_LFLAG_NO_HRST;
    ata_sff_error_handler(ap);
    }

    +int sata_dwc_hardreset(struct ata_link *link, unsigned int *class,
    + unsigned long deadline)
    +{
    + struct sata_dwc_device *hsdev = HSDEV_FROM_AP(link->ap);
    + int ret;
    +
    + ret = sata_sff_hardreset(link, class, deadline);
    +
    + sata_dwc_enable_interrupts(hsdev);
    +
    + /* Reconfigure the DMA control register */
    + out_le32(&hsdev->sata_dwc_regs->dmacr,
    + SATA_DWC_DMACR_TXRXCH_CLEAR);
    +
    + /* Reconfigure the DMA Burst Transaction Size register */
    + out_le32(&hsdev->sata_dwc_regs->dbtsr,
    + SATA_DWC_DBTSR_MWR(AHB_DMA_BRST_DFLT) |
    + SATA_DWC_DBTSR_MRD(AHB_DMA_BRST_DFLT));
    +
    + return ret;
    +}
    +
    /*
    * scsi mid-layer and libata interface structures
    */
    @@ -1604,6 +1630,7 @@ static struct ata_port_operations sata_dwc_ops = {
    .inherits = &ata_sff_port_ops,

    .error_handler = sata_dwc_error_handler,
    + .hardreset = sata_dwc_hardreset,

    .qc_prep = sata_dwc_qc_prep,
    .qc_issue = sata_dwc_qc_issue,
    @@ -1638,6 +1665,8 @@ static int sata_dwc_probe(struct platform_device *ofdev)
    struct ata_host *host;
    struct ata_port_info pi = sata_dwc_port_info[0];
    const struct ata_port_info *ppi[] = { &pi, NULL };
    + struct device_node *np = ofdev->dev.of_node;
    + u32 dma_chan;

    /* Allocate DWC SATA device */
    hsdev = kzalloc(sizeof(*hsdev), GFP_KERNEL);
    @@ -1647,6 +1676,13 @@ static int sata_dwc_probe(struct platform_device *ofdev)
    goto error;
    }

    + if (of_property_read_u32(np, "dma-channel", &dma_chan)) {
    + dev_warn(&ofdev->dev, "no dma-channel property set."
    + " Use channel 0\n");
    + dma_chan = 0;
    + }
    + host_pvt.dma_channel = dma_chan;
    +
    /* Ioremap SATA registers */
    base = of_iomap(ofdev->dev.of_node, 0);
    if (!base) {
    diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
    index 5c7d70c..dc35f4d 100644
    --- a/drivers/ata/sata_inic162x.c
    +++ b/drivers/ata/sata_inic162x.c
    @@ -894,21 +894,10 @@ static struct pci_driver inic_pci_driver = {
    .remove = ata_pci_remove_one,
    };

    -static int __init inic_init(void)
    -{
    - return pci_register_driver(&inic_pci_driver);
    -}
    -
    -static void __exit inic_exit(void)
    -{
    - pci_unregister_driver(&inic_pci_driver);
    -}
    +module_pci_driver(inic_pci_driver);

    MODULE_AUTHOR("Tejun Heo");
    MODULE_DESCRIPTION("low-level driver for Initio 162x SATA");
    MODULE_LICENSE("GPL v2");
    MODULE_DEVICE_TABLE(pci, inic_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(inic_init);
    -module_exit(inic_exit);
    diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
    index 55d6179..85ee499 100644
    --- a/drivers/ata/sata_nv.c
    +++ b/drivers/ata/sata_nv.c
    @@ -2510,22 +2510,11 @@ static void nv_adma_host_stop(struct ata_host *host)
    nv_ck804_host_stop(host);
    }

    -static int __init nv_init(void)
    -{
    - return pci_register_driver(&nv_pci_driver);
    -}
    -
    -static void __exit nv_exit(void)
    -{
    - pci_unregister_driver(&nv_pci_driver);
    -}
    +module_pci_driver(nv_pci_driver);

    -module_init(nv_init);
    -module_exit(nv_exit);
    module_param_named(adma, adma_enabled, bool, 0444);
    MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)");
    module_param_named(swncq, swncq_enabled, bool, 0444);
    MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)");
    module_param_named(msi, msi_enabled, bool, 0444);
    MODULE_PARM_DESC(msi, "Enable use of MSI (Default: false)");
    -
    diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
    index 000fcc9..489c817 100644
    --- a/drivers/ata/sata_promise.c
    +++ b/drivers/ata/sata_promise.c
    @@ -1249,21 +1249,10 @@ static int pdc_ata_init_one(struct pci_dev *pdev,
    &pdc_ata_sht);
    }

    -static int __init pdc_ata_init(void)
    -{
    - return pci_register_driver(&pdc_ata_pci_driver);
    -}
    -
    -static void __exit pdc_ata_exit(void)
    -{
    - pci_unregister_driver(&pdc_ata_pci_driver);
    -}
    +module_pci_driver(pdc_ata_pci_driver);

    MODULE_AUTHOR("Jeff Garzik");
    MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, pdc_ata_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(pdc_ata_init);
    -module_exit(pdc_ata_exit);
    diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c
    index 9d1a47b..3b0dd57 100644
    --- a/drivers/ata/sata_qstor.c
    +++ b/drivers/ata/sata_qstor.c
    @@ -635,21 +635,10 @@ static int qs_ata_init_one(struct pci_dev *pdev,
    &qs_ata_sht);
    }

    -static int __init qs_ata_init(void)
    -{
    - return pci_register_driver(&qs_ata_pci_driver);
    -}
    -
    -static void __exit qs_ata_exit(void)
    -{
    - pci_unregister_driver(&qs_ata_pci_driver);
    -}
    +module_pci_driver(qs_ata_pci_driver);

    MODULE_AUTHOR("Mark Lord");
    MODULE_DESCRIPTION("Pacific Digital Corporation QStor SATA low-level driver");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, qs_ata_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(qs_ata_init);
    -module_exit(qs_ata_exit);
    diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
    index 9dfb40b..a7b3167 100644
    --- a/drivers/ata/sata_sil.c
    +++ b/drivers/ata/sata_sil.c
    @@ -819,16 +819,4 @@ static int sil_pci_device_resume(struct pci_dev *pdev)
    }
    #endif

    -static int __init sil_init(void)
    -{
    - return pci_register_driver(&sil_pci_driver);
    -}
    -
    -static void __exit sil_exit(void)
    -{
    - pci_unregister_driver(&sil_pci_driver);
    -}
    -
    -
    -module_init(sil_init);
    -module_exit(sil_exit);
    +module_pci_driver(sil_pci_driver);
    diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
    index e7e610a..a5f2a56 100644
    --- a/drivers/ata/sata_sil24.c
    +++ b/drivers/ata/sata_sil24.c
    @@ -1382,20 +1382,9 @@ static int sil24_port_resume(struct ata_port *ap)
    }
    #endif

    -static int __init sil24_init(void)
    -{
    - return pci_register_driver(&sil24_pci_driver);
    -}
    -
    -static void __exit sil24_exit(void)
    -{
    - pci_unregister_driver(&sil24_pci_driver);
    -}
    +module_pci_driver(sil24_pci_driver);

    MODULE_AUTHOR("Tejun Heo");
    MODULE_DESCRIPTION("Silicon Image 3124/3132 SATA low-level driver");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, sil24_pci_tbl);
    -
    -module_init(sil24_init);
    -module_exit(sil24_exit);
    diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c
    index 95ec435..fe3ca09 100644
    --- a/drivers/ata/sata_sis.c
    +++ b/drivers/ata/sata_sis.c
    @@ -308,15 +308,4 @@ static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
    IRQF_SHARED, &sis_sht);
    }

    -static int __init sis_init(void)
    -{
    - return pci_register_driver(&sis_pci_driver);
    -}
    -
    -static void __exit sis_exit(void)
    -{
    - pci_unregister_driver(&sis_pci_driver);
    -}
    -
    -module_init(sis_init);
    -module_exit(sis_exit);
    +module_pci_driver(sis_pci_driver);
    diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c
    index c646118..44a4256 100644
    --- a/drivers/ata/sata_svw.c
    +++ b/drivers/ata/sata_svw.c
    @@ -525,21 +525,10 @@ static struct pci_driver k2_sata_pci_driver = {
    .remove = ata_pci_remove_one,
    };

    -static int __init k2_sata_init(void)
    -{
    - return pci_register_driver(&k2_sata_pci_driver);
    -}
    -
    -static void __exit k2_sata_exit(void)
    -{
    - pci_unregister_driver(&k2_sata_pci_driver);
    -}
    +module_pci_driver(k2_sata_pci_driver);

    MODULE_AUTHOR("Benjamin Herrenschmidt");
    MODULE_DESCRIPTION("low-level driver for K2 SATA controller");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, k2_sata_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(k2_sata_init);
    -module_exit(k2_sata_exit);
    diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
    index cdaebbe..1226055 100644
    --- a/drivers/ata/sata_sx4.c
    +++ b/drivers/ata/sata_sx4.c
    @@ -1498,24 +1498,10 @@ static int pdc_sata_init_one(struct pci_dev *pdev,
    IRQF_SHARED, &pdc_sata_sht);
    }

    -
    -static int __init pdc_sata_init(void)
    -{
    - return pci_register_driver(&pdc_sata_pci_driver);
    -}
    -
    -
    -static void __exit pdc_sata_exit(void)
    -{
    - pci_unregister_driver(&pdc_sata_pci_driver);
    -}
    -
    +module_pci_driver(pdc_sata_pci_driver);

    MODULE_AUTHOR("Jeff Garzik");
    MODULE_DESCRIPTION("Promise SATA low-level driver");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, pdc_sata_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(pdc_sata_init);
    -module_exit(pdc_sata_exit);
    diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c
    index b54ebfc..6d64891 100644
    --- a/drivers/ata/sata_uli.c
    +++ b/drivers/ata/sata_uli.c
    @@ -243,16 +243,4 @@ static int uli_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
    IRQF_SHARED, &uli_sht);
    }

    -static int __init uli_init(void)
    -{
    - return pci_register_driver(&uli_pci_driver);
    -}
    -
    -static void __exit uli_exit(void)
    -{
    - pci_unregister_driver(&uli_pci_driver);
    -}
    -
    -
    -module_init(uli_init);
    -module_exit(uli_exit);
    +module_pci_driver(uli_pci_driver);
    diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
    index f93e43b..5913ea9 100644
    --- a/drivers/ata/sata_via.c
    +++ b/drivers/ata/sata_via.c
    @@ -655,15 +655,4 @@ static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
    IRQF_SHARED, &svia_sht);
    }

    -static int __init svia_init(void)
    -{
    - return pci_register_driver(&svia_pci_driver);
    -}
    -
    -static void __exit svia_exit(void)
    -{
    - pci_unregister_driver(&svia_pci_driver);
    -}
    -
    -module_init(svia_init);
    -module_exit(svia_exit);
    +module_pci_driver(svia_pci_driver);
    diff --git a/drivers/ata/sata_vsc.c b/drivers/ata/sata_vsc.c
    index 6135a52..e8cf88ba 100644
    --- a/drivers/ata/sata_vsc.c
    +++ b/drivers/ata/sata_vsc.c
    @@ -436,21 +436,10 @@ static struct pci_driver vsc_sata_pci_driver = {
    .remove = ata_pci_remove_one,
    };

    -static int __init vsc_sata_init(void)
    -{
    - return pci_register_driver(&vsc_sata_pci_driver);
    -}
    -
    -static void __exit vsc_sata_exit(void)
    -{
    - pci_unregister_driver(&vsc_sata_pci_driver);
    -}
    +module_pci_driver(vsc_sata_pci_driver);

    MODULE_AUTHOR("Jeremy Higdon");
    MODULE_DESCRIPTION("low-level driver for Vitesse VSC7174 SATA controller");
    MODULE_LICENSE("GPL");
    MODULE_DEVICE_TABLE(pci, vsc_sata_pci_tbl);
    MODULE_VERSION(DRV_VERSION);
    -
    -module_init(vsc_sata_init);
    -module_exit(vsc_sata_exit);
    diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
    index b583277..ffd7773 100644
    --- a/drivers/scsi/scsi_lib.c
    +++ b/drivers/scsi/scsi_lib.c
    @@ -68,6 +68,23 @@ static struct scsi_host_sg_pool scsi_sg_pools[] = {

    struct kmem_cache *scsi_sdb_cache;

    +#ifdef CONFIG_ACPI
    +#include <acpi/acpi_bus.h>
    +
    +int scsi_register_acpi_bus_type(struct acpi_bus_type *bus)
    +{
    + bus->bus = &scsi_bus_type;
    + return register_acpi_bus_type(bus);
    +}
    +EXPORT_SYMBOL_GPL(scsi_register_acpi_bus_type);
    +
    +void scsi_unregister_acpi_bus_type(struct acpi_bus_type *bus)
    +{
    + unregister_acpi_bus_type(bus);
    +}
    +EXPORT_SYMBOL_GPL(scsi_unregister_acpi_bus_type);
    +#endif
    +
    /*
    * When to reinvoke queueing after a resource shortage. It's 3 msecs to
    * not change behaviour from the previous unplug mechanism, experimentation
    diff --git a/include/linux/ata.h b/include/linux/ata.h
    index 32df2b6..5713d3a 100644
    --- a/include/linux/ata.h
    +++ b/include/linux/ata.h
    @@ -578,6 +578,7 @@ static inline int ata_is_data(u8 prot)
    ((u64) (id)[(n) + 0]) )

    #define ata_id_cdb_intr(id) (((id)[ATA_ID_CONFIG] & 0x60) == 0x20)
    +#define ata_id_has_da(id) ((id)[77] & (1 << 4))

    static inline bool ata_id_has_hipm(const u16 *id)
    {
    diff --git a/include/linux/libata.h b/include/linux/libata.h
    index 53da442..64f90e1 100644
    --- a/include/linux/libata.h
    +++ b/include/linux/libata.h
    @@ -161,6 +161,8 @@ enum {
    ATA_DFLAG_DETACH = (1 << 24),
    ATA_DFLAG_DETACHED = (1 << 25),

    + ATA_DFLAG_DA = (1 << 26), /* device supports Device Attention */
    +
    ATA_DEV_UNKNOWN = 0, /* unknown device */
    ATA_DEV_ATA = 1, /* ATA device */
    ATA_DEV_ATA_UNSUP = 2, /* ATA device (unsupported) */
    @@ -545,9 +547,6 @@ struct ata_host {
    struct mutex eh_mutex;
    struct task_struct *eh_owner;

    -#ifdef CONFIG_ATA_ACPI
    - acpi_handle acpi_handle;
    -#endif
    struct ata_port *simplex_claimed; /* channel owning the DMA */
    struct ata_port *ports[0];
    };
    @@ -615,7 +614,6 @@ struct ata_device {
    struct scsi_device *sdev; /* attached SCSI device */
    void *private_data;
    #ifdef CONFIG_ATA_ACPI
    - acpi_handle acpi_handle;
    union acpi_object *gtf_cache;
    unsigned int gtf_filter;
    #endif
    @@ -797,7 +795,6 @@ struct ata_port {
    void *private_data;

    #ifdef CONFIG_ATA_ACPI
    - acpi_handle acpi_handle;
    struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
    #endif
    /* owned by EH */
    @@ -1116,6 +1113,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm);
    int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm);
    unsigned long ata_acpi_gtm_xfermask(struct ata_device *dev,
    const struct ata_acpi_gtm *gtm);
    +acpi_handle ata_ap_acpi_handle(struct ata_port *ap);
    +acpi_handle ata_dev_acpi_handle(struct ata_device *dev);
    int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm);
    #else
    static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
    diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
    index c6f0974..66216c1 100644
    --- a/include/scsi/scsi.h
    +++ b/include/scsi/scsi.h
    @@ -216,6 +216,16 @@ scsi_command_size(const unsigned char *cmnd)
    scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]);
    }

    +#ifdef CONFIG_ACPI
    +struct acpi_bus_type;
    +
    +extern int
    +scsi_register_acpi_bus_type(struct acpi_bus_type *bus);
    +
    +extern void
    +scsi_unregister_acpi_bus_type(struct acpi_bus_type *bus);
    +#endif
    +
    /*
    * SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft
    * T10/1561-D Revision 4 Draft dated 7th November 2002.
    diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
    index 7539f52..9895f69 100644
    --- a/include/scsi/scsi_device.h
    +++ b/include/scsi/scsi_device.h
    @@ -154,6 +154,7 @@ struct scsi_device {
    unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */
    unsigned try_rc_10_first:1; /* Try READ_CAPACACITY_10 first */
    unsigned is_visible:1; /* is the device visible in sysfs */
    + unsigned can_power_off:1; /* Device supports runtime power off */
    unsigned wce_default_on:1; /* Cache is ON by default */

    DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */

    \
     
     \ /
      Last update: 2012-07-25 23:41    [W:5.333 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site