devdw: Allow all 256 drives, get rid of dw_tab
authorTormod Volden <debian.tormod@gmail.com>
Sun, 15 May 2016 14:17:17 +0000 (16:17 +0200)
committerAlan Cox <alan@etchedpixels.co.uk>
Mon, 16 May 2016 10:05:44 +0000 (11:05 +0100)
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 <debian.tormod@gmail.com>
Kernel/dev/devdw.c
Kernel/dev/devdw.h
Kernel/platform-coco2/drivewire.s
Kernel/platform-coco3/drivewire.s
Kernel/platform-dragon-nx32/drivewire.s
Kernel/platform-dragon/drivewire.s
Kernel/platform-trs80/drivewire.s

index 3cad53a..c83e37a 100644 (file)
@@ -3,13 +3,9 @@
 #include <printf.h>
 #include <devdw.h>
 
-#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;
 }
 
index d723c72..8605869 100644 (file)
@@ -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 );
 
index 35e9af9..7e58f9b 100644 (file)
@@ -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
index 3d15184..1c82b16 100644 (file)
@@ -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
index 35e9af9..7e58f9b 100644 (file)
@@ -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
index f27e1f5..f1fad2c 100644 (file)
@@ -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
index c84b327..b0ab7cb 100644 (file)
 _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: