1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-17 10:26:15 +00:00

From Gary Clark II:

1. Fixed probe to work with FX mitsumi's.

2. Added some defines in prep for adding interupts and dma
This commit is contained in:
Jordan K. Hubbard 1994-01-16 23:34:17 +00:00
parent 6216795300
commit 26e25527db
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=978
4 changed files with 94 additions and 146 deletions

View File

@ -1,6 +1,7 @@
/*
* Copyright 1993 by Holger Veit (data part)
* Copyright 1993 by Brian Moore (audio part)
* Changes Copyright 1993 by Gary Clark II
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -68,7 +69,7 @@ static char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";
#undef MCD_TO_WARNING_ON
#endif
#else
#define MCD_TRACE(fmt,a,b,c,xd) {if (mcd_data[unit].debug) {printf("mcd%d st=%02x: ",unit,mcd_data[unit].status); printf(fmt,a,b,c,xd);}}
#define MCD_TRACE(fmt,a,b,c,d) {if (mcd_data[unit].debug) {printf("mcd%d st=%02x: ",unit,mcd_data[unit].status); printf(fmt,a,b,c,d);}}
#endif
#define mcd_part(dev) ((minor(dev)) & 7)
@ -158,7 +159,7 @@ static void hsg2msf(int hsg, bcd_t *msf);
static int msf2hsg(bcd_t *msf);
static int mcd_volinfo(int unit);
static int mcd_waitrdy(int port,int dly);
static void mcd_doread(caddr_t, int);
static void mcd_doread(int state, struct mcd_mbx *mbxin);
#ifndef MCDMINI
static int mcd_setmode(int unit, int mode);
static int mcd_getqchan(int unit, struct mcd_qchninfo *q);
@ -397,7 +398,7 @@ static void mcd_start(int unit)
cd->mbx.p_offset = p->p_offset;
/* calling the read routine */
mcd_doread((caddr_t)MCD_S_BEGIN, (int)&(cd->mbx));
mcd_doread(MCD_S_BEGIN,&(cd->mbx));
/* triggers mcd_start, when successful finished */
return;
}
@ -540,14 +541,13 @@ static void mcd_configure(struct mcd_data *cd)
outb(cd->iobase+mcd_config,cd->config);
}
/* check if there is a cdrom */
/* Heavly hacked by gclarkii@sugar.neosoft.com */
/* check to see if a Mitsumi CD-ROM is attached to the ISA bus */
int mcd_probe(struct isa_device *dev)
{
int port = dev->id_iobase;
int unit = dev->id_unit;
int i;
int i,j;
int st;
int check;
int junk;
@ -562,72 +562,43 @@ int mcd_probe(struct isa_device *dev)
#endif
/* send a reset */
outb(port+MCD_FLAGS,0);
DELAY(100000);
/* get any pending status and throw away...*/
for (i=10; i != 0; i--) {
outb(port+MCD_FLAGS,M_RESET);
DELAY(30000);
for (j=3; j != 0; j--) {
/* get any pending garbage (old data) and throw away...*/
for (i=10; i != 0; i--) {
inb(port+MCD_DATA);
}
DELAY(1000);
outb(port+MCD_DATA,MCD_CMDGETSTAT); /* Send get status command */
/* Loop looking for avail of status */
/* XXX May have to increase for fast machinces */
for (i = 1000; i != 0; i--) {
if ((inb(port+MCD_FLAGS) & 0xF ) == STATUS_AVAIL) {
break;
}
DELAY(10);
}
/* get status */
if (i == 0) {
#ifdef DEBUG
printf ("Mitsumi drive NOT detected\n");
#endif
return 0;
}
/*
* The following code uses the 0xDC command, it returns a M from the
* second byte and a number in the third. Does anyone know what the
* number is for? Better yet, how about someone thats REAL good in
* i80x86 asm looking at the Dos driver... Most of this info came
* from a friend of mine spending a whole weekend.....
*/
}
DELAY (2000);
outb(port+MCD_DATA,MCD_CMDCONTINFO);
for (i = 0; i < 100000; i++) {
if ((inb(port+MCD_FLAGS) & 0xF) == STATUS_AVAIL)
break;
}
if (i > 100000) {
#ifdef DEBUG
printf ("Mitsumi drive error\n");
#endif
return 0;
}
DELAY (40000);
st = inb(port+MCD_DATA);
DELAY (500);
check = inb(port+MCD_DATA);
DELAY (500);
junk = inb(port+MCD_DATA); /* What is byte used for?!?!? */
if (check = 'M') {
for (i = 0; i < 300000; i++) {
if ((inb(port+MCD_FLAGS) & M_STATUS_AVAIL) == M_STATUS_AVAIL)
{
DELAY (4000);
st = inb(port+MCD_DATA);
DELAY (500);
check = inb(port+MCD_DATA);
DELAY (500);
junk = inb(port+MCD_DATA); /* What is byte used for?!?!? */
if (check = 'M') {
#ifdef DEBUG
printf("Mitsumi drive detected\n");
#endif
return 4;
} else {
} else {
printf("Mitsumi drive NOT detected\n");
printf("Mitsumi drive error\n");
return 0;
}
}
}
}
}
}
static int mcd_waitrdy(int port,int dly)
{
int i;
@ -811,13 +782,8 @@ mcdintr(unit)
*/
static struct mcd_mbx *mbxsave;
/*
* Good thing Alphas come with real CD players...
*/
static void mcd_doread(caddr_t xstate, int xmbxin)
static void mcd_doread(int state, struct mcd_mbx *mbxin)
{
int state = (int)xstate;
struct mcd_mbx *mbxin = (struct mcd_mbx *)xmbxin;
struct mcd_mbx *mbx = (state!=MCD_S_BEGIN) ? mbxsave : mbxin;
int unit = mbx->unit;
int port = mbx->port;
@ -841,7 +807,7 @@ static void mcd_doread(caddr_t xstate, int xmbxin)
timeout((timeout_func_t)mcd_doread,(caddr_t)MCD_S_WAITSTAT,hz/100); /* XXX */
return;
case MCD_S_WAITSTAT:
untimeout(mcd_doread, (caddr_t)MCD_S_WAITSTAT);
untimeout(mcd_doread,MCD_S_WAITSTAT);
if (mbx->count-- >= 0) {
if (inb(port+mcd_xfer) & MCD_ST_BUSY) {
timeout((timeout_func_t)mcd_doread,(caddr_t)MCD_S_WAITSTAT,hz/100); /* XXX */
@ -878,7 +844,7 @@ static void mcd_doread(caddr_t xstate, int xmbxin)
}
case MCD_S_WAITMODE:
untimeout(mcd_doread, (caddr_t)MCD_S_WAITMODE);
untimeout(mcd_doread,MCD_S_WAITMODE);
if (mbx->count-- < 0) {
#ifdef MCD_TO_WARNING_ON
printf("mcd%d: timeout set mode\n",unit);
@ -916,7 +882,7 @@ static void mcd_doread(caddr_t xstate, int xmbxin)
timeout((timeout_func_t)mcd_doread,(caddr_t)MCD_S_WAITREAD,hz/100); /* XXX */
return;
case MCD_S_WAITREAD:
untimeout(mcd_doread,(caddr_t)MCD_S_WAITREAD);
untimeout(mcd_doread,MCD_S_WAITREAD);
if (mbx->count-- > 0) {
k = inb(port+mcd_xfer);
if ((k & 2)==0) {

View File

@ -1,6 +1,7 @@
/*
* Copyright 1993 by Holger Veit (data part)
* Copyright 1993 by Brian Moore (audio part)
* Changes Copyright 1993 by Gary Clark II
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -40,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$
* $Id: mcdreg.h,v 1.1 1993/10/12 06:08:31 rgrimes Exp $
*/
#ifndef MCD_H
@ -67,8 +68,8 @@ typedef unsigned char bcd_t;
#define mcd_reset 1
#define mcd_xfer 1
#define mcd_ctl2 2 /* XXX Is this right? */
#define mcd_config 3
#define MCD_MASK_DMA 0x07 /* bits 2-0 = DMA channel */
#define MCD_MASK_IRQ 0x70 /* bits 6-4 = INT number */
/* 001 = int 2,9 */
@ -77,8 +78,15 @@ typedef unsigned char bcd_t;
/* 100 = int 10 */
/* 101 = int 11 */
/* flags */
#define STATUS_AVAIL 0xb
#define DATA_AVAIL 0xf
#define STATUS_AVAIL 0xB
#define DATA_AVAIL 0xF
/* New Flags */
#define M_STATUS_AVAIL 0xFB
#define M_DATA_AVAIL 0xFD
/* New Commands */
#define M_RESET 0x00
/* ports */
#define MCD_DATA 0

View File

@ -1,6 +1,7 @@
/*
* Copyright 1993 by Holger Veit (data part)
* Copyright 1993 by Brian Moore (audio part)
* Changes Copyright 1993 by Gary Clark II
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -68,7 +69,7 @@ static char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";
#undef MCD_TO_WARNING_ON
#endif
#else
#define MCD_TRACE(fmt,a,b,c,xd) {if (mcd_data[unit].debug) {printf("mcd%d st=%02x: ",unit,mcd_data[unit].status); printf(fmt,a,b,c,xd);}}
#define MCD_TRACE(fmt,a,b,c,d) {if (mcd_data[unit].debug) {printf("mcd%d st=%02x: ",unit,mcd_data[unit].status); printf(fmt,a,b,c,d);}}
#endif
#define mcd_part(dev) ((minor(dev)) & 7)
@ -158,7 +159,7 @@ static void hsg2msf(int hsg, bcd_t *msf);
static int msf2hsg(bcd_t *msf);
static int mcd_volinfo(int unit);
static int mcd_waitrdy(int port,int dly);
static void mcd_doread(caddr_t, int);
static void mcd_doread(int state, struct mcd_mbx *mbxin);
#ifndef MCDMINI
static int mcd_setmode(int unit, int mode);
static int mcd_getqchan(int unit, struct mcd_qchninfo *q);
@ -397,7 +398,7 @@ static void mcd_start(int unit)
cd->mbx.p_offset = p->p_offset;
/* calling the read routine */
mcd_doread((caddr_t)MCD_S_BEGIN, (int)&(cd->mbx));
mcd_doread(MCD_S_BEGIN,&(cd->mbx));
/* triggers mcd_start, when successful finished */
return;
}
@ -540,14 +541,13 @@ static void mcd_configure(struct mcd_data *cd)
outb(cd->iobase+mcd_config,cd->config);
}
/* check if there is a cdrom */
/* Heavly hacked by gclarkii@sugar.neosoft.com */
/* check to see if a Mitsumi CD-ROM is attached to the ISA bus */
int mcd_probe(struct isa_device *dev)
{
int port = dev->id_iobase;
int unit = dev->id_unit;
int i;
int i,j;
int st;
int check;
int junk;
@ -562,72 +562,43 @@ int mcd_probe(struct isa_device *dev)
#endif
/* send a reset */
outb(port+MCD_FLAGS,0);
DELAY(100000);
/* get any pending status and throw away...*/
for (i=10; i != 0; i--) {
outb(port+MCD_FLAGS,M_RESET);
DELAY(30000);
for (j=3; j != 0; j--) {
/* get any pending garbage (old data) and throw away...*/
for (i=10; i != 0; i--) {
inb(port+MCD_DATA);
}
DELAY(1000);
outb(port+MCD_DATA,MCD_CMDGETSTAT); /* Send get status command */
/* Loop looking for avail of status */
/* XXX May have to increase for fast machinces */
for (i = 1000; i != 0; i--) {
if ((inb(port+MCD_FLAGS) & 0xF ) == STATUS_AVAIL) {
break;
}
DELAY(10);
}
/* get status */
if (i == 0) {
#ifdef DEBUG
printf ("Mitsumi drive NOT detected\n");
#endif
return 0;
}
/*
* The following code uses the 0xDC command, it returns a M from the
* second byte and a number in the third. Does anyone know what the
* number is for? Better yet, how about someone thats REAL good in
* i80x86 asm looking at the Dos driver... Most of this info came
* from a friend of mine spending a whole weekend.....
*/
}
DELAY (2000);
outb(port+MCD_DATA,MCD_CMDCONTINFO);
for (i = 0; i < 100000; i++) {
if ((inb(port+MCD_FLAGS) & 0xF) == STATUS_AVAIL)
break;
}
if (i > 100000) {
#ifdef DEBUG
printf ("Mitsumi drive error\n");
#endif
return 0;
}
DELAY (40000);
st = inb(port+MCD_DATA);
DELAY (500);
check = inb(port+MCD_DATA);
DELAY (500);
junk = inb(port+MCD_DATA); /* What is byte used for?!?!? */
if (check = 'M') {
for (i = 0; i < 300000; i++) {
if ((inb(port+MCD_FLAGS) & M_STATUS_AVAIL) == M_STATUS_AVAIL)
{
DELAY (4000);
st = inb(port+MCD_DATA);
DELAY (500);
check = inb(port+MCD_DATA);
DELAY (500);
junk = inb(port+MCD_DATA); /* What is byte used for?!?!? */
if (check = 'M') {
#ifdef DEBUG
printf("Mitsumi drive detected\n");
#endif
return 4;
} else {
} else {
printf("Mitsumi drive NOT detected\n");
printf("Mitsumi drive error\n");
return 0;
}
}
}
}
}
}
static int mcd_waitrdy(int port,int dly)
{
int i;
@ -811,13 +782,8 @@ mcdintr(unit)
*/
static struct mcd_mbx *mbxsave;
/*
* Good thing Alphas come with real CD players...
*/
static void mcd_doread(caddr_t xstate, int xmbxin)
static void mcd_doread(int state, struct mcd_mbx *mbxin)
{
int state = (int)xstate;
struct mcd_mbx *mbxin = (struct mcd_mbx *)xmbxin;
struct mcd_mbx *mbx = (state!=MCD_S_BEGIN) ? mbxsave : mbxin;
int unit = mbx->unit;
int port = mbx->port;
@ -841,7 +807,7 @@ static void mcd_doread(caddr_t xstate, int xmbxin)
timeout((timeout_func_t)mcd_doread,(caddr_t)MCD_S_WAITSTAT,hz/100); /* XXX */
return;
case MCD_S_WAITSTAT:
untimeout(mcd_doread, (caddr_t)MCD_S_WAITSTAT);
untimeout(mcd_doread,MCD_S_WAITSTAT);
if (mbx->count-- >= 0) {
if (inb(port+mcd_xfer) & MCD_ST_BUSY) {
timeout((timeout_func_t)mcd_doread,(caddr_t)MCD_S_WAITSTAT,hz/100); /* XXX */
@ -878,7 +844,7 @@ static void mcd_doread(caddr_t xstate, int xmbxin)
}
case MCD_S_WAITMODE:
untimeout(mcd_doread, (caddr_t)MCD_S_WAITMODE);
untimeout(mcd_doread,MCD_S_WAITMODE);
if (mbx->count-- < 0) {
#ifdef MCD_TO_WARNING_ON
printf("mcd%d: timeout set mode\n",unit);
@ -916,7 +882,7 @@ static void mcd_doread(caddr_t xstate, int xmbxin)
timeout((timeout_func_t)mcd_doread,(caddr_t)MCD_S_WAITREAD,hz/100); /* XXX */
return;
case MCD_S_WAITREAD:
untimeout(mcd_doread,(caddr_t)MCD_S_WAITREAD);
untimeout(mcd_doread,MCD_S_WAITREAD);
if (mbx->count-- > 0) {
k = inb(port+mcd_xfer);
if ((k & 2)==0) {

View File

@ -1,6 +1,7 @@
/*
* Copyright 1993 by Holger Veit (data part)
* Copyright 1993 by Brian Moore (audio part)
* Changes Copyright 1993 by Gary Clark II
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -40,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$
* $Id: mcdreg.h,v 1.1 1993/10/12 06:08:31 rgrimes Exp $
*/
#ifndef MCD_H
@ -67,8 +68,8 @@ typedef unsigned char bcd_t;
#define mcd_reset 1
#define mcd_xfer 1
#define mcd_ctl2 2 /* XXX Is this right? */
#define mcd_config 3
#define MCD_MASK_DMA 0x07 /* bits 2-0 = DMA channel */
#define MCD_MASK_IRQ 0x70 /* bits 6-4 = INT number */
/* 001 = int 2,9 */
@ -77,8 +78,15 @@ typedef unsigned char bcd_t;
/* 100 = int 10 */
/* 101 = int 11 */
/* flags */
#define STATUS_AVAIL 0xb
#define DATA_AVAIL 0xf
#define STATUS_AVAIL 0xB
#define DATA_AVAIL 0xF
/* New Flags */
#define M_STATUS_AVAIL 0xFB
#define M_DATA_AVAIL 0xFD
/* New Commands */
#define M_RESET 0x00
/* ports */
#define MCD_DATA 0