From e306dc46944cc1014ee248cace25241701bcc056 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 26 Nov 2017 22:20:31 +0000 Subject: [PATCH] Some SCSI devices get reset on incorrect commands, so retry up to 5 device resets in media info and dumping. --- DiscImageChef.Core/Devices/Dumping/SCSI.cs | 11 +++++++++++ DiscImageChef/Commands/MediaInfo.cs | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/DiscImageChef.Core/Devices/Dumping/SCSI.cs b/DiscImageChef.Core/Devices/Dumping/SCSI.cs index 72c47b3b..86d833ac 100644 --- a/DiscImageChef.Core/Devices/Dumping/SCSI.cs +++ b/DiscImageChef.Core/Devices/Dumping/SCSI.cs @@ -53,9 +53,11 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] senseBuf = null; bool sense = false; MediaType dskType = MediaType.Unknown; + int resets = 0; if(dev.IsRemovable) { + deviceGotReset: sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out double duration); if(sense) { @@ -63,6 +65,15 @@ namespace DiscImageChef.Core.Devices.Dumping if(decSense.HasValue) { dumpLog.WriteLine("Device not ready. Sense {0}h ASC {1:X2}h ASCQ {2:X2}h", decSense.Value.SenseKey, decSense.Value.ASC, decSense.Value.ASCQ); + + // Just retry, for 5 times + if(decSense.Value.ASC == 0x29) + { + resets++; + if(resets < 5) + goto deviceGotReset; + } + if(decSense.Value.ASC == 0x3A) { int leftRetries = 5; diff --git a/DiscImageChef/Commands/MediaInfo.cs b/DiscImageChef/Commands/MediaInfo.cs index 8ade9ba7..489cefa0 100644 --- a/DiscImageChef/Commands/MediaInfo.cs +++ b/DiscImageChef/Commands/MediaInfo.cs @@ -112,15 +112,25 @@ namespace DiscImageChef.Commands MediaType dskType = MediaType.Unknown; ulong blocks = 0; uint blockSize = 0; + int resets = 0; if(dev.IsRemovable) { + deviceGotReset: sense = dev.ScsiTestUnitReady(out senseBuf, dev.Timeout, out duration); if(sense) { Decoders.SCSI.FixedSense? decSense = Decoders.SCSI.Sense.DecodeFixed(senseBuf); if(decSense.HasValue) { + // Just retry, for 5 times + if(decSense.Value.ASC == 0x29) + { + resets++; + if(resets < 5) + goto deviceGotReset; + } + if(decSense.Value.ASC == 0x3A) { int leftRetries = 5;