Смысловой ключ для номеров 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.