From: Alan Cox Date: Wed, 8 Nov 2017 19:18:17 +0000 (+0000) Subject: ubee: keep the incomplete port in sync X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=a47a21c25ea89b25359fbbd06f4eafcf2abc200a;p=FUZIX.git ubee: keep the incomplete port in sync --- diff --git a/Kernel/platform-ubee/devfd.c b/Kernel/platform-ubee/devfd.c index 3eba9ae8..2e0a7925 100644 --- a/Kernel/platform-ubee/devfd.c +++ b/Kernel/platform-ubee/devfd.c @@ -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; } diff --git a/Kernel/platform-ubee/devhd.c b/Kernel/platform-ubee/devhd.c index e2e170d2..9b479db3 100644 --- a/Kernel/platform-ubee/devhd.c +++ b/Kernel/platform-ubee/devhd.c @@ -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); diff --git a/Kernel/platform-ubee/devtty.c b/Kernel/platform-ubee/devtty.c index b8b30cfa..fed72db7 100644 --- a/Kernel/platform-ubee/devtty.c +++ b/Kernel/platform-ubee/devtty.c @@ -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; diff --git a/Kernel/platform-ubee/main.c b/Kernel/platform-ubee/main.c index 8248ba3d..7c4cd71b 100644 --- a/Kernel/platform-ubee/main.c +++ b/Kernel/platform-ubee/main.c @@ -66,3 +66,8 @@ uint8_t rtc_secs(void) rtc_c = 0x00; return rtc_d; } + +uint8_t platform_param(char *p) +{ + return 0; +}