Error Handling in SCSI Miniport Drivers
Every SCSI miniport driver must notify the system port driver about the following kinds of SCSI errors. These errors should be set in the SrbStatus member before the driver completes the SRB it was processing when the error occurred:
SRB_STATUS_ERROR (if the HBA returns a nonspecific bus error)
SRB_STATUS_PARITY_ERROR
SRB_STATUS_UNEXPECTED_BUS_FREE
SRB_STATUS_SELECTION_TIMEOUT
SRB_STATUS_COMMAND_TIMEOUT
SRB_STATUS_MESSAGE_REJECTED
SRB_STATUS_NO_DEVICE
SRB_STATUS_NO_HBA
SRB_STATUS_DATA_OVERRUN (also returned for underruns)
SRB_STATUS_PHASE_SEQUENCE_FAILURE
SRB_STATUS_BUSY (TID busy)
For a data underrun, the miniport driver must update the SRB's DataTransferLength to indicate how much data actually was transferred.
In addition, the miniport driver should use the following guidelines to log some of the preceding errors by passing the SRB to ScsiPortLogError:
Log an error at the discretion of the driver writer for SRB_STATUS_ERROR.
Always log an error for SRB_STATUS_PARITY_ERROR.
Always log an error for SRB_STATUS_UNEXPECTED_BUS_FREE.
Always log an error for SRB_STATUS_SELECTION_TIMEOUT.
Always log an error for SRB_STATUS_COMMAND_TIMEOUT.
Log an error for SRB_STATUS_DATA_OVERRUN whenever an overrun occurs, but not when an underrun occurs.
Always log an error for SRB_STATUS_PHASE_SEQUENCE_FAILURE.
Always log an error for SRB_STATUS_BUSY for hardware errors.
To log an error, a miniport driver calls ScsiPortLogError by using one of the following system-defined error or warning codes:
SP_BUS_PARITY_ERROR maps to SRB_STATUS_PARITY_ERROR
SP_UNEXPECTED_DISCONNECT (by the target logical unit)
SP_INVALID_RESELECTION maps to SRB_STATUS_PHASE_SEQUENCE_FAILURE or SRB_STATUS_ERROR
SP_BUS_TIME_OUT maps to SRB_STATUS_SELECTION_TIMEOUT
SP_REQUEST_TIMEOUT maps to SRB_STATUS_COMMAND_TIMEOUT
SP_PROTOCOL_ERROR maps to SRB_STATUS_PHASE_SELECTION_FAILURE, SRB_STATUS_UNEXPECTED_BUS_FREE, or SRB_STATUS_DATA_OVERRUN for an overrun condition
SP_INTERNAL_ADAPTER_ERROR maps to SRB_STATUS_ERROR
SP_IRQ_NOT_RESPONDING (warning that the miniport driver has detected that the HBA is no longer generating interrupt requests)
SP_BAD_FW_ERROR (where FW is firmware)
SP_BAD_FW_WARNING
ScsiPortLogError allocates an error-log packet, sets it up, and logs the I/O error in the event log on behalf of the miniport driver. System administrators or users can monitor the condition of an HBA by examining the system event log and, if necessary, reconfiguring, repairing, or replacing the HBA before it fails.