Commit:     17234246eb82898cf98e3c29e81d941c738e0587
Parent:     b229a7b0aed808f2ef6a5e9dbf78b0f17cefb4d0
Author:     Tejun Heo <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 25 20:46:59 2007 +0900
Committer:  Jeff Garzik <[EMAIL PROTECTED]>
CommitDate: Thu Jan 25 17:22:47 2007 -0500

    sata_via: don't diddle with ATA_NIEN in ->freeze
    vt6420 completely loses its ability to raise IRQ for ATAPI devices if
    ATA_NIEN is diddled with in ->freeze.  Further investigation is
    necessary to determine whether this problem is shared on other
    controllers but it doesn't seem to be at this point.
    Make vt6420's ->freeze only clear IRQ to fix this problem.  This makes
    vt6420 relatively more prone to IRQ storms but the controller is way
    too braindamaged to worry about that anyway.
    Signed-off-by: Tejun Heo <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
 drivers/ata/sata_via.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
index 88f0565..55b0123 100644
--- a/drivers/ata/sata_via.c
+++ b/drivers/ata/sata_via.c
@@ -74,6 +74,7 @@ enum {
 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id 
 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
+static void svia_noop_freeze(struct ata_port *ap);
 static void vt6420_error_handler(struct ata_port *ap);
 static const struct pci_device_id svia_pci_tbl[] = {
@@ -128,7 +129,7 @@ static const struct ata_port_operations vt6420_sata_ops = {
        .qc_issue               = ata_qc_issue_prot,
        .data_xfer              = ata_pio_data_xfer,
-       .freeze                 = ata_bmdma_freeze,
+       .freeze                 = svia_noop_freeze,
        .thaw                   = ata_bmdma_thaw,
        .error_handler          = vt6420_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
@@ -204,6 +205,15 @@ static void svia_scr_write (struct ata_port *ap, unsigned 
int sc_reg, u32 val)
        outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
+static void svia_noop_freeze(struct ata_port *ap)
+       /* Some VIA controllers choke if ATA_NIEN is manipulated in
+        * certain way.  Leave it alone and just clear pending IRQ.
+        */
+       ata_chk_status(ap);
+       ap->ops->irq_clear(ap);
  *     vt6420_prereset - prereset for vt6420
  *     @ap: target ATA port
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

Reply via email to