diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/scsi/aic94xx/aic94xx_task.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/isci/request.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_ata.c | 66 | ||||
| -rw-r--r-- | drivers/scsi/mvsas/mv_sas.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/pm8001/pm8001_hwi.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/pm8001/pm80xx_hwi.c | 2 |
6 files changed, 22 insertions, 66 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 | ||
| 281 | static void sas_get_ata_command_set(struct domain_device *dev); | 281 | static int sas_get_ata_command_set(struct domain_device *dev); |
| 282 | 282 | ||
| 283 | int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy) | 283 | int 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 | ||
| 629 | static void sas_get_ata_command_set(struct domain_device *dev) | 617 | static 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 | ||
| 675 | void sas_probe_sata(struct asd_sas_port *port) | 631 | void 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 | } |
