|
@@ -1850,8 +1850,11 @@ int ata_bus_probe(struct ata_port *ap)
|
|
|
for (i = 0; i < ATA_MAX_DEVICES; i++)
|
|
|
ap->device[i].pio_mode = XFER_PIO_0;
|
|
|
|
|
|
- /* read IDENTIFY page and configure devices */
|
|
|
- for (i = 0; i < ATA_MAX_DEVICES; i++) {
|
|
|
+ /* read IDENTIFY page and configure devices. We have to do the identify
|
|
|
+ specific sequence bass-ackwards so that PDIAG- is released by
|
|
|
+ the slave device */
|
|
|
+
|
|
|
+ for (i = ATA_MAX_DEVICES - 1; i >= 0; i--) {
|
|
|
dev = &ap->device[i];
|
|
|
|
|
|
if (tries[i])
|
|
@@ -1864,6 +1867,15 @@ int ata_bus_probe(struct ata_port *ap)
|
|
|
dev->id);
|
|
|
if (rc)
|
|
|
goto fail;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* After the identify sequence we can now set up the devices. We do
|
|
|
+ this in the normal order so that the user doesn't get confused */
|
|
|
+
|
|
|
+ for(i = 0; i < ATA_MAX_DEVICES; i++) {
|
|
|
+ dev = &ap->device[i];
|
|
|
+ if (!ata_dev_enabled(dev))
|
|
|
+ continue;
|
|
|
|
|
|
ap->eh_context.i.flags |= ATA_EHI_PRINTINFO;
|
|
|
rc = ata_dev_configure(dev);
|
|
@@ -2556,12 +2568,11 @@ int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
|
|
|
* host channels are not permitted to do so.
|
|
|
*/
|
|
|
if (used_dma && (ap->host->flags & ATA_HOST_SIMPLEX))
|
|
|
- ap->host->simplex_claimed = 1;
|
|
|
+ ap->host->simplex_claimed = ap;
|
|
|
|
|
|
/* step5: chip specific finalisation */
|
|
|
if (ap->ops->post_set_mode)
|
|
|
ap->ops->post_set_mode(ap);
|
|
|
-
|
|
|
out:
|
|
|
if (rc)
|
|
|
*r_failed_dev = dev;
|
|
@@ -3444,7 +3455,7 @@ static void ata_dev_xfermask(struct ata_device *dev)
|
|
|
"device is on DMA blacklist, disabling DMA\n");
|
|
|
}
|
|
|
|
|
|
- if ((host->flags & ATA_HOST_SIMPLEX) && host->simplex_claimed) {
|
|
|
+ if ((host->flags & ATA_HOST_SIMPLEX) && host->simplex_claimed != ap) {
|
|
|
xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
|
|
|
ata_dev_printk(dev, KERN_WARNING, "simplex DMA is claimed by "
|
|
|
"other device, disabling DMA\n");
|
|
@@ -5343,6 +5354,7 @@ int ata_flush_cache(struct ata_device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_PM
|
|
|
static int ata_host_request_pm(struct ata_host *host, pm_message_t mesg,
|
|
|
unsigned int action, unsigned int ehi_flags,
|
|
|
int wait)
|
|
@@ -5458,6 +5470,7 @@ void ata_host_resume(struct ata_host *host)
|
|
|
ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0);
|
|
|
host->dev->power.power_state = PMSG_ON;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
/**
|
|
|
* ata_port_start - Set port up for dma.
|
|
@@ -6093,6 +6106,7 @@ int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits)
|
|
|
return (tmp == bits->val) ? 1 : 0;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_PM
|
|
|
void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg)
|
|
|
{
|
|
|
pci_save_state(pdev);
|
|
@@ -6144,6 +6158,8 @@ int ata_pci_device_resume(struct pci_dev *pdev)
|
|
|
ata_host_resume(host);
|
|
|
return rc;
|
|
|
}
|
|
|
+#endif /* CONFIG_PM */
|
|
|
+
|
|
|
#endif /* CONFIG_PCI */
|
|
|
|
|
|
|
|
@@ -6352,8 +6368,10 @@ EXPORT_SYMBOL_GPL(sata_scr_write);
|
|
|
EXPORT_SYMBOL_GPL(sata_scr_write_flush);
|
|
|
EXPORT_SYMBOL_GPL(ata_port_online);
|
|
|
EXPORT_SYMBOL_GPL(ata_port_offline);
|
|
|
+#ifdef CONFIG_PM
|
|
|
EXPORT_SYMBOL_GPL(ata_host_suspend);
|
|
|
EXPORT_SYMBOL_GPL(ata_host_resume);
|
|
|
+#endif /* CONFIG_PM */
|
|
|
EXPORT_SYMBOL_GPL(ata_id_string);
|
|
|
EXPORT_SYMBOL_GPL(ata_id_c_string);
|
|
|
EXPORT_SYMBOL_GPL(ata_id_to_dma_mode);
|
|
@@ -6369,16 +6387,20 @@ EXPORT_SYMBOL_GPL(pci_test_config_bits);
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_init_one);
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_remove_one);
|
|
|
+#ifdef CONFIG_PM
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_device_do_suspend);
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_device_do_resume);
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_device_suspend);
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_device_resume);
|
|
|
+#endif /* CONFIG_PM */
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_default_filter);
|
|
|
EXPORT_SYMBOL_GPL(ata_pci_clear_simplex);
|
|
|
#endif /* CONFIG_PCI */
|
|
|
|
|
|
+#ifdef CONFIG_PM
|
|
|
EXPORT_SYMBOL_GPL(ata_scsi_device_suspend);
|
|
|
EXPORT_SYMBOL_GPL(ata_scsi_device_resume);
|
|
|
+#endif /* CONFIG_PM */
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(ata_eng_timeout);
|
|
|
EXPORT_SYMBOL_GPL(ata_port_schedule_eh);
|