aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mcd
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>1995-01-30 06:44:40 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>1995-01-30 06:44:40 +0000
commit85cd355ef167e008b02db60f62fa013e885f03cb (patch)
treeeb1e64242206d8f097734c1e45809eb3d907dc5a /sys/dev/mcd
parentc9c9e30a03e63374b5686be1759dbcc7e6ae19e0 (diff)
downloadsrc-85cd355ef167e008b02db60f62fa013e885f03cb.tar.gz
src-85cd355ef167e008b02db60f62fa013e885f03cb.zip
Use double speed read for FX001D, now this drive
becomes two times faster than in old variant. Get rid of false "media changed" errors during large disk transfers
Notes
Notes: svn path=/head/; revision=6028
Diffstat (limited to 'sys/dev/mcd')
-rw-r--r--sys/dev/mcd/mcd.c24
-rw-r--r--sys/dev/mcd/mcdreg.h6
2 files changed, 21 insertions, 9 deletions
diff --git a/sys/dev/mcd/mcd.c b/sys/dev/mcd/mcd.c
index de5b9c623438..e5423b23f03b 100644
--- a/sys/dev/mcd/mcd.c
+++ b/sys/dev/mcd/mcd.c
@@ -40,7 +40,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: mcd.c,v 1.34 1994/12/21 15:17:59 ache Exp $
+ * $Id: mcd.c,v 1.35 1994/12/24 13:24:00 ache Exp $
*/
static char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";
@@ -126,6 +126,7 @@ struct mcd_data {
char *name;
short config;
short flags;
+ u_char read_command;
short status;
int blksize;
u_long disksize;
@@ -680,6 +681,7 @@ mcd_probe(struct isa_device *dev)
outb(port+MCD_CTRL, M_PICKLE);
mcd_data[unit].flags |= MCDNEWMODEL;
}
+ mcd_data[unit].read_command = MCD_CMDSINGLESPEEDREAD;
switch (stbytes[1]) {
case 'M':
if (mcd_data[unit].flags & MCDNEWMODEL) {
@@ -697,6 +699,7 @@ mcd_probe(struct isa_device *dev)
case 'D':
mcd_data[unit].type = MCD_TYPE_FX001D;
mcd_data[unit].name = "Mitsumi FX001D";
+ mcd_data[unit].read_command = MCD_CMDDOUBLESPEEDREAD;
break;
default:
mcd_data[unit].type = MCD_TYPE_UNKNOWN;
@@ -752,7 +755,7 @@ mcd_getstat(int unit,int sflg)
if (sflg)
outb(port+mcd_command, MCD_CMDGETSTAT);
i = mcd_getreply(unit,DELAY_GETREPLY);
- if (i<0) return -1;
+ if (i<0 || (i & MCD_ST_CMDCHECK)) return -1;
cd->status = i;
@@ -917,6 +920,7 @@ loop:
case MCD_S_BEGIN1:
/* get status */
+retry_status:
outb(com_port, MCD_CMDGETSTAT);
mbx->count = RDELAY_WAITSTAT;
timeout((timeout_func_t)mcd_doread,
@@ -931,6 +935,8 @@ loop:
return;
}
cd->status = inb(port+mcd_status) & 0xFF;
+ if (cd->status & MCD_ST_CMDCHECK)
+ goto retry_status;
if (mcd_setflags(unit,cd) < 0)
goto changed;
MCD_TRACE("got WAITSTAT delay=%d\n",
@@ -940,7 +946,7 @@ loop:
printf("mcd%d: audio is active\n",unit);
goto readerr;
}
-
+retry_mode:
/* to check for raw/cooked mode */
if (cd->flags & MCDREADRAW) {
rm = MCD_MD_RAW;
@@ -979,6 +985,10 @@ loop:
return;
}
cd->status = inb(port+mcd_status) & 0xFF;
+ if (cd->status & MCD_ST_CMDCHECK) {
+ cd->curr_mode = MCD_MD_UNKNOWN;
+ goto retry_mode;
+ }
if (mcd_setflags(unit,cd) < 0)
goto changed;
cd->curr_mode = mbx->mode;
@@ -998,10 +1008,10 @@ nextblock:
/* build parameter block */
hsg2msf(blknum,rbuf.start_msf);
-
+retry_read:
/* send the read command */
disable_intr();
- mcd_put(com_port,MCD_CMDREAD2);
+ mcd_put(com_port,cd->read_command);
mcd_put(com_port,rbuf.start_msf[0]);
mcd_put(com_port,rbuf.start_msf[1]);
mcd_put(com_port,rbuf.start_msf[2]);
@@ -1062,6 +1072,8 @@ nextblock:
}
if (!(k & MFL_STATUS_NOT_AVAIL)) {
cd->status = inb(port+mcd_status) & 0xFF;
+ if (cd->status & MCD_ST_CMDCHECK)
+ goto retry_read;
if (mcd_setflags(unit,cd) < 0)
goto changed;
}
@@ -1448,7 +1460,7 @@ mcd_play(int unit, struct mcd_read2 *pb)
for(retry=0; retry<MCD_RETRYS; retry++) {
disable_intr();
- outb(com_port, MCD_CMDREAD2);
+ outb(com_port, MCD_CMDSINGLESPEEDREAD);
outb(com_port, pb->start_msf[0]);
outb(com_port, pb->start_msf[1]);
outb(com_port, pb->start_msf[2]);
diff --git a/sys/dev/mcd/mcdreg.h b/sys/dev/mcd/mcdreg.h
index 88ae7e321504..f8d8598f2bab 100644
--- a/sys/dev/mcd/mcdreg.h
+++ b/sys/dev/mcd/mcdreg.h
@@ -41,7 +41,7 @@
* the manufacturer or anyone else might provide better documentation,
* so this file (and the driver) will then have a better quality.
*
- * $Id: mcdreg.h,v 1.5 1994/11/12 13:26:13 ache Exp $
+ * $Id: mcdreg.h,v 1.6 1994/12/24 13:24:02 ache Exp $
*/
#ifndef MCD_H
@@ -135,9 +135,9 @@ typedef unsigned char bcd_t;
#define MCD_READUPC 0xA2 /* Get UPC info */
#define MCD_CMDSETVOLUME 0xAE /* sets mcd_volume */
#define MCD_CMDREAD1 0xB0 /* read n sectors */
-#define MCD_CMDREAD2 0xC0 /* read from-to */
+#define MCD_CMDSINGLESPEEDREAD 0xC0 /* read from-to */
#define MCD_CMDSTARTAUDIOMSF 0xC1 /* read audio data */
-#define MCD_CMDREADFAST 0xC1 /* Read lots of data from the drive */
+#define MCD_CMDDOUBLESPEEDREAD 0xC1 /* Read lots of data from the drive */
#define MCD_CMDGETDRIVEMODE 0xC2 /* Get the drive mode */
#define MCD_CMDREAD 0xC3 /* Read data from the drive */
#define MCD_CMDSETINTERLEAVE 0xC8 /* Adjust the interleave */