diff options
author | kato <kato@FreeBSD.org> | 1997-09-18 08:10:45 +0000 |
---|---|---|
committer | kato <kato@FreeBSD.org> | 1997-09-18 08:10:45 +0000 |
commit | 9a97b13d56f9d109089ef5eb5260506083224a77 (patch) | |
tree | 38996d70ea80d9da352eb3ff837e348178bf688a /sys/pc98 | |
parent | 988ed1645292e356a41c3c826c475ecdf8552fea (diff) | |
download | FreeBSD-src-9a97b13d56f9d109089ef5eb5260506083224a77.zip FreeBSD-src-9a97b13d56f9d109089ef5eb5260506083224a77.tar.gz |
Synchronize with sys/i386/isa/fd.c revision 1.102.
Diffstat (limited to 'sys/pc98')
-rw-r--r-- | sys/pc98/cbus/fdc.c | 58 | ||||
-rw-r--r-- | sys/pc98/pc98/fd.c | 58 |
2 files changed, 114 insertions, 2 deletions
diff --git a/sys/pc98/cbus/fdc.c b/sys/pc98/cbus/fdc.c index bdb572a..15ae91f 100644 --- a/sys/pc98/cbus/fdc.c +++ b/sys/pc98/cbus/fdc.c @@ -43,7 +43,7 @@ * SUCH DAMAGE. * * from: @(#)fd.c 7.4 (Berkeley) 5/25/91 - * $Id: fd.c,v 1.20 1997/07/21 13:11:02 kato Exp $ + * $Id: fd.c,v 1.21 1997/09/17 08:01:07 kato Exp $ * */ @@ -315,6 +315,10 @@ static int fdstate(fdcu_t, fdc_p); static int retrier(fdcu_t); static int fdformat(dev_t, struct fd_formb *, struct proc *); +static int enable_fifo(fdc_p fdc); + +static int fifo_threshold = 8; /* XXX: should be accessible via sysctl */ + #define DEVIDLE 0 #define FINDWORK 1 @@ -438,6 +442,46 @@ fd_cmd(fdcu_t fdcu, int n_out, ...) return 0; } +static int +enable_fifo(fdc_p fdc) +{ + int i, j; + + if ((fdc->flags & FDC_HAS_FIFO) == 0) { + + /* + * XXX: + * Cannot use fd_cmd the normal way here, since + * this might be an invalid command. Thus we send the + * first byte, and check for an early turn of data directon. + */ + + if (out_fdc(fdc->fdcu, I8207X_CONFIGURE) < 0) + return fdc_err(fdc->fdcu, "Enable FIFO failed\n"); + + /* If command is invalid, return */ + j = 100000; + while ((i = inb(fdc->baseport + FDSTS) & (NE7_DIO | NE7_RQM)) + != NE7_RQM && j-- > 0) + if (i == (NE7_DIO | NE7_RQM)) { + fdc_reset(fdc); + return FD_FAILED; + } + if (j<0 || + fd_cmd(fdc->fdcu, 3, + 0, (fifo_threshold - 1) & 0xf, 0, 0) < 0) { + fdc_reset(fdc); + return fdc_err(fdc->fdcu, "Enable FIFO failed\n"); + } + fdc->flags |= FDC_HAS_FIFO; + return 0; + } + if (fd_cmd(fdc->fdcu, 4, + I8207X_CONFIGURE, 0, (fifo_threshold - 1) & 0xf, 0, 0) < 0) + return fdc_err(fdc->fdcu, "Re-enable FIFO failed\n"); + return 0; +} + static int fd_sense_drive_status(fdc_p fdc, int *st3p) { @@ -811,6 +855,13 @@ fdattach(struct isa_device *dev) fdc->fdct = FDC_UNKNOWN; break; } + if (fdc->fdct != FDC_NE765 && + fdc->fdct != FDC_UNKNOWN && + enable_fifo(fdc) == 0) { + printf("fdc%d: FIFO enabled", fdcu); + printf(", %d bytes threshold\n", + fifo_threshold); + } } if ((fd_cmd(fdcu, 2, NE7CMD_SENSED, fdsu, 1, &st3) == 0) && (st3 & NE7_ST3_T0)) { @@ -1070,6 +1121,9 @@ set_motor(fdcu_t fdcu, int fdsu, int turnon) NE7_SPEC_1(3, 240), NE7_SPEC_2(2, 0), 0); #endif + if (fdc_data[fdcu].flags & FDC_HAS_FIFO) + (void) enable_fifo(&fdc_data[fdcu]); + } } @@ -1163,6 +1217,8 @@ fdc_reset(fdc_p fdc) NE7_SPEC_1(3, 240), NE7_SPEC_2(2, 0), 0); #endif + if (fdc->flags & FDC_HAS_FIFO) + (void) enable_fifo(fdc); } /****************************************************************************/ diff --git a/sys/pc98/pc98/fd.c b/sys/pc98/pc98/fd.c index bdb572a..15ae91f 100644 --- a/sys/pc98/pc98/fd.c +++ b/sys/pc98/pc98/fd.c @@ -43,7 +43,7 @@ * SUCH DAMAGE. * * from: @(#)fd.c 7.4 (Berkeley) 5/25/91 - * $Id: fd.c,v 1.20 1997/07/21 13:11:02 kato Exp $ + * $Id: fd.c,v 1.21 1997/09/17 08:01:07 kato Exp $ * */ @@ -315,6 +315,10 @@ static int fdstate(fdcu_t, fdc_p); static int retrier(fdcu_t); static int fdformat(dev_t, struct fd_formb *, struct proc *); +static int enable_fifo(fdc_p fdc); + +static int fifo_threshold = 8; /* XXX: should be accessible via sysctl */ + #define DEVIDLE 0 #define FINDWORK 1 @@ -438,6 +442,46 @@ fd_cmd(fdcu_t fdcu, int n_out, ...) return 0; } +static int +enable_fifo(fdc_p fdc) +{ + int i, j; + + if ((fdc->flags & FDC_HAS_FIFO) == 0) { + + /* + * XXX: + * Cannot use fd_cmd the normal way here, since + * this might be an invalid command. Thus we send the + * first byte, and check for an early turn of data directon. + */ + + if (out_fdc(fdc->fdcu, I8207X_CONFIGURE) < 0) + return fdc_err(fdc->fdcu, "Enable FIFO failed\n"); + + /* If command is invalid, return */ + j = 100000; + while ((i = inb(fdc->baseport + FDSTS) & (NE7_DIO | NE7_RQM)) + != NE7_RQM && j-- > 0) + if (i == (NE7_DIO | NE7_RQM)) { + fdc_reset(fdc); + return FD_FAILED; + } + if (j<0 || + fd_cmd(fdc->fdcu, 3, + 0, (fifo_threshold - 1) & 0xf, 0, 0) < 0) { + fdc_reset(fdc); + return fdc_err(fdc->fdcu, "Enable FIFO failed\n"); + } + fdc->flags |= FDC_HAS_FIFO; + return 0; + } + if (fd_cmd(fdc->fdcu, 4, + I8207X_CONFIGURE, 0, (fifo_threshold - 1) & 0xf, 0, 0) < 0) + return fdc_err(fdc->fdcu, "Re-enable FIFO failed\n"); + return 0; +} + static int fd_sense_drive_status(fdc_p fdc, int *st3p) { @@ -811,6 +855,13 @@ fdattach(struct isa_device *dev) fdc->fdct = FDC_UNKNOWN; break; } + if (fdc->fdct != FDC_NE765 && + fdc->fdct != FDC_UNKNOWN && + enable_fifo(fdc) == 0) { + printf("fdc%d: FIFO enabled", fdcu); + printf(", %d bytes threshold\n", + fifo_threshold); + } } if ((fd_cmd(fdcu, 2, NE7CMD_SENSED, fdsu, 1, &st3) == 0) && (st3 & NE7_ST3_T0)) { @@ -1070,6 +1121,9 @@ set_motor(fdcu_t fdcu, int fdsu, int turnon) NE7_SPEC_1(3, 240), NE7_SPEC_2(2, 0), 0); #endif + if (fdc_data[fdcu].flags & FDC_HAS_FIFO) + (void) enable_fifo(&fdc_data[fdcu]); + } } @@ -1163,6 +1217,8 @@ fdc_reset(fdc_p fdc) NE7_SPEC_1(3, 240), NE7_SPEC_2(2, 0), 0); #endif + if (fdc->flags & FDC_HAS_FIFO) + (void) enable_fifo(fdc); } /****************************************************************************/ |