Index: scsi/scsi_base.c =================================================================== RCS file: /cvs/src/sys/scsi/scsi_base.c,v retrieving revision 1.62 diff -u -r1.62 scsi_base.c --- scsi/scsi_base.c 31 Jul 2004 11:31:30 -0000 1.62 +++ scsi/scsi_base.c 21 Feb 2005 13:38:51 -0000 @@ -711,10 +711,20 @@ sc_link->flags &= ~SDEV_MEDIA_LOADED; if ((xs->flags & SCSI_IGNORE_NOT_READY) != 0) return 0; - if (xs->retries && sense->add_sense_code == 0x04 && - sense->add_sense_code_qual == 0x01) { - xs->error = XS_BUSY; /* ie. sense_retry */ - return ERESTART; + if (sense->add_sense_code == 0x04) { + switch (sense->add_sense_code_qual) { + case 0x01: /* Unit Is in Process Of Becoming Ready */ + case 0x04: /* Format In Progress */ + case 0x05: /* Rebuild In Progress */ + case 0x06: /* Recalculation In Progress */ + case 0x07: /* Operation In Progress */ + case 0x08: /* Long Write In Progress */ + case 0x09: /* Self-Test In Progress */ + delay(1000000); + return (ERESTART); + default: + return (EIO); + } } if (xs->retries && !(sc_link->flags & SDEV_REMOVABLE)) { delay(1000000); Index: scsi/scsiconf.c =================================================================== RCS file: /cvs/src/sys/scsi/scsiconf.c,v retrieving revision 1.92 diff -u -r1.92 scsiconf.c --- scsi/scsiconf.c 31 Jul 2004 11:31:30 -0000 1.92 +++ scsi/scsiconf.c 21 Feb 2005 13:38:51 -0000 @@ -401,6 +401,8 @@ {{T_DIRECT, T_FIXED, "EMULEX ", "MD21/S2 ESDI", "A00"}, SDEV_AUTOSAVE}, {{T_DIRECT, T_FIXED, + "HITACHI", "DK23DA", ""}, SDEV_NOMODESENSE|SDEV_ONLYBIG}, + {{T_DIRECT, T_FIXED, "IBMRAID ", "0662S", ""}, SDEV_AUTOSAVE}, {{T_DIRECT, T_FIXED, "IBM ", "0663H", ""}, SDEV_AUTOSAVE}, Index: scsi/sd.c =================================================================== RCS file: /cvs/src/sys/scsi/sd.c,v retrieving revision 1.70 diff -u -r1.70 sd.c --- scsi/sd.c 28 May 2004 23:50:15 -0000 1.70 +++ scsi/sd.c 21 Feb 2005 13:38:52 -0000 @@ -222,6 +222,11 @@ scsi_autoconf | SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE | SCSI_SILENT); + /* Try to start the unit if it wasn't ready. */ + if (error == EIO) + error = scsi_start(sc_link, SSS_START, + SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE); + /* Fill in name struct for spoofed label */ viscpy(sd->name.vendor, sa->sa_inqbuf->vendor, 8); viscpy(sd->name.product, sa->sa_inqbuf->product, 16); @@ -391,9 +396,11 @@ SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE); - /* Start the pack spinning if necessary. */ + /* Try to start the unit if it wasn't ready. */ if (error == EIO) - error = scsi_start(sc_link, SSS_START, 0); + error = scsi_start(sc_link, SSS_START, + SCSI_IGNORE_ILLEGAL_REQUEST | + SCSI_IGNORE_MEDIA_CHANGE); if (error) goto bad3;