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>
This commit is contained in:
parent
9a23c1d6f0
commit
1cbd772d9a
|
|
@ -373,10 +373,10 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,
|
||||||
|
|
||||||
if (unlikely(task->ata_task.device_control_reg_update))
|
if (unlikely(task->ata_task.device_control_reg_update))
|
||||||
scb->header.opcode = CONTROL_ATA_DEV;
|
scb->header.opcode = CONTROL_ATA_DEV;
|
||||||
else if (dev->sata_dev.command_set == ATA_COMMAND_SET)
|
else if (dev->sata_dev.class == ATA_DEV_ATAPI)
|
||||||
scb->header.opcode = INITIATE_ATA_TASK;
|
|
||||||
else
|
|
||||||
scb->header.opcode = INITIATE_ATAPI_TASK;
|
scb->header.opcode = INITIATE_ATAPI_TASK;
|
||||||
|
else
|
||||||
|
scb->header.opcode = INITIATE_ATA_TASK;
|
||||||
|
|
||||||
scb->ata_task.proto_conn_rate = (1 << 5); /* STP */
|
scb->ata_task.proto_conn_rate = (1 << 5); /* STP */
|
||||||
if (dev->port->oob_mode == SAS_OOB_MODE)
|
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,
|
||||||
if (likely(!task->ata_task.device_control_reg_update))
|
if (likely(!task->ata_task.device_control_reg_update))
|
||||||
scb->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
|
scb->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
|
||||||
scb->ata_task.fis.flags &= 0xF0; /* PM_PORT field shall be 0 */
|
scb->ata_task.fis.flags &= 0xF0; /* PM_PORT field shall be 0 */
|
||||||
if (dev->sata_dev.command_set == ATAPI_COMMAND_SET)
|
if (dev->sata_dev.class == ATA_DEV_ATAPI)
|
||||||
memcpy(scb->ata_task.atapi_packet, task->ata_task.atapi_packet,
|
memcpy(scb->ata_task.atapi_packet, task->ata_task.atapi_packet,
|
||||||
16);
|
16);
|
||||||
scb->ata_task.sister_scb = cpu_to_le16(0xFFFF);
|
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,
|
||||||
if (task->ata_task.dma_xfer)
|
if (task->ata_task.dma_xfer)
|
||||||
flags |= DATA_XFER_MODE_DMA;
|
flags |= DATA_XFER_MODE_DMA;
|
||||||
if (task->ata_task.use_ncq &&
|
if (task->ata_task.use_ncq &&
|
||||||
dev->sata_dev.command_set != ATAPI_COMMAND_SET)
|
dev->sata_dev.class != ATA_DEV_ATAPI)
|
||||||
flags |= ATA_Q_TYPE_NCQ;
|
flags |= ATA_Q_TYPE_NCQ;
|
||||||
flags |= data_dir_flags[task->data_dir];
|
flags |= data_dir_flags[task->data_dir];
|
||||||
scb->ata_task.ata_flags = flags;
|
scb->ata_task.ata_flags = flags;
|
||||||
|
|
|
||||||
|
|
@ -694,7 +694,7 @@ sci_io_request_construct_sata(struct isci_request *ireq,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ATAPI */
|
/* ATAPI */
|
||||||
if (dev->sata_dev.command_set == ATAPI_COMMAND_SET &&
|
if (dev->sata_dev.class == ATA_DEV_ATAPI &&
|
||||||
task->ata_task.fis.command == ATA_CMD_PACKET) {
|
task->ata_task.fis.command == ATA_CMD_PACKET) {
|
||||||
sci_atapi_construct(ireq);
|
sci_atapi_construct(ireq);
|
||||||
return SCI_SUCCESS;
|
return SCI_SUCCESS;
|
||||||
|
|
@ -2980,7 +2980,7 @@ static void sci_request_started_state_enter(struct sci_base_state_machine *sm)
|
||||||
state = SCI_REQ_SMP_WAIT_RESP;
|
state = SCI_REQ_SMP_WAIT_RESP;
|
||||||
} else if (task && sas_protocol_ata(task->task_proto) &&
|
} else if (task && sas_protocol_ata(task->task_proto) &&
|
||||||
!task->ata_task.use_ncq) {
|
!task->ata_task.use_ncq) {
|
||||||
if (dev->sata_dev.command_set == ATAPI_COMMAND_SET &&
|
if (dev->sata_dev.class == ATA_DEV_ATAPI &&
|
||||||
task->ata_task.fis.command == ATA_CMD_PACKET) {
|
task->ata_task.fis.command == ATA_CMD_PACKET) {
|
||||||
state = SCI_REQ_ATAPI_WAIT_H2D;
|
state = SCI_REQ_ATAPI_WAIT_H2D;
|
||||||
} else if (task->data_dir == DMA_NONE) {
|
} else if (task->data_dir == DMA_NONE) {
|
||||||
|
|
|
||||||
|
|
@ -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 ||
|
if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD ||
|
||||||
((stat->stat == SAM_STAT_CHECK_CONDITION &&
|
((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);
|
memcpy(dev->sata_dev.fis, resp->ending_fis, ATA_RESP_FIS_SIZE);
|
||||||
|
|
||||||
if (!link->sactive) {
|
if (!link->sactive) {
|
||||||
|
|
@ -278,7 +278,7 @@ static struct sas_internal *dev_to_sas_internal(struct domain_device *dev)
|
||||||
return to_sas_internal(dev->port->ha->core.shost->transportt);
|
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)
|
int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
|
||||||
{
|
{
|
||||||
|
|
@ -303,8 +303,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,
|
memcpy(dev->frame_rcvd, &dev->sata_dev.rps_resp.rps.fis,
|
||||||
sizeof(struct dev_to_host_fis));
|
sizeof(struct dev_to_host_fis));
|
||||||
/* TODO switch to ata_dev_classify() */
|
dev->sata_dev.class = sas_get_ata_command_set(dev);
|
||||||
sas_get_ata_command_set(dev);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -425,18 +424,7 @@ static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class,
|
||||||
if (ret && ret != -EAGAIN)
|
if (ret && ret != -EAGAIN)
|
||||||
sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret);
|
sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret);
|
||||||
|
|
||||||
/* XXX: if the class changes during the reset the upper layer
|
*class = dev->sata_dev.class;
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
ap->cbl = ATA_CBL_SATA;
|
ap->cbl = ATA_CBL_SATA;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
@ -626,50 +614,18 @@ void sas_ata_task_abort(struct sas_task *task)
|
||||||
complete(waiting);
|
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 *fis =
|
||||||
(struct dev_to_host_fis *) dev->frame_rcvd;
|
(struct dev_to_host_fis *) dev->frame_rcvd;
|
||||||
|
struct ata_taskfile tf;
|
||||||
|
|
||||||
if (dev->dev_type == SAS_SATA_PENDING)
|
if (dev->dev_type == SAS_SATA_PENDING)
|
||||||
return;
|
return ATA_DEV_UNKNOWN;
|
||||||
|
|
||||||
if ((fis->sector_count == 1 && /* ATA */
|
ata_tf_from_fis((const u8 *)fis, &tf);
|
||||||
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;
|
return ata_dev_classify(&tf);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sas_probe_sata(struct asd_sas_port *port)
|
void sas_probe_sata(struct asd_sas_port *port)
|
||||||
|
|
@ -775,7 +731,7 @@ int sas_discover_sata(struct domain_device *dev)
|
||||||
if (dev->dev_type == SAS_SATA_PM)
|
if (dev->dev_type == SAS_SATA_PM)
|
||||||
return -ENODEV;
|
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);
|
sas_fill_in_rphy(dev, dev->rphy);
|
||||||
|
|
||||||
res = sas_notify_lldd_dev_found(dev);
|
res = sas_notify_lldd_dev_found(dev);
|
||||||
|
|
|
||||||
|
|
@ -479,7 +479,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
|
||||||
|
|
||||||
if (task->ata_task.use_ncq)
|
if (task->ata_task.use_ncq)
|
||||||
flags |= MCH_FPDMA;
|
flags |= MCH_FPDMA;
|
||||||
if (dev->sata_dev.command_set == ATAPI_COMMAND_SET) {
|
if (dev->sata_dev.class == ATA_DEV_ATAPI) {
|
||||||
if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI)
|
if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI)
|
||||||
flags |= MCH_ATAPI;
|
flags |= MCH_ATAPI;
|
||||||
}
|
}
|
||||||
|
|
@ -546,7 +546,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
|
||||||
task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
|
task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
|
||||||
/* fill in command FIS and ATAPI CDB */
|
/* fill in command FIS and ATAPI CDB */
|
||||||
memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis));
|
memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis));
|
||||||
if (dev->sata_dev.command_set == ATAPI_COMMAND_SET)
|
if (dev->sata_dev.class == ATA_DEV_ATAPI)
|
||||||
memcpy(buf_cmd + STP_ATAPI_CMD,
|
memcpy(buf_cmd + STP_ATAPI_CMD,
|
||||||
task->ata_task.atapi_packet, 16);
|
task->ata_task.atapi_packet, 16);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4367,7 +4367,7 @@ static int pm8001_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
|
||||||
PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n"));
|
PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n"));
|
||||||
}
|
}
|
||||||
if (task->ata_task.use_ncq &&
|
if (task->ata_task.use_ncq &&
|
||||||
dev->sata_dev.command_set != ATAPI_COMMAND_SET) {
|
dev->sata_dev.class != ATA_DEV_ATAPI) {
|
||||||
ATAP = 0x07; /* FPDMA */
|
ATAP = 0x07; /* FPDMA */
|
||||||
PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n"));
|
PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n"));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4077,7 +4077,7 @@ static int pm80xx_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
|
||||||
PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n"));
|
PM8001_IO_DBG(pm8001_ha, pm8001_printk("PIO\n"));
|
||||||
}
|
}
|
||||||
if (task->ata_task.use_ncq &&
|
if (task->ata_task.use_ncq &&
|
||||||
dev->sata_dev.command_set != ATAPI_COMMAND_SET) {
|
dev->sata_dev.class != ATA_DEV_ATAPI) {
|
||||||
ATAP = 0x07; /* FPDMA */
|
ATAP = 0x07; /* FPDMA */
|
||||||
PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n"));
|
PM8001_IO_DBG(pm8001_ha, pm8001_printk("FPDMA\n"));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -161,15 +161,10 @@ struct expander_device {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ---------- SATA device ---------- */
|
/* ---------- SATA device ---------- */
|
||||||
enum ata_command_set {
|
|
||||||
ATA_COMMAND_SET = 0,
|
|
||||||
ATAPI_COMMAND_SET = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ATA_RESP_FIS_SIZE 24
|
#define ATA_RESP_FIS_SIZE 24
|
||||||
|
|
||||||
struct sata_device {
|
struct sata_device {
|
||||||
enum ata_command_set command_set;
|
unsigned int class;
|
||||||
struct smp_resp rps_resp; /* report_phy_sata_resp */
|
struct smp_resp rps_resp; /* report_phy_sata_resp */
|
||||||
u8 port_no; /* port number, if this is a PM (Port) */
|
u8 port_no; /* port number, if this is a PM (Port) */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue