在SCSI接口中,错误通过3个数字的串联识别:SenseKey + ASC + ASCQ。 asc/ascq pair description描述了基于asc / ascq值的所有错误的含义。但并非所有asc / ascq对都具有所有感知键的含义。我怎么知道每个asc / ascq对将返回哪个感应键?
答案 0 :(得分:0)
ASC / ASCQ与Sense Key无关。
Sense键是您的主要错误代码。 ASC和ASCQ是附加感知代码和限定符。这是一个小小的提示,你可以回答你的I_T_L_Q关系中的错误。
因此,要回答您的问题 - 无法知道每个ASC / ASCQ对一般将返回哪个感知密钥。
但是有一些众所周知的“Sense key”+ ASC + ASCQ组合,因为大多数操作系统仅针对小的错误子集实现错误处理。不幸的是,您只能通过检查源代码来找到该子集。
例如,在Mac OS X Darwin内核中,您可以在IOSCSIArchitectureModelFamily中查找ADDITIONAL_SENSE_CODE
。以下是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 tupes:
0x02/0x03, 0x04, 0x02
- 未准备好/中等错误,逻辑单位未准备就绪,需要初始化命令; 0x02/0x03, 0x3A, 0x00
- 没有准备/媒体错误,媒体不存在。正如你在这里看到的那样,ASC / ASCQ对与0x02或0x03 Sense键一起使用,并且要采取的动作是在ASC / ASCQ对上确定的,因此ASSI / ASCQ对如何在Sense之间划分并不重要密钥。