|
@@ -1450,6 +1450,34 @@ unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * ata_scsi_set_sense - Set SCSI sense data and status
|
|
|
+ * @cmd: SCSI request to be handled
|
|
|
+ * @sk: SCSI-defined sense key
|
|
|
+ * @asc: SCSI-defined additional sense code
|
|
|
+ * @ascq: SCSI-defined additional sense code qualifier
|
|
|
+ *
|
|
|
+ * Helper function that builds a valid fixed format, current
|
|
|
+ * response code and the given sense key (sk), additional sense
|
|
|
+ * code (asc) and additional sense code qualifier (ascq) with
|
|
|
+ * a SCSI command status of %SAM_STAT_CHECK_CONDITION and
|
|
|
+ * DRIVER_SENSE set in the upper bits of scsi_cmnd::result .
|
|
|
+ *
|
|
|
+ * LOCKING:
|
|
|
+ * Not required
|
|
|
+ */
|
|
|
+
|
|
|
+void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
|
|
|
+{
|
|
|
+ cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
|
|
|
+
|
|
|
+ cmd->sense_buffer[0] = 0x70; /* fixed format, current */
|
|
|
+ cmd->sense_buffer[2] = sk;
|
|
|
+ cmd->sense_buffer[7] = 18 - 8; /* additional sense length */
|
|
|
+ cmd->sense_buffer[12] = asc;
|
|
|
+ cmd->sense_buffer[13] = ascq;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ata_scsi_badcmd - End a SCSI request with an error
|
|
|
* @cmd: SCSI request to be handled
|