Hi,

It seems to me that the code we use for floppy pseudo-DMA at the moment is 
unnecessarily complicated.  Although I don't claim to be an expert in these 
matters it appears that something like the attached patch might be better.  
I've tested this briefly on my A5000 and it doesn't seem to have any 
detrimental effects.

What do you think?

p.

--- clean/linux/arch/arm/lib/floppydma.S        Mon Feb  8 19:09:15 1999
+++ linux/arch/arm/lib/floppydma.S      Mon Feb  8 19:10:42 1999
@@ -2,6 +2,7 @@
  * linux/arch/arm/lib/floppydma.S
  *
  * Copyright (C) 1995, 1996 Russell King
+ * Copyright (C) 1999 Philip Blundell
  */
 #include <linux/linkage.h>
 #include <asm/assembler.h>
@@ -9,20 +10,14 @@
 
                .global SYMBOL_NAME(floppy_fiqin_end)
 ENTRY(floppy_fiqin_start)
-               subs    r9, r9, #1
-               ldrgtb  r12, [r11, #-4]
-               ldrleb  r12, [r11], #0
+               ldrb    r12, [r11], #4
                strb    r12, [r10], #1
                subs    pc, lr, #4
 SYMBOL_NAME(floppy_fiqin_end):
 
                .global SYMBOL_NAME(floppy_fiqout_end)
 ENTRY(floppy_fiqout_start)
-               subs    r9, r9, #1
-               ldrgeb  r12, [r10], #1
-               movlt   r12, #0
-               strleb  r12, [r11], #0
-               subles  pc, lr, #4
-               strb    r12, [r11, #-4]
+               ldrb    r12, [r10], #1
+               strb    r12, [r11], #4
                subs    pc, lr, #4
 SYMBOL_NAME(floppy_fiqout_end):
--- clean/linux/arch/arm/kernel/dma-a5k.c       Mon Feb  8 19:09:14 1999
+++ linux/arch/arm/kernel/dma-a5k.c     Mon Feb  8 19:14:30 1999
@@ -39,7 +40,7 @@
        else {
                struct pt_regs regs;
                get_fiq_regs(&regs);
-               return regs.ARM_r9;
+               return ((int)PCIO_FLOPPYDMABASE + 4 - regs.ARM_fp) / 4;
        }
        return 0;
 }
@@ -69,9 +70,9 @@
                        return;
                }
                memcpy((void *)0x1c, fiqhandler_start, fiqhandler_length);
-               regs.ARM_r9 = dma->buf.length;
                regs.ARM_r10 = __bus_to_virt(dma->buf.address);
-               regs.ARM_fp = (int)PCIO_FLOPPYDMABASE;
+               regs.ARM_fp = (int)PCIO_FLOPPYDMABASE + 4 
+                       - (dma->buf.length * 4);
                set_fiq_regs(&regs);
                enable_irq(dma->dma_irq);
        }
--- clean/linux/arch/arm/kernel/dma-rpc.c       Mon Feb  8 19:09:14 1999
+++ linux/arch/arm/kernel/dma-rpc.c     Mon Feb  8 19:18:08 1999
@@ -226,7 +226,7 @@
        case DMA_VIRTUAL_FLOPPY: {
                struct pt_regs regs;
                get_fiq_regs(&regs);
-               return regs.ARM_r9;
+               return ((int)PCIO_FLOPPYDMABASE + 4 - regs.ARM_fp) / 4;
                }
                break;
        }
@@ -276,9 +276,9 @@
                        fiqhandler_length = &floppy_fiqout_end - &floppy_fiqout_start;
                }
 
-               regs.ARM_r9  = dma->buf.length;
                regs.ARM_r10 = __bus_to_virt(dma->buf.address);
-               regs.ARM_fp  = (int)PCIO_FLOPPYDMABASE;
+               regs.ARM_fp = (int)PCIO_FLOPPYDMABASE + 4 
+                       - (dma->buf.length * 4);
 
                if (claim_fiq(&fh)) {
                        printk("floppydma: couldn't claim FIQ.\n");


unsubscribe: body of `unsubscribe linux-arm' to [EMAIL PROTECTED]

Reply via email to