]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/ata/libata-scsi.c
Merge branch 'for-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
[karo-tx-linux.git] / drivers / ata / libata-scsi.c
index 25d8b648ad38453087d7dd10326bc02ea7d40d42..3131adcc1f87e001f7f8bfe317e92527665e4dd4 100644 (file)
@@ -270,13 +270,28 @@ DEVICE_ATTR(unload_heads, S_IRUGO | S_IWUSR,
            ata_scsi_park_show, ata_scsi_park_store);
 EXPORT_SYMBOL_GPL(dev_attr_unload_heads);
 
-static void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
+void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
 {
+       if (!cmd)
+               return;
+
        cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
 
        scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq);
 }
 
+void ata_scsi_set_sense_information(struct scsi_cmnd *cmd,
+                                   const struct ata_taskfile *tf)
+{
+       u64 information;
+
+       if (!cmd)
+               return;
+
+       information = ata_tf_read_block(tf, NULL);
+       scsi_set_sense_information(cmd->sense_buffer, information);
+}
+
 static ssize_t
 ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr,
                          const char *buf, size_t count)
@@ -799,26 +814,27 @@ static void ata_dump_status(unsigned id, struct ata_taskfile *tf)
        if (stat & ATA_BUSY) {
                printk("Busy }\n");     /* Data is not valid in this case */
        } else {
-               if (stat & 0x40)        printk("DriveReady ");
-               if (stat & 0x20)        printk("DeviceFault ");
-               if (stat & 0x10)        printk("SeekComplete ");
-               if (stat & 0x08)        printk("DataRequest ");
-               if (stat & 0x04)        printk("CorrectedError ");
-               if (stat & 0x02)        printk("Index ");
-               if (stat & 0x01)        printk("Error ");
+               if (stat & ATA_DRDY)    printk("DriveReady ");
+               if (stat & ATA_DF)      printk("DeviceFault ");
+               if (stat & ATA_DSC)     printk("SeekComplete ");
+               if (stat & ATA_DRQ)     printk("DataRequest ");
+               if (stat & ATA_CORR)    printk("CorrectedError ");
+               if (stat & ATA_SENSE)   printk("Sense ");
+               if (stat & ATA_ERR)     printk("Error ");
                printk("}\n");
 
                if (err) {
                        printk(KERN_WARNING "ata%u: error=0x%02x { ", id, err);
-                       if (err & 0x04)         printk("DriveStatusError ");
-                       if (err & 0x80) {
-                               if (err & 0x04) printk("BadCRC ");
+                       if (err & ATA_ABORTED)  printk("DriveStatusError ");
+                       if (err & ATA_ICRC) {
+                               if (err & ATA_ABORTED)
+                                               printk("BadCRC ");
                                else            printk("Sector ");
                        }
-                       if (err & 0x40)         printk("UncorrectableError ");
-                       if (err & 0x10)         printk("SectorIdNotFound ");
-                       if (err & 0x02)         printk("TrackZeroNotFound ");
-                       if (err & 0x01)         printk("AddrMarkNotFound ");
+                       if (err & ATA_UNC)      printk("UncorrectableError ");
+                       if (err & ATA_IDNF)     printk("SectorIdNotFound ");
+                       if (err & ATA_TRK0NF)   printk("TrackZeroNotFound ");
+                       if (err & ATA_AMNF)     printk("AddrMarkNotFound ");
                        printk("}\n");
                }
        }
@@ -1776,7 +1792,9 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
            ((cdb[2] & 0x20) || need_sense)) {
                ata_gen_passthru_sense(qc);
        } else {
-               if (!need_sense) {
+               if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
+                       cmd->result = SAM_STAT_CHECK_CONDITION;
+               } else if (!need_sense) {
                        cmd->result = SAM_STAT_GOOD;
                } else {
                        /* TODO: decide which descriptor format to use