diff --git a/DiscImageChef.Core/Devices/Dumping/SCSI.cs b/DiscImageChef.Core/Devices/Dumping/SCSI.cs index 6fc22ee1..9eada20b 100644 --- a/DiscImageChef.Core/Devices/Dumping/SCSI.cs +++ b/DiscImageChef.Core/Devices/Dumping/SCSI.cs @@ -113,6 +113,27 @@ namespace DiscImageChef.Core.Devices.Dumping DicConsole.ErrorWriteLine("Error testing unit was ready:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); return; }*/ + // These should be trapped by the OS but seems in some cases they're not + else if(decSense.Value.ASC == 0x28) + { + int leftRetries = 10; + while(leftRetries > 0) + { + DicConsole.WriteLine("\rWaiting for drive to become ready"); + System.Threading.Thread.Sleep(2000); + sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration); + if(!sense) + break; + + leftRetries--; + } + + if(sense) + { + DicConsole.ErrorWriteLine("Error testing unit was ready:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); + return; + } + } else { DicConsole.ErrorWriteLine("Error testing unit was ready:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); diff --git a/DiscImageChef.Core/Devices/Report/SCSI/MMC.cs b/DiscImageChef.Core/Devices/Report/SCSI/MMC.cs index f43e9fab..ae65e0d1 100644 --- a/DiscImageChef.Core/Devices/Report/SCSI/MMC.cs +++ b/DiscImageChef.Core/Devices/Report/SCSI/MMC.cs @@ -805,6 +805,23 @@ namespace DiscImageChef.Core.Devices.Report.SCSI mediaTest.MediaIsRecognized &= !sense; } + // These should be trapped by the OS but seems in some cases they're not + else if(decSense.Value.ASC == 0x28) + { + int leftRetries = 20; + while(leftRetries > 0) + { + DicConsole.Write("\rWaiting for drive to become ready"); + System.Threading.Thread.Sleep(2000); + sense = dev.ScsiTestUnitReady(out senseBuffer, timeout, out duration); + if(!sense) + break; + + leftRetries--; + } + + mediaTest.MediaIsRecognized &= !sense; + } else mediaTest.MediaIsRecognized = false; } diff --git a/DiscImageChef.Core/Devices/Scanning/SCSI.cs b/DiscImageChef.Core/Devices/Scanning/SCSI.cs index c742e9ff..685291ad 100644 --- a/DiscImageChef.Core/Devices/Scanning/SCSI.cs +++ b/DiscImageChef.Core/Devices/Scanning/SCSI.cs @@ -107,6 +107,27 @@ namespace DiscImageChef.Core.Devices.Scanning return results; } } + // These should be trapped by the OS but seems in some cases they're not + else if(decSense.Value.ASC == 0x28) + { + int leftRetries = 10; + while(leftRetries > 0) + { + DicConsole.WriteLine("\rWaiting for drive to become ready"); + System.Threading.Thread.Sleep(2000); + sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration); + if(!sense) + break; + + leftRetries--; + } + + if(sense) + { + DicConsole.ErrorWriteLine("Error testing unit was ready:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf)); + return results; + } + } else { DicConsole.ErrorWriteLine("Error testing unit was ready:\n{0}", Decoders.SCSI.Sense.PrettifySense(senseBuf));