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(®s);
- 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(®s);
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(®s);
- 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]