Thread (14 messages) 14 messages, 4 authors, 2012-01-06

Re: [PATCH] pata_bf54x: fix BMIDE status register emulation

From: Sergei Shtylyov <hidden>
Date: 2012-01-04 13:23:03

Hello.

On 04-01-2012 10:04, Zhang, Sonic wrote:
Hi Serge,
The MULTI_DONE_INT, UDMAIN_DONE_INT and UDMAOUT_DONE_INT are triggered independent
of the ATAPI_DEV_INT, although they bind to the same IRQ on bf548. With your patch,
 > these interrupts are ignored and results in kernel error "unhandled IRQ".

    Ah, indeed...
If you insist the BMDMA emulation on bf548 should comply with INF-8038i.
    It's not that I insist. It clearly follows from libata implemeting 
bmdma_status() method.
I would propose the following patch to disable all BF548 ATAPI specific interrupts.
    Yes, I agree -- they don't seem needed. And that will simplify the driver 
too. I'll recast the patch and add your signoff if you agree.
Sonic
quoted hunk ↗ jump to hunk
---
  drivers/ata/pata_bf54x.c |   19 ++-----------------
  1 files changed, 2 insertions(+), 17 deletions(-)
diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c
index bd987bb..9711c2a 100644
--- a/drivers/ata/pata_bf54x.c
+++ b/drivers/ata/pata_bf54x.c
@@ -418,14 +418,6 @@ static void bfin_set_dmamode(struct ata_port *ap, struct ata_device *adev)
                                         (tcyc_tdvs<<8 | tdvs));
                                 ATAPI_SET_ULTRA_TIM_2(base, (tmli<<8 | tss));
                                 ATAPI_SET_ULTRA_TIM_3(base, (trp<<8 | tzah));
-
-                               /* Enable host ATAPI Untra DMA interrupts */
-                               ATAPI_SET_INT_MASK(base,
-                                       ATAPI_GET_INT_MASK(base)
-                                       | UDMAIN_DONE_MASK
-                                       | UDMAOUT_DONE_MASK
-                                       | UDMAIN_TERM_MASK
-                                       | UDMAOUT_TERM_MASK);
                         }
                 }
         }
@@ -470,10 +462,6 @@ static void bfin_set_dmamode(struct ata_port *ap, struct ata_device *adev)
                         ATAPI_SET_MULTI_TIM_0(base, (tm<<8 | td));
                         ATAPI_SET_MULTI_TIM_1(base, (tkr<<8 | tkw));
                         ATAPI_SET_MULTI_TIM_2(base, (teoc<<8 | th));
-
-                       /* Enable host ATAPI Multi DMA interrupts */
-                       ATAPI_SET_INT_MASK(base, ATAPI_GET_INT_MASK(base)
-                               | MULTI_DONE_MASK | MULTI_TERM_MASK);
                         SSYNC();
                 }
         }
@@ -1155,13 +1143,10 @@ static unsigned char bfin_bmdma_status(struct ata_port *ap)
         void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr;
         unsigned short int_status = ATAPI_GET_INT_STATUS(base);

-       if (ATAPI_GET_STATUS(base)&  (MULTI_XFER_ON|ULTRA_XFER_ON))
+       if (ATAPI_GET_STATUS(base)&  (MULTI_XFER_ON | ULTRA_XFER_ON))
                 host_stat |= ATA_DMA_ACTIVE;
-       if (int_status&  (MULTI_DONE_INT|UDMAIN_DONE_INT|UDMAOUT_DONE_INT|
-               ATAPI_DEV_INT))
+       if (ATAPI_GET_INT_STATUS(base)&  ATAPI_DEV_INT)
                 host_stat |= ATA_DMA_INTR;
-       if (int_status&  (MULTI_TERM_INT|UDMAIN_TERM_INT|UDMAOUT_TERM_INT))
-               host_stat |= ATA_DMA_ERR|ATA_DMA_INTR;

         dev_dbg(ap->dev, "ATAPI: host_stat=0x%x\n", host_stat);

--
1.7.0.4
WBR, Sergei
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help