summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornyan <nyan@FreeBSD.org>2001-07-29 11:11:45 +0000
committernyan <nyan@FreeBSD.org>2001-07-29 11:11:45 +0000
commit89423b7440940d62821edb053062e80aa5f012c0 (patch)
treeb0c00413c785475cabef4c903d82eb9777345126
parenta9fe22efc310efbea1279cc1cef11fef65ef070f (diff)
downloadFreeBSD-src-89423b7440940d62821edb053062e80aa5f012c0.zip
FreeBSD-src-89423b7440940d62821edb053062e80aa5f012c0.tar.gz
Convert the olpt driver to using new-bus stuff.
-rw-r--r--sys/conf/files.pc982
-rw-r--r--sys/pc98/cbus/olpt.c170
-rw-r--r--sys/pc98/conf/GENERIC2
-rw-r--r--sys/pc98/pc98/olpt.c170
4 files changed, 208 insertions, 136 deletions
diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98
index 399a57a..634e655 100644
--- a/sys/conf/files.pc98
+++ b/sys/conf/files.pc98
@@ -377,7 +377,7 @@ pc98/pc98/fd.c optional fdc
pc98/pc98/isa_dma.c optional isa
pc98/pc98/mse.c optional mse
pc98/pc98/npx.c mandatory npx
-pc98/pc98/olpt.c count olpt
+pc98/pc98/olpt.c optional olpt
pc98/pc98/pc98gdc.c optional gdc
pc98/pc98/pc98kbd.c optional pckbd
pc98/pc98/pc98_machdep.c standard
diff --git a/sys/pc98/cbus/olpt.c b/sys/pc98/cbus/olpt.c
index 4a6488c..54a4507 100644
--- a/sys/pc98/cbus/olpt.c
+++ b/sys/pc98/cbus/olpt.c
@@ -101,11 +101,9 @@
* Poul-Henning Kamp <phk@freebsd.org>
*/
-#include "olpt.h"
#include "opt_inet.h"
#ifdef PC98
#undef INET /* PLIP is not supported for old PC-98 */
-#define LPT_DRVINIT_AT_ATTACH /* avoid conflicting with lpt on ppbus */
#endif
#include <sys/param.h>
@@ -118,7 +116,13 @@
#include <sys/uio.h>
#include <sys/syslog.h>
-#include <i386/isa/isa_device.h>
+#include <machine/clock.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <isa/isavar.h>
+
#include <i386/isa/lptreg.h>
#include <dev/ppbus/lptio.h>
@@ -136,10 +140,6 @@
#include <net/bpf.h>
#endif /* INET */
-#ifndef COMPAT_OLDISA
-#error "The olpt device requires the old isa compatibility shims"
-#endif
-
#define LPINITRDY 4 /* wait up to 4 seconds for a ready */
#define LPTOUTINITIAL 10 /* initial timeout to wait for ready 1/10 s */
#define LPTOUTMAX 1 /* maximal timeout 1 s */
@@ -198,7 +198,11 @@ static int volatile lptflag = 1;
#define LPTUNIT(s) ((s)&0x03)
#define LPTFLAGS(s) ((s)&0xfc)
-static struct lpt_softc {
+struct lpt_softc {
+ struct resource *res_port;
+ struct resource *res_irq;
+ void *sc_ih;
+
int sc_port;
short sc_state;
/* default case: negative prime, negative ack, handshake strobe,
@@ -226,7 +230,7 @@ static struct lpt_softc {
u_char *sc_ifbuf;
int sc_iferrs;
#endif
-} lpt_sc[NOLPT] ;
+};
/* bits for state */
#define OPEN (1<<0) /* device is open */
@@ -257,10 +261,9 @@ static struct lpt_softc {
#define MAX_SPIN 20 /* Max delay for device ready in usecs */
static timeout_t lptout;
-static int lptprobe (struct isa_device *dvp);
-static int lptattach (struct isa_device *isdp);
-static ointhand2_t lptintr;
-static void lpt_drvinit(void *unused);
+static int lpt_probe(device_t);
+static int lpt_attach(device_t);
+static void lpt_intr(void *);
#ifdef INET
@@ -286,13 +289,21 @@ static int lpoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
static void lpintr(int);
#endif /* INET */
-struct isa_driver olptdriver = {
- INTR_TYPE_TTY,
- lptprobe,
- lptattach,
- "olpt"
+static devclass_t olpt_devclass;
+
+static device_method_t olpt_methods[] = {
+ DEVMETHOD(device_probe, lpt_probe),
+ DEVMETHOD(device_attach, lpt_attach),
+ { 0, 0 }
};
-COMPAT_ISA_DRIVER(olpt, olptdriver);
+
+static driver_t olpt_driver = {
+ "olpt",
+ olpt_methods,
+ sizeof (struct lpt_softc),
+};
+
+DRIVER_MODULE(olpt, isa, olpt_driver, olpt_devclass, 0, 0);
static d_open_t lptopen;
static d_close_t lptclose;
@@ -316,6 +327,8 @@ static struct cdevsw lpt_cdevsw = {
/* flags */ 0,
};
+static bus_addr_t lpt_iat[] = {0, 2, 4, 6};
+
#ifndef PC98
/*
* Internal routine to lptprobe to do port tests of one byte value
@@ -385,14 +398,28 @@ lpt_port_test (int port, u_char data, u_char mask)
*/
int
-lptprobe(struct isa_device *dvp)
+lpt_probe(device_t dev)
{
#ifdef PC98
#define PC98_OLD_LPT 0x40
#define PC98_IEEE_1284_FUNCTION 0x149
- unsigned int pc98_ieee_mode, tmp;
+ int rid;
+ struct resource *res;
+
+ /* Check isapnp ids */
+ if (isa_get_vendorid(dev))
+ return ENXIO;
+
+ rid = 0;
+ res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, lpt_iat, 4,
+ RF_ACTIVE);
+ if (res == NULL)
+ return ENXIO;
+ isa_load_resourcev(res, lpt_iat, 4);
+
+ if (isa_get_port(dev) == PC98_OLD_LPT) {
+ unsigned int pc98_ieee_mode, tmp;
- if (dvp->id_iobase == PC98_OLD_LPT) {
tmp = inb(PC98_IEEE_1284_FUNCTION);
pc98_ieee_mode = tmp;
if ((tmp & 0x10) == 0x10) {
@@ -400,11 +427,15 @@ lptprobe(struct isa_device *dvp)
tmp = inb(PC98_IEEE_1284_FUNCTION);
if ((tmp & 0x10) != 0x10) {
outb(PC98_IEEE_1284_FUNCTION, pc98_ieee_mode);
- return 0;
+ bus_release_resource(dev, SYS_RES_IOPORT, rid,
+ res);
+ return ENXIO;
}
}
}
- return 8;
+
+ bus_release_resource(dev, SYS_RES_IOPORT, rid, res);
+ return 0;
#else
int port;
static short next_bios_lpt = 0;
@@ -458,15 +489,22 @@ end_probe:
/* XXX Todo - try and detect if interrupt is working */
int
-lptattach(struct isa_device *isdp)
+lpt_attach(device_t dev)
{
+ int rid, unit;
struct lpt_softc *sc;
- int unit;
- isdp->id_ointr = lptintr;
- unit = isdp->id_unit;
- sc = lpt_sc + unit;
- sc->sc_port = isdp->id_iobase;
+ unit = device_get_unit(dev);
+ sc = device_get_softc(dev);
+
+ rid = 0;
+ sc->res_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid,
+ lpt_iat, 4, RF_ACTIVE);
+ if (sc->res_port == NULL)
+ return ENXIO;
+ isa_load_resourcev(sc->res_port, lpt_iat, 4);
+
+ sc->sc_port = rman_get_start(sc->res_port);
sc->sc_primed = 0; /* not primed yet */
#ifdef PC98
outb(sc->sc_port+lpt_pstb_ctrl, LPC_DIS_PSTB); /* PSTB disable */
@@ -478,29 +516,37 @@ lptattach(struct isa_device *isdp)
outb(sc->sc_port+lpt_control, LPC_NINIT);
#endif
- /* check if we can use interrupt */
- lprintf(("oldirq %x\n", sc->sc_irq));
- if (isdp->id_irq) {
+ sc->sc_irq = 0;
+ if (isa_get_irq(dev) != -1) {
+ rid = 0;
+ sc->res_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid,
+ 0, ~0, 1, RF_ACTIVE);
+ if (sc->res_irq == NULL) {
+ bus_release_resource(dev, SYS_RES_IOPORT, 0,
+ sc->res_port);
+ return ENXIO;
+ }
+ if (bus_setup_intr(dev, sc->res_irq, INTR_TYPE_TTY, lpt_intr,
+ sc, &sc->sc_ih)) {
+ bus_release_resource(dev, SYS_RES_IOPORT, 0,
+ sc->res_port);
+ bus_release_resource(dev, SYS_RES_IRQ, 0,
+ sc->res_irq);
+ return ENXIO;
+ }
sc->sc_irq = LP_HAS_IRQ | LP_USE_IRQ | LP_ENABLE_IRQ;
- printf("lpt%d: Interrupt-driven port\n", unit);
+ device_printf(dev, "Interrupt-driven port");
#ifdef INET
lpattach(sc, unit);
#endif
- } else {
- sc->sc_irq = 0;
- lprintf(("lpt%d: Polled port\n", unit));
}
- lprintf(("irq %x\n", sc->sc_irq));
/* XXX what to do about the flags in the minor number? */
make_dev(&lpt_cdevsw, unit, UID_ROOT, GID_WHEEL, 0600, "lpt%d", unit);
make_dev(&lpt_cdevsw, unit | LP_BYPASS,
UID_ROOT, GID_WHEEL, 0600, "lpctl%d", unit);
-#ifdef LPT_DRVINIT_AT_ATTACH
- lpt_drvinit(NULL);
-#endif
- return (1);
+ return 0;
}
/*
@@ -519,10 +565,9 @@ lptopen (dev_t dev, int flags, int fmt, struct proc *p)
#else
int trys, port;
#endif
- u_int unit = LPTUNIT(minor(dev));
- sc = lpt_sc + unit;
- if ((unit >= NOLPT) || (sc->sc_port == 0))
+ sc = devclass_get_softc(olpt_devclass, LPTUNIT(minor(dev)));
+ if (sc->sc_port == 0)
return (ENXIO);
#ifdef INET
@@ -640,7 +685,7 @@ lptout (void *arg)
*/
if (sc->sc_xfercnt) {
pl = spltty();
- lptintr(sc - lpt_sc);
+ lpt_intr(sc);
splx(pl);
} else {
sc->sc_state &= ~OBUSY;
@@ -657,14 +702,18 @@ lptout (void *arg)
static int
lptclose(dev_t dev, int flags, int fmt, struct proc *p)
{
- struct lpt_softc *sc = lpt_sc + LPTUNIT(minor(dev));
+ struct lpt_softc *sc;
#ifndef PC98
- int port = sc->sc_port;
+ int port;
#endif
+ sc = devclass_get_softc(olpt_devclass, LPTUNIT(minor(dev)));
if(sc->sc_flags & LP_BYPASS)
goto end_close;
+#ifndef PC98
+ port = sc->sc_port;
+#endif
sc->sc_state &= ~OPEN;
#ifndef PC98
@@ -768,8 +817,9 @@ lptwrite(dev_t dev, struct uio * uio, int ioflag)
{
register unsigned n;
int pl, err;
- struct lpt_softc *sc = lpt_sc + LPTUNIT(minor(dev));
+ struct lpt_softc *sc;
+ sc = devclass_get_softc(olpt_devclass, LPTUNIT(minor(dev)));
if(sc->sc_flags & LP_BYPASS) {
/* we can't do writes in bypass mode */
return(EPERM);
@@ -787,7 +837,7 @@ lptwrite(dev_t dev, struct uio * uio, int ioflag)
if ((sc->sc_state & OBUSY) == 0){
lprintf(("\nC %d. ", sc->sc_xfercnt));
pl = spltty();
- lptintr(sc - lpt_sc);
+ lpt_intr(sc);
(void) splx(pl);
}
lprintf(("W "));
@@ -816,10 +866,10 @@ lptwrite(dev_t dev, struct uio * uio, int ioflag)
*/
static void
-lptintr(int unit)
+lpt_intr(void *arg)
{
#if defined(INET) || !defined(PC98)
- struct lpt_softc *sc = lpt_sc + unit;
+ struct lpt_softc *sc = arg;
#endif
#ifndef PC98
int port = sc->sc_port, sts;
@@ -887,7 +937,7 @@ lptioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
u_int unit = LPTUNIT(minor(dev));
u_char old_sc_irq; /* old printer IRQ status */
- sc = lpt_sc + unit;
+ sc = devclass_get_softc(olpt_devclass, unit);
switch (cmd) {
case LPT_IRQ :
@@ -1429,17 +1479,3 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
}
#endif /* INET */
-
-static int lpt_devsw_installed;
-
-static void lpt_drvinit(void *unused)
-{
-
- if( ! lpt_devsw_installed ) {
- cdevsw_add(&lpt_cdevsw);
- lpt_devsw_installed = 1;
- }
-}
-#ifndef LPT_DRVINIT_AT_ATTACH
-SYSINIT(lptdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,lpt_drvinit,NULL)
-#endif
diff --git a/sys/pc98/conf/GENERIC b/sys/pc98/conf/GENERIC
index 37e3131..49b3a62 100644
--- a/sys/pc98/conf/GENERIC
+++ b/sys/pc98/conf/GENERIC
@@ -151,7 +151,7 @@ device ppi # Parallel port interface device
#device vpo # Requires scbus and da
# OLD Parallel port
# Please stay olpt driver after ppc driver
-device olpt 1
+device olpt
# PCI Ethernet NICs.
device de # DEC/Intel DC21x4x (``Tulip'')
diff --git a/sys/pc98/pc98/olpt.c b/sys/pc98/pc98/olpt.c
index 4a6488c..54a4507 100644
--- a/sys/pc98/pc98/olpt.c
+++ b/sys/pc98/pc98/olpt.c
@@ -101,11 +101,9 @@
* Poul-Henning Kamp <phk@freebsd.org>
*/
-#include "olpt.h"
#include "opt_inet.h"
#ifdef PC98
#undef INET /* PLIP is not supported for old PC-98 */
-#define LPT_DRVINIT_AT_ATTACH /* avoid conflicting with lpt on ppbus */
#endif
#include <sys/param.h>
@@ -118,7 +116,13 @@
#include <sys/uio.h>
#include <sys/syslog.h>
-#include <i386/isa/isa_device.h>
+#include <machine/clock.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <isa/isavar.h>
+
#include <i386/isa/lptreg.h>
#include <dev/ppbus/lptio.h>
@@ -136,10 +140,6 @@
#include <net/bpf.h>
#endif /* INET */
-#ifndef COMPAT_OLDISA
-#error "The olpt device requires the old isa compatibility shims"
-#endif
-
#define LPINITRDY 4 /* wait up to 4 seconds for a ready */
#define LPTOUTINITIAL 10 /* initial timeout to wait for ready 1/10 s */
#define LPTOUTMAX 1 /* maximal timeout 1 s */
@@ -198,7 +198,11 @@ static int volatile lptflag = 1;
#define LPTUNIT(s) ((s)&0x03)
#define LPTFLAGS(s) ((s)&0xfc)
-static struct lpt_softc {
+struct lpt_softc {
+ struct resource *res_port;
+ struct resource *res_irq;
+ void *sc_ih;
+
int sc_port;
short sc_state;
/* default case: negative prime, negative ack, handshake strobe,
@@ -226,7 +230,7 @@ static struct lpt_softc {
u_char *sc_ifbuf;
int sc_iferrs;
#endif
-} lpt_sc[NOLPT] ;
+};
/* bits for state */
#define OPEN (1<<0) /* device is open */
@@ -257,10 +261,9 @@ static struct lpt_softc {
#define MAX_SPIN 20 /* Max delay for device ready in usecs */
static timeout_t lptout;
-static int lptprobe (struct isa_device *dvp);
-static int lptattach (struct isa_device *isdp);
-static ointhand2_t lptintr;
-static void lpt_drvinit(void *unused);
+static int lpt_probe(device_t);
+static int lpt_attach(device_t);
+static void lpt_intr(void *);
#ifdef INET
@@ -286,13 +289,21 @@ static int lpoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
static void lpintr(int);
#endif /* INET */
-struct isa_driver olptdriver = {
- INTR_TYPE_TTY,
- lptprobe,
- lptattach,
- "olpt"
+static devclass_t olpt_devclass;
+
+static device_method_t olpt_methods[] = {
+ DEVMETHOD(device_probe, lpt_probe),
+ DEVMETHOD(device_attach, lpt_attach),
+ { 0, 0 }
};
-COMPAT_ISA_DRIVER(olpt, olptdriver);
+
+static driver_t olpt_driver = {
+ "olpt",
+ olpt_methods,
+ sizeof (struct lpt_softc),
+};
+
+DRIVER_MODULE(olpt, isa, olpt_driver, olpt_devclass, 0, 0);
static d_open_t lptopen;
static d_close_t lptclose;
@@ -316,6 +327,8 @@ static struct cdevsw lpt_cdevsw = {
/* flags */ 0,
};
+static bus_addr_t lpt_iat[] = {0, 2, 4, 6};
+
#ifndef PC98
/*
* Internal routine to lptprobe to do port tests of one byte value
@@ -385,14 +398,28 @@ lpt_port_test (int port, u_char data, u_char mask)
*/
int
-lptprobe(struct isa_device *dvp)
+lpt_probe(device_t dev)
{
#ifdef PC98
#define PC98_OLD_LPT 0x40
#define PC98_IEEE_1284_FUNCTION 0x149
- unsigned int pc98_ieee_mode, tmp;
+ int rid;
+ struct resource *res;
+
+ /* Check isapnp ids */
+ if (isa_get_vendorid(dev))
+ return ENXIO;
+
+ rid = 0;
+ res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, lpt_iat, 4,
+ RF_ACTIVE);
+ if (res == NULL)
+ return ENXIO;
+ isa_load_resourcev(res, lpt_iat, 4);
+
+ if (isa_get_port(dev) == PC98_OLD_LPT) {
+ unsigned int pc98_ieee_mode, tmp;
- if (dvp->id_iobase == PC98_OLD_LPT) {
tmp = inb(PC98_IEEE_1284_FUNCTION);
pc98_ieee_mode = tmp;
if ((tmp & 0x10) == 0x10) {
@@ -400,11 +427,15 @@ lptprobe(struct isa_device *dvp)
tmp = inb(PC98_IEEE_1284_FUNCTION);
if ((tmp & 0x10) != 0x10) {
outb(PC98_IEEE_1284_FUNCTION, pc98_ieee_mode);
- return 0;
+ bus_release_resource(dev, SYS_RES_IOPORT, rid,
+ res);
+ return ENXIO;
}
}
}
- return 8;
+
+ bus_release_resource(dev, SYS_RES_IOPORT, rid, res);
+ return 0;
#else
int port;
static short next_bios_lpt = 0;
@@ -458,15 +489,22 @@ end_probe:
/* XXX Todo - try and detect if interrupt is working */
int
-lptattach(struct isa_device *isdp)
+lpt_attach(device_t dev)
{
+ int rid, unit;
struct lpt_softc *sc;
- int unit;
- isdp->id_ointr = lptintr;
- unit = isdp->id_unit;
- sc = lpt_sc + unit;
- sc->sc_port = isdp->id_iobase;
+ unit = device_get_unit(dev);
+ sc = device_get_softc(dev);
+
+ rid = 0;
+ sc->res_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid,
+ lpt_iat, 4, RF_ACTIVE);
+ if (sc->res_port == NULL)
+ return ENXIO;
+ isa_load_resourcev(sc->res_port, lpt_iat, 4);
+
+ sc->sc_port = rman_get_start(sc->res_port);
sc->sc_primed = 0; /* not primed yet */
#ifdef PC98
outb(sc->sc_port+lpt_pstb_ctrl, LPC_DIS_PSTB); /* PSTB disable */
@@ -478,29 +516,37 @@ lptattach(struct isa_device *isdp)
outb(sc->sc_port+lpt_control, LPC_NINIT);
#endif
- /* check if we can use interrupt */
- lprintf(("oldirq %x\n", sc->sc_irq));
- if (isdp->id_irq) {
+ sc->sc_irq = 0;
+ if (isa_get_irq(dev) != -1) {
+ rid = 0;
+ sc->res_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid,
+ 0, ~0, 1, RF_ACTIVE);
+ if (sc->res_irq == NULL) {
+ bus_release_resource(dev, SYS_RES_IOPORT, 0,
+ sc->res_port);
+ return ENXIO;
+ }
+ if (bus_setup_intr(dev, sc->res_irq, INTR_TYPE_TTY, lpt_intr,
+ sc, &sc->sc_ih)) {
+ bus_release_resource(dev, SYS_RES_IOPORT, 0,
+ sc->res_port);
+ bus_release_resource(dev, SYS_RES_IRQ, 0,
+ sc->res_irq);
+ return ENXIO;
+ }
sc->sc_irq = LP_HAS_IRQ | LP_USE_IRQ | LP_ENABLE_IRQ;
- printf("lpt%d: Interrupt-driven port\n", unit);
+ device_printf(dev, "Interrupt-driven port");
#ifdef INET
lpattach(sc, unit);
#endif
- } else {
- sc->sc_irq = 0;
- lprintf(("lpt%d: Polled port\n", unit));
}
- lprintf(("irq %x\n", sc->sc_irq));
/* XXX what to do about the flags in the minor number? */
make_dev(&lpt_cdevsw, unit, UID_ROOT, GID_WHEEL, 0600, "lpt%d", unit);
make_dev(&lpt_cdevsw, unit | LP_BYPASS,
UID_ROOT, GID_WHEEL, 0600, "lpctl%d", unit);
-#ifdef LPT_DRVINIT_AT_ATTACH
- lpt_drvinit(NULL);
-#endif
- return (1);
+ return 0;
}
/*
@@ -519,10 +565,9 @@ lptopen (dev_t dev, int flags, int fmt, struct proc *p)
#else
int trys, port;
#endif
- u_int unit = LPTUNIT(minor(dev));
- sc = lpt_sc + unit;
- if ((unit >= NOLPT) || (sc->sc_port == 0))
+ sc = devclass_get_softc(olpt_devclass, LPTUNIT(minor(dev)));
+ if (sc->sc_port == 0)
return (ENXIO);
#ifdef INET
@@ -640,7 +685,7 @@ lptout (void *arg)
*/
if (sc->sc_xfercnt) {
pl = spltty();
- lptintr(sc - lpt_sc);
+ lpt_intr(sc);
splx(pl);
} else {
sc->sc_state &= ~OBUSY;
@@ -657,14 +702,18 @@ lptout (void *arg)
static int
lptclose(dev_t dev, int flags, int fmt, struct proc *p)
{
- struct lpt_softc *sc = lpt_sc + LPTUNIT(minor(dev));
+ struct lpt_softc *sc;
#ifndef PC98
- int port = sc->sc_port;
+ int port;
#endif
+ sc = devclass_get_softc(olpt_devclass, LPTUNIT(minor(dev)));
if(sc->sc_flags & LP_BYPASS)
goto end_close;
+#ifndef PC98
+ port = sc->sc_port;
+#endif
sc->sc_state &= ~OPEN;
#ifndef PC98
@@ -768,8 +817,9 @@ lptwrite(dev_t dev, struct uio * uio, int ioflag)
{
register unsigned n;
int pl, err;
- struct lpt_softc *sc = lpt_sc + LPTUNIT(minor(dev));
+ struct lpt_softc *sc;
+ sc = devclass_get_softc(olpt_devclass, LPTUNIT(minor(dev)));
if(sc->sc_flags & LP_BYPASS) {
/* we can't do writes in bypass mode */
return(EPERM);
@@ -787,7 +837,7 @@ lptwrite(dev_t dev, struct uio * uio, int ioflag)
if ((sc->sc_state & OBUSY) == 0){
lprintf(("\nC %d. ", sc->sc_xfercnt));
pl = spltty();
- lptintr(sc - lpt_sc);
+ lpt_intr(sc);
(void) splx(pl);
}
lprintf(("W "));
@@ -816,10 +866,10 @@ lptwrite(dev_t dev, struct uio * uio, int ioflag)
*/
static void
-lptintr(int unit)
+lpt_intr(void *arg)
{
#if defined(INET) || !defined(PC98)
- struct lpt_softc *sc = lpt_sc + unit;
+ struct lpt_softc *sc = arg;
#endif
#ifndef PC98
int port = sc->sc_port, sts;
@@ -887,7 +937,7 @@ lptioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
u_int unit = LPTUNIT(minor(dev));
u_char old_sc_irq; /* old printer IRQ status */
- sc = lpt_sc + unit;
+ sc = devclass_get_softc(olpt_devclass, unit);
switch (cmd) {
case LPT_IRQ :
@@ -1429,17 +1479,3 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
}
#endif /* INET */
-
-static int lpt_devsw_installed;
-
-static void lpt_drvinit(void *unused)
-{
-
- if( ! lpt_devsw_installed ) {
- cdevsw_add(&lpt_cdevsw);
- lpt_devsw_installed = 1;
- }
-}
-#ifndef LPT_DRVINIT_AT_ATTACH
-SYSINIT(lptdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,lpt_drvinit,NULL)
-#endif
OpenPOWER on IntegriCloud