return 0;
 }
 
+/**
+ *     ata_scsi_slave_alloc - Early setup of SCSI device
+ *     @sdev: SCSI device to examine
+ *
+ *     This is called from scsi_alloc_sdev() when the scsi device
+ *     associated with an ATA device is scanned on a port.
+ *
+ *     LOCKING:
+ *     Defined by SCSI layer.  We don't really care.
+ */
+
+int ata_scsi_slave_alloc(struct scsi_device *sdev)
+{
+       struct ata_port *ap = ata_shost_to_port(sdev->host);
+       struct device_link *link;
+
+       ata_scsi_sdev_config(sdev);
+
+       /*
+        * Create a link from the ata_port device to the scsi device to ensure
+        * that PM does suspend/resume in the correct order: the scsi device is
+        * consumer (child) and the ata port the supplier (parent).
+        */
+       link = device_link_add(&sdev->sdev_gendev, &ap->tdev,
+                              DL_FLAG_STATELESS |
+                              DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+       if (!link) {
+               ata_port_err(ap, "Failed to create link to scsi device %s\n",
+                            dev_name(&sdev->sdev_gendev));
+               return -ENODEV;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ata_scsi_slave_alloc);
+
 /**
  *     ata_scsi_slave_config - Set SCSI device attributes
  *     @sdev: SCSI device to examine
 {
        struct ata_port *ap = ata_shost_to_port(sdev->host);
        struct ata_device *dev = __ata_scsi_find_dev(ap, sdev);
-       int rc = 0;
-
-       ata_scsi_sdev_config(sdev);
 
        if (dev)
-               rc = ata_scsi_dev_config(sdev, dev);
+               return ata_scsi_dev_config(sdev, dev);
 
-       return rc;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
 
        unsigned long flags;
        struct ata_device *dev;
 
+       device_link_remove(&sdev->sdev_gendev, &ap->tdev);
+
        spin_lock_irqsave(ap->lock, flags);
        dev = __ata_scsi_find_dev(ap, sdev);
        if (dev && dev->sdev) {
 
                              struct block_device *bdev,
                              sector_t capacity, int geom[]);
 extern void ata_scsi_unlock_native_capacity(struct scsi_device *sdev);
+extern int ata_scsi_slave_alloc(struct scsi_device *sdev);
 extern int ata_scsi_slave_config(struct scsi_device *sdev);
 extern void ata_scsi_slave_destroy(struct scsi_device *sdev);
 extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,
        .this_id                = ATA_SHT_THIS_ID,              \
        .emulated               = ATA_SHT_EMULATED,             \
        .proc_name              = drv_name,                     \
+       .slave_alloc            = ata_scsi_slave_alloc,         \
        .slave_destroy          = ata_scsi_slave_destroy,       \
        .bios_param             = ata_std_bios_param,           \
        .unlock_native_capacity = ata_scsi_unlock_native_capacity,\