ChangeSet 1.1558.2.2, 2005/03/03 00:16:10-05:00, [EMAIL PROTECTED]

        [PATCH] sata_qstor: eh_timeout fix
        
        Here is an update to sata_qstor.c to enable full/proper
        register access during eh_timeout handling.
        
        Signed-off-by: Mark Lord <[EMAIL PROTECTED]>
        Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>



 sata_qstor.c |   30 ++++++++++++++++++++++++------
 1 files changed, 24 insertions(+), 6 deletions(-)


diff -Nru a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c
--- a/drivers/scsi/sata_qstor.c 2005-03-10 08:03:58 -08:00
+++ b/drivers/scsi/sata_qstor.c 2005-03-10 08:03:58 -08:00
@@ -38,7 +38,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_qstor"
-#define DRV_VERSION    "0.03"
+#define DRV_VERSION    "0.04"
 
 enum {
        QS_PORTS                = 4,
@@ -120,6 +120,7 @@
 static void qs_bmdma_stop(struct ata_port *ap);
 static u8 qs_bmdma_status(struct ata_port *ap);
 static void qs_irq_clear(struct ata_port *ap);
+static void qs_eng_timeout(struct ata_port *ap);
 
 static Scsi_Host_Template qs_ata_sht = {
        .module                 = THIS_MODULE,
@@ -153,7 +154,7 @@
        .phy_reset              = qs_phy_reset,
        .qc_prep                = qs_qc_prep,
        .qc_issue               = qs_qc_issue,
-       .eng_timeout            = ata_eng_timeout,
+       .eng_timeout            = qs_eng_timeout,
        .irq_handler            = qs_intr,
        .irq_clear              = qs_irq_clear,
        .scr_read               = qs_scr_read,
@@ -213,7 +214,7 @@
        /* nothing */
 }
 
-static void qs_enter_reg_mode(struct ata_port *ap)
+static inline void qs_enter_reg_mode(struct ata_port *ap)
 {
        u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
 
@@ -221,15 +222,32 @@
        readb(chan + QS_CCT_CTR0);        /* flush */
 }
 
-static void qs_phy_reset(struct ata_port *ap)
+static inline void qs_reset_channel_logic(struct ata_port *ap)
 {
        u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
-       struct qs_port_priv *pp = ap->private_data;
 
-       pp->state = qs_state_idle;
        writeb(QS_CTR1_RCHN, chan + QS_CCT_CTR1);
+       readb(chan + QS_CCT_CTR0);        /* flush */
        qs_enter_reg_mode(ap);
+}
+
+static void qs_phy_reset(struct ata_port *ap)
+{
+       struct qs_port_priv *pp = ap->private_data;
+
+       pp->state = qs_state_idle;
+       qs_reset_channel_logic(ap);
        sata_phy_reset(ap);
+}
+
+static void qs_eng_timeout(struct ata_port *ap)
+{
+       struct qs_port_priv *pp = ap->private_data;
+
+       if (pp->state != qs_state_idle) /* healthy paranoia */
+               pp->state = qs_state_mmio;
+       qs_reset_channel_logic(ap);
+       ata_eng_timeout(ap);
 }
 
 static u32 qs_scr_read (struct ata_port *ap, unsigned int sc_reg)
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-24" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to