From 880567e7716009b12f30750ff703cdb7994b1730 Mon Sep 17 00:00:00 2001 From: cgd Date: Mon, 10 Jul 1995 01:27:24 +0000 Subject: [PATCH] fix from Onno van der Linden for large-file read timeouts on double-speed drives. A different read command must be used on double-speed drives. It boggles my mind that people could design hardware this stupid. --- sys/dev/isa/mcd.c | 13 ++++++++----- sys/dev/isa/mcdreg.h | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/sys/dev/isa/mcd.c b/sys/dev/isa/mcd.c index 9b295afd2ecf..44f914a0cb7d 100644 --- a/sys/dev/isa/mcd.c +++ b/sys/dev/isa/mcd.c @@ -1,4 +1,4 @@ -/* $NetBSD: mcd.c,v 1.40 1995/07/05 02:32:53 mycroft Exp $ */ +/* $NetBSD: mcd.c,v 1.41 1995/07/10 01:27:24 cgd Exp $ */ /* * Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved. @@ -114,6 +114,7 @@ struct mcd_softc { int irq, drq; char *type; + u_char readcmd; int flags; #define MCDF_LOCKED 0x01 #define MCDF_WANTED 0x02 @@ -761,6 +762,7 @@ mcdprobe(parent, match, aux) * * Note: Which models support interrupts? >=LU005S? */ + sc->readcmd = MCD_CMDREADSINGLESPEED; switch (mbx.res.data.continfo.code) { case 'M': if (mbx.res.data.continfo.version <= 2) @@ -775,6 +777,7 @@ mcdprobe(parent, match, aux) break; case 'D': sc->type = "FX001D"; + sc->readcmd = MCD_CMDREADDOUBLESPEED; break; default: printf("%s: unrecognized drive version %c%02x; will try to use it anyway\n", @@ -1053,7 +1056,7 @@ mcdintr(arg) hsg2msf(mbx->blkno, msf); /* Send the read command. */ - outb(iobase + MCD_COMMAND, MCD_CMDREAD2); + outb(iobase + MCD_COMMAND, sc->readcmd); outb(iobase + MCD_COMMAND, msf[0]); outb(iobase + MCD_COMMAND, msf[1]); outb(iobase + MCD_COMMAND, msf[2]); @@ -1526,7 +1529,7 @@ mcd_playtracks(sc, p) if ((error = mcd_setmode(sc, MCD_MD_COOKED)) != 0) return error; - mbx.cmd.opcode = MCD_CMDREAD2; + mbx.cmd.opcode = MCD_CMDREADSINGLESPEED; mbx.cmd.length = sizeof(mbx.cmd.data.play); mbx.cmd.data.play.start_msf[0] = sc->toc[a].toc.absolute_pos[0]; mbx.cmd.data.play.start_msf[1] = sc->toc[a].toc.absolute_pos[1]; @@ -1560,7 +1563,7 @@ mcd_playmsf(sc, p) if ((error = mcd_setmode(sc, MCD_MD_COOKED)) != 0) return error; - mbx.cmd.opcode = MCD_CMDREAD2; + mbx.cmd.opcode = MCD_CMDREADSINGLESPEED; mbx.cmd.length = sizeof(mbx.cmd.data.play); mbx.cmd.data.play.start_msf[0] = bin2bcd(p->start_m); mbx.cmd.data.play.start_msf[1] = bin2bcd(p->start_s); @@ -1592,7 +1595,7 @@ mcd_playblocks(sc, p) if ((error = mcd_setmode(sc, MCD_MD_COOKED)) != 0) return error; - mbx.cmd.opcode = MCD_CMDREAD2; + mbx.cmd.opcode = MCD_CMDREADSINGLESPEED; mbx.cmd.length = sizeof(mbx.cmd.data.play); hsg2msf(p->blk, mbx.cmd.data.play.start_msf); hsg2msf(p->blk + p->len, mbx.cmd.data.play.end_msf); diff --git a/sys/dev/isa/mcdreg.h b/sys/dev/isa/mcdreg.h index b3c34a10a31e..11bdf8470d4a 100644 --- a/sys/dev/isa/mcdreg.h +++ b/sys/dev/isa/mcdreg.h @@ -1,4 +1,4 @@ -/* $NetBSD: mcdreg.h,v 1.6 1995/03/27 15:45:26 mycroft Exp $ */ +/* $NetBSD: mcdreg.h,v 1.7 1995/07/10 01:27:27 cgd Exp $ */ /* * Copyright 1993 by Holger Veit (data part) @@ -129,7 +129,8 @@ typedef unsigned char bcd_t; #define MCD_CMDSETDRIVEMODE 0xa0 /* set drive mode */ #define MCD_CMDSETVOLUME 0xae /* sets mcd_volume */ #define MCD_CMDREAD1 0xb0 /* read n sectors */ -#define MCD_CMDREAD2 0xc0 /* read from-to */ +#define MCD_CMDREADSINGLESPEED 0xc0 /* read (single speed) */ +#define MCD_CMDREADDOUBLESPEED 0xc1 /* read (double speed) */ #define MCD_CMDGETDRIVEMODE 0xc2 /* get drive mode */ #define MCD_CMDREAD3 0xc3 /* ? */ #define MCD_CMDSETINTERLEAVE 0xc8 /* set interleave for read */