diff --git a/sys/dev/pbio/pbio.c b/sys/dev/pbio/pbio.c --- a/sys/dev/pbio/pbio.c +++ b/sys/dev/pbio/pbio.c @@ -53,7 +53,6 @@ /* Function prototypes (these should all be static) */ static d_open_t pbioopen; -static d_close_t pbioclose; static d_read_t pbioread; static d_write_t pbiowrite; static d_ioctl_t pbioioctl; @@ -81,8 +80,9 @@ #define PBIO_PNAME(n) (port_names[(n)]) -#define UNIT(dev) (dev2unit(dev) >> 2) -#define PORT(dev) (dev2unit(dev) & 0x3) +#define PORT(dev) (dev2unit(dev)) + +#define pbio_addr(dev) ((dev)->si_drv1) #define PBIOPRI ((PZERO + 5) | PCATCH) @@ -90,7 +90,6 @@ .d_version = D_VERSION, .d_flags = D_NEEDGIANT, .d_open = pbioopen, - .d_close = pbioclose, .d_read = pbioread, .d_write = pbiowrite, .d_ioctl = pbioioctl, @@ -132,8 +131,6 @@ }; static devclass_t pbio_devclass; -#define pbio_addr(unit) \ - ((struct pbio_softc *) devclass_get_softc(pbio_devclass, unit)) static char driver_name[] = "pbio"; @@ -218,6 +215,7 @@ static int pbioattach (device_t dev) { + struct make_dev_args args; int unit; int i; int rid; @@ -238,9 +236,17 @@ */ sc->iomode = 0x9b; /* All ports to input */ - for (i = 0; i < PBIO_NPORTS; i++) - sc->pd[i].port = make_dev(&pbio_cdevsw, (unit << 2) + i, 0, 0, - 0600, "pbio%d%s", unit, PBIO_PNAME(i)); + for (i = 0; i < PBIO_NPORTS; i++) { + make_dev_args_init(&args); + args.mda_devsw = &pbio_cdevsw; + args.mda_uid = 0; + args.mda_gid = 0; + args.mda_mode = 0600; + args.mda_unit = i; + args.mda_si_drv1 = sc; + (void)make_dev_s(&args, &sc->pd[i].port, "pbio%d%s", unit, + PBIO_PNAME(i)); + } return (0); } @@ -249,13 +255,10 @@ struct thread *td) { struct pbio_softc *scp; - int port, unit; + int port; - unit = UNIT(dev); port = PORT(dev); - scp = pbio_addr(unit); - if (scp == NULL) - return (ENODEV); + scp = pbio_addr(dev); switch (cmd) { case PBIO_SETDIFF: scp->pd[port].diff = *(int *)data; @@ -285,14 +288,11 @@ pbioopen(struct cdev *dev, int oflags, int devtype, struct thread *td) { struct pbio_softc *scp; - int ocfg, port, unit; + int ocfg, port; int portbit; /* Port configuration bit */ - unit = UNIT(dev); port = PORT(dev); - scp = pbio_addr(unit); - if (scp == NULL) - return (ENODEV); + scp = pbio_addr(dev); switch (port) { case 0: portbit = 0x10; break; /* Port A */ @@ -315,20 +315,6 @@ return (0); } -static int -pbioclose(struct cdev *dev, int fflag, int devtype, struct thread *td) -{ - struct pbio_softc *scp; - int unit; - - unit = UNIT(dev); - scp = pbio_addr(unit); - if (scp == NULL) - return (ENODEV); - - return (0); -} - /* * Return the value of a given port on a given I/O base address * Handles the split C port nibbles and blocking @@ -374,14 +360,11 @@ pbioread(struct cdev *dev, struct uio *uio, int ioflag) { struct pbio_softc *scp; - int err, i, port, ret, toread, unit; + int err, i, port, ret, toread; char val; - unit = UNIT(dev); port = PORT(dev); - scp = pbio_addr(unit); - if (scp == NULL) - return (ENODEV); + scp = pbio_addr(dev); while (uio->uio_resid > 0) { toread = min(uio->uio_resid, PBIO_BUFSIZ); @@ -403,14 +386,11 @@ pbiowrite(struct cdev *dev, struct uio *uio, int ioflag) { struct pbio_softc *scp; - int i, port, ret, towrite, unit; + int i, port, ret, towrite; char val, oval; - unit = UNIT(dev); port = PORT(dev); - scp = pbio_addr(unit); - if (scp == NULL) - return (ENODEV); + scp = pbio_addr(dev); while (uio->uio_resid > 0) { towrite = min(uio->uio_resid, PBIO_BUFSIZ); @@ -450,14 +430,6 @@ static int pbiopoll(struct cdev *dev, int which, struct thread *td) { - struct pbio_softc *scp; - int unit; - - unit = UNIT(dev); - scp = pbio_addr(unit); - if (scp == NULL) - return (ENODEV); - /* * Do processing */