Смысловой ключ для номеров ASC/ASCQ

В интерфейсе SCSI ошибки распознаются путем объединения трех чисел: SenseKey + ASC + ASCQ. Описание пары asc / ascq описывает значение всех ошибок на основе значений asc / ascq. Но не все пары asc / ascq имеют значение для всех смысловых ключей. Как я должен знать, какой смысловой ключ будет возвращаться с каждой парой asc / ascq?

1 ответ

ASC/ASCQ не привязан к Sense Key.

Sense key - ваш основной код ошибки. ASC и ASCQ - это дополнительный смысловой код и классификатор. Это небольшой совет для вас, чтобы ответить, что не так в вашей связи I_T_L_Q.

Итак, чтобы ответить на ваш вопрос - нет способа узнать, какой смысловой ключ будет возвращаться с каждой парой ASC/ASCQ в целом.

Но есть некоторые хорошо известные комбинации "Sense key" + ASC + ASCQ, потому что большинство операционных систем реализуют обработку ошибок только для небольшого подмножества ошибок. К сожалению, вы можете найти это подмножество только проверяя исходные коды.

Например, в ядре Mac OS X Darwin вы можете искать ADDITIONAL_SENSE_CODE в IOSCSIArchitectureModelFamily. Вот пример из IOSCSIBlockCommands/IOSCSIBlockCommandsDevicePM.cpp строка 659:

// Check the sense key to see if it is an error group we know how to handle
if  ( ( ( senseBuffer.SENSE_KEY & kSENSE_KEY_Mask ) == kSENSE_KEY_NOT_READY ) || 
      ( ( senseBuffer.SENSE_KEY & kSENSE_KEY_Mask ) == kSENSE_KEY_MEDIUM_ERROR ) )
{

    // The SenseKey is an 02 ( Not Ready ) or 03 ( Medium Error ). Check to see
    // if we can do something about this

    if ( ( senseBuffer.ADDITIONAL_SENSE_CODE == 0x04 ) && 
         ( senseBuffer.ADDITIONAL_SENSE_CODE_QUALIFIER == 0x02 ) )
    {

        // Device requires a start command before we can tell if media is there
        if ( START_STOP_UNIT ( request, 0x00, 0x00, 0x00, 0x01, 0x00 ) == true )
        {

            STATUS_LOG ( ( "Sending START_STOP_UNIT.\n" ) );
            serviceResponse = SendCommand ( request, 0 );

        }

        STATUS_LOG ( ( "%s::drive NOT READY\n", getName ( ) ) );

        IOSleep ( 200 );
        continue;

    }

    else if ( ( senseBuffer.ADDITIONAL_SENSE_CODE == 0x3A ) && 
              ( senseBuffer.ADDITIONAL_SENSE_CODE_QUALIFIER == 0x00 ) )
    {

        STATUS_LOG ( ( "No Media.\n" ) );
        // No media is present, return false
        driveReady = true;
        mediaPresent = false;

    }

    else
    {

        STATUS_LOG ( ( "%s::drive NOT READY\n", getName ( ) ) );
        IOSleep ( 200 );
        continue;

    }

}

Подержанные SK+ASC+ASCQ:

  • 0x02/0x03, 0x04, 0x02 - НЕ ГОТОВ / СРЕДНЯЯ ОШИБКА, ЛОГИЧЕСКИЙ БЛОК НЕ ГОТОВ, ТРЕБУЕТСЯ ИНИЦИАЛИЗАЦИЯ;
  • 0x02/0x03, 0x3A, 0x00 - НЕ ГОТОВ / СРЕДНЯЯ ОШИБКА, СРЕДНЯЯ НЕТ.

Как вы можете видеть здесь, пара ASC/ASCQ используется с ключами Sense 0x02 или 0x03, а действие, которое необходимо выполнить, определяется для пары ASC/ASCQ, поэтому не имеет значения, как пары ASC/ASCQ делятся между ключами Sense.

Другие вопросы по тегам