1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-06 09:17:25 +00:00

Merge most of FDC_YE into the mainline driver.

o Rename FDC_PCMCIA to FDC_NODMA to allow systems that don't have dma
  for floppies.
o Remove all but two FDC_YE ifdefs.  They aren't needed.
o Move defines for YE_DATAPORT to fdreg.h.

Not fixed:
o The pccard probe/attach.  However, motivated individuals can more
  easily add this now.

This is a merge of changes I've had in my tree for a long time.  These
fixes were tested on my VAIO with its normal floppy.  Please let me
know if I broke anything.

Prodded by: Peter Wemm <peter@freebsd.org>
This commit is contained in:
Warner Losh 2000-01-06 07:13:54 +00:00
parent 01f1e15e44
commit 3b1782065f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=55498
5 changed files with 63 additions and 153 deletions

View File

@ -82,20 +82,11 @@
#include <isa/fdc.h>
#include <isa/rtc.h>
#ifdef FDC_YE
#undef FDC_YE
#warning "fix FDC_YE! - newbus casualty"
#endif
/* misuse a flag to identify format operation */
#define B_FORMAT B_XXX
/* configuration flags */
#define FDC_PRETEND_D0 (1 << 0) /* pretend drive 0 to be there */
#ifdef FDC_YE
#define FDC_IS_PCMCIA (1 << 1) /* if successful probe, then it's
a PCMCIA device */
#endif
#define FDC_NO_FIFO (1 << 2) /* do not enable FIFO */
/* internally used only, not really from CMOS: */
@ -201,11 +192,6 @@ static devclass_t fd_devclass;
* fdsu is the floppy drive unit number on that controller. (sub-unit) *
\***********************************************************************/
#ifdef FDC_YE
#include "card.h"
static int yeattach(struct isa_device *);
#endif
/* needed for ft driver, thus exported */
int in_fdc(struct fdc_data *);
int out_fdc(struct fdc_data *, int);
@ -245,9 +231,7 @@ static int fifo_threshold = 8; /* XXX: should be accessible via sysctl */
#define MOTORWAIT 10
#define IOTIMEDOUT 11
#define RESETCOMPLETE 12
#ifdef FDC_YE
#define PIOREAD 13
#endif
#ifdef FDC_DEBUG
static char const * const fdstates[] =
@ -265,9 +249,7 @@ static char const * const fdstates[] =
"MOTORWAIT",
"IOTIMEDOUT",
"RESETCOMPLETE",
#ifdef FDC_YE
"PIOREAD",
#endif
};
/* CAUTION: fd_debug causes huge amounts of logging output */
@ -339,11 +321,6 @@ static int yeintr(struct pccard_devinfo *); /* Interrupt handler */
PCCARD_MODULE(fdc, yeinit, yeunload, yeintr, 0, bio_imask);
/*
* this is the secret PIO data port (offset from base)
*/
#define FDC_YE_DATAPORT 6
/*
* Initialize the device - called from Slot manager.
*/
@ -810,14 +787,6 @@ fdc_probe(device_t dev)
}
}
#ifdef FDC_YE
/*
* don't succeed on probe; wait
* for PCCARD subsystem to do it
*/
if (device_get_flags(fdc->fdc_dev) & FDC_IS_PCMCIA)
return(0);
#endif
out:
fdc_release_resources(fdc);
return (error);
@ -1141,10 +1110,10 @@ static int yeattach(struct isa_device *dev)
int st0, st3, i;
fdc->fdcu = fdcu;
/*
* the FDC_PCMCIA flag is used to to indicate special PIO is used
* the FDC_NODMA flag is used to to indicate special PIO is used
* instead of DMA
*/
fdc->flags = FDC_ATTACHED|FDC_PCMCIA;
fdc->flags = FDC_ATTACHED|FDC_NODMA;
fdc->state = DEVIDLE;
/* reset controller, turn motor off, clear fdout mirror reg */
fdout_wr(fdc, ((fdc->fdout = 0)));
@ -1525,17 +1494,11 @@ fdstrategy(struct buf *bp)
panic("fdstrategy: buf for nonexistent device (%#lx, %#lx)",
(u_long)major(bp->b_dev), (u_long)minor(bp->b_dev));
fdc = fd->fdc;
#ifdef FDC_YE
if (fd->type == NO_TYPE) {
bp->b_error = ENXIO;
bp->b_flags |= B_ERROR;
/*
* I _refuse_ to use a goto
*/
biodone(bp);
return;
goto bad;
};
#endif
fdblk = 128 << (fd->ft->secsize);
if (!(bp->b_flags & B_FORMAT)) {
@ -1671,37 +1634,38 @@ fdc_intr(void *xfdc)
;
}
#ifdef FDC_YE
/*
* magic pseudo-DMA initialization for YE FDC. Sets count and
* direction
*/
#define SET_BCDR(wr,cnt,port) outb(port,(((cnt)-1) & 0xff)); \
outb(port+1,((wr ? 0x80 : 0) | ((((cnt)-1) >> 8) & 0x7f)))
#define SET_BCDR(fdc,wr,cnt,port) \
bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + port, \
((cnt)-1) & 0xff); \
bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + port + 1, \
((wr ? 0x80 : 0) | ((((cnt)-1) >> 8) & 0x7f)));
/*
* fdcpio(): perform programmed IO read/write for YE PCMCIA floppy
*/
static int fdcpio(fdcu_t fdcu, long flags, caddr_t addr, u_int count)
static int fdcpio(fdc_p fdc, long flags, caddr_t addr, u_int count)
{
u_char *cptr = (u_char *)addr;
fdc_p fdc = &fdc_data[fdcu];
int io = fdc->baseport;
if (flags & B_READ) {
if (fdc->state != PIOREAD) {
fdc->state = PIOREAD;
return(0);
};
SET_BCDR(0,count,io);
insb(io+FDC_YE_DATAPORT,cptr,count);
SET_BCDR(fdc, 0, count, 0);
bus_space_read_multi_1(fdc->portt, fdc->porth, fdc->port_off +
FDC_YE_DATAPORT, cptr, count);
} else {
outsb(io+FDC_YE_DATAPORT,cptr,count);
SET_BCDR(0,count,io);
bus_space_write_multi_1(fdc->portt, fdc->porth, fdc->port_off +
FDC_YE_DATAPORT, cptr, count);
SET_BCDR(fdc, 0, count, 0);
};
return(1);
}
#endif /* FDC_YE */
/***********************************************************************\
* The controller state machine. *
@ -1894,9 +1858,7 @@ fdstate(fdc_p fdc)
}
fd->track = b_cylinder;
#ifdef FDC_YE
if (!(fdc->flags & FDC_PCMCIA))
#endif
if (!(fdc->flags & FDC_NODMA))
isa_dmastart(bp->b_flags, bp->b_data+fd->skip,
format ? bp->b_bcount : fdblk, fdc->dmachan);
sectrac = fd->ft->sectrac;
@ -1939,12 +1901,10 @@ fdstate(fdc_p fdc)
}
if (format) {
#ifdef FDC_YE
if (fdc->flags & FDC_PCMCIA)
(void)fdcpio(fdcu,bp->b_flags,
if (fdc->flags & FDC_NODMA)
(void)fdcpio(fdc,bp->b_flags,
bp->b_data+fd->skip,
bp->b_bcount);
#endif
/* formatting */
if(fd_cmd(fdc, 6, NE7CMD_FORMAT, head << 2 | fdu,
finfo->fd_formb_secshift,
@ -1959,24 +1919,22 @@ fdstate(fdc_p fdc)
return (retrier(fdc));
}
} else {
#ifdef FDC_YE
if (fdc->flags & FDC_PCMCIA) {
if (fdc->flags & FDC_NODMA) {
/*
* this seems to be necessary even when
* reading data
*/
SET_BCDR(1,fdblk,fdc->baseport);
SET_BCDR(fdc, 1, fdblk, 0);
/*
* perform the write pseudo-DMA before
* the WRITE command is sent
*/
if (!read)
(void)fdcpio(fdcu,bp->b_flags,
(void)fdcpio(fdc,bp->b_flags,
bp->b_data+fd->skip,
fdblk);
}
#endif
if (fd_cmd(fdc, 9,
(read ? NE7CMD_READ : NE7CMD_WRITE),
head << 2 | fdu, /* head & unit */
@ -1996,16 +1954,14 @@ fdstate(fdc_p fdc)
return (retrier(fdc));
}
}
#ifdef FDC_YE
if (fdc->flags & FDC_PCMCIA)
if (fdc->flags & FDC_NODMA)
/*
* if this is a read, then simply await interrupt
* before performing PIO
*/
if (read && !fdcpio(fdcu,bp->b_flags,
if (read && !fdcpio(fdc,bp->b_flags,
bp->b_data+fd->skip,fdblk)) {
fd->tohandle = timeout(fd_iotimeout,
(caddr_t)fdcu, hz);
fd->tohandle = timeout(fd_iotimeout, fdc, hz);
return(0); /* will return later */
};
@ -2013,20 +1969,17 @@ fdstate(fdc_p fdc)
* write (or format) operation will fall through and
* await completion interrupt
*/
#endif
fdc->state = IOCOMPLETE;
fd->tohandle = timeout(fd_iotimeout, fdc, hz);
return (0); /* will return later */
#ifdef FDC_YE
case PIOREAD:
/*
* actually perform the PIO read. The IOCOMPLETE case
* removes the timeout for us.
*/
(void)fdcpio(fdcu,bp->b_flags,bp->b_data+fd->skip,fdblk);
(void)fdcpio(fdc,bp->b_flags,bp->b_data+fd->skip,fdblk);
fdc->state = IOCOMPLETE;
/* FALLTHROUGH */
#endif
case IOCOMPLETE: /* IO DONE, post-analyze */
untimeout(fd_iotimeout, fdc, fd->tohandle);
@ -2044,9 +1997,7 @@ fdstate(fdc_p fdc)
/* FALLTHROUGH */
case IOTIMEDOUT:
#ifdef FDC_YE
if (!(fdc->flags & FDC_PCMCIA))
#endif
if (!(fdc->flags & FDC_NODMA))
isa_dmadone(bp->b_flags, bp->b_data + fd->skip,
format ? bp->b_bcount : fdblk, fdc->dmachan);
if (fdc->status[0] & NE7_ST0_IC) {

View File

@ -63,6 +63,11 @@
/* for some controllers 1MPBS instead */
#endif /* FDC_500KBPS */
/*
* this is the secret PIO data port (offset from base)
*/
#define FDC_YE_DATAPORT 6
#define FDIN 7 /* Digital Input Register (R) */
#define FDI_DCHG 0x80 /* diskette has been changed */
/* requires drive and motor being selected */

View File

@ -82,20 +82,11 @@
#include <isa/fdc.h>
#include <isa/rtc.h>
#ifdef FDC_YE
#undef FDC_YE
#warning "fix FDC_YE! - newbus casualty"
#endif
/* misuse a flag to identify format operation */
#define B_FORMAT B_XXX
/* configuration flags */
#define FDC_PRETEND_D0 (1 << 0) /* pretend drive 0 to be there */
#ifdef FDC_YE
#define FDC_IS_PCMCIA (1 << 1) /* if successful probe, then it's
a PCMCIA device */
#endif
#define FDC_NO_FIFO (1 << 2) /* do not enable FIFO */
/* internally used only, not really from CMOS: */
@ -201,11 +192,6 @@ static devclass_t fd_devclass;
* fdsu is the floppy drive unit number on that controller. (sub-unit) *
\***********************************************************************/
#ifdef FDC_YE
#include "card.h"
static int yeattach(struct isa_device *);
#endif
/* needed for ft driver, thus exported */
int in_fdc(struct fdc_data *);
int out_fdc(struct fdc_data *, int);
@ -245,9 +231,7 @@ static int fifo_threshold = 8; /* XXX: should be accessible via sysctl */
#define MOTORWAIT 10
#define IOTIMEDOUT 11
#define RESETCOMPLETE 12
#ifdef FDC_YE
#define PIOREAD 13
#endif
#ifdef FDC_DEBUG
static char const * const fdstates[] =
@ -265,9 +249,7 @@ static char const * const fdstates[] =
"MOTORWAIT",
"IOTIMEDOUT",
"RESETCOMPLETE",
#ifdef FDC_YE
"PIOREAD",
#endif
};
/* CAUTION: fd_debug causes huge amounts of logging output */
@ -339,11 +321,6 @@ static int yeintr(struct pccard_devinfo *); /* Interrupt handler */
PCCARD_MODULE(fdc, yeinit, yeunload, yeintr, 0, bio_imask);
/*
* this is the secret PIO data port (offset from base)
*/
#define FDC_YE_DATAPORT 6
/*
* Initialize the device - called from Slot manager.
*/
@ -810,14 +787,6 @@ fdc_probe(device_t dev)
}
}
#ifdef FDC_YE
/*
* don't succeed on probe; wait
* for PCCARD subsystem to do it
*/
if (device_get_flags(fdc->fdc_dev) & FDC_IS_PCMCIA)
return(0);
#endif
out:
fdc_release_resources(fdc);
return (error);
@ -1141,10 +1110,10 @@ static int yeattach(struct isa_device *dev)
int st0, st3, i;
fdc->fdcu = fdcu;
/*
* the FDC_PCMCIA flag is used to to indicate special PIO is used
* the FDC_NODMA flag is used to to indicate special PIO is used
* instead of DMA
*/
fdc->flags = FDC_ATTACHED|FDC_PCMCIA;
fdc->flags = FDC_ATTACHED|FDC_NODMA;
fdc->state = DEVIDLE;
/* reset controller, turn motor off, clear fdout mirror reg */
fdout_wr(fdc, ((fdc->fdout = 0)));
@ -1525,17 +1494,11 @@ fdstrategy(struct buf *bp)
panic("fdstrategy: buf for nonexistent device (%#lx, %#lx)",
(u_long)major(bp->b_dev), (u_long)minor(bp->b_dev));
fdc = fd->fdc;
#ifdef FDC_YE
if (fd->type == NO_TYPE) {
bp->b_error = ENXIO;
bp->b_flags |= B_ERROR;
/*
* I _refuse_ to use a goto
*/
biodone(bp);
return;
goto bad;
};
#endif
fdblk = 128 << (fd->ft->secsize);
if (!(bp->b_flags & B_FORMAT)) {
@ -1671,37 +1634,38 @@ fdc_intr(void *xfdc)
;
}
#ifdef FDC_YE
/*
* magic pseudo-DMA initialization for YE FDC. Sets count and
* direction
*/
#define SET_BCDR(wr,cnt,port) outb(port,(((cnt)-1) & 0xff)); \
outb(port+1,((wr ? 0x80 : 0) | ((((cnt)-1) >> 8) & 0x7f)))
#define SET_BCDR(fdc,wr,cnt,port) \
bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + port, \
((cnt)-1) & 0xff); \
bus_space_write_1(fdc->portt, fdc->porth, fdc->port_off + port + 1, \
((wr ? 0x80 : 0) | ((((cnt)-1) >> 8) & 0x7f)));
/*
* fdcpio(): perform programmed IO read/write for YE PCMCIA floppy
*/
static int fdcpio(fdcu_t fdcu, long flags, caddr_t addr, u_int count)
static int fdcpio(fdc_p fdc, long flags, caddr_t addr, u_int count)
{
u_char *cptr = (u_char *)addr;
fdc_p fdc = &fdc_data[fdcu];
int io = fdc->baseport;
if (flags & B_READ) {
if (fdc->state != PIOREAD) {
fdc->state = PIOREAD;
return(0);
};
SET_BCDR(0,count,io);
insb(io+FDC_YE_DATAPORT,cptr,count);
SET_BCDR(fdc, 0, count, 0);
bus_space_read_multi_1(fdc->portt, fdc->porth, fdc->port_off +
FDC_YE_DATAPORT, cptr, count);
} else {
outsb(io+FDC_YE_DATAPORT,cptr,count);
SET_BCDR(0,count,io);
bus_space_write_multi_1(fdc->portt, fdc->porth, fdc->port_off +
FDC_YE_DATAPORT, cptr, count);
SET_BCDR(fdc, 0, count, 0);
};
return(1);
}
#endif /* FDC_YE */
/***********************************************************************\
* The controller state machine. *
@ -1894,9 +1858,7 @@ fdstate(fdc_p fdc)
}
fd->track = b_cylinder;
#ifdef FDC_YE
if (!(fdc->flags & FDC_PCMCIA))
#endif
if (!(fdc->flags & FDC_NODMA))
isa_dmastart(bp->b_flags, bp->b_data+fd->skip,
format ? bp->b_bcount : fdblk, fdc->dmachan);
sectrac = fd->ft->sectrac;
@ -1939,12 +1901,10 @@ fdstate(fdc_p fdc)
}
if (format) {
#ifdef FDC_YE
if (fdc->flags & FDC_PCMCIA)
(void)fdcpio(fdcu,bp->b_flags,
if (fdc->flags & FDC_NODMA)
(void)fdcpio(fdc,bp->b_flags,
bp->b_data+fd->skip,
bp->b_bcount);
#endif
/* formatting */
if(fd_cmd(fdc, 6, NE7CMD_FORMAT, head << 2 | fdu,
finfo->fd_formb_secshift,
@ -1959,24 +1919,22 @@ fdstate(fdc_p fdc)
return (retrier(fdc));
}
} else {
#ifdef FDC_YE
if (fdc->flags & FDC_PCMCIA) {
if (fdc->flags & FDC_NODMA) {
/*
* this seems to be necessary even when
* reading data
*/
SET_BCDR(1,fdblk,fdc->baseport);
SET_BCDR(fdc, 1, fdblk, 0);
/*
* perform the write pseudo-DMA before
* the WRITE command is sent
*/
if (!read)
(void)fdcpio(fdcu,bp->b_flags,
(void)fdcpio(fdc,bp->b_flags,
bp->b_data+fd->skip,
fdblk);
}
#endif
if (fd_cmd(fdc, 9,
(read ? NE7CMD_READ : NE7CMD_WRITE),
head << 2 | fdu, /* head & unit */
@ -1996,16 +1954,14 @@ fdstate(fdc_p fdc)
return (retrier(fdc));
}
}
#ifdef FDC_YE
if (fdc->flags & FDC_PCMCIA)
if (fdc->flags & FDC_NODMA)
/*
* if this is a read, then simply await interrupt
* before performing PIO
*/
if (read && !fdcpio(fdcu,bp->b_flags,
if (read && !fdcpio(fdc,bp->b_flags,
bp->b_data+fd->skip,fdblk)) {
fd->tohandle = timeout(fd_iotimeout,
(caddr_t)fdcu, hz);
fd->tohandle = timeout(fd_iotimeout, fdc, hz);
return(0); /* will return later */
};
@ -2013,20 +1969,17 @@ fdstate(fdc_p fdc)
* write (or format) operation will fall through and
* await completion interrupt
*/
#endif
fdc->state = IOCOMPLETE;
fd->tohandle = timeout(fd_iotimeout, fdc, hz);
return (0); /* will return later */
#ifdef FDC_YE
case PIOREAD:
/*
* actually perform the PIO read. The IOCOMPLETE case
* removes the timeout for us.
*/
(void)fdcpio(fdcu,bp->b_flags,bp->b_data+fd->skip,fdblk);
(void)fdcpio(fdc,bp->b_flags,bp->b_data+fd->skip,fdblk);
fdc->state = IOCOMPLETE;
/* FALLTHROUGH */
#endif
case IOCOMPLETE: /* IO DONE, post-analyze */
untimeout(fd_iotimeout, fdc, fd->tohandle);
@ -2044,9 +1997,7 @@ fdstate(fdc_p fdc)
/* FALLTHROUGH */
case IOTIMEDOUT:
#ifdef FDC_YE
if (!(fdc->flags & FDC_PCMCIA))
#endif
if (!(fdc->flags & FDC_NODMA))
isa_dmadone(bp->b_flags, bp->b_data + fd->skip,
format ? bp->b_bcount : fdblk, fdc->dmachan);
if (fdc->status[0] & NE7_ST0_IC) {

View File

@ -55,10 +55,8 @@ struct fdc_data
#define FDC_STAT_VALID 0x08
#define FDC_HAS_FIFO 0x10
#define FDC_NEEDS_RESET 0x20
#ifdef FDC_YE
#define FDC_PCMCIA 0x40
#define FDC_NODMA 0x40
#define FDC_UNLOADED 0x80
#endif
#define FDC_ISPNP 0x100
struct fd_data *fd;
int fdu; /* the active drive */

View File

@ -63,6 +63,11 @@
/* for some controllers 1MPBS instead */
#endif /* FDC_500KBPS */
/*
* this is the secret PIO data port (offset from base)
*/
#define FDC_YE_DATAPORT 6
#define FDIN 7 /* Digital Input Register (R) */
#define FDI_DCHG 0x80 /* diskette has been changed */
/* requires drive and motor being selected */