Commit 50be4917 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  pata_bf54x: decrease count first.
  sata_mv: re-enable hotplug, update TODO list
  sata_mv: leave SError bits untouched in mv_err_intr
  sata_mv: more interrupt handling rework
  sata_mv: tidy host controller interrupt handling
  sata_mv: simplify request/response queue handling
  sata_mv: simplify freeze/thaw bit-shift calculations
  sata_mv mask all interrupt coalescing bits
  sata_mv more cosmetics
  ata_piix: add Asus Eee 701 controller to short cable list
  libata-eh set tf flags in NCQ EH result_tf
  make sata_set_spd_needed() static
  make sata_print_link_status() static
  libata-acpi.c: remove unneeded #if's
  sata_nv: make hardreset return -EAGAIN on success
  ahci: retry enabling AHCI a few times before spitting out WARN_ON()
  libata: make WARN_ON conditions in ata_sff_hsm_move() more strict
  ATA/IDE: fix platform driver hotplug/coldplug
  sata_sis: SCR accessors return -EINVAL when requested SCR isn't available
  libata: functions with definition should not be extern
parents 37b05b17 f9d42491
...@@ -556,16 +556,27 @@ static inline void __iomem *ahci_port_base(struct ata_port *ap) ...@@ -556,16 +556,27 @@ static inline void __iomem *ahci_port_base(struct ata_port *ap)
static void ahci_enable_ahci(void __iomem *mmio) static void ahci_enable_ahci(void __iomem *mmio)
{ {
int i;
u32 tmp; u32 tmp;
/* turn on AHCI_EN */ /* turn on AHCI_EN */
tmp = readl(mmio + HOST_CTL); tmp = readl(mmio + HOST_CTL);
if (!(tmp & HOST_AHCI_EN)) { if (tmp & HOST_AHCI_EN)
return;
/* Some controllers need AHCI_EN to be written multiple times.
* Try a few times before giving up.
*/
for (i = 0; i < 5; i++) {
tmp |= HOST_AHCI_EN; tmp |= HOST_AHCI_EN;
writel(tmp, mmio + HOST_CTL); writel(tmp, mmio + HOST_CTL);
tmp = readl(mmio + HOST_CTL); /* flush && sanity check */ tmp = readl(mmio + HOST_CTL); /* flush && sanity check */
WARN_ON(!(tmp & HOST_AHCI_EN)); if (tmp & HOST_AHCI_EN)
return;
msleep(10);
} }
WARN_ON(1);
} }
/** /**
......
...@@ -573,6 +573,7 @@ static const struct ich_laptop ich_laptop[] = { ...@@ -573,6 +573,7 @@ static const struct ich_laptop ich_laptop[] = {
{ 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */
{ 0x27DF, 0x103C, 0x30A1 }, /* ICH7 on HP Compaq nc2400 */ { 0x27DF, 0x103C, 0x30A1 }, /* ICH7 on HP Compaq nc2400 */
{ 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */ { 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */
{ 0x2653, 0x1043, 0x82D8 }, /* ICH6M on Asus Eee 701 */
/* end marker */ /* end marker */
{ 0, } { 0, }
}; };
......
...@@ -227,11 +227,9 @@ void ata_acpi_associate(struct ata_host *host) ...@@ -227,11 +227,9 @@ void ata_acpi_associate(struct ata_host *host)
acpi_install_notify_handler(ap->acpi_handle, acpi_install_notify_handler(ap->acpi_handle,
ACPI_SYSTEM_NOTIFY, ACPI_SYSTEM_NOTIFY,
ata_acpi_ap_notify, ap); ata_acpi_ap_notify, ap);
#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE)
/* we might be on a docking station */ /* we might be on a docking station */
register_hotplug_dock_device(ap->acpi_handle, register_hotplug_dock_device(ap->acpi_handle,
ata_acpi_ap_notify, ap); ata_acpi_ap_notify, ap);
#endif
} }
for (j = 0; j < ata_link_max_devices(&ap->link); j++) { for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
...@@ -241,11 +239,9 @@ void ata_acpi_associate(struct ata_host *host) ...@@ -241,11 +239,9 @@ void ata_acpi_associate(struct ata_host *host)
acpi_install_notify_handler(dev->acpi_handle, acpi_install_notify_handler(dev->acpi_handle,
ACPI_SYSTEM_NOTIFY, ACPI_SYSTEM_NOTIFY,
ata_acpi_dev_notify, dev); ata_acpi_dev_notify, dev);
#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE)
/* we might be on a docking station */ /* we might be on a docking station */
register_hotplug_dock_device(dev->acpi_handle, register_hotplug_dock_device(dev->acpi_handle,
ata_acpi_dev_notify, dev); ata_acpi_dev_notify, dev);
#endif
} }
} }
} }
......
...@@ -2616,7 +2616,7 @@ void ata_port_probe(struct ata_port *ap) ...@@ -2616,7 +2616,7 @@ void ata_port_probe(struct ata_port *ap)
* LOCKING: * LOCKING:
* None. * None.
*/ */
void sata_print_link_status(struct ata_link *link) static void sata_print_link_status(struct ata_link *link)
{ {
u32 sstatus, scontrol, tmp; u32 sstatus, scontrol, tmp;
...@@ -2772,7 +2772,7 @@ static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol) ...@@ -2772,7 +2772,7 @@ static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol)
* RETURNS: * RETURNS:
* 1 if SATA spd configuration is needed, 0 otherwise. * 1 if SATA spd configuration is needed, 0 otherwise.
*/ */
int sata_set_spd_needed(struct ata_link *link) static int sata_set_spd_needed(struct ata_link *link)
{ {
u32 scontrol; u32 scontrol;
...@@ -3377,7 +3377,7 @@ int ata_wait_ready(struct ata_link *link, unsigned long deadline, ...@@ -3377,7 +3377,7 @@ int ata_wait_ready(struct ata_link *link, unsigned long deadline,
* RETURNS: * RETURNS:
* 0 if @linke is ready before @deadline; otherwise, -errno. * 0 if @linke is ready before @deadline; otherwise, -errno.
*/ */
extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline, int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
int (*check_ready)(struct ata_link *link)) int (*check_ready)(struct ata_link *link))
{ {
msleep(ATA_WAIT_AFTER_RESET_MSECS); msleep(ATA_WAIT_AFTER_RESET_MSECS);
...@@ -6208,7 +6208,6 @@ EXPORT_SYMBOL_GPL(ata_host_detach); ...@@ -6208,7 +6208,6 @@ EXPORT_SYMBOL_GPL(ata_host_detach);
EXPORT_SYMBOL_GPL(ata_sg_init); EXPORT_SYMBOL_GPL(ata_sg_init);
EXPORT_SYMBOL_GPL(ata_qc_complete); EXPORT_SYMBOL_GPL(ata_qc_complete);
EXPORT_SYMBOL_GPL(ata_qc_complete_multiple); EXPORT_SYMBOL_GPL(ata_qc_complete_multiple);
EXPORT_SYMBOL_GPL(sata_print_link_status);
EXPORT_SYMBOL_GPL(atapi_cmd_type); EXPORT_SYMBOL_GPL(atapi_cmd_type);
EXPORT_SYMBOL_GPL(ata_tf_to_fis); EXPORT_SYMBOL_GPL(ata_tf_to_fis);
EXPORT_SYMBOL_GPL(ata_tf_from_fis); EXPORT_SYMBOL_GPL(ata_tf_from_fis);
......
...@@ -1402,6 +1402,7 @@ static void ata_eh_analyze_ncq_error(struct ata_link *link) ...@@ -1402,6 +1402,7 @@ static void ata_eh_analyze_ncq_error(struct ata_link *link)
/* we've got the perpetrator, condemn it */ /* we've got the perpetrator, condemn it */
qc = __ata_qc_from_tag(ap, tag); qc = __ata_qc_from_tag(ap, tag);
memcpy(&qc->result_tf, &tf, sizeof(tf)); memcpy(&qc->result_tf, &tf, sizeof(tf));
qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ; qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ;
ehc->i.err_mask &= ~AC_ERR_DEV; ehc->i.err_mask &= ~AC_ERR_DEV;
} }
......
...@@ -1208,7 +1208,7 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, ...@@ -1208,7 +1208,7 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
DPRINTK("ata%u: dev %u command complete, drv_stat 0x%x\n", DPRINTK("ata%u: dev %u command complete, drv_stat 0x%x\n",
ap->print_id, qc->dev->devno, status); ap->print_id, qc->dev->devno, status);
WARN_ON(qc->err_mask); WARN_ON(qc->err_mask & (AC_ERR_DEV | AC_ERR_HSM));
ap->hsm_task_state = HSM_ST_IDLE; ap->hsm_task_state = HSM_ST_IDLE;
...@@ -1222,7 +1222,7 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, ...@@ -1222,7 +1222,7 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
/* make sure qc->err_mask is available to /* make sure qc->err_mask is available to
* know what's wrong and recover * know what's wrong and recover
*/ */
WARN_ON(qc->err_mask == 0); WARN_ON(!(qc->err_mask & (AC_ERR_DEV | AC_ERR_HSM)));
ap->hsm_task_state = HSM_ST_IDLE; ap->hsm_task_state = HSM_ST_IDLE;
......
...@@ -101,7 +101,6 @@ extern int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class, ...@@ -101,7 +101,6 @@ extern int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
unsigned int readid_flags); unsigned int readid_flags);
extern int ata_dev_configure(struct ata_device *dev); extern int ata_dev_configure(struct ata_device *dev);
extern int sata_down_spd_limit(struct ata_link *link); extern int sata_down_spd_limit(struct ata_link *link);
extern int sata_set_spd_needed(struct ata_link *link);
extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel); extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel);
extern void ata_sg_clean(struct ata_queued_cmd *qc); extern void ata_sg_clean(struct ata_queued_cmd *qc);
extern void ata_qc_free(struct ata_queued_cmd *qc); extern void ata_qc_free(struct ata_queued_cmd *qc);
......
...@@ -381,6 +381,9 @@ static int __exit pata_at32_remove(struct platform_device *pdev) ...@@ -381,6 +381,9 @@ static int __exit pata_at32_remove(struct platform_device *pdev)
return 0; return 0;
} }
/* work with hotplug and coldplug */
MODULE_ALIAS("platform:at32_ide");
static struct platform_driver pata_at32_driver = { static struct platform_driver pata_at32_driver = {
.remove = __exit_p(pata_at32_remove), .remove = __exit_p(pata_at32_remove),
.driver = { .driver = {
......
...@@ -1417,7 +1417,7 @@ static int bfin_reset_controller(struct ata_host *host) ...@@ -1417,7 +1417,7 @@ static int bfin_reset_controller(struct ata_host *host)
count = 10000000; count = 10000000;
do { do {
status = read_atapi_register(base, ATA_REG_STATUS); status = read_atapi_register(base, ATA_REG_STATUS);
} while (count-- && (status & ATA_BUSY)); } while (--count && (status & ATA_BUSY));
/* Enable only ATAPI Device interrupt */ /* Enable only ATAPI Device interrupt */
ATAPI_SET_INT_MASK(base, 1); ATAPI_SET_INT_MASK(base, 1);
...@@ -1601,3 +1601,4 @@ MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>"); ...@@ -1601,3 +1601,4 @@ MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
MODULE_DESCRIPTION("PATA driver for blackfin 54x ATAPI controller"); MODULE_DESCRIPTION("PATA driver for blackfin 54x ATAPI controller");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
MODULE_ALIAS("platform:" DRV_NAME);
...@@ -221,6 +221,7 @@ MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); ...@@ -221,6 +221,7 @@ MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
MODULE_DESCRIPTION("low-level driver for ixp4xx Compact Flash PATA"); MODULE_DESCRIPTION("low-level driver for ixp4xx Compact Flash PATA");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
MODULE_ALIAS("platform:" DRV_NAME);
module_init(ixp4xx_pata_init); module_init(ixp4xx_pata_init);
module_exit(ixp4xx_pata_exit); module_exit(ixp4xx_pata_exit);
...@@ -277,3 +277,4 @@ MODULE_AUTHOR("Paul Mundt"); ...@@ -277,3 +277,4 @@ MODULE_AUTHOR("Paul Mundt");
MODULE_DESCRIPTION("low-level driver for platform device ATA"); MODULE_DESCRIPTION("low-level driver for platform device ATA");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
MODULE_ALIAS("platform:" DRV_NAME);
...@@ -239,6 +239,9 @@ static __devexit int rb500_pata_driver_remove(struct platform_device *pdev) ...@@ -239,6 +239,9 @@ static __devexit int rb500_pata_driver_remove(struct platform_device *pdev)
return 0; return 0;
} }
/* work with hotplug and coldplug */
MODULE_ALIAS("platform:" DRV_NAME);
static struct platform_driver rb500_pata_platform_driver = { static struct platform_driver rb500_pata_platform_driver = {
.probe = rb500_pata_driver_probe, .probe = rb500_pata_driver_probe,
.remove = __devexit_p(rb500_pata_driver_remove), .remove = __devexit_p(rb500_pata_driver_remove),
......
This diff is collapsed.
...@@ -1591,13 +1591,16 @@ static void nv_mcp55_thaw(struct ata_port *ap) ...@@ -1591,13 +1591,16 @@ static void nv_mcp55_thaw(struct ata_port *ap)
static int nv_hardreset(struct ata_link *link, unsigned int *class, static int nv_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline) unsigned long deadline)
{ {
unsigned int dummy; int rc;
/* SATA hardreset fails to retrieve proper device signature on /* SATA hardreset fails to retrieve proper device signature on
* some controllers. Don't classify on hardreset. For more * some controllers. Request follow up SRST. For more info,
* info, see http://bugzilla.kernel.org/show_bug.cgi?id=3352 * see http://bugzilla.kernel.org/show_bug.cgi?id=3352
*/ */
return sata_sff_hardreset(link, &dummy, deadline); rc = sata_sff_hardreset(link, class, deadline);
if (rc)
return rc;
return -EAGAIN;
} }
static void nv_adma_error_handler(struct ata_port *ap) static void nv_adma_error_handler(struct ata_port *ap)
......
...@@ -142,7 +142,7 @@ static u32 sis_scr_cfg_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) ...@@ -142,7 +142,7 @@ static u32 sis_scr_cfg_read(struct ata_port *ap, unsigned int sc_reg, u32 *val)
u8 pmr; u8 pmr;
if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */ if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */
return 0xffffffff; return -EINVAL;
pci_read_config_byte(pdev, SIS_PMR, &pmr); pci_read_config_byte(pdev, SIS_PMR, &pmr);
...@@ -158,14 +158,14 @@ static u32 sis_scr_cfg_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) ...@@ -158,14 +158,14 @@ static u32 sis_scr_cfg_read(struct ata_port *ap, unsigned int sc_reg, u32 *val)
return 0; return 0;
} }
static void sis_scr_cfg_write(struct ata_port *ap, unsigned int sc_reg, u32 val) static int sis_scr_cfg_write(struct ata_port *ap, unsigned int sc_reg, u32 val)
{ {
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg); unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg);
u8 pmr; u8 pmr;
if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */ if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */
return; return -EINVAL;
pci_read_config_byte(pdev, SIS_PMR, &pmr); pci_read_config_byte(pdev, SIS_PMR, &pmr);
...@@ -174,6 +174,8 @@ static void sis_scr_cfg_write(struct ata_port *ap, unsigned int sc_reg, u32 val) ...@@ -174,6 +174,8 @@ static void sis_scr_cfg_write(struct ata_port *ap, unsigned int sc_reg, u32 val)
if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || if ((pdev->device == 0x0182) || (pdev->device == 0x0183) ||
(pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED)) (pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED))
pci_write_config_dword(pdev, cfg_addr+0x10, val); pci_write_config_dword(pdev, cfg_addr+0x10, val);
return 0;
} }
static int sis_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) static int sis_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val)
...@@ -211,14 +213,14 @@ static int sis_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) ...@@ -211,14 +213,14 @@ static int sis_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val)
pci_read_config_byte(pdev, SIS_PMR, &pmr); pci_read_config_byte(pdev, SIS_PMR, &pmr);
if (ap->flags & SIS_FLAG_CFGSCR) if (ap->flags & SIS_FLAG_CFGSCR)
sis_scr_cfg_write(ap, sc_reg, val); return sis_scr_cfg_write(ap, sc_reg, val);
else { else {
iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)); iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4));
if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || if ((pdev->device == 0x0182) || (pdev->device == 0x0183) ||
(pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED)) (pdev->device == 0x1182) || (pmr & SIS_PMR_COMBINED))
iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)+0x10); iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)+0x10);
return 0;
} }
return 0;
} }
static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
......
...@@ -409,9 +409,13 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev) ...@@ -409,9 +409,13 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
} }
/* work with hotplug and coldplug */
MODULE_ALIAS("platform:palm_bk3710");
static struct platform_driver platform_bk_driver = { static struct platform_driver platform_bk_driver = {
.driver = { .driver = {
.name = "palm_bk3710", .name = "palm_bk3710",
.owner = THIS_MODULE,
}, },
.probe = palm_bk3710_probe, .probe = palm_bk3710_probe,
.remove = NULL, .remove = NULL,
......
...@@ -130,6 +130,7 @@ static int __devexit plat_ide_remove(struct platform_device *pdev) ...@@ -130,6 +130,7 @@ static int __devexit plat_ide_remove(struct platform_device *pdev)
static struct platform_driver platform_ide_driver = { static struct platform_driver platform_ide_driver = {
.driver = { .driver = {
.name = "pata_platform", .name = "pata_platform",
.owner = THIS_MODULE,
}, },
.probe = plat_ide_probe, .probe = plat_ide_probe,
.remove = __devexit_p(plat_ide_remove), .remove = __devexit_p(plat_ide_remove),
...@@ -147,6 +148,7 @@ static void __exit platform_ide_exit(void) ...@@ -147,6 +148,7 @@ static void __exit platform_ide_exit(void)
MODULE_DESCRIPTION("Platform IDE driver"); MODULE_DESCRIPTION("Platform IDE driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:pata_platform");
module_init(platform_ide_init); module_init(platform_ide_init);
module_exit(platform_ide_exit); module_exit(platform_ide_exit);
...@@ -847,7 +847,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap) ...@@ -847,7 +847,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap)
return ap->ops == &ata_dummy_port_ops; return ap->ops == &ata_dummy_port_ops;
} }
extern void sata_print_link_status(struct ata_link *link);
extern void ata_port_probe(struct ata_port *); extern void ata_port_probe(struct ata_port *);
extern int sata_set_spd(struct ata_link *link); extern int sata_set_spd(struct ata_link *link);
extern int ata_std_prereset(struct ata_link *link, unsigned long deadline); extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment