*** scsi_scan.c.orig    Tue Oct 24 14:01:54 2000
--- scsi_scan.c Thu Nov  2 18:59:30 2000
***************
*** 471,476 ****
--- 471,479 ----
        Scsi_Request * SRpnt;
        int bflags, type = -1;
        extern devfs_handle_t scsi_devfs_handle;
+       int spintime = 0;
+       int retries = 0;
+       unsigned long spintime_value = 0;
  
        SDpnt->host = shpnt;
        SDpnt->id = dev;
***************
*** 499,504 ****
--- 502,574 ----
         * not really necessary.  Spec recommends using INQUIRY to scan for
         * devices (and TEST_UNIT_READY to poll for media change). - Paul G.
         */
+ /* Add TUR back in to sync up the disk -- 
+    mostly borrowed from 2.2 kernel  -- eamb */
+ 
+       do      
+       {
+                 retries = 0;
+ 
+                 while (retries < 3) 
+               {
+                         scsi_cmd[0] = TEST_UNIT_READY;
+                         scsi_cmd[1] = (lun << 5) & 0xe0;
+                         memset((void *) &scsi_cmd[2], 0, 8);
+                         SRpnt->sr_cmd_len = 0;
+                         SRpnt->sr_sense_buffer[0] = 0;
+                         SRpnt->sr_sense_buffer[2] = 0;
+                         SRpnt->sr_data_direction = SCSI_DATA_READ;
+ 
+                       scsi_wait_req (SRpnt, (void *) scsi_cmd,
+                               (void *) scsi_result,
+                               256, SCSI_TIMEOUT+4*HZ, 3);
+ 
+                         retries++;
+                         if (SRpnt->sr_result == 0
+                             || SRpnt->sr_sense_buffer[2] != UNIT_ATTENTION)
+                                 break;
+                 }
+ 
+                 if( SRpnt->sr_result != 0
+                     && ((driver_byte(SRpnt->sr_result) & DRIVER_SENSE) != 0)
+                     && SRpnt->sr_sense_buffer[2] == UNIT_ATTENTION)
+               {
+                         break;
+                 }
+ 
+                 /* Look for devices that are NOT_READY.
+                  * Issue command to spin up drive for these cases. */
+                 if(SRpnt->sr_sense_buffer[2] == NOT_READY) 
+               {
+                         unsigned long time1;
+                         if (!spintime) 
+                       {
+                                 scsi_cmd[0] = START_STOP;
+                                 scsi_cmd[1] = (lun << 5) & 0xe0;
+                                 scsi_cmd[1] |= 1;    /* Return immediately */
+                                 memset((void *) &scsi_cmd[2], 0, 8);
+                                 scsi_cmd[4] = 1;     /* Start spin cycle */
+                                 SRpnt->sr_cmd_len = 0;
+                                 SRpnt->sr_sense_buffer[0] = 0;
+                                 SRpnt->sr_sense_buffer[2] = 0;
+ 
+                                 SRpnt->sr_data_direction = SCSI_DATA_READ;
+                               scsi_wait_req (SRpnt, (void *) scsi_cmd,
+                                       (void *) scsi_result,
+                                       256, SCSI_TIMEOUT+4*HZ, 3);
+                         }
+                         spintime = 1;
+                         spintime_value = jiffies;
+                         time1 = HZ;
+                         /* Wait 1 second for next try */
+                         do 
+                       {
+                                 current->state = TASK_UNINTERRUPTIBLE;
+                                 time1 = schedule_timeout(time1);
+                         } while(time1);
+                 }
+         } while (SRpnt->sr_result && spintime && (retries < 3) &&
+                  time_after(spintime_value + 100 * HZ, jiffies));
  
        SCSI_LOG_SCAN_BUS(3, printk("scsi: performing INQUIRY\n"));
        /*

