Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=92ba5d02d993ccf4a87b945779fe052f67c3c334
Commit:     92ba5d02d993ccf4a87b945779fe052f67c3c334
Parent:     4a537a5518e81dba342eccbffcfa5c27cb5781d4
Author:     Alan Cox <[EMAIL PROTECTED]>
AuthorDate: Mon Jan 28 16:08:23 2008 +0000
Committer:  Jeff Garzik <[EMAIL PROTECTED]>
CommitDate: Fri Feb 1 12:26:40 2008 -0500

    pata_sl82c105: dual channel support
    
    Use qc_defer to serialize the two channels
    
    Signed-off-by: Alan Cox <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/ata/pata_sl82c105.c |   33 +++++++++++++++++++++++++++++++--
 1 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c
index 1388cef..81ef207 100644
--- a/drivers/ata/pata_sl82c105.c
+++ b/drivers/ata/pata_sl82c105.c
@@ -26,7 +26,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME "pata_sl82c105"
-#define DRV_VERSION "0.3.2"
+#define DRV_VERSION "0.3.3"
 
 enum {
        /*
@@ -206,6 +206,34 @@ static void sl82c105_bmdma_stop(struct ata_queued_cmd *qc)
        sl82c105_set_piomode(ap, qc->dev);
 }
 
+/**
+ *     sl82c105_qc_defer       -       implement serialization
+ *     @qc: command
+ *
+ *     We must issue one command per host not per channel because
+ *     of the reset bug.
+ *
+ *     Q: is the scsi host lock sufficient ?
+ */
+
+static int sl82c105_qc_defer(struct ata_queued_cmd *qc)
+{
+       struct ata_host *host = qc->ap->host;
+       struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
+       int rc;
+
+       /* First apply the usual rules */       
+       rc = ata_std_qc_defer(qc);
+       if (rc != 0)
+               return rc;
+
+       /* Now apply serialization rules. Only allow a command if the
+          other channel state machine is idle */
+       if (alt && alt->qc_active)
+               return  ATA_DEFER_PORT;
+       return 0;
+}
+
 static struct scsi_host_template sl82c105_sht = {
        .module                 = THIS_MODULE,
        .name                   = DRV_NAME,
@@ -245,6 +273,7 @@ static struct ata_port_operations sl82c105_port_ops = {
        .bmdma_stop     = sl82c105_bmdma_stop,
        .bmdma_status   = ata_bmdma_status,
 
+       .qc_defer       = sl82c105_qc_defer,
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
@@ -312,7 +341,7 @@ static int sl82c105_init_one(struct pci_dev *dev, const 
struct pci_device_id *id
        };
        /* for now use only the first port */
        const struct ata_port_info *ppi[] = { &info_early,
-                                              &ata_dummy_port_info };
+                                              NULL };
        u32 val;
        int rev;
 
-
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