pbio: Store softc in si_drv1 for character devices.

The port number is still stored in the unit (si_drv0) but is the
entire unit value now.

While here, removed checks for NULL softc since those can never happen
from cdevsw routines.  This also resulted in the close method becoming
a no-op, so it has been removed.

Differential Revision:	https://reviews.freebsd.org/D35078
This commit is contained in:
John Baldwin 2022-05-05 16:38:25 -07:00
parent e4ec982c75
commit 0db65574bb

View file

@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$");
/* 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 @@ static char *port_names[] = {"a", "b", "ch", "cl"};
#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 @@ static struct cdevsw pbio_cdevsw = {
.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 device_method_t pbio_methods[] = {
};
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 @@ pbioprobe(device_t dev)
static int
pbioattach (device_t dev)
{
struct make_dev_args args;
int unit;
int i;
int rid;
@ -238,9 +236,17 @@ pbioattach (device_t dev)
*/
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 @@ pbioioctl (struct cdev *dev, u_long cmd, caddr_t data, int flag,
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 @@ static int
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 @@ pbioopen(struct cdev *dev, int oflags, int devtype, struct thread *td)
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 @@ static int
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 @@ static int
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 @@ pbiowrite(struct cdev *dev, struct uio *uio, int ioflag)
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
*/