Skip to content

Commit

Permalink
[SCSI] libsas: fixup NCQ for SATA disks
Browse files Browse the repository at this point in the history
We actually had two problems: the one with the tag (which is fixed by
zeroing the tag before sending the taskfile to the sequencer) but the
other with the fact that we sent our first NCQ command to the device
before the sequencer had been informed of the NCQ tagging
capabilities.  I fixed the latter by moving the rphy_add() to the
correct point in the code after the NCQ capabilities are set up.

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
  • Loading branch information
James Bottomley authored and James Bottomley committed Jul 18, 2007
1 parent 528fd55 commit 0281e02
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 22 deletions.
1 change: 0 additions & 1 deletion drivers/scsi/aic94xx/aic94xx_task.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,6 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,

scb->ata_task.total_xfer_len = cpu_to_le32(task->total_xfer_len);
scb->ata_task.fis = task->ata_task.fis;
scb->ata_task.fis.fis_type = 0x27;
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 &= 0xF0; /* PM_PORT field shall be 0 */
Expand Down
28 changes: 7 additions & 21 deletions drivers/scsi/libsas/sas_discover.c
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ static int sas_issue_ata_cmd(struct domain_device *dev, u8 command,

task->dev = dev;

task->ata_task.fis.fis_type = 0x27;
task->ata_task.fis.command = command;
task->ata_task.fis.features = features;
task->ata_task.fis.device = d2h_fis->device;
Expand Down Expand Up @@ -483,11 +484,7 @@ static int sas_discover_sata_dev(struct domain_device *dev)

sas_fill_in_rphy(dev, dev->rphy);

res = sas_rphy_add(dev->rphy);
if (res)
goto out_err;

return res;
return 0;
out_err:
dev->sata_dev.identify_packet_device = NULL;
dev->sata_dev.identify_device = NULL;
Expand Down Expand Up @@ -555,7 +552,7 @@ int sas_discover_sata(struct domain_device *dev)

res = sas_notify_lldd_dev_found(dev);
if (res)
goto out_err2;
return res;

switch (dev->dev_type) {
case SATA_DEV:
Expand All @@ -567,23 +564,12 @@ int sas_discover_sata(struct domain_device *dev)
default:
break;
}
if (res)
goto out_err;

sas_notify_lldd_dev_gone(dev);
res = sas_notify_lldd_dev_found(dev);
if (res)
goto out_err2;

res = sas_rphy_add(dev->rphy);
if (res)
goto out_err;

return res;
if (!res) {
sas_notify_lldd_dev_found(dev);
res = sas_rphy_add(dev->rphy);
}

out_err:
sas_notify_lldd_dev_gone(dev);
out_err2:
return res;
}

Expand Down
6 changes: 6 additions & 0 deletions drivers/scsi/libsas/sas_scsi_host.c
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,12 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
task->task_proto = SAS_PROTOCOL_STP;
task->task_done = sas_ata_task_done;

if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
qc->tf.command == ATA_CMD_FPDMA_READ) {
/* Need to zero out the tag libata assigned us */
qc->tf.nsect = 0;
}

ata_tf_to_fis(&qc->tf, (u8*)&task->ata_task.fis, 0);
task->uldd_task = qc;
if (is_atapi_taskfile(&qc->tf)) {
Expand Down

0 comments on commit 0281e02

Please sign in to comment.