1 package org.jscsi.target.scsi.sense; 2 3 4 import org.jscsi.target.scsi.ISerializable; 5 6 7 /** 8 * Sense data shall be returned in the same I_T_L_Q nexus transaction as a CHECK CONDITION status and as parameter data 9 * in response to the REQUEST SENSE command. 10 * <p> 11 * Sense data returned in the same I_T_L_Q nexus transaction as a CHECK CONDITION status shall be either fixed or 12 * descriptor format sense data format based on the value of the D_SENSE bit in the Control mode page. 13 * <p> 14 * The REQUEST SENSE command may be used to request either the fixed format sense data or the descriptor format sense 15 * data. 16 * 17 * @author Andreas Ergenzinger 18 */ 19 public abstract class SenseData implements ISerializable { 20 21 /** 22 * The first byte of all sense data contains the RESPONSE CODE field that indicates the error type and format of the 23 * sense data. 24 * 25 * @see #errorType 26 * @see #senseDataFormat 27 */ 28 protected final int responseCode; 29 30 /** 31 * The error type of the sense data as determined by the {@link #responseCode} variable. 32 */ 33 protected final ErrorType errorType; 34 35 /** 36 * The format of the sense data as determined by the {@link #responseCode} variable. 37 */ 38 protected final SenseDataFormat senseDataFormat; 39 40 /** 41 * The {@link #senseKey} and {@link #additionalSenseCodeAndQualifier} fields provide a hierarchy of information. The 42 * hierarchy provides a top-down approach for an application client to determine information relating to the error 43 * and exception conditions. 44 */ 45 protected final SenseKey senseKey; 46 47 /** 48 * The {@link #senseKey} and {@link #additionalSenseCodeAndQualifier} fields provide a hierarchy of information. The 49 * hierarchy provides a top-down approach for an application client to determine information relating to the error 50 * and exception conditions. 51 */ 52 protected final AdditionalSenseCodeAndQualifier additionalSenseCodeAndQualifier; 53 54 /** 55 * The sense data constructor. 56 * 57 * @param errorType the error type of the sense data 58 * @param senseDataFormat the format of the sense data 59 * @param senseKey describes the general category of the error requiring the sending of sense data 60 * @param additionalSenseCodeAndQualifier a more specific description of the error 61 */ 62 public SenseData (final ErrorType errorType, final SenseDataFormat senseDataFormat, final SenseKey senseKey, final AdditionalSenseCodeAndQualifier additionalSenseCodeAndQualifier) { 63 this.errorType = errorType; 64 this.senseDataFormat = senseDataFormat; 65 responseCode = getReponseCodeFor(errorType, senseDataFormat); 66 this.senseKey = senseKey; 67 this.additionalSenseCodeAndQualifier = additionalSenseCodeAndQualifier; 68 } 69 70 /** 71 * Returns the proper response code for the given error type and sense data format. 72 * 73 * @param errorType a sense data error type 74 * @param senseDataFormat a sense data format 75 * @return the proper response code 76 */ 77 public static final int getReponseCodeFor (final ErrorType errorType, final SenseDataFormat senseDataFormat) { 78 if (senseDataFormat == SenseDataFormat.FIXED) { 79 if (errorType == ErrorType.CURRENT) 80 return 0x70; 81 else 82 // errorType == DEFERRED 83 return 0x71; 84 } else {// senseDataFormat == DESCRIPTOR 85 if (errorType == ErrorType.CURRENT) 86 return 0x72; 87 else 88 // errorType == DEFERRED 89 return 0x73; 90 } 91 /* 92 * Response codes 0x74 to 0x7E are reserved. Response code 0x7f is vendor specific. 93 */ 94 } 95 }