aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2014-11-05 07:08:20 -0500
committerTejun Heo <tj@kernel.org>2014-11-05 11:22:06 -0500
commit1cbd772d9aaf6c697935cb855860b66cebacf950 (patch)
treefe83656bbb9a39f4a8b85ebb6afce18b05492840
parent9a23c1d6f0f5dbac4c9b73fa6cea7c9ee3d29074 (diff)
libsas: use ata_dev_classify()
Use the ata device class from libata in libsas instead of checking the supported command set and switch to using ata_dev_classify() instead of our own method. Cc: Tejun Heo <tj@kernel.org> Cc: Dan Williams <dan.j.williams@intel.com> Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--drivers/scsi/aic94xx/aic94xx_task.c10
-rw-r--r--drivers/scsi/isci/request.c4
-rw-r--r--drivers/scsi/libsas/sas_ata.c66
-rw-r--r--drivers/scsi/mvsas/mv_sas.c4
-rw-r--r--drivers/scsi/pm8001/pm8001_hwi.c2
-rw-r--r--drivers/scsi/pm8001/pm80xx_hwi.c2
-rw-r--r--include/scsi/libsas.h11
7 files changed, 25 insertions, 74 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c
index 59b86e260ce9..7abbe42e862e 100644
--- a/drivers/scsi/aic94xx/aic94xx_task.c
+++ b/drivers/scsi/aic94xx/aic94xx_task.c
@@ -373,10 +373,10 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,
373 373
374 if (unlikely(task->ata_task.device_control_reg_update)) 374 if (unlikely(task->ata_task.device_control_reg_update))
375 scb->header.opcode = CONTROL_ATA_DEV; 375 scb->header.opcode = CONTROL_ATA_DEV;
376 else if (dev->sata_dev.command_set == ATA_COMMAND_SET) 376 else if (dev->sata_dev.class == ATA_DEV_ATAPI)
377 scb->header.opcode = INITIATE_ATA_TASK;
378 else
379 scb->header.opcode = INITIATE_ATAPI_TASK; 377 scb->header.opcode = INITIATE_ATAPI_TASK;
378 else
379 scb->header.opcode = INITIATE_ATA_TASK;
380 380
381 scb->ata_task.proto_conn_rate = (1 << 5); /* STP */ 381 scb->ata_task.proto_conn_rate = (1 << 5); /* STP */
382 if (dev->port->oob_mode == SAS_OOB_MODE) 382 if (dev->port->oob_mode == SAS_OOB_MODE)
@@ -387,7 +387,7 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,
387 if (likely(!task->ata_task.device_control_reg_update)) 387 if (likely(!task->ata_task.device_control_reg_update))
388 scb->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */ 388 scb->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
389 scb->ata_task.fis.flags &= 0xF0; /* PM_PORT field shall be 0 */ 389 scb->ata_task.fis.flags &= 0xF0; /* PM_PORT field shall be 0 */
390 if (dev->sata_dev.command_set == ATAPI_COMMAND_SET) 390 if (dev->sata_dev.class == ATA_DEV_ATAPI)
391 memcpy(scb->ata_task.atapi_packet, task->ata_task.atapi_packet, 391 memcpy(scb->ata_task.atapi_packet, task->ata_task.atapi_packet,
392 16); 392 16);
393 scb->ata_task.sister_scb = cpu_to_le16(0xFFFF); 393 scb->ata_task.sister_scb = cpu_to_le16(0xFFFF);
@@ -399,7 +399,7 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,
399 if (task->ata_task.dma_xfer) 399 if (task->ata_task.dma_xfer)
400 flags |= DATA_XFER_MODE_DMA; 400 flags |= DATA_XFER_MODE_DMA;
401 if (task->ata_task.use_ncq && 401 if (task->ata_task.use_ncq &&
402 dev->sata_dev.command_set != ATAPI_COMMAND_SET) 402 dev->sata_dev.class != ATA_DEV_ATAPI)
403 flags |= ATA_Q_TYPE_NCQ; 403 flags |= ATA_Q_TYPE_NCQ;
404 flags |= data_dir_flags[task->data_dir]; 404 flags |= data_dir_flags[task->data_dir];
405 scb->ata_task.ata_flags = flags; 405 scb->ata_task.ata_flags = flags;
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
index 56e38096f0c4..cfd0084f1cd2 100644
--- a/drivers/scsi/isci/request.c
+++ b/drivers/scsi/isci/request.c
@@ -694,7 +694,7 @@ sci_io_request_construct_sata(struct isci_request *ireq,
694 } 694 }
695 695
696 /* ATAPI */ 696 /* ATAPI */
697 if (dev->sata_dev.command_set == ATAPI_COMMAND_SET && 697 if (dev->sata_dev.class == ATA_DEV_ATAPI &&
698 task->ata_task.fis.command == ATA_CMD_PACKET) { 698 task->ata_task.fis.command == ATA_CMD_PACKET) {
699 sci_atapi_construct(ireq); 699 sci_atapi_construct(ireq);
700 return SCI_SUCCESS; 700 return SCI_SUCCESS;
@@ -2980,7 +2980,7 @@ static void sci_request_started_state_enter(struct sci_base_state_machine *sm)
2980 state = SCI_REQ_SMP_WAIT_RESP; 2980 state = SCI_REQ_SMP_WAIT_RESP;
2981 } else if (task && sas_protocol_ata(task->task_proto) && 2981 } else if (task && sas_protocol_ata(task->task_proto) &&
2982 !task->ata_task.use_ncq) { 2982 !task->ata_task.use_ncq) {
2983 if (dev->sata_dev.command_set == ATAPI_COMMAND_SET && 2983 if (dev->sata_dev.class == ATA_DEV_ATAPI &&
2984 task->ata_task.fis.command == ATA_CMD_PACKET) { 2984 task->ata_task.fis.command == ATA_CMD_PACKET) {
2985 state = SCI_REQ_ATAPI_WAIT_H2D; 2985 state = SCI_REQ_ATAPI_WAIT_H2D;
2986 } else if (task->data_dir == DMA_NONE) { 2986 } else if (task->data_dir == DMA_NONE) {
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
index 766098af4eb7..9f68db7ed5f1 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) {
@@ -278,7 +278,7 @@ static struct sas_internal *dev_to_sas_internal(struct domain_device *dev)
278 return to_sas_internal(dev->port->ha->core.shost->transportt); 278 return to_sas_internal(dev->port->ha->core.shost->transportt);
279} 279}
280 280
281static void sas_get_ata_command_set(struct domain_device *dev); 281static int sas_get_ata_command_set(struct domain_device *dev);
282 282
283int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy) 283int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
284{ 284{
@@ -303,8 +303,7 @@ int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
303 } 303 }
304 memcpy(dev->frame_rcvd, &dev->sata_dev.rps_resp.rps.fis, 304 memcpy(dev->frame_rcvd, &dev->sata_dev.rps_resp.rps.fis,
305 sizeof(struct dev_to_host_fis)); 305 sizeof(struct dev_to_host_fis));
306 /* TODO switch to ata_dev_classify() */ 306 dev->sata_dev.class = sas_get_ata_command_set(dev);
307 sas_get_ata_command_set(dev);
308 } 307 }
309 return 0; 308 return 0;
310} 309}
@@ -425,18 +424,7 @@ static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class,
425 if (ret && ret != -EAGAIN) 424 if (ret && ret != -EAGAIN)
426 sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret); 425 sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret);
427 426
428 /* XXX: if the class changes during the reset the upper layer 427 *class = dev->sata_dev.class;
429 * should be informed, if the device has gone away we assume
430 * libsas will eventually delete it
431 */
432 switch (dev->sata_dev.command_set) {
433 case ATA_COMMAND_SET:
434 *class = ATA_DEV_ATA;
435 break;
436 case ATAPI_COMMAND_SET:
437 *class = ATA_DEV_ATAPI;
438 break;
439 }
440 428
441 ap->cbl = ATA_CBL_SATA; 429 ap->cbl = ATA_CBL_SATA;
442 return ret; 430 return ret;
@@ -626,50 +614,18 @@ void sas_ata_task_abort(struct sas_task *task)
626 complete(waiting); 614 complete(waiting);
627} 615}
628 616
629static void sas_get_ata_command_set(struct domain_device *dev) 617static int sas_get_ata_command_set(struct domain_device *dev)
630{ 618{
631 struct dev_to_host_fis *fis = 619 struct dev_to_host_fis *fis =
632 (struct dev_to_host_fis *) dev->frame_rcvd; 620 (struct dev_to_host_fis *) dev->frame_rcvd;
621 struct ata_taskfile tf;
633 622
634 if (dev->dev_type == SAS_SATA_PENDING) 623 if (dev->dev_type == SAS_SATA_PENDING)
635 return; 624 return ATA_DEV_UNKNOWN;
625
626 ata_tf_from_fis((const u8 *)fis, &tf);
636 627
637 if ((fis->sector_count == 1 && /* ATA */ 628 return ata_dev_classify(&tf);
638 fis->lbal == 1 &&
639 fis->lbam == 0 &&
640 fis->lbah == 0 &&
641 fis->device == 0)
642 ||
643 (fis->sector_count == 0 && /* CE-ATA (mATA) */
644 fis->lbal == 0 &&
645 fis->lbam == 0xCE &&
646 fis->lbah == 0xAA &&
647 (fis->device & ~0x10) == 0))
648
649 dev->sata_dev.command_set = ATA_COMMAND_SET;
650
651 else if ((fis->interrupt_reason == 1 && /* ATAPI */
652 fis->lbal == 1 &&
653 fis->byte_count_low == 0x14 &&
654 fis->byte_count_high == 0xEB &&
655 (fis->device & ~0x10) == 0))
656
657 dev->sata_dev.command_set = ATAPI_COMMAND_SET;
658
659 else if ((fis->sector_count == 1 && /* SEMB */
660 fis->lbal == 1 &&
661 fis->lbam == 0x3C &&
662 fis->lbah == 0xC3 &&
663 fis->device == 0)
664 ||
665 (fis->interrupt_reason == 1 && /* SATA PM */
666 fis->lbal == 1 &&
667 fis->byte_count_low == 0x69 &&
668 fis->byte_count_high == 0x96 &&
669 (fis->device & ~0x10) == 0))
670
671 /* Treat it as a superset? */
672 dev->sata_dev.command_set = ATAPI_COMMAND_SET;
673} 629}
674 630
675void sas_probe_sata(struct asd_sas_port *port) 631void sas_probe_sata(struct asd_sas_port *port)
@@ -775,7 +731,7 @@ int sas_discover_sata(struct domain_device *dev)
775 if (dev->dev_type == SAS_SATA_PM) 731 if (dev->dev_type == SAS_SATA_PM)
776 return -ENODEV; 732 return -ENODEV;
777 733
778 sas_get_ata_command_set(dev); 734 dev->sata_dev.class = sas_get_ata_command_set(dev);
779 sas_fill_in_rphy(dev, dev->rphy); 735 sas_fill_in_rphy(dev, dev->rphy);
780 736
781 res = sas_notify_lldd_dev_found(dev); 737 res = sas_notify_lldd_dev_found(dev);
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
index ac52f7c99513..48a493cd285a 100644
--- a/drivers/scsi/mvsas/mv_sas.c
+++ b/drivers/scsi/mvsas/mv_sas.c
@@ -479,7 +479,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
479 479
480 if (task->ata_task.use_ncq) 480 if (task->ata_task.use_ncq)
481 flags |= MCH_FPDMA; 481 flags |= MCH_FPDMA;
482 if (dev->sata_dev.command_set == ATAPI_COMMAND_SET) { 482 if (dev->sata_dev.class == ATA_DEV_ATAPI) {
483 if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI) 483 if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI)
484 flags |= MCH_ATAPI; 484 flags |= MCH_ATAPI;
485 } 485 }
@@ -546,7 +546,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
546 task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */ 546 task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
547 /* fill in command FIS and ATAPI CDB */ 547 /* fill in command FIS and ATAPI CDB */
548 memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis)); 548 memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis));
549 if (dev->sata_dev.command_set == ATAPI_COMMAND_SET) 549 if (dev->sata_dev.class == ATA_DEV_ATAPI)
550 memcpy(buf_cmd + STP_ATAPI_CMD, 550 memcpy(buf_cmd + STP_ATAPI_CMD,
551 task->ata_task.atapi_packet, 16); 551 task->ata_task.atapi_packet, 16);
552 552
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index 933f21471951..96dcc097a463 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -4367,7 +4367,7 @@ static int pm8001_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
4367 PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n")); 4367 PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n"));
4368 } 4368 }
4369 if (task->ata_task.use_ncq && 4369 if (task->ata_task.use_ncq &&
4370 dev->sata_dev.command_set != ATAPI_COMMAND_SET) { 4370 dev->sata_dev.class != ATA_DEV_ATAPI) {
4371 ATAP = 0x07; /* FPDMA */ 4371 ATAP = 0x07; /* FPDMA */
4372 PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n")); 4372 PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n"));
4373 } 4373 }
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index b06443a0db2d..05cce463ab01 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -4077,7 +4077,7 @@ static int pm80xx_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
4077 PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n")); 4077 PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n"));
4078 } 4078 }
4079 if (task->ata_task.use_ncq && 4079 if (task->ata_task.use_ncq &&
4080 dev->sata_dev.command_set != ATAPI_COMMAND_SET) { 4080 dev->sata_dev.class != ATA_DEV_ATAPI) {
4081 ATAP = 0x07; /* FPDMA */ 4081 ATAP = 0x07; /* FPDMA */
4082 PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n")); 4082 PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n"));
4083 } 4083 }
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
index ef7872c20da9..8528a09a00c4 100644
--- a/include/scsi/libsas.h
+++ b/include/scsi/libsas.h
@@ -161,17 +161,12 @@ struct expander_device {
161}; 161};
162 162
163/* ---------- SATA device ---------- */ 163/* ---------- SATA device ---------- */
164enum ata_command_set {
165 ATA_COMMAND_SET = 0,
166 ATAPI_COMMAND_SET = 1,
167};
168
169#define ATA_RESP_FIS_SIZE 24 164#define ATA_RESP_FIS_SIZE 24
170 165
171struct sata_device { 166struct sata_device {
172 enum ata_command_set command_set; 167 unsigned int class;
173 struct smp_resp rps_resp; /* report_phy_sata_resp */ 168 struct smp_resp rps_resp; /* report_phy_sata_resp */
174 u8 port_no; /* port number, if this is a PM (Port) */ 169 u8 port_no; /* port number, if this is a PM (Port) */
175 170
176 struct ata_port *ap; 171 struct ata_port *ap;
177 struct ata_host ata_host; 172 struct ata_host ata_host;