From 6038659e534446b44b9042aaccbb8edd2444b500 Mon Sep 17 00:00:00 2001 From: Tormod Volden Date: Sun, 15 May 2016 16:17:17 +0200 Subject: [PATCH] devdw: Allow all 256 drives, get rid of dw_tab The space used for dw_tab was the only reason for the 4 drive limit, and it was only used for passing the minor, which we can pass in the cmd packet instead. Also pass the full 16-bit page value, so that all platforms can implement raw mode and swapping. Signed-off-by: Tormod Volden --- Kernel/dev/devdw.c | 26 +++++++++---------------- Kernel/dev/devdw.h | 4 ++-- Kernel/platform-coco2/drivewire.s | 6 ++---- Kernel/platform-coco3/drivewire.s | 3 +-- Kernel/platform-dragon-nx32/drivewire.s | 6 ++---- Kernel/platform-dragon/drivewire.s | 3 +-- Kernel/platform-trs80/drivewire.s | 8 +++----- 7 files changed, 20 insertions(+), 36 deletions(-) diff --git a/Kernel/dev/devdw.c b/Kernel/dev/devdw.c index 3cad53a3..c83e37a2 100644 --- a/Kernel/dev/devdw.c +++ b/Kernel/dev/devdw.c @@ -3,13 +3,9 @@ #include #include -#define MAX_DW 4 /* can be 255 */ - #define DW_READ 0 #define DW_WRITE 1 -static uint8_t dw_tab[MAX_DW]; - /* * Block device glue for DriveWire * @@ -23,9 +19,8 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag) int nblock; int tries; uint8_t err; - uint8_t *driveptr = dw_tab + minor; - uint8_t cmd[6]; - uint8_t page; + uint8_t cmd[8]; + uint16_t page; irqflags_t irq; if (rawflag == 0) { @@ -36,13 +31,13 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag) } else if (rawflag == 1) { if (((uint16_t)udata.u_offset|udata.u_count) & BLKMASK) goto bad2; - page = (uint8_t)udata.u_page; + page = udata.u_page; dptr = (uint16_t)udata.u_base; block = udata.u_offset >> 9; nblock = udata.u_count >> 8; } else if (rawflag == 2) { #ifdef SWAPDEV - page = (uint8_t)swappage; + page = (uint16_t)swappage; dptr = (uint16_t)swapbase; nblock = swapcnt >> 8; block = swapblk; @@ -59,19 +54,20 @@ static int dw_transfer(uint8_t minor, bool is_read, uint8_t rawflag) cmd[2] = (block << 1) & 0xFF; cmd[3] = dptr >> 8; cmd[4] = dptr & 0xFF; - cmd[5] = page; - *driveptr = minor; /* pass minor (drive number) through here for now */ + cmd[5] = minor; + cmd[6] = page >> 8; + cmd[7] = page & 0xFF; while (nblock--) { for (tries = 0; tries < 4 ; tries++) { // kprintf("dw_operation block %d left %d\n", block, nblock); irq = di(); /* for now block interrupts for whole operation */ - err = dw_operation(cmd, driveptr); + err = dw_operation(cmd); irqrestore(irq); if (err == 0) break; if (tries > 1) - dw_reset(driveptr); + dw_reset(); } /* FIXME: should we try the other half and then bail out ? */ if (tries == 3) @@ -95,10 +91,6 @@ bad2: int dw_open(uint8_t minor, uint16_t flag) { used(flag); - if(minor >= MAX_DW) { - udata.u_error = ENODEV; - return -1; - } return 0; } diff --git a/Kernel/dev/devdw.h b/Kernel/dev/devdw.h index d723c720..8605869e 100644 --- a/Kernel/dev/devdw.h +++ b/Kernel/dev/devdw.h @@ -7,8 +7,8 @@ int dw_write(uint8_t minor, uint8_t rawflag, uint8_t flag); int dw_open(uint8_t minor, uint16_t flag); /* low level interface */ -uint8_t dw_reset(uint8_t *drive); -uint8_t dw_operation(uint8_t *cmd, uint8_t *drive); +uint8_t dw_reset(void); +uint8_t dw_operation(uint8_t *cmd); uint16_t dw_transaction( unsigned char *send, uint16_t scnt, unsigned char *recv, uint16_t rcnt ); diff --git a/Kernel/platform-coco2/drivewire.s b/Kernel/platform-coco2/drivewire.s index 35e9af9d..7e58f9b7 100644 --- a/Kernel/platform-coco2/drivewire.s +++ b/Kernel/platform-coco2/drivewire.s @@ -29,11 +29,9 @@ _dw_reset: _dw_operation: pshs y ; get parameters from C, X points to cmd packet - ldy 4,s ; driveptr (dw_tab in .bss so kernel bank) - ldb ,y ; for now, contains minor = drive number directly - lda 5,x ; page map + lda 7,x ; page map LSB jsr map_process_a ; same as map_process on nx32 - tfr b,a + lda 5,x ; minor = drive number ldb ,x ; write flag ; buffer location into Y ldy 3,x diff --git a/Kernel/platform-coco3/drivewire.s b/Kernel/platform-coco3/drivewire.s index 3d151842..1c82b160 100644 --- a/Kernel/platform-coco3/drivewire.s +++ b/Kernel/platform-coco3/drivewire.s @@ -50,8 +50,7 @@ _dw_reset: _dw_operation: pshs y ; get parameters from C, X points to cmd packet - ldy 4,s ; driveptr - lda ,y ; for now, contains minor = drive number directly + lda 5,x ; minor = drive number ldb ,x ; write flag ; buffer location into Y ldy 3,x diff --git a/Kernel/platform-dragon-nx32/drivewire.s b/Kernel/platform-dragon-nx32/drivewire.s index 35e9af9d..7e58f9b7 100644 --- a/Kernel/platform-dragon-nx32/drivewire.s +++ b/Kernel/platform-dragon-nx32/drivewire.s @@ -29,11 +29,9 @@ _dw_reset: _dw_operation: pshs y ; get parameters from C, X points to cmd packet - ldy 4,s ; driveptr (dw_tab in .bss so kernel bank) - ldb ,y ; for now, contains minor = drive number directly - lda 5,x ; page map + lda 7,x ; page map LSB jsr map_process_a ; same as map_process on nx32 - tfr b,a + lda 5,x ; minor = drive number ldb ,x ; write flag ; buffer location into Y ldy 3,x diff --git a/Kernel/platform-dragon/drivewire.s b/Kernel/platform-dragon/drivewire.s index f27e1f58..f1fad2c9 100644 --- a/Kernel/platform-dragon/drivewire.s +++ b/Kernel/platform-dragon/drivewire.s @@ -20,8 +20,7 @@ _dw_reset: _dw_operation: pshs y ; get parameters from C, X points to cmd packet - ldy 4,s ; driveptr - lda ,y ; for now, contains minor = drive number directly + lda 5,x ; minor = drive number ldb ,x ; write flag ; buffer location into Y ldy 3,x diff --git a/Kernel/platform-trs80/drivewire.s b/Kernel/platform-trs80/drivewire.s index c84b3278..b0ab7cbd 100644 --- a/Kernel/platform-trs80/drivewire.s +++ b/Kernel/platform-trs80/drivewire.s @@ -14,16 +14,14 @@ _dw_reset: ret - ; dw_operation(cmdblock, driveptr) + ; dw_operation(cmdblock) _dw_operation: pop bc ; return pop iy ; cmdblock - pop de ; driveptr - push de push iy push bc - ld b, 5(iy) ; page map + ld b, 7(iy) ; page map LSB call map_process_a ld h, 3(iy) ; pointer ld l, 4(iy) @@ -31,7 +29,7 @@ _dw_operation: ld c, 2(iy) xor a cp (iy) - ld a, (de) + ld a, 5(iy) jr nz, is_write call dw_read_sector dw_op_ret: -- 2.34.1