ubee: keep the incomplete port in sync
authorAlan Cox <alan@linux.intel.com>
Wed, 8 Nov 2017 19:18:17 +0000 (19:18 +0000)
committerAlan Cox <alan@linux.intel.com>
Wed, 8 Nov 2017 19:18:17 +0000 (19:18 +0000)
Kernel/platform-ubee/devfd.c
Kernel/platform-ubee/devhd.c
Kernel/platform-ubee/devtty.c
Kernel/platform-ubee/main.c

index 3eba9ae..2e0a792 100644 (file)
@@ -45,10 +45,11 @@ static int fd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
     int tries;
     uint8_t err = 0;
     uint8_t *driveptr = fd_tab + minor;
-    uint8_t cmd[6];
+    uint8_t cmd[7];
 
     if(rawflag)
-        goto bad2;
+        if (d_blkoff(9))
+            return -1;
 
     if (fd_selected != minor) {
         uint8_t err;
@@ -61,30 +62,36 @@ static int fd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
     if (*driveptr == 0xFF)
         fd_reset(driveptr);
 
-    dptr = (uint16_t)udata.u_buf->bf_data;
-    block = udata.u_buf->bf_blk;
-
-    cmd[0] = is_read ? FD_READ : FD_WRITE;
-    /* Double sided assumed FIXME */
-    cmd[1] = block / 20;
-    /* floppy.s will sort the side out */
-    cmd[2] = ((block % 20) << 1) + 1;
-    cmd[3] = is_read ? OPDIR_READ: OPDIR_WRITE;
-    cmd[4] = dptr & 0xFF;
-    cmd[5] = dptr >> 8;
-
-    for (tries = 0; tries < 4 ; tries++) {
-        err = fd_operation(cmd, driveptr);
-        if (err == 0)
-            break;
-        if (tries > 1)
-            fd_reset(driveptr);
-   }
-   if (tries != 4)
-       return 1;
+    dptr = (uint16_t)udata.u_dptr;
+    block = udata.u_block;
+
+    while(ct < udata.u_nblock) {
+        cmd[0] = is_read ? FD_READ : FD_WRITE;
+        /* Double sided assumed FIXME */
+        cmd[1] = block / 20;
+        /* floppy.s will sort the side out */
+        cmd[2] = ((block % 20) << 1) + 1;
+        cmd[3] = is_read ? OPDIR_READ: OPDIR_WRITE;
+        cmd[4] = dptr & 0xFF;
+        cmd[5] = dptr >> 8;
+        cmd[6] = rawflag;
+
+        for (tries = 0; tries < 4 ; tries++) {
+            err = fd_operation(cmd, driveptr);
+            if (err == 0)
+                break;
+            if (tries > 1)
+                fd_reset(driveptr);
+        }
+        if (tries == 4)
+            goto bad;
+        udata.u_block++;
+        udata.u_dptr += 512;
+        ct++;
+    }
+    return ct << BLKSHIFT;
 bad:
     kprintf("fd%d: error %x\n", minor, err);
-bad2:
     udata.u_error = EIO;
     return -1;
 }
index e2e170d..9b479db 100644 (file)
@@ -97,7 +97,6 @@ static uint8_t hd_xfer(bool is_read, uint16_t addr)
 
 static int hd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
 {
-       blkno_t block;
        uint16_t dptr;
        uint16_t ct = 0;
        int tries;
@@ -105,20 +104,19 @@ static int hd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
        uint8_t cmd = HDCMD_READ;
        uint8_t head;
        uint8_t sector;
-       uint16_t nblock;
-
-       if (rawflag == 0) {
-               dptr = (uint16_t)udata.u_buf->bf_data;
-               block = udata.u_buf->bf_blk;
-               nblock = 1;
-               hd_page = 0;            /* Kernel */
-       } else if (rawflag == 2) {
-               nblock = swapcnt >> 9;  /* in 512 byte chunks */
-               dptr = (uint16_t)swapbase;
-               hd_page = swappage;
-               block = swapblk;
-       } else
-               goto bad2;
+
+       if (rawflag) {
+               if (rawflag == 1) {
+                       if (d_blkoff(9))
+                               return -1;
+                       /* TODO */
+                       hd_page = 0xFF;
+               } else {
+                       hd_page = swappage;
+               }
+       }
+
+       dptr = (uint16_t)udata.u_dptr;
 
        if (!is_read)
                cmd = HDCMD_WRITE;
@@ -126,9 +124,9 @@ static int hd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
        /* We don't touch precomp and hope the firmware set it right */
        hd_seccnt = 1;
 
-       while (ct < nblock) {
-               uint16_t b = block / spt[minor];
-               sector = block % spt[minor];
+       while (ct < udata.u_nblock) {
+               uint16_t b = udata.u_block / spt[minor];
+               sector = udata.u_block % spt[minor];
                head = b % heads[minor];
                if (minor < MAX_HD) {
                        /* ECC, 512 bytes, head and drive */
@@ -170,9 +168,9 @@ static int hd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
                        goto bad;
                ct++;
                dptr += 512;
-               block ++;
+               udata.u_block ++;
        }
-       return 1;
+       return ct << BLKSHIFT;
 bad:
        if (err & 1)
                kprintf("hd%d: error %x\n", minor, hd_err);
index b8b30cf..fed72db 100644 (file)
@@ -31,7 +31,7 @@ void kputchar(char c)
        tty_putc(1, c);
 }
 
-int8_t tty_writeready(uint8_t minor)
+uint8_t tty_writeready(uint8_t minor)
 {
        minor;
        return TTY_READY_NOW;
index 8248ba3..7c4cd71 100644 (file)
@@ -66,3 +66,8 @@ uint8_t rtc_secs(void)
        rtc_c = 0x00;
        return rtc_d;
 }
+
+uint8_t platform_param(char *p)
+{
+       return 0;
+}