|
@@ -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);
|