aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libsas/sas_ata.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-12-11 21:52:37 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-11 21:52:37 -0500
commit4e8790f77f051d4cc745a57b48a73052521e8dfc (patch)
tree092a3cb9d947140c5f0411c9cc3aa4db1a3e41a9 /drivers/scsi/libsas/sas_ata.c
parent0a27044c83fe8f52fd8fd1964d17fa7538ea0771 (diff)
parent2ba520f0cd65c2e688f8beb495bb6634a61ee17b (diff)
Merge branch 'for-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
Pull libata changes from Tejun Heo: "The only interesting piece is the support for shingled drives. The changes in libata layer are minimal. All it does is identifying the new class of device and report upwards accordingly" * 'for-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata: libata: Remove FIXME comment in atapi_request_sense() sata_rcar: Document deprecated "renesas,rcar-sata" sata_rcar: Add clocks to sata_rcar bindings ahci_sunxi: Make AHCI_HFLAG_NO_PMP flag configurable with a module option libata-scsi: Update SATL for ZAC drives libata: Implement ATA_DEV_ZAC libsas: use ata_dev_classify()
Diffstat (limited to 'drivers/scsi/libsas/sas_ata.c')
-rw-r--r--drivers/scsi/libsas/sas_ata.c66
1 files changed, 11 insertions, 55 deletions
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
index 577770fdee86..932d9cc98d2f 100644
--- a/drivers/scsi/libsas/sas_ata.c
+++ b/drivers/scsi/libsas/sas_ata.c
@@ -138,7 +138,7 @@ static void sas_ata_task_done(struct sas_task *task)
138 138
139 if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD || 139 if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD ||
140 ((stat->stat == SAM_STAT_CHECK_CONDITION && 140 ((stat->stat == SAM_STAT_CHECK_CONDITION &&
141 dev->sata_dev.command_set == ATAPI_COMMAND_SET))) { 141 dev->sata_dev.class == ATA_DEV_ATAPI))) {
142 memcpy(dev->sata_dev.fis, resp->ending_fis, ATA_RESP_FIS_SIZE); 142 memcpy(dev->sata_dev.fis, resp->ending_fis, ATA_RESP_FIS_SIZE);
143 143
144 if (!link->sactive) { 144 if (!link->sactive) {
@@ -272,7 +272,7 @@ static struct sas_internal *dev_to_sas_internal(struct domain_device *dev)
272 return to_sas_internal(dev->port->ha->core.shost->transportt); 272 return to_sas_internal(dev->port->ha->core.shost->transportt);
273} 273}
274 274
275static void sas_get_ata_command_set(struct domain_device *dev); 275static int sas_get_ata_command_set(struct domain_device *dev);
276 276
277int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy) 277int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
278{ 278{
@@ -297,8 +297,7 @@ int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
297 } 297 }
298 memcpy(dev->frame_rcvd, &dev->sata_dev.rps_resp.rps.fis, 298 memcpy(dev->frame_rcvd, &dev->sata_dev.rps_resp.rps.fis,
299 sizeof(struct dev_to_host_fis)); 299 sizeof(struct dev_to_host_fis));
300 /* TODO switch to ata_dev_classify() */ 300 dev->sata_dev.class = sas_get_ata_command_set(dev);
301 sas_get_ata_command_set(dev);
302 } 301 }
303 return 0; 302 return 0;
304} 303}
@@ -419,18 +418,7 @@ static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class,
419 if (ret && ret != -EAGAIN) 418 if (ret && ret != -EAGAIN)
420 sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret); 419 sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret);
421 420
422 /* XXX: if the class changes during the reset the upper layer 421 *class = dev->sata_dev.class;
423 * should be informed, if the device has gone away we assume
424 * libsas will eventually delete it
425 */
426 switch (dev->sata_dev.command_set) {
427 case ATA_COMMAND_SET:
428 *class = ATA_DEV_ATA;
429 break;
430 case ATAPI_COMMAND_SET:
431 *class = ATA_DEV_ATAPI;
432 break;
433 }
434 422
435 ap->cbl = ATA_CBL_SATA; 423 ap->cbl = ATA_CBL_SATA;
436 return ret; 424 return ret;
@@ -619,50 +607,18 @@ void sas_ata_task_abort(struct sas_task *task)
619 complete(waiting); 607 complete(waiting);
620} 608}
621 609
622static void sas_get_ata_command_set(struct domain_device *dev) 610static int sas_get_ata_command_set(struct domain_device *dev)
623{ 611{
624 struct dev_to_host_fis *fis = 612 struct dev_to_host_fis *fis =
625 (struct dev_to_host_fis *) dev->frame_rcvd; 613 (struct dev_to_host_fis *) dev->frame_rcvd;
614 struct ata_taskfile tf;
626 615
627 if (dev->dev_type == SAS_SATA_PENDING) 616 if (dev->dev_type == SAS_SATA_PENDING)
628 return; 617 return ATA_DEV_UNKNOWN;
618
619 ata_tf_from_fis((const u8 *)fis, &tf);
629 620
630 if ((fis->sector_count == 1 && /* ATA */ 621 return ata_dev_classify(&tf);
631 fis->lbal == 1 &&
632 fis->lbam == 0 &&
633 fis->lbah == 0 &&
634 fis->device == 0)
635 ||
636 (fis->sector_count == 0 && /* CE-ATA (mATA) */
637 fis->lbal == 0 &&
638 fis->lbam == 0xCE &&
639 fis->lbah == 0xAA &&
640 (fis->device & ~0x10) == 0))
641
642 dev->sata_dev.command_set = ATA_COMMAND_SET;
643
644 else if ((fis->interrupt_reason == 1 && /* ATAPI */
645 fis->lbal == 1 &&
646 fis->byte_count_low == 0x14 &&
647 fis->byte_count_high == 0xEB &&
648 (fis->device & ~0x10) == 0))
649
650 dev->sata_dev.command_set = ATAPI_COMMAND_SET;
651
652 else if ((fis->sector_count == 1 && /* SEMB */
653 fis->lbal == 1 &&
654 fis->lbam == 0x3C &&
655 fis->lbah == 0xC3 &&
656 fis->device == 0)
657 ||
658 (fis->interrupt_reason == 1 && /* SATA PM */
659 fis->lbal == 1 &&
660 fis->byte_count_low == 0x69 &&
661 fis->byte_count_high == 0x96 &&
662 (fis->device & ~0x10) == 0))
663
664 /* Treat it as a superset? */
665 dev->sata_dev.command_set = ATAPI_COMMAND_SET;
666} 622}
667 623
668void sas_probe_sata(struct asd_sas_port *port) 624void sas_probe_sata(struct asd_sas_port *port)
@@ -768,7 +724,7 @@ int sas_discover_sata(struct domain_device *dev)
768 if (dev->dev_type == SAS_SATA_PM) 724 if (dev->dev_type == SAS_SATA_PM)
769 return -ENODEV; 725 return -ENODEV;
770 726
771 sas_get_ata_command_set(dev); 727 dev->sata_dev.class = sas_get_ata_command_set(dev);
772 sas_fill_in_rphy(dev, dev->rphy); 728 sas_fill_in_rphy(dev, dev->rphy);
773 729
774 res = sas_notify_lldd_dev_found(dev); 730 res = sas_notify_lldd_dev_found(dev);