[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 3/4] ata: Fuer PIO jeweils ein cdi_reset_wait_irq ergaenzt



! ata: Es reicht einfach nicht, nur vor dem ersten cdi_wait_irq den
       Zaehler zurueckzusetzen, das muessen wir fuer jeden
       gelesenen/geschriebenen Sektor tun.

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/modules/cdi/ata/request.c |   20 ++++++++++++++++++++
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/src/modules/cdi/ata/request.c b/src/modules/cdi/ata/request.c
index 1d5f4fb..90e0d67 100644
--- a/src/modules/cdi/ata/request.c
+++ b/src/modules/cdi/ata/request.c
@@ -259,6 +259,16 @@ int ata_protocol_pio_in(struct ata_request* request)
                 uint16_t* buffer = (uint16_t*) (request->buffer + (request->
                     blocks_done * request->block_size));
 
+                // Wenn wir nicht pollen, muessen wir den Zahler zuruecksetzen,
+                // da wir sonst moeglicherweise einen IRQ verpassen wenn wir das
+                // erst nach dem insw machen. Das sollte auch nicht gleich nach
+                // dem Warten gemacht werden, da es moeglich ist, dass der IRQ
+                // nochmal feuert, wenn das Statusregister noch nicht gelesen
+                // wurde.
+                if (!request->flags.poll) {
+                    cdi_reset_wait_irq(ctrl->irq);
+                }
+
                 ata_insw(ata_reg_base(ctrl, REG_DATA) + REG_DATA, buffer,
                     request->block_size / 2);
 
@@ -371,6 +381,16 @@ int ata_protocol_pio_out(struct ata_request* request)
                 uint16_t* buffer = (uint16_t*) (request->buffer + (request->
                     blocks_done * request->block_size));
 
+                // Wenn wir nicht pollen, muessen wir den Zaehler zuruecksetzen,
+                // da wir sonst moeglicherweise einen IRQ verpassen wenn wir das
+                // erst nach dem outsw machen. Das sollte auch nicht gleich nach
+                // dem Warten gemacht werden, da es moeglich ist, dass der IRQ
+                // nochmal feuert, wenn das Statusregister noch nicht gelesen
+                // wurde.
+                if (!request->flags.poll) {
+                    cdi_reset_wait_irq(ctrl->irq);
+                }
+
                 // Einen Block schreiben
                 ata_outsw(ata_reg_base(ctrl, REG_DATA) + REG_DATA, buffer,
                     request->block_size / 2);
-- 
1.6.0.6