*/
        msleep(150);
 
-       *class = ATA_DEV_NONE;
-       if (ata_port_online(ap)) {
-               rc = ata_wait_ready(ap, deadline);
-               if (rc && rc != -ENODEV) {
-                       reason = "device not ready";
-                       goto fail;
-               }
-               *class = ahci_dev_classify(ap);
+       rc = ata_wait_ready(ap, deadline);
+       /* link occupied, -ENODEV too is an error */
+       if (rc) {
+               reason = "device not ready";
+               goto fail;
        }
+       *class = ahci_dev_classify(ap);
 
        DPRINTK("EXIT, class=%u\n", *class);
        return 0;
 
        struct ata_ioports *ioaddr = &ap->ioaddr;
        unsigned int dev0 = devmask & (1 << 0);
        unsigned int dev1 = devmask & (1 << 1);
-       int rc;
+       int rc, ret = 0;
 
        /* if device 0 was found in ata_devchk, wait for its
         * BSY bit to clear
         */
        if (dev0) {
                rc = ata_wait_ready(ap, deadline);
-               if (rc && rc != -ENODEV)
-                       return rc;
+               if (rc) {
+                       if (rc != -ENODEV)
+                               return rc;
+                       ret = rc;
+               }
        }
 
        /* if device 1 was found in ata_devchk, wait for
        }
        if (dev1) {
                rc = ata_wait_ready(ap, deadline);
-               if (rc && rc != -ENODEV)
-                       return rc;
+               if (rc) {
+                       if (rc != -ENODEV)
+                               return rc;
+                       ret = rc;
+               }
        }
 
        /* is all this really necessary? */
        if (dev0)
                ap->ops->dev_select(ap, 0);
 
-       return 0;
+       return ret;
 }
 
 static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
         * pulldown resistor.
         */
        if (ata_check_status(ap) == 0xFF)
-               return 0;
+               return -ENODEV;
 
        return ata_bus_post_reset(ap, devmask, deadline);
 }
        unsigned int slave_possible = ap->flags & ATA_FLAG_SLAVE_POSS;
        u8 err;
        unsigned int dev0, dev1 = 0, devmask = 0;
+       int rc;
 
        DPRINTK("ENTER, host %u, port %u\n", ap->print_id, ap->port_no);
 
        ap->ops->dev_select(ap, 0);
 
        /* issue bus reset */
-       if (ap->flags & ATA_FLAG_SRST)
-               if (ata_bus_softreset(ap, devmask, jiffies + 40 * HZ))
+       if (ap->flags & ATA_FLAG_SRST) {
+               rc = ata_bus_softreset(ap, devmask, jiffies + 40 * HZ);
+               if (rc && rc != -ENODEV)
                        goto err_out;
+       }
 
        /*
         * determine by signature whether we have ATA or ATAPI devices
        /* issue bus reset */
        DPRINTK("about to softreset, devmask=%x\n", devmask);
        rc = ata_bus_softreset(ap, devmask, deadline);
-       if (rc) {
+       /* if link is occupied, -ENODEV too is an error */
+       if (rc && (rc != -ENODEV || sata_scr_valid(ap))) {
                ata_port_printk(ap, KERN_ERR, "SRST failed (errno=%d)\n", rc);
                return rc;
        }
        msleep(150);
 
        rc = ata_wait_ready(ap, deadline);
-       if (rc && rc != -ENODEV) {
+       /* link occupied, -ENODEV too is an error */
+       if (rc) {
                ata_port_printk(ap, KERN_ERR,
                                "COMRESET failed (errno=%d)\n", rc);
                return rc;