From 9a7f910b84a288607a13bec11d392a5d746a52a4 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Sun, 29 Aug 1999 13:29:29 +0000 Subject: [PATCH] Convert to use the new "disk" layer. A few cleanups while here. --- sys/contrib/dev/fla/fla.c | 184 ++++++++++++++++---------------------- 1 file changed, 78 insertions(+), 106 deletions(-) diff --git a/sys/contrib/dev/fla/fla.c b/sys/contrib/dev/fla/fla.c index b6439dd5962d..928a98f136c6 100644 --- a/sys/contrib/dev/fla/fla.c +++ b/sys/contrib/dev/fla/fla.c @@ -17,8 +17,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -36,6 +35,11 @@ #ifdef SMP #include +#define LEAVE() rel_mplock(); +#define ENTER() get_mplock(); +#else +#define LEAVE() +#define ENTER() #endif #include @@ -52,7 +56,6 @@ static d_strategy_t flastrategy; static d_open_t flaopen; static d_close_t flaclose; static d_ioctl_t flaioctl; -static d_psize_t flapsize; static struct cdevsw fla_cdevsw = { /* open */ flaopen, @@ -70,7 +73,7 @@ static struct cdevsw fla_cdevsw = { /* parms */ noparms, /* maj */ CDEV_MAJOR, /* dump */ nodump, - /* psize */ flapsize, + /* psize */ nopsize, /* flags */ D_DISK | D_CANFREE, /* maxio */ 0, /* bmaj */ BDEV_MAJOR @@ -115,73 +118,76 @@ doc2k_memset(void *dst, int c, unsigned len) } static struct fla_s { + int busy; + int unit; unsigned nsect; struct doc2k_stat ds; struct diskslices *dk_slices; struct buf_queue_head buf_queue; struct devstat stats; - int busy; + struct disk disk; + dev_t dev; } softc[NFLA]; static int flaopen(dev_t dev, int flag, int fmt, struct proc *p) { - int unit; struct fla_s *sc; int error; - struct disklabel dk_dd; + struct disklabel *dl; if (fla_debug) - printf("flaopen(%x %x %x %p)\n", - dev2udev(dev), flag, fmt, p); - unit = dkunit(dev); - if (unit >= NFLA) - return (ENXIO); - sc = &softc[unit]; - if (!sc->nsect) - return (ENXIO); - bzero(&dk_dd, sizeof(dk_dd)); - error = doc2k_size(unit, &dk_dd.d_secperunit, - &dk_dd.d_ncylinders, &dk_dd.d_ntracks, &dk_dd.d_nsectors); - dk_dd.d_secsize = DEV_BSIZE; - dk_dd.d_secpercyl = dk_dd.d_ntracks * dk_dd.d_nsectors; + printf("flaopen(%s %x %x %p)\n", + devtoname(dev), flag, fmt, p); + + sc = dev->si_drv1; + + error = doc2k_open(sc->unit); + + if (error) { + printf("doc2k_open(%d) -> err %d\n", sc->unit, error); + return (EIO); + } + + dl = &sc->disk.d_label; + bzero(dl, sizeof(*dl)); + error = doc2k_size(sc->unit, &dl->d_secperunit, + &dl->d_ncylinders, &dl->d_ntracks, &dl->d_nsectors); + dl->d_secsize = DEV_BSIZE; + dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors; /* XXX */ - error = dsopen(dev, fmt, 0, &sc->dk_slices, &dk_dd); - if (error) - return (error); return (0); } static int flaclose(dev_t dev, int flags, int fmt, struct proc *p) { - int unit; + int error; struct fla_s *sc; if (fla_debug) - printf("flaclose(%x %x %x %p)\n", - dev2udev(dev), flags, fmt, p); - unit = dkunit(dev); - sc = &softc[unit]; - dsclose(dev, fmt, sc->dk_slices); + printf("flaclose(%s %x %x %p)\n", + devtoname(dev), flags, fmt, p); + + sc = dev->si_drv1; + + error = doc2k_close(sc->unit); + if (error) { + printf("doc2k_close(%d) -> err %d\n", sc->unit, error); + return (EIO); + } return (0); } static int flaioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p) { - int unit, error; - struct fla_s *sc; if (fla_debug) - printf("flaioctl(%x %lx %p %x %p)\n", - dev2udev(dev), cmd, addr, flags, p); - unit = dkunit(dev); - sc = &softc[unit]; - error = dsioctl(dev, cmd, addr, flags, &sc->dk_slices); - if (error == ENOIOCTL) - error = ENOTTY; - return (error); + printf("flaioctl(%s %lx %p %x %p)\n", + devtoname(dev), cmd, addr, flags, p); + + return (ENOIOCTL); } static void @@ -194,16 +200,11 @@ flastrategy(struct buf *bp) devstat_trans_flags dop; if (fla_debug > 1) - printf("flastrategy(%p) %x %lx, %d, %ld, %p)\n", - bp, dev2udev(bp->b_dev), bp->b_flags, bp->b_blkno, - bp->b_bcount / DEV_BSIZE, bp->b_data); - unit = dkunit(bp->b_dev); - sc = &softc[unit]; + printf("flastrategy(%p) %s %lx, %d, %ld, %p)\n", + bp, devtoname(bp->b_dev), bp->b_flags, bp->b_blkno, + bp->b_bcount / DEV_BSIZE, bp->b_data); - if (dscheck(bp, sc->dk_slices) <= 0) { - biodone(bp); - return; - } + sc = bp->b_dev->si_drv1; s = splbio(); @@ -234,14 +235,13 @@ flastrategy(struct buf *bp) what = DOC2K_READ, dop = DEVSTAT_READ; else what = DOC2K_WRITE, dop = DEVSTAT_WRITE; -#ifdef SMP - rel_mplock(); -#endif + + LEAVE(); + error = doc2k_rwe( unit, what, bp->b_pblkno, bp->b_bcount / DEV_BSIZE, bp->b_data); -#ifdef SMP - get_mplock(); -#endif + + ENTER(); if (fla_debug > 1 || error) { printf("fla%d: %d = rwe(%p, %d, %d, %d, %ld, %p)\n", @@ -266,27 +266,14 @@ flastrategy(struct buf *bp) } static int -flapsize(dev_t dev) +flaprobe (device_t dev) { int unit; struct fla_s *sc; - - if (fla_debug) - printf("flapsize(%x)\n", dev2udev(dev)); - unit = dkunit(dev); - sc = &softc[unit]; - if (!sc->nsect) - return 0; - - return (dssize(dev, &sc->dk_slices)); -} - -static int -flarealprobe(int unit) -{ - struct fla_s *sc; + device_t bus; int i; + unit = device_get_unit(dev); sc = &softc[unit]; /* This is slightly ugly */ @@ -298,16 +285,22 @@ flarealprobe(int unit) if (i) return (ENXIO); + bus = device_get_parent(dev); + ISA_SET_RESOURCE(bus, dev, SYS_RES_MEMORY, 0, + sc->ds.window - KERNBASE, 8192); + return (0); } - static int -flarealattach(int unit) +flaattach (device_t dev) { + int unit; int i, j, k, l, m, error; struct fla_s *sc; + unit = device_get_unit(dev); + sc = &softc[unit]; error = doc2k_open(unit); @@ -323,6 +316,12 @@ flarealattach(int unit) } printf("fla%d: <%s %s>\n", unit, sc->ds.product, sc->ds.model); + + error = doc2k_close(unit); + if (error) { + printf("doc2k_close(%d) -> err %d\n", unit, error); + return (EIO); + } m = 1024L * 1024L / DEV_BSIZE; l = (sc->nsect * 10 + m/2) / m; @@ -338,42 +337,15 @@ flarealattach(int unit) bufq_init(&sc->buf_queue); - return (0); -} - -static int -flaprobe (device_t dev) -{ - int unit; - struct fla_s *sc; - device_t bus; - int i; - - unit = device_get_unit(dev); - sc = &softc[unit]; - i = flarealprobe(unit); - if (i) - return (i); - - bus = device_get_parent(dev); - ISA_SET_RESOURCE(bus, dev, SYS_RES_MEMORY, 0, - sc->ds.window - KERNBASE, 8192); - - return (0); -} - - -static int -flaattach (device_t dev) -{ - int unit, i; - - unit = device_get_unit(dev); - i = flarealattach(unit); devstat_add_entry(&softc[unit].stats, "fla", unit, DEV_BSIZE, DEVSTAT_NO_ORDERED_TAGS, DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER, 0x190); - return (i); + + sc->dev = disk_create(unit, &sc->disk, &fla_cdevsw); + sc->dev->si_drv1 = sc; + sc->unit = unit; + + return (0); } static device_method_t fla_methods[] = { @@ -391,4 +363,4 @@ static driver_t fladriver = { static devclass_t fla_devclass; -DEV_DRIVER_MODULE(fla, isa, fladriver, fla_devclass, fla_cdevsw, 0, 0); +DRIVER_MODULE(fla, isa, fladriver, fla_devclass, 0, 0);