Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/pgoyette-localcount]: src/sys/dev/isa Update a few drivers for localcoun...
details: https://anonhg.NetBSD.org/src/rev/f82e81950ad2
branches: pgoyette-localcount
changeset: 852859:f82e81950ad2
user: pgoyette <pgoyette%NetBSD.org@localhost>
date: Mon Jul 25 03:30:51 2016 +0000
description:
Update a few drivers for localcount(9)
diffstat:
sys/dev/isa/fd.c | 104 +++++++++++++++++++++++++++++++-----------
sys/dev/isa/isv.c | 72 ++++++++++++++++++++---------
sys/dev/isa/mcd.c | 129 ++++++++++++++++++++++++++++++++++++------------------
3 files changed, 212 insertions(+), 93 deletions(-)
diffs (truncated from 754 to 300 lines):
diff -r e662e0881930 -r f82e81950ad2 sys/dev/isa/fd.c
--- a/sys/dev/isa/fd.c Sun Jul 24 10:44:57 2016 +0000
+++ b/sys/dev/isa/fd.c Mon Jul 25 03:30:51 2016 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fd.c,v 1.110 2015/12/08 20:36:15 christos Exp $ */
+/* $NetBSD: fd.c,v 1.110.2.1 2016/07/25 03:30:51 pgoyette Exp $ */
/*-
* Copyright (c) 1998, 2003, 2008 The NetBSD Foundation, Inc.
@@ -81,7 +81,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.110 2015/12/08 20:36:15 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.110.2.1 2016/07/25 03:30:51 pgoyette Exp $");
#include "opt_ddb.h"
@@ -695,7 +695,9 @@
void
fdstrategy(struct buf *bp)
{
- struct fd_softc *fd = device_lookup_private(&fd_cd, FDUNIT(bp->b_dev));
+ device_t self;
+ struct fd_softc *fd =
+ device_lookup_private_acquire(&fd_cd, FDUNIT(bp->b_dev), &self);
struct fdc_softc *fdc = device_private(device_parent(fd->sc_dev));
int sz;
@@ -753,12 +755,14 @@
}
#endif
mutex_exit(&fdc->sc_mtx);
+ device_release(self);
return;
done:
/* Toss transfer; we're done early. */
bp->b_resid = bp->b_bcount;
biodone(bp);
+ device_release(self);
}
void
@@ -917,20 +921,28 @@
int
fdopen(dev_t dev, int flags, int mode, struct lwp *l)
{
+ device_t self;
struct fd_softc *fd;
const struct fd_type *type;
- fd = device_lookup_private(&fd_cd, FDUNIT(dev));
- if (fd == NULL)
+ fd = device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self);
+ if (fd == NULL) {
+ if (self != NULL)
+ device_release(self);
return (ENXIO);
+ }
type = fd_dev_to_type(fd, dev);
- if (type == NULL)
+ if (type == NULL) {
+ device_release(self);
return ENXIO;
+ }
if ((fd->sc_flags & FD_OPEN) != 0 &&
- memcmp(fd->sc_type, type, sizeof(*type)))
+ memcmp(fd->sc_type, type, sizeof(*type))) {
+ device_release(self);
return EBUSY;
+ }
fd->sc_type_copy = *type;
fd->sc_type = &fd->sc_type_copy;
@@ -939,17 +951,20 @@
fd_set_geometry(fd);
+ device_release(self);
return 0;
}
int
fdclose(dev_t dev, int flags, int mode, struct lwp *l)
{
+ device_t self;
struct fd_softc *fd =
- device_lookup_private(&fd_cd, FDUNIT(dev));
+ device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self);
fd->sc_flags &= ~FD_OPEN;
fd->sc_opts &= ~(FDOPT_NORETRY|FDOPT_SILENT);
+ device_release(self);
return 0;
}
@@ -1396,8 +1411,9 @@
int
fdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
{
+ device_t self;
struct fd_softc *fd =
- device_lookup_private(&fd_cd, FDUNIT(dev));
+ device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self);
struct fdformat_parms *form_parms;
struct fdformat_cmd *form_cmd;
struct ne7_fd_formb *fd_formb;
@@ -1426,20 +1442,25 @@
lp->d_secpercyl = fd->sc_type->seccyl;
lp->d_secperunit = fd->sc_type->size;
- if (readdisklabel(dev, fdstrategy, lp, NULL) != NULL)
+ if (readdisklabel(dev, fdstrategy, lp, NULL) != NULL) {
+ device_release(self);
return EINVAL;
+ }
break;
}
error = disk_ioctl(&fd->sc_dk, dev, cmd, addr, flag, l);
- if (error != EPASSTHROUGH)
+ if (error != EPASSTHROUGH) {
+ device_release(self);
return error;
+ }
switch (cmd) {
case DIOCWLABEL:
if ((flag & FWRITE) == 0)
return EBADF;
/* XXX do something */
+ device_release(self);
return 0;
case DIOCWDINFO:
@@ -1447,8 +1468,10 @@
case ODIOCWDINFO:
#endif
{
- if ((flag & FWRITE) == 0)
+ if ((flag & FWRITE) == 0) {
+ device_release(self);
return EBADF;
+ }
#ifdef __HAVE_OLD_DISKLABEL
if (cmd == ODIOCWDINFO) {
memset(&newlabel, 0, sizeof newlabel);
@@ -1457,10 +1480,10 @@
}
#endif
error = setdisklabel(lp, addr, 0, NULL);
- if (error)
- return error;
+ if (error == 0)
+ error = writedisklabel(dev, fdstrategy, lp, NULL);
- error = writedisklabel(dev, fdstrategy, lp, NULL);
+ device_release(self);
return error;
}
@@ -1488,21 +1511,23 @@
default:
return EINVAL;
}
+ device_release(self);
return 0;
case FDIOCSETFORMAT:
if((flag & FWRITE) == 0)
return EBADF; /* must be opened for writing */
form_parms = (struct fdformat_parms *)addr;
- if (form_parms->fdformat_version != FDFORMAT_VERSION)
+ if (form_parms->fdformat_version != FDFORMAT_VERSION) {
+ device_release(self);
return EINVAL; /* wrong version of formatting prog */
-
+ }
scratch = form_parms->nbps >> 7;
if ((form_parms->nbps & 0x7f) || ffs(scratch) == 0 ||
- scratch & ~(1 << (ffs(scratch)-1)))
- /* not a power-of-two multiple of 128 */
- return EINVAL;
-
+ scratch & ~(1 << (ffs(scratch)-1))) {
+ device_release(self);
+ return EINVAL; /* not a power-of-two multiple of 128 */
+ }
switch (form_parms->xfer_rate) {
case 500 * 1024:
fd->sc_type->rate = FDC_500KBPS;
@@ -1514,16 +1539,21 @@
fd->sc_type->rate = FDC_250KBPS;
break;
default:
+ device_release(self);
return EINVAL;
}
if (form_parms->nspt > FD_MAX_NSEC ||
form_parms->fillbyte > 0xff ||
- form_parms->interleave > 0xff)
+ form_parms->interleave > 0xff) {
+ device_release(self);
return EINVAL;
+ }
fd->sc_type->sectrac = form_parms->nspt;
- if (form_parms->ntrk != 2 && form_parms->ntrk != 1)
+ if (form_parms->ntrk != 2 && form_parms->ntrk != 1) {
+ device_release(self);
return EINVAL;
+ }
fd->sc_type->heads = form_parms->ntrk;
fd->sc_type->seccyl = form_parms->nspt * form_parms->ntrk;
fd->sc_type->secsize = ffs(scratch)-1;
@@ -1534,24 +1564,33 @@
fd->sc_type->step = form_parms->stepspercyl;
fd->sc_type->fillbyte = form_parms->fillbyte;
fd->sc_type->interleave = form_parms->interleave;
+
+ device_release(self);
return 0;
case FDIOCFORMAT_TRACK:
- if((flag & FWRITE) == 0)
+ if((flag & FWRITE) == 0) {
+ device_release(self);
return EBADF; /* must be opened for writing */
+ }
form_cmd = (struct fdformat_cmd *)addr;
- if (form_cmd->formatcmd_version != FDFORMAT_VERSION)
+ if (form_cmd->formatcmd_version != FDFORMAT_VERSION) {
+ device_release(self);
return EINVAL; /* wrong version of formatting prog */
+ }
if (form_cmd->head >= fd->sc_type->heads ||
form_cmd->cylinder >= fd->sc_type->cyls) {
+ device_release(self);
return EINVAL;
}
fd_formb = malloc(sizeof(struct ne7_fd_formb),
M_TEMP, M_NOWAIT);
- if (fd_formb == 0)
+ if (fd_formb == 0) {
+ device_release(self);
return ENOMEM;
+ }
fd_formb->head = form_cmd->head;
fd_formb->cyl = form_cmd->cylinder;
@@ -1577,17 +1616,21 @@
error = fdformat(dev, fd_formb, l);
free(fd_formb, M_TEMP);
+ device_release(self);
return error;
case FDIOCGETOPTS: /* get drive options */
*(int *)addr = fd->sc_opts;
+ device_release(self);
return 0;
case FDIOCSETOPTS: /* set drive options */
fd->sc_opts = *(int *)addr;
+ device_release(self);
return 0;
default:
+ device_release(self);
return ENOTTY;
}
@@ -1599,16 +1642,20 @@
int
fdformat(dev_t dev, struct ne7_fd_formb *finfo, struct lwp *l)
{
+ device_t self;
int rv = 0;
struct fd_softc *fd =
- device_lookup_private(&fd_cd, FDUNIT(dev));
+ device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self);
struct fd_type *type = fd->sc_type;
struct buf *bp;
/* set up a buffer header for fdstrategy() */
bp = getiobuf(NULL, false);
- if (bp == NULL)
+ if (bp == NULL) {
+ if (self != NULL)
+ device_release(self);
return ENOBUFS;
+ }
bp->b_cflags = BC_BUSY;
bp->b_flags = B_PHYS | B_FORMAT;
Home |
Main Index |
Thread Index |
Old Index