|
@@ -3061,22 +3061,28 @@ static int ata_bus_post_reset(struct ata_port *ap, unsigned int devmask,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* if device 1 was found in ata_devchk, wait for
|
|
|
- * register access, then wait for BSY to clear
|
|
|
+ /* if device 1 was found in ata_devchk, wait for register
|
|
|
+ * access briefly, then wait for BSY to clear.
|
|
|
*/
|
|
|
- while (dev1) {
|
|
|
- u8 nsect, lbal;
|
|
|
+ if (dev1) {
|
|
|
+ int i;
|
|
|
|
|
|
ap->ops->dev_select(ap, 1);
|
|
|
- nsect = ioread8(ioaddr->nsect_addr);
|
|
|
- lbal = ioread8(ioaddr->lbal_addr);
|
|
|
- if ((nsect == 1) && (lbal == 1))
|
|
|
- break;
|
|
|
- if (time_after(jiffies, deadline))
|
|
|
- return -EBUSY;
|
|
|
- msleep(50); /* give drive a breather */
|
|
|
- }
|
|
|
- if (dev1) {
|
|
|
+
|
|
|
+ /* Wait for register access. Some ATAPI devices fail
|
|
|
+ * to set nsect/lbal after reset, so don't waste too
|
|
|
+ * much time on it. We're gonna wait for !BSY anyway.
|
|
|
+ */
|
|
|
+ for (i = 0; i < 2; i++) {
|
|
|
+ u8 nsect, lbal;
|
|
|
+
|
|
|
+ nsect = ioread8(ioaddr->nsect_addr);
|
|
|
+ lbal = ioread8(ioaddr->lbal_addr);
|
|
|
+ if ((nsect == 1) && (lbal == 1))
|
|
|
+ break;
|
|
|
+ msleep(50); /* give drive a breather */
|
|
|
+ }
|
|
|
+
|
|
|
rc = ata_wait_ready(ap, deadline);
|
|
|
if (rc) {
|
|
|
if (rc != -ENODEV)
|