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