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;
