[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