Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0281e02c5671f50701924465744edd3e2feb5d6f
Commit:     0281e02c5671f50701924465744edd3e2feb5d6f
Parent:     528fd55200ec135548e71aee43650bca92a041aa
Author:     James Bottomley <[EMAIL PROTECTED]>
AuthorDate: Mon Oct 16 13:25:30 2006 -0500
Committer:  James Bottomley <[EMAIL PROTECTED]>
CommitDate: Wed Jul 18 11:14:33 2007 -0500

    [SCSI] libsas: fixup NCQ for SATA disks
    
    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 <[EMAIL PROTECTED]>
---
 drivers/scsi/aic94xx/aic94xx_task.c |    1 -
 drivers/scsi/libsas/sas_discover.c  |   28 +++++++---------------------
 drivers/scsi/libsas/sas_scsi_host.c |    6 ++++++
 3 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/drivers/scsi/aic94xx/aic94xx_task.c 
b/drivers/scsi/aic94xx/aic94xx_task.c
index e2ad5be..9b65abe 100644
--- a/drivers/scsi/aic94xx/aic94xx_task.c
+++ b/drivers/scsi/aic94xx/aic94xx_task.c
@@ -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 */
diff --git a/drivers/scsi/libsas/sas_discover.c 
b/drivers/scsi/libsas/sas_discover.c
index 5252143..a18c0f6 100644
--- a/drivers/scsi/libsas/sas_discover.c
+++ b/drivers/scsi/libsas/sas_discover.c
@@ -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;
@@ -483,11 +484,7 @@ cont1:
 
        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;
@@ -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:
@@ -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;
 }
 
diff --git a/drivers/scsi/libsas/sas_scsi_host.c 
b/drivers/scsi/libsas/sas_scsi_host.c
index 5ff14ed..0dc7c02 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -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)) {
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to