Some SCSI devices get reset on incorrect commands, so retry up

to 5 device resets in media info and dumping.
This commit is contained in:
2017-11-26 22:20:31 +00:00
parent e01a060af9
commit e306dc4694
2 changed files with 21 additions and 0 deletions

View File

@@ -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;

View File

@@ -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;