dragon{,-nx32}: Block interrupts during DriveWire operations
authorTormod Volden <debian.tormod@gmail.com>
Sun, 19 Apr 2015 16:43:43 +0000 (18:43 +0200)
committerAlan Cox <alan@linux.intel.com>
Sun, 19 Apr 2015 17:45:53 +0000 (18:45 +0100)
Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
Kernel/platform-dragon-nx32/devdw.c
Kernel/platform-dragon/devdw.c

index ae3fc91..0034a7d 100644 (file)
@@ -25,6 +25,7 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
     uint8_t err;
     uint8_t *driveptr = dw_tab + minor;
     uint8_t cmd[5];
+    irqflags_t irq;
 
     if(rawflag)
         goto bad2;
@@ -44,7 +45,9 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
     while (ct < 2) {
         for (tries = 0; tries < 4 ; tries++) {
             // kprintf("dw_operation on block %d ct %d\n", block, ct);
+            irq = di(); /* for now block interrupts for whole operation */
             err = dw_operation(cmd, driveptr);
+            irqrestore(irq);
             if (err == 0)
                 break;
             if (tries > 1)
index ae3fc91..0034a7d 100644 (file)
@@ -25,6 +25,7 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
     uint8_t err;
     uint8_t *driveptr = dw_tab + minor;
     uint8_t cmd[5];
+    irqflags_t irq;
 
     if(rawflag)
         goto bad2;
@@ -44,7 +45,9 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
     while (ct < 2) {
         for (tries = 0; tries < 4 ; tries++) {
             // kprintf("dw_operation on block %d ct %d\n", block, ct);
+            irq = di(); /* for now block interrupts for whole operation */
             err = dw_operation(cmd, driveptr);
+            irqrestore(irq);
             if (err == 0)
                 break;
             if (tries > 1)