Merge branch 'for-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
[pandora-kernel.git] / drivers / scsi / libsas / sas_ata.c
index 577770f..932d9cc 100644 (file)
@@ -138,7 +138,7 @@ static void sas_ata_task_done(struct sas_task *task)
 
        if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD ||
            ((stat->stat == SAM_STAT_CHECK_CONDITION &&
-             dev->sata_dev.command_set == ATAPI_COMMAND_SET))) {
+             dev->sata_dev.class == ATA_DEV_ATAPI))) {
                memcpy(dev->sata_dev.fis, resp->ending_fis, ATA_RESP_FIS_SIZE);
 
                if (!link->sactive) {
@@ -272,7 +272,7 @@ static struct sas_internal *dev_to_sas_internal(struct domain_device *dev)
        return to_sas_internal(dev->port->ha->core.shost->transportt);
 }
 
-static void sas_get_ata_command_set(struct domain_device *dev);
+static int sas_get_ata_command_set(struct domain_device *dev);
 
 int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
 {
@@ -297,8 +297,7 @@ int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
                }
                memcpy(dev->frame_rcvd, &dev->sata_dev.rps_resp.rps.fis,
                       sizeof(struct dev_to_host_fis));
-               /* TODO switch to ata_dev_classify() */
-               sas_get_ata_command_set(dev);
+               dev->sata_dev.class = sas_get_ata_command_set(dev);
        }
        return 0;
 }
@@ -419,18 +418,7 @@ static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class,
        if (ret && ret != -EAGAIN)
                sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret);
 
-       /* XXX: if the class changes during the reset the upper layer
-        * should be informed, if the device has gone away we assume
-        * libsas will eventually delete it
-        */
-       switch (dev->sata_dev.command_set) {
-       case ATA_COMMAND_SET:
-               *class = ATA_DEV_ATA;
-               break;
-       case ATAPI_COMMAND_SET:
-               *class = ATA_DEV_ATAPI;
-               break;
-       }
+       *class = dev->sata_dev.class;
 
        ap->cbl = ATA_CBL_SATA;
        return ret;
@@ -619,50 +607,18 @@ void sas_ata_task_abort(struct sas_task *task)
        complete(waiting);
 }
 
-static void sas_get_ata_command_set(struct domain_device *dev)
+static int sas_get_ata_command_set(struct domain_device *dev)
 {
        struct dev_to_host_fis *fis =
                (struct dev_to_host_fis *) dev->frame_rcvd;
+       struct ata_taskfile tf;
 
        if (dev->dev_type == SAS_SATA_PENDING)
-               return;
+               return ATA_DEV_UNKNOWN;
+
+       ata_tf_from_fis((const u8 *)fis, &tf);
 
-       if ((fis->sector_count == 1 && /* ATA */
-            fis->lbal         == 1 &&
-            fis->lbam         == 0 &&
-            fis->lbah         == 0 &&
-            fis->device       == 0)
-           ||
-           (fis->sector_count == 0 && /* CE-ATA (mATA) */
-            fis->lbal         == 0 &&
-            fis->lbam         == 0xCE &&
-            fis->lbah         == 0xAA &&
-            (fis->device & ~0x10) == 0))
-
-               dev->sata_dev.command_set = ATA_COMMAND_SET;
-
-       else if ((fis->interrupt_reason == 1 && /* ATAPI */
-                 fis->lbal             == 1 &&
-                 fis->byte_count_low   == 0x14 &&
-                 fis->byte_count_high  == 0xEB &&
-                 (fis->device & ~0x10) == 0))
-
-               dev->sata_dev.command_set = ATAPI_COMMAND_SET;
-
-       else if ((fis->sector_count == 1 && /* SEMB */
-                 fis->lbal         == 1 &&
-                 fis->lbam         == 0x3C &&
-                 fis->lbah         == 0xC3 &&
-                 fis->device       == 0)
-               ||
-                (fis->interrupt_reason == 1 && /* SATA PM */
-                 fis->lbal             == 1 &&
-                 fis->byte_count_low   == 0x69 &&
-                 fis->byte_count_high  == 0x96 &&
-                 (fis->device & ~0x10) == 0))
-
-               /* Treat it as a superset? */
-               dev->sata_dev.command_set = ATAPI_COMMAND_SET;
+       return ata_dev_classify(&tf);
 }
 
 void sas_probe_sata(struct asd_sas_port *port)
@@ -768,7 +724,7 @@ int sas_discover_sata(struct domain_device *dev)
        if (dev->dev_type == SAS_SATA_PM)
                return -ENODEV;
 
-       sas_get_ata_command_set(dev);
+       dev->sata_dev.class = sas_get_ata_command_set(dev);
        sas_fill_in_rphy(dev, dev->rphy);
 
        res = sas_notify_lldd_dev_found(dev);