From 2c647dfc5c30d28a090e1cf8235ade257c1cc0bf Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 11 Sep 2017 18:34:01 +0100 Subject: [PATCH] Wait for device to exist ASC 28h status. This should be trapped by the OS but it's being so in some corner cases. --- DiscImageChef.Core/Devices/Dumping/SCSI.cs | 21 +++++++++++++++++++ DiscImageChef.Core/Devices/Report/SCSI/MMC.cs | 17 +++++++++++++++ DiscImageChef.Core/Devices/Scanning/SCSI.cs | 21 +++++++++++++++++++ 3 files changed, 59 insertions(+) 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));