From: Matthew Dillon Date: Fri, 28 Jul 2006 02:17:41 +0000 (+0000) Subject: MASSIVE reorganization of the device operations vector. Change cdevsw X-Git-Tag: v2.0.1~4619 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/fef8985e09e16aeee4a2014876e2e4b758656ac2 MASSIVE reorganization of the device operations vector. Change cdevsw to dev_ops. dev_ops is a syslink-compatible operations vector structure similar to the vop_ops structure used by vnodes. Remove a huge number of instances where a thread pointer is still being passed as an argument to various device ops and other related routines. The device OPEN and IOCTL calls now take a ucred instead of a thread pointer, and the CLOSE call no longer takes a thread pointer. --- diff --git a/sys/bus/cam/cam_xpt.c b/sys/bus/cam/cam_xpt.c index 44c18b9430..e92c3b75a9 100644 --- a/sys/bus/cam/cam_xpt.c +++ b/sys/bus/cam/cam_xpt.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/cam_xpt.c,v 1.80.2.18 2002/12/09 17:31:55 gibbs Exp $ - * $DragonFly: src/sys/bus/cam/cam_xpt.c,v 1.28 2006/01/22 14:03:51 swildner Exp $ + * $DragonFly: src/sys/bus/cam/cam_xpt.c,v 1.29 2006/07/28 02:17:31 dillon Exp $ */ #include #include @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -601,23 +602,11 @@ static d_open_t xptopen; static d_close_t xptclose; static d_ioctl_t xptioctl; -static struct cdevsw xpt_cdevsw = { - /* name */ "xpt", - /* maj */ XPT_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ xptopen, - /* close */ xptclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ xptioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops xpt_ops = { + { "xpt", XPT_CDEV_MAJOR, 0 }, + .d_open = xptopen, + .d_close = xptclose, + .d_ioctl = xptioctl }; static struct intr_config_hook *xpt_config_hook; @@ -877,8 +866,8 @@ dev_allocq_is_runnable(struct cam_devq *devq) static void xpt_periph_init(void) { - cdevsw_add(&xpt_cdevsw, 0, 0); - make_dev(&xpt_cdevsw, 0, UID_ROOT, GID_OPERATOR, 0600, "xpt0"); + dev_ops_add(&xpt_ops, 0, 0); + make_dev(&xpt_ops, 0, UID_ROOT, GID_OPERATOR, 0600, "xpt0"); } static void @@ -895,8 +884,9 @@ xptdone(struct cam_periph *periph, union ccb *done_ccb) } static int -xptopen(dev_t dev, int flags, int fmt, struct thread *td) +xptopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; unit = minor(dev) & 0xff; @@ -904,13 +894,13 @@ xptopen(dev_t dev, int flags, int fmt, struct thread *td) /* * Only allow read-write access. */ - if (((flags & FWRITE) == 0) || ((flags & FREAD) == 0)) + if (((ap->a_oflags & FWRITE) == 0) || ((ap->a_oflags & FREAD) == 0)) return(EPERM); /* * We don't allow nonblocking access. */ - if ((flags & O_NONBLOCK) != 0) { + if ((ap->a_oflags & O_NONBLOCK) != 0) { printf("xpt%d: can't do nonblocking access\n", unit); return(ENODEV); } @@ -932,8 +922,9 @@ xptopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -xptclose(dev_t dev, int flag, int fmt, struct thread *td) +xptclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; unit = minor(dev) & 0xff; @@ -955,8 +946,9 @@ xptclose(dev_t dev, int flag, int fmt, struct thread *td) } static int -xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +xptioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit, error; error = 0; @@ -972,7 +964,7 @@ xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) return(ENXIO); } - switch(cmd) { + switch(ap->a_cmd) { /* * For the transport layer CAMIOCOMMAND ioctl, we really only want * to accept CCB types that don't quite make sense to send through a @@ -982,7 +974,7 @@ xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) union ccb *ccb; union ccb *inccb; - inccb = (union ccb *)addr; + inccb = (union ccb *)ap->a_data; switch(inccb->ccb_h.func_code) { case XPT_SCAN_BUS: @@ -1139,7 +1131,7 @@ xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) int base_periph_found; int splbreaknum; - ccb = (union ccb *)addr; + ccb = (union ccb *)ap->a_data; unit = ccb->cgdl.unit_number; name = ccb->cgdl.periph_name; /* @@ -1152,7 +1144,7 @@ xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) */ splbreaknum = 100; - ccb = (union ccb *)addr; + ccb = (union ccb *)ap->a_data; base_periph_found = 0; diff --git a/sys/bus/cam/scsi/scsi_cd.c b/sys/bus/cam/scsi/scsi_cd.c index 0bb3f19c55..87c519a2af 100644 --- a/sys/bus/cam/scsi/scsi_cd.c +++ b/sys/bus/cam/scsi/scsi_cd.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/scsi/scsi_cd.c,v 1.31.2.16 2003/10/21 22:26:11 thomas Exp $ - * $DragonFly: src/sys/bus/cam/scsi/scsi_cd.c,v 1.22 2006/04/30 17:22:15 dillon Exp $ + * $DragonFly: src/sys/bus/cam/scsi/scsi_cd.c,v 1.23 2006/07/28 02:17:32 dillon Exp $ */ /* * Portions of this driver taken from the original FreeBSD cd driver. @@ -298,23 +298,14 @@ DATA_SET(periphdriver_set, cddriver); #ifndef D_DISK #define D_DISK 0 #endif -static struct cdevsw cd_cdevsw = { - /* name */ "cd", - /* maj */ SCSICD_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ cdopen, - /* close */ cdclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ cdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ cdstrategy, - /* dump */ nodump, - /* psize */ nopsize, +static struct dev_ops cd_ops = { + { "cd", SCSICD_CDEV_MAJOR, D_DISK }, + .d_open = cdopen, + .d_close = cdclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = cdioctl, + .d_strategy = cdstrategy }; static struct extend_array *cdperiphs; @@ -777,7 +768,7 @@ cdregister(struct cam_periph *periph, void *arg) DEVSTAT_TYPE_CDROM | DEVSTAT_TYPE_IF_SCSI, DEVSTAT_PRIORITY_CD); disk_create(periph->unit_number, &softc->disk, - DSO_ONESLICE | DSO_COMPATLABEL, &cd_cdevsw); + DSO_ONESLICE | DSO_COMPATLABEL, &cd_ops); /* * Add an async callback so that we get @@ -1005,8 +996,9 @@ cdregisterexit: } static int -cdopen(dev_t dev, int flags, int fmt, struct thread *td) +cdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct cd_softc *softc; int unit, error; @@ -1060,8 +1052,9 @@ cdopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -cdclose(dev_t dev, int flag, int fmt, struct thread *td) +cdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct cd_softc *softc; int unit, error; @@ -1432,9 +1425,11 @@ cdgetccb(struct cam_periph *periph, u_int32_t priority) * can understand. The transfer is described by a buf and will include * only one physical transfer. */ -static void -cdstrategy(dev_t dev, struct bio *bio) +static int +cdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct cam_periph *periph; struct cd_softc *softc; @@ -1499,7 +1494,7 @@ cdstrategy(dev_t dev, struct bio *bio) else cdschedule(periph, /* priority */ 1); - return; + return(0); bad: bp->b_flags |= B_ERROR; /* @@ -1507,6 +1502,7 @@ bad: */ bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } static void @@ -1927,9 +1923,10 @@ cdgetpagesize(int page_num) } static int -cdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +cdioctl(struct dev_ioctl_args *ap) { - + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; struct cam_periph *periph; struct cd_softc *softc; int error, unit; @@ -1945,7 +1942,7 @@ cdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) softc = (struct cd_softc *)periph->softc; CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, - ("trying to do ioctl %#lx\n", cmd)); + ("trying to do ioctl %#lx\n", ap->a_cmd)); error = cam_periph_lock(periph, PCATCH); @@ -1957,8 +1954,8 @@ cdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) * have media loaded, we can only do a load or eject. */ if (((softc->flags & CD_FLAG_VALID_MEDIA) == 0) - && ((cmd != CDIOCCLOSE) - && (cmd != CDIOCEJECT))) { + && ((ap->a_cmd != CDIOCCLOSE) + && (ap->a_cmd != CDIOCEJECT))) { error = cdcheckmedia(periph); if (error != 0) { cam_periph_unlock(periph); @@ -1966,12 +1963,12 @@ cdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) } } - switch (cmd) { + switch (ap->a_cmd) { case CDIOCPLAYTRACKS: { struct ioc_play_track *args - = (struct ioc_play_track *) addr; + = (struct ioc_play_track *)addr; struct cd_mode_params params; union cd_pages *page; @@ -2685,7 +2682,7 @@ cdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) authinfo = (struct dvd_authinfo *)addr; - if (cmd == DVDIOCREPORTKEY) + if (ap->a_cmd == DVDIOCREPORTKEY) error = cdreportkey(periph, authinfo); else error = cdsendkey(periph, authinfo); @@ -2701,7 +2698,7 @@ cdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) break; } default: - error = cam_periph_ioctl(periph, cmd, addr, cderror); + error = cam_periph_ioctl(periph, ap->a_cmd, addr, cderror); break; } diff --git a/sys/bus/cam/scsi/scsi_ch.c b/sys/bus/cam/scsi/scsi_ch.c index e72ad5e7bd..523cadd990 100644 --- a/sys/bus/cam/scsi/scsi_ch.c +++ b/sys/bus/cam/scsi/scsi_ch.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/scsi/scsi_ch.c,v 1.20.2.2 2000/10/31 08:09:49 dwmalone Exp $ - * $DragonFly: src/sys/bus/cam/scsi/scsi_ch.c,v 1.13 2006/02/17 19:17:42 dillon Exp $ + * $DragonFly: src/sys/bus/cam/scsi/scsi_ch.c,v 1.14 2006/07/28 02:17:32 dillon Exp $ */ /* * Derived from the NetBSD SCSI changer driver. @@ -215,23 +215,11 @@ static struct periph_driver chdriver = DATA_SET(periphdriver_set, chdriver); -static struct cdevsw ch_cdevsw = { - /* name */ "ch", - /* maj */ CH_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ chopen, - /* close */ chclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ chioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ch_ops = { + { "ch", CH_CDEV_MAJOR, 0 }, + .d_open = chopen, + .d_close = chclose, + .d_ioctl = chioctl }; static struct extend_array *chperiphs; @@ -314,7 +302,7 @@ chcleanup(struct cam_periph *periph) cam_extend_release(chperiphs, periph->unit_number); xpt_print_path(periph->path); printf("removing device entry\n"); - cdevsw_remove(&ch_cdevsw, -1, periph->unit_number); + dev_ops_remove(&ch_ops, -1, periph->unit_number); free(softc, M_DEVBUF); } @@ -395,8 +383,8 @@ chregister(struct cam_periph *periph, void *arg) DEVSTAT_PRIORITY_OTHER); /* Register the device */ - cdevsw_add(&ch_cdevsw, -1, periph->unit_number); - make_dev(&ch_cdevsw, periph->unit_number, UID_ROOT, + dev_ops_add(&ch_ops, -1, periph->unit_number); + make_dev(&ch_ops, periph->unit_number, UID_ROOT, GID_OPERATOR, 0600, "%s%d", periph->periph_name, periph->unit_number); @@ -422,8 +410,9 @@ chregister(struct cam_periph *periph, void *arg) } static int -chopen(dev_t dev, int flags, int fmt, struct thread *td) +chopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct ch_softc *softc; int unit, error; @@ -471,8 +460,9 @@ chopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -chclose(dev_t dev, int flag, int fmt, struct thread *td) +chclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct ch_softc *softc; int unit, error; @@ -712,8 +702,11 @@ cherror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags) } static int -chioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +chioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; + int flag = ap->a_fflag; struct cam_periph *periph; struct ch_softc *softc; u_int8_t unit; @@ -732,13 +725,13 @@ chioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) error = 0; CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, - ("trying to do ioctl %#lx\n", cmd)); + ("trying to do ioctl %#lx\n", ap->a_cmd)); /* * If this command can change the device's state, we must * have the device open for writing. */ - switch (cmd) { + switch (ap->a_cmd) { case CHIOGPICKER: case CHIOGPARAMS: case CHIOGSTATUS: @@ -749,7 +742,7 @@ chioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) return (EBADF); } - switch (cmd) { + switch (ap->a_cmd) { case CHIOMOVE: error = chmove(periph, (struct changer_move *)addr); break; @@ -806,7 +799,7 @@ chioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) /* Implement prevent/allow? */ default: - error = cam_periph_ioctl(periph, cmd, addr, cherror); + error = cam_periph_ioctl(periph, ap->a_cmd, addr, cherror); break; } diff --git a/sys/bus/cam/scsi/scsi_da.c b/sys/bus/cam/scsi/scsi_da.c index cef1523cc2..7dff480258 100644 --- a/sys/bus/cam/scsi/scsi_da.c +++ b/sys/bus/cam/scsi/scsi_da.c @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/scsi/scsi_da.c,v 1.42.2.46 2003/10/21 22:18:19 thomas Exp $ - * $DragonFly: src/sys/bus/cam/scsi/scsi_da.c,v 1.29 2006/04/30 17:22:15 dillon Exp $ + * $DragonFly: src/sys/bus/cam/scsi/scsi_da.c,v 1.30 2006/07/28 02:17:32 dillon Exp $ */ #ifdef _KERNEL @@ -498,31 +498,24 @@ DATA_SET(periphdriver_set, dadriver); #define D_DISK 0 #endif -static struct cdevsw da_cdevsw = { - /* name */ "da", - /* maj */ DA_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ daopen, - /* close */ daclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ daioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ dastrategy, - /* dump */ dadump, - /* psize */ nopsize +static struct dev_ops da_ops = { + { "da", DA_CDEV_MAJOR, D_DISK }, + .d_open = daopen, + .d_close = daclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = daioctl, + .d_strategy = dastrategy, + .d_dump = dadump }; static SLIST_HEAD(,da_softc) softc_list; static struct extend_array *daperiphs; static int -daopen(dev_t dev, int flags, int fmt, struct thread *td) +daopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct da_softc *softc; struct disklabel *label; @@ -645,8 +638,9 @@ daopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -daclose(dev_t dev, int flag, int fmt, struct thread *td) +daclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct da_softc *softc; int unit; @@ -735,9 +729,11 @@ daclose(dev_t dev, int flag, int fmt, struct thread *td) * can understand. The transfer is described by a buf and will include * only one physical transfer. */ -static void -dastrategy(dev_t dev, struct bio *bio) +static int +dastrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct cam_periph *periph; struct da_softc *softc; @@ -787,7 +783,7 @@ dastrategy(dev_t dev, struct bio *bio) */ xpt_schedule(periph, /* XXX priority */1); - return; + return(0); bad: bp->b_flags |= B_ERROR; @@ -796,6 +792,7 @@ bad: */ bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } /* For 2.2-stable support */ @@ -804,8 +801,9 @@ bad: #endif static int -daioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +daioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct da_softc *softc; int unit; @@ -824,7 +822,7 @@ daioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) return (error); /* error code from tsleep */ } - error = cam_periph_ioctl(periph, cmd, addr, daerror); + error = cam_periph_ioctl(periph, ap->a_cmd, ap->a_data, daerror); cam_periph_unlock(periph); @@ -832,8 +830,9 @@ daioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) } static int -dadump(dev_t dev, u_int num, u_int blknum, u_int secsize) +dadump(struct dev_dump_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct da_softc *softc; u_int unit; @@ -858,13 +857,13 @@ dadump(dev_t dev, u_int num, u_int blknum, u_int secsize) return (ENXIO); addr = 0; /* starting address */ - blkcnt = howmany(PAGE_SIZE, secsize); + blkcnt = howmany(PAGE_SIZE, ap->a_secsize); - while (num > 0) { + while (ap->a_count > 0) { caddr_t va = NULL; - if ((num / blkcnt) < dumppages) - dumppages = num / blkcnt; + if ((ap->a_count / blkcnt) < dumppages) + dumppages = ap->a_count / blkcnt; for (i = 0; i < dumppages; ++i) { vm_paddr_t a = addr + (i * PAGE_SIZE); @@ -883,10 +882,10 @@ dadump(dev_t dev, u_int num, u_int blknum, u_int secsize) /*read*/FALSE, /*byte2*/0, /*minimum_cmd_size*/ softc->minimum_cmd_size, - blknum, + ap->a_blkno, blkcnt * dumppages, /*data_ptr*/(u_int8_t *) va, - /*dxfer_len*/blkcnt * secsize * dumppages, + /*dxfer_len*/blkcnt * ap->a_secsize * dumppages, /*sense_len*/SSD_FULL_SIZE, DA_DEFAULT_TIMEOUT * 1000); xpt_polled_action((union ccb *)&csio); @@ -902,12 +901,12 @@ dadump(dev_t dev, u_int num, u_int blknum, u_int secsize) return(EIO); } - if (dumpstatus(addr, (off_t)num * softc->params.secsize) < 0) + if (dumpstatus(addr, (off_t)ap->a_count * softc->params.secsize) < 0) return (EINTR); /* update block count */ - num -= blkcnt * dumppages; - blknum += blkcnt * dumppages; + ap->a_count -= blkcnt * dumppages; + ap->a_blkno += blkcnt * dumppages; addr += PAGE_SIZE * dumppages; } @@ -1318,7 +1317,7 @@ daregister(struct cam_periph *periph, void *arg) /* * Register this media as a disk */ - disk_create(periph->unit_number, &softc->disk, 0, &da_cdevsw); + disk_create(periph->unit_number, &softc->disk, 0, &da_ops); /* * Add async callbacks for bus reset and diff --git a/sys/bus/cam/scsi/scsi_pass.c b/sys/bus/cam/scsi/scsi_pass.c index 6a485127b1..aab8af0281 100644 --- a/sys/bus/cam/scsi/scsi_pass.c +++ b/sys/bus/cam/scsi/scsi_pass.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/scsi/scsi_pass.c,v 1.19 2000/01/17 06:27:37 mjacob Exp $ - * $DragonFly: src/sys/bus/cam/scsi/scsi_pass.c,v 1.15 2006/03/24 18:35:27 dillon Exp $ + * $DragonFly: src/sys/bus/cam/scsi/scsi_pass.c,v 1.16 2006/07/28 02:17:32 dillon Exp $ */ #include @@ -113,23 +113,14 @@ static struct periph_driver passdriver = DATA_SET(periphdriver_set, passdriver); -static struct cdevsw pass_cdevsw = { - /* name */ "pass", - /* maj */ PASS_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ passopen, - /* close */ passclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ passioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ passstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops pass_ops = { + { "pass", PASS_CDEV_MAJOR, 0 }, + .d_open = passopen, + .d_close = passclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = passioctl, + .d_strategy = passstrategy, }; static struct extend_array *passperiphs; @@ -242,7 +233,7 @@ passcleanup(struct cam_periph *periph) xpt_print_path(periph->path); printf("removing device entry\n"); } - cdevsw_remove(&pass_cdevsw, -1, periph->unit_number); + dev_ops_remove(&pass_ops, -1, periph->unit_number); free(softc, M_DEVBUF); } @@ -324,8 +315,8 @@ passregister(struct cam_periph *periph, void *arg) DEVSTAT_PRIORITY_PASS); /* Register the device */ - cdevsw_add(&pass_cdevsw, -1, periph->unit_number); - make_dev(&pass_cdevsw, periph->unit_number, UID_ROOT, + dev_ops_add(&pass_ops, -1, periph->unit_number); + make_dev(&pass_ops, periph->unit_number, UID_ROOT, GID_OPERATOR, 0600, "%s%d", periph->periph_name, periph->unit_number); @@ -347,8 +338,9 @@ passregister(struct cam_periph *periph, void *arg) } static int -passopen(dev_t dev, int flags, int fmt, struct thread *td) +passopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct pass_softc *softc; int unit, error; @@ -383,7 +375,7 @@ passopen(dev_t dev, int flags, int fmt, struct thread *td) /* * Only allow read-write access. */ - if (((flags & FWRITE) == 0) || ((flags & FREAD) == 0)) { + if (((ap->a_oflags & FWRITE) == 0) || ((ap->a_oflags & FREAD) == 0)) { crit_exit(); return(EPERM); } @@ -391,7 +383,7 @@ passopen(dev_t dev, int flags, int fmt, struct thread *td) /* * We don't allow nonblocking access. */ - if ((flags & O_NONBLOCK) != 0) { + if ((ap->a_oflags & O_NONBLOCK) != 0) { xpt_print_path(periph->path); printf("can't do nonblocking accesss\n"); crit_exit(); @@ -417,8 +409,9 @@ passopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -passclose(dev_t dev, int flag, int fmt, struct thread *td) +passclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct pass_softc *softc; int unit, error; @@ -449,9 +442,11 @@ passclose(dev_t dev, int flag, int fmt, struct thread *td) * can understand. The transfer is described by a buf and will include * only one physical transfer. */ -static void -passstrategy(dev_t dev, struct bio *bio) +static int +passstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct cam_periph *periph; struct pass_softc *softc; @@ -499,7 +494,7 @@ passstrategy(dev_t dev, struct bio *bio) */ xpt_schedule(periph, /* XXX priority */1); - return; + return(0); bad: bp->b_flags |= B_ERROR; @@ -508,6 +503,7 @@ bad: */ bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } static void @@ -633,8 +629,10 @@ passdone(struct cam_periph *periph, union ccb *done_ccb) } static int -passioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +passioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; struct cam_periph *periph; struct pass_softc *softc; u_int8_t unit; @@ -654,7 +652,7 @@ passioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) error = 0; - switch (cmd) { + switch (ap->a_cmd) { case CAMIOCOMMAND: { @@ -713,7 +711,7 @@ passioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) break; } default: - error = cam_periph_ioctl(periph, cmd, addr, passerror); + error = cam_periph_ioctl(periph, ap->a_cmd, addr, passerror); break; } diff --git a/sys/bus/cam/scsi/scsi_pt.c b/sys/bus/cam/scsi/scsi_pt.c index 9a9512691a..2f18aeca24 100644 --- a/sys/bus/cam/scsi/scsi_pt.c +++ b/sys/bus/cam/scsi/scsi_pt.c @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/scsi/scsi_pt.c,v 1.17 2000/01/17 06:27:37 mjacob Exp $ - * $DragonFly: src/sys/bus/cam/scsi/scsi_pt.c,v 1.14 2006/04/30 17:22:15 dillon Exp $ + * $DragonFly: src/sys/bus/cam/scsi/scsi_pt.c,v 1.15 2006/07/28 02:17:32 dillon Exp $ */ #include @@ -121,23 +121,14 @@ DATA_SET(periphdriver_set, ptdriver); #define PT_CDEV_MAJOR 61 -static struct cdevsw pt_cdevsw = { - /* name */ "pt", - /* maj */ PT_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ptopen, - /* close */ ptclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ ptioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ ptstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops pt_ops = { + { "pt", PT_CDEV_MAJOR, 0 }, + .d_open = ptopen, + .d_close = ptclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = ptioctl, + .d_strategy = ptstrategy, }; static struct extend_array *ptperiphs; @@ -147,8 +138,9 @@ static struct extend_array *ptperiphs; #endif static int -ptopen(dev_t dev, int flags, int fmt, struct thread *td) +ptopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct pt_softc *softc; int unit; @@ -190,8 +182,9 @@ ptopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -ptclose(dev_t dev, int flag, int fmt, struct thread *td) +ptclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct pt_softc *softc; int unit; @@ -218,9 +211,11 @@ ptclose(dev_t dev, int flag, int fmt, struct thread *td) * can understand. The transfer is described by a buf and will include * only one physical transfer. */ -static void -ptstrategy(dev_t dev, struct bio *bio) +static int +ptstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct cam_periph *periph; struct pt_softc *softc; @@ -262,7 +257,7 @@ ptstrategy(dev_t dev, struct bio *bio) */ xpt_schedule(periph, /* XXX priority */1); - return; + return(0); bad: bp->b_flags |= B_ERROR; @@ -271,6 +266,7 @@ bad: */ bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } static void @@ -349,8 +345,8 @@ ptctor(struct cam_periph *periph, void *arg) SID_TYPE(&cgd->inq_data) | DEVSTAT_TYPE_IF_SCSI, DEVSTAT_PRIORITY_OTHER); - cdevsw_add(&pt_cdevsw, -1, periph->unit_number); - make_dev(&pt_cdevsw, periph->unit_number, UID_ROOT, + dev_ops_add(&pt_ops, -1, periph->unit_number); + make_dev(&pt_ops, periph->unit_number, UID_ROOT, GID_OPERATOR, 0600, "%s%d", periph->periph_name, periph->unit_number); /* @@ -435,7 +431,7 @@ ptdtor(struct cam_periph *periph) cam_extend_release(ptperiphs, periph->unit_number); xpt_print_path(periph->path); printf("removing device entry\n"); - cdevsw_remove(&pt_cdevsw, -1, periph->unit_number); + dev_ops_remove(&pt_ops, -1, periph->unit_number); free(softc, M_DEVBUF); } @@ -686,8 +682,10 @@ pterror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags) } static int -ptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +ptioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; struct cam_periph *periph; struct pt_softc *softc; int unit; @@ -705,7 +703,7 @@ ptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) return (error); /* error code from tsleep */ } - switch(cmd) { + switch(ap->a_cmd) { case PTIOCGETTIMEOUT: if (softc->io_timeout >= 1000) *(int *)addr = softc->io_timeout / 1000; @@ -726,7 +724,7 @@ ptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) break; } default: - error = cam_periph_ioctl(periph, cmd, addr, pterror); + error = cam_periph_ioctl(periph, ap->a_cmd, addr, pterror); break; } diff --git a/sys/bus/cam/scsi/scsi_sa.c b/sys/bus/cam/scsi/scsi_sa.c index bc20769c6c..fc816316c4 100644 --- a/sys/bus/cam/scsi/scsi_sa.c +++ b/sys/bus/cam/scsi/scsi_sa.c @@ -1,6 +1,6 @@ /* * $FreeBSD: src/sys/cam/scsi/scsi_sa.c,v 1.45.2.13 2002/12/17 17:08:50 trhodes Exp $ - * $DragonFly: src/sys/bus/cam/scsi/scsi_sa.c,v 1.17 2006/04/30 17:22:15 dillon Exp $ + * $DragonFly: src/sys/bus/cam/scsi/scsi_sa.c,v 1.18 2006/07/28 02:17:32 dillon Exp $ * * Implementation of SCSI Sequential Access Peripheral driver for CAM. * @@ -425,30 +425,22 @@ DATA_SET(periphdriver_set, sadriver); #define SA_CDEV_MAJOR 14 -static struct cdevsw sa_cdevsw = { - /* name */ "sa", - /* maj */ SA_CDEV_MAJOR, - /* flags */ D_TAPE, - /* port */ NULL, - /* clone */ NULL, - - /* open */ saopen, - /* close */ saclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ saioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ sastrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops sa_ops = { + { "sa", SA_CDEV_MAJOR, D_TAPE }, + .d_open = saopen, + .d_close = saclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = saioctl, + .d_strategy = sastrategy, }; static struct extend_array *saperiphs; static int -saopen(dev_t dev, int flags, int fmt, struct thread *td) +saopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct sa_softc *softc; int unit; @@ -496,7 +488,7 @@ saopen(dev_t dev, int flags, int fmt, struct thread *td) * The function samount ensures media is loaded and ready. * It also does a device RESERVE if the tape isn't yet mounted. */ - error = samount(periph, flags, dev); + error = samount(periph, ap->a_oflags, dev); } if (error) { @@ -510,8 +502,9 @@ saopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -saclose(dev_t dev, int flag, int fmt, struct thread *td) +saclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct sa_softc *softc; int unit, mode, error, writing, tmp; @@ -660,9 +653,11 @@ saclose(dev_t dev, int flag, int fmt, struct thread *td) * can understand. The transfer is described by a buf and will include * only one physical transfer. */ -static void -sastrategy(dev_t dev, struct bio *bio) +static int +sastrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct cam_periph *periph; struct sa_softc *softc; @@ -760,7 +755,7 @@ sastrategy(dev_t dev, struct bio *bio) */ xpt_schedule(periph, 1); - return; + return(0); bad: bp->b_flags |= B_ERROR; done: @@ -770,11 +765,14 @@ done: */ bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } static int -saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) +saioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; struct cam_periph *periph; struct sa_softc *softc; scsi_space_code spaceop; @@ -805,7 +803,7 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) */ if (SA_IS_CTRL(dev)) { - switch (cmd) { + switch (ap->a_cmd) { case MTIOCGETEOTMODEL: case MTIOCGET: break; @@ -858,10 +856,10 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) /* * Find the device that the user is talking about */ - switch (cmd) { + switch (ap->a_cmd) { case MTIOCGET: { - struct mtget *g = (struct mtget *)arg; + struct mtget *g = (struct mtget *)addr; /* * If this isn't the control mode device, actually go out @@ -947,7 +945,7 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) case MTIOCERRSTAT: { struct scsi_tape_errors *sep = - &((union mterrstat *)arg)->scsi_errstat; + &((union mterrstat *)addr)->scsi_errstat; CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("saioctl: MTIOCERRSTAT\n")); @@ -975,7 +973,7 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) struct mtop *mt; int count; - mt = (struct mtop *)arg; + mt = (struct mtop *)addr; CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("saioctl: op=0x%x count=0x%x\n", @@ -1195,16 +1193,16 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) error = 0; break; case MTIOCRDSPOS: - error = sardpos(periph, 0, (u_int32_t *) arg); + error = sardpos(periph, 0, (u_int32_t *) addr); break; case MTIOCRDHPOS: - error = sardpos(periph, 1, (u_int32_t *) arg); + error = sardpos(periph, 1, (u_int32_t *) addr); break; case MTIOCSLOCATE: - error = sasetpos(periph, 0, (u_int32_t *) arg); + error = sasetpos(periph, 0, (u_int32_t *) addr); break; case MTIOCHLOCATE: - error = sasetpos(periph, 1, (u_int32_t *) arg); + error = sasetpos(periph, 1, (u_int32_t *) addr); break; case MTIOCGETEOTMODEL: error = 0; @@ -1212,11 +1210,11 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) mode = 1; else mode = 2; - *((u_int32_t *) arg) = mode; + *((u_int32_t *) addr) = mode; break; case MTIOCSETEOTMODEL: error = 0; - switch (*((u_int32_t *) arg)) { + switch (*((u_int32_t *) addr)) { case 1: softc->quirks &= ~SA_QUIRK_2FM; softc->quirks |= SA_QUIRK_1FM; @@ -1231,7 +1229,7 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } break; default: - error = cam_periph_ioctl(periph, cmd, arg, saerror); + error = cam_periph_ioctl(periph, ap->a_cmd, addr, saerror); break; } @@ -1239,7 +1237,7 @@ saioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) * Check to see if we cleared a frozen state */ if (error == 0 && (softc->flags & SA_FLAG_TAPE_FROZEN)) { - switch(cmd) { + switch(ap->a_cmd) { case MTIOCRDSPOS: case MTIOCRDHPOS: case MTIOCSLOCATE: @@ -1365,7 +1363,7 @@ sacleanup(struct cam_periph *periph) cam_extend_release(saperiphs, periph->unit_number); xpt_print_path(periph->path); printf("removing device entry\n"); - cdevsw_remove(&sa_cdevsw, SA_UNITMASK, SA_UNIT(periph->unit_number)); + dev_ops_remove(&sa_ops, SA_UNITMASK, SA_UNIT(periph->unit_number)); free(softc, M_DEVBUF); } @@ -1470,37 +1468,37 @@ saregister(struct cam_periph *periph, void *arg) DEVSTAT_BS_UNAVAILABLE, SID_TYPE(&cgd->inq_data) | DEVSTAT_TYPE_IF_SCSI, DEVSTAT_PRIORITY_TAPE); - cdevsw_add(&sa_cdevsw, SA_UNITMASK, SA_UNIT(periph->unit_number)); - make_dev(&sa_cdevsw, SAMINOR(SA_CTLDEV, + dev_ops_add(&sa_ops, SA_UNITMASK, SA_UNIT(periph->unit_number)); + make_dev(&sa_ops, SAMINOR(SA_CTLDEV, periph->unit_number, 0, SA_ATYPE_R), UID_ROOT, GID_OPERATOR, 0660, "r%s%d.ctl", periph->periph_name, periph->unit_number); - make_dev(&sa_cdevsw, SAMINOR(SA_NOT_CTLDEV, + make_dev(&sa_ops, SAMINOR(SA_NOT_CTLDEV, periph->unit_number, 0, SA_ATYPE_R), UID_ROOT, GID_OPERATOR, 0660, "r%s%d", periph->periph_name, periph->unit_number); - make_dev(&sa_cdevsw, SAMINOR(SA_NOT_CTLDEV, + make_dev(&sa_ops, SAMINOR(SA_NOT_CTLDEV, periph->unit_number, 0, SA_ATYPE_NR), UID_ROOT, GID_OPERATOR, 0660, "nr%s%d", periph->periph_name, periph->unit_number); - make_dev(&sa_cdevsw, SAMINOR(SA_NOT_CTLDEV, + make_dev(&sa_ops, SAMINOR(SA_NOT_CTLDEV, periph->unit_number, 0, SA_ATYPE_ER), UID_ROOT, GID_OPERATOR, 0660, "er%s%d", periph->periph_name, periph->unit_number); for (i = 0; i < SA_NUM_MODES; i++) { - make_dev(&sa_cdevsw, + make_dev(&sa_ops, SAMINOR(SA_NOT_CTLDEV, periph->unit_number, i, SA_ATYPE_R), UID_ROOT, GID_OPERATOR, 0660, "r%s%d.%d", periph->periph_name, periph->unit_number, i); - make_dev(&sa_cdevsw, + make_dev(&sa_ops, SAMINOR(SA_NOT_CTLDEV, periph->unit_number, i, SA_ATYPE_NR), UID_ROOT, GID_OPERATOR, 0660, "nr%s%d.%d", periph->periph_name, periph->unit_number, i); - make_dev(&sa_cdevsw, + make_dev(&sa_ops, SAMINOR(SA_NOT_CTLDEV, periph->unit_number, i, SA_ATYPE_ER), UID_ROOT, GID_OPERATOR, 0660, "er%s%d.%d", periph->periph_name, periph->unit_number, i); diff --git a/sys/bus/cam/scsi/scsi_ses.c b/sys/bus/cam/scsi/scsi_ses.c index 7fa821a0b0..652b6aabde 100644 --- a/sys/bus/cam/scsi/scsi_ses.c +++ b/sys/bus/cam/scsi/scsi_ses.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/cam/scsi/scsi_ses.c,v 1.8.2.2 2000/08/08 23:19:21 mjacob Exp $ */ -/* $DragonFly: src/sys/bus/cam/scsi/scsi_ses.c,v 1.14 2006/02/17 19:17:42 dillon Exp $ */ +/* $DragonFly: src/sys/bus/cam/scsi/scsi_ses.c,v 1.15 2006/07/28 02:17:32 dillon Exp $ */ /* * Copyright (c) 2000 Matthew Jacob * All rights reserved. @@ -179,23 +179,11 @@ static struct periph_driver sesdriver = { DATA_SET(periphdriver_set, sesdriver); -static struct cdevsw ses_cdevsw = { - /* name */ "ses", - /* maj */ SES_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ sesopen, - /* close */ sesclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ sesioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ses_ops = { + { "ses", SES_CDEV_MAJOR, 0 }, + .d_open = sesopen, + .d_close = sesclose, + .d_ioctl = sesioctl, }; static struct extend_array *sesperiphs; @@ -274,7 +262,7 @@ sescleanup(struct cam_periph *periph) cam_extend_release(sesperiphs, periph->unit_number); xpt_print_path(periph->path); printf("removing device entry\n"); - cdevsw_remove(&ses_cdevsw, -1, periph->unit_number); + dev_ops_remove(&ses_ops, -1, periph->unit_number); free(softc, M_DEVBUF); } @@ -378,8 +366,8 @@ sesregister(struct cam_periph *periph, void *arg) cam_extend_set(sesperiphs, periph->unit_number, periph); - cdevsw_add(&ses_cdevsw, -1, periph->unit_number); - make_dev(&ses_cdevsw, periph->unit_number, + dev_ops_add(&ses_ops, -1, periph->unit_number); + make_dev(&ses_ops, periph->unit_number, UID_ROOT, GID_OPERATOR, 0600, "%s%d", periph->periph_name, periph->unit_number); @@ -420,8 +408,9 @@ sesregister(struct cam_periph *periph, void *arg) } static int -sesopen(dev_t dev, int flags, int fmt, struct thread *td) +sesopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct ses_softc *softc; int error; @@ -476,8 +465,9 @@ out: } static int -sesclose(dev_t dev, int flag, int fmt, struct thread *td) +sesclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; struct ses_softc *softc; int unit, error; @@ -533,8 +523,9 @@ seserror(union ccb *ccb, u_int32_t cflags, u_int32_t sflags) } static int -sesioctl(dev_t dev, u_long cmd, caddr_t arg_addr, int flag, struct thread *td) +sesioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct cam_periph *periph; ses_encstat tmp; ses_objstat objs; @@ -544,8 +535,8 @@ sesioctl(dev_t dev, u_long cmd, caddr_t arg_addr, int flag, struct thread *td) int error, i; - if (arg_addr) - addr = *((caddr_t *) arg_addr); + if (ap->a_data) + addr = *((caddr_t *)ap->a_data); else addr = NULL; @@ -567,25 +558,25 @@ sesioctl(dev_t dev, u_long cmd, caddr_t arg_addr, int flag, struct thread *td) error = 0; CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, - ("trying to do ioctl %#lx\n", cmd)); + ("trying to do ioctl %#lx\n", ap->a_cmd)); /* * If this command can change the device's state, * we must have the device open for writing. */ - switch (cmd) { + switch (ap->a_cmd) { case SESIOC_GETNOBJ: case SESIOC_GETOBJMAP: case SESIOC_GETENCSTAT: case SESIOC_GETOBJSTAT: break; default: - if ((flag & FWRITE) == 0) { + if ((ap->a_fflag & FWRITE) == 0) { return (EBADF); } } - switch (cmd) { + switch (ap->a_cmd) { case SESIOC_GETNOBJ: error = copyout(&ssc->ses_nobjects, addr, sizeof (ssc->ses_nobjects)); @@ -660,7 +651,7 @@ sesioctl(dev_t dev, u_long cmd, caddr_t arg_addr, int flag, struct thread *td) break; default: - error = cam_periph_ioctl(periph, cmd, arg_addr, seserror); + error = cam_periph_ioctl(periph, ap->a_cmd, ap->a_data, seserror); break; } return (error); diff --git a/sys/bus/cam/scsi/scsi_target.c b/sys/bus/cam/scsi/scsi_target.c index 63990cee0a..cf227da5c5 100644 --- a/sys/bus/cam/scsi/scsi_target.c +++ b/sys/bus/cam/scsi/scsi_target.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/cam/scsi/scsi_target.c,v 1.22.2.7 2003/02/18 22:07:10 njl Exp $ - * $DragonFly: src/sys/bus/cam/scsi/scsi_target.c,v 1.11 2005/06/02 20:40:31 dillon Exp $ + * $DragonFly: src/sys/bus/cam/scsi/scsi_target.c,v 1.12 2006/07/28 02:17:32 dillon Exp $ */ #include @@ -286,7 +286,7 @@ targioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) /* Writes are always ready, reads wait for user_ccb_queue or abort_queue */ static int -targpoll(dev_t dev, int poll_events, struct proc *p) +targpoll(struct dev_poll_args *ap) { struct targ_softc *softc; int revents; @@ -294,21 +294,21 @@ targpoll(dev_t dev, int poll_events, struct proc *p) softc = (struct targ_softc *)dev->si_drv1; /* Poll for write() is always ok. */ - revents = poll_events & (POLLOUT | POLLWRNORM); - if ((poll_events & (POLLIN | POLLRDNORM)) != 0) { + revents = ap->a_events & (POLLOUT | POLLWRNORM); + if ((ap->a_events & (POLLIN | POLLRDNORM)) != 0) { crit_enter(); /* Poll for read() depends on user and abort queues. */ if (!TAILQ_EMPTY(&softc->user_ccb_queue) || !TAILQ_EMPTY(&softc->abort_queue)) { - revents |= poll_events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); } /* Only sleep if the user didn't poll for write. */ if (revents == 0) selrecord(p, &softc->read_select); crit_exit(); } - - return (revents); + ap->a_events = revents; + return (0); } static int diff --git a/sys/bus/firewire/firewirereg.h b/sys/bus/firewire/firewirereg.h index cf524743ef..4c16891caf 100644 --- a/sys/bus/firewire/firewirereg.h +++ b/sys/bus/firewire/firewirereg.h @@ -32,12 +32,12 @@ * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/firewire/firewirereg.h,v 1.33 2004/01/06 14:30:46 simokawa Exp $ - * $DragonFly: src/sys/bus/firewire/firewirereg.h,v 1.10 2006/06/10 20:00:12 dillon Exp $ + * $DragonFly: src/sys/bus/firewire/firewirereg.h,v 1.11 2006/07/28 02:17:33 dillon Exp $ * */ #ifdef __DragonFly__ -typedef d_thread_t fw_proc; +typedef struct thread fw_proc; #elif __FreeBSD_version >= 500000 typedef struct thread fw_proc; #else @@ -47,6 +47,8 @@ typedef struct proc fw_proc; #include #include +struct dev_ioctl_args; + struct fw_device{ u_int16_t dst; struct fw_eui64 eui; @@ -153,7 +155,7 @@ struct firewire_comm{ u_int32_t (*cyctimer) (struct firewire_comm *); void (*ibr) (struct firewire_comm *); u_int32_t (*set_bmr) (struct firewire_comm *, u_int32_t); - int (*ioctl) (dev_t, u_long, caddr_t, int, fw_proc *); + int (*ioctl) (struct dev_ioctl_args *); int (*irx_enable) (struct firewire_comm *, int); int (*irx_disable) (struct firewire_comm *, int); int (*itx_enable) (struct firewire_comm *, int); diff --git a/sys/bus/firewire/fwdev.c b/sys/bus/firewire/fwdev.c index 93290e37aa..c08e6187f2 100644 --- a/sys/bus/firewire/fwdev.c +++ b/sys/bus/firewire/fwdev.c @@ -32,7 +32,7 @@ * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/firewire/fwdev.c,v 1.36 2004/01/22 14:41:17 simokawa Exp $ - * $DragonFly: src/sys/bus/firewire/fwdev.c,v 1.11 2006/02/17 19:17:44 dillon Exp $ + * $DragonFly: src/sys/bus/firewire/fwdev.c,v 1.12 2006/07/28 02:17:33 dillon Exp $ * */ @@ -84,13 +84,9 @@ static d_write_t fw_write; static d_mmap_t fw_mmap; static d_strategy_t fw_strategy; -struct cdevsw firewire_cdevsw = +struct dev_ops firewire_ops = { -#ifdef __DragonFly__ - "fw", CDEV_MAJOR, D_MEM, NULL, 0, - fw_open, fw_close, fw_read, fw_write, fw_ioctl, - fw_poll, fw_mmap, fw_strategy, nodump, nopsize, -#elif __FreeBSD_version >= 500104 + { "fw", CDEV_MAJOR, D_MEM }, .d_open = fw_open, .d_close = fw_close, .d_read = fw_read, @@ -99,14 +95,6 @@ struct cdevsw firewire_cdevsw = .d_poll = fw_poll, .d_mmap = fw_mmap, .d_strategy = fw_strategy, - .d_name = "fw", - .d_maj = CDEV_MAJOR, - .d_flags = D_MEM -#else - fw_open, fw_close, fw_read, fw_write, fw_ioctl, - fw_poll, fw_mmap, fw_strategy, "fw", CDEV_MAJOR, - nodump, nopsize, D_MEM, -1 -#endif }; struct fw_drv1 { @@ -180,12 +168,13 @@ fwdev_freebuf(struct fw_xferq *q) static int -fw_open (dev_t dev, int flags, int fmt, fw_proc *td) +fw_open (struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int err = 0; if (DEV_FWMEM(dev)) - return fwmem_open(dev, flags, fmt, td); + return fwmem_open(ap); if (dev->si_drv1 != NULL) return (EBUSY); @@ -195,7 +184,7 @@ fw_open (dev_t dev, int flags, int fmt, fw_proc *td) int unit = DEV2UNIT(dev); int sub = DEV2SUB(dev); - make_dev(&firewire_cdevsw, minor(dev), + make_dev(&firewire_ops, minor(dev), UID_ROOT, GID_OPERATOR, 0660, "fw%d.%d", unit, sub); } @@ -207,8 +196,9 @@ fw_open (dev_t dev, int flags, int fmt, fw_proc *td) } static int -fw_close (dev_t dev, int flags, int fmt, fw_proc *td) +fw_close (struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct firewire_softc *sc; struct firewire_comm *fc; struct fw_drv1 *d; @@ -218,7 +208,7 @@ fw_close (dev_t dev, int flags, int fmt, fw_proc *td) int err = 0; if (DEV_FWMEM(dev)) - return fwmem_close(dev, flags, fmt, td); + return fwmem_close(ap); sc = devclass_get_softc(firewire_devclass, unit); fc = sc->fc; @@ -281,8 +271,10 @@ fw_close (dev_t dev, int flags, int fmt, fw_proc *td) * read request. */ static int -fw_read (dev_t dev, struct uio *uio, int ioflag) +fw_read (struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct firewire_softc *sc; struct fw_xferq *ir; struct fw_xfer *xfer; @@ -291,7 +283,7 @@ fw_read (dev_t dev, struct uio *uio, int ioflag) struct fw_pkt *fp; if (DEV_FWMEM(dev)) - return physio(dev, uio, ioflag); + return physread(ap); sc = devclass_get_softc(firewire_devclass, unit); @@ -367,8 +359,10 @@ readloop: } static int -fw_write (dev_t dev, struct uio *uio, int ioflag) +fw_write (struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int err = 0; struct firewire_softc *sc; int unit = DEV2UNIT(dev); @@ -378,7 +372,7 @@ fw_write (dev_t dev, struct uio *uio, int ioflag) struct fw_xferq *it; if (DEV_FWMEM(dev)) - return physio(dev, uio, ioflag); + return physwrite(ap); sc = devclass_get_softc(firewire_devclass, unit); fc = sc->fc; @@ -430,8 +424,9 @@ isoloop: * ioctl support. */ int -fw_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) +fw_ioctl (struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct firewire_softc *sc; struct firewire_comm *fc; struct fw_drv1 *d; @@ -445,17 +440,17 @@ fw_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) struct fw_devinfo *devinfo; void *ptr; - struct fw_devlstreq *fwdevlst = (struct fw_devlstreq *)data; - struct fw_asyreq *asyreq = (struct fw_asyreq *)data; - struct fw_isochreq *ichreq = (struct fw_isochreq *)data; - struct fw_isobufreq *ibufreq = (struct fw_isobufreq *)data; - struct fw_asybindreq *bindreq = (struct fw_asybindreq *)data; - struct fw_crom_buf *crom_buf = (struct fw_crom_buf *)data; + struct fw_devlstreq *fwdevlst = (struct fw_devlstreq *)ap->a_data; + struct fw_asyreq *asyreq = (struct fw_asyreq *)ap->a_data; + struct fw_isochreq *ichreq = (struct fw_isochreq *)ap->a_data; + struct fw_isobufreq *ibufreq = (struct fw_isobufreq *)ap->a_data; + struct fw_asybindreq *bindreq = (struct fw_asybindreq *)ap->a_data; + struct fw_crom_buf *crom_buf = (struct fw_crom_buf *)ap->a_data; if (DEV_FWMEM(dev)) - return fwmem_ioctl(dev, cmd, data, flag, td); + return fwmem_ioctl(ap); - if (!data) + if (!ap->a_data) return(EINVAL); sc = devclass_get_softc(firewire_devclass, unit); @@ -464,7 +459,7 @@ fw_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) ir = d->ir; it = d->it; - switch (cmd) { + switch (ap->a_cmd) { case FW_STSTREAM: if (it == NULL) { for (i = 0; i < fc->nisodma; i ++) { @@ -676,7 +671,7 @@ out: fwdevlst->info_len = len; break; case FW_GTPMAP: - bcopy(sc->fc->topology_map, data, + bcopy(sc->fc->topology_map, ap->a_data, (sc->fc->topology_map->crc_len + 1) * 4); break; case FW_GCROM: @@ -712,14 +707,15 @@ out: free(ptr, M_FW); break; default: - sc->fc->ioctl (dev, cmd, data, flag, td); + sc->fc->ioctl(ap); break; } return err; } int -fw_poll(dev_t dev, int events, fw_proc *td) +fw_poll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct firewire_softc *sc; struct fw_xferq *ir; int revents; @@ -727,62 +723,57 @@ fw_poll(dev_t dev, int events, fw_proc *td) int unit = DEV2UNIT(dev); if (DEV_FWMEM(dev)) - return fwmem_poll(dev, events, td); + return fwmem_poll(ap); sc = devclass_get_softc(firewire_devclass, unit); ir = ((struct fw_drv1 *)dev->si_drv1)->ir; revents = 0; tmp = POLLIN | POLLRDNORM; - if (events & tmp) { + if (ap->a_events & tmp) { if (STAILQ_FIRST(&ir->q) != NULL) revents |= tmp; else - selrecord(td, &ir->rsel); + selrecord(curthread, &ir->rsel); } tmp = POLLOUT | POLLWRNORM; - if (events & tmp) { + if (ap->a_events & tmp) { /* XXX should be fixed */ revents |= tmp; } - - return revents; + ap->a_events = revents; + return(0); } static int -#if defined(__DragonFly__) || __FreeBSD_version < 500102 -fw_mmap (dev_t dev, vm_offset_t offset, int nproto) -#else -fw_mmap (dev_t dev, vm_offset_t offset, vm_paddr_t *paddr, int nproto) -#endif +fw_mmap (struct dev_mmap_args *ap) { + dev_t dev = ap->a_head.a_dev; struct firewire_softc *sc; int unit = DEV2UNIT(dev); if (DEV_FWMEM(dev)) -#if defined(__DragonFly__) || __FreeBSD_version < 500102 - return fwmem_mmap(dev, offset, nproto); -#else - return fwmem_mmap(dev, offset, paddr, nproto); -#endif - + return fwmem_mmap(ap); sc = devclass_get_softc(firewire_devclass, unit); return EINVAL; } -static void -fw_strategy(dev_t dev, struct bio *bio) +static int +fw_strategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; if (DEV_FWMEM(dev)) { - fwmem_strategy(dev, bio); - return; + fwmem_strategy(ap); + return(0); } bp->b_error = EOPNOTSUPP; bp->b_flags |= B_ERROR; bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } int @@ -791,7 +782,7 @@ fwdev_makedev(struct firewire_softc *sc) int unit; unit = device_get_unit(sc->fc->bdev); - cdevsw_add(&firewire_cdevsw, FW_UNITMASK, FW_UNIT(unit)); + dev_ops_add(&firewire_ops, FW_UNITMASK, FW_UNIT(unit)); return(0); } @@ -801,7 +792,7 @@ fwdev_destroydev(struct firewire_softc *sc) int unit; unit = device_get_unit(sc->fc->bdev); - cdevsw_remove(&firewire_cdevsw, FW_UNITMASK, FW_UNIT(unit)); + dev_ops_remove(&firewire_ops, FW_UNITMASK, FW_UNIT(unit)); return(0); } @@ -840,7 +831,7 @@ found: sc = devclass_get_softc(firewire_devclass, unit); if (sc == NULL) return; - *dev = make_dev(&firewire_cdevsw, MAKEMINOR(devflag[i], unit, sub), + *dev = make_dev(&firewire_ops, MAKEMINOR(devflag[i], unit, sub), UID_ROOT, GID_OPERATOR, 0660, "%s%d.%d", devnames[i], unit, sub); (*dev)->si_flags |= SI_CHEAPCLONE; diff --git a/sys/bus/firewire/fwmem.c b/sys/bus/firewire/fwmem.c index 694cd7b553..9bf06a540e 100644 --- a/sys/bus/firewire/fwmem.c +++ b/sys/bus/firewire/fwmem.c @@ -31,7 +31,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/bus/firewire/fwmem.c,v 1.9 2006/04/30 17:22:15 dillon Exp $ + * $DragonFly: src/sys/bus/firewire/fwmem.c,v 1.10 2006/07/28 02:17:33 dillon Exp $ */ #ifndef __DragonFly__ @@ -276,12 +276,13 @@ fwmem_write_block( int -fwmem_open (dev_t dev, int flags, int fmt, fw_proc *td) +fwmem_open (struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct fwmem_softc *fms; if (dev->si_drv1 != NULL) { - if ((flags & FWRITE) != 0) + if ((ap->a_oflags & FWRITE) != 0) return (EBUSY); fms = (struct fwmem_softc *)dev->si_drv1; fms->refcount ++; @@ -302,8 +303,9 @@ fwmem_open (dev_t dev, int flags, int fmt, fw_proc *td) } int -fwmem_close (dev_t dev, int flags, int fmt, fw_proc *td) +fwmem_close (struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct fwmem_softc *fms; fms = (struct fwmem_softc *)dev->si_drv1; @@ -339,9 +341,11 @@ fwmem_biodone(struct fw_xfer *xfer) biodone(bio); } -void -fwmem_strategy(dev_t dev, struct bio *bio) +int +fwmem_strategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct firewire_softc *sc; struct fwmem_softc *fms; @@ -410,21 +414,23 @@ error: bp->b_resid = bp->b_bcount; biodone(bio); } + return(0); } int -fwmem_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) +fwmem_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct fwmem_softc *fms; int err = 0; fms = (struct fwmem_softc *)dev->si_drv1; - switch (cmd) { + switch (ap->a_cmd) { case FW_SDEUI64: - bcopy(data, &fms->eui, sizeof(struct fw_eui64)); + bcopy(ap->a_data, &fms->eui, sizeof(struct fw_eui64)); break; case FW_GDEUI64: - bcopy(&fms->eui, data, sizeof(struct fw_eui64)); + bcopy(&fms->eui, ap->a_data, sizeof(struct fw_eui64)); break; default: err = EINVAL; @@ -432,16 +438,12 @@ fwmem_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) return(err); } int -fwmem_poll (dev_t dev, int events, fw_proc *td) +fwmem_poll(struct dev_poll_args *ap) { return EINVAL; } int -#if defined(__DragonFly__) || __FreeBSD_version < 500102 -fwmem_mmap (dev_t dev, vm_offset_t offset, int nproto) -#else -fwmem_mmap (dev_t dev, vm_offset_t offset, vm_paddr_t *paddr, int nproto) -#endif +fwmem_mmap(struct dev_mmap_args *ap) { return EINVAL; } diff --git a/sys/bus/firewire/fwmem.h b/sys/bus/firewire/fwmem.h index c26d3ba6cb..b7945da1ba 100644 --- a/sys/bus/firewire/fwmem.h +++ b/sys/bus/firewire/fwmem.h @@ -32,9 +32,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/firewire/fwmem.h,v 1.6 2003/10/02 04:06:56 simokawa Exp $ - * $DragonFly: src/sys/bus/firewire/fwmem.h,v 1.3 2004/02/05 13:32:08 joerg Exp $ + * $DragonFly: src/sys/bus/firewire/fwmem.h,v 1.4 2006/07/28 02:17:33 dillon Exp $ */ +#ifndef _SYS_DEVICE_H_ +#include +#endif + struct fw_xfer *fwmem_read_quad(struct fw_device *, caddr_t, u_int8_t, u_int16_t, u_int32_t, void *, void (*)(struct fw_xfer *)); struct fw_xfer *fwmem_write_quad(struct fw_device *, caddr_t, u_int8_t, diff --git a/sys/bus/firewire/fwohci.c b/sys/bus/firewire/fwohci.c index ceef3ceacc..1cc61bd14c 100644 --- a/sys/bus/firewire/fwohci.c +++ b/sys/bus/firewire/fwohci.c @@ -33,7 +33,7 @@ * * $FreeBSD: src/sys/dev/firewire/fwohci.c,v 1.72 2004/01/22 14:41:17 simokawa Exp $ * $FreeBSD: src/sys/dev/firewire/fwohci.c,v 1.1.2.19 2003/05/01 06:24:37 simokawa Exp $ - * $DragonFly: src/sys/bus/firewire/fwohci.c,v 1.9 2005/06/02 20:40:33 dillon Exp $ + * $DragonFly: src/sys/bus/firewire/fwohci.c,v 1.10 2006/07/28 02:17:33 dillon Exp $ */ #define ATRQ_CH 0 @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -347,14 +348,15 @@ again: } /* Device specific ioctl. */ int -fwohci_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) +fwohci_ioctl (struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct firewire_softc *sc; struct fwohci_softc *fc; int unit = DEV2UNIT(dev); int err = 0; - struct fw_reg_req_t *reg = (struct fw_reg_req_t *) data; - u_int32_t *dmach = (u_int32_t *) data; + struct fw_reg_req_t *reg = (struct fw_reg_req_t *) ap->a_data; + u_int32_t *dmach = (u_int32_t *) ap->a_data; sc = devclass_get_softc(firewire_devclass, unit); if(sc == NULL){ @@ -362,10 +364,10 @@ fwohci_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td) } fc = (struct fwohci_softc *)sc->fc; - if (!data) + if (!ap->a_data) return(EINVAL); - switch (cmd) { + switch (ap->a_cmd) { case FWOHCI_WRREG: #define OHCI_MAX_REG 0x800 if(reg->addr <= OHCI_MAX_REG){ diff --git a/sys/bus/iicbus/iic.c b/sys/bus/iicbus/iic.c index 1342e4438a..39e1f64a5a 100644 --- a/sys/bus/iicbus/iic.c +++ b/sys/bus/iicbus/iic.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/iicbus/iic.c,v 1.18 1999/11/18 05:43:32 peter Exp $ - * $DragonFly: src/sys/bus/iicbus/iic.c,v 1.8 2005/02/17 13:59:35 joerg Exp $ + * $DragonFly: src/sys/bus/iicbus/iic.c,v 1.9 2006/07/28 02:17:34 dillon Exp $ * */ #include @@ -93,23 +93,13 @@ static d_read_t iicread; static d_ioctl_t iicioctl; #define CDEV_MAJOR 105 -static struct cdevsw iic_cdevsw = { - /* name */ "iic", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ iicopen, - /* close */ iicclose, - /* read */ iicread, - /* write */ iicwrite, - /* ioctl */ iicioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops iic_ops = { + { "iic", CDEV_MAJOR, 0 }, + .d_open = iicopen, + .d_close = iicclose, + .d_read = iicread, + .d_write = iicwrite, + .d_ioctl = iicioctl, }; /* @@ -133,16 +123,17 @@ iic_probe(device_t dev) static int iic_attach(device_t dev) { - cdevsw_add(&iic_cdevsw, -1, device_get_unit(dev)); - make_dev(&iic_cdevsw, device_get_unit(dev), /* XXX cleanup */ + dev_ops_add(&iic_ops, -1, device_get_unit(dev)); + make_dev(&iic_ops, device_get_unit(dev), /* XXX cleanup */ UID_ROOT, GID_WHEEL, 0600, "iic%d", device_get_unit(dev)); return (0); } static int -iicopen (dev_t dev, int flags, int fmt, struct thread *td) +iicopen (struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct iic_softc *sc = IIC_SOFTC(minor(dev)); if (!sc) @@ -157,8 +148,9 @@ iicopen (dev_t dev, int flags, int fmt, struct thread *td) } static int -iicclose(dev_t dev, int flags, int fmt, struct thread *td) +iicclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct iic_softc *sc = IIC_SOFTC(minor(dev)); if (!sc) @@ -176,8 +168,10 @@ iicclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -iicwrite(dev_t dev, struct uio * uio, int ioflag) +iicwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; device_t iicdev = IIC_DEVICE(minor(dev)); struct iic_softc *sc = IIC_SOFTC(minor(dev)); int sent, error, count; @@ -203,8 +197,10 @@ iicwrite(dev_t dev, struct uio * uio, int ioflag) } static int -iicread(dev_t dev, struct uio * uio, int ioflag) +iicread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; device_t iicdev = IIC_DEVICE(minor(dev)); struct iic_softc *sc = IIC_SOFTC(minor(dev)); int len, error = 0; @@ -235,23 +231,24 @@ iicread(dev_t dev, struct uio * uio, int ioflag) } static int -iicioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +iicioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; device_t iicdev = IIC_DEVICE(minor(dev)); struct iic_softc *sc = IIC_SOFTC(minor(dev)); device_t parent = device_get_parent(iicdev); - struct iiccmd *s = (struct iiccmd *)data; + struct iiccmd *s = (struct iiccmd *)ap->a_data; int error, count; if (!sc) return (EINVAL); if ((error = iicbus_request_bus(device_get_parent(iicdev), iicdev, - (flags & O_NONBLOCK) ? IIC_DONTWAIT : + (ap->a_fflag & O_NONBLOCK) ? IIC_DONTWAIT : (IIC_WAIT | IIC_INTR)))) return (error); - switch (cmd) { + switch (ap->a_cmd) { case I2CSTART: error = iicbus_start(parent, s->slave, 0); break; diff --git a/sys/bus/isa/vga_isa.c b/sys/bus/isa/vga_isa.c index 09c34e5b9f..6378cee47a 100644 --- a/sys/bus/isa/vga_isa.c +++ b/sys/bus/isa/vga_isa.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/isa/vga_isa.c,v 1.17 2000/01/29 15:08:56 peter Exp $ - * $DragonFly: src/sys/bus/isa/vga_isa.c,v 1.9 2005/07/10 13:06:18 swildner Exp $ + * $DragonFly: src/sys/bus/isa/vga_isa.c,v 1.10 2006/07/28 02:17:34 dillon Exp $ */ #include "opt_vga.h" @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -93,23 +94,14 @@ static d_write_t isavga_write; static d_ioctl_t isavga_ioctl; static d_mmap_t isavga_mmap; -static struct cdevsw isavga_cdevsw = { - /* name */ VGA_DRIVER_NAME, - /* maj */ -1, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ isavga_open, - /* close */ isavga_close, - /* read */ isavga_read, - /* write */ isavga_write, - /* ioctl */ isavga_ioctl, - /* poll */ nopoll, - /* mmap */ isavga_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops isavga_ops = { + { VGA_DRIVER_NAME, -1, 0 }, + .d_open = isavga_open, + .d_close = isavga_close, + .d_read = isavga_read, + .d_write = isavga_write, + .d_ioctl = isavga_ioctl, + .d_mmap = isavga_mmap, }; #endif /* FB_INSTALL_CDEV */ @@ -169,8 +161,8 @@ isavga_attach(device_t dev) #ifdef FB_INSTALL_CDEV /* attach a virtual frame buffer device */ - cdevsw_add(&isavga_cdevsw, VGA_MKMINOR(-1), VGA_MKMINOR(unit)); - sc->devt = make_dev(&isavga_cdevsw, VGA_MKMINOR(unit), 0, 0, 02660, "vga%x", VGA_MKMINOR(unit)); + dev_ops_add(&isavga_ops, VGA_MKMINOR(-1), VGA_MKMINOR(unit)); + sc->devt = make_dev(&isavga_ops, VGA_MKMINOR(unit), 0, 0, 02660, "vga%x", VGA_MKMINOR(unit)); reference_dev(sc->devt); error = fb_attach(sc->devt, sc->adp); if (error) @@ -243,39 +235,54 @@ isavga_resume(device_t dev) #ifdef FB_INSTALL_CDEV static int -isavga_open(dev_t dev, int flag, int mode, struct thread *td) +isavga_open(struct dev_open_args *ap) { - return vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td); + dev_t dev = ap->a_head.a_dev; + + return vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), ap->a_oflags, + ap->a_devtype, ap->a_cred); } static int -isavga_close(dev_t dev, int flag, int mode, struct thread *td) +isavga_close(struct dev_close_args *ap) { - return vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td); + dev_t dev = ap->a_head.a_dev; + + return vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), + ap->a_fflag, ap->a_devtype); } static int -isavga_read(dev_t dev, struct uio *uio, int flag) +isavga_read(struct dev_read_args *ap) { - return vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag); + dev_t dev = ap->a_head.a_dev; + + return vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), ap->a_uio, ap->a_ioflag); } static int -isavga_write(dev_t dev, struct uio *uio, int flag) +isavga_write(struct dev_write_args *ap) { - return vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag); + dev_t dev = ap->a_head.a_dev; + + return vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), ap->a_uio, ap->a_ioflag); } static int -isavga_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) +isavga_ioctl(struct dev_ioctl_args *ap) { - return vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, td); + dev_t dev = ap->a_head.a_dev; + + return vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), ap->a_cmd, ap->a_data, ap->a_fflag, ap->a_cred); } static int -isavga_mmap(dev_t dev, vm_offset_t offset, int prot) +isavga_mmap(struct dev_mmap_args *ap) { - return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, prot); + dev_t dev = ap->a_head.a_dev; + + ap->a_result = vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), ap->a_offset, ap->a_nprot); + return(0); } #endif /* FB_INSTALL_CDEV */ diff --git a/sys/bus/pci/pci.c b/sys/bus/pci/pci.c index 6bf7ea3145..de0f3793be 100644 --- a/sys/bus/pci/pci.c +++ b/sys/bus/pci/pci.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/pci.c,v 1.141.2.15 2002/04/30 17:48:18 tmm Exp $ - * $DragonFly: src/sys/bus/pci/pci.c,v 1.29 2005/11/04 08:57:22 dillon Exp $ + * $DragonFly: src/sys/bus/pci/pci.c,v 1.30 2006/07/28 02:17:34 dillon Exp $ * */ @@ -687,16 +687,16 @@ pci_disable_io_method(device_t dev, device_t child, int space) */ static int -pci_open(dev_t dev, int oflags, int devtype, struct thread *td) +pci_open(struct dev_open_args *ap) { - if ((oflags & FWRITE) && securelevel > 0) { + if ((ap->a_oflags & FWRITE) && securelevel > 0) { return EPERM; } return 0; } static int -pci_close(dev_t dev, int flag, int devtype, struct thread *td) +pci_close(struct dev_close_args *ap) { return 0; } @@ -815,18 +815,17 @@ pci_devlist_get_parent(pcicfgregs *cfg) } static int -pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +pci_ioctl(struct dev_ioctl_args *ap) { device_t pci, pcib; struct pci_io *io; const char *name; int error; - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; - - switch(cmd) { + switch(ap->a_cmd) { case PCIOCGETCONF: { struct pci_devinfo *dinfo; @@ -837,7 +836,7 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) size_t iolen; int ionum, i; - cio = (struct pci_conf_io *)data; + cio = (struct pci_conf_io *)ap->a_data; num_patterns = 0; dinfo = NULL; @@ -1057,7 +1056,7 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; } case PCIOCREAD: - io = (struct pci_io *)data; + io = (struct pci_io *)ap->a_data; switch(io->pi_width) { case 4: case 2: @@ -1099,7 +1098,7 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; case PCIOCWRITE: - io = (struct pci_io *)data; + io = (struct pci_io *)ap->a_data; switch(io->pi_width) { case 4: case 2: @@ -1150,23 +1149,11 @@ pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) #define PCI_CDEV 78 -static struct cdevsw pcicdev = { - /* name */ "pci", - /* maj */ PCI_CDEV, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ pci_open, - /* close */ pci_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ pci_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops pcic_ops = { + { "pci", PCI_CDEV, 0 }, + .d_open = pci_open, + .d_close = pci_close, + .d_ioctl = pci_ioctl, }; #include "pci_if.h" @@ -1462,8 +1449,8 @@ pci_attach(device_t dev) int busno; int lunit = device_get_unit(dev); - cdevsw_add(&pcicdev, -1, lunit); - make_dev(&pcicdev, lunit, UID_ROOT, GID_WHEEL, 0644, "pci%d", lunit); + dev_ops_add(&pcic_ops, -1, lunit); + make_dev(&pcic_ops, lunit, UID_ROOT, GID_WHEEL, 0644, "pci%d", lunit); /* * Since there can be multiple independantly numbered PCI diff --git a/sys/bus/smbus/smb.c b/sys/bus/smbus/smb.c index 7308f4b014..d0a9a5d199 100644 --- a/sys/bus/smbus/smb.c +++ b/sys/bus/smbus/smb.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/smbus/smb.c,v 1.20 1999/11/18 05:44:56 peter Exp $ - * $DragonFly: src/sys/bus/smbus/smb.c,v 1.7 2004/05/19 22:52:39 dillon Exp $ + * $DragonFly: src/sys/bus/smbus/smb.c,v 1.8 2006/07/28 02:17:34 dillon Exp $ * */ #include @@ -94,23 +94,13 @@ static d_read_t smbread; static d_ioctl_t smbioctl; #define CDEV_MAJOR 106 -static struct cdevsw smb_cdevsw = { - /* name */ "smb", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ smbopen, - /* close */ smbclose, - /* read */ smbread, - /* write */ smbwrite, - /* ioctl */ smbioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops smb_ops = { + { "smb", CDEV_MAJOR, 0 }, + .d_open = smbopen, + .d_close = smbclose, + .d_read = smbread, + .d_write = smbwrite, + .d_ioctl = smbioctl, }; /* @@ -134,16 +124,17 @@ smb_probe(device_t dev) static int smb_attach(device_t dev) { - cdevsw_add(&smb_cdevsw, -1, device_get_unit(dev)); - make_dev(&smb_cdevsw, device_get_unit(dev), /* XXX cleanup */ + dev_ops_add(&smb_ops, -1, device_get_unit(dev)); + make_dev(&smb_ops, device_get_unit(dev), /* XXX cleanup */ UID_ROOT, GID_WHEEL, 0600, "smb%d", device_get_unit(dev)); return (0); } static int -smbopen (dev_t dev, int flags, int fmt, struct thread *td) +smbopen (struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct smb_softc *sc = IIC_SOFTC(minor(dev)); if (!sc) @@ -158,8 +149,9 @@ smbopen (dev_t dev, int flags, int fmt, struct thread *td) } static int -smbclose(dev_t dev, int flags, int fmt, struct thread *td) +smbclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct smb_softc *sc = IIC_SOFTC(minor(dev)); if (!sc) @@ -174,40 +166,37 @@ smbclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -smbwrite(dev_t dev, struct uio * uio, int ioflag) +smbwrite(struct dev_write_args *ap) { - /* not supported */ - return (EINVAL); } static int -smbread(dev_t dev, struct uio * uio, int ioflag) +smbread(struct dev_read_args *ap) { - /* not supported */ - return (EINVAL); } static int -smbioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +smbioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; device_t smbdev = IIC_DEVICE(minor(dev)); struct smb_softc *sc = IIC_SOFTC(minor(dev)); device_t parent = device_get_parent(smbdev); int error = 0; - struct smbcmd *s = (struct smbcmd *)data; + struct smbcmd *s = (struct smbcmd *)ap->a_data; if (!sc || !s) return (EINVAL); /* allocate the bus */ if ((error = smbus_request_bus(parent, smbdev, - (flags & O_NONBLOCK) ? SMB_DONTWAIT : (SMB_WAIT | SMB_INTR)))) + (ap->a_fflag & O_NONBLOCK) ? SMB_DONTWAIT : (SMB_WAIT | SMB_INTR)))) return (error); - switch (cmd) { + switch (ap->a_cmd) { case SMB_QUICK_WRITE: error = smbus_error(smbus_quick(parent, s->slave, SMB_QWRITE)); break; diff --git a/sys/bus/usb/usb.c b/sys/bus/usb/usb.c index 181ec062e5..aa9e119af6 100644 --- a/sys/bus/usb/usb.c +++ b/sys/bus/usb/usb.c @@ -1,7 +1,7 @@ /* * $NetBSD: usb.c,v 1.68 2002/02/20 20:30:12 christos Exp $ * $FreeBSD: src/sys/dev/usb/usb.c,v 1.95 2003/11/09 23:54:21 joe Exp $ - * $DragonFly: src/sys/bus/usb/usb.c,v 1.17 2006/06/13 08:11:56 dillon Exp $ + * $DragonFly: src/sys/bus/usb/usb.c,v 1.18 2006/07/28 02:17:34 dillon Exp $ */ /* Also already merged from NetBSD: @@ -73,6 +73,7 @@ #include #include #include +#include #include #if defined(__FreeBSD__) && __FreeBSD_version >= 500014 #include @@ -145,25 +146,15 @@ d_open_t usbopen; d_close_t usbclose; d_read_t usbread; d_ioctl_t usbioctl; -int usbpoll(dev_t, int, usb_proc_ptr); - -struct cdevsw usb_cdevsw = { - /* name */ "usb", - /* maj */ USB_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ usbopen, - /* close */ usbclose, - /* read */ usbread, - /* write */ nowrite, - /* ioctl */ usbioctl, - /* poll */ usbpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +d_poll_t usbpoll; + +struct dev_ops usb_ops = { + { "usb", USB_CDEV_MAJOR, 0 }, + .d_open = usbopen, + .d_close = usbclose, + .d_read = usbread, + .d_ioctl = usbioctl, + .d_poll = usbpoll, }; #endif @@ -320,13 +311,13 @@ USB_ATTACH(usb) /* XXX This is redundant now, but old usbd's will want it */ if (!global_init_done) { /* The device spitting out events */ - cdevsw_add(&usb_cdevsw, -1, USB_DEV_MINOR); - make_dev(&usb_cdevsw, USB_DEV_MINOR, UID_ROOT, GID_OPERATOR, + dev_ops_add(&usb_ops, -1, USB_DEV_MINOR); + make_dev(&usb_ops, USB_DEV_MINOR, UID_ROOT, GID_OPERATOR, 0660, "usb"); global_init_done = 1; } - cdevsw_add(&usb_cdevsw, -1, device_get_unit(self)); - make_dev(&usb_cdevsw, device_get_unit(self), UID_ROOT, GID_OPERATOR, + dev_ops_add(&usb_ops, -1, device_get_unit(self)); + make_dev(&usb_ops, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0660, "usb%d", device_get_unit(self)); #endif @@ -473,8 +464,9 @@ usbctlprint(void *aux, const char *pnp) #endif /* defined(__NetBSD__) || defined(__OpenBSD__) */ int -usbopen(dev_t dev, int flag, int mode, usb_proc_ptr p) +usbopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = USBUNIT(dev); struct usb_softc *sc; @@ -495,8 +487,10 @@ usbopen(dev_t dev, int flag, int mode, usb_proc_ptr p) } int -usbread(dev_t dev, struct uio *uio, int flag) +usbread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct usb_event ue; int unit = USBUNIT(dev); int error, n; @@ -513,7 +507,7 @@ usbread(dev_t dev, struct uio *uio, int flag) n = usb_get_next_event(&ue); if (n != 0) break; - if (flag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { error = EWOULDBLOCK; break; } @@ -529,8 +523,9 @@ usbread(dev_t dev, struct uio *uio, int flag) } int -usbclose(dev_t dev, int flag, int mode, usb_proc_ptr p) +usbclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = USBUNIT(dev); if (unit == USB_DEV_MINOR) { @@ -542,17 +537,18 @@ usbclose(dev_t dev, int flag, int mode, usb_proc_ptr p) } int -usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) +usbioctl(struct dev_ioctl_args *ap) { + dev_t devt = ap->a_head.a_dev; struct usb_softc *sc; int unit = USBUNIT(devt); if (unit == USB_DEV_MINOR) { - switch (cmd) { + switch (ap->a_cmd) { case FIOASYNC: - if (*(int *)data) + if (*(int *)ap->a_data) #if defined(__DragonFly__) - usb_async_proc = p->td_proc; + usb_async_proc = curproc; #elif __FreeBSD_version >= 500000 usb_async_proc = p->td_proc; #else @@ -572,7 +568,7 @@ usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) if (sc->sc_dying) return (EIO); - switch (cmd) { + switch (ap->a_cmd) { #if defined(__FreeBSD__) || defined(__DragonFly__) /* This part should be deleted */ case USB_DISCOVER: @@ -580,7 +576,7 @@ usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) #endif case USB_REQUEST: { - struct usb_ctl_request *ur = (void *)data; + struct usb_ctl_request *ur = (void *)ap->a_data; int len = UGETW(ur->ucr_request.wLength); struct iovec iov; struct uio uio; @@ -606,7 +602,7 @@ usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) uio.uio_rw = ur->ucr_request.bmRequestType & UT_READ ? UIO_READ : UIO_WRITE; - uio.uio_td = p; + uio.uio_td = curthread; ptr = malloc(len, M_TEMP, M_WAITOK); if (uio.uio_rw == UIO_WRITE) { error = uiomove(ptr, len, &uio); @@ -636,7 +632,7 @@ usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) case USB_DEVICEINFO: { - struct usb_device_info *di = (void *)data; + struct usb_device_info *di = (void *)ap->a_data; int addr = di->udi_addr; usbd_device_handle dev; @@ -650,7 +646,7 @@ usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) } case USB_DEVICESTATS: - *(struct usb_device_stats *)data = sc->sc_bus->stats; + *(struct usb_device_stats *)ap->a_data = sc->sc_bus->stats; break; default: @@ -660,8 +656,9 @@ usbioctl(dev_t devt, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) } int -usbpoll(dev_t dev, int events, usb_proc_ptr p) +usbpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; int revents, mask; int unit = USBUNIT(dev); @@ -670,19 +667,16 @@ usbpoll(dev_t dev, int events, usb_proc_ptr p) mask = POLLIN | POLLRDNORM; crit_enter(); - if (events & mask && usb_nevents > 0) - revents |= events & mask; - if (revents == 0 && events & mask) - selrecord(p, &usb_selevent); + if (ap->a_events & mask && usb_nevents > 0) + revents |= ap->a_events & mask; + if (revents == 0 && ap->a_events & mask) + selrecord(curthread, &usb_selevent); crit_exit(); - - return (revents); + ap->a_events = revents; + return (0); } else { -#if defined(__FreeBSD__) || defined(__DragonFly__) + ap->a_events = 0; return (0); /* select/poll never wakes up - back compat */ -#else - return (ENXIO); -#endif } } diff --git a/sys/conf/files b/sys/conf/files index 6c12253908..03501663f0 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,5 +1,5 @@ # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $ -# $DragonFly: src/sys/conf/files,v 1.131 2006/07/07 14:16:29 sephe Exp $ +# $DragonFly: src/sys/conf/files,v 1.132 2006/07/28 02:17:34 dillon Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -567,7 +567,6 @@ kern/subr_blist.c standard kern/subr_sbuf.c standard kern/subr_scanf.c standard kern/subr_taskqueue.c standard -kern/subr_xxx.c standard kern/sys_generic.c standard kern/sys_pipe.c standard kern/sys_process.c standard diff --git a/sys/contrib/dev/fla/fla.c b/sys/contrib/dev/fla/fla.c index 43ee3aa5d7..188b3746ca 100644 --- a/sys/contrib/dev/fla/fla.c +++ b/sys/contrib/dev/fla/fla.c @@ -7,7 +7,7 @@ * ---------------------------------------------------------------------------- * * $FreeBSD: src/sys/contrib/dev/fla/fla.c,v 1.16 1999/12/08 04:45:16 ken Exp $ - * $DragonFly: src/sys/contrib/dev/fla/Attic/fla.c,v 1.12 2006/04/30 17:22:15 dillon Exp $ + * $DragonFly: src/sys/contrib/dev/fla/Attic/fla.c,v 1.13 2006/07/28 02:17:35 dillon Exp $ * */ @@ -60,23 +60,14 @@ static d_open_t flaopen; static d_close_t flaclose; static d_ioctl_t flaioctl; -static struct cdevsw fla_cdevsw = { - /* name */ "fla", - /* maj */ CDEV_MAJOR, - /* flags */ D_DISK | D_CANFREE, - /* port */ NULL, - /* clone */ NULL, - - /* open */ flaopen, - /* close */ flaclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ flaioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ flastrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops fla_ops = { + { "fla", CDEV_MAJOR, D_DISK | D_CANFREE }, + .d_open = flaopen, + .d_close = flaclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = flaioctl, + .d_strategy = flastrategy, }; void * @@ -129,15 +120,16 @@ static struct fla_s { } softc[NFLA]; static int -flaopen(dev_t dev, int flag, int fmt, struct thread *td) +flaopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct fla_s *sc; int error; struct disklabel *dl; if (fla_debug) - printf("flaopen(%s %x %x %p)\n", - devtoname(dev), flag, fmt, td); + printf("flaopen(%s %x %x)\n", + devtoname(dev), ap->a_oflags, ap->a_devtype); sc = dev->si_drv1; @@ -159,14 +151,15 @@ flaopen(dev_t dev, int flag, int fmt, struct thread *td) } static int -flaclose(dev_t dev, int flags, int fmt, struct thread *td) +flaclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int error; struct fla_s *sc; if (fla_debug) - printf("flaclose(%s %x %x %p)\n", - devtoname(dev), flags, fmt, td); + printf("flaclose(%s %x %x)\n", + devtoname(dev), ap->a_fflag, ap->a_devtype); sc = dev->si_drv1; @@ -179,28 +172,31 @@ flaclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -flaioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) +flaioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; if (fla_debug) - printf("flaioctl(%s %lx %p %x %p)\n", - devtoname(dev), cmd, addr, flags, td); + printf("flaioctl(%s %lx %p %x)\n", + devtoname(dev), ap->a_cmd, ap->a_data, ap->a_fflag); return (ENOIOCTL); } -static void -flastrategy(dev_t dev, struct bio *bio) +static int +flastrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; int unit, error; struct fla_s *sc; enum doc2k_work what; if (fla_debug > 1) { - printf("flastrategy(%p) %s %lx, %lld, %ld, %p)\n", - bp, devtoname(dev), bp->b_flags, bio->bio_offset, - bp->b_bcount, bp->b_data); + printf("flastrategy(%p) %s %x, %lld, %d, %p)\n", + bp, devtoname(dev), bp->b_flags, bio->bio_offset, + bp->b_bcount, bp->b_data); } sc = dev->si_drv1; @@ -209,7 +205,7 @@ flastrategy(dev_t dev, struct bio *bio) bioqdisksort(&sc->bio_queue, bio); if (sc->busy) { crit_exit(); - return; + return(0); } sc->busy++; @@ -250,7 +246,7 @@ flastrategy(dev_t dev, struct bio *bio) ENTER(); if (fla_debug > 1 || error) { - printf("fla%d: %d = rwe(%p, %d, %d, %lld, %ld, %p)\n", + printf("fla%d: %d = rwe(%p, %d, %d, %lld, %d, %p)\n", unit, error, bp, unit, what, bio->bio_offset, bp->b_bcount, bp->b_data); } @@ -266,7 +262,7 @@ flastrategy(dev_t dev, struct bio *bio) crit_enter(); } sc->busy = 0; - return; + return(0); } static int @@ -343,7 +339,7 @@ flaattach (device_t dev) DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER, DEVSTAT_PRIORITY_DISK); - sc->dev = disk_create(unit, &sc->disk, 0, &fla_cdevsw); + sc->dev = disk_create(unit, &sc->disk, 0, &fla_ops); sc->dev->si_drv1 = sc; sc->unit = unit; diff --git a/sys/contrib/ipfilter/netinet/ip_fil.c b/sys/contrib/ipfilter/netinet/ip_fil.c index f917003f85..8d035709b4 100644 --- a/sys/contrib/ipfilter/netinet/ip_fil.c +++ b/sys/contrib/ipfilter/netinet/ip_fil.c @@ -6,7 +6,7 @@ * @(#)ip_fil.c 2.41 6/5/96 (C) 1993-2000 Darren Reed * @(#)$Id: ip_fil.c,v 2.42.2.60 2002/08/28 12:40:39 darrenr Exp $ * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.25.2.7 2004/07/04 09:24:38 darrenr Exp $ - * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.20 2005/11/28 17:13:35 dillon Exp $ + * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.21 2006/07/28 02:17:35 dillon Exp $ */ #ifndef SOLARIS #define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4))) @@ -666,12 +666,15 @@ int IPL_EXTERN(ioctl)(dev_t dev, int cmd, caddr_t data, int mode # endif ) #else +#if defined(__DragonFly__) +int IPL_EXTERN(ioctl)(struct dev_ioctl_args *ap) +#else int IPL_EXTERN(ioctl)(dev, cmd, data, mode -#if (defined(_KERNEL) && (defined(__DragonFly__) || defined(__FreeBSD__))) +#if (defined(_KERNEL) && defined(__FreeBSD__)) , td) struct thread *td; # elif (defined(_KERNEL) && ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || \ - (NetBSD >= 199511) || defined(__DragonFly__) || (__FreeBSD_version >= 220000) || \ + (NetBSD >= 199511) || (__FreeBSD_version >= 220000) || \ defined(__OpenBSD__))) , p) struct proc *p; @@ -680,15 +683,22 @@ struct proc *p; # endif dev_t dev; # if defined(__NetBSD__) || defined(__OpenBSD__) || \ - (_BSDI_VERSION >= 199701) || (defined(__DragonFly__) || __FreeBSD_version >= 300000) + (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000) u_long cmd; # else int cmd; # endif caddr_t data; int mode; +#endif /* DragonFly */ #endif /* __sgi */ { +#if defined(__DragonFly__) + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; + int mode = ap->a_fflag; +#endif #if defined(_KERNEL) && !SOLARIS && !defined(__DragonFly__) int s; #endif @@ -1132,20 +1142,19 @@ caddr_t data; /* * routines below for saving IP headers to buffer */ +#ifdef __DragonFly__ +int IPL_EXTERN(open)(struct dev_open_args *ap) +#else # ifdef __sgi -# ifdef _KERNEL int IPL_EXTERN(open)(dev_t *pdev, int flags, int devtype, cred_t *cp) -# else -int IPL_EXTERN(open)(dev_t dev, int flags) -# endif # else int IPL_EXTERN(open)(dev, flags -#if defined(__DragonFly__) || defined(__FreeBSD__) +#if defined(__FreeBSD__) , devtype, td) int devtype; struct thread *td; #elif ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \ - (defined(__DragonFly__) || __FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL) + (__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL) , devtype, p) int devtype; struct proc *p; @@ -1155,7 +1164,11 @@ struct proc *p; dev_t dev; int flags; # endif /* __sgi */ +#endif /* DragonFly */ { +#ifdef __DragonFly__ + dev_t dev = ap->a_head.a_dev; +#endif # if defined(__sgi) && defined(_KERNEL) u_int min = geteminor(*pdev); # else @@ -1170,16 +1183,19 @@ int flags; } +#ifdef __DragonFly__ +int IPL_EXTERN(close)(struct dev_close_args *ap) +#else # ifdef __sgi int IPL_EXTERN(close)(dev_t dev, int flags, int devtype, cred_t *cp) #else int IPL_EXTERN(close)(dev, flags -#if defined(__DragonFly__) || defined(__FreeBSD__) +#if defined(__FreeBSD__) , devtype, td) int devtype; struct thread *td; #elif ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \ - (defined(__DragonFly__) || __FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL) + (__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL) , devtype, p) int devtype; struct proc *p; @@ -1189,7 +1205,11 @@ struct proc *p; dev_t dev; int flags; # endif /* __sgi */ +#endif /* DragonFly */ { +#ifdef __DragonFly__ + dev_t dev = ap->a_head.a_dev; +#endif u_int min = GET_MINOR(dev); if (IPL_LOGMAX < min) @@ -1205,6 +1225,9 @@ int flags; * called during packet processing and cause an inconsistancy to appear in * the filter lists. */ +#ifdef __DragonFly__ +int IPL_EXTERN(read)(struct dev_read_args *ap) +#else # ifdef __sgi int IPL_EXTERN(read)(dev_t dev, uio_t *uio, cred_t *crp) # else @@ -1217,7 +1240,12 @@ int IPL_EXTERN(read)(dev, uio) dev_t dev; struct uio *uio; # endif /* __sgi */ +#endif /* DragonFly */ { +#ifdef __DragonFly__ + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; +#endif # ifdef IPFILTER_LOG return ipflog_read(GET_MINOR(dev), uio); # else diff --git a/sys/contrib/ipfilter/netinet/ip_fil.h b/sys/contrib/ipfilter/netinet/ip_fil.h index b120dc26b7..97081d2d1a 100644 --- a/sys/contrib/ipfilter/netinet/ip_fil.h +++ b/sys/contrib/ipfilter/netinet/ip_fil.h @@ -6,12 +6,16 @@ * @(#)ip_fil.h 1.35 6/5/96 * $Id: ip_fil.h,v 2.29.2.33 2002/06/04 14:46:28 darrenr Exp $ * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_fil.h,v 1.18.2.8 2004/07/05 06:02:35 darrenr Exp $ - * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.h,v 1.8 2005/02/26 14:15:36 joerg Exp $ + * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.h,v 1.9 2006/07/28 02:17:35 dillon Exp $ */ #ifndef __IP_FIL_H__ #define __IP_FIL_H__ +#if defined(__DragonFly__) +#include +#endif + /* * Pathnames for various IP Filter control devices. Used by LKM * and userland, so defined here. @@ -564,9 +568,9 @@ extern void ipfilter_sgi_intfsync (void); extern int iplidentify (char *); # endif #if defined(__DragonFly__) || defined(__FreeBSD__) -extern int iplioctl (dev_t, u_long, caddr_t, int, struct thread *); -extern int iplopen (dev_t, int, int, struct thread *); -extern int iplclose (dev_t, int, int, struct thread *); +extern d_ioctl_t iplioctl; +extern d_open_t iplopen; +extern d_close_t iplclose; #else # if defined(__DragonFly__) || (_BSDI_VERSION >= 199510) || (__FreeBSD_version >= 220000) || \ (NetBSD >= 199511) || defined(__OpenBSD__) @@ -591,7 +595,7 @@ extern void iplclose (struct inode *, struct file *); # endif /* (_BSDI_VERSION >= 199510) */ #endif # if BSD >= 199306 -extern int iplread (dev_t, struct uio *, int); +extern d_read_t iplread; # else # ifndef linux extern int iplread (dev_t, struct uio *); diff --git a/sys/contrib/ipfilter/netinet/mlfk_ipl.c b/sys/contrib/ipfilter/netinet/mlfk_ipl.c index fdcb7321f1..f677a9f863 100644 --- a/sys/contrib/ipfilter/netinet/mlfk_ipl.c +++ b/sys/contrib/ipfilter/netinet/mlfk_ipl.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/contrib/ipfilter/netinet/mlfk_ipl.c,v 1.9.2.2 2002/04/27 17:37:12 darrenr Exp $ - * $DragonFly: src/sys/contrib/ipfilter/netinet/mlfk_ipl.c,v 1.7 2004/05/19 22:52:39 dillon Exp $ + * $DragonFly: src/sys/contrib/ipfilter/netinet/mlfk_ipl.c,v 1.8 2006/07/28 02:17:35 dillon Exp $ */ @@ -103,23 +103,12 @@ SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_minttllog, CTLFLAG_RW, &fr_minttllog, 0, ""); #define CDEV_MAJOR 79 -static struct cdevsw ipl_cdevsw = { - /* name */ "ipl", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ iplopen, - /* close */ iplclose, - /* read */ iplread, - /* write */ nowrite, - /* ioctl */ iplioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ipl_ops = { + { "ipl", CDEV_MAJOR, 0 }, + .d_open = iplopen, + .d_close = iplclose, + .d_read = iplread, + .d_ioctl = iplioctl, }; static int @@ -134,7 +123,7 @@ ipfilter_modevent(module_t mod, int type, void *unused) error = iplattach(); if (error) break; - cdevsw_add(&ipl_cdevsw, 0, 0); + dev_ops_add(&ipl_ops, 0, 0); c = NULL; for(i=strlen(IPL_NAME); i>0; i--) @@ -144,7 +133,7 @@ ipfilter_modevent(module_t mod, int type, void *unused) } if (!c) c = IPL_NAME; - make_dev(&ipl_cdevsw, IPL_LOGIPF, 0, 0, 0600, c); + make_dev(&ipl_ops, IPL_LOGIPF, 0, 0, 0600, c); c = NULL; for(i=strlen(IPL_NAT); i>0; i--) @@ -154,7 +143,7 @@ ipfilter_modevent(module_t mod, int type, void *unused) } if (!c) c = IPL_NAT; - make_dev(&ipl_cdevsw, IPL_LOGNAT, 0, 0, 0600, c); + make_dev(&ipl_ops, IPL_LOGNAT, 0, 0, 0600, c); c = NULL; for(i=strlen(IPL_STATE); i>0; i--) @@ -164,7 +153,7 @@ ipfilter_modevent(module_t mod, int type, void *unused) } if (!c) c = IPL_STATE; - make_dev(&ipl_cdevsw, IPL_LOGSTATE, 0, 0, 0600, c); + make_dev(&ipl_ops, IPL_LOGSTATE, 0, 0, 0600, c); c = NULL; for(i=strlen(IPL_AUTH); i>0; i--) @@ -174,11 +163,11 @@ ipfilter_modevent(module_t mod, int type, void *unused) } if (!c) c = IPL_AUTH; - make_dev(&ipl_cdevsw, IPL_LOGAUTH, 0, 0, 0600, c); + make_dev(&ipl_ops, IPL_LOGAUTH, 0, 0, 0600, c); break; case MOD_UNLOAD : - cdevsw_remove(&ipl_cdevsw, 0, 0); + dev_ops_remove(&ipl_ops, 0, 0); error = ipldetach(); break; default: diff --git a/sys/dev/acpica5/acpi.c b/sys/dev/acpica5/acpi.c index 5ed1417a78..469d0d0893 100644 --- a/sys/dev/acpica5/acpi.c +++ b/sys/dev/acpica5/acpi.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.157 2004/06/05 09:56:04 njl Exp $ - * $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.19 2005/12/11 01:54:07 swildner Exp $ + * $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.20 2006/07/28 02:17:35 dillon Exp $ */ #include "opt_acpi.h" @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -70,15 +71,11 @@ static d_close_t acpiclose; static d_ioctl_t acpiioctl; #define CDEV_MAJOR 152 -static struct cdevsw acpi_cdevsw = { - .d_name = "acpi", - .d_maj = CDEV_MAJOR, - .d_flags = 0, - .d_port = NULL, - .d_clone = NULL, - .old_open = acpiopen, - .old_close = acpiclose, - .old_ioctl = acpiioctl +static struct dev_ops acpi_ops = { + { "acpi", CDEV_MAJOR, 0 }, + .d_open = acpiopen, + .d_close = acpiclose, + .d_ioctl = acpiioctl }; #if __FreeBSD_version >= 500000 @@ -595,8 +592,8 @@ acpi_attach(device_t dev) sc->acpi_sleep_disabled = 0; /* Create the control device */ - cdevsw_add(&acpi_cdevsw, 0, 0); - sc->acpi_dev_t = make_dev(&acpi_cdevsw, 0, UID_ROOT, GID_WHEEL, 0644, + dev_ops_add(&acpi_ops, 0, 0); + sc->acpi_dev_t = make_dev(&acpi_ops, 0, UID_ROOT, GID_WHEEL, 0644, "acpi"); sc->acpi_dev_t->si_drv1 = sc; @@ -2441,19 +2438,19 @@ acpi_deregister_ioctl(u_long cmd, acpi_ioctl_fn fn) } static int -acpiopen(dev_t dev, int flag, int fmt, d_thread_t *td) +acpiopen(struct dev_open_args *ap) { return (0); } static int -acpiclose(dev_t dev, int flag, int fmt, d_thread_t *td) +acpiclose(struct dev_close_args *ap) { return (0); } static int -acpiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) +acpiioctl(struct dev_ioctl_args *ap) { struct acpi_softc *sc; struct acpi_ioctl_hook *hp; @@ -2463,15 +2460,15 @@ acpiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) ACPI_LOCK; error = state = 0; - sc = dev->si_drv1; + sc = ap->a_head.a_dev->si_drv1; /* * Scan the list of registered ioctls, looking for handlers. */ if (acpi_ioctl_hooks_initted) { TAILQ_FOREACH(hp, &acpi_ioctl_hooks, link) { - if (hp->cmd == cmd) { - xerror = hp->fn(cmd, addr, hp->arg); + if (hp->cmd == ap->a_cmd) { + xerror = hp->fn(ap->a_cmd, ap->a_data, hp->arg); if (xerror != 0) error = xerror; goto out; @@ -2484,11 +2481,11 @@ acpiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) * Currently, other ioctls just fetch information. * Not changing system behavior. */ - if((flag & FWRITE) == 0) + if((ap->a_fflag & FWRITE) == 0) return (EPERM); /* Core system ioctls. */ - switch (cmd) { + switch (ap->a_cmd) { case ACPIIO_ENABLE: if (ACPI_FAILURE(acpi_Enable(sc))) error = ENXIO; @@ -2502,7 +2499,7 @@ acpiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) error = ENXIO; break; } - state = *(int *)addr; + state = *(int *)ap->a_data; if (state >= ACPI_STATE_S0 && state <= ACPI_S_STATES_MAX) { if (ACPI_FAILURE(acpi_SetSleepState(sc, state))) error = EINVAL; diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c index 8fe66ea1ba..3fadf333cb 100644 --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/pci/agp.c,v 1.3.2.4 2002/08/11 19:58:12 alc Exp $ - * $DragonFly: src/sys/dev/agp/agp.c,v 1.20 2006/05/05 20:15:01 dillon Exp $ + * $DragonFly: src/sys/dev/agp/agp.c,v 1.21 2006/07/28 02:17:35 dillon Exp $ */ #include "opt_bus.h" @@ -32,10 +32,11 @@ #include #include +#include +#include #include #include #include -#include #include #include #include @@ -69,23 +70,12 @@ static d_close_t agp_close; static d_ioctl_t agp_ioctl; static d_mmap_t agp_mmap; -static struct cdevsw agp_cdevsw = { - /* name */ "agp", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY, - /* port */ NULL, - /* clone */ NULL, - - /* open */ agp_open, - /* close */ agp_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ agp_ioctl, - /* poll */ nopoll, - /* mmap */ agp_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops agp_ops = { + { "agp", CDEV_MAJOR, D_TTY }, + .d_open = agp_open, + .d_close = agp_close, + .d_ioctl = agp_ioctl, + .d_mmap = agp_mmap, }; static devclass_t agp_devclass; @@ -260,8 +250,8 @@ agp_generic_attach(device_t dev) TAILQ_INIT(&sc->as_memory); sc->as_nextid = 1; - cdevsw_add(&agp_cdevsw, -1, device_get_unit(dev)); - make_dev(&agp_cdevsw, device_get_unit(dev), UID_ROOT, GID_WHEEL, + dev_ops_add(&agp_ops, -1, device_get_unit(dev)); + make_dev(&agp_ops, device_get_unit(dev), UID_ROOT, GID_WHEEL, 0600, "agpgart"); return 0; @@ -274,7 +264,7 @@ agp_generic_detach(device_t dev) bus_release_resource(dev, SYS_RES_MEMORY, AGP_APBASE, sc->as_aperture); agp_flush_cache(); - cdevsw_remove(&agp_cdevsw, -1, device_get_unit(dev)); + dev_ops_remove(&agp_ops, -1, device_get_unit(dev)); return 0; } @@ -734,8 +724,9 @@ agp_unbind_user(device_t dev, agp_unbind *unbind) } static int -agp_open(dev_t kdev, int oflags, int devtype, struct thread *td) +agp_open(struct dev_open_args *ap) { + dev_t kdev = ap->a_head.a_dev; device_t dev = KDEV2DEV(kdev); struct agp_softc *sc = device_get_softc(dev); @@ -748,8 +739,9 @@ agp_open(dev_t kdev, int oflags, int devtype, struct thread *td) } static int -agp_close(dev_t kdev, int fflag, int devtype, struct thread *td) +agp_close(struct dev_close_args *ap) { + dev_t kdev = ap->a_head.a_dev; device_t dev = KDEV2DEV(kdev); struct agp_softc *sc = device_get_softc(dev); struct agp_memory *mem; @@ -771,13 +763,14 @@ agp_close(dev_t kdev, int fflag, int devtype, struct thread *td) } static int -agp_ioctl(dev_t kdev, u_long cmd, caddr_t data, int fflag, struct thread *td) +agp_ioctl(struct dev_ioctl_args *ap) { + dev_t kdev = ap->a_head.a_dev; device_t dev = KDEV2DEV(kdev); - switch (cmd) { + switch (ap->a_cmd) { case AGPIOC_INFO: - return agp_info_user(dev, (agp_info *) data); + return agp_info_user(dev, (agp_info *)ap->a_data); case AGPIOC_ACQUIRE: return agp_acquire_helper(dev, AGP_ACQUIRE_USER); @@ -786,19 +779,19 @@ agp_ioctl(dev_t kdev, u_long cmd, caddr_t data, int fflag, struct thread *td) return agp_release_helper(dev, AGP_ACQUIRE_USER); case AGPIOC_SETUP: - return agp_setup_user(dev, (agp_setup *)data); + return agp_setup_user(dev, (agp_setup *)ap->a_data); case AGPIOC_ALLOCATE: - return agp_allocate_user(dev, (agp_allocate *)data); + return agp_allocate_user(dev, (agp_allocate *)ap->a_data); case AGPIOC_DEALLOCATE: - return agp_deallocate_user(dev, *(int *) data); + return agp_deallocate_user(dev, *(int *)ap->a_data); case AGPIOC_BIND: - return agp_bind_user(dev, (agp_bind *)data); + return agp_bind_user(dev, (agp_bind *)ap->a_data); case AGPIOC_UNBIND: - return agp_unbind_user(dev, (agp_unbind *)data); + return agp_unbind_user(dev, (agp_unbind *)ap->a_data); } @@ -806,14 +799,16 @@ agp_ioctl(dev_t kdev, u_long cmd, caddr_t data, int fflag, struct thread *td) } static int -agp_mmap(dev_t kdev, vm_offset_t offset, int prot) +agp_mmap(struct dev_mmap_args *ap) { + dev_t kdev = ap->a_head.a_dev; device_t dev = KDEV2DEV(kdev); struct agp_softc *sc = device_get_softc(dev); - if (offset > AGP_GET_APERTURE(dev)) - return -1; - return atop(rman_get_start(sc->as_aperture) + offset); + if (ap->a_offset > AGP_GET_APERTURE(dev)) + return EINVAL; + ap->a_result = atop(rman_get_start(sc->as_aperture) + ap->a_offset); + return(0); } /* Implementation of the kernel api */ diff --git a/sys/dev/disk/ata/ata-all.c b/sys/dev/disk/ata/ata-all.c index 4526b36bb8..8f2a98a649 100644 --- a/sys/dev/disk/ata/ata-all.c +++ b/sys/dev/disk/ata/ata-all.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/ata-all.c,v 1.50.2.45 2003/03/12 14:47:12 sos Exp $ - * $DragonFly: src/sys/dev/disk/ata/ata-all.c,v 1.28 2005/10/13 00:02:29 dillon Exp $ + * $DragonFly: src/sys/dev/disk/ata/ata-all.c,v 1.29 2006/07/28 02:17:35 dillon Exp $ */ #include "opt_ata.h" @@ -66,23 +66,11 @@ union ata_request { /* device structures */ static d_ioctl_t ataioctl; -static struct cdevsw ata_cdevsw = { - /* name */ "ata", - /* maj */ 159, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ nullopen, - /* close */ nullclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ ataioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ata_ops = { + { "ata", 159, 0 }, + .d_open = nullopen, + .d_close = nullclose, + .d_ioctl = ataioctl, }; /* prototypes */ @@ -320,14 +308,14 @@ ata_resume(device_t dev) } static int -ataioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct thread *td) +ataioctl(struct dev_ioctl_args *ap) { - struct ata_cmd *iocmd = (struct ata_cmd *)addr; + struct ata_cmd *iocmd = (struct ata_cmd *)ap->a_data; struct ata_channel *ch; device_t device = devclass_get_device(ata_devclass, iocmd->channel); int error; - if (cmd != IOCATA) + if (ap->a_cmd != IOCATA) return ENOTTY; if (iocmd->channel < -1 || iocmd->device < -1 || iocmd->device > SLAVE) @@ -1588,8 +1576,8 @@ static void ata_init(void) { /* register controlling device */ - cdevsw_add(&ata_cdevsw, 0, 0); - make_dev(&ata_cdevsw, 0, UID_ROOT, GID_OPERATOR, 0600, "ata"); + dev_ops_add(&ata_ops, 0, 0); + make_dev(&ata_ops, 0, UID_ROOT, GID_OPERATOR, 0600, "ata"); /* register boot attach to be run when interrupts are enabled */ ata_delayed_attach = malloc(sizeof(struct intr_config_hook), diff --git a/sys/dev/disk/ata/ata-disk.c b/sys/dev/disk/ata/ata-disk.c index 8ff4023bae..d54d19917d 100644 --- a/sys/dev/disk/ata/ata-disk.c +++ b/sys/dev/disk/ata/ata-disk.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.60.2.24 2003/01/30 07:19:59 sos Exp $ - * $DragonFly: src/sys/dev/disk/ata/ata-disk.c,v 1.28 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/disk/ata/ata-disk.c,v 1.29 2006/07/28 02:17:35 dillon Exp $ */ #include "opt_ata.h" @@ -62,23 +62,14 @@ static d_close_t adclose; static d_strategy_t adstrategy; static d_dump_t addump; -static struct cdevsw ad_cdevsw = { - /* name */ "ad", - /* maj */ 116, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ adopen, - /* close */ adclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ adstrategy, - /* dump */ addump, - /* psize */ nopsize +static struct dev_ops ad_ops = { + { "ad", 116, D_DISK }, + .d_open = adopen, + .d_close = adclose, + .d_read = physread, + .d_write = physwrite, + .d_strategy = adstrategy, + .d_dump = addump, }; /* prototypes */ @@ -204,7 +195,7 @@ ad_attach(struct ata_device *atadev, int alreadylocked) DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_IDE, DEVSTAT_PRIORITY_DISK); - dev = disk_create(adp->lun, &adp->disk, 0, &ad_cdevsw); + dev = disk_create(adp->lun, &adp->disk, 0, &ad_ops); dev->si_drv1 = adp; dev->si_iosize_max = 256 * DEV_BSIZE; adp->dev = dev; @@ -277,9 +268,9 @@ ad_detach(struct ata_device *atadev, int flush) /* get rid of flush XXX SOS */ } static int -adopen(dev_t dev, int flags, int fmt, struct thread *td) +adopen(struct dev_open_args *ap) { - struct ad_softc *adp = dev->si_drv1; + struct ad_softc *adp = ap->a_head.a_dev->si_drv1; if (adp->flags & AD_F_RAID_SUBDISK) return EBUSY; @@ -287,9 +278,9 @@ adopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -adclose(dev_t dev, int flags, int fmt, struct thread *td) +adclose(struct dev_close_args *ap) { - struct ad_softc *adp = dev->si_drv1; + struct ad_softc *adp = ap->a_head.a_dev->si_drv1; crit_enter(); /* interlock non-atomic channel lock */ ATA_SLEEPLOCK_CH(adp->device->channel, ATA_CONTROL); @@ -304,9 +295,11 @@ adclose(dev_t dev, int flags, int fmt, struct thread *td) * note: always use the passed device rather then bp->b_dev, as the bp * may have been translated through several layers. */ -static void -adstrategy(dev_t dev, struct bio *bio) +static int +adstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct ad_softc *adp = dev->si_drv1; @@ -314,18 +307,20 @@ adstrategy(dev_t dev, struct bio *bio) bp->b_error = ENXIO; bp->b_flags |= B_ERROR; biodone(bio); - return; + return(0); } bio->bio_driver_info = dev; crit_enter(); bioqdisksort(&adp->bio_queue, bio); crit_exit(); ata_start(adp->device->channel); + return(0); } int -addump(dev_t dev, u_int count, u_int blkno, u_int secsize) +addump(struct dev_dump_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ad_softc *adp = dev->si_drv1; struct ad_request request; vm_paddr_t addr = 0; @@ -340,14 +335,14 @@ addump(dev_t dev, u_int count, u_int blkno, u_int secsize) adp->device->mode = ATA_PIO; ata_reinit(adp->device->channel); - blkcnt = howmany(PAGE_SIZE, secsize); + blkcnt = howmany(PAGE_SIZE, ap->a_secsize); - while (count > 0) { + while (ap->a_count > 0) { caddr_t va = NULL; DELAY(1000); - if ((count / blkcnt) < dumppages) - dumppages = count / blkcnt; + if ((ap->a_count / blkcnt) < dumppages) + dumppages = ap->a_count / blkcnt; for (i = 0; i < dumppages; ++i) { vm_paddr_t a = addr + (i * PAGE_SIZE); @@ -359,7 +354,7 @@ addump(dev_t dev, u_int count, u_int blkno, u_int secsize) bzero(&request, sizeof(struct ad_request)); request.softc = adp; - request.blockaddr = blkno; + request.blockaddr = ap->a_blkno; request.bytecount = PAGE_SIZE * dumppages; request.data = va; callout_init(&request.callout); @@ -373,11 +368,11 @@ addump(dev_t dev, u_int count, u_int blkno, u_int secsize) DELAY(20); } - if (dumpstatus(addr, (off_t)count * DEV_BSIZE) < 0) + if (dumpstatus(addr, (off_t)ap->a_count * DEV_BSIZE) < 0) return EINTR; - blkno += blkcnt * dumppages; - count -= blkcnt * dumppages; + ap->a_blkno += blkcnt * dumppages; + ap->a_count -= blkcnt * dumppages; addr += PAGE_SIZE * dumppages; } diff --git a/sys/dev/disk/ata/ata-raid.c b/sys/dev/disk/ata/ata-raid.c index 0be9798bde..7c90619df1 100644 --- a/sys/dev/disk/ata/ata-raid.c +++ b/sys/dev/disk/ata/ata-raid.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/ata-raid.c,v 1.3.2.19 2003/01/30 07:19:59 sos Exp $ - * $DragonFly: src/sys/dev/disk/ata/ata-raid.c,v 1.20 2006/05/03 06:28:01 dillon Exp $ + * $DragonFly: src/sys/dev/disk/ata/ata-raid.c,v 1.21 2006/07/28 02:17:35 dillon Exp $ */ #include "opt_ata.h" @@ -54,23 +54,13 @@ static d_open_t aropen; static d_strategy_t arstrategy; -static struct cdevsw ar_cdevsw = { - /* name */ "ar", - /* maj */ 157, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ aropen, - /* close */ nullclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ arstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ar_ops = { + { "ar", 157, D_DISK }, + .d_open = aropen, + .d_close = nullclose, + .d_read = physread, + .d_write = physwrite, + .d_strategy = arstrategy, }; /* prototypes */ @@ -186,7 +176,7 @@ ar_attach_raid(struct ar_softc *rdp, int update) int disk; ar_config_changed(rdp, update); - dev = disk_create(rdp->lun, &rdp->disk, 0, &ar_cdevsw); + dev = disk_create(rdp->lun, &rdp->disk, 0, &ar_ops); dev->si_drv1 = rdp; dev->si_iosize_max = 256 * DEV_BSIZE; rdp->dev = dev; @@ -464,9 +454,9 @@ ata_raid_rebuild(int array) } static int -aropen(dev_t dev, int flags, int fmt, struct thread *td) +aropen(struct dev_open_args *ap) { - struct ar_softc *rdp = dev->si_drv1; + struct ar_softc *rdp = ap->a_head.a_dev->si_drv1; struct disklabel *dl; dl = &rdp->disk.d_label; @@ -480,9 +470,11 @@ aropen(dev_t dev, int flags, int fmt, struct thread *td) return 0; } -static void -arstrategy(dev_t dev, struct bio *bio) +static int +arstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct ar_softc *rdp = dev->si_drv1; int blkno, count, chunk, lba, lbs, tmplba; @@ -495,7 +487,7 @@ arstrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = EIO; biodone(bio); - return; + return(0); } KKASSERT((bio->bio_offset & DEV_BMASK) == 0); @@ -546,7 +538,7 @@ arstrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = EIO; biodone(bio); - return; + return(0); } buf1 = malloc(sizeof(struct ar_buf), M_AR, M_INTWAIT | M_ZERO); @@ -577,7 +569,7 @@ arstrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = EIO; biodone(bio); - return; + return(0); } dev_dstrategy(AD_SOFTC(rdp->disks[buf1->drive])->dev, &buf1->bp.b_bio1); @@ -613,7 +605,7 @@ arstrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = EIO; biodone(bio); - return; + return(0); } if (bp->b_cmd == BUF_CMD_READ) { if ((buf1_blkno < @@ -658,6 +650,7 @@ arstrategy(dev_t dev, struct bio *bio) printf("ar%d: unknown array type in arstrategy\n", rdp->lun); } } + return(0); } static void diff --git a/sys/dev/disk/ata/atapi-cd.c b/sys/dev/disk/ata/atapi-cd.c index 696ca18670..dbf14135df 100644 --- a/sys/dev/disk/ata/atapi-cd.c +++ b/sys/dev/disk/ata/atapi-cd.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-cd.c,v 1.48.2.20 2002/11/25 05:30:31 njl Exp $ - * $DragonFly: src/sys/dev/disk/ata/atapi-cd.c,v 1.22 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/disk/ata/atapi-cd.c,v 1.23 2006/07/28 02:17:35 dillon Exp $ */ #include "opt_ata.h" @@ -59,23 +59,14 @@ static d_close_t acdclose; static d_ioctl_t acdioctl; static d_strategy_t acdstrategy; -static struct cdevsw acd_cdevsw = { - /* name */ "acd", - /* maj */ 117, - /* flags */ D_DISK | D_TRACKCLOSE, - /* port */ NULL, - /* clone */ NULL, - - /* open */ acdopen, - /* close */ acdclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ acdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ acdstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops acd_ops = { + { "acd", 117, D_DISK | D_TRACKCLOSE }, + .d_open = acdopen, + .d_close = acdclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = acdioctl, + .d_strategy = acdstrategy, }; /* prototypes */ @@ -229,7 +220,7 @@ acddetach(struct ata_device *atadev) } release_dev(cdp->dev); devstat_remove_entry(cdp->stats); - cdevsw_remove(&acd_cdevsw, dkunitmask(), dkmakeunit(cdp->lun)); + dev_ops_remove(&acd_ops, dkunitmask(), dkmakeunit(cdp->lun)); free(cdp->stats, M_ACD); ata_free_name(atadev); ata_free_lun(&acd_lun_map, cdp->lun); @@ -259,8 +250,8 @@ acd_make_dev(struct acd_softc *cdp) { dev_t dev; - cdevsw_add(&acd_cdevsw, dkunitmask(), dkmakeunit(cdp->lun)); - dev = make_dev(&acd_cdevsw, dkmakeminor(cdp->lun, 0, 0), + dev_ops_add(&acd_ops, dkunitmask(), dkmakeunit(cdp->lun)); + dev = make_dev(&acd_ops, dkmakeminor(cdp->lun, 0, 0), UID_ROOT, GID_OPERATOR, 0644, "acd%d", cdp->lun); reference_dev(dev); dev->si_drv1 = cdp; @@ -484,15 +475,16 @@ msf2lba(u_int8_t m, u_int8_t s, u_int8_t f) } static int -acdopen(dev_t dev, int flags, int fmt, struct thread *td) +acdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct acd_softc *cdp = dev->si_drv1; int timeout = 60; if (!cdp) return ENXIO; - if (flags & FWRITE) { + if (ap->a_oflags & FWRITE) { if (count_dev(dev) > 1) return EBUSY; } @@ -522,8 +514,9 @@ acdopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -acdclose(dev_t dev, int flags, int fmt, struct thread *td) +acdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct acd_softc *cdp = dev->si_drv1; if (!cdp) @@ -541,8 +534,9 @@ acdclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) +acdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct acd_softc *cdp = dev->si_drv1; int error = 0; @@ -554,7 +548,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) tsleep(&cdp->changer_info, 0, "acdctl", 0); } if (cdp->device->flags & ATA_D_MEDIA_CHANGED) - switch (cmd) { + switch (ap->a_cmd) { case CDIOCRESET: atapi_test_ready(cdp->device); break; @@ -565,7 +559,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) cdp->flags |= F_LOCKED; break; } - switch (cmd) { + switch (ap->a_cmd) { case CDIOCRESUME: error = acd_pause_resume(cdp, 1); @@ -594,7 +588,8 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) break; case CDIOCRESET: - error = suser(td); /* note: if no proc EPERM will be returned */ +; /* note: if no proc EPERM will be returned */ + error = suser_cred(ap->a_cred, 0); if (error) break; error = atapi_test_ready(cdp->device); @@ -619,12 +614,12 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) error = EIO; break; } - bcopy(&cdp->toc.hdr, addr, sizeof(cdp->toc.hdr)); + bcopy(&cdp->toc.hdr, ap->a_data, sizeof(cdp->toc.hdr)); break; case CDIOREADTOCENTRYS: { - struct ioc_read_toc_entry *te = (struct ioc_read_toc_entry *)addr; + struct ioc_read_toc_entry *te = (struct ioc_read_toc_entry *)ap->a_data; struct toc *toc = &cdp->toc; int starting_track = te->starting_track; int len; @@ -681,7 +676,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOREADTOCENTRY: { struct ioc_read_toc_single_entry *te = - (struct ioc_read_toc_single_entry *)addr; + (struct ioc_read_toc_single_entry *)ap->a_data; struct toc *toc = &cdp->toc; u_char track = te->track; @@ -726,7 +721,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOCREADSUBCHANNEL: { struct ioc_read_subchannel *args = - (struct ioc_read_subchannel *)addr; + (struct ioc_read_subchannel *)ap->a_data; u_int8_t format; int8_t ccb[16] = { ATAPI_READ_SUBCHANNEL, 0, 0x40, 1, 0, 0, 0, sizeof(cdp->subchan)>>8, sizeof(cdp->subchan), @@ -775,7 +770,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOCPLAYMSF: { - struct ioc_play_msf *args = (struct ioc_play_msf *)addr; + struct ioc_play_msf *args = (struct ioc_play_msf *)ap->a_data; error = acd_play(cdp, @@ -786,7 +781,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOCPLAYBLOCKS: { - struct ioc_play_blocks *args = (struct ioc_play_blocks *)addr; + struct ioc_play_blocks *args = (struct ioc_play_blocks *)ap->a_data; error = acd_play(cdp, args->blk, args->blk + args->len); break; @@ -794,7 +789,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOCPLAYTRACKS: { - struct ioc_play_track *args = (struct ioc_play_track *)addr; + struct ioc_play_track *args = (struct ioc_play_track *)ap->a_data; int t1, t2; if (!cdp->toc.hdr.ending_track) { @@ -819,7 +814,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOCREADAUDIO: { - struct ioc_read_audio *args = (struct ioc_read_audio *)addr; + struct ioc_read_audio *args = (struct ioc_read_audio *)ap->a_data; int32_t lba; caddr_t buffer, ubuf = args->buffer; int8_t ccb[16]; @@ -892,7 +887,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOCGETVOL: { - struct ioc_vol *arg = (struct ioc_vol *)addr; + struct ioc_vol *arg = (struct ioc_vol *)ap->a_data; if ((error = acd_mode_sense(cdp, ATAPI_CDROM_AUDIO_PAGE, (caddr_t)&cdp->au, sizeof(cdp->au)))) @@ -911,7 +906,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDIOCSETVOL: { - struct ioc_vol *arg = (struct ioc_vol *)addr; + struct ioc_vol *arg = (struct ioc_vol *)ap->a_data; if ((error = acd_mode_sense(cdp, ATAPI_CDROM_AUDIO_PAGE, (caddr_t)&cdp->au, sizeof(cdp->au)))) @@ -936,7 +931,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) } case CDIOCSETPATCH: { - struct ioc_patch *arg = (struct ioc_patch *)addr; + struct ioc_patch *arg = (struct ioc_patch *)ap->a_data; error = acd_setchan(cdp, arg->patch[0], arg->patch[1], arg->patch[2], arg->patch[3]); @@ -964,7 +959,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) break; case CDRIOCBLANK: - error = acd_blank(cdp, (*(int *)addr)); + error = acd_blank(cdp, (*(int *)ap->a_data)); break; case CDRIOCNEXTWRITEABLEADDR: @@ -978,16 +973,16 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) error = EINVAL; break; } - *(int*)addr = track_info.next_writeable_addr; + *(int*)ap->a_data = track_info.next_writeable_addr; } break; case CDRIOCINITWRITER: - error = acd_init_writer(cdp, (*(int *)addr)); + error = acd_init_writer(cdp, (*(int *)ap->a_data)); break; case CDRIOCINITTRACK: - error = acd_init_track(cdp, (struct cdr_track *)addr); + error = acd_init_track(cdp, (struct cdr_track *)ap->a_data); break; case CDRIOCFLUSH: @@ -995,12 +990,12 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) break; case CDRIOCFIXATE: - error = acd_fixate(cdp, (*(int *)addr)); + error = acd_fixate(cdp, (*(int *)ap->a_data)); break; case CDRIOCREADSPEED: { - int speed = *(int *)addr; + int speed = *(int *)ap->a_data; /* Preserve old behavior: units in multiples of CDROM speed */ if (speed < 177) @@ -1011,7 +1006,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) case CDRIOCWRITESPEED: { - int speed = *(int *)addr; + int speed = *(int *)ap->a_data; if (speed < 177) speed *= 177; @@ -1020,53 +1015,53 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) break; case CDRIOCGETBLOCKSIZE: - *(int *)addr = cdp->block_size; + *(int *)ap->a_data = cdp->block_size; break; case CDRIOCSETBLOCKSIZE: - cdp->block_size = *(int *)addr; + cdp->block_size = *(int *)ap->a_data; acd_set_ioparm(cdp); break; case CDRIOCGETPROGRESS: - error = acd_get_progress(cdp, (int *)addr); + error = acd_get_progress(cdp, (int *)ap->a_data); break; case CDRIOCSENDCUE: - error = acd_send_cue(cdp, (struct cdr_cuesheet *)addr); + error = acd_send_cue(cdp, (struct cdr_cuesheet *)ap->a_data); break; case DVDIOCREPORTKEY: if (!cdp->cap.read_dvdrom) error = EINVAL; else - error = acd_report_key(cdp, (struct dvd_authinfo *)addr); + error = acd_report_key(cdp, (struct dvd_authinfo *)ap->a_data); break; case DVDIOCSENDKEY: if (!cdp->cap.read_dvdrom) error = EINVAL; else - error = acd_send_key(cdp, (struct dvd_authinfo *)addr); + error = acd_send_key(cdp, (struct dvd_authinfo *)ap->a_data); break; case DVDIOCREADSTRUCTURE: if (!cdp->cap.read_dvdrom) error = EINVAL; else - error = acd_read_structure(cdp, (struct dvd_struct *)addr); + error = acd_read_structure(cdp, (struct dvd_struct *)ap->a_data); break; case DIOCGDINFO: - *(struct disklabel *)addr = cdp->disklabel; + *(struct disklabel *)ap->a_data = cdp->disklabel; break; case DIOCWDINFO: case DIOCSDINFO: - if ((flags & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) error = EBADF; else - error = setdisklabel(&cdp->disklabel, (struct disklabel *)addr, 0); + error = setdisklabel(&cdp->disklabel, (struct disklabel *)ap->a_data, 0); break; case DIOCWLABEL: @@ -1074,8 +1069,8 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) break; case DIOCGPART: - ((struct partinfo *)addr)->disklab = &cdp->disklabel; - ((struct partinfo *)addr)->part = &cdp->disklabel.d_partitions[0]; + ((struct partinfo *)ap->a_data)->disklab = &cdp->disklabel; + ((struct partinfo *)ap->a_data)->part = &cdp->disklabel.d_partitions[0]; break; default: @@ -1084,9 +1079,11 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) return error; } -static void -acdstrategy(dev_t dev, struct bio *bio) +static int +acdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct acd_softc *cdp = dev->si_drv1; @@ -1094,14 +1091,14 @@ acdstrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = ENXIO; biodone(bio); - return; + return(0); } /* if it's a null transfer, return immediatly. */ if (bp->b_bcount == 0) { bp->b_resid = 0; biodone(bio); - return; + return(0); } KKASSERT(bio->bio_offset != NOOFFSET); @@ -1112,6 +1109,7 @@ acdstrategy(dev_t dev, struct bio *bio) bioqdisksort(&cdp->bio_queue, bio); crit_exit(); ata_start(cdp->device->channel); + return(0); } void @@ -1332,7 +1330,7 @@ acd_read_toc(struct acd_softc *cdp) sprintf(name, "acd%dt%d", cdp->lun, track); entry = malloc(sizeof(struct acd_devlist), M_ACD, M_WAITOK | M_ZERO); - entry->dev = make_dev(&acd_cdevsw, (cdp->lun << 3) | (track << 16), + entry->dev = make_dev(&acd_ops, (cdp->lun << 3) | (track << 16), 0, 0, 0644, name, NULL); entry->dev->si_drv1 = cdp->dev->si_drv1; reference_dev(entry->dev); diff --git a/sys/dev/disk/ata/atapi-fd.c b/sys/dev/disk/ata/atapi-fd.c index 69632e32b3..9f93347b99 100644 --- a/sys/dev/disk/ata/atapi-fd.c +++ b/sys/dev/disk/ata/atapi-fd.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-fd.c,v 1.44.2.9 2002/07/31 11:19:26 sos Exp $ - * $DragonFly: src/sys/dev/disk/ata/atapi-fd.c,v 1.15 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/disk/ata/atapi-fd.c,v 1.16 2006/07/28 02:17:35 dillon Exp $ */ #include @@ -54,23 +54,14 @@ static d_close_t afdclose; static d_ioctl_t afdioctl; static d_strategy_t afdstrategy; -static struct cdevsw afd_cdevsw = { - /* name */ "afd", - /* maj */ 118, - /* flags */ D_DISK | D_TRACKCLOSE, - /* port */ NULL, - /* clone */ NULL, - - /* open */ afdopen, - /* close */ afdclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ afdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ afdstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops afd_ops = { + { "afd", 118, D_DISK | D_TRACKCLOSE }, + .d_open = afdopen, + .d_close = afdclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = afdioctl, + .d_strategy = afdstrategy, }; /* prototypes */ @@ -111,7 +102,7 @@ afdattach(struct ata_device *atadev) DEVSTAT_NO_ORDERED_TAGS, DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_IDE, DEVSTAT_PRIORITY_WFD); - dev = disk_create(fdp->lun, &fdp->disk, 0, &afd_cdevsw); + dev = disk_create(fdp->lun, &fdp->disk, 0, &afd_ops); dev->si_drv1 = fdp; fdp->dev = dev; @@ -237,8 +228,9 @@ afd_describe(struct afd_softc *fdp) } static int -afdopen(dev_t dev, int flags, int fmt, struct thread *td) +afdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct afd_softc *fdp = dev->si_drv1; struct disklabel *label = &fdp->disk.d_label; @@ -263,8 +255,9 @@ afdopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -afdclose(dev_t dev, int flags, int fmt, struct thread *td) +afdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct afd_softc *fdp = dev->si_drv1; if (count_dev(dev) == 1) @@ -273,11 +266,12 @@ afdclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -afdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +afdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct afd_softc *fdp = dev->si_drv1; - switch (cmd) { + switch (ap->a_cmd) { case CDIOCEJECT: if (count_dev(dev) > 1) return EBUSY; @@ -293,9 +287,11 @@ afdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) } } -static void -afdstrategy(dev_t dev, struct bio *bio) +static int +afdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct afd_softc *fdp = dev->si_drv1; @@ -303,20 +299,21 @@ afdstrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = ENXIO; biodone(bio); - return; + return(0); } /* if it's a null transfer, return immediatly. */ if (bp->b_bcount == 0) { bp->b_resid = 0; biodone(bio); - return; + return(0); } crit_enter(); bioqdisksort(&fdp->bio_queue, bio); crit_exit(); ata_start(fdp->device->channel); + return(0); } void diff --git a/sys/dev/disk/ata/atapi-tape.c b/sys/dev/disk/ata/atapi-tape.c index 2ac4bcbec4..ef57b0d05a 100644 --- a/sys/dev/disk/ata/atapi-tape.c +++ b/sys/dev/disk/ata/atapi-tape.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-tape.c,v 1.36.2.12 2002/07/31 11:19:26 sos Exp $ - * $DragonFly: src/sys/dev/disk/ata/atapi-tape.c,v 1.15 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/disk/ata/atapi-tape.c,v 1.16 2006/07/28 02:17:35 dillon Exp $ */ #include "opt_ata.h" @@ -55,23 +55,14 @@ static d_close_t astclose; static d_ioctl_t astioctl; static d_strategy_t aststrategy; -static struct cdevsw ast_cdevsw = { - /* name */ "ast", - /* maj */ 119, - /* flags */ D_TAPE | D_TRACKCLOSE, - /* port */ NULL, - /* clone */ NULL, - - /* open */ astopen, - /* close */ astclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ astioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ aststrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ast_ops = { + { "ast", 119, D_TAPE | D_TRACKCLOSE }, + .d_open = astopen, + .d_close = astclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = astioctl, + .d_strategy = aststrategy }; /* prototypes */ @@ -137,12 +128,12 @@ astattach(struct ata_device *atadev) DEVSTAT_NO_ORDERED_TAGS, DEVSTAT_TYPE_SEQUENTIAL | DEVSTAT_TYPE_IF_IDE, DEVSTAT_PRIORITY_TAPE); - cdevsw_add(&ast_cdevsw, dkunitmask(), dkmakeunit(stp->lun)); - dev = make_dev(&ast_cdevsw, dkmakeminor(stp->lun, 0, 0), + dev_ops_add(&ast_ops, dkunitmask(), dkmakeunit(stp->lun)); + dev = make_dev(&ast_ops, dkmakeminor(stp->lun, 0, 0), UID_ROOT, GID_OPERATOR, 0640, "ast%d", stp->lun); dev->si_drv1 = stp; dev->si_iosize_max = 256 * DEV_BSIZE; - dev = make_dev(&ast_cdevsw, dkmakeminor(stp->lun, 0, 1), + dev = make_dev(&ast_ops, dkmakeminor(stp->lun, 0, 1), UID_ROOT, GID_OPERATOR, 0640, "nast%d", stp->lun); dev->si_drv1 = stp; dev->si_iosize_max = 256 * DEV_BSIZE; @@ -167,7 +158,7 @@ astdetach(struct ata_device *atadev) biodone(bio); } devstat_remove_entry(&stp->stats); - cdevsw_remove(&ast_cdevsw, dkunitmask(), dkmakeunit(stp->lun)); + dev_ops_remove(&ast_ops, dkunitmask(), dkmakeunit(stp->lun)); ata_free_name(atadev); ata_free_lun(&ast_lun_map, stp->lun); free(stp, M_AST); @@ -254,8 +245,9 @@ ast_describe(struct ast_softc *stp) } static int -astopen(dev_t dev, int flags, int fmt, struct thread *td) +astopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ast_softc *stp = dev->si_drv1; if (!stp) @@ -279,8 +271,9 @@ astopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -astclose(dev_t dev, int flags, int fmt, struct thread *td) +astclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ast_softc *stp = dev->si_drv1; /* flush buffers, some drives fail here, they should report ctl = 0 */ @@ -307,15 +300,16 @@ astclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -astioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +astioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ast_softc *stp = dev->si_drv1; int error = 0; - switch (cmd) { + switch (ap->a_cmd) { case MTIOCGET: { - struct mtget *g = (struct mtget *) addr; + struct mtget *g = (struct mtget *) ap->a_data; bzero(g, sizeof(struct mtget)); g->mt_type = 7; @@ -333,7 +327,7 @@ astioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) case MTIOCTOP: { int i; - struct mtop *mt = (struct mtop *)addr; + struct mtop *mt = (struct mtop *)ap->a_data; switch ((int16_t) (mt->mt_op)) { @@ -394,7 +388,7 @@ astioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) if ((error = ast_read_position(stp, 0, &position))) break; - *(u_int32_t *)addr = position.tape; + *(u_int32_t *)ap->a_data = position.tape; break; } case MTIOCRDHPOS: @@ -403,14 +397,14 @@ astioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) if ((error = ast_read_position(stp, 1, &position))) break; - *(u_int32_t *)addr = position.tape; + *(u_int32_t *)ap->a_data = position.tape; break; } case MTIOCSLOCATE: - error = ast_locate(stp, 0, *(u_int32_t *)addr); + error = ast_locate(stp, 0, *(u_int32_t *)ap->a_data); break; case MTIOCHLOCATE: - error = ast_locate(stp, 1, *(u_int32_t *)addr); + error = ast_locate(stp, 1, *(u_int32_t *)ap->a_data); break; default: error = ENOTTY; @@ -418,9 +412,11 @@ astioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) return error; } -static void -aststrategy(dev_t dev, struct bio *bio) +static int +aststrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct ast_softc *stp = dev->si_drv1; @@ -428,20 +424,20 @@ aststrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = ENXIO; biodone(bio); - return; + return(0); } /* if it's a null transfer, return immediatly. */ if (bp->b_bcount == 0) { bp->b_resid = 0; biodone(bio); - return; + return(0); } if (bp->b_cmd != BUF_CMD_READ && (stp->flags & F_WRITEPROTECT)) { bp->b_flags |= B_ERROR; bp->b_error = EPERM; biodone(bio); - return; + return(0); } /* check for != blocksize requests */ @@ -451,7 +447,7 @@ aststrategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = EIO; biodone(bio); - return; + return(0); } /* warn about transfers bigger than the device suggests */ @@ -467,6 +463,7 @@ aststrategy(dev_t dev, struct bio *bio) bioq_insert_tail(&stp->bio_queue, bio); crit_exit(); ata_start(stp->device->channel); + return(0); } void diff --git a/sys/dev/disk/ccd/ccd.c b/sys/dev/disk/ccd/ccd.c index aeda09764b..3f6f1fd903 100644 --- a/sys/dev/disk/ccd/ccd.c +++ b/sys/dev/disk/ccd/ccd.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/dev/ccd/ccd.c,v 1.73.2.1 2001/09/11 09:49:52 kris Exp $ */ -/* $DragonFly: src/sys/dev/disk/ccd/ccd.c,v 1.32 2006/05/06 02:43:02 dillon Exp $ */ +/* $DragonFly: src/sys/dev/disk/ccd/ccd.c,v 1.33 2006/07/28 02:17:35 dillon Exp $ */ /* $NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ */ @@ -176,23 +176,16 @@ static d_psize_t ccdsize; #define CDEV_MAJOR 74 -static struct cdevsw ccd_cdevsw = { - /* name */ "ccd", - /* maj */ CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ccdopen, - /* close */ ccdclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ ccdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ ccdstrategy, - /* dump */ ccddump, - /* psize */ ccdsize +static struct dev_ops ccd_ops = { + { "ccd", CDEV_MAJOR, D_DISK }, + .d_open = ccdopen, + .d_close = ccdclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = ccdioctl, + .d_strategy = ccdstrategy, + .d_dump = ccddump, + .d_psize = ccdsize }; /* called during module initialization */ @@ -205,8 +198,8 @@ static void ccdiodone (struct bio *bio); static void ccdstart (struct ccd_softc *, struct bio *); static void ccdinterleave (struct ccd_softc *, int); static void ccdintr (struct ccd_softc *, struct bio *); -static int ccdinit (struct ccddevice *, char **, struct thread *); -static int ccdlookup (char *, struct thread *td, struct vnode **); +static int ccdinit (struct ccddevice *, char **, struct ucred *); +static int ccdlookup (char *, struct vnode **); static void ccdbuffer (struct ccdbuf **ret, struct ccd_softc *, struct bio *, off_t, caddr_t, long); static void ccdgetdisklabel (dev_t); @@ -315,7 +308,7 @@ ccdattach(void) M_WAITOK | M_ZERO); numccd = num; - cdevsw_add(&ccd_cdevsw, 0, 0); + dev_ops_add(&ccd_ops, 0, 0); /* XXX: is this necessary? */ for (i = 0; i < numccd; ++i) ccddevs[i].ccd_dk = -1; @@ -345,7 +338,7 @@ ccd_modevent(module_t mod, int type, void *data) DEV_MODULE(ccd, ccd_modevent, NULL); static int -ccdinit(struct ccddevice *ccd, char **cpaths, struct thread *td) +ccdinit(struct ccddevice *ccd, char **cpaths, struct ucred *cred) { struct ccd_softc *cs = &ccd_softc[ccd->ccd_unit]; struct ccdcinfo *ci = NULL; /* XXX */ @@ -358,10 +351,6 @@ ccdinit(struct ccddevice *ccd, char **cpaths, struct thread *td) struct ccdgeom *ccg = &cs->sc_geom; char tmppath[MAXPATHLEN]; int error = 0; - struct ucred *cred; - - KKASSERT(td->td_proc); - cred = td->td_proc->p_ucred; #ifdef DEBUG if (ccddebug & (CCDB_FOLLOW|CCDB_INIT)) @@ -673,8 +662,9 @@ ccdinterleave(struct ccd_softc *cs, int unit) /* ARGSUSED */ static int -ccdopen(dev_t dev, int flags, int fmt, d_thread_t *td) +ccdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = ccdunit(dev); struct ccd_softc *cs; struct disklabel *lp; @@ -719,8 +709,9 @@ ccdopen(dev_t dev, int flags, int fmt, d_thread_t *td) /* ARGSUSED */ static int -ccdclose(dev_t dev, int flags, int fmt, d_thread_t *td) +ccdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = ccdunit(dev); struct ccd_softc *cs; int error = 0, part; @@ -745,9 +736,11 @@ ccdclose(dev_t dev, int flags, int fmt, d_thread_t *td) return (0); } -static void -ccdstrategy(dev_t dev, struct bio *bio) +static int +ccdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; int unit = ccdunit(dev); struct bio *nbio; struct buf *bp = bio->bio_buf; @@ -822,7 +815,7 @@ ccdstrategy(dev_t dev, struct bio *bio) crit_enter(); ccdstart(cs, nbio); crit_exit(); - return; + return(0); /* * note: bio, not nbio, is valid at the done label. @@ -834,6 +827,7 @@ error: bp->b_flags |= B_ERROR | B_INVAL; done: biodone(bio); + return(0); } static void @@ -1263,20 +1257,17 @@ ccdiodone(struct bio *bio) } static int -ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) +ccdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = ccdunit(dev); int i, j, lookedup = 0, error = 0; int part, pmask; struct ccd_softc *cs; - struct ccd_ioctl *ccio = (struct ccd_ioctl *)data; + struct ccd_ioctl *ccio = (struct ccd_ioctl *)ap->a_data; struct ccddevice ccd; char **cpp; struct vnode **vpp; - struct ucred *cred; - - KKASSERT(td->td_proc != NULL); - cred = td->td_proc->p_ucred; if (unit >= numccd) return (ENXIO); @@ -1284,12 +1275,12 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) bzero(&ccd, sizeof(ccd)); - switch (cmd) { + switch (ap->a_cmd) { case CCDIOCSET: if (cs->sc_flags & CCDF_INITED) return (EBUSY); - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EBADF); if ((error = ccdlock(cs)) != 0) @@ -1350,7 +1341,7 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if (ccddebug & CCDB_INIT) printf("ccdioctl: lookedup = %d\n", lookedup); #endif - if ((error = ccdlookup(cpp[i], td, &vpp[i])) != 0) { + if ((error = ccdlookup(cpp[i], &vpp[i])) != 0) { for (j = 0; j < lookedup; ++j) (void)vn_close(vpp[j], FREAD|FWRITE); free(vpp, M_DEVBUF); @@ -1367,7 +1358,7 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) /* * Initialize the ccd. Fills in the softc for us. */ - if ((error = ccdinit(&ccd, cpp, td)) != 0) { + if ((error = ccdinit(&ccd, cpp, ap->a_cred)) != 0) { for (j = 0; j < lookedup; ++j) (void)vn_close(vpp[j], FREAD|FWRITE); bzero(&ccd_softc[unit], sizeof(struct ccd_softc)); @@ -1394,7 +1385,7 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if ((cs->sc_flags & CCDF_INITED) == 0) return (ENXIO); - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EBADF); if ((error = ccdlock(cs)) != 0) @@ -1462,15 +1453,15 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if ((cs->sc_flags & CCDF_INITED) == 0) return (ENXIO); - *(struct disklabel *)data = cs->sc_label; + *(struct disklabel *)ap->a_data = cs->sc_label; break; case DIOCGPART: if ((cs->sc_flags & CCDF_INITED) == 0) return (ENXIO); - ((struct partinfo *)data)->disklab = &cs->sc_label; - ((struct partinfo *)data)->part = + ((struct partinfo *)ap->a_data)->disklab = &cs->sc_label; + ((struct partinfo *)ap->a_data)->part = &cs->sc_label.d_partitions[ccdpart(dev)]; break; @@ -1479,7 +1470,7 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if ((cs->sc_flags & CCDF_INITED) == 0) return (ENXIO); - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EBADF); if ((error = ccdlock(cs)) != 0) @@ -1488,9 +1479,9 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) cs->sc_flags |= CCDF_LABELLING; error = setdisklabel(&cs->sc_label, - (struct disklabel *)data, 0); + (struct disklabel *)ap->a_data, 0); if (error == 0) { - if (cmd == DIOCWDINFO) { + if (ap->a_cmd == DIOCWDINFO) { dev_t cdev = CCDLABELDEV(dev); error = writedisklabel(cdev, &cs->sc_label); } @@ -1508,9 +1499,9 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if ((cs->sc_flags & CCDF_INITED) == 0) return (ENXIO); - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EBADF); - if (*(int *)data != 0) + if (*(int *)ap->a_data != 0) cs->sc_flags |= CCDF_WLABEL; else cs->sc_flags &= ~CCDF_WLABEL; @@ -1524,12 +1515,13 @@ ccdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) } static int -ccdsize(dev_t dev) +ccdsize(struct dev_psize_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ccd_softc *cs; int part, size; - if (ccdopen(dev, 0, S_IFCHR, curthread)) + if (dev_dopen(dev, 0, S_IFCHR, proc0.p_ucred)) return (-1); cs = &ccd_softc[ccdunit(dev)]; @@ -1543,14 +1535,15 @@ ccdsize(dev_t dev) else size = cs->sc_label.d_partitions[part].p_size; - if (ccdclose(dev, 0, S_IFCHR, curthread)) + if (dev_dclose(dev, 0, S_IFCHR)) return (-1); - return (size); + ap->a_result = size; + return(0); } static int -ccddump(dev_t dev, u_int count, u_int blkno, u_int secsize) +ccddump(struct dev_dump_args *ap) { /* Not implemented. */ return ENXIO; @@ -1562,15 +1555,12 @@ ccddump(dev_t dev, u_int count, u_int blkno, u_int secsize) * set *vpp to the file's vnode. */ static int -ccdlookup(char *path, struct thread *td, struct vnode **vpp) +ccdlookup(char *path, struct vnode **vpp) { struct nlookupdata nd; - struct ucred *cred; struct vnode *vp; int error; - KKASSERT(td->td_proc); - cred = td->td_proc->p_ucred; *vpp = NULL; error = nlookup_init(&nd, path, UIO_USERSPACE, NLC_FOLLOW|NLC_LOCKVP); diff --git a/sys/dev/disk/fd/fd.c b/sys/dev/disk/fd/fd.c index 3cdc443427..af21f65c51 100644 --- a/sys/dev/disk/fd/fd.c +++ b/sys/dev/disk/fd/fd.c @@ -51,7 +51,7 @@ * * from: @(#)fd.c 7.4 (Berkeley) 5/25/91 * $FreeBSD: src/sys/isa/fd.c,v 1.176.2.8 2002/05/15 21:56:14 joerg Exp $ - * $DragonFly: src/sys/dev/disk/fd/fd.c,v 1.30 2006/05/24 21:50:11 dillon Exp $ + * $DragonFly: src/sys/dev/disk/fd/fd.c,v 1.31 2006/07/28 02:17:35 dillon Exp $ * */ @@ -234,7 +234,7 @@ static timeout_t fd_iotimeout; static timeout_t fd_pseudointr; static int fdstate(struct fdc_data *); static int retrier(struct fdc_data *); -static int fdformat(dev_t, struct fd_formb *, struct thread *); +static int fdformat(dev_t, struct fd_formb *, struct ucred *); static int enable_fifo(fdc_p fdc); @@ -329,23 +329,14 @@ static d_close_t fdclose; static d_ioctl_t fdioctl; static d_strategy_t fdstrategy; -static struct cdevsw fd_cdevsw = { - /* name */ "fd", - /* maj */ FD_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ Fdopen, - /* close */ fdclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ fdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ fdstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops fd_ops = { + { "fd", FD_CDEV_MAJOR, D_DISK }, + .d_open = Fdopen, + .d_close = fdclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = fdioctl, + .d_strategy = fdstrategy, }; static int @@ -1026,8 +1017,8 @@ fd_attach(device_t dev) fd = device_get_softc(dev); - cdevsw_add(&fd_cdevsw, -1 << 6, fd->fdu << 6); - make_dev(&fd_cdevsw, (fd->fdu << 6), + dev_ops_add(&fd_ops, -1 << 6, fd->fdu << 6); + make_dev(&fd_ops, (fd->fdu << 6), UID_ROOT, GID_OPERATOR, 0640, "rfd%d", fd->fdu); #if 0 @@ -1267,8 +1258,9 @@ out_fdc(struct fdc_data *fdc, int x) /* fdopen/fdclose */ /****************************************************************************/ int -Fdopen(dev_t dev, int flags, int mode, struct thread *td) +Fdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; fdu_t fdu = FDUNIT(minor(dev)); int type = FDTYPE(minor(dev)); fd_p fd; @@ -1362,8 +1354,9 @@ Fdopen(dev_t dev, int flags, int mode, struct thread *td) } int -fdclose(dev_t dev, int flags, int mode, struct thread *td) +fdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; fdu_t fdu = FDUNIT(minor(dev)); struct fd_data *fd; @@ -1377,9 +1370,11 @@ fdclose(dev_t dev, int flags, int mode, struct thread *td) /****************************************************************************/ /* fdstrategy */ /****************************************************************************/ -void -fdstrategy(dev_t dev, struct bio *bio) +int +fdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; unsigned nblocks, blknum, cando; fdu_t fdu; @@ -1454,10 +1449,11 @@ fdstrategy(dev_t dev, struct bio *bio) fdstart(fdc); crit_exit(); - return; + return(0); bad: biodone(bio); + return(0); } /***************************************************************\ @@ -2165,7 +2161,7 @@ fdformat_wakeup(struct bio *bio) } static int -fdformat(dev_t dev, struct fd_formb *finfo, struct thread *td) +fdformat(dev_t dev, struct fd_formb *finfo, struct ucred *cred) { fdu_t fdu; fd_p fd; @@ -2226,8 +2222,9 @@ fdformat(dev_t dev, struct fd_formb *finfo, struct thread *td) */ static int -fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +fdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; fdu_t fdu = FDUNIT(minor(dev)); fd_p fd = devclass_get_softc(fd_devclass, fdu); size_t fdblk; @@ -2240,7 +2237,7 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) fdblk = 128 << fd->ft->secsize; - switch (cmd) { + switch (ap->a_cmd) { case DIOCGDINFO: bzero(buffer, sizeof (buffer)); dl = (struct disklabel *)buffer; @@ -2255,26 +2252,26 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) else error = EINVAL; - *(struct disklabel *)addr = *dl; + *(struct disklabel *)ap->a_data = *dl; break; case DIOCSDINFO: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) error = EBADF; break; case DIOCWLABEL: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) error = EBADF; break; case DIOCWDINFO: - if ((flag & FWRITE) == 0) { + if ((ap->a_fflag & FWRITE) == 0) { error = EBADF; break; } - dl = (struct disklabel *)addr; + dl = (struct disklabel *)ap->a_data; if ((error = setdisklabel((struct disklabel *)buffer, dl, (u_long)0)) != 0) @@ -2283,36 +2280,36 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) error = writedisklabel(dev, (struct disklabel *)buffer); break; case FD_FORM: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) error = EBADF; /* must be opened for writing */ - else if (((struct fd_formb *)addr)->format_version != + else if (((struct fd_formb *)ap->a_data)->format_version != FD_FORMAT_VERSION) error = EINVAL; /* wrong version of formatting prog */ else - error = fdformat(dev, (struct fd_formb *)addr, td); + error = fdformat(dev, (struct fd_formb *)ap->a_data, ap->a_cred); break; case FD_GTYPE: /* get drive type */ - *(struct fd_type *)addr = *fd->ft; + *(struct fd_type *)ap->a_data = *fd->ft; break; case FD_STYPE: /* set drive type */ /* this is considered harmful; only allow for superuser */ - if (suser(td) != 0) + if (suser_cred(ap->a_cred, 0) != 0) return EPERM; - *fd->ft = *(struct fd_type *)addr; + *fd->ft = *(struct fd_type *)ap->a_data; break; case FD_GOPTS: /* get drive options */ - *(int *)addr = fd->options; + *(int *)ap->a_data = fd->options; break; case FD_SOPTS: /* set drive options */ - fd->options = *(int *)addr; + fd->options = *(int *)ap->a_data; break; case FD_GSTAT: - fsp = (struct fdc_status *)addr; + fsp = (struct fdc_status *)ap->a_data; if ((fd->fdc->flags & FDC_STAT_VALID) == 0) return EINVAL; memcpy(fsp->status, fd->fdc->status, 7 * sizeof(u_int)); diff --git a/sys/dev/disk/isp/isp_freebsd.c b/sys/dev/disk/isp/isp_freebsd.c index f3c1f8767c..8406bb255f 100644 --- a/sys/dev/disk/isp/isp_freebsd.c +++ b/sys/dev/disk/isp/isp_freebsd.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/dev/isp/isp_freebsd.c,v 1.32.2.20 2002/10/11 18:49:25 mjacob Exp $ */ -/* $DragonFly: src/sys/dev/disk/isp/isp_freebsd.c,v 1.13 2005/06/06 22:51:54 corecode Exp $ */ +/* $DragonFly: src/sys/dev/disk/isp/isp_freebsd.c,v 1.14 2006/07/28 02:17:35 dillon Exp $ */ /* * Platform (FreeBSD) dependent common attachment code for Qlogic adapters. * @@ -26,14 +26,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#include "isp_freebsd.h" #include #include -#include /* for use by isp_prt below */ #include +#include #include -#include "isp_ioctl.h" +#include /* for use by isp_prt below */ +#include "isp_ioctl.h" +#include "isp_freebsd.h" static d_ioctl_t ispioctl; static void isp_intr_enable(void *); @@ -45,23 +46,11 @@ static void isp_action(struct cam_sim *, union ccb *); #define ISP_CDEV_MAJOR 248 -static struct cdevsw isp_cdevsw = { - /* name */ "isp", - /* maj */ ISP_CDEV_MAJOR, - /* flags */ D_TAPE, - /* port */ NULL, - /* clone */ NULL, - - /* open */ nullopen, - /* close */ nullclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ ispioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops isp_ops = { + { "isp", ISP_CDEV_MAJOR, D_TAPE }, + .d_open = nullopen, + .d_close = nullclose, + .d_ioctl = ispioctl, }; static struct ispsoftc *isplist = NULL; @@ -204,8 +193,8 @@ isp_attach(struct ispsoftc *isp) /* * Create device nodes */ - cdevsw_add(&isp_cdevsw, -1, device_get_unit(isp->isp_dev)); - make_dev(&isp_cdevsw, device_get_unit(isp->isp_dev), UID_ROOT, + dev_ops_add(&isp_ops, -1, device_get_unit(isp->isp_dev)); + make_dev(&isp_ops, device_get_unit(isp->isp_dev), UID_ROOT, GID_OPERATOR, 0600, "%s", device_get_nameunit(isp->isp_dev)); if (isp->isp_role != ISP_ROLE_NONE) { @@ -239,8 +228,9 @@ isp_freeze_loopdown(struct ispsoftc *isp, char *msg) } static int -ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) +ispioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ispsoftc *isp; int retval = ENOTTY; @@ -254,7 +244,7 @@ ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) if (isp == NULL) return (ENXIO); - switch (cmd) { + switch (ap->a_cmd) { #ifdef ISP_FW_CRASH_DUMP case ISP_GET_FW_CRASH_DUMP: { @@ -293,8 +283,8 @@ ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) case ISP_SDBLEV: { int olddblev = isp->isp_dblev; - isp->isp_dblev = *(int *)addr; - *(int *)addr = olddblev; + isp->isp_dblev = *(int *)ap->a_data; + *(int *)ap->a_data = olddblev; retval = 0; break; } @@ -328,7 +318,7 @@ ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) break; case ISP_FC_GETDINFO: { - struct isp_fc_device *ifc = (struct isp_fc_device *) addr; + struct isp_fc_device *ifc = (struct isp_fc_device *) ap->a_data; struct lportdb *lp; if (ifc->loopid < 0 || ifc->loopid >= MAX_FC_TARG) { @@ -351,7 +341,7 @@ ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) } case ISP_GET_STATS: { - isp_stats_t *sp = (isp_stats_t *) addr; + isp_stats_t *sp = (isp_stats_t *) ap->a_data; MEMZERO(sp, sizeof (*sp)); sp->isp_stat_version = ISP_STATS_VERSION; @@ -385,7 +375,7 @@ ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) break; case ISP_FC_GETHINFO: { - struct isp_hba_device *hba = (struct isp_hba_device *) addr; + struct isp_hba_device *hba = (struct isp_hba_device *) ap->a_data; MEMZERO(hba, sizeof (*hba)); ISP_LOCK(isp); hba->fc_speed = FCPARAM(isp)->isp_gbspeed; @@ -400,7 +390,7 @@ ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) } case ISP_GET_FC_PARAM: { - struct isp_fc_param *f = (struct isp_fc_param *) addr; + struct isp_fc_param *f = (struct isp_fc_param *) ap->a_data; if (!IS_FC(isp)) { retval = EINVAL; @@ -433,7 +423,7 @@ ispioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, d_thread_t *td) } case ISP_SET_FC_PARAM: { - struct isp_fc_param *f = (struct isp_fc_param *) addr; + struct isp_fc_param *f = (struct isp_fc_param *) ap->a_data; u_int32_t param = f->parameter; if (!IS_FC(isp)) { diff --git a/sys/dev/disk/mcd/mcd.c b/sys/dev/disk/mcd/mcd.c index c7e57df258..7b68df49f0 100644 --- a/sys/dev/disk/mcd/mcd.c +++ b/sys/dev/disk/mcd/mcd.c @@ -41,7 +41,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/mcd.c,v 1.115 2000/01/29 16:17:34 peter Exp $ - * $DragonFly: src/sys/dev/disk/mcd/Attic/mcd.c,v 1.18 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/disk/mcd/Attic/mcd.c,v 1.19 2006/07/28 02:17:35 dillon Exp $ */ static const char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore"; @@ -204,26 +204,17 @@ struct isa_driver mcddriver = { mcd_probe, mcd_attach, "mcd" }; static d_open_t mcdopen; static d_close_t mcdclose; static d_ioctl_t mcdioctl; -static d_psize_t mcdsize; static d_strategy_t mcdstrategy; -static struct cdevsw mcd_cdevsw = { - /* name */ "mcd", - /* maj */ MCD_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mcdopen, - /* close */ mcdclose, - /* read */ physread, - /* write */ nowrite, - /* ioctl */ mcdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ mcdstrategy, - /* dump */ nodump, - /* psize */ nopsize +static int mcdsize(dev_t dev); + +static struct dev_ops mcd_ops = { + { "mcd", MCD_CDEV_MAJOR, D_DISK }, + .d_open = mcdopen, + .d_close = mcdclose, + .d_read = physread, + .d_ioctl = mcdioctl, + .d_strategy = mcdstrategy, }; #define mcd_put(port,byte) outb(port,byte) @@ -260,20 +251,22 @@ int mcd_attach(struct isa_device *dev) mcd_configure(cd); #endif /* name filled in probe */ - cdevsw_add(&mcd_cdevsw, dkunitmask(), dkmakeunit(unit)); - make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, 0), + dev_ops_add(&mcd_ops, dkunitmask(), dkmakeunit(unit)); + make_dev(&mcd_ops, dkmakeminor(unit, 0, 0), UID_ROOT, GID_OPERATOR, 0640, "rmcd%da", unit); - make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, RAW_PART), + make_dev(&mcd_ops, dkmakeminor(unit, 0, RAW_PART), UID_ROOT, GID_OPERATOR, 0640, "rmcd%dc", unit); - make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, 0), + make_dev(&mcd_ops, dkmakeminor(unit, 0, 0), UID_ROOT, GID_OPERATOR, 0640, "mcd%da", unit); - make_dev(&mcd_cdevsw, dkmakeminor(unit, 0, RAW_PART), + make_dev(&mcd_ops, dkmakeminor(unit, 0, RAW_PART), UID_ROOT, GID_OPERATOR, 0640, "mcd%dc", unit); return 1; } -int mcdopen(dev_t dev, int flags, int fmt, struct thread *td) +int +mcdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit,part,phys,r,retry; struct mcd_data *cd; @@ -364,8 +357,9 @@ MCD_TRACE("open: partition=%d, disksize = %ld, blksize=%d\n", return ENXIO; } -int mcdclose(dev_t dev, int flags, int fmt, struct thread *td) +int mcdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit,part; struct mcd_data *cd; @@ -388,9 +382,11 @@ int mcdclose(dev_t dev, int flags, int fmt, struct thread *td) return 0; } -void -mcdstrategy(dev_t dev, struct bio *bio) +int +mcdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct bio *nbio; struct buf *bp = bio->bio_buf; struct mcd_data *cd; @@ -450,7 +446,7 @@ MCD_TRACE("strategy: drive not valid\n"); /* now check whether we can perform processing */ mcd_start(unit); - return; + return(0); /* * These cases occur before nbio is set, use bio. @@ -460,7 +456,7 @@ bad: done: bp->b_resid = bp->b_bcount; biodone(bio); - return; + return(0); } static void mcd_start(int unit) @@ -514,8 +510,11 @@ static void mcd_start(int unit) return; } -int mcdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) +int +mcdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; struct mcd_data *cd; int unit,part,retry,r; @@ -525,9 +524,9 @@ int mcdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) if (mcd_getstat(unit, 1) == -1) /* detect disk change too */ return EIO; -MCD_TRACE("ioctl called 0x%lx\n", cmd); +MCD_TRACE("ioctl called 0x%lx\n", ap->a_cmd); - switch (cmd) { + switch (ap->a_cmd) { case CDIOCSETPATCH: case CDIOCGETVOL: case CDIOCSETVOL: @@ -584,7 +583,7 @@ MCD_TRACE("ioctl called 0x%lx\n", cmd); return ENXIO; } - switch (cmd) { + switch (ap->a_cmd) { case DIOCGDINFO: *(struct disklabel *) addr = cd->dlabel; return 0; @@ -600,7 +599,7 @@ MCD_TRACE("ioctl called 0x%lx\n", cmd); */ case DIOCWDINFO: case DIOCSDINFO: - if ((flags & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return EBADF; else { return setdisklabel(&cd->dlabel, diff --git a/sys/dev/disk/md/md.c b/sys/dev/disk/md/md.c index d9284ed4e1..21a2c75a2f 100644 --- a/sys/dev/disk/md/md.c +++ b/sys/dev/disk/md/md.c @@ -7,7 +7,7 @@ * ---------------------------------------------------------------------------- * * $FreeBSD: src/sys/dev/md/md.c,v 1.8.2.2 2002/08/19 17:43:34 jdp Exp $ - * $DragonFly: src/sys/dev/disk/md/md.c,v 1.12 2006/05/11 08:23:20 swildner Exp $ + * $DragonFly: src/sys/dev/disk/md/md.c,v 1.13 2006/07/28 02:17:35 dillon Exp $ * */ @@ -55,23 +55,14 @@ static d_strategy_t mdstrategy_malloc; static d_open_t mdopen; static d_ioctl_t mdioctl; -static struct cdevsw md_cdevsw = { - /* name */ "md", - /* maj */ CDEV_MAJOR, - /* flags */ D_DISK | D_CANFREE | D_MEMDISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mdopen, - /* close */ nullclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ mdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ mdstrategy, - /* dump */ nodump, - /* psize */ nopsize, +static struct dev_ops md_ops = { + { "md", CDEV_MAJOR, D_DISK | D_CANFREE | D_MEMDISK }, + .d_open = mdopen, + .d_close = nullclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = mdioctl, + .d_strategy = mdstrategy, }; struct md_s { @@ -96,14 +87,15 @@ struct md_s { static int mdunits; static int -mdopen(dev_t dev, int flag, int fmt, struct thread *td) +mdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct md_s *sc; struct disklabel *dl; if (md_debug) - printf("mdopen(%s %x %x %p)\n", - devtoname(dev), flag, fmt, td); + printf("mdopen(%s %x %x)\n", + devtoname(dev), ap->a_oflags, ap->a_devtype); sc = dev->si_drv1; if (sc->unit + 1 == mdunits) @@ -121,19 +113,22 @@ mdopen(dev_t dev, int flag, int fmt, struct thread *td) } static int -mdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) +mdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; if (md_debug) - printf("mdioctl(%s %lx %p %x %p)\n", - devtoname(dev), cmd, addr, flags, td); + printf("mdioctl(%s %lx %p %x)\n", + devtoname(dev), ap->a_cmd, ap->a_data, ap->a_fflag); return (ENOIOCTL); } -static void -mdstrategy(dev_t dev, struct bio *bio) +static int +mdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct md_s *sc; @@ -145,16 +140,19 @@ mdstrategy(dev_t dev, struct bio *bio) bio->bio_driver_info = dev; sc = dev->si_drv1; if (sc->type == MD_MALLOC) { - mdstrategy_malloc(dev, bio); + mdstrategy_malloc(ap); } else { - mdstrategy_preload(dev, bio); + mdstrategy_preload(ap); } + return(0); } -static void -mdstrategy_malloc(dev_t dev, struct bio *bio) +static int +mdstrategy_malloc(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; unsigned secno, nsec, secval, uc; u_char *secp, **secpp, *dst; @@ -175,7 +173,7 @@ mdstrategy_malloc(dev_t dev, struct bio *bio) if (sc->busy) { crit_exit(); - return; + return(0); } sc->busy++; @@ -289,12 +287,15 @@ mdstrategy_malloc(dev_t dev, struct bio *bio) crit_enter(); } sc->busy = 0; + return(0); } -static void -mdstrategy_preload(dev_t dev, struct bio *bio) +static int +mdstrategy_preload(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; devstat_trans_flags dop; struct md_s *sc; @@ -312,7 +313,7 @@ mdstrategy_preload(dev_t dev, struct bio *bio) if (sc->busy) { crit_exit(); - return; + return(0); } sc->busy++; @@ -350,6 +351,7 @@ mdstrategy_preload(dev_t dev, struct bio *bio) crit_enter(); } sc->busy = 0; + return(0); } static struct md_s * @@ -365,7 +367,7 @@ mdcreate(void) DEVSTAT_NO_ORDERED_TAGS, DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER, DEVSTAT_PRIORITY_OTHER); - sc->dev = disk_create(sc->unit, &sc->disk, 0, &md_cdevsw); + sc->dev = disk_create(sc->unit, &sc->disk, 0, &md_ops); sc->dev->si_drv1 = sc; return (sc); } diff --git a/sys/dev/disk/scd/scd.c b/sys/dev/disk/scd/scd.c index b9c635f2f6..8ce5142de4 100644 --- a/sys/dev/disk/scd/scd.c +++ b/sys/dev/disk/scd/scd.c @@ -42,7 +42,7 @@ /* $FreeBSD: src/sys/i386/isa/scd.c,v 1.54 2000/01/29 16:00:30 peter Exp $ */ -/* $DragonFly: src/sys/dev/disk/scd/Attic/scd.c,v 1.17 2006/04/30 17:22:16 dillon Exp $ */ +/* $DragonFly: src/sys/dev/disk/scd/Attic/scd.c,v 1.18 2006/07/28 02:17:35 dillon Exp $ */ /* Please send any comments to micke@dynas.se */ @@ -182,23 +182,13 @@ static d_ioctl_t scdioctl; static d_strategy_t scdstrategy; #define CDEV_MAJOR 45 -static struct cdevsw scd_cdevsw = { - /* name */ "scd", - /* maj */ CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ scdopen, - /* close */ scdclose, - /* read */ physread, - /* write */ nowrite, - /* ioctl */ scdioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ scdstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops scd_ops = { + { "scd", CDEV_MAJOR, D_DISK }, + .d_open = scdopen, + .d_close = scdclose, + .d_read = physread, + .d_ioctl = scdioctl, + .d_strategy = scdstrategy, }; @@ -219,21 +209,22 @@ scd_attach(struct isa_device *dev) cd->audio_status = CD_AS_AUDIO_INVALID; bioq_init(&cd->bio_queue); - cdevsw_add(&scd_cdevsw, dkunitmask(), dkmakeunit(unit)); - make_dev(&scd_cdevsw, dkmakeminor(unit, 0, 0), + dev_ops_add(&scd_ops, dkunitmask(), dkmakeunit(unit)); + make_dev(&scd_ops, dkmakeminor(unit, 0, 0), UID_ROOT, GID_OPERATOR, 0640, "rscd%da", unit); - make_dev(&scd_cdevsw, dkmakeminor(unit, 0, RAW_PART), + make_dev(&scd_ops, dkmakeminor(unit, 0, RAW_PART), UID_ROOT, GID_OPERATOR, 0640, "rscd%dc", unit); - make_dev(&scd_cdevsw, dkmakeminor(unit, 0, 0), + make_dev(&scd_ops, dkmakeminor(unit, 0, 0), UID_ROOT, GID_OPERATOR, 0640, "scd%da", unit); - make_dev(&scd_cdevsw, dkmakeminor(unit, 0, RAW_PART), + make_dev(&scd_ops, dkmakeminor(unit, 0, RAW_PART), UID_ROOT, GID_OPERATOR, 0640, "scd%dc", unit); return 1; } static int -scdopen(dev_t dev, int flags, int fmt, struct thread *td) +scdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit,part,phys; int rc; struct scd_data *cd; @@ -286,8 +277,9 @@ scdopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -scdclose(dev_t dev, int flags, int fmt, struct thread *td) +scdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit,part,phys; struct scd_data *cd; @@ -314,9 +306,11 @@ scdclose(dev_t dev, int flags, int fmt, struct thread *td) return 0; } -static void -scdstrategy(dev_t dev, struct bio *bio) +static int +scdstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct bio *nbio; struct scd_data *cd; @@ -371,13 +365,14 @@ scdstrategy(dev_t dev, struct bio *bio) /* now check whether we can perform processing */ scd_start(unit); - return; + return(0); bad: bp->b_flags |= B_ERROR; done: bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } static void @@ -419,8 +414,10 @@ scd_start(int unit) } static int -scdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) +scdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; struct scd_data *cd; int unit,part; @@ -428,12 +425,12 @@ scdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) part = scd_part(dev); cd = scd_data + unit; - XDEBUG(1, ("scd%d: ioctl: cmd=0x%lx\n", unit, cmd)); + XDEBUG(1, ("scd%d: ioctl: cmd=0x%lx\n", unit, ap->a_cmd)); if (!(cd->flags & SCDVALID)) return EIO; - switch (cmd) { + switch (ap->a_cmd) { case DIOCGDINFO: *(struct disklabel *)addr = cd->dlabel; return 0; @@ -489,7 +486,8 @@ scdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) #endif return 0; default: - printf("scd%d: unsupported ioctl (cmd=0x%lx)\n", unit, cmd); + printf("scd%d: unsupported ioctl (cmd=0x%lx)\n", + unit, ap->a_cmd); return ENOTTY; } } diff --git a/sys/dev/disk/vn/vn.c b/sys/dev/disk/vn/vn.c index a7e3257e11..67513818b1 100644 --- a/sys/dev/disk/vn/vn.c +++ b/sys/dev/disk/vn/vn.c @@ -39,7 +39,7 @@ * * from: @(#)vn.c 8.6 (Berkeley) 4/1/94 * $FreeBSD: src/sys/dev/vn/vn.c,v 1.105.2.4 2001/11/18 07:11:00 dillon Exp $ - * $DragonFly: src/sys/dev/disk/vn/vn.c,v 1.24 2006/05/06 02:43:03 dillon Exp $ + * $DragonFly: src/sys/dev/disk/vn/vn.c,v 1.25 2006/07/28 02:17:35 dillon Exp $ */ /* @@ -94,28 +94,20 @@ static d_strategy_t vnstrategy; #define VN_BSIZE_BEST 8192 /* - * cdevsw + * dev_ops * D_DISK we want to look like a disk * D_CANFREE We support BUF_CMD_FREEBLKS */ -static struct cdevsw vn_cdevsw = { - /* name */ "vn", - /* maj */ CDEV_MAJOR, - /* flags */ D_DISK|D_CANFREE, - /* port */ NULL, - /* clone */ NULL, - - /* open */ vnopen, - /* close */ vnclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ vnioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ vnstrategy, - /* dump */ nodump, - /* psize */ vnsize +static struct dev_ops vn_ops = { + { "vn", CDEV_MAJOR, D_DISK | D_CANFREE }, + .d_open = vnopen, + .d_close = vnclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = vnioctl, + .d_strategy = vnstrategy, + .d_psize = vnsize }; struct vn_softc { @@ -148,17 +140,18 @@ static u_long vn_options; static int vnsetcred (struct vn_softc *vn, struct ucred *cred); static void vnclear (struct vn_softc *vn); static int vn_modevent (module_t, int, void *); -static int vniocattach_file (struct vn_softc *, struct vn_ioctl *, dev_t dev, int flag, struct thread *p); -static int vniocattach_swap (struct vn_softc *, struct vn_ioctl *, dev_t dev, int flag, struct thread *p); +static int vniocattach_file (struct vn_softc *, struct vn_ioctl *, dev_t dev, int flag, struct ucred *cred); +static int vniocattach_swap (struct vn_softc *, struct vn_ioctl *, dev_t dev, int flag, struct ucred *cred); static int -vnclose(dev_t dev, int flags, int mode, struct thread *td) +vnclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct vn_softc *vn = dev->si_drv1; IFOPT(vn, VN_LABELS) if (vn->sc_slices != NULL) - dsclose(dev, mode, vn->sc_slices); + dsclose(dev, ap->a_devtype, vn->sc_slices); return (0); } @@ -186,7 +179,7 @@ vnfindvn(dev_t dev) vn = malloc(sizeof *vn, M_DEVBUF, M_WAITOK | M_ZERO); vn->sc_unit = unit; dev->si_drv1 = vn; - vn->sc_devlist = make_dev(&vn_cdevsw, 0, UID_ROOT, + vn->sc_devlist = make_dev(&vn_ops, 0, UID_ROOT, GID_OPERATOR, 0640, "vn%d", unit); if (vn->sc_devlist->si_drv1 == NULL) { reference_dev(vn->sc_devlist); @@ -205,8 +198,9 @@ vnfindvn(dev_t dev) } static int -vnopen(dev_t dev, int flags, int mode, struct thread *td) +vnopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct vn_softc *vn; /* @@ -229,12 +223,12 @@ vnopen(dev_t dev, int flags, int mode, struct thread *td) if (dev->si_bsize_best < VN_BSIZE_BEST) dev->si_bsize_best = VN_BSIZE_BEST; - if ((flags & FWRITE) && (vn->sc_flags & VNF_READONLY)) + if ((ap->a_oflags & FWRITE) && (vn->sc_flags & VNF_READONLY)) return (EACCES); IFOPT(vn, VN_FOLLOW) - printf("vnopen(%s, 0x%x, 0x%x, %p)\n", - devtoname(dev), flags, mode, (void *)td); + printf("vnopen(%s, 0x%x, 0x%x)\n", + devtoname(dev), ap->a_oflags, ap->a_devtype); /* * Initialize label @@ -254,11 +248,11 @@ vnopen(dev_t dev, int flags, int mode, struct thread *td) label.d_secperunit = vn->sc_size; label.d_partitions[RAW_PART].p_size = vn->sc_size; - return (dsopen(dev, mode, 0, &vn->sc_slices, &label)); + return (dsopen(dev, ap->a_devtype, 0, &vn->sc_slices, &label)); } if (dkslice(dev) != WHOLE_DISK_SLICE || dkpart(dev) != RAW_PART || - mode != S_IFCHR) { + ap->a_devtype != S_IFCHR) { return (ENXIO); } } @@ -274,9 +268,11 @@ vnopen(dev_t dev, int flags, int mode, struct thread *td) * * Currently B_ASYNC is only partially handled - for OBJT_SWAP I/O only. */ -static void -vnstrategy(dev_t dev, struct bio *bio) +static int +vnstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp; struct bio *nbio; int unit; @@ -296,7 +292,7 @@ vnstrategy(dev_t dev, struct bio *bio) bp->b_error = ENXIO; bp->b_flags |= B_ERROR; biodone(bio); - return; + return(0); } bp->b_resid = bp->b_bcount; @@ -409,7 +405,7 @@ vnstrategy(dev_t dev, struct bio *bio) /* operation complete */ } else { vm_pager_strategy(vn->sc_object, nbio); - return; + return(0); /* NOT REACHED */ } } else { @@ -419,7 +415,7 @@ vnstrategy(dev_t dev, struct bio *bio) /* operation complete */ } biodone(nbio); - return; + return(0); /* * Shortcuts / check failures on the original bio (not nbio). @@ -429,24 +425,27 @@ bad: bp->b_flags |= B_ERROR | B_INVAL; done: biodone(bio); + return(0); } /* ARGSUSED */ static int -vnioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +vnioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct vn_softc *vn; struct vn_ioctl *vio; int error; u_long *f; vn = dev->si_drv1; - IFOPT(vn,VN_FOLLOW) - printf("vnioctl(%s, 0x%lx, %p, 0x%x, %p): unit %d\n", - devtoname(dev), cmd, (void *)data, flag, (void *)td, + IFOPT(vn,VN_FOLLOW) { + printf("vnioctl(%s, 0x%lx, %p, 0x%x): unit %d\n", + devtoname(dev), ap->a_cmd, ap->a_data, ap->a_fflag, dkunit(dev)); + } - switch (cmd) { + switch (ap->a_cmd) { case VNIOCATTACH: case VNIOCDETACH: case VNIOCGSET: @@ -458,7 +457,8 @@ vnioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) IFOPT(vn,VN_LABELS) { if (vn->sc_slices != NULL) { - error = dsioctl(dev, cmd, data, flag, &vn->sc_slices); + error = dsioctl(dev, ap->a_cmd, ap->a_data, + ap->a_fflag, &vn->sc_slices); if (error != ENOIOCTL) return (error); } @@ -469,22 +469,22 @@ vnioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) vn_specific: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error) return (error); - vio = (struct vn_ioctl *)data; - f = (u_long*)data; - switch (cmd) { + vio = (struct vn_ioctl *)ap->a_data; + f = (u_long*)ap->a_data; + switch (ap->a_cmd) { case VNIOCATTACH: if (vn->sc_flags & VNF_INITED) return(EBUSY); if (vio->vn_file == NULL) - error = vniocattach_swap(vn, vio, dev, flag, td); + error = vniocattach_swap(vn, vio, dev, ap->a_fflag, ap->a_cred); else - error = vniocattach_file(vn, vio, dev, flag, td); + error = vniocattach_file(vn, vio, dev, ap->a_fflag, ap->a_cred); break; case VNIOCDETACH: @@ -539,15 +539,12 @@ vnioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) static int vniocattach_file(struct vn_softc *vn, struct vn_ioctl *vio, dev_t dev, - int flag, struct thread *td) + int flag, struct ucred *cred) { struct vattr vattr; struct nlookupdata nd; int error, flags; struct vnode *vp; - struct proc *p = td->td_proc; - - KKASSERT(p != NULL); flags = FREAD|FWRITE; error = nlookup_init(&nd, vio->vn_file, @@ -585,7 +582,7 @@ vniocattach_file(struct vn_softc *vn, struct vn_ioctl *vio, dev_t dev, vn->sc_size = (quad_t)vio->vn_size * PAGE_SIZE / vn->sc_secsize; else vn->sc_size = vattr.va_size / vn->sc_secsize; - error = vnsetcred(vn, p->p_ucred); + error = vnsetcred(vn, cred); if (error) { vn->sc_vp = NULL; vn_close(vp, flags); @@ -602,7 +599,7 @@ vniocattach_file(struct vn_softc *vn, struct vn_ioctl *vio, dev_t dev, * no other slices or labels are open. Otherwise, * we rely on VNIOCCLR not being abused. */ - error = vnopen(dev, flag, S_IFCHR, td); + error = dev_dopen(dev, flag, S_IFCHR, cred); if (error) vnclear(vn); } @@ -623,12 +620,10 @@ done: static int vniocattach_swap(struct vn_softc *vn, struct vn_ioctl *vio, dev_t dev, - int flag, struct thread *td) + int flag, struct ucred *cred) { int error; - struct proc *p = td->td_proc; - KKASSERT(p != NULL); /* * Range check. Disallow negative sizes or any size less then the * size of a page. Then round to a page. @@ -661,7 +656,7 @@ vniocattach_swap(struct vn_softc *vn, struct vn_ioctl *vio, dev_t dev, } vn->sc_flags |= VNF_INITED; - error = vnsetcred(vn, p->p_ucred); + error = vnsetcred(vn, cred); if (error == 0) { IFOPT(vn, VN_LABELS) { /* @@ -671,7 +666,7 @@ vniocattach_swap(struct vn_softc *vn, struct vn_ioctl *vio, dev_t dev, * no other slices or labels are open. Otherwise, * we rely on VNIOCCLR not being abused. */ - error = vnopen(dev, flag, S_IFCHR, td); + error = dev_dopen(dev, flag, S_IFCHR, cred); } } if (error == 0) { @@ -757,18 +752,19 @@ vnclear(struct vn_softc *vn) vn->sc_size = 0; } -static int -vnsize(dev_t dev) +static int +vnsize(struct dev_psize_args *ap) { + dev_t dev = ap->a_head.a_dev; struct vn_softc *vn; vn = dev->si_drv1; if (!vn) - return(-1); + return(ENXIO); if ((vn->sc_flags & VNF_INITED) == 0) - return(-1); - - return(vn->sc_size); + return(ENXIO); + ap->a_result = vn->sc_size; + return(0); } static int @@ -779,7 +775,7 @@ vn_modevent(module_t mod, int type, void *data) switch (type) { case MOD_LOAD: - cdevsw_add(&vn_cdevsw, 0, 0); + dev_ops_add(&vn_ops, 0, 0); break; case MOD_UNLOAD: /* fall through */ @@ -796,7 +792,7 @@ vn_modevent(module_t mod, int type, void *data) } free(vn, M_DEVBUF); } - cdevsw_remove(&vn_cdevsw, 0, 0); + dev_ops_remove(&vn_ops, 0, 0); break; default: break; diff --git a/sys/dev/disk/wt/wt.c b/sys/dev/disk/wt/wt.c index 954b54dd2c..54f62ff17e 100644 --- a/sys/dev/disk/wt/wt.c +++ b/sys/dev/disk/wt/wt.c @@ -21,7 +21,7 @@ * * Version 1.3, Thu Nov 11 12:09:13 MSK 1993 * $FreeBSD: src/sys/i386/isa/wt.c,v 1.57.2.1 2000/08/08 19:49:53 peter Exp $ - * $DragonFly: src/sys/dev/disk/wt/wt.c,v 1.15 2006/05/01 01:32:11 swildner Exp $ + * $DragonFly: src/sys/dev/disk/wt/wt.c,v 1.16 2006/07/28 02:17:35 dillon Exp $ * */ @@ -185,23 +185,14 @@ static d_strategy_t wtstrategy; #define CDEV_MAJOR 10 -static struct cdevsw wt_cdevsw = { - /* name */ "wt", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ wtopen, - /* close */ wtclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ wtioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ wtstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops wt_ops = { + { "wt", CDEV_MAJOR, 0 }, + .d_open = wtopen, + .d_close = wtclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = wtioctl, + .d_strategy = wtstrategy, }; @@ -269,8 +260,8 @@ wtattach (struct isa_device *id) t->dens = -1; /* unknown density */ isa_dmainit(t->chan, 1024); - cdevsw_add(&wt_cdevsw, -1, id->id_unit); - make_dev(&wt_cdevsw, id->id_unit, 0, 0, 0600, "rwt%d", id->id_unit); + dev_ops_add(&wt_ops, -1, id->id_unit); + make_dev(&wt_ops, id->id_unit, 0, 0, 0600, "rwt%d", id->id_unit); return (1); } @@ -280,8 +271,9 @@ struct isa_driver wtdriver = { wtprobe, wtattach, "wt", }; * Open routine, called on every device open. */ static int -wtopen (dev_t dev, int flag, int fmt, struct thread *td) +wtopen (struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int u = minor (dev) & T_UNIT; wtinfo_t *t = wttab + u; int error; @@ -301,11 +293,11 @@ wtopen (dev_t dev, int flag, int fmt, struct thread *td) return (error); /* Check the controller status */ - if (! wtsense (t, 0, (flag & FWRITE) ? 0 : TP_WRP)) { + if (! wtsense (t, 0, (ap->a_oflags & FWRITE) ? 0 : TP_WRP)) { /* Bad status, reset the controller */ if (! wtreset (t)) return (EIO); - if (! wtsense (t, 1, (flag & FWRITE) ? 0 : TP_WRP)) + if (! wtsense (t, 1, (ap->a_oflags & FWRITE) ? 0 : TP_WRP)) return (EIO); } @@ -351,9 +343,9 @@ wtopen (dev_t dev, int flag, int fmt, struct thread *td) t->flags = TPINUSE; - if (flag & FREAD) + if (ap->a_oflags & FREAD) t->flags |= TPREAD; - if (flag & FWRITE) + if (ap->a_oflags & FWRITE) t->flags |= TPWRITE; return (0); } @@ -362,8 +354,9 @@ wtopen (dev_t dev, int flag, int fmt, struct thread *td) * Close routine, called on last device close. */ static int -wtclose (dev_t dev, int flags, int fmt, struct thread *td) +wtclose (struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int u = minor (dev) & T_UNIT; wtinfo_t *t = wttab + u; @@ -411,8 +404,10 @@ done: * ioctl (int fd, MTIOCTOP, struct mtop *buf) -- do BSD-like op */ static int -wtioctl (dev_t dev, u_long cmd, caddr_t arg, int flags, struct thread *td) +wtioctl (struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t arg = ap->a_data; int u = minor (dev) & T_UNIT; wtinfo_t *t = wttab + u; int error, count, op; @@ -420,7 +415,7 @@ wtioctl (dev_t dev, u_long cmd, caddr_t arg, int flags, struct thread *td) if (u >= NWT || t->type == UNKNOWN) return (ENXIO); - switch (cmd) { + switch (ap->a_cmd) { default: return (EINVAL); case MTIOCIEOT: /* ignore EOT errors */ @@ -508,9 +503,11 @@ wtioctl (dev_t dev, u_long cmd, caddr_t arg, int flags, struct thread *td) /* * Strategy routine. */ -static void -wtstrategy (dev_t dev, struct bio *bio) +static int +wtstrategy (struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; int u = minor(dev) & T_UNIT; wtinfo_t *t = wttab + u; @@ -583,7 +580,7 @@ errxit: bp->b_error = EIO; err2xit: bp->b_flags |= B_ERROR; } xit: biodone (bio); - return; + return(0); } /* diff --git a/sys/dev/drm/drm_drv.h b/sys/dev/drm/drm_drv.h index 3b980c39e7..d48e099d9e 100644 --- a/sys/dev/drm/drm_drv.h +++ b/sys/dev/drm/drm_drv.h @@ -29,7 +29,7 @@ * Gareth Hughes * * $FreeBSD: src/sys/dev/drm/drm_drv.h,v 1.13.2.1 2003/04/26 07:05:28 anholt Exp $ - * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.13 2006/06/13 08:12:01 dillon Exp $ + * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.14 2006/07/28 02:17:36 dillon Exp $ */ /* @@ -206,19 +206,14 @@ static drm_ioctl_desc_t DRM(ioctls)[] = { const char *DRM(find_description)(int vendor, int device); #if defined(__DragonFly__) || defined(__FreeBSD__) -static struct cdevsw DRM(cdevsw) = { - .d_name = DRIVER_NAME, - .d_maj = CDEV_MAJOR, - .d_flags = D_TTY | D_TRACKCLOSE, - .d_port = NULL, - .d_clone = NULL, - - .old_open = DRM( open ), - .old_close = DRM( close ), - .old_read = DRM( read ), - .old_ioctl = DRM( ioctl ), - .old_poll = DRM( poll ), - .old_mmap = DRM( mmap ) +static struct dev_ops DRM(ops) = { + { DRIVER_NAME, CDEV_MAJOR, D_TTY | D_TRACKCLOSE }, + .d_open = DRM(open), + .d_close = DRM(close), + .d_read = DRM(read), + .d_ioctl = DRM(ioctl), + .d_poll = DRM(poll), + .d_mmap = DRM(mmap) }; static int DRM(probe)(device_t dev) @@ -654,8 +649,8 @@ static int DRM(init)( device_t nbdev ) dev = device_get_softc(nbdev); memset( (void *)dev, 0, sizeof(*dev) ); dev->device = nbdev; - cdevsw_add(&DRM(cdevsw), -1, unit); - dev->devnode = make_dev( &DRM(cdevsw), + dev_ops_add(&DRM(ops), -1, unit); + dev->devnode = make_dev( &DRM(ops), unit, DRM_DEV_UID, DRM_DEV_GID, @@ -774,7 +769,7 @@ static void DRM(cleanup)(device_t nbdev) #endif } #endif - cdevsw_remove(&DRM(cdevsw), -1, device_get_unit(nbdev)); + dev_ops_remove(&DRM(ops), -1, device_get_unit(nbdev)); DRM(takedown)( dev ); @@ -820,8 +815,9 @@ int DRM(version)( DRM_IOCTL_ARGS ) return 0; } -int DRM(open)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p) +int DRM(open)(struct dev_open_args *ap) { + dev_t kdev = ap->a_head.a_dev; drm_device_t *dev = NULL; int retcode = 0; @@ -829,7 +825,8 @@ int DRM(open)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p) DRM_DEBUG( "open_count = %d\n", dev->open_count ); - retcode = DRM(open_helper)(kdev, flags, fmt, p, dev); + retcode = DRM(open_helper)(kdev, ap->a_oflags, ap->a_devtype, + curthread, dev); if ( !retcode ) { atomic_inc( &dev->counts[_DRM_STAT_OPENS] ); @@ -845,15 +842,16 @@ int DRM(open)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p) return retcode; } -int DRM(close)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p) +int DRM(close)(struct dev_close_args *ap) { + dev_t kdev = ap->a_head.a_dev; drm_file_t *priv; DRM_DEVICE; int retcode = 0; DRMFILE __unused filp = (void *)(DRM_CURRENTPID); DRM_DEBUG( "open_count = %d\n", dev->open_count ); - priv = DRM(find_file_by_proc)(dev, p); + priv = DRM(find_file_by_proc)(dev, curthread); if (!priv) { DRM_DEBUG("can't find authenticator\n"); return EINVAL; @@ -934,7 +932,7 @@ int DRM(close)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p) #endif /* __NetBSD__ */ DRM_LOCK; - priv = DRM(find_file_by_proc)(dev, p); + priv = DRM(find_file_by_proc)(dev, curthread); if (priv) { priv->refs--; if (!priv->refs) { @@ -965,14 +963,14 @@ int DRM(close)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p) /* DRM(ioctl) is called whenever a process performs an ioctl on /dev/drm. */ -int DRM(ioctl)(dev_t kdev, u_long cmd, caddr_t data, int flags, - DRM_STRUCTPROC *p) +int DRM(ioctl)(struct dev_ioctl_args *ap) { + dev_t kdev = ap->a_head.a_dev; DRM_DEVICE; int retcode = 0; drm_ioctl_desc_t *ioctl; int (*func)(DRM_IOCTL_ARGS); - int nr = DRM_IOCTL_NR(cmd); + int nr = DRM_IOCTL_NR(ap->a_cmd); DRM_PRIV; atomic_inc( &dev->counts[_DRM_STAT_IOCTLS] ); @@ -980,36 +978,36 @@ int DRM(ioctl)(dev_t kdev, u_long cmd, caddr_t data, int flags, #if defined(__DragonFly__) || defined(__FreeBSD__) DRM_DEBUG( "pid=%d, cmd=0x%02lx, nr=0x%02x, dev 0x%lx, auth=%d\n", - DRM_CURRENTPID, cmd, nr, (long)dev->device, priv->authenticated ); + DRM_CURRENTPID, ap->a_cmd, nr, (long)dev->device, priv->authenticated ); #elif defined(__NetBSD__) DRM_DEBUG( "pid=%d, cmd=0x%02lx, nr=0x%02x, dev 0x%lx, auth=%d\n", - DRM_CURRENTPID, cmd, nr, (long)&dev->device, priv->authenticated ); + DRM_CURRENTPID, ap->a_cmd, nr, (long)&dev->device, priv->authenticated ); #endif - switch (cmd) { + switch (ap->a_cmd) { case FIOASYNC: dev->flags |= FASYNC; return 0; #if defined(__DragonFly__) || defined(__FreeBSD__) case FIOSETOWN: - return fsetown(*(int *)data, &dev->buf_sigio); + return fsetown(*(int *)ap->a_data, &dev->buf_sigio); case FIOGETOWN: #if defined(__FreeBSD__) && (__FreeBSD_version >= 500000) - *(int *) data = fgetown(&dev->buf_sigio); + *(int *) ap->a_data = fgetown(&dev->buf_sigio); #else - *(int *) data = fgetown(dev->buf_sigio); + *(int *) ap->a_data = fgetown(dev->buf_sigio); #endif return 0; #endif /* __FreeBSD__ */ #ifdef __NetBSD__ case TIOCSPGRP: - dev->buf_pgid = *(int *)data; + dev->buf_pgid = *(int *)ap->a_data; return 0; case TIOCGPGRP: - *(int *)data = dev->buf_pgid; + *(int *)ap->a_data = dev->buf_pgid; return 0; #endif /* __NetBSD__ */ } @@ -1023,11 +1021,11 @@ int DRM(ioctl)(dev_t kdev, u_long cmd, caddr_t data, int flags, if ( !func ) { DRM_DEBUG( "no function\n" ); retcode = EINVAL; - } else if ( ( ioctl->root_only && DRM_SUSER(p) ) + } else if ( ( ioctl->root_only && suser_cred(ap->a_cred, 0) ) || ( ioctl->auth_needed && !priv->authenticated ) ) { retcode = EACCES; } else { - retcode = func(kdev, cmd, data, flags, p, (void *)DRM_CURRENTPID); + retcode = func(kdev, ap->a_cmd, ap->a_data, ap->a_fflag, curthread, (void *)DRM_CURRENTPID); } } diff --git a/sys/dev/drm/drm_fops.h b/sys/dev/drm/drm_fops.h index 5c552826ab..4559aa8fa1 100644 --- a/sys/dev/drm/drm_fops.h +++ b/sys/dev/drm/drm_fops.h @@ -30,7 +30,7 @@ * Gareth Hughes * * $FreeBSD: src/sys/dev/drm/drm_fops.h,v 1.7.2.1 2003/04/26 07:05:28 anholt Exp $ - * $DragonFly: src/sys/dev/drm/Attic/drm_fops.h,v 1.4 2004/02/13 01:23:57 joerg Exp $ + * $DragonFly: src/sys/dev/drm/Attic/drm_fops.h,v 1.5 2006/07/28 02:17:36 dillon Exp $ */ #include "dev/drm/drmP.h" @@ -100,12 +100,13 @@ int DRM(open_helper)(dev_t kdev, int flags, int fmt, DRM_STRUCTPROC *p, /* The DRM(read) and DRM(poll) are stubs to prevent spurious errors * on older X Servers (4.3.0 and earlier) */ -int DRM(read)(dev_t kdev, struct uio *uio, int ioflag) +int DRM(read)(struct dev_read_args *ap) { return 0; } -int DRM(poll)(dev_t kdev, int events, DRM_STRUCTPROC *p) +int DRM(poll)(struct dev_poll_args *ap) { + ap->a_events = 0; return 0; } diff --git a/sys/dev/drm/drm_os_freebsd.h b/sys/dev/drm/drm_os_freebsd.h index b2181da478..59ac2b26d1 100644 --- a/sys/dev/drm/drm_os_freebsd.h +++ b/sys/dev/drm/drm_os_freebsd.h @@ -1,6 +1,6 @@ /* * $FreeBSD: src/sys/dev/drm/drm_os_freebsd.h,v 1.10.2.1 2003/04/26 07:05:28 anholt Exp $ - * $DragonFly: src/sys/dev/drm/Attic/drm_os_freebsd.h,v 1.17 2006/06/04 21:09:49 dillon Exp $ + * $DragonFly: src/sys/dev/drm/Attic/drm_os_freebsd.h,v 1.18 2006/07/28 02:17:36 dillon Exp $ */ #include #include @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -133,7 +134,7 @@ #define DRM_ERR(v) v #define DRM_PRIV \ - drm_file_t *priv = (drm_file_t *) DRM(find_file_by_proc)(dev, p); \ + drm_file_t *priv = (drm_file_t *) DRM(find_file_by_proc)(dev, curthread); \ if (!priv) { \ DRM_DEBUG("can't find authenticator\n"); \ return EINVAL; \ diff --git a/sys/dev/drm/drm_vm.h b/sys/dev/drm/drm_vm.h index bbd56a6ea4..b3dde7bab6 100644 --- a/sys/dev/drm/drm_vm.h +++ b/sys/dev/drm/drm_vm.h @@ -1,17 +1,23 @@ /* * $FreeBSD: src/sys/dev/drm/drm_vm.h,v 1.6.2.1 2003/04/26 07:05:29 anholt Exp $ - * $DragonFly: src/sys/dev/drm/Attic/drm_vm.h,v 1.3 2004/02/13 01:23:57 joerg Exp $ + * $DragonFly: src/sys/dev/drm/Attic/drm_vm.h,v 1.4 2006/07/28 02:17:36 dillon Exp $ */ #if defined(__FreeBSD__) && __FreeBSD_version >= 500102 static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, vm_paddr_t *paddr, int prot) -#elif defined(__DragonFly__) || defined(__FreeBSD__) +#elif defined(__DragonFly__) +static int DRM(dma_mmap)(struct dev_mmap_args *ap) +#elif defined(__FreeBSD__) static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) #elif defined(__NetBSD__) static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) #endif { +#ifdef __DragonFly__ + dev_t kdev = ap->a_head.a_dev; + vm_offset_t offset = ap->a_offset; +#endif DRM_DEVICE; drm_device_dma_t *dma = dev->dma; unsigned long physical; @@ -24,7 +30,10 @@ static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) physical = dma->pagelist[page]; DRM_DEBUG("0x%08lx (page %lu) => 0x%08lx\n", (long)offset, page, physical); -#if defined(__FreeBSD__) && __FreeBSD_version >= 500102 +#if defined(__DragonFly__) + ap->a_result = physical; + return 0; +#elif defined(__FreeBSD__) && __FreeBSD_version >= 500102 *paddr = physical; return 0; #else @@ -35,12 +44,13 @@ static paddr_t DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) #if defined(__FreeBSD__) && __FreeBSD_version >= 500102 int DRM(mmap)(dev_t kdev, vm_offset_t offset, vm_paddr_t *paddr, int prot) -#elif defined(__DragonFly__) || defined(__FreeBSD__) -int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) +#elif defined(__DragonFly__) +int DRM(mmap)(struct dev_mmap_args *ap) #elif defined(__NetBSD__) paddr_t DRM(mmap)(dev_t kdev, off_t offset, int prot) #endif { + dev_t kdev = ap->a_head.a_dev; DRM_DEVICE; drm_local_map_t *map = NULL; drm_map_list_entry_t *listentry=NULL; @@ -56,12 +66,14 @@ paddr_t DRM(mmap)(dev_t kdev, off_t offset, int prot) return DRM_ERR(EACCES); if (dev->dma - && offset >= 0 - && offset < ptoa(dev->dma->page_count)) + && ap->a_offset >= 0 + && ap->a_offset < ptoa(dev->dma->page_count)) #if defined(__FreeBSD__) && __FreeBSD_version >= 500102 return DRM(dma_mmap)(kdev, offset, paddr, prot); +#elif defined(__DragonFly__) + return DRM(dma_mmap)(ap); #else - return DRM(dma_mmap)(kdev, offset, prot); + return DRM(dma_mmap)(kdev, ap->a_offset, ap->a_nprot); #endif /* A sequential search of a linked list is @@ -74,17 +86,17 @@ paddr_t DRM(mmap)(dev_t kdev, off_t offset, int prot) TAILQ_FOREACH(listentry, dev->maplist, link) { map = listentry->map; /* DRM_DEBUG("considering 0x%x..0x%x\n", map->offset, map->offset + map->size - 1);*/ - if (offset >= map->offset - && offset < map->offset + map->size) break; + if (ap->a_offset >= map->offset + && ap->a_offset < map->offset + map->size) break; } if (!listentry) { DRM_DEBUG("can't find map\n"); - return -1; + return EINVAL; } if (((map->flags&_DRM_RESTRICTED) && DRM_SUSER(DRM_CURPROC))) { DRM_DEBUG("restricted map\n"); - return -1; + return EINVAL; } switch (map->type) { @@ -92,24 +104,30 @@ paddr_t DRM(mmap)(dev_t kdev, off_t offset, int prot) case _DRM_REGISTERS: case _DRM_AGP: #if defined(__FreeBSD__) && __FreeBSD_version >= 500102 - *paddr = offset; + *paddr = ap->a_offset; + return 0; +#elif defined(__DragonFly__) + ap->a_result = atop(ap->a_offset); return 0; #else - return atop(offset); + return atop(ap->a_offset); #endif case _DRM_SCATTER_GATHER: case _DRM_SHM: #if defined(__FreeBSD__) && __FreeBSD_version >= 500102 - *paddr = vtophys(offset); + *paddr = vtophys(ap->a_offset); + return 0; +#elif defined(__DragonFly__) + ap->a_result = vtophys(ap->a_offset); return 0; #else - return atop(vtophys(offset)); + return atop(vtophys(ap->a_offset)); #endif default: - return -1; /* This should never happen. */ + return EINVAL; /* This should never happen. */ } DRM_DEBUG("bailing out\n"); - return -1; + return EINVAL; } diff --git a/sys/dev/misc/dcons/dcons_os.c b/sys/dev/misc/dcons/dcons_os.c index c0c17fc148..fdf6f8ba97 100644 --- a/sys/dev/misc/dcons/dcons_os.c +++ b/sys/dev/misc/dcons/dcons_os.c @@ -32,7 +32,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/dcons/dcons_os.c,v 1.4 2004/10/24 12:41:04 simokawa Exp $ - * $DragonFly: src/sys/dev/misc/dcons/dcons_os.c,v 1.2 2005/06/16 15:50:17 joerg Exp $ + * $DragonFly: src/sys/dev/misc/dcons/dcons_os.c,v 1.3 2006/07/28 02:17:36 dillon Exp $ */ #include @@ -99,40 +99,20 @@ static struct consdev gdbconsdev; #endif #endif +#define CDEV_MAJOR 184 + static d_open_t dcons_open; static d_close_t dcons_close; -#if defined(__DragonFly__) || __FreeBSD_version < 500104 static d_ioctl_t dcons_ioctl; -#endif -static struct cdevsw dcons_cdevsw = { -#ifdef __DragonFly__ -#define CDEV_MAJOR 184 - "dcons", CDEV_MAJOR, D_TTY, NULL, 0, - dcons_open, dcons_close, ttyread, ttywrite, dcons_ioctl, - ttypoll, nommap, nostrategy, nodump, nopsize, -#elif __FreeBSD_version >= 500104 - .d_version = D_VERSION, +static struct dev_ops dcons_ops = { + { "dcons", CDEV_MAJOR, D_TTY }, .d_open = dcons_open, .d_close = dcons_close, - .d_name = "dcons", - .d_flags = D_TTY | D_NEEDGIANT, -#else -#define CDEV_MAJOR 184 - /* open */ dcons_open, - /* close */ dcons_close, - /* read */ ttyread, - /* write */ ttywrite, - /* ioctl */ dcons_ioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* name */ "dcons", - /* major */ CDEV_MAJOR, - /* dump */ nodump, - /* psize */ nopsize, - /* flags */ D_TTY, -#endif + .d_read = ttyread, + .d_write = ttywrite, + .d_ioctl = dcons_ioctl, + .d_poll = ttypoll, }; #ifndef KLD_MODULE @@ -276,8 +256,9 @@ dcons_os_putc(struct dcons_softc *dc, int c) bus_dmamap_sync(dg.dma_tag, dg.dma_map, BUS_DMASYNC_PREWRITE); } static int -dcons_open(DEV dev, int flag, int mode, THREAD *td) +dcons_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; int unit, error; @@ -303,7 +284,7 @@ dcons_open(DEV dev, int flag, int mode, THREAD *td) tp->t_lflag = TTYDEF_LFLAG; tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; ttsetwater(tp); - } else if ((tp->t_state & TS_XCLUDE) && suser(td)) { + } else if ((tp->t_state & TS_XCLUDE) && suser_cred(ap->a_cred, 0)) { crit_exit(); return (EBUSY); } @@ -319,8 +300,9 @@ dcons_open(DEV dev, int flag, int mode, THREAD *td) } static int -dcons_close(DEV dev, int flag, int mode, THREAD *td) +dcons_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; struct tty *tp; @@ -330,22 +312,17 @@ dcons_close(DEV dev, int flag, int mode, THREAD *td) tp = dev->si_tty; if (tp->t_state & TS_ISOPEN) { -#if __FreeBSD_version < 502113 - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); ttyclose(tp); -#else - ttyld_close(tp, flag); - tty_close(tp); -#endif } return (0); } -#if defined(__DragonFly__) || __FreeBSD_version < 500104 static int -dcons_ioctl(DEV dev, u_long cmd, caddr_t data, int flag, THREAD *td) +dcons_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; struct tty *tp; int error; @@ -355,17 +332,16 @@ dcons_ioctl(DEV dev, u_long cmd, caddr_t data, int flag, THREAD *td) return (ENXIO); tp = dev->si_tty; - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, ap->a_cmd, ap->a_data, ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return (error); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, ap->a_cmd, ap->a_data, ap->a_fflag); if (error != ENOIOCTL) return (error); return (ENOTTY); } -#endif static int dcons_tty_param(struct tty *tp, struct termios *t) @@ -425,7 +401,7 @@ static void dcons_cnprobe(struct consdev *cp) { #ifdef __DragonFly__ - cp->cn_dev = make_dev(&dcons_cdevsw, DCONS_CON, + cp->cn_dev = make_dev(&dcons_ops, DCONS_CON, UID_ROOT, GID_WHEEL, 0600, "dcons"); #elif __FreeBSD_version >= 501109 sprintf(cp->cn_name, "dcons"); @@ -562,7 +538,7 @@ ok: #endif gdb_arg = &gdbconsdev; #elif defined(__DragonFly__) - gdbdev = make_dev(&dcons_cdevsw, DCONS_GDB, + gdbdev = make_dev(&dcons_ops, DCONS_GDB, UID_ROOT, GID_WHEEL, 0600, "dgdb"); #else gdbdev = makedev(CDEV_MAJOR, DCONS_GDB); @@ -586,7 +562,7 @@ dcons_attach_port(int port, char *name, int flags) dc = &sc[port]; dc->flags = flags; - dev = make_dev(&dcons_cdevsw, port, + dev = make_dev(&dcons_ops, port, UID_ROOT, GID_WHEEL, 0600, name); dc->dev = (void *)dev; tp = ttymalloc(NULL); @@ -608,7 +584,7 @@ dcons_attach(void) int polltime; #ifdef __DragonFly__ - cdevsw_add(&dcons_cdevsw, -1, 0); + dev_ops_add(&dcons_ops, -1, 0); #endif dcons_attach_port(DCONS_CON, "dcons", 0); dcons_attach_port(DCONS_GDB, "dgdb", DC_GDB); diff --git a/sys/dev/misc/gpib/gpib.c b/sys/dev/misc/gpib/gpib.c index 2587c21096..114f69952b 100644 --- a/sys/dev/misc/gpib/gpib.c +++ b/sys/dev/misc/gpib/gpib.c @@ -17,7 +17,7 @@ * all derivative works or modified versions. * * $FreeBSD: src/sys/i386/isa/gpib.c,v 1.29 2000/01/29 16:17:32 peter Exp $ - * $DragonFly: src/sys/dev/misc/gpib/gpib.c,v 1.10 2005/12/11 01:54:08 swildner Exp $ + * $DragonFly: src/sys/dev/misc/gpib/gpib.c,v 1.11 2006/07/28 02:17:36 dillon Exp $ * */ /*Please read the README file for usage information*/ @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include "gpibreg.h" @@ -64,23 +65,12 @@ static d_write_t gpwrite; static d_ioctl_t gpioctl; #define CDEV_MAJOR 44 -static struct cdevsw gp_cdevsw = { - /* name */ "gp", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ gpopen, - /* close */ gpclose, - /* read */ noread, - /* write */ gpwrite, - /* ioctl */ gpioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops gp_ops = { + { "gp", CDEV_MAJOR, 0 }, + .d_open = gpopen, + .d_close = gpclose, + .d_write = gpwrite, + .d_ioctl = gpioctl, }; #define BUFSIZE 1024 @@ -136,8 +126,8 @@ gpattach(struct isa_device *isdp) printf ("gp%d: type AT-GPIB chip NAT4882A\n",sc->sc_unit); sc->sc_flags |=ATTACHED; - cdevsw_add(&gp_cdevsw, -1, sc->sc_unit); - make_dev(&gp_cdevsw, sc->sc_unit, 0, 0, 0600, "gp"); + dev_ops_add(&gp_ops, -1, sc->sc_unit); + make_dev(&gp_ops, sc->sc_unit, 0, 0, 0600, "gp"); return (1); } @@ -149,8 +139,9 @@ gpattach(struct isa_device *isdp) * i.e. even if gpib5 is open, we can't open another minor device */ static int -gpopen(dev_t dev, int flags, int fmt, struct thread *td) +gpopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct gpib_softc *sc = &gpib_sc; u_char unit; int status; @@ -223,8 +214,9 @@ enableremote(unit); * Close gpib device. */ static int -gpclose(dev_t dev, int flags, int fmt, struct thread *td) +gpclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct gpib_softc *sc = &gpib_sc; unsigned char unit; unsigned char status; @@ -322,8 +314,10 @@ while (!(inb(ISR1)&2)&&(status==EWOULDBLOCK)); * by minor(dev). */ static int -gpwrite(dev_t dev, struct uio *uio, int ioflag) +gpwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int err,count; /* main loop */ @@ -372,13 +366,13 @@ gpwrite(dev_t dev, struct uio *uio, int ioflag) write to using a minor device = its GPIB address */ static int -gpioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +gpioctl(struct dev_ioctl_args *ap) { - struct gpibdata *gd = (struct gpibdata *)data; + struct gpibdata *gd = (struct gpibdata *)ap->a_data; int error,result; error = 0; - switch (cmd) { + switch (ap->a_cmd) { case GPIBWRITE: sendgpibfifo(gd->address,gd->data,*(gd->count)); error=0; diff --git a/sys/dev/misc/joy/joy.c b/sys/dev/misc/joy/joy.c index 0556a24aa9..97b4a6e57d 100644 --- a/sys/dev/misc/joy/joy.c +++ b/sys/dev/misc/joy/joy.c @@ -26,12 +26,13 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/isa/joy.c,v 1.38.2.1 2001/09/01 05:55:31 murray Exp $ - * $DragonFly: src/sys/dev/misc/joy/joy.c,v 1.8 2005/06/16 15:51:34 joerg Exp $ + * $DragonFly: src/sys/dev/misc/joy/joy.c,v 1.9 2006/07/28 02:17:36 dillon Exp $ */ #include #include #include +#include #include #include #include @@ -81,23 +82,12 @@ static d_close_t joyclose; static d_read_t joyread; static d_ioctl_t joyioctl; -static struct cdevsw joy_cdevsw = { - /* name */ "joy", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ joyopen, - /* close */ joyclose, - /* read */ joyread, - /* write */ nowrite, - /* ioctl */ joyioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops joy_ops = { + { "joy", CDEV_MAJOR, 0 }, + .d_open = joyopen, + .d_close = joyclose, + .d_read = joyread, + .d_ioctl = joyioctl, }; devclass_t joy_devclass; @@ -144,8 +134,8 @@ joy_attach (device_t dev) joy->bt = rman_get_bustag(res); joy->port = rman_get_bushandle(res); joy->timeout[0] = joy->timeout[1] = 0; - cdevsw_add(&joy_cdevsw, -1, unit); - make_dev(&joy_cdevsw, unit, 0, 0, 0600, "joy%d", unit); + dev_ops_add(&joy_ops, -1, unit); + make_dev(&joy_ops, unit, 0, 0, 0600, "joy%d", unit); return 0; } @@ -164,8 +154,9 @@ static driver_t joy_isa_driver = { DRIVER_MODULE(joy, isa, joy_isa_driver, joy_devclass, 0, 0); static int -joyopen(dev_t dev, int flags, int fmt, d_thread_t *td) +joyopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int i = joypart (dev); struct joy_softc *joy = JOY_SOFTC(UNIT(dev)); @@ -177,8 +168,9 @@ joyopen(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -joyclose(dev_t dev, int flags, int fmt, d_thread_t *td) +joyclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int i = joypart (dev); struct joy_softc *joy = JOY_SOFTC(UNIT(dev)); @@ -187,8 +179,10 @@ joyclose(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -joyread(dev_t dev, struct uio *uio, int flag) +joyread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct joy_softc *joy = JOY_SOFTC(UNIT(dev)); bus_space_handle_t port = joy->port; bus_space_tag_t bt = joy->bt; @@ -239,13 +233,15 @@ joyread(dev_t dev, struct uio *uio, int flag) } static int -joyioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) +joyioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; struct joy_softc *joy = JOY_SOFTC(UNIT(dev)); int i = joypart (dev); int x; - switch (cmd) { + switch (ap->a_cmd) { case JOY_SETTIMEOUT: x = *(int *) data; if (x < 1 || x > 10000) /* 10ms maximum! */ diff --git a/sys/dev/misc/kbd/kbd.c b/sys/dev/misc/kbd/kbd.c index c094e3132e..a6e2ed2a04 100644 --- a/sys/dev/misc/kbd/kbd.c +++ b/sys/dev/misc/kbd/kbd.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/kbd/kbd.c,v 1.17.2.2 2001/07/30 16:46:43 yokota Exp $ - * $DragonFly: src/sys/dev/misc/kbd/kbd.c,v 1.16 2005/10/30 23:00:56 swildner Exp $ + * $DragonFly: src/sys/dev/misc/kbd/kbd.c,v 1.17 2006/07/28 02:17:36 dillon Exp $ */ /* * Generic keyboard driver. @@ -446,23 +446,14 @@ static d_poll_t genkbdpoll; #define CDEV_MAJOR 112 -static struct cdevsw kbd_cdevsw = { - /* name */ "kbd", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ genkbdopen, - /* close */ genkbdclose, - /* read */ genkbdread, - /* write */ genkbdwrite, - /* ioctl */ genkbdioctl, - /* poll */ genkbdpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops kbd_ops = { + { "kbd", CDEV_MAJOR, 0 }, + .d_open = genkbdopen, + .d_close = genkbdclose, + .d_read = genkbdread, + .d_write = genkbdwrite, + .d_ioctl = genkbdioctl, + .d_poll = genkbdpoll, }; int @@ -475,8 +466,8 @@ kbd_attach(keyboard_t *kbd) if (keyboard[kbd->kb_index] != kbd) return EINVAL; - cdevsw_add(&kbd_cdevsw, -1, kbd->kb_index); - dev = make_dev(&kbd_cdevsw, kbd->kb_index, UID_ROOT, GID_WHEEL, 0600, + dev_ops_add(&kbd_ops, -1, kbd->kb_index); + dev = make_dev(&kbd_ops, kbd->kb_index, UID_ROOT, GID_WHEEL, 0600, "kbd%r", kbd->kb_index); if (dev->si_drv1 == NULL) dev->si_drv1 = malloc(sizeof(genkbd_softc_t), M_DEVBUF, @@ -501,13 +492,13 @@ kbd_detach(keyboard_t *kbd) * Deal with refs properly. The KBD driver really ought to have * recorded the dev_t separately. */ - if ((dev = make_adhoc_dev(&kbd_cdevsw, kbd->kb_index)) != NODEV) { + if ((dev = make_adhoc_dev(&kbd_ops, kbd->kb_index)) != NODEV) { if (dev->si_drv1) { free(dev->si_drv1, M_DEVBUF); dev->si_drv1 = NULL; } } - cdevsw_remove(&kbd_cdevsw, -1, kbd->kb_index); + dev_ops_remove(&kbd_ops, -1, kbd->kb_index); return 0; } @@ -523,8 +514,9 @@ kbd_detach(keyboard_t *kbd) static kbd_callback_func_t genkbd_event; static int -genkbdopen(dev_t dev, int mode, int flag, d_thread_t *td) +genkbdopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; keyboard_t *kbd; genkbd_softc_t *sc; int i; @@ -562,8 +554,9 @@ genkbdopen(dev_t dev, int mode, int flag, d_thread_t *td) } static int -genkbdclose(dev_t dev, int mode, int flag, d_thread_t *td) +genkbdclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; keyboard_t *kbd; genkbd_softc_t *sc; @@ -587,8 +580,10 @@ genkbdclose(dev_t dev, int mode, int flag, d_thread_t *td) } static int -genkbdread(dev_t dev, struct uio *uio, int flag) +genkbdread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; keyboard_t *kbd; genkbd_softc_t *sc; u_char buffer[KB_BUFSIZE]; @@ -604,7 +599,7 @@ genkbdread(dev_t dev, struct uio *uio, int flag) return ENXIO; } while (sc->gkb_q.c_cc == 0) { - if (flag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { crit_exit(); return EWOULDBLOCK; } @@ -639,8 +634,9 @@ genkbdread(dev_t dev, struct uio *uio, int flag) } static int -genkbdwrite(dev_t dev, struct uio *uio, int flag) +genkbdwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; keyboard_t *kbd; kbd = kbd_get_keyboard(KBD_INDEX(dev)); @@ -650,23 +646,25 @@ genkbdwrite(dev_t dev, struct uio *uio, int flag) } static int -genkbdioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, d_thread_t *td) +genkbdioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; keyboard_t *kbd; int error; kbd = kbd_get_keyboard(KBD_INDEX(dev)); if ((kbd == NULL) || !KBD_IS_VALID(kbd)) return ENXIO; - error = (*kbdsw[kbd->kb_index]->ioctl)(kbd, cmd, arg); + error = (*kbdsw[kbd->kb_index]->ioctl)(kbd, ap->a_cmd, ap->a_data); if (error == ENOIOCTL) error = ENODEV; return error; } static int -genkbdpoll(dev_t dev, int events, d_thread_t *td) +genkbdpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; keyboard_t *kbd; genkbd_softc_t *sc; int revents; @@ -677,14 +675,15 @@ genkbdpoll(dev_t dev, int events, d_thread_t *td) kbd = kbd_get_keyboard(KBD_INDEX(dev)); if ((sc == NULL) || (kbd == NULL) || !KBD_IS_VALID(kbd)) { revents = POLLHUP; /* the keyboard has gone */ - } else if (events & (POLLIN | POLLRDNORM)) { + } else if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sc->gkb_q.c_cc > 0) - revents = events & (POLLIN | POLLRDNORM); + revents = ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(td, &sc->gkb_rsel); + selrecord(curthread, &sc->gkb_rsel); } crit_exit(); - return revents; + ap->a_events = revents; + return (0); } static int diff --git a/sys/dev/misc/labpc/labpc.c b/sys/dev/misc/labpc/labpc.c index 1eebf5e3f1..086c77177f 100644 --- a/sys/dev/misc/labpc/labpc.c +++ b/sys/dev/misc/labpc/labpc.c @@ -39,7 +39,7 @@ * dufault@hda.com * * $FreeBSD: src/sys/i386/isa/labpc.c,v 1.35 1999/09/25 18:24:08 phk Exp $ - * $DragonFly: src/sys/dev/misc/labpc/labpc.c,v 1.16 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/misc/labpc/labpc.c,v 1.17 2006/07/28 02:17:36 dillon Exp $ * */ @@ -290,23 +290,14 @@ static d_ioctl_t labpcioctl; static d_strategy_t labpcstrategy; #define CDEV_MAJOR 66 -static struct cdevsw labpc_cdevsw = { - /* name */ "labpc", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ labpcopen, - /* close */ labpcclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ labpcioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ labpcstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops labpc_ops = { + { "labpc", CDEV_MAJOR, 0 }, + .d_open = labpcopen, + .d_close = labpcclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = labpcioctl, + .d_strategy = labpcstrategy, }; static void labpcintr(void *); @@ -491,8 +482,8 @@ labpcattach(struct isa_device *dev) ctlr->dcr_is = 0x80; loutb(DCR(ctlr), ctlr->dcr_val); - cdevsw_add(&labpc_cdevsw, -1, dev->id_unit); - make_dev(&labpc_cdevsw, dev->id_unit, 0, 0, 0600, + dev_ops_add(&labpc_ops, -1, dev->id_unit); + make_dev(&labpc_ops, dev->id_unit, 0, 0, 0600, "labpc%d", dev->id_unit); return 1; } @@ -710,8 +701,9 @@ lockout_multiple_open(dev_t current, dev_t next) } static int -labpcopen(dev_t dev, int flags, int fmt, struct thread *td) +labpcopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; u_short unit = UNIT(dev); struct ctlr *ctlr; @@ -747,8 +739,9 @@ labpcopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -labpcclose(dev_t dev, int flags, int fmt, struct thread *td) +labpcclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ctlr *ctlr = labpcs[UNIT(dev)]; (*ctlr->stop)(ctlr); @@ -983,9 +976,11 @@ digital_in_strategy(struct bio *bio, struct ctlr *ctlr) } -static void -labpcstrategy(dev_t dev, struct bio *bio) +static int +labpcstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct ctlr *ctlr = labpcs[UNIT(dev)]; @@ -1022,14 +1017,17 @@ labpcstrategy(dev_t dev, struct bio *bio) da_strategy(bio, ctlr); } } + return(0); } static int -labpcioctl(dev_t dev, u_long cmd, caddr_t arg, int mode, struct thread *td) +labpcioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t arg = ap->a_data; struct ctlr *ctlr = labpcs[UNIT(dev)]; - switch(cmd) + switch(ap->a_cmd) { case AD_MICRO_PERIOD_SET: { diff --git a/sys/dev/misc/lpt/lpt.c b/sys/dev/misc/lpt/lpt.c index cc3a4403d4..84f78aee10 100644 --- a/sys/dev/misc/lpt/lpt.c +++ b/sys/dev/misc/lpt/lpt.c @@ -49,7 +49,7 @@ * From Id: lpt.c,v 1.55.2.1 1996/11/12 09:08:38 phk Exp * From Id: nlpt.c,v 1.14 1999/02/08 13:55:43 des Exp * $FreeBSD: src/sys/dev/ppbus/lpt.c,v 1.15.2.3 2000/07/07 00:30:40 obrien Exp $ - * $DragonFly: src/sys/dev/misc/lpt/lpt.c,v 1.14 2005/10/28 03:25:46 dillon Exp $ + * $DragonFly: src/sys/dev/misc/lpt/lpt.c,v 1.15 2006/07/28 02:17:36 dillon Exp $ */ /* @@ -69,6 +69,7 @@ #include #include #include +#include #include #include #include @@ -192,23 +193,13 @@ static d_read_t lptread; static d_ioctl_t lptioctl; #define CDEV_MAJOR 16 -static struct cdevsw lpt_cdevsw = { - /* name */ LPT_NAME, - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ lptopen, - /* close */ lptclose, - /* read */ lptread, - /* write */ lptwrite, - /* ioctl */ lptioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops lpt_ops = { + { LPT_NAME, CDEV_MAJOR, 0 }, + .d_open = lptopen, + .d_close = lptclose, + .d_read = lptread, + .d_write = lptwrite, + .d_ioctl = lptioctl, }; static int @@ -410,10 +401,10 @@ lpt_attach(device_t dev) lpt_release_ppbus(dev); - cdevsw_add(&lpt_cdevsw, LP_UNITMASK, unit); - make_dev(&lpt_cdevsw, unit, + dev_ops_add(&lpt_ops, LP_UNITMASK, unit); + make_dev(&lpt_ops, unit, UID_ROOT, GID_WHEEL, 0600, LPT_NAME "%d", unit); - make_dev(&lpt_cdevsw, unit | LP_BYPASS, + make_dev(&lpt_ops, unit | LP_BYPASS, UID_ROOT, GID_WHEEL, 0600, LPT_NAME "%d.ctl", unit); return (0); } @@ -458,8 +449,9 @@ lptout(void *arg) */ static int -lptopen(dev_t dev, int flags, int fmt, struct thread *p) +lptopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int trys, err; u_int unit = LPTUNIT(minor(dev)); struct lpt_data *sc = UNITOSOFTC(unit); @@ -578,8 +570,9 @@ lptopen(dev_t dev, int flags, int fmt, struct thread *p) */ static int -lptclose(dev_t dev, int flags, int fmt, struct thread *p) +lptclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = LPTUNIT(minor(dev)); struct lpt_data *sc = UNITOSOFTC(unit); device_t lptdev = UNITODEVICE(unit); @@ -690,8 +683,10 @@ lpt_pushbytes(device_t dev) */ static int -lptread(dev_t dev, struct uio *uio, int ioflag) +lptread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; u_int unit = LPTUNIT(minor(dev)); struct lpt_data *sc = UNITOSOFTC(unit); device_t lptdev = UNITODEVICE(unit); @@ -735,8 +730,10 @@ error: */ static int -lptwrite(dev_t dev, struct uio *uio, int ioflag) +lptwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; unsigned n; int err; u_int unit = LPTUNIT(minor(dev)); @@ -902,14 +899,15 @@ lptintr(device_t dev) } static int -lptioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *p) +lptioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int error = 0; u_int unit = LPTUNIT(minor(dev)); struct lpt_data *sc = UNITOSOFTC(unit); u_char old_sc_irq; /* old printer IRQ status */ - switch (cmd) { + switch (ap->a_cmd) { case LPT_IRQ : if(sc->sc_irq & LP_HAS_IRQ) { /* @@ -922,7 +920,7 @@ lptioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *p) * this gets syslog'd. */ old_sc_irq = sc->sc_irq; - switch(*(int*)data) { + switch(*(int*)ap->a_data) { case 0: sc->sc_irq &= (~LP_ENABLE_IRQ); break; diff --git a/sys/dev/misc/mse/mse.c b/sys/dev/misc/mse/mse.c index 4273b622c8..ce1eb8e474 100644 --- a/sys/dev/misc/mse/mse.c +++ b/sys/dev/misc/mse/mse.c @@ -12,7 +12,7 @@ * without express or implied warranty. * * $FreeBSD: src/sys/i386/isa/mse.c,v 1.49.2.1 2000/03/20 13:58:47 yokota Exp $ - * $DragonFly: src/sys/dev/misc/mse/mse.c,v 1.16 2006/06/10 20:00:15 dillon Exp $ + * $DragonFly: src/sys/dev/misc/mse/mse.c,v 1.17 2006/07/28 02:17:36 dillon Exp $ */ /* * Driver for the Logitech and ATI Inport Bus mice for use with 386bsd and @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -139,23 +140,13 @@ static d_ioctl_t mseioctl; static d_poll_t msepoll; #define CDEV_MAJOR 27 -static struct cdevsw mse_cdevsw = { - /* name */ "mse", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mseopen, - /* close */ mseclose, - /* read */ mseread, - /* write */ nowrite, - /* ioctl */ mseioctl, - /* poll */ msepoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mse_ops = { + { "mse", CDEV_MAJOR, 0 }, + .d_open = mseopen, + .d_close = mseclose, + .d_read = mseread, + .d_ioctl = mseioctl, + .d_poll = msepoll, }; static void mseintr (void *); @@ -359,9 +350,9 @@ mse_attach(device_t dev) sc->mode.accelfactor = (flags & MSE_CONFIG_ACCEL) >> 4; callout_init(&sc->sc_callout); - cdevsw_add(&mse_cdevsw, ~1, unit << 1); - make_dev(&mse_cdevsw, unit << 1, 0, 0, 0600, "mse%d", unit); - make_dev(&mse_cdevsw, (unit<<1)+1, 0, 0, 0600, "nmse%d", unit); + dev_ops_add(&mse_ops, ~1, unit << 1); + make_dev(&mse_ops, unit << 1, 0, 0, 0600, "mse%d", unit); + make_dev(&mse_ops, (unit<<1)+1, 0, 0, 0600, "nmse%d", unit); return 0; } @@ -380,7 +371,7 @@ mse_detach(device_t dev) BUS_TEARDOWN_INTR(device_get_parent(dev), dev, sc->sc_intr, sc->sc_ih); bus_release_resource(dev, SYS_RES_IRQ, rid, sc->sc_intr); bus_release_resource(dev, SYS_RES_IOPORT, rid, sc->sc_port); - cdevsw_remove(&mse_cdevsw, ~1, device_get_unit(dev) << 1); + dev_ops_remove(&mse_ops, ~1, device_get_unit(dev) << 1); return 0; } @@ -389,8 +380,9 @@ mse_detach(device_t dev) * Exclusive open the mouse, initialize it and enable interrupts. */ static int -mseopen(dev_t dev, int flags, int fmt, struct thread *td) +mseopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; mse_softc_t *sc; sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev)); @@ -424,8 +416,9 @@ mseopen(dev_t dev, int flags, int fmt, struct thread *td) * mseclose: just turn off mouse innterrupts. */ static int -mseclose(dev_t dev, int flags, int fmt, struct thread *td) +mseclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev)); crit_enter(); @@ -442,8 +435,10 @@ mseclose(dev_t dev, int flags, int fmt, struct thread *td) * (Yes this is cheesy, but it makes the X386 server happy, so...) */ static int -mseread(dev_t dev, struct uio *uio, int ioflag) +mseread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev)); int xfer, error; @@ -505,14 +500,15 @@ mseread(dev_t dev, struct uio *uio, int ioflag) * mseioctl: process ioctl commands. */ static int -mseioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +mseioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev)); mousestatus_t status; int err = 0; - switch (cmd) { - + switch (ap->a_cmd) { case MOUSE_GETHWINFO: crit_enter(); *(mousehw_t *)addr = sc->hw; @@ -616,27 +612,29 @@ mseioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) * msepoll: check for mouse input to be processed. */ static int -msepoll(dev_t dev, int events, struct thread *td) +msepoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; mse_softc_t *sc = devclass_get_softc(mse_devclass, MSE_UNIT(dev)); int revents = 0; crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sc->sc_bytesread != sc->mode.packetsize || sc->sc_deltax != 0 || sc->sc_deltay != 0 || (sc->sc_obuttons ^ sc->sc_buttons) != 0) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else { /* * Since this is an exclusive open device, any previous * proc pointer is trash now, so we can just assign it. */ - selrecord(td, &sc->sc_selp); + selrecord(curthread, &sc->sc_selp); } } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } /* diff --git a/sys/dev/misc/nmdm/nmdm.c b/sys/dev/misc/nmdm/nmdm.c index c022eb6e72..c1e502f202 100644 --- a/sys/dev/misc/nmdm/nmdm.c +++ b/sys/dev/misc/nmdm/nmdm.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/nmdm/nmdm.c,v 1.5.2.1 2001/08/11 00:54:14 mp Exp $ - * $DragonFly: src/sys/dev/misc/nmdm/nmdm.c,v 1.12 2005/12/11 01:54:08 swildner Exp $ + * $DragonFly: src/sys/dev/misc/nmdm/nmdm.c,v 1.13 2006/07/28 02:17:36 dillon Exp $ */ /* @@ -68,23 +68,14 @@ static d_write_t nmdmwrite; static d_ioctl_t nmdmioctl; #define CDEV_MAJOR 18 -static struct cdevsw nmdm_cdevsw = { - /* name */ "pts", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY, - /* port */ NULL, - /* clone */ NULL, - - /* open */ nmdmopen, - /* close */ nmdmclose, - /* read */ nmdmread, - /* write */ nmdmwrite, - /* ioctl */ nmdmioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops nmdm_ops = { + { "pts", CDEV_MAJOR, D_TTY }, + .d_open = nmdmopen, + .d_close = nmdmclose, + .d_read = nmdmread, + .d_write = nmdmwrite, + .d_ioctl = nmdmioctl, + .d_poll = ttypoll, }; #define BUFSIZ 100 /* Chunk size iomoved to/from user */ @@ -139,10 +130,10 @@ nmdminit(int n) pt = malloc(sizeof(*pt), M_NLMDM, M_WAITOK); bzero(pt, sizeof(*pt)); - cdevsw_add(&nmdm_cdevsw, ~1, n << 1); - pt->part1.dev = dev1 = make_dev(&nmdm_cdevsw, n << 1, + dev_ops_add(&nmdm_ops, ~1, n << 1); + pt->part1.dev = dev1 = make_dev(&nmdm_ops, n << 1, 0, 0, 0666, "nmdm%dA", n); - pt->part2.dev = dev2 = make_dev(&nmdm_cdevsw, (n << 1) + 1, + pt->part2.dev = dev2 = make_dev(&nmdm_ops, (n << 1) + 1, 0, 0, 0666, "nmdm%dB", n); dev1->si_drv1 = dev2->si_drv1 = pt; @@ -160,9 +151,9 @@ nmdminit(int n) /*ARGSUSED*/ static int -nmdmopen(dev_t dev, int flag, int devtype, struct thread *td) +nmdmopen(struct dev_open_args *ap) { - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; struct tty *tp, *tp2; int error; int minr; @@ -174,8 +165,6 @@ nmdmopen(dev_t dev, int flag, int devtype, struct thread *td) int pair; struct softpart *ourpart, *otherpart; - KKASSERT(p != NULL); - minr = lminor(dev); pair = minr >> 1; is_b = minr & 1; @@ -215,9 +204,9 @@ nmdmopen(dev_t dev, int flag, int devtype, struct thread *td) tp->t_lflag = TTYDEF_LFLAG; tp->t_cflag = TTYDEF_CFLAG; tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; - } else if (tp->t_state & TS_XCLUDE && suser(td)) { + } else if (tp->t_state & TS_XCLUDE && suser_cred(ap->a_cred, 0)) { return (EBUSY); - } else if (pti->pt_prison != p->p_ucred->cr_prison) { + } else if (pti->pt_prison != ap->a_cred->cr_prison) { return (EBUSY); } @@ -265,9 +254,10 @@ nmdmopen(dev_t dev, int flag, int devtype, struct thread *td) return (error); } -static int -nmdmclose(dev_t dev, int flag, int mode, struct thread *td) +static int +nmdmclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp, *tp2; int err; struct softpart *ourpart, *otherpart; @@ -294,7 +284,7 @@ nmdmclose(dev_t dev, int flag, int mode, struct thread *td) ttyflush(tp2, FREAD | FWRITE); } - err = (*linesw[tp->t_line].l_close)(tp, flag); + err = (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); ourpart->modemsignals &= ~TIOCM_DTR; nmdm_crossover(dev->si_drv1, ourpart, otherpart); nmdmstop(tp, FREAD|FWRITE); @@ -302,9 +292,10 @@ nmdmclose(dev_t dev, int flag, int mode, struct thread *td) return (err); } -static int -nmdmread(dev_t dev, struct uio *uio, int flag) +static int +nmdmread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; int error = 0; struct tty *tp, *tp2; struct softpart *ourpart, *otherpart; @@ -315,7 +306,7 @@ nmdmread(dev_t dev, struct uio *uio, int flag) #if 0 if (tp2->t_state & TS_ISOPEN) { - error = (*linesw[tp->t_line].l_read)(tp, uio, flag); + error = (*linesw[tp->t_line].l_read)(tp, ap->a_uio, flag); wakeup_other(tp, FWRITE); } else { if (flag & IO_NDELAY) { @@ -325,7 +316,7 @@ nmdmread(dev_t dev, struct uio *uio, int flag) } } #else - if ((error = (*linesw[tp->t_line].l_read)(tp, uio, flag)) == 0) + if ((error = (*linesw[tp->t_line].l_read)(tp, ap->a_uio, ap->a_ioflag)) == 0) wakeup_other(tp, FWRITE); #endif return (error); @@ -337,8 +328,10 @@ nmdmread(dev_t dev, struct uio *uio, int flag) * indirectly, when tty driver calls nmdmstart. */ static int -nmdmwrite(dev_t dev, struct uio *uio, int flag) +nmdmwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; u_char *cp = 0; int cc = 0; u_char locbuf[BUFSIZ]; @@ -392,7 +385,7 @@ again: uio->uio_resid += cc; return (EIO); } - if (flag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { /* * Don't wait if asked not to. * Adjust for data copied in but @@ -481,8 +474,9 @@ nmdmstop(struct tty *tp, int flush) /*ARGSUSED*/ static int -nmdmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +nmdmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp = dev->si_tty; struct nm_softc *pti = dev->si_drv1; int error; @@ -493,11 +487,12 @@ nmdmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) GETPARTS(tp, ourpart, otherpart); tp2 = &otherpart->nm_tty; - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); if (error == ENOIOCTL) - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, ap->a_cmd, ap->a_data, ap->a_fflag); if (error == ENOIOCTL) { - switch (cmd) { + switch (ap->a_cmd) { case TIOCSBRK: otherpart->gotbreak = 1; break; @@ -510,23 +505,23 @@ nmdmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) ourpart->modemsignals &= TIOCM_DTR; break; case TIOCMSET: - ourpart->modemsignals = *(int *)data; - otherpart->modemsignals = *(int *)data; + ourpart->modemsignals = *(int *)ap->a_data; + otherpart->modemsignals = *(int *)ap->a_data; break; case TIOCMBIS: - ourpart->modemsignals |= *(int *)data; + ourpart->modemsignals |= *(int *)ap->a_data; break; case TIOCMBIC: - ourpart->modemsignals &= ~(*(int *)data); - otherpart->modemsignals &= ~(*(int *)data); + ourpart->modemsignals &= ~(*(int *)ap->a_data); + otherpart->modemsignals &= ~(*(int *)ap->a_data); break; case TIOCMGET: - *(int *)data = ourpart->modemsignals; + *(int *)ap->a_data = ourpart->modemsignals; break; case TIOCMSDTRWAIT: break; case TIOCMGDTRWAIT: - *(int *)data = 0; + *(int *)ap->a_data = 0; break; case TIOCTIMESTAMP: case TIOCDCDTIMESTAMP: diff --git a/sys/dev/misc/pcfclock/pcfclock.c b/sys/dev/misc/pcfclock/pcfclock.c index 3d9a92cd2e..b57ba3575b 100644 --- a/sys/dev/misc/pcfclock/pcfclock.c +++ b/sys/dev/misc/pcfclock/pcfclock.c @@ -22,7 +22,7 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ppbus/pcfclock.c,v 1.3.2.1 2000/05/24 00:20:57 n_hibma Exp $ - * $DragonFly: src/sys/dev/misc/pcfclock/pcfclock.c,v 1.8 2005/10/28 03:25:48 dillon Exp $ + * $DragonFly: src/sys/dev/misc/pcfclock/pcfclock.c,v 1.9 2006/07/28 02:17:36 dillon Exp $ * */ @@ -31,10 +31,11 @@ #include #include #include +#include +#include #include #include #include -#include #include #include @@ -69,23 +70,11 @@ static d_close_t pcfclock_close; static d_read_t pcfclock_read; #define CDEV_MAJOR 140 -static struct cdevsw pcfclock_cdevsw = { - /* name */ PCFCLOCK_NAME, - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ pcfclock_open, - /* close */ pcfclock_close, - /* read */ pcfclock_read, - /* write */ nowrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops pcfclock_ops = { + { PCFCLOCK_NAME, CDEV_MAJOR, 0 }, + .d_open = pcfclock_open, + .d_close = pcfclock_close, + .d_read = pcfclock_read, }; #ifndef PCFCLOCK_MAX_RETRIES @@ -145,16 +134,17 @@ pcfclock_attach(device_t dev) unit = device_get_unit(dev); - cdevsw_add(&pcfclock_cdevsw, -1, unit); - make_dev(&pcfclock_cdevsw, unit, + dev_ops_add(&pcfclock_ops, -1, unit); + make_dev(&pcfclock_ops, unit, UID_ROOT, GID_WHEEL, 0444, PCFCLOCK_NAME "%d", unit); return (0); } static int -pcfclock_open(dev_t dev, int flag, int fms, struct thread *td) +pcfclock_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); struct pcfclock_data *sc = UNITOSOFTC(unit); device_t pcfclockdev = UNITODEVICE(unit); @@ -165,7 +155,7 @@ pcfclock_open(dev_t dev, int flag, int fms, struct thread *td) return (ENXIO); if ((res = ppb_request_bus(ppbus, pcfclockdev, - (flag & O_NONBLOCK) ? PPB_DONTWAIT : PPB_WAIT))) + (ap->a_oflags & O_NONBLOCK) ? PPB_DONTWAIT : PPB_WAIT))) return (res); sc->count++; @@ -174,8 +164,9 @@ pcfclock_open(dev_t dev, int flag, int fms, struct thread *td) } static int -pcfclock_close(dev_t dev, int flags, int fmt, struct thread *td) +pcfclock_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); struct pcfclock_data *sc = UNITOSOFTC(unit); device_t pcfclockdev = UNITODEVICE(unit); @@ -301,14 +292,15 @@ pcfclock_read_dev(dev_t dev, char *buf, int maxretries) return (error); } -static ssize_t -pcfclock_read(dev_t dev, struct uio *uio, int ioflag) +static int +pcfclock_read(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); char buf[18]; int error = 0; - if (uio->uio_resid < 18) + if (ap->a_uio->uio_resid < 18) return (ERANGE); error = pcfclock_read_dev(dev, buf, PCFCLOCK_MAX_RETRIES); @@ -318,7 +310,7 @@ pcfclock_read(dev_t dev, struct uio *uio, int ioflag) } else { pcfclock_display_data(dev, buf); - uiomove(buf, 18, uio); + uiomove(buf, 18, ap->a_uio); } return (error); diff --git a/sys/dev/misc/ppi/ppi.c b/sys/dev/misc/ppi/ppi.c index b18761a649..273d235b58 100644 --- a/sys/dev/misc/ppi/ppi.c +++ b/sys/dev/misc/ppi/ppi.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ppbus/ppi.c,v 1.21.2.3 2000/08/07 18:24:43 peter Exp $ - * $DragonFly: src/sys/dev/misc/ppi/ppi.c,v 1.11 2005/10/28 03:25:49 dillon Exp $ + * $DragonFly: src/sys/dev/misc/ppi/ppi.c,v 1.12 2006/07/28 02:17:36 dillon Exp $ * */ #include "opt_ppb_1284.h" @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -91,23 +92,13 @@ static d_write_t ppiwrite; static d_read_t ppiread; #define CDEV_MAJOR 82 -static struct cdevsw ppi_cdevsw = { - /* name */ "ppi", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ppiopen, - /* close */ ppiclose, - /* read */ ppiread, - /* write */ ppiwrite, - /* ioctl */ ppiioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ppi_ops = { + { "ppi", CDEV_MAJOR, 0 }, + .d_open = ppiopen, + .d_close = ppiclose, + .d_read = ppiread, + .d_write = ppiwrite, + .d_ioctl = ppiioctl, }; #ifdef PERIPH_1284 @@ -174,8 +165,8 @@ ppi_attach(device_t dev) &zero, irq, irq, 1, RF_ACTIVE); #endif /* PERIPH_1284 */ - cdevsw_add(&ppi_cdevsw, -1, device_get_unit(dev)); - make_dev(&ppi_cdevsw, device_get_unit(dev), /* XXX cleanup */ + dev_ops_add(&ppi_ops, -1, device_get_unit(dev)); + make_dev(&ppi_ops, device_get_unit(dev), /* XXX cleanup */ UID_ROOT, GID_WHEEL, 0600, "ppi%d", device_get_unit(dev)); @@ -254,8 +245,9 @@ ppiintr(void *arg) #endif /* PERIPH_1284 */ static int -ppiopen(dev_t dev, int flags, int fmt, d_thread_t *td) +ppiopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); struct ppi_data *ppi = UNITOSOFTC(unit); device_t ppidev = UNITODEVICE(unit); @@ -267,7 +259,7 @@ ppiopen(dev_t dev, int flags, int fmt, d_thread_t *td) if (!(ppi->ppi_flags & HAVE_PPBUS)) { if ((res = ppb_request_bus(ppbus, ppidev, - (flags & O_NONBLOCK) ? PPB_DONTWAIT : + (ap->a_oflags & O_NONBLOCK) ? PPB_DONTWAIT : (PPB_WAIT | PPB_INTR)))) return (res); @@ -289,8 +281,9 @@ ppiopen(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -ppiclose(dev_t dev, int flags, int fmt, d_thread_t *td) +ppiclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); struct ppi_data *ppi = UNITOSOFTC(unit); device_t ppidev = UNITODEVICE(unit); @@ -331,9 +324,11 @@ ppiclose(dev_t dev, int flags, int fmt, d_thread_t *td) * If no data is available, wait for it otherwise transfer as much as possible */ static int -ppiread(dev_t dev, struct uio *uio, int ioflag) +ppiread(struct dev_read_args *ap) { #ifdef PERIPH_1284 + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; u_int unit = minor(dev); struct ppi_data *ppi = UNITOSOFTC(unit); device_t ppidev = UNITODEVICE(unit); @@ -415,9 +410,11 @@ error: * Once negociation done, transfer data */ static int -ppiwrite(dev_t dev, struct uio *uio, int ioflag) +ppiwrite(struct dev_write_args *ap) { #ifdef PERIPH_1284 + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; u_int unit = minor(dev); struct ppi_data *ppi = UNITOSOFTC(unit); device_t ppidev = UNITODEVICE(unit); @@ -502,16 +499,16 @@ error: } static int -ppiioctl(dev_t dev, u_long cmd, caddr_t data, int flags, d_thread_t *td) +ppiioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); device_t ppidev = UNITODEVICE(unit); device_t ppbus = device_get_parent(ppidev); int error = 0; - u_int8_t *val = (u_int8_t *)data; - - switch (cmd) { + u_int8_t *val = (u_int8_t *)ap->a_data; + switch (ap->a_cmd) { case PPIGDATA: /* get data register */ *val = ppb_rdtr(ppbus); break; diff --git a/sys/dev/misc/pps/pps.c b/sys/dev/misc/pps/pps.c index f92b6cfa60..6de37294f0 100644 --- a/sys/dev/misc/pps/pps.c +++ b/sys/dev/misc/pps/pps.c @@ -7,7 +7,7 @@ * ---------------------------------------------------------------------------- * * $FreeBSD: src/sys/dev/ppbus/pps.c,v 1.24.2.1 2000/05/24 00:20:57 n_hibma Exp $ - * $DragonFly: src/sys/dev/misc/pps/pps.c,v 1.14 2005/10/28 03:25:50 dillon Exp $ + * $DragonFly: src/sys/dev/misc/pps/pps.c,v 1.15 2006/07/28 02:17:36 dillon Exp $ * * This driver implements a draft-mogul-pps-api-02.txt PPS source. * @@ -21,9 +21,10 @@ #include #include #include +#include +#include #include #include -#include #include #include #include @@ -60,23 +61,11 @@ static d_close_t ppsclose; static d_ioctl_t ppsioctl; #define CDEV_MAJOR 89 -static struct cdevsw pps_cdevsw = { - /* name */ PPS_NAME, - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ppsopen, - /* close */ ppsclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ ppsioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops pps_ops = { + { PPS_NAME, CDEV_MAJOR, 0 }, + .d_open = ppsopen, + .d_close = ppsclose, + .d_ioctl = ppsioctl, }; static int @@ -116,15 +105,16 @@ ppsattach(device_t ppsdev) return (ENXIO); unit = device_get_unit(ppsdev); - cdevsw_add(&pps_cdevsw, -1, unit); - make_dev(&pps_cdevsw, unit, UID_ROOT, GID_WHEEL, 0644, + dev_ops_add(&pps_ops, -1, unit); + make_dev(&pps_ops, unit, UID_ROOT, GID_WHEEL, 0644, PPS_NAME "%d", unit); return (0); } static int -ppsopen(dev_t dev, int flags, int fmt, struct thread *td) +ppsopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); struct pps_data *sc = UNITOSOFTC(unit); device_t ppsdev = UNITODEVICE(unit); @@ -152,8 +142,9 @@ ppsopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -ppsclose(dev_t dev, int flags, int fmt, struct thread *td) +ppsclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); struct pps_data *sc = UNITOSOFTC(unit); device_t ppsdev = UNITODEVICE(unit); @@ -189,12 +180,13 @@ ppsintr(void *arg) } static int -ppsioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +ppsioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; u_int unit = minor(dev); struct pps_data *sc = UNITOSOFTC(unit); - return (pps_ioctl(cmd, data, &sc->pps)); + return (pps_ioctl(ap->a_cmd, ap->a_data, &sc->pps)); } /* diff --git a/sys/dev/misc/psm/psm.c b/sys/dev/misc/psm/psm.c index dd0b7c5298..fe5cb443ae 100644 --- a/sys/dev/misc/psm/psm.c +++ b/sys/dev/misc/psm/psm.c @@ -21,7 +21,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/isa/psm.c,v 1.23.2.7 2003/11/12 04:26:26 mikeh Exp $ - * $DragonFly: src/sys/dev/misc/psm/psm.c,v 1.17 2006/06/10 20:00:16 dillon Exp $ + * $DragonFly: src/sys/dev/misc/psm/psm.c,v 1.18 2006/07/28 02:17:36 dillon Exp $ */ /* @@ -70,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -342,23 +343,13 @@ static struct isa_pnp_id psm_ids[] = { #define CDEV_MAJOR 21 -static struct cdevsw psm_cdevsw = { - /* name */ PSM_DRIVER_NAME, - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ psmopen, - /* close */ psmclose, - /* read */ psmread, - /* write */ nowrite, - /* ioctl */ psmioctl, - /* poll */ psmpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops psm_ops = { + { PSM_DRIVER_NAME, CDEV_MAJOR, 0 }, + .d_open = psmopen, + .d_close = psmclose, + .d_read = psmread, + .d_ioctl = psmioctl, + .d_poll = psmpoll, }; /* debug message level */ @@ -1251,9 +1242,9 @@ psmattach(device_t dev) } /* Done */ - cdevsw_add(&psm_cdevsw, PSM_MKMINOR(-1, 0), PSM_MKMINOR(unit, 0)); - make_dev(&psm_cdevsw, PSM_MKMINOR(unit, FALSE), 0, 0, 0666, "psm%d", unit); - make_dev(&psm_cdevsw, PSM_MKMINOR(unit, TRUE), 0, 0, 0666, "bpsm%d", unit); + dev_ops_add(&psm_ops, PSM_MKMINOR(-1, 0), PSM_MKMINOR(unit, 0)); + make_dev(&psm_ops, PSM_MKMINOR(unit, FALSE), 0, 0, 0666, "psm%d", unit); + make_dev(&psm_ops, PSM_MKMINOR(unit, TRUE), 0, 0, 0666, "bpsm%d", unit); if (!verbose) { printf("psm%d: model %s, device ID %d\n", @@ -1290,14 +1281,15 @@ psmdetach(device_t dev) rid = 0; BUS_TEARDOWN_INTR(device_get_parent(dev), dev, sc->intr, sc->ih); bus_release_resource(dev, SYS_RES_IRQ, rid, sc->intr); - cdevsw_remove(&psm_cdevsw, PSM_MKMINOR(-1, 0), PSM_MKMINOR(unit, 0)); + dev_ops_remove(&psm_ops, PSM_MKMINOR(-1, 0), PSM_MKMINOR(unit, 0)); return 0; } static int -psmopen(dev_t dev, int flag, int fmt, struct thread *td) +psmopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = PSM_UNIT(dev); struct psm_softc *sc; int command_byte; @@ -1380,8 +1372,9 @@ psmopen(dev_t dev, int flag, int fmt, struct thread *td) } static int -psmclose(dev_t dev, int flag, int fmt, struct thread *td) +psmclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = PSM_UNIT(dev); struct psm_softc *sc = PSM_SOFTC(unit); int stat[3]; @@ -1520,8 +1513,10 @@ tame_mouse(struct psm_softc *sc, mousestatus_t *status, unsigned char *buf) } static int -psmread(dev_t dev, struct uio *uio, int flag) +psmread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct psm_softc *sc = PSM_SOFTC(PSM_UNIT(dev)); unsigned char buf[PSM_SMALLBUFSIZE]; int error = 0; @@ -1643,8 +1638,10 @@ unblock_mouse_data(struct psm_softc *sc, int c) } static int -psmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +psmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr= ap->a_data; struct psm_softc *sc = PSM_SOFTC(PSM_UNIT(dev)); mousemode_t mode; mousestatus_t status; @@ -1657,8 +1654,8 @@ psmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) int error = 0; /* Perform IOCTL command */ - switch (cmd) { + switch (ap->a_cmd) { case OLD_MOUSE_GETHWINFO: crit_enter(); ((old_mousehw_t *)addr)->buttons = sc->hw.buttons; @@ -1721,7 +1718,7 @@ psmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) case OLD_MOUSE_SETMODE: case MOUSE_SETMODE: - if (cmd == OLD_MOUSE_SETMODE) { + if (ap->a_cmd == OLD_MOUSE_SETMODE) { mode.rate = ((old_mousemode_t *)addr)->rate; /* * resolution old I/F new I/F @@ -1848,7 +1845,7 @@ psmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) if (error) return error; if ((data->len = get_mouse_status(sc->kbdc, data->buf, - (cmd == MOUSE_READDATA) ? 1 : 0, data->len)) <= 0) + (ap->a_cmd == MOUSE_READDATA) ? 1 : 0, data->len)) <= 0) error = EIO; unblock_mouse_data(sc, command_byte); break; @@ -2379,22 +2376,23 @@ psmintr(void *arg) } static int -psmpoll(dev_t dev, int events, struct thread *td) +psmpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct psm_softc *sc = PSM_SOFTC(PSM_UNIT(dev)); int revents = 0; /* Return true if a mouse event available */ crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sc->queue.count > 0) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(td, &sc->rsel); + selrecord(curthread, &sc->rsel); } crit_exit(); - - return (revents); + ap->a_events = revents; + return (0); } /* vendor/model specific routines */ diff --git a/sys/dev/misc/snp/snp.c b/sys/dev/misc/snp/snp.c index fac8f04e64..f910d91ee7 100644 --- a/sys/dev/misc/snp/snp.c +++ b/sys/dev/misc/snp/snp.c @@ -13,7 +13,7 @@ * Snoop stuff. * * $FreeBSD: src/sys/dev/snp/snp.c,v 1.69.2.2 2002/05/06 07:30:02 dd Exp $ - * $DragonFly: src/sys/dev/misc/snp/snp.c,v 1.13 2006/06/13 08:12:02 dillon Exp $ + * $DragonFly: src/sys/dev/misc/snp/snp.c,v 1.14 2006/07/28 02:17:36 dillon Exp $ */ #include @@ -40,23 +40,14 @@ static d_ioctl_t snpioctl; static d_poll_t snppoll; #define CDEV_MAJOR 53 -static struct cdevsw snp_cdevsw = { - /* name */ "snp", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ snpopen, - /* close */ snpclose, - /* read */ snpread, - /* write */ snpwrite, - /* ioctl */ snpioctl, - /* poll */ snppoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops snp_ops = { + { "snp", CDEV_MAJOR, 0 }, + .d_open = snpopen, + .d_close = snpclose, + .d_read = snpread, + .d_write = snpwrite, + .d_ioctl = snpioctl, + .d_poll = snppoll, }; static struct linesw snpdisc = { @@ -187,8 +178,10 @@ snpdevtotty(dev_t dev) */ static int -snpwrite(dev_t dev, struct uio *uio, int flag) +snpwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct snoop *snp; struct tty *tp; int error, i, len; @@ -223,8 +216,10 @@ tty_input: static int -snpread(dev_t dev, struct uio *uio, int flag) +snpread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct snoop *snp; int error, len, n, nblen; caddr_t from; @@ -241,7 +236,7 @@ snpread(dev_t dev, struct uio *uio, int flag) do { if (snp->snp_len == 0) { - if (flag & IO_NDELAY) + if (ap->a_ioflag & IO_NDELAY) return (EWOULDBLOCK); snp->snp_flags |= SNOOP_RWAIT; error = tsleep((caddr_t)snp, PCATCH, "snprd", 0); @@ -363,12 +358,13 @@ snp_in(struct snoop *snp, char *buf, int n) } static int -snpopen(dev_t dev, int flag, int mode, d_thread_t *td) +snpopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct snoop *snp; if (dev->si_drv1 == NULL) { - make_dev(&snp_cdevsw, minor(dev), UID_ROOT, GID_WHEEL, + make_dev(&snp_ops, minor(dev), UID_ROOT, GID_WHEEL, 0600, "snp%d", minor(dev)); dev->si_drv1 = snp = malloc(sizeof(*snp), M_SNP, M_WAITOK | M_ZERO); @@ -435,8 +431,9 @@ detach_notty: } static int -snpclose(dev_t dev, int flags, int fmt, d_thread_t *td) +snpclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct snoop *snp; snp = dev->si_drv1; @@ -464,16 +461,17 @@ snp_down(struct snoop *snp) } static int -snpioctl(dev_t dev, u_long cmd, caddr_t data, int flags, d_thread_t *td) +snpioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct snoop *snp; struct tty *tp, *tpo; dev_t tdev; snp = dev->si_drv1; - switch (cmd) { + switch (ap->a_cmd) { case SNPSTTY: - tdev = udev2dev(*((udev_t *)data), 0); + tdev = udev2dev(*((udev_t *)ap->a_data), 0); if (tdev == NODEV) return (snp_down(snp)); @@ -513,11 +511,11 @@ snpioctl(dev_t dev, u_long cmd, caddr_t data, int flags, d_thread_t *td) * SNPGTTY happy, else we can't know what is device * major/minor for tty. */ - *((dev_t *)data) = snp->snp_target; + *((dev_t *)ap->a_data) = snp->snp_target; break; case FIOASYNC: - if (*(int *)data) + if (*(int *)ap->a_data) snp->snp_flags |= SNOOP_ASYNC; else snp->snp_flags &= ~SNOOP_ASYNC; @@ -526,15 +524,15 @@ snpioctl(dev_t dev, u_long cmd, caddr_t data, int flags, d_thread_t *td) case FIONREAD: crit_enter(); if (snp->snp_tty != NULL) - *(int *)data = snp->snp_len; + *(int *)ap->a_data = snp->snp_len; else if (snp->snp_flags & SNOOP_DOWN) { if (snp->snp_flags & SNOOP_OFLOW) - *(int *)data = SNP_OFLOW; + *(int *)ap->a_data = SNP_OFLOW; else - *(int *)data = SNP_TTYCLOSE; + *(int *)ap->a_data = SNP_TTYCLOSE; } else { - *(int *)data = SNP_DETACH; + *(int *)ap->a_data = SNP_DETACH; } crit_exit(); break; @@ -546,8 +544,9 @@ snpioctl(dev_t dev, u_long cmd, caddr_t data, int flags, d_thread_t *td) } static int -snppoll(dev_t dev, int events, d_thread_t *td) +snppoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct snoop *snp; int revents; @@ -558,13 +557,14 @@ snppoll(dev_t dev, int events, d_thread_t *td) * Caller should see if we down via FIONREAD ioctl(). The last should * return -1 to indicate down state. */ - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (snp->snp_flags & SNOOP_DOWN || snp->snp_len > 0) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(td, &snp->snp_sel); + selrecord(curthread, &snp->snp_sel); } - return (revents); + ap->a_events = revents; + return (0); } static int @@ -574,13 +574,13 @@ snp_modevent(module_t mod, int type, void *data) switch (type) { case MOD_LOAD: snooplinedisc = ldisc_register(LDISC_LOAD, &snpdisc); - cdevsw_add(&snp_cdevsw, 0, 0); + dev_ops_add(&snp_ops, 0, 0); break; case MOD_UNLOAD: if (!LIST_EMPTY(&snp_sclist)) return (EBUSY); ldisc_deregister(snooplinedisc); - cdevsw_remove(&snp_cdevsw, 0, 0); + dev_ops_remove(&snp_ops, 0, 0); break; default: break; diff --git a/sys/dev/misc/spic/spic.c b/sys/dev/misc/spic/spic.c index 76721b0f95..6e129efecb 100644 --- a/sys/dev/misc/spic/spic.c +++ b/sys/dev/misc/spic/spic.c @@ -48,7 +48,7 @@ * also provided sample code upon which this driver was based. * * $FreeBSD: src/sys/i386/isa/spic.c,v 1.4.2.1 2002/04/15 00:52:12 will Exp $ - * $DragonFly: src/sys/dev/misc/spic/spic.c,v 1.13 2005/10/27 13:33:19 sephe Exp $ + * $DragonFly: src/sys/dev/misc/spic/spic.c,v 1.14 2006/07/28 02:17:36 dillon Exp $ */ #include @@ -87,23 +87,13 @@ static d_read_t spicread; static d_ioctl_t spicioctl; static d_poll_t spicpoll; -static struct cdevsw spic_cdevsw = { - /* name */ "spic", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ spicopen, - /* close */ spicclose, - /* read */ spicread, - /* write */ nowrite, - /* ioctl */ spicioctl, - /* poll */ spicpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops spic_ops = { + { "spic", CDEV_MAJOR, 0 }, + .d_open = spicopen, + .d_close = spicclose, + .d_read = spicread, + .d_ioctl = spicioctl, + .d_poll = spicpoll, }; #define SCBUFLEN 128 @@ -357,8 +347,8 @@ spic_attach(device_t dev) spic_call1(sc, 0x92); /* There can be only one */ - cdevsw_add(&spic_cdevsw, -1, device_get_unit(dev)); - make_dev(&spic_cdevsw, device_get_unit(dev), 0, 0, 0600, "jogdial"); + dev_ops_add(&spic_ops, -1, device_get_unit(dev)); + make_dev(&spic_ops, device_get_unit(dev), 0, 0, 0600, "jogdial"); return 0; } @@ -454,7 +444,7 @@ spictimeout(void *arg) } static int -spicopen(dev_t dev, int flag, int fmt, struct thread *td) +spicopen(struct dev_open_args *ap) { struct spic_softc *sc; @@ -472,7 +462,7 @@ spicopen(dev_t dev, int flag, int fmt, struct thread *td) } static int -spicclose(dev_t dev, int flag, int fmt, struct thread *td) +spicclose(struct dev_close_args *ap) { struct spic_softc *sc; @@ -485,8 +475,9 @@ spicclose(dev_t dev, int flag, int fmt, struct thread *td) } static int -spicread(dev_t dev, struct uio *uio, int flag) +spicread(struct dev_read_args *ap) { + struct uio *uio = ap->a_uio; struct spic_softc *sc; int l, error; u_char buf[SCBUFLEN]; @@ -519,7 +510,7 @@ spicread(dev_t dev, struct uio *uio, int flag) } static int -spicioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +spicioctl(struct dev_ioctl_args *ap) { struct spic_softc *sc; @@ -529,32 +520,23 @@ spicioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td) } static int -spicpoll(dev_t dev, int events, struct thread *td) +spicpoll(struct dev_poll_args *ap) { struct spic_softc *sc; - struct proc *p; - struct proc *p1; int revents = 0; - p = td->td_proc; - KKASSERT(p); - sc = devclass_get_softc(spic_devclass, 0); crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { - if (sc->sc_count) - revents |= events & (POLLIN | POLLRDNORM); - else { - if (sc->sc_rsel.si_pid && (p1=pfind(sc->sc_rsel.si_pid)) - && p1->p_wchan == (caddr_t)&selwait) - sc->sc_rsel.si_flags = SI_COLL; - else - sc->sc_rsel.si_pid = p->p_pid; + if (ap->a_events & (POLLIN | POLLRDNORM)) { + if (sc->sc_count) { + revents |= ap->a_events & (POLLIN | POLLRDNORM); + } else { + selrecord(curthread, &sc->sc_rsel); } } crit_exit(); - - return revents; + ap->a_events = revents; + return(0); } diff --git a/sys/dev/misc/spigot/spigot.c b/sys/dev/misc/spigot/spigot.c index cc03b910a1..4648aa3760 100644 --- a/sys/dev/misc/spigot/spigot.c +++ b/sys/dev/misc/spigot/spigot.c @@ -43,7 +43,7 @@ * Version 1.7, December 1995. * * $FreeBSD: src/sys/i386/isa/spigot.c,v 1.44 2000/01/29 16:17:36 peter Exp $ - * $DragonFly: src/sys/dev/misc/spigot/spigot.c,v 1.11 2005/10/13 08:50:33 sephe Exp $ + * $DragonFly: src/sys/dev/misc/spigot/spigot.c,v 1.12 2006/07/28 02:17:36 dillon Exp $ * */ @@ -58,6 +58,7 @@ error "Can only have 1 spigot configured." #include #include #include +#include #include #include #include @@ -96,23 +97,14 @@ static d_ioctl_t spigot_ioctl; static d_mmap_t spigot_mmap; #define CDEV_MAJOR 11 -static struct cdevsw spigot_cdevsw = { - /* name */ "spigot", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ spigot_open, - /* close */ spigot_close, - /* read */ spigot_read, - /* write */ spigot_write, - /* ioctl */ spigot_ioctl, - /* poll */ nopoll, - /* mmap */ spigot_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops spigot_ops = { + { "spigot", CDEV_MAJOR, 0 }, + .d_open = spigot_open, + .d_close = spigot_close, + .d_read = spigot_read, + .d_write = spigot_write, + .d_ioctl = spigot_ioctl, + .d_mmap = spigot_mmap, }; static void spigintr(void *); @@ -147,16 +139,19 @@ spigot_attach(struct isa_device *devp) devp->id_intr = (inthand2_t *)spigintr; ss->maddr = kvtop(devp->id_maddr); ss->irq = devp->id_irq; - cdevsw_add(&spigot_cdevsw, -1, unit); - make_dev(&spigot_cdevsw, unit, 0, 0, 0644, "spigot%d", unit); + dev_ops_add(&spigot_ops, -1, unit); + make_dev(&spigot_ops, unit, 0, 0, 0644, "spigot%d", unit); return 1; } static int -spigot_open(dev_t dev, int flags, int fmt, struct thread *td) +spigot_open(struct dev_open_args *ap) { -int error; -struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; + dev_t dev = ap->a_head.a_dev; + int error; + struct spigot_softc *ss; + + ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; if((ss->flags & ALIVE) == 0) return ENXIO; @@ -171,7 +166,7 @@ struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; * require sufficient privilege soon and nothing much can be done * without them. */ - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return error; if (securelevel > 0) @@ -186,10 +181,12 @@ struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; } static int -spigot_close(dev_t dev, int flags, int fmt, struct thread *td) +spigot_close(struct dev_close_args *ap) { -struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; + dev_t dev = ap->a_head.a_dev; + struct spigot_softc *ss; + ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; ss->flags &= ~OPEN; ss->p = 0; ss->signal_num = 0; @@ -200,45 +197,50 @@ struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; } static int -spigot_write(dev_t dev, struct uio *uio, int ioflag) +spigot_write(struct dev_write_args *ap) { return ENXIO; } static int -spigot_read(dev_t dev, struct uio *uio, int ioflag) +spigot_read(struct dev_read_args *ap) { return ENXIO; } static int -spigot_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +spigot_ioctl(struct dev_ioctl_args *ap) { -int error; -struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; -struct spigot_info *info; + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; + int error; + struct spigot_softc *ss; + struct spigot_info *info; + + ss = (struct spigot_softc *)&spigot_softc[UNIT(dev)]; + if (data == NULL) + return(EINVAL); - if(!data) return(EINVAL); - switch(cmd){ + switch(ap->a_cmd){ case SPIGOT_SETINT: if (*(int *)data < 0 || *(int *)data > _SIG_MAXSIG) return (EINVAL); - ss->p = td->td_proc; + ss->p = curproc; ss->signal_num = *((int *)data); break; case SPIGOT_IOPL_ON: /* allow access to the IO PAGE */ #if !defined(SPIGOT_UNSECURE) - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return error; if (securelevel > 0) return EPERM; #endif - td->td_proc->p_md.md_regs->tf_eflags |= PSL_IOPL; + curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; break; case SPIGOT_IOPL_OFF: /* deny access to the IO PAGE */ - td->td_proc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; + curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; break; case SPIGOT_GET_INFO: info = (struct spigot_info *)data; @@ -260,24 +262,23 @@ static void spigintr(void *arg) { int unit = (int)arg; -struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[unit]; + struct spigot_softc *ss; + ss = (struct spigot_softc *)&spigot_softc[unit]; if(ss->p && ss->signal_num) psignal(ss->p, ss->signal_num); } static int -spigot_mmap(dev_t dev, vm_offset_t offset, int nprot) +spigot_mmap(struct dev_mmap_args *ap) { -struct spigot_softc *ss = (struct spigot_softc *)&spigot_softc[0]; - - if(offset != 0) { - printf("spigot mmap failed, offset = 0x%x != 0x0\n", offset); - return -1; - } - - if(nprot & PROT_EXEC) - return -1; + struct spigot_softc *ss; - return i386_btop(ss->maddr); + ss = (struct spigot_softc *)&spigot_softc[0]; + if (ap->a_offset != 0) + return EINVAL; + if (ap->a_nprot & PROT_EXEC) + return EINVAL; + ap->a_result = i386_btop(ss->maddr); + return(0); } diff --git a/sys/dev/misc/syscons/schistory.c b/sys/dev/misc/syscons/schistory.c index 90b1576897..b97367d74e 100644 --- a/sys/dev/misc/syscons/schistory.c +++ b/sys/dev/misc/syscons/schistory.c @@ -27,7 +27,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/schistory.c,v 1.8.2.1 2001/07/19 06:38:53 dd Exp $ - * $DragonFly: src/sys/dev/misc/syscons/schistory.c,v 1.6 2005/03/28 21:30:23 swildner Exp $ + * $DragonFly: src/sys/dev/misc/syscons/schistory.c,v 1.7 2006/07/28 02:17:36 dillon Exp $ */ #include "use_sc.h" @@ -276,8 +276,7 @@ sc_hist_down_line(scr_stat *scp) } int -sc_hist_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, - struct thread *td) +sc_hist_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag) { scr_stat *scp; int error; diff --git a/sys/dev/misc/syscons/scmouse.c b/sys/dev/misc/syscons/scmouse.c index 3cb14edeb7..b5b1b12a6d 100644 --- a/sys/dev/misc/syscons/scmouse.c +++ b/sys/dev/misc/syscons/scmouse.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/scmouse.c,v 1.12.2.3 2001/07/28 12:51:47 yokota Exp $ - * $DragonFly: src/sys/dev/misc/syscons/scmouse.c,v 1.10 2005/06/11 00:29:10 dillon Exp $ + * $DragonFly: src/sys/dev/misc/syscons/scmouse.c,v 1.11 2006/07/28 02:17:36 dillon Exp $ */ #include "opt_syscons.h" @@ -569,8 +569,7 @@ mouse_paste(scr_stat *scp) #endif /* SC_NO_CUTPASTE */ int -sc_mouse_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, - struct thread *td) +sc_mouse_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag) { mouse_info_t *mouse; scr_stat *cur_scp; @@ -589,8 +588,8 @@ sc_mouse_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, case MOUSE_MODE: if (ISSIGVALID(mouse->u.mode.signal)) { scp->mouse_signal = mouse->u.mode.signal; - scp->mouse_proc = td->td_proc; - scp->mouse_pid = td->td_proc->p_pid; + scp->mouse_proc = curproc; + scp->mouse_pid = curproc->p_pid; } else { scp->mouse_signal = 0; diff --git a/sys/dev/misc/syscons/scterm-dumb.c b/sys/dev/misc/syscons/scterm-dumb.c index 8e316a1ff2..b6b3fdc1b8 100644 --- a/sys/dev/misc/syscons/scterm-dumb.c +++ b/sys/dev/misc/syscons/scterm-dumb.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/scterm-dumb.c,v 1.2 2000/01/29 15:08:45 peter Exp $ - * $DragonFly: src/sys/dev/misc/syscons/scterm-dumb.c,v 1.4 2003/08/07 21:16:59 dillon Exp $ + * $DragonFly: src/sys/dev/misc/syscons/scterm-dumb.c,v 1.5 2006/07/28 02:17:36 dillon Exp $ */ #include "opt_syscons.h" @@ -105,7 +105,7 @@ dumb_puts(scr_stat *scp, u_char *buf, int len) static int dumb_ioctl(scr_stat *scp, struct tty *tp, u_long cmd, caddr_t data, - int flag, struct thread *td) + int flag) { vid_info_t *vi; diff --git a/sys/dev/misc/syscons/scterm-sc.c b/sys/dev/misc/syscons/scterm-sc.c index c9d79bb6a1..afe1783e96 100644 --- a/sys/dev/misc/syscons/scterm-sc.c +++ b/sys/dev/misc/syscons/scterm-sc.c @@ -25,7 +25,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/scterm-sc.c,v 1.4.2.10 2001/06/11 09:05:39 phk Exp $ - * $DragonFly: src/sys/dev/misc/syscons/scterm-sc.c,v 1.6 2005/06/11 00:26:45 dillon Exp $ + * $DragonFly: src/sys/dev/misc/syscons/scterm-sc.c,v 1.7 2006/07/28 02:17:36 dillon Exp $ */ #include "opt_syscons.h" @@ -667,7 +667,7 @@ outloop: static int scterm_ioctl(scr_stat *scp, struct tty *tp, u_long cmd, caddr_t data, - int flag, struct thread *td) + int flag) { term_stat *tcp = scp->ts; vid_info_t *vi; diff --git a/sys/dev/misc/syscons/scvesactl.c b/sys/dev/misc/syscons/scvesactl.c index 7bc92ccfe1..2f3b34350d 100644 --- a/sys/dev/misc/syscons/scvesactl.c +++ b/sys/dev/misc/syscons/scvesactl.c @@ -27,7 +27,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/scvesactl.c,v 1.15 2000/01/29 15:08:47 peter Exp $ - * $DragonFly: src/sys/dev/misc/syscons/Attic/scvesactl.c,v 1.6 2004/09/04 06:15:08 dillon Exp $ + * $DragonFly: src/sys/dev/misc/syscons/Attic/scvesactl.c,v 1.7 2006/07/28 02:17:36 dillon Exp $ */ #include "opt_vga.h" @@ -49,18 +49,18 @@ static d_ioctl_t *prev_user_ioctl; static int -vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +vesa_ioctl(struct dev_ioctl_args *ap) { scr_stat *scp; struct tty *tp; int mode; - tp = dev->si_tty; + tp = ap->a_head.a_dev->si_tty; if (!tp) return ENXIO; scp = SC_STAT(tp->t_dev); - switch (cmd) { + switch (ap->a_cmd) { /* generic text modes */ case SW_TEXT_132x25: case SW_TEXT_132x30: @@ -68,7 +68,7 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case SW_TEXT_132x60: if (!(scp->sc->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; - return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0); + return sc_set_text_mode(scp, tp, ap->a_cmd & 0xff, 0, 0, 0); /* text modes */ case SW_VESA_C80x60: @@ -78,7 +78,7 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case SW_VESA_C132x60: if (!(scp->sc->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; - mode = (cmd & 0xff) + M_VESA_BASE; + mode = (ap->a_cmd & 0xff) + M_VESA_BASE; return sc_set_text_mode(scp, tp, mode, 0, 0, 0); /* graphics modes */ @@ -104,14 +104,14 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case SW_VESA_FULL_1280: if (!(scp->sc->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; - mode = (cmd & 0xff) + M_VESA_BASE; + mode = (ap->a_cmd & 0xff) + M_VESA_BASE; return sc_set_graphics_mode(scp, tp, mode); default: - if (IOCGROUP(cmd) == 'V') { + if (IOCGROUP(ap->a_cmd) == 'V') { if (!(scp->sc->adp->va_flags & V_ADP_MODECHANGE)) return ENODEV; - mode = (cmd & 0xff) + M_VESA_BASE; + mode = (ap->a_cmd & 0xff) + M_VESA_BASE; if ((mode > M_VESA_FULL_1280) && (mode < M_VESA_MODE_MAX)) @@ -120,7 +120,7 @@ vesa_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } if (prev_user_ioctl) - return (*prev_user_ioctl)(dev, cmd, data, flag, td); + return (*prev_user_ioctl)(ap); else return ENOIOCTL; } diff --git a/sys/dev/misc/syscons/scvidctl.c b/sys/dev/misc/syscons/scvidctl.c index 7b764fdf30..2091509aa8 100644 --- a/sys/dev/misc/syscons/scvidctl.c +++ b/sys/dev/misc/syscons/scvidctl.c @@ -27,7 +27,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/scvidctl.c,v 1.19.2.2 2000/05/05 09:16:08 nyan Exp $ - * $DragonFly: src/sys/dev/misc/syscons/scvidctl.c,v 1.13 2005/10/30 10:07:10 swildner Exp $ + * $DragonFly: src/sys/dev/misc/syscons/scvidctl.c,v 1.14 2006/07/28 02:17:36 dillon Exp $ */ #include "opt_syscons.h" @@ -380,7 +380,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, (*vidsw[(a)->va_index]->ioctl)((a), (c), (caddr_t)(d))) int -sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *td) +sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag) { scr_stat *scp; video_adapter_t *adp; diff --git a/sys/dev/misc/syscons/syscons.c b/sys/dev/misc/syscons/syscons.c index e7e2f847e8..1875a0ef81 100644 --- a/sys/dev/misc/syscons/syscons.c +++ b/sys/dev/misc/syscons/syscons.c @@ -29,7 +29,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/dev/syscons/syscons.c,v 1.336.2.17 2004/03/25 08:41:09 ru Exp $ - * $DragonFly: src/sys/dev/misc/syscons/syscons.c,v 1.23 2005/10/30 10:07:10 swildner Exp $ + * $DragonFly: src/sys/dev/misc/syscons/syscons.c,v 1.24 2006/07/28 02:17:36 dillon Exp $ */ #include "use_splash.h" @@ -196,24 +196,16 @@ static d_read_t scread; static d_ioctl_t scioctl; static d_mmap_t scmmap; -static struct cdevsw sc_cdevsw = { - /* name */ "sc", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ scopen, - /* close */ scclose, - /* read */ scread, - /* write */ ttywrite, - /* ioctl */ scioctl, - /* poll */ ttypoll, - /* mmap */ scmmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops sc_ops = { + { "sc", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = scopen, + .d_close = scclose, + .d_read = scread, + .d_write = ttywrite, + .d_ioctl = scioctl, + .d_poll = ttypoll, + .d_mmap = scmmap, + .d_kqfilter = ttykqfilter }; int @@ -374,13 +366,13 @@ sc_attach_unit(int unit, int flags) (void *)(uintptr_t)unit, SHUTDOWN_PRI_DEFAULT); /* - * create devices. cdevsw_add() must be called to make devices under + * create devices. dev_ops_add() must be called to make devices under * this major number available to userland. */ - cdevsw_add(&sc_cdevsw, ~(MAXCONS - 1), unit * MAXCONS); + dev_ops_add(&sc_ops, ~(MAXCONS - 1), unit * MAXCONS); for (vc = 0; vc < sc->vtys; vc++) { - dev = make_dev(&sc_cdevsw, vc + unit * MAXCONS, + dev = make_dev(&sc_ops, vc + unit * MAXCONS, UID_ROOT, GID_WHEEL, 0600, "ttyv%r", vc + unit * MAXCONS); sc->dev[vc] = dev; /* @@ -390,8 +382,8 @@ sc_attach_unit(int unit, int flags) */ } - cdevsw_add(&sc_cdevsw, -1, SC_CONSOLECTL); /* XXX */ - dev = make_dev(&sc_cdevsw, SC_CONSOLECTL, + dev_ops_add(&sc_ops, -1, SC_CONSOLECTL); /* XXX */ + dev = make_dev(&sc_ops, SC_CONSOLECTL, UID_ROOT, GID_WHEEL, 0600, "consolectl"); dev->si_tty = sc_console_tty = ttymalloc(sc_console_tty); dev->si_drv1 = sc_console; @@ -444,8 +436,9 @@ scdevtounit(dev_t dev) } int -scopen(dev_t dev, int flag, int mode, struct thread *td) +scopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = scdevtounit(dev); sc_softc_t *sc; struct tty *tp; @@ -483,7 +476,7 @@ scopen(dev_t dev, int flag, int mode, struct thread *td) (*linesw[tp->t_line].l_modem)(tp, 1); } else - if (tp->t_state & TS_XCLUDE && suser(td)) + if (tp->t_state & TS_XCLUDE && suser_cred(ap->a_cred, 0)) return(EBUSY); error = (*linesw[tp->t_line].l_open)(dev, tp); @@ -503,8 +496,9 @@ scopen(dev_t dev, int flag, int mode, struct thread *td) } int -scclose(dev_t dev, int flag, int mode, struct thread *td) +scclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp = dev->si_tty; scr_stat *scp; @@ -546,17 +540,17 @@ scclose(dev_t dev, int flag, int mode, struct thread *td) kbd_ioctl(scp->sc->kbd, KDSKBMODE, (caddr_t)&scp->kbd_mode); DPRINTF(5, ("done.\n")); } - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); ttyclose(tp); crit_exit(); return(0); } int -scread(dev_t dev, struct uio *uio, int flag) +scread(struct dev_read_args *ap) { sc_touch_scrn_saver(); - return ttyread(dev, uio, flag); + return (ttyread(ap)); } static int @@ -638,38 +632,39 @@ scparam(struct tty *tp, struct termios *t) } int -scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +scioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; + int flag = ap->a_fflag; int error; int i; struct tty *tp; sc_softc_t *sc; scr_stat *scp; - struct proc *p = td->td_proc; - - KKASSERT(p); tp = dev->si_tty; /* If there is a user_ioctl function call that first */ if (sc_user_ioctl) { - error = (*sc_user_ioctl)(dev, cmd, data, flag, td); + error = (*sc_user_ioctl)(ap); if (error != ENOIOCTL) return error; } - error = sc_vid_ioctl(tp, cmd, data, flag, td); + error = sc_vid_ioctl(tp, cmd, data, flag); if (error != ENOIOCTL) return error; #ifndef SC_NO_HISTORY - error = sc_hist_ioctl(tp, cmd, data, flag, td); + error = sc_hist_ioctl(tp, cmd, data, flag); if (error != ENOIOCTL) return error; #endif #ifndef SC_NO_SYSMOUSE - error = sc_mouse_ioctl(tp, cmd, data, flag, td); + error = sc_mouse_ioctl(tp, cmd, data, flag); if (error != ENOIOCTL) return error; #endif @@ -680,7 +675,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) sc = scp->sc; if (scp->tsw) { - error = (*scp->tsw->te_ioctl)(scp, tp, cmd, data, flag, td); + error = (*scp->tsw->te_ioctl)(scp, tp, cmd, data, flag); if (error != ENOIOCTL) return error; } @@ -857,7 +852,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) mode = (struct vt_mode *)data; DPRINTF(5, ("sc%d: VT_SETMODE ", sc->unit)); if (scp->smode.mode == VT_PROCESS) { - if (scp->proc == pfind(scp->pid) && scp->proc != p) { + if (scp->proc == pfind(scp->pid) && scp->proc != curproc) { DPRINTF(5, ("error EPERM\n")); return EPERM; } @@ -886,9 +881,9 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) DPRINTF(5, ("error EINVAL\n")); return EINVAL; } - DPRINTF(5, ("VT_PROCESS %d, ", p->p_pid)); + DPRINTF(5, ("VT_PROCESS %d, ", curproc->p_pid)); bcopy(data, &scp->smode, sizeof(struct vt_mode)); - scp->proc = p; + scp->proc = curproc; scp->pid = scp->proc->p_pid; if ((scp == sc->cur_scp) && (sc->unit == sc_console_unit)) cons_unavail = TRUE; @@ -913,7 +908,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) return EINVAL; } /* ...and this process is controlling it. */ - if (scp->proc != p) { + if (scp->proc != curproc) { crit_exit(); return EPERM; } @@ -996,16 +991,16 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) return 0; case KDENABIO: /* allow io operations */ - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return error; if (securelevel > 0) return EPERM; - p->p_md.md_regs->tf_eflags |= PSL_IOPL; + curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; return 0; case KDDISABIO: /* disallow io operations (default) */ - p->p_md.md_regs->tf_eflags &= ~PSL_IOPL; + curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; return 0; case KDSKBSTATE: /* set keyboard state (locks) */ @@ -1285,7 +1280,7 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; } - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, ap->a_cred); if (error != ENOIOCTL) return(error); error = ttioctl(tp, cmd, data, flag); @@ -1340,7 +1335,7 @@ sccnprobe(struct consdev *cp) return; /* initialize required fields */ - cp->cn_dev = make_dev(&sc_cdevsw, SC_CONSOLECTL, + cp->cn_dev = make_dev(&sc_ops, SC_CONSOLECTL, UID_ROOT, GID_WHEEL, 0600, "consolectl"); } @@ -2527,7 +2522,7 @@ scinit(int unit, int flags) sc->vtys = MAXCONS; /* XXX: should be configurable */ if (flags & SC_KERNEL_CONSOLE) { sc->dev = main_devs; - sc->dev[0] = make_dev(&sc_cdevsw, unit*MAXCONS, UID_ROOT, + sc->dev[0] = make_dev(&sc_ops, unit*MAXCONS, UID_ROOT, GID_WHEEL, 0600, "ttyv%r", unit*MAXCONS); sc->dev[0]->si_tty = &main_tty; ttyregister(&main_tty); @@ -2543,7 +2538,7 @@ scinit(int unit, int flags) } else { /* assert(sc_malloc) */ sc->dev = malloc(sizeof(dev_t)*sc->vtys, M_SYSCONS, M_WAITOK | M_ZERO); - sc->dev[0] = make_dev(&sc_cdevsw, unit*MAXCONS, UID_ROOT, + sc->dev[0] = make_dev(&sc_ops, unit*MAXCONS, UID_ROOT, GID_WHEEL, 0600, "ttyv%r", unit*MAXCONS); sc->dev[0]->si_tty = ttymalloc(sc->dev[0]->si_tty); scp = alloc_scp(sc, sc->first_vty); @@ -3198,14 +3193,16 @@ next_code: } int -scmmap(dev_t dev, vm_offset_t offset, int nprot) +scmmap(struct dev_mmap_args *ap) { scr_stat *scp; - scp = SC_STAT(dev); + scp = SC_STAT(ap->a_head.a_dev); if (scp != scp->sc->cur_scp) - return -1; - return (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp, offset, nprot); + return EINVAL; + ap->a_result = (*vidsw[scp->sc->adapter]->mmap)(scp->sc->adp, ap->a_offset, + ap->a_nprot); + return(0); } static int diff --git a/sys/dev/misc/syscons/syscons.h b/sys/dev/misc/syscons/syscons.h index 155947ed0c..5043d0709b 100644 --- a/sys/dev/misc/syscons/syscons.h +++ b/sys/dev/misc/syscons/syscons.h @@ -29,7 +29,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/syscons.h,v 1.60.2.6 2002/09/15 22:30:45 dd Exp $ - * $DragonFly: src/sys/dev/misc/syscons/syscons.h,v 1.15 2005/05/26 16:24:33 swildner Exp $ + * $DragonFly: src/sys/dev/misc/syscons/syscons.h,v 1.16 2006/07/28 02:17:36 dillon Exp $ */ #ifndef _DEV_SYSCONS_SYSCONS_H_ @@ -169,6 +169,7 @@ struct keyboard; struct video_adapter; struct scr_stat; struct tty; +struct dev_ioctl_args; typedef struct sc_softc { int unit; /* unit # */ @@ -341,7 +342,7 @@ typedef int sc_term_init_t(scr_stat *scp, void **tcp, int code); typedef int sc_term_term_t(scr_stat *scp, void **tcp); typedef void sc_term_puts_t(scr_stat *scp, u_char *buf, int len); typedef int sc_term_ioctl_t(scr_stat *scp, struct tty *tp, u_long cmd, - caddr_t data, int flag, struct thread *td); + caddr_t data, int flag); typedef int sc_term_reset_t(scr_stat *scp, int code); #define SC_TE_HARD_RESET 0 #define SC_TE_SOFT_RESET 1 @@ -514,8 +515,7 @@ typedef struct { (*kbdsw[(kbd)->kb_index]->poll)((kbd), (on)) /* syscons.c */ -extern int (*sc_user_ioctl)(dev_t dev, u_long cmd, caddr_t data, - int flag, struct thread *td); +extern int (*sc_user_ioctl)(struct dev_ioctl_args *); int sc_probe_unit(int unit, int flags); int sc_attach_unit(int unit, int flags); @@ -556,7 +556,7 @@ void sc_hist_end(scr_stat *scp); int sc_hist_up_line(scr_stat *scp); int sc_hist_down_line(scr_stat *scp); int sc_hist_ioctl(struct tty *tp, u_long cmd, caddr_t data, - int flag, struct thread *td); + int flag); #endif /* SC_NO_HISTORY */ /* scmouse.c */ @@ -579,7 +579,7 @@ void sc_remove_all_mouse(sc_softc_t *scp); #ifndef SC_NO_SYSMOUSE void sc_mouse_move(scr_stat *scp, int x, int y); int sc_mouse_ioctl(struct tty *tp, u_long cmd, caddr_t data, - int flag, struct thread *td); + int flag); #endif /* SC_NO_SYSMOUSE */ /* scvidctl.c */ @@ -588,8 +588,8 @@ int sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode); int sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, int fontsize); -int sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, - struct thread *td); +int sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, + int flag); int sc_render_add(sc_renderer_t *rndr); int sc_render_remove(sc_renderer_t *rndr); diff --git a/sys/dev/misc/syscons/sysmouse.c b/sys/dev/misc/syscons/sysmouse.c index 1ad76846bb..f285da1099 100644 --- a/sys/dev/misc/syscons/sysmouse.c +++ b/sys/dev/misc/syscons/sysmouse.c @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/syscons/sysmouse.c,v 1.2.2.2 2001/07/16 05:21:24 yokota Exp $ - * $DragonFly: src/sys/dev/misc/syscons/sysmouse.c,v 1.10 2006/02/01 20:43:42 corecode Exp $ + * $DragonFly: src/sys/dev/misc/syscons/sysmouse.c,v 1.11 2006/07/28 02:17:36 dillon Exp $ */ #include "opt_syscons.h" @@ -51,23 +51,13 @@ static d_open_t smopen; static d_close_t smclose; static d_ioctl_t smioctl; -static struct cdevsw sm_cdevsw = { - /* name */ "sysmouse", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY, - /* port */ NULL, - /* clone */ NULL, - - /* open */ smopen, - /* close */ smclose, - /* read */ ttyread, - /* write */ nowrite, - /* ioctl */ smioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops sm_ops = { + { "sysmouse", CDEV_MAJOR, D_TTY }, + .d_open = smopen, + .d_close = smclose, + .d_read = ttyread, + .d_ioctl = smioctl, + .d_poll = ttypoll, }; /* local variables */ @@ -79,8 +69,9 @@ static void smstart(struct tty *tp); static int smparam(struct tty *tp, struct termios *t); static int -smopen(dev_t dev, int flag, int mode, struct thread *td) +smopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; DPRINTF(5, ("smopen: dev:%d,%d, vty:%d\n", @@ -106,7 +97,7 @@ smopen(dev_t dev, int flag, int mode, struct thread *td) tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; smparam(tp, &tp->t_termios); (*linesw[tp->t_line].l_modem)(tp, 1); - } else if (tp->t_state & TS_XCLUDE && suser(td)) { + } else if (tp->t_state & TS_XCLUDE && suser_cred(ap->a_cred, 0)) { return EBUSY; } @@ -114,14 +105,15 @@ smopen(dev_t dev, int flag, int mode, struct thread *td) } static int -smclose(dev_t dev, int flag, int mode, struct thread *td) +smclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; tp = dev->si_tty; crit_enter(); mouse_level = 0; - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); ttyclose(tp); crit_exit(); @@ -156,18 +148,19 @@ smparam(struct tty *tp, struct termios *t) } static int -smioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +smioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; mousehw_t *hw; mousemode_t *mode; int error; tp = dev->si_tty; - switch (cmd) { + switch (ap->a_cmd) { case MOUSE_GETHWINFO: /* get device information */ - hw = (mousehw_t *)data; + hw = (mousehw_t *)ap->a_data; hw->buttons = 10; /* XXX unknown */ hw->iftype = MOUSE_IF_SYSMOUSE; hw->type = MOUSE_MOUSE; @@ -176,7 +169,7 @@ smioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) return 0; case MOUSE_GETMODE: /* get protocol/mode */ - mode = (mousemode_t *)data; + mode = (mousemode_t *)ap->a_data; mode->level = mouse_level; switch (mode->level) { case 0: /* emulate MouseSystems protocol */ @@ -202,7 +195,7 @@ smioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) return 0; case MOUSE_SETMODE: /* set protocol/mode */ - mode = (mousemode_t *)data; + mode = (mousemode_t *)ap->a_data; if (mode->level == -1) ; /* don't change the current setting */ else if ((mode->level < 0) || (mode->level > 1)) @@ -212,18 +205,18 @@ smioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) return 0; case MOUSE_GETLEVEL: /* get operation level */ - *(int *)data = mouse_level; + *(int *)ap->a_data = mouse_level; return 0; case MOUSE_SETLEVEL: /* set operation level */ - if ((*(int *)data < 0) || (*(int *)data > 1)) + if ((*(int *)ap->a_data < 0) || (*(int *)ap->a_data > 1)) return EINVAL; - mouse_level = *(int *)data; + mouse_level = *(int *)ap->a_data; return 0; case MOUSE_GETSTATUS: /* get accumulated mouse events */ crit_enter(); - *(mousestatus_t *)data = mouse_status; + *(mousestatus_t *)ap->a_data = mouse_status; mouse_status.flags = 0; mouse_status.obutton = mouse_status.button; mouse_status.dx = 0; @@ -243,10 +236,10 @@ smioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) return ENODEV; } - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, ap->a_cmd, ap->a_data, ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return error; - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, ap->a_cmd, ap->a_data, ap->a_fflag); if (error != ENOIOCTL) return error; return ENOTTY; @@ -257,8 +250,8 @@ sm_attach_mouse(void *unused) { dev_t dev; - cdevsw_add(&sm_cdevsw, -1, SC_MOUSE); - dev = make_dev(&sm_cdevsw, SC_MOUSE, UID_ROOT, GID_WHEEL, 0600, + dev_ops_add(&sm_ops, -1, SC_MOUSE); + dev = make_dev(&sm_ops, SC_MOUSE, UID_ROOT, GID_WHEEL, 0600, "sysmouse"); /* sysmouse doesn't have scr_stat */ } diff --git a/sys/dev/misc/tw/tw.c b/sys/dev/misc/tw/tw.c index 4f8648cdae..1e8ce27781 100644 --- a/sys/dev/misc/tw/tw.c +++ b/sys/dev/misc/tw/tw.c @@ -29,7 +29,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/tw.c,v 1.38 2000/01/29 16:00:32 peter Exp $ - * $DragonFly: src/sys/dev/misc/tw/tw.c,v 1.16 2006/06/10 20:00:16 dillon Exp $ + * $DragonFly: src/sys/dev/misc/tw/tw.c,v 1.17 2006/07/28 02:17:37 dillon Exp $ * */ @@ -144,6 +144,7 @@ #include #include #include +#include #include #include #include @@ -216,23 +217,13 @@ static d_write_t twwrite; static d_poll_t twpoll; #define CDEV_MAJOR 19 -static struct cdevsw tw_cdevsw = { - /* name */ "tw", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ twopen, - /* close */ twclose, - /* read */ twread, - /* write */ twwrite, - /* ioctl */ noioctl, - /* poll */ twpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops tw_ops = { + { "tw", CDEV_MAJOR, 0 }, + .d_open = twopen, + .d_close = twclose, + .d_read = twread, + .d_write = twwrite, + .d_poll = twpoll, }; /* @@ -406,14 +397,15 @@ twattach(struct isa_device *idp) sc->sc_state = 0; sc->sc_rcount = 0; callout_init(&sc->abortrcv_ch); - cdevsw_add(&tw_cdevsw, -1, unit); - make_dev(&tw_cdevsw, unit, 0, 0, 0600, "tw%d", unit); + dev_ops_add(&tw_ops, -1, unit); + make_dev(&tw_ops, unit, 0, 0, 0600, "tw%d", unit); return (1); } int -twopen(dev_t dev, int flag, int mode, struct thread *td) +twopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tw_sc *sc = &tw_sc[TWUNIT(dev)]; crit_enter(); @@ -428,8 +420,9 @@ twopen(dev_t dev, int flag, int mode, struct thread *td) } int -twclose(dev_t dev, int flag, int mode, struct thread *td) +twclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tw_sc *sc = &tw_sc[TWUNIT(dev)]; crit_enter(); @@ -440,8 +433,10 @@ twclose(dev_t dev, int flag, int mode, struct thread *td) } int -twread(dev_t dev, struct uio *uio, int ioflag) +twread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; u_char buf[3]; struct tw_sc *sc = &tw_sc[TWUNIT(dev)]; int error, cnt; @@ -456,8 +451,10 @@ twread(dev_t dev, struct uio *uio, int ioflag) } int -twwrite(dev_t dev, struct uio *uio, int ioflag) +twwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct tw_sc *sc; int house, key, reps; int error; @@ -526,22 +523,24 @@ twwrite(dev_t dev, struct uio *uio, int ioflag) */ int -twpoll(dev_t dev, int events, struct thread *td) +twpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tw_sc *sc; int revents = 0; sc = &tw_sc[TWUNIT(dev)]; crit_enter(); /* XXX is this correct? the original code didn't test select rw mode!! */ - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if(sc->sc_nextin != sc->sc_nextout) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(td, &sc->sc_selp); + selrecord(curthread, &sc->sc_selp); } crit_exit(); - return(revents); + ap->a_events = revents; + return(0); } /* diff --git a/sys/dev/misc/xrpu/xrpu.c b/sys/dev/misc/xrpu/xrpu.c index 2ca96f2a75..e9937f9c6f 100644 --- a/sys/dev/misc/xrpu/xrpu.c +++ b/sys/dev/misc/xrpu/xrpu.c @@ -7,7 +7,7 @@ * ---------------------------------------------------------------------------- * * $FreeBSD: src/sys/pci/xrpu.c,v 1.19.2.1 2000/08/02 22:19:57 peter Exp $ - * $DragonFly: src/sys/dev/misc/xrpu/Attic/xrpu.c,v 1.8 2004/05/19 22:52:45 dillon Exp $ + * $DragonFly: src/sys/dev/misc/xrpu/Attic/xrpu.c,v 1.9 2006/07/28 02:17:37 dillon Exp $ * * A very simple device driver for PCI cards based on Xilinx 6200 series * FPGA/RPU devices. Current Functionality is to allow you to open and @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -43,23 +44,12 @@ static d_ioctl_t xrpu_ioctl; static d_mmap_t xrpu_mmap; #define CDEV_MAJOR 100 -static struct cdevsw xrpu_cdevsw = { - /* name */ "xrpu", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ xrpu_open, - /* close */ xrpu_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ xrpu_ioctl, - /* poll */ nopoll, - /* mmap */ xrpu_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops xrpu_ops = { + { "xrpu", CDEV_MAJOR, 0 }, + .d_open = xrpu_open, + .d_close = xrpu_close, + .d_ioctl = xrpu_ioctl, + .d_mmap = xrpu_mmap, }; static MALLOC_DEFINE(M_XRPU, "xrpu", "XRPU related"); @@ -124,8 +114,9 @@ xrpu_poll_pps(struct timecounter *tc) #endif static int -xrpu_open(dev_t dev, int flag, int mode, struct thread *td) +xrpu_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct softc *sc = devclass_get_softc(xrpu_devclass, dev2unit(dev)); if (!sc) @@ -135,23 +126,26 @@ xrpu_open(dev_t dev, int flag, int mode, struct thread *td) } static int -xrpu_close(dev_t dev, int flag, int mode, struct thread *td) -{ +xrpu_close(struct dev_close_args *ap) +{ return (0); } static int -xrpu_mmap(dev_t dev, vm_offset_t offset, int nprot) +xrpu_mmap(struct dev_mmap_args *ap) { + dev_t dev = ap->a_head.a_dev; struct softc *sc = dev->si_drv1; - if (offset >= 0x1000000) + + if (ap->a_offset >= 0x1000000) return (-1); - return (i386_btop(sc->physbase + offset)); + return (i386_btop(sc->physbase + ap->a_offset)); } static int -xrpu_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) +xrpu_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct softc *sc = dev->si_drv1; int i, error; @@ -159,13 +153,13 @@ xrpu_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) i = dev2pps(dev); if (i < 0 || i >= XRPU_MAX_PPS) return ENODEV; - error = pps_ioctl(cmd, arg, &sc->pps[i]); + error = pps_ioctl(ap->a_cmd, ap->a_data, &sc->pps[i]); return (error); } #if 0 - if (cmd == XRPU_IOC_TIMECOUNTING) { - struct xrpu_timecounting *xt = (struct xrpu_timecounting *)arg; + if (ap->a_cmd == XRPU_IOC_TIMECOUNTING) { + struct xrpu_timecounting *xt = (struct xrpu_timecounting *)ap->a_data; /* Name SHALL be zero terminated */ xt->xt_name[sizeof xt->xt_name - 1] = '\0'; @@ -184,7 +178,7 @@ xrpu_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) if (xt->xt_pps[i].xt_addr_assert == 0 && xt->xt_pps[i].xt_addr_clear == 0) continue; - make_dev(&xrpu_cdevsw, (i+1)<<16, + make_dev(&xrpu_ops, (i+1)<<16, UID_ROOT, GID_WHEEL, 0600, "xpps%d", i); sc->pps[i].ppscap = 0; if (xt->xt_pps[i].xt_addr_assert) { @@ -253,8 +247,8 @@ xrpu_attach(device_t self) printf("Mapped physbase %#lx to virbase %#lx\n", (u_long)sc->physbase, (u_long)sc->virbase); - cdevsw_add(&xrpu_cdevsw, -1, unit); - make_dev(&xrpu_cdevsw, unit, UID_ROOT, GID_WHEEL, 0600, "xrpu%d", unit); + dev_ops_add(&xrpu_ops, -1, unit); + make_dev(&xrpu_ops, unit, UID_ROOT, GID_WHEEL, 0600, "xrpu%d", unit); return 0; } diff --git a/sys/dev/netif/cx/cx.c b/sys/dev/netif/cx/cx.c index 0241978b0e..c50cbe4c42 100644 --- a/sys/dev/netif/cx/cx.c +++ b/sys/dev/netif/cx/cx.c @@ -16,7 +16,7 @@ * Version 1.9, Wed Oct 4 18:58:15 MSK 1995 * * $FreeBSD: src/sys/i386/isa/cx.c,v 1.45.2.1 2001/02/26 04:23:09 jlemon Exp $ - * $DragonFly: src/sys/dev/netif/cx/cx.c,v 1.15 2005/06/13 21:53:24 joerg Exp $ + * $DragonFly: src/sys/dev/netif/cx/cx.c,v 1.16 2006/07/28 02:17:37 dillon Exp $ * */ #undef DEBUG @@ -91,24 +91,15 @@ static d_ioctl_t cxioctl; #define CDEV_MAJOR 42 /* Don't make this static, since if_cx.c uses it. */ -struct cdevsw cx_cdevsw = { - /* name */ "cx", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ cxopen, - /* close */ cxclose, - /* read */ ttyread, - /* write */ ttywrite, - /* ioctl */ cxioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +struct dev_ops cx_ops = { + { "cx", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = cxopen, + .d_close = cxclose, + .d_read = ttyread, + .d_write = ttywrite, + .d_ioctl = cxioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; #else struct tty *cx_tty [NCX*NCHAN]; /* tty data */ @@ -118,8 +109,9 @@ static void cxoproc (struct tty *tp); static void cxstop (struct tty *tp, int flag); static int cxparam (struct tty *tp, struct termios *t); -int cxopen (dev_t dev, int flag, int mode, struct thread *td) +int cxopen (struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT (dev); cx_chan_t *c = cxchan[unit]; unsigned short port; @@ -169,7 +161,7 @@ int cxopen (dev_t dev, int flag, int mode, struct thread *td) tp = c->ttyp; tp->t_dev = dev; if ((tp->t_state & TS_ISOPEN) && (tp->t_state & TS_XCLUDE) && - suser(td)) + suser_cred(ap->a_cred, 0)) return (EBUSY); if (! (tp->t_state & TS_ISOPEN)) { ttychars (tp); @@ -231,7 +223,7 @@ int cxopen (dev_t dev, int flag, int mode, struct thread *td) } if (cx_chan_cd (c)) (*linesw[tp->t_line].l_modem)(tp, 1); - if (! (flag & O_NONBLOCK)) { + if (! (ap->a_oflags & O_NONBLOCK)) { /* Lock the channel against cxconfig while we are * waiting for carrier. */ c->sopt.lock = 1; @@ -254,8 +246,9 @@ int cxopen (dev_t dev, int flag, int mode, struct thread *td) return (error); } -int cxclose (dev_t dev, int flag, int mode, struct thread *td) +int cxclose (struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT (dev); cx_chan_t *c = cxchan[unit]; struct tty *tp; @@ -263,7 +256,7 @@ int cxclose (dev_t dev, int flag, int mode, struct thread *td) if (unit == UNIT_CTL) return (0); tp = c->ttyp; - (*linesw[tp->t_line].l_close) (tp, flag); + (*linesw[tp->t_line].l_close) (tp, ap->a_fflag); /* Disable receiver. * Transmitter continues sending the queued data. */ @@ -290,8 +283,10 @@ int cxclose (dev_t dev, int flag, int mode, struct thread *td) return (0); } -int cxioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +int cxioctl (struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; int unit = UNIT (dev); cx_chan_t *c, *m; cx_stat_t *st; @@ -309,7 +304,7 @@ int cxioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) c = &cxboard[o->board].chan[o->channel]; if (c->type == T_NONE) return (ENXIO); - switch (cmd) { + switch (ap->a_cmd) { default: return (EINVAL); @@ -423,20 +418,17 @@ int cxioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) tp = c->ttyp; if (! tp) return (EINVAL); -#if defined(__DragonFly__) || __FreeBSD__ >= 2 - error = (*linesw[tp->t_line].l_ioctl) (tp, cmd, data, flag, td); -#else - error = (*linesw[tp->t_line].l_ioctl) (tp, cmd, data, flag); -#endif + error = (*linesw[tp->t_line].l_ioctl) (tp, ap->a_cmd, data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return (error); - error = ttioctl (tp, cmd, data, flag); + error = ttioctl (tp, ap->a_cmd, data, ap->a_fflag); if (error != ENOIOCTL) return (error); crit_enter(); - switch (cmd) { + switch (ap->a_cmd) { default: crit_exit(); return (ENOTTY); diff --git a/sys/dev/netif/cx/if_cx.c b/sys/dev/netif/cx/if_cx.c index 410c0c6b63..9ec4a183ae 100644 --- a/sys/dev/netif/cx/if_cx.c +++ b/sys/dev/netif/cx/if_cx.c @@ -17,7 +17,7 @@ * Version 1.9, Wed Oct 4 18:58:15 MSK 1995 * * $FreeBSD: src/sys/i386/isa/if_cx.c,v 1.32 1999/11/18 08:36:42 peter Exp $ - * $DragonFly: src/sys/dev/netif/cx/if_cx.c,v 1.19 2005/11/28 17:13:41 dillon Exp $ + * $DragonFly: src/sys/dev/netif/cx/if_cx.c,v 1.20 2006/07/28 02:17:37 dillon Exp $ * */ #undef DEBUG @@ -99,9 +99,6 @@ static void cxup (cx_chan_t *c); cx_board_t cxboard [NCX]; /* adapter state structures */ cx_chan_t *cxchan [NCX*NCHAN]; /* unit to channel struct pointer */ -#if 0 -extern struct cdevsw cx_cdevsw; -#endif static unsigned short irq_valid_values [] = { 3, 5, 7, 10, 11, 12, 15, 0 }; static unsigned short drq_valid_values [] = { 5, 6, 7, 0 }; static unsigned short port_valid_values [] = { @@ -297,8 +294,8 @@ cxattach (struct isa_device *id) callout_reset(&cxtimeout_ch, hz * 5, cxtimeout, NULL); } printf ("cx%d: \n", unit, b->name); - cdevsw_add(&cx_cdevsw, -1, unit); - make_dev(&cx_cdevsw, unit, UID_ROOT, GID_WHEEL, 0600, "cx%d", unit); + dev_ops_add(&cx_ops, -1, unit); + make_dev(&cx_ops, unit, UID_ROOT, GID_WHEEL, 0600, "cx%d", unit); return (1); } diff --git a/sys/dev/raid/aac/aac.c b/sys/dev/raid/aac/aac.c index 60686826ab..7cd3058f75 100644 --- a/sys/dev/raid/aac/aac.c +++ b/sys/dev/raid/aac/aac.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/aac/aac.c,v 1.9.2.14 2003/04/08 13:22:08 scottl Exp $ - * $DragonFly: src/sys/dev/raid/aac/aac.c,v 1.23 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/raid/aac/aac.c,v 1.24 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -191,23 +191,12 @@ static int aac_query_disk(struct aac_softc *sc, caddr_t uptr); #define AAC_CDEV_MAJOR 150 -static struct cdevsw aac_cdevsw = { - "aac", /* name */ - AAC_CDEV_MAJOR, /* major */ - 0, /* flags */ - NULL, /* port */ - NULL, /* clone */ - - aac_open, /* open */ - aac_close, /* close */ - noread, /* read */ - nowrite, /* write */ - aac_ioctl, /* ioctl */ - aac_poll, /* poll */ - nommap, /* mmap */ - nostrategy, /* strategy */ - nodump, /* dump */ - nopsize /* psize */ +static struct dev_ops aac_ops = { + { "aac", AAC_CDEV_MAJOR, 0 }, + .d_open = aac_open, + .d_close = aac_close, + .d_ioctl = aac_ioctl, + .d_poll = aac_poll, }; DECLARE_DUMMY_MODULE(aac); @@ -298,8 +287,8 @@ aac_attach(struct aac_softc *sc) * Make the control device. */ unit = device_get_unit(sc->aac_dev); - cdevsw_add(&aac_cdevsw, -1, unit); - sc->aac_dev_t = make_dev(&aac_cdevsw, unit, UID_ROOT, GID_WHEEL, 0644, + dev_ops_add(&aac_ops, -1, unit); + sc->aac_dev_t = make_dev(&aac_ops, unit, UID_ROOT, GID_WHEEL, 0644, "aac%d", unit); #if defined(__FreeBSD__) && __FreeBSD_version > 500005 (void)make_dev_alias(sc->aac_dev_t, "afa%d", unit); @@ -477,7 +466,7 @@ aac_free(struct aac_softc *sc) bus_release_resource(sc->aac_dev, SYS_RES_MEMORY, sc->aac_regs_rid, sc->aac_regs_resource); } - cdevsw_remove(&aac_cdevsw, -1, device_get_unit(sc->aac_dev)); + dev_ops_remove(&aac_ops, -1, device_get_unit(sc->aac_dev)); } /* @@ -2350,8 +2339,9 @@ aac_describe_code(struct aac_code_lookup *table, u_int32_t code) */ static int -aac_open(dev_t dev, int flags, int fmt, d_thread_t *td) +aac_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct aac_softc *sc; debug_called(2); @@ -2368,8 +2358,9 @@ aac_open(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -aac_close(dev_t dev, int flags, int fmt, d_thread_t *td) +aac_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct aac_softc *sc; debug_called(2); @@ -2383,15 +2374,17 @@ aac_close(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -aac_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, d_thread_t *td) +aac_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t arg = ap->a_data; struct aac_softc *sc = dev->si_drv1; int error = 0; int i; debug_called(2); - if (cmd == AACIO_STATS) { + if (ap->a_cmd == AACIO_STATS) { union aac_statrequest *as = (union aac_statrequest *)arg; switch (as->as_item) { @@ -2412,7 +2405,7 @@ aac_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, d_thread_t *td) arg = *(caddr_t *)arg; - switch (cmd) { + switch (ap->a_cmd) { /* AACIO_STATS already handled above */ case FSACTL_SENDFIB: debug(1, "FSACTL_SENDFIB"); @@ -2464,7 +2457,7 @@ aac_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, d_thread_t *td) error = 0; break; default: - debug(1, "unsupported cmd 0x%lx\n", cmd); + debug(1, "unsupported cmd 0x%lx\n", ap->a_cmd); error = EINVAL; break; } @@ -2472,8 +2465,9 @@ aac_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, d_thread_t *td) } static int -aac_poll(dev_t dev, int poll_events, d_thread_t *td) +aac_poll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct aac_softc *sc; int revents; @@ -2481,18 +2475,18 @@ aac_poll(dev_t dev, int poll_events, d_thread_t *td) revents = 0; AAC_LOCK_ACQUIRE(&sc->aac_aifq_lock); - if ((poll_events & (POLLRDNORM | POLLIN)) != 0) { + if ((ap->a_events & (POLLRDNORM | POLLIN)) != 0) { if (sc->aac_aifq_tail != sc->aac_aifq_head) - revents |= poll_events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); } AAC_LOCK_RELEASE(&sc->aac_aifq_lock); if (revents == 0) { - if (poll_events & (POLLIN | POLLRDNORM)) - selrecord(td, &sc->rcv_select); + if (ap->a_events & (POLLIN | POLLRDNORM)) + selrecord(curthread, &sc->rcv_select); } - - return (revents); + ap->a_events = revents; + return (0); } /* diff --git a/sys/dev/raid/aac/aac_disk.c b/sys/dev/raid/aac/aac_disk.c index 40154cc5d2..1127ec61a0 100644 --- a/sys/dev/raid/aac/aac_disk.c +++ b/sys/dev/raid/aac/aac_disk.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/aac/aac_disk.c,v 1.3.2.8 2003/01/11 18:39:39 scottl Exp $ - * $DragonFly: src/sys/dev/raid/aac/aac_disk.c,v 1.12 2006/03/24 18:35:32 dillon Exp $ + * $DragonFly: src/sys/dev/raid/aac/aac_disk.c,v 1.13 2006/07/28 02:17:37 dillon Exp $ */ #include "opt_aac.h" @@ -71,23 +71,14 @@ static d_dump_t aac_disk_dump; #define AAC_DISK_CDEV_MAJOR 151 -static struct cdevsw aac_disk_cdevsw = { - /* name */ "aacd", - /* maj */ AAC_DISK_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ aac_disk_open, - /* close */ aac_disk_close, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ aac_disk_strategy, - /* dump */ aac_disk_dump, - /* psize */ nopsize +static struct dev_ops aac_disk_ops = { + { "aacd", AAC_DISK_CDEV_MAJOR, D_DISK }, + .d_open = aac_disk_open, + .d_close = aac_disk_close, + .d_read = physread, + .d_write = physwrite, + .d_strategy = aac_disk_strategy, + .d_dump = aac_disk_dump, }; devclass_t aac_disk_devclass; @@ -124,8 +115,9 @@ SYSCTL_UINT(_hw_aac, OID_AUTO, iosize_max, CTLFLAG_RD, &aac_iosize_max, 0, * basic device geometry paramters. */ static int -aac_disk_open(dev_t dev, int flags, int fmt, d_thread_t *td) +aac_disk_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct aac_disk *sc; struct disklabel *label; @@ -164,8 +156,9 @@ aac_disk_open(dev_t dev, int flags, int fmt, d_thread_t *td) * Handle last close of the disk device. */ static int -aac_disk_close(dev_t dev, int flags, int fmt, d_thread_t *td) +aac_disk_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct aac_disk *sc; debug_called(0); @@ -182,9 +175,11 @@ aac_disk_close(dev_t dev, int flags, int fmt, d_thread_t *td) /* * Handle an I/O request. */ -static void -aac_disk_strategy(dev_t dev, struct bio *bio) +static int +aac_disk_strategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct aac_disk *sc; @@ -197,14 +192,14 @@ aac_disk_strategy(dev_t dev, struct bio *bio) bp->b_flags |= B_ERROR; bp->b_error = EINVAL; biodone(bio); - return; + return(0); } /* do-nothing operation? */ if (bp->b_bcount == 0) { bp->b_resid = bp->b_bcount; biodone(bio); - return; + return(0); } /* perform accounting */ @@ -212,6 +207,7 @@ aac_disk_strategy(dev_t dev, struct bio *bio) /* pass the bio to the controller - it can work out who we are */ aac_submit_bio(sc, bio); + return(0); } /* @@ -221,8 +217,9 @@ aac_disk_strategy(dev_t dev, struct bio *bio) * for the controller to complete the requests. */ static int -aac_disk_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) +aac_disk_dump(struct dev_dump_args *ap) { + dev_t dev = ap->a_head.a_dev; struct aac_disk *ad; struct aac_softc *sc; vm_offset_t addr; @@ -239,13 +236,13 @@ aac_disk_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) sc= ad->ad_controller; - blkcnt = howmany(PAGE_SIZE, secsize); + blkcnt = howmany(PAGE_SIZE, ap->a_secsize); - while (count > 0) { + while (ap->a_count > 0) { caddr_t va = NULL; - if ((count / blkcnt) < dumppages) - dumppages = count / blkcnt; + if ((ap->a_count / blkcnt) < dumppages) + dumppages = ap->a_count / blkcnt; for (i = 0; i < dumppages; ++i) { vm_offset_t a = addr + (i * PAGE_SIZE); @@ -261,18 +258,18 @@ retry: * Queue the block to the controller. If the queue is full, * EBUSY will be returned. */ - error = aac_dump_enqueue(ad, blkno, va, dumppages); + error = aac_dump_enqueue(ad, ap->a_blkno, va, dumppages); if (error && (error != EBUSY)) return (error); if (!error) { - if (dumpstatus(addr, (off_t)(count * DEV_BSIZE)) < 0) + if (dumpstatus(addr, (off_t)(ap->a_count * DEV_BSIZE)) < 0) return (EINTR); - blkno += blkcnt * dumppages; - count -= blkcnt * dumppages; + ap->a_blkno += blkcnt * dumppages; + ap->a_count -= blkcnt * dumppages; addr += PAGE_SIZE * dumppages; - if (count > 0) + if (ap->a_count > 0) continue; } @@ -369,7 +366,7 @@ aac_disk_attach(device_t dev) /* attach a generic disk device to ourselves */ sc->ad_dev_t = disk_create(device_get_unit(dev), &sc->ad_disk, 0, - &aac_disk_cdevsw); + &aac_disk_ops); sc->ad_dev_t->si_drv1 = sc; sc->ad_dev_t->si_iosize_max = aac_iosize_max; diff --git a/sys/dev/raid/amr/amr.c b/sys/dev/raid/amr/amr.c index 41f6841097..23d844739b 100644 --- a/sys/dev/raid/amr/amr.c +++ b/sys/dev/raid/amr/amr.c @@ -53,7 +53,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/amr/amr.c,v 1.7.2.13 2003/01/15 13:41:18 emoore Exp $ - * $DragonFly: src/sys/dev/raid/amr/amr.c,v 1.18 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/raid/amr/amr.c,v 1.19 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -93,23 +93,11 @@ static d_open_t amr_open; static d_close_t amr_close; static d_ioctl_t amr_ioctl; -static struct cdevsw amr_cdevsw = { - /* name */ "amr", - /* maj */ AMR_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ amr_open, - /* close */ amr_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ amr_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops amr_ops = { + { "amr", AMR_CDEV_MAJOR, 0 }, + .d_open = amr_open, + .d_close = amr_close, + .d_ioctl = amr_ioctl }; /* @@ -253,8 +241,8 @@ amr_attach(struct amr_softc *sc) /* * Create the control device. */ - cdevsw_add(&amr_cdevsw, -1, device_get_unit(sc->amr_dev)); - sc->amr_dev_t = make_dev(&amr_cdevsw, device_get_unit(sc->amr_dev), + dev_ops_add(&amr_ops, -1, device_get_unit(sc->amr_dev)); + sc->amr_dev_t = make_dev(&amr_ops, device_get_unit(sc->amr_dev), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "amr%d", device_get_unit(sc->amr_dev)); sc->amr_dev_t->si_drv1 = sc; @@ -365,7 +353,7 @@ amr_free(struct amr_softc *sc) /* destroy control device */ if( sc->amr_dev_t != (dev_t)NULL) destroy_dev(sc->amr_dev_t); - cdevsw_remove(&amr_cdevsw, -1, device_get_unit(sc->amr_dev)); + dev_ops_remove(&amr_ops, -1, device_get_unit(sc->amr_dev)); } /******************************************************************************* @@ -386,8 +374,9 @@ amr_submit_bio(struct amr_softc *sc, struct bio *bio) * Accept an open operation on the control device. */ static int -amr_open(dev_t dev, int flags, int fmt, d_thread_t *td) +amr_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct amr_softc *sc = devclass_get_softc(devclass_find("amr"), unit); @@ -401,8 +390,9 @@ amr_open(dev_t dev, int flags, int fmt, d_thread_t *td) * Accept the last close on the control device. */ static int -amr_close(dev_t dev, int flags, int fmt, d_thread_t *td) +amr_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct amr_softc *sc = devclass_get_softc(devclass_find("amr"), unit); @@ -416,14 +406,15 @@ amr_close(dev_t dev, int flags, int fmt, d_thread_t *td) * Handle controller-specific control operations. */ static int -amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) +amr_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct amr_softc *sc = (struct amr_softc *)dev->si_drv1; - int *arg = (int *)addr; - struct amr_user_ioctl *au = (struct amr_user_ioctl *)addr; + int *arg = (int *)ap->a_data; + struct amr_user_ioctl *au = (struct amr_user_ioctl *)ap->a_data; struct amr_command *ac; struct amr_mailbox_ioctl *mbi; - struct amr_passthrough *ap; + struct amr_passthrough *apt; void *dp; int error; @@ -431,9 +422,9 @@ amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) error = 0; dp = NULL; - ap = NULL; + apt = NULL; ac = NULL; - switch(cmd) { + switch(ap->a_cmd) { case AMR_IO_VERSION: debug(1, "AMR_IO_VERSION"); @@ -460,29 +451,29 @@ amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) /* handle SCSI passthrough command */ if (au->au_cmd[0] == AMR_CMD_PASS) { - if ((ap = malloc(sizeof(*ap), M_DEVBUF, M_WAITOK | M_ZERO)) == NULL) { + if ((apt = malloc(sizeof(*apt), M_DEVBUF, M_WAITOK | M_ZERO)) == NULL) { error = ENOMEM; break; } /* copy cdb */ - ap->ap_cdb_length = au->au_cmd[2]; - bcopy(&au->au_cmd[3], &ap->ap_cdb[0], ap->ap_cdb_length); + apt->ap_cdb_length = au->au_cmd[2]; + bcopy(&au->au_cmd[3], &apt->ap_cdb[0], apt->ap_cdb_length); /* build passthrough */ - ap->ap_timeout = au->au_cmd[ap->ap_cdb_length + 3] & 0x07; - ap->ap_ars = (au->au_cmd[ap->ap_cdb_length + 3] & 0x08) ? 1 : 0; - ap->ap_islogical = (au->au_cmd[ap->ap_cdb_length + 3] & 0x80) ? 1 : 0; - ap->ap_logical_drive_no = au->au_cmd[ap->ap_cdb_length + 4]; - ap->ap_channel = au->au_cmd[ap->ap_cdb_length + 5]; - ap->ap_scsi_id = au->au_cmd[ap->ap_cdb_length + 6]; - ap->ap_request_sense_length = 14; - ap->ap_data_transfer_length = au->au_length; + apt->ap_timeout = au->au_cmd[apt->ap_cdb_length + 3] & 0x07; + apt->ap_ars = (au->au_cmd[apt->ap_cdb_length + 3] & 0x08) ? 1 : 0; + apt->ap_islogical = (au->au_cmd[apt->ap_cdb_length + 3] & 0x80) ? 1 : 0; + apt->ap_logical_drive_no = au->au_cmd[apt->ap_cdb_length + 4]; + apt->ap_channel = au->au_cmd[apt->ap_cdb_length + 5]; + apt->ap_scsi_id = au->au_cmd[apt->ap_cdb_length + 6]; + apt->ap_request_sense_length = 14; + apt->ap_data_transfer_length = au->au_length; /* XXX what about the request-sense area? does the caller want it? */ /* build command */ - ac->ac_data = ap; - ac->ac_length = sizeof(*ap); + ac->ac_data = apt; + ac->ac_length = sizeof(*apt); ac->ac_flags |= AMR_CMD_DATAOUT; ac->ac_ccb_data = dp; ac->ac_ccb_length = au->au_length; @@ -534,8 +525,8 @@ amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) if (dp != NULL) free(dp, M_DEVBUF); - if (ap != NULL) - free(ap, M_DEVBUF); + if (apt != NULL) + free(apt, M_DEVBUF); if (ac != NULL) amr_releasecmd(ac); return(error); diff --git a/sys/dev/raid/amr/amr_disk.c b/sys/dev/raid/amr/amr_disk.c index 1e99d7ef9a..24f135ca7a 100644 --- a/sys/dev/raid/amr/amr_disk.c +++ b/sys/dev/raid/amr/amr_disk.c @@ -54,7 +54,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/amr/amr_disk.c,v 1.5.2.5 2002/12/20 15:12:04 emoore Exp $ - * $DragonFly: src/sys/dev/raid/amr/amr_disk.c,v 1.10 2006/02/17 19:18:05 dillon Exp $ + * $DragonFly: src/sys/dev/raid/amr/amr_disk.c,v 1.11 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -96,23 +96,15 @@ static d_dump_t amrd_dump; #define AMRD_CDEV_MAJOR 133 -static struct cdevsw amrd_cdevsw = { - /* name */ "amrd", - /* maj */ AMRD_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ amrd_open, - /* close */ amrd_close, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ amrd_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ amrd_strategy, - /* dump */ amrd_dump, - /* psize */ nopsize +static struct dev_ops amrd_ops = { + { "amrd", AMRD_CDEV_MAJOR, D_DISK }, + .d_open = amrd_open, + .d_close = amrd_close, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = amrd_ioctl, + .d_strategy = amrd_strategy, + .d_dump = amrd_dump }; static devclass_t amrd_devclass; @@ -133,8 +125,9 @@ static driver_t amrd_driver = { DRIVER_MODULE(amrd, amr, amrd_driver, amrd_devclass, 0, 0); static int -amrd_open(dev_t dev, int flags, int fmt, d_thread_t *td) +amrd_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct amrd_softc *sc = (struct amrd_softc *)dev->si_drv1; #if defined(__DragonFly__) || __FreeBSD_version < 500000 /* old buf style */ struct disklabel *label; @@ -171,8 +164,9 @@ amrd_open(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -amrd_close(dev_t dev, int flags, int fmt, d_thread_t *td) +amrd_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct amrd_softc *sc = (struct amrd_softc *)dev->si_drv1; debug_called(1); @@ -184,9 +178,8 @@ amrd_close(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -amrd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) +amrd_ioctl(struct dev_ioctl_args *ap) { - return (ENOTTY); } @@ -195,9 +188,9 @@ amrd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) * System crashdump support */ int -amrd_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) +amrd_dump(struct dev_dump_args *ap) { - + dev_t dev = ap->a_head.a_dev; struct amrd_softc *amrd_sc = (struct amrd_softc *)dev->si_drv1; struct amr_softc *amr_sc; vm_paddr_t addr = 0; @@ -214,15 +207,15 @@ amrd_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) if (!amrd_sc || !amr_sc) return(ENXIO); - blkcnt = howmany(PAGE_SIZE, secsize); + blkcnt = howmany(PAGE_SIZE, ap->a_secsize); driveno = amrd_sc->amrd_drive - amr_sc->amr_drive; - while (count > 0) { + while (ap->a_count > 0) { caddr_t va = NULL; - if ((count / blkcnt) < dumppages) - dumppages = count / blkcnt; + if ((ap->a_count / blkcnt) < dumppages) + dumppages = ap->a_count / blkcnt; for (i = 0; i < dumppages; ++i) { vm_paddr_t a = addr + (i * PAGE_SIZE); @@ -232,15 +225,15 @@ amrd_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) va = pmap_kenter_temporary(trunc_page(0), i); } - if ((error = amr_dump_blocks(amr_sc, driveno, blkno, (void *)va, + if ((error = amr_dump_blocks(amr_sc, driveno, ap->a_blkno, (void *)va, (PAGE_SIZE * dumppages) / AMR_BLKSIZE)) != 0) return(error); - if (dumpstatus(addr, (off_t)count * DEV_BSIZE) < 0) + if (dumpstatus(addr, (off_t)ap->a_count * DEV_BSIZE) < 0) return(EINTR); - blkno += blkcnt * dumppages; - count -= blkcnt * dumppages; + ap->a_blkno += blkcnt * dumppages; + ap->a_count -= blkcnt * dumppages; addr += PAGE_SIZE * dumppages; } return (0); @@ -251,9 +244,11 @@ amrd_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) * to complete. Multi-page transfers are supported. All I/O requests must * be a multiple of a sector in length. */ -static void -amrd_strategy(dev_t dev, struct bio *bio) +static int +amrd_strategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct amrd_softc *sc = (struct amrd_softc *)dev->si_drv1; @@ -266,7 +261,7 @@ amrd_strategy(dev_t dev, struct bio *bio) devstat_start_transaction(&sc->amrd_stats); amr_submit_bio(sc->amrd_controller, bio); - return; + return(0); bad: bp->b_flags |= B_ERROR; @@ -276,6 +271,7 @@ amrd_strategy(dev_t dev, struct bio *bio) */ bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } void @@ -328,7 +324,7 @@ amrd_attach(device_t dev) DEVSTAT_TYPE_STORARRAY | DEVSTAT_TYPE_IF_OTHER, DEVSTAT_PRIORITY_ARRAY); - sc->amrd_dev_t = disk_create(sc->amrd_unit, &sc->amrd_disk, 0, &amrd_cdevsw); + sc->amrd_dev_t = disk_create(sc->amrd_unit, &sc->amrd_disk, 0, &amrd_ops); sc->amrd_dev_t->si_drv1 = sc; /* set maximum I/O size to match the maximum s/g size */ diff --git a/sys/dev/raid/asr/asr.c b/sys/dev/raid/asr/asr.c index 8fc067a451..8941e7c404 100644 --- a/sys/dev/raid/asr/asr.c +++ b/sys/dev/raid/asr/asr.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/dev/asr/asr.c,v 1.3.2.2 2001/08/23 05:21:29 scottl Exp $ */ -/* $DragonFly: src/sys/dev/raid/asr/asr.c,v 1.22 2005/10/12 17:35:54 dillon Exp $ */ +/* $DragonFly: src/sys/dev/raid/asr/asr.c,v 1.23 2006/07/28 02:17:37 dillon Exp $ */ /* * Copyright (c) 1996-2000 Distributed Processing Technology Corporation * Copyright (c) 2000-2001 Adaptec Corporation @@ -397,39 +397,18 @@ STATIC ATTACH_RET domino_attach (ATTACH_ARGS); STATIC PROBE_RET mode0_probe (PROBE_ARGS); STATIC ATTACH_RET mode0_attach (ATTACH_ARGS); -STATIC Asr_softc_t * ASR_get_sc ( - IN dev_t dev); -STATIC int asr_ioctl ( - IN dev_t dev, - IN u_long cmd, - INOUT caddr_t data, - int flag, - d_thread_t *td); -STATIC int asr_open ( - IN dev_t dev, - int32_t flags, - int32_t ifmt, - IN d_thread_t *td); -STATIC int asr_close ( - dev_t dev, - int flags, - int ifmt, - d_thread_t *td); -STATIC int asr_intr ( - IN Asr_softc_t * sc); -STATIC void asr_timeout ( - INOUT void * arg); -STATIC int ASR_init ( - IN Asr_softc_t * sc); -STATIC INLINE int ASR_acquireLct ( - INOUT Asr_softc_t * sc); -STATIC INLINE int ASR_acquireHrt ( - INOUT Asr_softc_t * sc); -STATIC void asr_action ( - IN struct cam_sim * sim, - IN union ccb * ccb); -STATIC void asr_poll ( - IN struct cam_sim * sim); +STATIC Asr_softc_t * ASR_get_sc (dev_t dev); +STATIC d_ioctl_t asr_ioctl; +STATIC d_open_t asr_open; +STATIC d_close_t asr_close; +STATIC int asr_intr (IN Asr_softc_t *sc); +STATIC void asr_timeout (INOUT void *arg); +STATIC int ASR_init (IN Asr_softc_t *sc); +STATIC INLINE int ASR_acquireLct (INOUT Asr_softc_t *sc); +STATIC INLINE int ASR_acquireHrt (INOUT Asr_softc_t *sc); +STATIC void asr_action (IN struct cam_sim *sim, + IN union ccb *ccb); +STATIC void asr_poll (IN struct cam_sim * sim); /* * Here is the auto-probe structure used to nest our tests appropriately @@ -490,27 +469,15 @@ DRIVER_MODULE(mode0, pci, mode0_driver, mode0_devclass, 0, 0); * only ioctl is used. the sd driver provides all other access. */ #define CDEV_MAJOR 154 /* prefered default character major */ -STATIC struct cdevsw asr_cdevsw = { - "asr", /* name */ - CDEV_MAJOR, /* maj */ - 0, /* flags */ - NULL, /* port */ - 0, /* auto */ - - asr_open, /* open */ - asr_close, /* close */ - noread, /* read */ - nowrite, /* write */ - asr_ioctl, /* ioctl */ - nopoll, /* poll */ - nommap, /* mmap */ - nostrategy, /* strategy */ - nodump, /* dump */ - nopsize /* psize */ +STATIC struct dev_ops asr_ops = { + { "asr", CDEV_MAJOR, 0 }, + .d_open = asr_open, + .d_close = asr_close, + .d_ioctl = asr_ioctl, }; /* - * Initialize the dynamic cdevsw hooks. + * Initialize the dynamic dev_ops hooks. */ STATIC void asr_drvinit (void * unused) @@ -525,27 +492,27 @@ asr_drvinit (void * unused) * Find a free spot (the report during driver load used by * osd layer in engine to generate the controlling nodes). * - * XXX this is garbage code, store a unit number in asr_cdevsw + * XXX this is garbage code, store a unit number in asr_ops * and iterate through that instead? */ - while (asr_cdevsw.d_maj < NUMCDEVSW && - cdevsw_get(asr_cdevsw.d_maj, -1) != NULL + while (asr_ops.head.maj < NUMCDEVSW && + dev_ops_get(asr_ops.head.maj, -1) != NULL ) { - ++asr_cdevsw.d_maj; + ++asr_ops.head.maj; } - if (asr_cdevsw.d_maj >= NUMCDEVSW) { - asr_cdevsw.d_maj = 0; - while (asr_cdevsw.d_maj < CDEV_MAJOR && - cdevsw_get(asr_cdevsw.d_maj, -1) != NULL + if (asr_ops.head.maj >= NUMCDEVSW) { + asr_ops.head.maj = 0; + while (asr_ops.head.maj < CDEV_MAJOR && + dev_ops_get(asr_ops.head.maj, -1) != NULL ) { - ++asr_cdevsw.d_maj; + ++asr_ops.head.maj; } } /* * Come to papa */ - cdevsw_add(&asr_cdevsw, 0, 0); + dev_ops_add(&asr_ops, 0, 0); } /* asr_drvinit */ /* Must initialize before CAM layer picks up our HBA driver */ @@ -2558,7 +2525,7 @@ asr_attach (ATTACH_ARGS) * engine (dptioctl.h) to pick up. */ bcopy (osrelease, &ASR_sig.dsDescription[16], 5); - printf ("asr%d: major=%d\n", unit, asr_cdevsw.d_maj); + printf ("asr%d: major=%d\n", unit, asr_ops.head.maj); } /* * Initialize the software structure @@ -2851,7 +2818,7 @@ asr_attach (ATTACH_ARGS) /* * Generate the device node information */ - make_dev(&asr_cdevsw, unit, 0, 0, S_IRWXU, "rasr%d", unit); + make_dev(&asr_ops, unit, 0, 0, S_IRWXU, "rasr%d", unit); ATTACH_RETURN(0); } /* asr_attach */ @@ -3304,24 +3271,18 @@ STATIC u_int8_t ASR_ctlr_held; #endif STATIC int -asr_open( - IN dev_t dev, - int32_t flags, - int32_t ifmt, - IN d_thread_t *td) +asr_open(struct dev_open_args *ap) { - OUT int error; - UNREFERENCED_PARAMETER(flags); - UNREFERENCED_PARAMETER(ifmt); + dev_t dev = ap->a_head.a_dev; + OUT int error; if (ASR_get_sc (dev) == (Asr_softc_t *)NULL) { return (ENODEV); } - KKASSERT(td->td_proc); crit_enter(); if (ASR_ctlr_held) { error = EBUSY; - } else if ((error = suser_cred(td->td_proc->p_ucred, 0)) == 0) { + } else if ((error = suser_cred(ap->a_cred, 0)) == 0) { ++ASR_ctlr_held; } crit_exit(); @@ -3329,17 +3290,8 @@ asr_open( } /* asr_open */ STATIC int -asr_close( - dev_t dev, - int flags, - int ifmt, - d_thread_t *td) +asr_close(struct dev_close_args *ap) { - UNREFERENCED_PARAMETER(dev); - UNREFERENCED_PARAMETER(flags); - UNREFERENCED_PARAMETER(ifmt); - UNREFERENCED_PARAMETER(td); - ASR_ctlr_held = 0; return (0); } /* asr_close */ @@ -3826,27 +3778,22 @@ ASR_queue_i( /*----------------------------------------------------------------------*/ STATIC int -asr_ioctl( - IN dev_t dev, - IN u_long cmd, - INOUT caddr_t data, - int flag, - struct thread *td) +asr_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; int i, j; OUT int error = 0; Asr_softc_t * sc = ASR_get_sc (dev); - UNREFERENCED_PARAMETER(flag); - UNREFERENCED_PARAMETER(td); if (sc != (Asr_softc_t *)NULL) - switch(cmd) { + switch(ap->a_cmd) { case DPT_SIGNATURE: # if (dsDescription_size != 50) case DPT_SIGNATURE + ((50 - dsDescription_size) << 16): # endif - if (cmd & 0xFFFF0000) { + if (ap->a_cmd & 0xFFFF0000) { (void)bcopy ((caddr_t)(&ASR_sig), data, sizeof(dpt_sig_S)); return (0); @@ -3889,7 +3836,7 @@ asr_ioctl( #define FLG_OSD_I2O 0x0004 CtlrInfo.hbaFlags = FLG_OSD_PCI_VALID | FLG_OSD_DMA | FLG_OSD_I2O; CtlrInfo.Interrupt = sc->ha_irq; - if (cmd & 0xFFFF0000) { + if (ap->a_cmd & 0xFFFF0000) { bcopy (&CtlrInfo, data, sizeof(CtlrInfo)); } else { error = copyout (&CtlrInfo, *(caddr_t *)data, sizeof(CtlrInfo)); @@ -4052,7 +3999,7 @@ asr_ioctl( } # endif /* Copy Out The Info Structure To The User */ - if (cmd & 0xFFFF0000) { + if (ap->a_cmd & 0xFFFF0000) { bcopy (&Info, data, sizeof(Info)); } else { error = copyout (&Info, *(caddr_t *)data, sizeof(Info)); @@ -4065,7 +4012,7 @@ asr_ioctl( if (i == -1) { i = 0; } - if (cmd & 0xFFFF0000) { + if (ap->a_cmd & 0xFFFF0000) { bcopy ((caddr_t)(&i), data, sizeof(i)); } else { error = copyout (&i, *(caddr_t *)data, sizeof(i)); diff --git a/sys/dev/raid/ciss/ciss.c b/sys/dev/raid/ciss/ciss.c index 7eaf2b0f19..c9aa3a0be7 100644 --- a/sys/dev/raid/ciss/ciss.c +++ b/sys/dev/raid/ciss/ciss.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ciss/ciss.c,v 1.2.2.6 2003/02/18 22:27:41 ps Exp $ - * $DragonFly: src/sys/dev/raid/ciss/ciss.c,v 1.16 2005/10/12 17:35:54 dillon Exp $ + * $DragonFly: src/sys/dev/raid/ciss/ciss.c,v 1.17 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -71,6 +71,7 @@ #include #include +#include #include #include #include @@ -218,15 +219,11 @@ static d_ioctl_t ciss_ioctl; #define CISS_CDEV_MAJOR 166 -static struct cdevsw ciss_cdevsw = { - /* name */ "ciss", - /* cmaj */ CISS_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - ciss_open, ciss_close, noread, nowrite, ciss_ioctl, - nopoll, nommap, nostrategy, - nodump, nopsize, nokqfilter +static struct dev_ops ciss_ops = { + { "ciss", CISS_CDEV_MAJOR, 0 }, + .d_open = ciss_open, + .d_close = ciss_close, + .d_ioctl = ciss_ioctl }; /************************************************************************ @@ -408,8 +405,8 @@ ciss_attach(device_t dev) /* * Create the control device. */ - cdevsw_add(&ciss_cdevsw, -1, device_get_unit(sc->ciss_dev)); - sc->ciss_dev_t = make_dev(&ciss_cdevsw, device_get_unit(sc->ciss_dev), + dev_ops_add(&ciss_ops, -1, device_get_unit(sc->ciss_dev)); + sc->ciss_dev_t = make_dev(&ciss_ops, device_get_unit(sc->ciss_dev), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "ciss%d", device_get_unit(sc->ciss_dev)); sc->ciss_dev_t->si_drv1 = sc; @@ -3369,8 +3366,9 @@ ciss_name_command_status(int status) * Handle an open on the control device. */ static int -ciss_open(dev_t dev, int flags, int fmt, d_thread_t *p) +ciss_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ciss_softc *sc; debug_called(1); @@ -3387,8 +3385,9 @@ ciss_open(dev_t dev, int flags, int fmt, d_thread_t *p) * Handle the last close on the control device. */ static int -ciss_close(dev_t dev, int flags, int fmt, d_thread_t *p) +ciss_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ciss_softc *sc; debug_called(1); @@ -3406,8 +3405,9 @@ ciss_close(dev_t dev, int flags, int fmt, d_thread_t *p) * simplify the porting of Compaq's userland tools. */ static int -ciss_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *p) +ciss_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ciss_softc *sc; int error; @@ -3416,10 +3416,10 @@ ciss_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *p) sc = (struct ciss_softc *)dev->si_drv1; error = 0; - switch(cmd) { + switch(ap->a_cmd) { case CCISS_GETPCIINFO: { - cciss_pci_info_struct *pis = (cciss_pci_info_struct *)addr; + cciss_pci_info_struct *pis = (cciss_pci_info_struct *)ap->a_data; pis->bus = pci_get_bus(sc->ciss_dev); pis->dev_fn = pci_get_slot(sc->ciss_dev); @@ -3430,7 +3430,7 @@ ciss_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *p) case CCISS_GETINTINFO: { - cciss_coalint_struct *cis = (cciss_coalint_struct *)addr; + cciss_coalint_struct *cis = (cciss_coalint_struct *)ap->a_data; cis->delay = sc->ciss_cfg->interrupt_coalesce_delay; cis->count = sc->ciss_cfg->interrupt_coalesce_count; @@ -3440,7 +3440,7 @@ ciss_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *p) case CCISS_SETINTINFO: { - cciss_coalint_struct *cis = (cciss_coalint_struct *)addr; + cciss_coalint_struct *cis = (cciss_coalint_struct *)ap->a_data; if ((cis->delay == 0) && (cis->count == 0)) { error = EINVAL; @@ -3462,32 +3462,32 @@ ciss_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *p) } case CCISS_GETNODENAME: - bcopy(sc->ciss_cfg->server_name, (NodeName_type *)addr, + bcopy(sc->ciss_cfg->server_name, (NodeName_type *)ap->a_data, sizeof(NodeName_type)); break; case CCISS_SETNODENAME: - bcopy((NodeName_type *)addr, sc->ciss_cfg->server_name, + bcopy((NodeName_type *)ap->a_data, sc->ciss_cfg->server_name, sizeof(NodeName_type)); if (ciss_update_config(sc)) error = EIO; break; case CCISS_GETHEARTBEAT: - *(Heartbeat_type *)addr = sc->ciss_cfg->heartbeat; + *(Heartbeat_type *)ap->a_data = sc->ciss_cfg->heartbeat; break; case CCISS_GETBUSTYPES: - *(BusTypes_type *)addr = sc->ciss_cfg->bus_types; + *(BusTypes_type *)ap->a_data = sc->ciss_cfg->bus_types; break; case CCISS_GETFIRMVER: - bcopy(sc->ciss_id->running_firmware_revision, (FirmwareVer_type *)addr, + bcopy(sc->ciss_id->running_firmware_revision, (FirmwareVer_type *)ap->a_data, sizeof(FirmwareVer_type)); break; case CCISS_GETDRIVERVER: - *(DriverVer_type *)addr = CISS_DRIVER_VERSION; + *(DriverVer_type *)ap->a_data = CISS_DRIVER_VERSION; break; case CCISS_REVALIDVOLS: @@ -3501,11 +3501,11 @@ ciss_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *p) break; case CCISS_PASSTHRU: - error = ciss_user_command(sc, (IOCTL_Command_struct *)addr); + error = ciss_user_command(sc, (IOCTL_Command_struct *)ap->a_data); break; default: - debug(0, "unknown ioctl 0x%lx", cmd); + debug(0, "unknown ioctl 0x%lx", ap->a_cmd); debug(1, "CCISS_GETPCIINFO: 0x%lx", CCISS_GETPCIINFO); debug(1, "CCISS_GETINTINFO: 0x%lx", CCISS_GETINTINFO); diff --git a/sys/dev/raid/ida/ida_disk.c b/sys/dev/raid/ida/ida_disk.c index 54c2c39008..3ec9db09e1 100644 --- a/sys/dev/raid/ida/ida_disk.c +++ b/sys/dev/raid/ida/ida_disk.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ida/ida_disk.c,v 1.12.2.6 2001/11/27 20:21:02 ps Exp $ - * $DragonFly: src/sys/dev/raid/ida/ida_disk.c,v 1.11 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/raid/ida/ida_disk.c,v 1.12 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -72,23 +72,14 @@ static d_dump_t idad_dump; #define IDAD_BDEV_MAJOR 29 #define IDAD_CDEV_MAJOR 109 -static struct cdevsw id_cdevsw = { - /* name */ "idad", - /* maj */ IDAD_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ idad_open, - /* close */ idad_close, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ idad_strategy, - /* dump */ idad_dump, - /* psize */ nopsize +static struct dev_ops id_ops = { + { "idad", IDAD_CDEV_MAJOR, D_DISK }, + .d_open = idad_open, + .d_close = idad_close, + .d_read = physread, + .d_write = physwrite, + .d_strategy = idad_strategy, + .d_dump = idad_dump, }; static devclass_t idad_devclass; @@ -116,8 +107,9 @@ idad_getsoftc(dev_t dev) } static int -idad_open(dev_t dev, int flags, int fmt, d_thread_t *td) +idad_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct idad_softc *drv; struct disklabel *label; @@ -139,8 +131,9 @@ idad_open(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -idad_close(dev_t dev, int flags, int fmt, d_thread_t *td) +idad_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct idad_softc *drv; drv = idad_getsoftc(dev); @@ -155,9 +148,11 @@ idad_close(dev_t dev, int flags, int fmt, d_thread_t *td) * to complete. Multi-page transfers are supported. All I/O requests must * be a multiple of a sector in length. */ -static void -idad_strategy(dev_t dev, struct bio *bio) +static int +idad_strategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct idad_softc *drv; @@ -186,7 +181,7 @@ idad_strategy(dev_t dev, struct bio *bio) devstat_start_transaction(&drv->stats); ida_submit_buf(drv->controller, bio); crit_exit(); - return; + return(0); bad: bp->b_flags |= B_ERROR; @@ -197,11 +192,13 @@ done: */ bp->b_resid = bp->b_bcount; biodone(bio); + return(0); } static int -idad_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) +idad_dump(struct dev_dump_args *ap) { + dev_t dev = ap->a_head.a_dev; struct idad_softc *drv; long blkcnt; int i, error, dumppages; @@ -213,12 +210,12 @@ idad_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) return (ENXIO); addr = 0; - blkcnt = howmany(PAGE_SIZE, secsize); + blkcnt = howmany(PAGE_SIZE, ap->a_secsize); - while (count > 0) { + while (ap->a_count > 0) { va = NULL; - dumppages = imin(count / blkcnt, MAXDUMPPGS); + dumppages = imin(ap->a_count / blkcnt, MAXDUMPPGS); for (i = 0; i < dumppages; i++) { a = addr + (i * PAGE_SIZE); @@ -229,15 +226,15 @@ idad_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) } error = ida_command(drv->controller, CMD_WRITE, va, - PAGE_SIZE * dumppages, drv->drive, blkno, DMA_DATA_OUT); + PAGE_SIZE * dumppages, drv->drive, ap->a_blkno, DMA_DATA_OUT); if (error) return (error); - if (dumpstatus(addr, (off_t)count * DEV_BSIZE) < 0) + if (dumpstatus(addr, (off_t)ap->a_count * DEV_BSIZE) < 0) return (EINTR); - blkno += blkcnt * dumppages; - count -= blkcnt * dumppages; + ap->a_blkno += blkcnt * dumppages; + ap->a_count -= blkcnt * dumppages; addr += PAGE_SIZE * dumppages; } return (0); @@ -307,7 +304,7 @@ idad_attach(device_t dev) DEVSTAT_TYPE_STORARRAY| DEVSTAT_TYPE_IF_OTHER, DEVSTAT_PRIORITY_ARRAY); - dsk = disk_create(drv->unit, &drv->disk, 0, &id_cdevsw); + dsk = disk_create(drv->unit, &drv->disk, 0, &id_ops); dsk->si_drv1 = drv; dsk->si_iosize_max = DFLTPHYS; /* XXX guess? */ diff --git a/sys/dev/raid/iir/iir_ctrl.c b/sys/dev/raid/iir/iir_ctrl.c index cccb787d8c..93d0a69fe6 100644 --- a/sys/dev/raid/iir/iir_ctrl.c +++ b/sys/dev/raid/iir/iir_ctrl.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/dev/iir/iir_ctrl.c,v 1.2.2.4 2002/05/05 08:18:12 asmodai Exp $ */ -/* $DragonFly: src/sys/dev/raid/iir/iir_ctrl.c,v 1.9 2005/06/10 15:46:31 swildner Exp $ */ +/* $DragonFly: src/sys/dev/raid/iir/iir_ctrl.c,v 1.10 2006/07/28 02:17:37 dillon Exp $ */ /* * Copyright (c) 2000-01 Intel Corporation * All Rights Reserved @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -69,23 +70,13 @@ static d_ioctl_t iir_ioctl; #define CDEV_MAJOR IIR_CDEV_MAJOR /* Normally, this is a static structure. But we need it in pci/iir_pci.c */ -static struct cdevsw iir_cdevsw = { - /* name */ "iir", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ iir_open, - /* close */ iir_close, - /* read */ iir_read, - /* write */ iir_write, - /* ioctl */ iir_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops iir_ops = { + { "iir", CDEV_MAJOR, 0 }, + .d_open = iir_open, + .d_close = iir_close, + .d_read = iir_read, + .d_write = iir_write, + .d_ioctl = iir_ioctl, }; static int iir_devsw_installed = 0; @@ -107,12 +98,12 @@ gdt_make_dev(int unit) dev_t dev; #ifdef SDEV_PER_HBA - dev = make_dev(&iir_cdevsw, hba2minor(unit), UID_ROOT, GID_OPERATOR, + dev = make_dev(&iir_ops, hba2minor(unit), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "iir%d", unit); #else if (sdev_made) return (0); - dev = make_dev(&iir_cdevsw, 0, UID_ROOT, GID_OPERATOR, + dev = make_dev(&iir_ops, 0, UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "iir"); sdev_made = 1; #endif @@ -151,7 +142,7 @@ gdt_minor2softc(int minor_no) } static int -iir_open(dev_t dev, int flags, int fmt, d_thread_t * p) +iir_open(struct dev_open_args *ap) { GDT_DPRINTF(GDT_D_DEBUG, ("iir_open()\n")); @@ -169,7 +160,7 @@ iir_open(dev_t dev, int flags, int fmt, d_thread_t * p) } static int -iir_close(dev_t dev, int flags, int fmt, d_thread_t * p) +iir_close(struct dev_close_args *ap) { GDT_DPRINTF(GDT_D_DEBUG, ("iir_close()\n")); @@ -187,7 +178,7 @@ iir_close(dev_t dev, int flags, int fmt, d_thread_t * p) } static int -iir_write(dev_t dev, struct uio * uio, int ioflag) +iir_write(struct dev_write_args *ap) { GDT_DPRINTF(GDT_D_DEBUG, ("iir_write()\n")); @@ -205,7 +196,7 @@ iir_write(dev_t dev, struct uio * uio, int ioflag) } static int -iir_read(dev_t dev, struct uio * uio, int ioflag) +iir_read(struct dev_read_args *ap) { GDT_DPRINTF(GDT_D_DEBUG, ("iir_read()\n")); @@ -229,7 +220,7 @@ iir_read(dev_t dev, struct uio * uio, int ioflag) */ static int -iir_ioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, d_thread_t * p) +iir_ioctl(struct dev_ioctl_args *ap) { GDT_DPRINTF(GDT_D_DEBUG, ("iir_ioctl() cmd 0x%lx\n",cmd)); @@ -246,13 +237,13 @@ iir_ioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, d_thread_t * p) if (gdt_stat.io_count_act > gdt_stat.io_count_max) gdt_stat.io_count_max = gdt_stat.io_count_act; - switch (cmd) { + switch (ap->a_cmd) { case GDT_IOCTL_GENERAL: { gdt_ucmd_t *ucmd; struct gdt_softc *gdt; - ucmd = (gdt_ucmd_t *)cmdarg; + ucmd = (gdt_ucmd_t *)ap->a_data; gdt = gdt_minor2softc(ucmd->io_node); if (gdt == NULL) return (ENXIO); @@ -267,7 +258,7 @@ iir_ioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, d_thread_t * p) } case GDT_IOCTL_DRVERS: - *(int *)cmdarg = + *(int *)ap->a_data = (IIR_DRIVER_VERSION << 8) | IIR_DRIVER_SUBVERSION; break; @@ -276,7 +267,7 @@ iir_ioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, d_thread_t * p) gdt_ctrt_t *p; struct gdt_softc *gdt; - p = (gdt_ctrt_t *)cmdarg; + p = (gdt_ctrt_t *)ap->a_data; gdt = gdt_minor2softc(p->io_node); if (gdt == NULL) return (ENXIO); @@ -293,7 +284,7 @@ iir_ioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, d_thread_t * p) { gdt_osv_t *p; - p = (gdt_osv_t *)cmdarg; + p = (gdt_osv_t *)ap->a_data; p->oscode = 10; p->version = osrelease[0] - '0'; if (osrelease[1] == '.') @@ -309,14 +300,14 @@ iir_ioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, d_thread_t * p) } case GDT_IOCTL_CTRCNT: - *(int *)cmdarg = gdt_cnt; + *(int *)ap->a_data = gdt_cnt; break; case GDT_IOCTL_EVENT: { gdt_event_t *p; - p = (gdt_event_t *)cmdarg; + p = (gdt_event_t *)ap->a_data; if (p->erase == 0xff) { if (p->dvr.event_source == GDT_ES_TEST) p->dvr.event_data.size = sizeof(p->dvr.event_data.eu.test); @@ -346,7 +337,7 @@ iir_ioctl(dev_t dev, u_long cmd, caddr_t cmdarg, int flags, d_thread_t * p) { gdt_statist_t *p; - p = (gdt_statist_t *)cmdarg; + p = (gdt_statist_t *)ap->a_data; bcopy(&gdt_stat, p, sizeof(gdt_statist_t)); break; } @@ -366,7 +357,7 @@ iir_drvinit(void *unused) if (!iir_devsw_installed) { /* Add the I/O (data) channel */ - cdevsw_add(&iir_cdevsw, 0, 0); + dev_ops_add(&iir_ops, 0, 0); iir_devsw_installed = 1; } } diff --git a/sys/dev/raid/ips/ips.c b/sys/dev/raid/ips/ips.c index 345f8739fb..c32ca1fc7a 100644 --- a/sys/dev/raid/ips/ips.c +++ b/sys/dev/raid/ips/ips.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ips/ips.c,v 1.12 2004/05/30 04:01:29 scottl Exp $ - * $DragonFly: src/sys/dev/raid/ips/ips.c,v 1.13 2006/06/04 21:09:50 dillon Exp $ + * $DragonFly: src/sys/dev/raid/ips/ips.c,v 1.14 2006/07/28 02:17:37 dillon Exp $ */ #include @@ -40,15 +40,11 @@ static d_ioctl_t ips_ioctl; MALLOC_DEFINE(M_IPSBUF, "ipsbuf", "IPS driver buffer"); -static struct cdevsw ips_cdevsw = { - .d_name = "ips", - .d_maj = IPS_CDEV_MAJOR, - .d_flags = D_DISK, - .d_port = NULL, - .d_clone = NULL, - .old_open = ips_open, - .old_close = ips_close, - .old_ioctl = ips_ioctl, +static struct dev_ops ips_ops = { + { "ips", IPS_CDEV_MAJOR, D_DISK }, + .d_open = ips_open, + .d_close = ips_close, + .d_ioctl = ips_ioctl, }; static const char *ips_adapter_name[] = { @@ -72,8 +68,9 @@ static const char *ips_adapter_name[] = { static int -ips_open(dev_t dev, int flags, int fmt, d_thread_t *td) +ips_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; ips_softc_t *sc = dev->si_drv1; sc->state |= IPS_DEV_OPEN; @@ -81,8 +78,9 @@ ips_open(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -ips_close(dev_t dev, int flags, int fmt, d_thread_t *td) +ips_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; ips_softc_t *sc = dev->si_drv1; sc->state &= ~IPS_DEV_OPEN; @@ -90,13 +88,12 @@ ips_close(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -ips_ioctl(dev_t dev, u_long command, caddr_t addr, int32_t flags, - d_thread_t *td) +ips_ioctl(struct dev_ioctl_args *ap) { ips_softc_t *sc; - sc = dev->si_drv1; - return ips_ioctl_request(sc, command, addr, flags); + sc = ap->a_head.a_dev->si_drv1; + return ips_ioctl_request(sc, ap->a_cmd, ap->a_data, ap->a_fflag); } static void @@ -453,8 +450,8 @@ ips_adapter_init(ips_softc_t *sc) "failed to initialize command buffers\n"); goto error; } - cdevsw_add(&ips_cdevsw, -1, device_get_unit(sc->dev)); - dev = make_dev(&ips_cdevsw, device_get_unit(sc->dev), + dev_ops_add(&ips_ops, -1, device_get_unit(sc->dev)); + dev = make_dev(&ips_ops, device_get_unit(sc->dev), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "ips%d", device_get_unit(sc->dev)); dev->si_drv1 = sc; @@ -546,7 +543,7 @@ ips_adapter_free(ips_softc_t *sc) bus_dma_tag_destroy(sc->sg_dmatag); if (sc->command_dmatag) bus_dma_tag_destroy(sc->command_dmatag); - cdevsw_remove(&ips_cdevsw, -1, device_get_unit(sc->dev)); + dev_ops_remove(&ips_ops, -1, device_get_unit(sc->dev)); return 0; } diff --git a/sys/dev/raid/ips/ips.h b/sys/dev/raid/ips/ips.h index b8a8316185..38411f4223 100644 --- a/sys/dev/raid/ips/ips.h +++ b/sys/dev/raid/ips/ips.h @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ips/ips.h,v 1.10 2004/05/30 20:08:34 phk Exp $ - * $DragonFly: src/sys/dev/raid/ips/ips.h,v 1.10 2006/06/04 21:09:50 dillon Exp $ + * $DragonFly: src/sys/dev/raid/ips/ips.h,v 1.11 2006/07/28 02:17:37 dillon Exp $ */ @@ -202,10 +202,6 @@ MALLOC_DECLARE(M_IPSBUF); #define d_maxsize si_iosize_max -#define disk_open_t d_open_t -#define disk_close_t d_close_t -#define disk_strategy_t d_strategy_t - #if defined(PCIR_MAPS) && !defined(PCIR_BARS) # define PCIR_BAR(x) (PCIR_BARS + (x) * 4) # define PCIR_BARS PCIR_MAPS diff --git a/sys/dev/raid/ips/ips_disk.c b/sys/dev/raid/ips/ips_disk.c index 37b08c369f..ab64b47c47 100644 --- a/sys/dev/raid/ips/ips_disk.c +++ b/sys/dev/raid/ips/ips_disk.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ips/ips_disk.c,v 1.4 2003/09/22 04:59:07 njl Exp $ - * $DragonFly: src/sys/dev/raid/ips/ips_disk.c,v 1.8 2006/06/04 21:09:50 dillon Exp $ + * $DragonFly: src/sys/dev/raid/ips/ips_disk.c,v 1.9 2006/07/28 02:17:37 dillon Exp $ */ #include @@ -41,7 +41,6 @@ static int ipsd_probe(device_t dev); static int ipsd_attach(device_t dev); static int ipsd_detach(device_t dev); -static int ipsd_dump_helper(dev_t dev, u_int count, u_int blkno, u_int secsize); #if 0 static int ipsd_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t length); static void ipsd_dump_map_sg(void *arg, bus_dma_segment_t *segs, int nsegs, @@ -49,22 +48,19 @@ static void ipsd_dump_map_sg(void *arg, bus_dma_segment_t *segs, int nsegs, static void ipsd_dump_block_complete(ips_command_t *command); #endif -static disk_open_t ipsd_open; -static disk_close_t ipsd_close; -static disk_strategy_t ipsd_strategy; - -static struct cdevsw ipsd_cdevsw = { - .d_name = "ipsd", - .d_maj = IPSD_CDEV_MAJOR, - .d_flags = D_DISK, - .d_port = NULL, - .d_clone = NULL, - .old_open = ipsd_open, - .old_close = ipsd_close, - .old_strategy = ipsd_strategy, - .old_read = physread, - .old_write = physwrite, - .old_dump = ipsd_dump_helper, +static d_open_t ipsd_open; +static d_close_t ipsd_close; +static d_strategy_t ipsd_strategy; +static d_dump_t ipsd_dump_helper; + +static struct dev_ops ipsd_ops = { + { "ipsd", IPSD_CDEV_MAJOR, D_DISK }, + .d_open = ipsd_open, + .d_close = ipsd_close, + .d_strategy = ipsd_strategy, + .d_read = physread, + .d_write = physwrite, + .d_dump = ipsd_dump_helper, }; static device_method_t ipsd_methods[] = { @@ -89,8 +85,9 @@ DRIVER_MODULE(ipsd, ips, ipsd_driver, ipsd_devclass, 0, 0); * the geometry and size of the disk */ static int -ipsd_open(dev_t dev, int oflags, int devtype, d_thread_t *td) +ipsd_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; ipsdisk_softc_t *dsc = dev->si_drv1; if (dsc == NULL) @@ -101,8 +98,9 @@ ipsd_open(dev_t dev, int oflags, int devtype, d_thread_t *td) } static int -ipsd_close(dev_t dev, int oflags, int devtype, d_thread_t *td) +ipsd_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; ipsdisk_softc_t *dsc = dev->si_drv1; dsc->state &= ~IPS_DEV_OPEN; @@ -129,9 +127,11 @@ ipsd_finish(struct bio *bio) } -static void -ipsd_strategy(dev_t dev, struct bio *bio) +static int +ipsd_strategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; ipsdisk_softc_t *dsc; dsc = dev->si_drv1; @@ -142,6 +142,7 @@ ipsd_strategy(dev_t dev, struct bio *bio) bioq_insert_tail(&dsc->sc->bio_queue, bio); ips_start_io_request(dsc->sc); lockmgr(&dsc->sc->queue_lock, LK_RELEASE); + return(0); } static int @@ -182,8 +183,7 @@ ipsd_attach(device_t dev) DEVSTAT_NO_ORDERED_TAGS, DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_SCSI, DEVSTAT_PRIORITY_DISK); - dsc->ipsd_dev_t = disk_create(dsc->unit, &dsc->ipsd_disk, 0, - &ipsd_cdevsw); + dsc->ipsd_dev_t = disk_create(dsc->unit, &dsc->ipsd_disk, 0, &ipsd_ops); dsc->ipsd_dev_t->si_drv1 = dsc; dsc->ipsd_dev_t->si_iosize_max = IPS_MAX_IO_SIZE; label = &dsc->ipsd_disk.d_label; @@ -215,7 +215,7 @@ ipsd_detach(device_t dev) } static int -ipsd_dump_helper(dev_t dev, u_int count, u_int blkno, u_int secsize) +ipsd_dump_helper(struct dev_dump_args *ap) { printf("dump support for IPS not yet working, will not dump\n"); return (ENODEV); diff --git a/sys/dev/raid/mlx/mlx.c b/sys/dev/raid/mlx/mlx.c index 671bde37cb..2d8926277a 100644 --- a/sys/dev/raid/mlx/mlx.c +++ b/sys/dev/raid/mlx/mlx.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/mlx/mlx.c,v 1.14.2.5 2001/09/11 09:49:53 kris Exp $ - * $DragonFly: src/sys/dev/raid/mlx/mlx.c,v 1.18 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/raid/mlx/mlx.c,v 1.19 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -57,23 +57,11 @@ #define MLX_CDEV_MAJOR 130 -static struct cdevsw mlx_cdevsw = { - /* name */ "mlx", - /* maj */ MLX_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mlx_open, - /* close */ mlx_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ mlx_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mlx_ops = { + { "mlx", MLX_CDEV_MAJOR, 0 }, + .d_open = mlx_open, + .d_close = mlx_close, + .d_ioctl = mlx_ioctl, }; devclass_t mlx_devclass; @@ -209,7 +197,7 @@ mlx_free(struct mlx_softc *sc) if (sc->mlx_enq2 != NULL) free(sc->mlx_enq2, M_DEVBUF); - cdevsw_remove(&mlx_cdevsw, -1, device_get_unit(sc->mlx_dev)); + dev_ops_remove(&mlx_ops, -1, device_get_unit(sc->mlx_dev)); } /******************************************************************************** @@ -485,8 +473,8 @@ mlx_attach(struct mlx_softc *sc) /* * Create the control device. */ - cdevsw_add(&mlx_cdevsw, -1, device_get_unit(sc->mlx_dev)); - make_dev(&mlx_cdevsw, device_get_unit(sc->mlx_dev), + dev_ops_add(&mlx_ops, -1, device_get_unit(sc->mlx_dev)); + make_dev(&mlx_ops, device_get_unit(sc->mlx_dev), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "mlx%d", device_get_unit(sc->mlx_dev)); @@ -719,8 +707,9 @@ mlx_submit_bio(struct mlx_softc *sc, struct bio *bio) * Accept an open operation on the control device. */ int -mlx_open(dev_t dev, int flags, int fmt, d_thread_t *td) +mlx_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct mlx_softc *sc = devclass_get_softc(mlx_devclass, unit); @@ -732,8 +721,9 @@ mlx_open(dev_t dev, int flags, int fmt, d_thread_t *td) * Accept the last close on the control device. */ int -mlx_close(dev_t dev, int flags, int fmt, d_thread_t *td) +mlx_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct mlx_softc *sc = devclass_get_softc(mlx_devclass, unit); @@ -745,19 +735,20 @@ mlx_close(dev_t dev, int flags, int fmt, d_thread_t *td) * Handle controller-specific control operations. */ int -mlx_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) +mlx_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct mlx_softc *sc = devclass_get_softc(mlx_devclass, unit); - struct mlx_rebuild_request *rb = (struct mlx_rebuild_request *)addr; - struct mlx_rebuild_status *rs = (struct mlx_rebuild_status *)addr; - int *arg = (int *)addr; + struct mlx_rebuild_request *rb = (struct mlx_rebuild_request *)ap->a_data; + struct mlx_rebuild_status *rs = (struct mlx_rebuild_status *)ap->a_data; + int *arg = (int *)ap->a_data; struct mlx_pause *mp; struct mlx_sysdrive *dr; struct mlxd_softc *mlxd; int i, error; - switch(cmd) { + switch(ap->a_cmd) { /* * Enumerate connected system drives; returns the first system drive's * unit number if *arg is -1, or the next unit after *arg if it's @@ -835,7 +826,7 @@ mlx_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) if (!(sc->mlx_feature & MLX_FEAT_PAUSEWORKS)) return(EOPNOTSUPP); - mp = (struct mlx_pause *)addr; + mp = (struct mlx_pause *)ap->a_data; if ((mp->mp_which == MLX_PAUSE_CANCEL) && (sc->mlx_pause.mp_when != 0)) { /* cancel a pending pause operation */ sc->mlx_pause.mp_which = 0; @@ -863,7 +854,7 @@ mlx_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) * Accept a command passthrough-style. */ case MLX_COMMAND: - return(mlx_user_command(sc, (struct mlx_usercommand *)addr)); + return(mlx_user_command(sc, (struct mlx_usercommand *)ap->a_data)); /* * Start a rebuild on a given SCSI disk @@ -932,7 +923,7 @@ mlx_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) */ int mlx_submit_ioctl(struct mlx_softc *sc, struct mlx_sysdrive *drive, u_long cmd, - caddr_t addr, int32_t flag, d_thread_t *td) + caddr_t addr, int32_t flag) { int *arg = (int *)addr; int error, result; diff --git a/sys/dev/raid/mlx/mlx_disk.c b/sys/dev/raid/mlx/mlx_disk.c index d18acc79b8..bf210063d2 100644 --- a/sys/dev/raid/mlx/mlx_disk.c +++ b/sys/dev/raid/mlx/mlx_disk.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/mlx/mlx_disk.c,v 1.8.2.4 2001/06/25 04:37:51 msmith Exp $ - * $DragonFly: src/sys/dev/raid/mlx/mlx_disk.c,v 1.8 2006/02/17 19:18:05 dillon Exp $ + * $DragonFly: src/sys/dev/raid/mlx/mlx_disk.c,v 1.9 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -61,23 +61,14 @@ static d_ioctl_t mlxd_ioctl; #define MLXD_CDEV_MAJOR 131 -static struct cdevsw mlxd_cdevsw = { - /* name */ "mlxd", - /* maj */ MLXD_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mlxd_open, - /* close */ mlxd_close, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ mlxd_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ mlxd_strategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mlxd_ops = { + { "mlxd", MLXD_CDEV_MAJOR, D_DISK }, + .d_open = mlxd_open, + .d_close = mlxd_close, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = mlxd_ioctl, + .d_strategy = mlxd_strategy, }; devclass_t mlxd_devclass; @@ -98,8 +89,9 @@ static driver_t mlxd_driver = { DRIVER_MODULE(mlxd, mlx, mlxd_driver, mlxd_devclass, 0, 0); static int -mlxd_open(dev_t dev, int flags, int fmt, d_thread_t *td) +mlxd_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; struct disklabel *label; @@ -127,8 +119,9 @@ mlxd_open(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -mlxd_close(dev_t dev, int flags, int fmt, d_thread_t *td) +mlxd_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; debug_called(1); @@ -140,8 +133,9 @@ mlxd_close(dev_t dev, int flags, int fmt, d_thread_t *td) } static int -mlxd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) +mlxd_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; int error; @@ -150,7 +144,7 @@ mlxd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) if (sc == NULL) return (ENXIO); - if ((error = mlx_submit_ioctl(sc->mlxd_controller, sc->mlxd_drive, cmd, addr, flag, td)) != ENOIOCTL) { + if ((error = mlx_submit_ioctl(sc->mlxd_controller, sc->mlxd_drive, ap->a_cmd, ap->a_data, ap->a_fflag)) != ENOIOCTL) { debug(0, "mlx_submit_ioctl returned %d\n", error); return(error); } @@ -163,9 +157,10 @@ mlxd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) * to complete. Multi-page transfers are supported. All I/O requests must * be a multiple of a sector in length. */ -static void -mlxd_strategy(dev_t dev, mlx_bio *bio) +static int +mlxd_strategy(struct dev_strategy_args *ap) { + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct mlxd_softc *sc = (struct mlxd_softc *)bio->bio_driver_info; @@ -187,7 +182,7 @@ mlxd_strategy(dev_t dev, mlx_bio *bio) devstat_start_transaction(&sc->mlxd_stats); mlx_submit_bio(sc->mlxd_controller, bio); - return; + return(0); bad: /* @@ -195,7 +190,7 @@ mlxd_strategy(dev_t dev, mlx_bio *bio) */ bp->b_resid = bp->b_bcount; biodone(bio); - return; + return(0); } void @@ -264,7 +259,7 @@ mlxd_attach(device_t dev) DEVSTAT_TYPE_STORARRAY | DEVSTAT_TYPE_IF_OTHER, DEVSTAT_PRIORITY_ARRAY); - dsk = disk_create(sc->mlxd_unit, &sc->mlxd_disk, 0, &mlxd_cdevsw); + dsk = disk_create(sc->mlxd_unit, &sc->mlxd_disk, 0, &mlxd_ops); dsk->si_drv1 = sc; sc->mlxd_dev_t = dsk; diff --git a/sys/dev/raid/mlx/mlxvar.h b/sys/dev/raid/mlx/mlxvar.h index 2f2d7f05c7..73eaf0dfcb 100644 --- a/sys/dev/raid/mlx/mlxvar.h +++ b/sys/dev/raid/mlx/mlxvar.h @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/mlx/mlxvar.h,v 1.5.2.3 2001/06/25 04:37:51 msmith Exp $ - * $DragonFly: src/sys/dev/raid/mlx/mlxvar.h,v 1.7 2006/02/17 19:18:05 dillon Exp $ + * $DragonFly: src/sys/dev/raid/mlx/mlxvar.h,v 1.8 2006/07/28 02:17:37 dillon Exp $ */ /* @@ -240,8 +240,9 @@ struct mlxd_softc * Interface between driver core and disk driver (should be using a bus?) */ extern int mlx_submit_bio(struct mlx_softc *sc, struct bio *bio); -extern int mlx_submit_ioctl(struct mlx_softc *sc, struct mlx_sysdrive *drive, u_long cmd, - caddr_t addr, int32_t flag, d_thread_t *td); +extern int mlx_submit_ioctl(struct mlx_softc *sc, + struct mlx_sysdrive *drive, u_long cmd, + caddr_t addr, int32_t flag); extern void mlxd_intr(struct bio *bio); diff --git a/sys/dev/raid/mly/mly.c b/sys/dev/raid/mly/mly.c index 3e68fb0a77..aad54be32b 100644 --- a/sys/dev/raid/mly/mly.c +++ b/sys/dev/raid/mly/mly.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/mly/mly.c,v 1.3.2.3 2001/03/05 20:17:24 msmith Exp $ - * $DragonFly: src/sys/dev/raid/mly/mly.c,v 1.12 2005/06/10 17:10:26 swildner Exp $ + * $DragonFly: src/sys/dev/raid/mly/mly.c,v 1.13 2006/07/28 02:17:37 dillon Exp $ */ #include @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -94,23 +95,11 @@ static int mly_user_health(struct mly_softc *sc, struct mly_user_health *uh); #define MLY_CDEV_MAJOR 158 -static struct cdevsw mly_cdevsw = { - /* name */ "mly", - /* cmaj */ MLY_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - mly_user_open, - mly_user_close, - noread, - nowrite, - mly_user_ioctl, - nopoll, - nommap, - nostrategy, - nodump, - nopsize +static struct dev_ops mly_ops = { + { "mly", MLY_CDEV_MAJOR, 0 }, + .d_open = mly_user_open, + .d_close = mly_user_close, + .d_ioctl = mly_user_ioctl, }; /******************************************************************************** @@ -209,8 +198,8 @@ mly_attach(struct mly_softc *sc) /* * Create the control device. */ - cdevsw_add(&mly_cdevsw, -1, device_get_unit(sc->mly_dev)); - sc->mly_dev_t = make_dev(&mly_cdevsw, device_get_unit(sc->mly_dev), + dev_ops_add(&mly_ops, -1, device_get_unit(sc->mly_dev)); + sc->mly_dev_t = make_dev(&mly_ops, device_get_unit(sc->mly_dev), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "mly%d", device_get_unit(sc->mly_dev)); sc->mly_dev_t->si_drv1 = sc; @@ -1706,8 +1695,9 @@ mly_print_controller(int controller) * Accept an open operation on the control device. */ static int -mly_user_open(dev_t dev, int flags, int fmt, d_thread_t *td) +mly_user_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct mly_softc *sc = devclass_get_softc(devclass_find("mly"), unit); @@ -1719,8 +1709,9 @@ mly_user_open(dev_t dev, int flags, int fmt, d_thread_t *td) * Accept the last close on the control device. */ static int -mly_user_close(dev_t dev, int flags, int fmt, d_thread_t *td) +mly_user_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct mly_softc *sc = devclass_get_softc(devclass_find("mly"), unit); @@ -1732,13 +1723,14 @@ mly_user_close(dev_t dev, int flags, int fmt, d_thread_t *td) * Handle controller-specific control operations. */ static int -mly_user_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) +mly_user_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct mly_softc *sc = (struct mly_softc *)dev->si_drv1; - struct mly_user_command *uc = (struct mly_user_command *)addr; - struct mly_user_health *uh = (struct mly_user_health *)addr; + struct mly_user_command *uc = (struct mly_user_command *)ap->a_data; + struct mly_user_health *uh = (struct mly_user_health *)ap->a_data; - switch(cmd) { + switch(ap->a_cmd) { case MLYIO_COMMAND: return(mly_user_command(sc, uc)); case MLYIO_HEALTH: diff --git a/sys/dev/raid/pst/pst-raid.c b/sys/dev/raid/pst/pst-raid.c index 959746f023..5aee9d6917 100644 --- a/sys/dev/raid/pst/pst-raid.c +++ b/sys/dev/raid/pst/pst-raid.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/pst/pst-raid.c,v 1.2.2.1 2002/08/18 12:32:36 sos Exp $ - * $DragonFly: src/sys/dev/raid/pst/pst-raid.c,v 1.15 2006/04/30 17:22:16 dillon Exp $ + * $DragonFly: src/sys/dev/raid/pst/pst-raid.c,v 1.16 2006/07/28 02:17:37 dillon Exp $ */ #include @@ -56,23 +56,13 @@ /* device structures */ static d_strategy_t pststrategy; -static struct cdevsw pst_cdevsw = { - /* name */ "pst", - /* maj */ 168, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ nullopen, - /* close */ nullclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strat */ pststrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops pst_ops = { + { "pst", 168, D_DISK }, + .d_open = nullopen, + .d_close = nullclose, + .d_read = physread, + .d_write = physwrite, + .d_strategy = pststrategy, }; struct pst_softc { @@ -168,7 +158,7 @@ pst_attach(device_t dev) bioq_init(&psc->bio_queue); - psc->device = disk_create(lun, &psc->disk, 0, &pst_cdevsw); + psc->device = disk_create(lun, &psc->disk, 0, &pst_ops); psc->device->si_drv1 = psc; psc->device->si_iosize_max = 64 * 1024; /*I2O_SGL_MAX_SEGS * PAGE_SIZE;*/ @@ -222,15 +212,16 @@ pst_shutdown(device_t dev) } #endif -static void -pststrategy(dev_t dev, struct bio *bio) +static int +pststrategy(struct dev_strategy_args *ap) { - struct pst_softc *psc = dev->si_drv1; + struct pst_softc *psc = ap->a_head.a_dev->si_drv1; crit_enter(); - bioqdisksort(&psc->bio_queue, bio); + bioqdisksort(&psc->bio_queue, ap->a_bio); pst_start(psc); crit_exit(); + return(0); } static void diff --git a/sys/dev/raid/twa/twa_freebsd.c b/sys/dev/raid/twa/twa_freebsd.c index 1cc76680fc..b311a06ef2 100644 --- a/sys/dev/raid/twa/twa_freebsd.c +++ b/sys/dev/raid/twa/twa_freebsd.c @@ -26,7 +26,7 @@ * SUCH DAMAGE. * * $FreeBSD$ - * $DragonFly: src/sys/dev/raid/twa/twa_freebsd.c,v 1.9 2005/10/12 17:35:54 dillon Exp $ + * $DragonFly: src/sys/dev/raid/twa/twa_freebsd.c,v 1.10 2006/07/28 02:17:38 dillon Exp $ */ /* @@ -50,22 +50,11 @@ static d_open_t twa_open; static d_close_t twa_close; static d_ioctl_t twa_ioctl_wrapper; -static struct cdevsw twa_cdevsw = { - "twa", - TWA_CDEV_MAJOR, - 0, - NULL, - 0, - twa_open, - twa_close, - noread, - nowrite, - twa_ioctl_wrapper, - nopoll, - nommap, - nostrategy, - nodump, - nopsize, +static struct dev_ops twa_ops = { + { "twa", TWA_CDEV_MAJOR, 0 }, + .d_open = twa_open, + .d_close = twa_close, + .d_ioctl = twa_ioctl_wrapper, }; static devclass_t twa_devclass; @@ -85,8 +74,9 @@ static devclass_t twa_devclass; * non-zero-- failure */ static int -twa_open(dev_t dev, int flags, int fmt, d_thread_t *proc) +twa_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct twa_softc *sc = devclass_get_softc(twa_devclass, unit); @@ -110,8 +100,9 @@ twa_open(dev_t dev, int flags, int fmt, d_thread_t *proc) * non-zero-- failure */ static int -twa_close(dev_t dev, int flags, int fmt, d_thread_t *proc) +twa_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct twa_softc *sc = devclass_get_softc(twa_devclass, unit); @@ -138,12 +129,12 @@ twa_close(dev_t dev, int flags, int fmt, d_thread_t *proc) * non-zero-- failure */ static int -twa_ioctl_wrapper(dev_t dev, u_long cmd, caddr_t buf, - int flags, d_thread_t *proc) +twa_ioctl_wrapper(struct dev_ioctl_args *ap) { - struct twa_softc *sc = (struct twa_softc *)(dev->si_drv1); + dev_t dev = ap->a_head.a_dev; + struct twa_softc *sc = (struct twa_softc *)(dev->si_drv1); - return(twa_ioctl(sc, cmd, buf)); + return(twa_ioctl(sc, ap->a_cmd, ap->a_data)); } @@ -299,8 +290,8 @@ twa_attach(device_t dev) twa_describe_controller(sc); /* Create the control device. */ - cdevsw_add(&twa_cdevsw, -1, device_get_unit(sc->twa_bus_dev)); - xdev = make_dev(&twa_cdevsw, device_get_unit(sc->twa_bus_dev), + dev_ops_add(&twa_ops, -1, device_get_unit(sc->twa_bus_dev)); + xdev = make_dev(&twa_ops, device_get_unit(sc->twa_bus_dev), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "twa%d", device_get_unit(sc->twa_bus_dev)); xdev->si_drv1 = sc; @@ -379,7 +370,7 @@ twa_free(struct twa_softc *sc) bus_release_resource(sc->twa_bus_dev, SYS_RES_IOPORT, TWA_IO_CONFIG_REG, sc->twa_io_res); - cdevsw_remove(&twa_cdevsw, -1, device_get_unit(sc->twa_bus_dev)); + dev_ops_remove(&twa_ops, -1, device_get_unit(sc->twa_bus_dev)); sysctl_ctx_free(&sc->twa_sysctl_ctx); } diff --git a/sys/dev/raid/twa/twa_includes.h b/sys/dev/raid/twa/twa_includes.h index 4364590bd2..d3040652e5 100644 --- a/sys/dev/raid/twa/twa_includes.h +++ b/sys/dev/raid/twa/twa_includes.h @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD$ - * $DragonFly: src/sys/dev/raid/twa/twa_includes.h,v 1.2 2005/06/10 17:10:26 swildner Exp $ + * $DragonFly: src/sys/dev/raid/twa/twa_includes.h,v 1.3 2006/07/28 02:17:38 dillon Exp $ */ /* @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include diff --git a/sys/dev/raid/twe/twe_freebsd.c b/sys/dev/raid/twe/twe_freebsd.c index fd2c662b3e..fb7226ce3c 100644 --- a/sys/dev/raid/twe/twe_freebsd.c +++ b/sys/dev/raid/twe/twe_freebsd.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/twe/twe_freebsd.c,v 1.2.2.9 2004/06/11 18:57:31 vkashyap Exp $ - * $DragonFly: src/sys/dev/raid/twe/twe_freebsd.c,v 1.20 2006/05/03 16:34:16 dillon Exp $ + * $DragonFly: src/sys/dev/raid/twe/twe_freebsd.c,v 1.21 2006/07/28 02:17:38 dillon Exp $ */ /* @@ -62,30 +62,20 @@ static d_open_t twe_open; static d_close_t twe_close; static d_ioctl_t twe_ioctl_wrapper; -static struct cdevsw twe_cdevsw = { - "twe", /* name */ - TWE_CDEV_MAJOR, /* major number */ - 0, /* flags */ - NULL, /* device port */ - NULL, /* cloning */ - twe_open, - twe_close, - noread, - nowrite, - twe_ioctl_wrapper, - nopoll, - nommap, - nostrategy, - nodump, - nopsize +static struct dev_ops twe_ops = { + { "twe", TWE_CDEV_MAJOR, 0 }, + .d_open = twe_open, + .d_close = twe_close, + .d_ioctl = twe_ioctl_wrapper, }; /******************************************************************************** * Accept an open operation on the control device. */ static int -twe_open(dev_t dev, int flags, int fmt, d_thread_t *td) +twe_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct twe_softc *sc = devclass_get_softc(twe_devclass, unit); @@ -97,8 +87,9 @@ twe_open(dev_t dev, int flags, int fmt, d_thread_t *td) * Accept the last close on the control device. */ static int -twe_close(dev_t dev, int flags, int fmt, d_thread_t *td) +twe_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct twe_softc *sc = devclass_get_softc(twe_devclass, unit); @@ -110,11 +101,12 @@ twe_close(dev_t dev, int flags, int fmt, d_thread_t *td) * Handle controller-specific control operations. */ static int -twe_ioctl_wrapper(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) +twe_ioctl_wrapper(struct dev_ioctl_args *ap) { - struct twe_softc *sc = (struct twe_softc *)dev->si_drv1; + dev_t dev = ap->a_head.a_dev; + struct twe_softc *sc = (struct twe_softc *)dev->si_drv1; - return(twe_ioctl(sc, cmd, addr)); + return(twe_ioctl(sc, ap->a_cmd, ap->a_data)); } /******************************************************************************** @@ -308,8 +300,8 @@ twe_attach(device_t dev) /* * Create the control device. */ - cdevsw_add(&twe_cdevsw, -1, device_get_unit(sc->twe_dev)); - sc->twe_dev_t = make_dev(&twe_cdevsw, device_get_unit(sc->twe_dev), + dev_ops_add(&twe_ops, -1, device_get_unit(sc->twe_dev)); + sc->twe_dev_t = make_dev(&twe_ops, device_get_unit(sc->twe_dev), UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR, "twe%d", device_get_unit(sc->twe_dev)); sc->twe_dev_t->si_drv1 = sc; @@ -364,7 +356,7 @@ twe_free(struct twe_softc *sc) if (sc->twe_io != NULL) bus_release_resource(sc->twe_dev, SYS_RES_IOPORT, TWE_IO_CONFIG_REG, sc->twe_io); - cdevsw_remove(&twe_cdevsw, -1, device_get_unit(sc->twe_dev)); + dev_ops_remove(&twe_ops, -1, device_get_unit(sc->twe_dev)); /* destroy control device */ if (sc->twe_dev_t != (dev_t)NULL) destroy_dev(sc->twe_dev_t); @@ -611,27 +603,16 @@ static d_close_t twed_close; static d_strategy_t twed_strategy; static d_dump_t twed_dump; -static struct cdevsw twed_cdevsw = { - "twed", - TWED_CDEV_MAJOR, - D_DISK, - /* port */ NULL, - /* clone */ NULL, - twed_open, - twed_close, - physread, - physwrite, - noioctl, - nopoll, - nommap, - twed_strategy, - twed_dump, - nopsize +static struct dev_ops twed_ops = { + { "twed", TWED_CDEV_MAJOR, D_DISK }, + .d_open = twed_open, + .d_close = twed_close, + .d_read = physread, + .d_write = physwrite, + .d_strategy = twed_strategy, + .d_dump = twed_dump, }; -#if 0 -static struct cdevsw tweddisk_cdevsw; -#endif #ifdef FREEBSD_4 static int disks_registered = 0; #endif @@ -643,8 +624,9 @@ static int disks_registered = 0; * for opens on subdevices (eg. slices, partitions). */ static int -twed_open(dev_t dev, int flags, int fmt, d_thread_t *td) +twed_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct twed_softc *sc = (struct twed_softc *)dev->si_drv1; struct disklabel *label; @@ -676,8 +658,9 @@ twed_open(dev_t dev, int flags, int fmt, d_thread_t *td) * Handle last close of the disk device. */ static int -twed_close(dev_t dev, int flags, int fmt, d_thread_t *td) +twed_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct twed_softc *sc = (struct twed_softc *)dev->si_drv1; debug_called(4); @@ -692,9 +675,11 @@ twed_close(dev_t dev, int flags, int fmt, d_thread_t *td) /******************************************************************************** * Handle an I/O request. */ -static void -twed_strategy(dev_t dev, struct bio *bio) +static int +twed_strategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct twed_softc *sc = dev->si_drv1; struct buf *bp = bio->bio_buf; @@ -711,7 +696,7 @@ twed_strategy(dev_t dev, struct bio *bio) printf("twe: bio for invalid disk!\n"); biodone(bio); TWED_BIO_OUT; - return; + return(0); } /* perform accounting */ @@ -722,41 +707,34 @@ twed_strategy(dev_t dev, struct bio *bio) /* poke the controller to start I/O */ twe_startio(sc->twed_controller); - return; + return(0); } /******************************************************************************** * System crashdump support */ static int -twed_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) +twed_dump(struct dev_dump_args *ap) { + dev_t dev = ap->a_head.a_dev; struct twed_softc *twed_sc = (struct twed_softc *)dev->si_drv1; struct twe_softc *twe_sc = (struct twe_softc *)twed_sc->twed_controller; -#if 0 - u_int count, blkno, secsize; -#endif vm_paddr_t addr = 0; long blkcnt; int dumppages = MAXDUMPPGS; int error; int i; -#if 0 - if ((error = disk_dumpcheck(dev, &count, &blkno, &secsize))) - return(error); -#endif - if (!twed_sc || !twe_sc) return(ENXIO); - blkcnt = howmany(PAGE_SIZE, secsize); + blkcnt = howmany(PAGE_SIZE, ap->a_secsize); - while (count > 0) { + while (ap->a_count > 0) { caddr_t va = NULL; - if ((count / blkcnt) < dumppages) - dumppages = count / blkcnt; + if ((ap->a_count / blkcnt) < dumppages) + dumppages = ap->a_count / blkcnt; for (i = 0; i < dumppages; ++i) { vm_paddr_t a = addr + (i * PAGE_SIZE); @@ -766,16 +744,16 @@ twed_dump(dev_t dev, u_int count, u_int blkno, u_int secsize) va = pmap_kenter_temporary(trunc_page(0), i); } - if ((error = twe_dump_blocks(twe_sc, twed_sc->twed_drive->td_twe_unit, blkno, va, + if ((error = twe_dump_blocks(twe_sc, twed_sc->twed_drive->td_twe_unit, ap->a_blkno, va, (PAGE_SIZE * dumppages) / TWE_BLOCK_SIZE)) != 0) return(error); - if (dumpstatus(addr, (off_t)count * DEV_BSIZE) < 0) + if (dumpstatus(addr, (off_t)ap->a_count * DEV_BSIZE) < 0) return(EINTR); - blkno += blkcnt * dumppages; - count -= blkcnt * dumppages; + ap->a_blkno += blkcnt * dumppages; + ap->a_count -= blkcnt * dumppages; addr += PAGE_SIZE * dumppages; } return(0); @@ -841,7 +819,7 @@ twed_attach(device_t dev) /* attach a generic disk device to ourselves */ dsk = disk_create(sc->twed_drive->td_sys_unit, &sc->twed_disk, - 0, &twed_cdevsw); + 0, &twed_ops); dsk->si_drv1 = sc; /* dsk->si_drv2 = sc->twed_drive;*/ sc->twed_dev_t = dsk; @@ -874,7 +852,7 @@ twed_detach(device_t dev) printf("Disks registered: %d\n", disks_registered); #if 0 if (--disks_registered == 0) - cdevsw_remove(&tweddisk_cdevsw); + dev_ops_remove(&tweddisk_ops); #endif #endif diff --git a/sys/dev/raid/vinum/vinum.c b/sys/dev/raid/vinum/vinum.c index de98ba270d..dbfdb55749 100644 --- a/sys/dev/raid/vinum/vinum.c +++ b/sys/dev/raid/vinum/vinum.c @@ -37,7 +37,7 @@ * * $Id: vinum.c,v 1.33 2001/01/09 06:19:15 grog Exp grog $ * $FreeBSD: src/sys/dev/vinum/vinum.c,v 1.38.2.3 2003/01/07 12:14:16 joerg Exp $ - * $DragonFly: src/sys/dev/raid/vinum/vinum.c,v 1.13 2006/07/16 22:39:42 dillon Exp $ + * $DragonFly: src/sys/dev/raid/vinum/vinum.c,v 1.14 2006/07/28 02:17:38 dillon Exp $ */ #define STATIC static /* nothing while we're testing XXX */ @@ -54,17 +54,17 @@ extern struct mc malloced[]; #endif #include "request.h" -struct cdevsw vinum_cdevsw = +struct dev_ops vinum_ops = { - /* name */ "vinum", - /* cmaj */ VINUM_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - vinumopen, vinumclose, physread, physwrite, - vinumioctl, seltrue, nommap, vinumstrategy, - vinumdump, vinumsize, + { "vinum", VINUM_CDEV_MAJOR, D_DISK }, + .d_open = vinumopen, + .d_close = vinumclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = vinumioctl, + .d_poll = vinumpoll, + .d_strategy = vinumstrategy, + .d_dump = vinumdump, }; /* Called by main() during pseudo-device attachment. */ @@ -96,7 +96,7 @@ vinumattach(void *dummy) daemonq = NULL; /* initialize daemon's work queue */ dqend = NULL; - cdevsw_add(&vinum_cdevsw, 0, 0); /* add the cdevsw entry */ + dev_ops_add(&vinum_ops, 0, 0); /* add the ops entry */ vinum_conf.physbufs = nswbuf / 2 + 1; /* maximum amount of physical bufs */ @@ -157,7 +157,7 @@ vinumattach(void *dummy) if ((vol->state == volume_up) && (strcmp (vol->name, cp) == 0) ) { - rootdev = make_dev(&vinum_cdevsw, i, UID_ROOT, GID_OPERATOR, + rootdev = make_dev(&vinum_ops, i, UID_ROOT, GID_OPERATOR, 0640, "vinum"); log(LOG_INFO, "vinum: using volume %s for root device\n", cp); break; @@ -280,7 +280,7 @@ vinum_modevent(module_t mod, modeventtype_t type, void *unused) } } #endif - cdevsw_remove(&vinum_cdevsw, 0, 0); + dev_ops_remove(&vinum_ops, 0, 0); log(LOG_INFO, "vinum: unloaded\n"); /* tell the world */ return 0; default: @@ -300,8 +300,9 @@ DECLARE_MODULE(vinum, vinum_mod, SI_SUB_RAID, SI_ORDER_MIDDLE); /* ARGSUSED */ /* Open a vinum object */ int -vinumopen(dev_t dev, int flags, int fmt, d_thread_t *td) +vinumopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int error; unsigned int index; struct volume *vol; @@ -385,7 +386,7 @@ vinumopen(dev_t dev, int flags, int fmt, d_thread_t *td) } case VINUM_SUPERDEV_TYPE: - error = suser(td); /* are we root? */ + error = suser_cred(ap->a_cred, 0); /* are we root? */ if (error == 0) { /* yes, can do */ if (devminor == VINUM_DAEMON_DEV) /* daemon device */ vinum_conf.flags |= VF_DAEMONOPEN; /* we're open */ @@ -406,8 +407,9 @@ vinumopen(dev_t dev, int flags, int fmt, d_thread_t *td) /* ARGSUSED */ int -vinumclose(dev_t dev, int flags, int fmt, d_thread_t *td) +vinumclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; unsigned int index; struct volume *vol; int devminor; @@ -484,28 +486,35 @@ vinumclose(dev_t dev, int flags, int fmt, d_thread_t *td) /* size routine */ int -vinumsize(dev_t dev) +vinumsize(struct dev_psize_args *ap) { + dev_t dev = ap->a_head.a_dev; struct volume *vol; - int size; vol = &VOL[Volno(dev)]; - if (vol->state == volume_up) - size = vol->size; - else - return 0; /* err on the size of conservatism */ - - return size; + if (vol->state == volume_up) { + ap->a_result = vol->size; + return(0); + } else { + return(ENXIO); + } } int -vinumdump(dev_t dev, u_int count, u_int blkno, u_int secsize) +vinumdump(struct dev_dump_args *ap) { /* Not implemented. */ return ENXIO; } +int +vinumpoll(struct dev_poll_args *ap) +{ + ap->a_events = seltrue(ap->a_head.a_dev, ap->a_events); + return(0); +} + /* Local Variables: */ /* fill-column: 50 */ /* End: */ diff --git a/sys/dev/raid/vinum/vinumext.h b/sys/dev/raid/vinum/vinumext.h index 3d365ce80e..f5dbb4aba3 100644 --- a/sys/dev/raid/vinum/vinumext.h +++ b/sys/dev/raid/vinum/vinumext.h @@ -35,7 +35,7 @@ * * $Id: vinumext.h,v 1.26 2000/05/16 07:38:08 grog Exp grog $ * $FreeBSD: src/sys/dev/vinum/vinumext.h,v 1.25.2.3 2001/05/11 02:11:06 grog Exp $ - * $DragonFly: src/sys/dev/raid/vinum/vinumext.h,v 1.7 2006/04/30 17:22:17 dillon Exp $ + * $DragonFly: src/sys/dev/raid/vinum/vinumext.h,v 1.8 2006/07/28 02:17:38 dillon Exp $ */ /* vinumext.h: external definitions */ @@ -138,6 +138,7 @@ d_strategy_t vinumstrategy; d_ioctl_t vinumioctl; d_dump_t vinumdump; d_psize_t vinumsize; +d_poll_t vinumpoll; int vinumstart(dev_t dev, struct bio *bio, int reviveok); int launch_requests(struct request *rq, int reviveok); @@ -147,7 +148,7 @@ void sdio(struct bio *bio); int vinumpart(dev_t); extern jmp_buf command_fail; /* return here if config fails */ -extern struct cdevsw vinum_cdevsw; +extern struct dev_ops vinum_ops; #ifdef VINUMDEBUG /* Memory allocation and request tracing */ diff --git a/sys/dev/raid/vinum/vinumio.c b/sys/dev/raid/vinum/vinumio.c index f919ee0a76..b9221f4d77 100644 --- a/sys/dev/raid/vinum/vinumio.c +++ b/sys/dev/raid/vinum/vinumio.c @@ -35,7 +35,7 @@ * * $Id: vinumio.c,v 1.30 2000/05/10 23:23:30 grog Exp grog $ * $FreeBSD: src/sys/dev/vinum/vinumio.c,v 1.52.2.6 2002/05/02 08:43:44 grog Exp $ - * $DragonFly: src/sys/dev/raid/vinum/vinumio.c,v 1.14 2006/04/30 20:23:21 dillon Exp $ + * $DragonFly: src/sys/dev/raid/vinum/vinumio.c,v 1.15 2006/07/28 02:17:38 dillon Exp $ */ #include "vinumhdr.h" @@ -138,7 +138,7 @@ open_drive(struct drive *drive, struct proc *p, int verbose) drive->dev->si_iosize_max = DFLTPHYS; if (dev_is_good(drive->dev)) - drive->lasterror = dev_dopen(drive->dev, FWRITE, 0, NULL); + drive->lasterror = dev_dopen(drive->dev, FWRITE, 0, proc0.p_ucred); else drive->lasterror = ENOENT; @@ -223,7 +223,7 @@ init_drive(struct drive *drive, int verbose) DIOCGPART, (caddr_t) & drive->partinfo, FREAD, - curthread); + proc0.p_ucred); if (drive->lasterror) { if (verbose) log(LOG_WARNING, @@ -269,7 +269,7 @@ close_locked_drive(struct drive *drive) * the queues, which spec_close() will try to * do. Get rid of them here first. */ - drive->lasterror = dev_dclose(drive->dev, 0, 0, NULL); + drive->lasterror = dev_dclose(drive->dev, 0, 0); drive->flags &= ~VF_OPEN; /* no longer open */ } @@ -667,7 +667,7 @@ daemon_save_config(void) DIOCWLABEL, (caddr_t) & wlabel_on, FWRITE, - curthread); + proc0.p_ucred); if (error == 0) error = write_drive(drive, (char *) vhdr, VINUMHEADERLEN, VINUM_LABEL_OFFSET); if (error == 0) @@ -680,7 +680,7 @@ daemon_save_config(void) DIOCWLABEL, (caddr_t) & wlabel_on, FWRITE, - curthread); + proc0.p_ucred); unlockdrive(drive); if (error) { log(LOG_ERR, @@ -793,7 +793,7 @@ write_volume_label(int volno) * unless it's already there. */ bp = geteblk((int) lp->d_secsize); /* get a buffer */ - dev = make_adhoc_dev(&vinum_cdevsw, vol->volno); + dev = make_adhoc_dev(&vinum_ops, vol->volno); bp->b_bio1.bio_offset = (off_t)LABELSECTOR * lp->d_secsize; bp->b_bcount = lp->d_secsize; bzero(bp->b_data, lp->d_secsize); diff --git a/sys/dev/raid/vinum/vinumioctl.c b/sys/dev/raid/vinum/vinumioctl.c index 359472e5c2..ff47693479 100644 --- a/sys/dev/raid/vinum/vinumioctl.c +++ b/sys/dev/raid/vinum/vinumioctl.c @@ -43,7 +43,7 @@ * * $Id: vinumioctl.c,v 1.14 2000/10/27 03:07:53 grog Exp grog $ * $FreeBSD: src/sys/dev/vinum/vinumioctl.c,v 1.25.2.4 2002/02/03 00:44:19 grog Exp $ - * $DragonFly: src/sys/dev/raid/vinum/vinumioctl.c,v 1.5 2003/11/15 21:05:42 dillon Exp $ + * $DragonFly: src/sys/dev/raid/vinum/vinumioctl.c,v 1.6 2006/07/28 02:17:38 dillon Exp $ */ #include "vinumhdr.h" @@ -63,8 +63,11 @@ jmp_buf command_fail; /* return on a failed command */ /* ioctl routine */ int -vinumioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) +vinumioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; unsigned int objno; int error = 0; struct sd *sd; @@ -405,7 +408,7 @@ vinumioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) return 0; /* not a titty */ case DIOCWLABEL: /* set or reset label writeable */ - if ((flag & FWRITE) == 0) /* not writeable? */ + if ((ap->a_fflag & FWRITE) == 0) /* not writeable? */ return EACCES; /* no, die */ if (*(int *) data != 0) /* set it? */ vol->flags |= VF_WLABEL; /* yes */ diff --git a/sys/dev/raid/vinum/vinumrequest.c b/sys/dev/raid/vinum/vinumrequest.c index c804c3e9bf..02450e73de 100644 --- a/sys/dev/raid/vinum/vinumrequest.c +++ b/sys/dev/raid/vinum/vinumrequest.c @@ -39,7 +39,7 @@ * * $Id: vinumrequest.c,v 1.30 2001/01/09 04:20:55 grog Exp grog $ * $FreeBSD: src/sys/dev/vinum/vinumrequest.c,v 1.44.2.5 2002/08/28 04:30:56 grog Exp $ - * $DragonFly: src/sys/dev/raid/vinum/vinumrequest.c,v 1.15 2006/07/09 22:55:45 corecode Exp $ + * $DragonFly: src/sys/dev/raid/vinum/vinumrequest.c,v 1.16 2006/07/28 02:17:38 dillon Exp $ */ #include "vinumhdr.h" @@ -122,9 +122,11 @@ logrq(enum rqinfo_type type, union rqinfou info, struct bio *ubio) #endif -void -vinumstrategy(dev_t dev, struct bio *bio) +int +vinumstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct bio *nbio = bio; struct volume *vol = NULL; @@ -135,18 +137,17 @@ vinumstrategy(dev_t dev, struct bio *bio) case VINUM_RAWSD_TYPE: bio->bio_driver_info = dev; sdio(bio); - return; - + break; + case VINUM_DRIVE_TYPE: + default: /* * In fact, vinum doesn't handle drives: they're * handled directly by the disk drivers */ - case VINUM_DRIVE_TYPE: - default: bp->b_error = EIO; /* I/O error */ bp->b_flags |= B_ERROR; biodone(bio); - return; + break; case VINUM_VOLUME_TYPE: /* volume I/O */ volno = Volno(dev); @@ -155,25 +156,26 @@ vinumstrategy(dev_t dev, struct bio *bio) bp->b_error = EIO; /* I/O error */ bp->b_flags |= B_ERROR; biodone(bio); - return; + break; } nbio = vinum_bounds_check(bio, vol); if (nbio == NULL) { biodone(bio); - return; + break; } /* FALLTHROUGH */ + case VINUM_PLEX_TYPE: + case VINUM_RAWPLEX_TYPE: /* * Plex I/O is pretty much the same as volume I/O * for a single plex. Indicate this by passing a NULL * pointer (set above) for the volume */ - case VINUM_PLEX_TYPE: - case VINUM_RAWPLEX_TYPE: bp->b_resid = bp->b_bcount; /* transfer everything */ vinumstart(dev, nbio, 0); - return; + break; } + return(0); } /* diff --git a/sys/dev/raid/vinum/vinumvar.h b/sys/dev/raid/vinum/vinumvar.h index c5a5587547..1c00dd4827 100644 --- a/sys/dev/raid/vinum/vinumvar.h +++ b/sys/dev/raid/vinum/vinumvar.h @@ -39,7 +39,7 @@ * * $Id: vinumvar.h,v 1.24 2000/03/01 02:34:57 grog Exp grog $ * $FreeBSD: src/sys/dev/vinum/vinumvar.h,v 1.32.2.4 2001/05/28 05:56:27 grog Exp $ - * $DragonFly: src/sys/dev/raid/vinum/vinumvar.h,v 1.7 2006/07/16 22:39:42 dillon Exp $ + * $DragonFly: src/sys/dev/raid/vinum/vinumvar.h,v 1.8 2006/07/28 02:17:38 dillon Exp $ */ #include @@ -113,16 +113,16 @@ enum constants { #ifdef _KERNEL #define VINUMDEV(v,p,s,t) \ - make_adhoc_dev (&vinum_cdevsw, VINUMMINOR (v, p, s, t)) + make_adhoc_dev (&vinum_ops, VINUMMINOR (v, p, s, t)) #define VINUM_PLEX(p) \ - make_adhoc_dev (&vinum_cdevsw, \ + make_adhoc_dev (&vinum_ops, \ (VINUM_RAWPLEX_TYPE << VINUM_TYPE_SHIFT) \ | (p & 0xff) \ | ((p & ~0xff) << 8) ) #define VINUM_SD(s) \ - make_adhoc_dev (&vinum_cdevsw, \ + make_adhoc_dev (&vinum_ops, \ (VINUM_RAWSD_TYPE << VINUM_TYPE_SHIFT) \ | (s & 0xff) \ | ((s & ~0xff) << 8) ) diff --git a/sys/dev/serial/cy/cy.c b/sys/dev/serial/cy/cy.c index efedc51e2a..8e5edcfd70 100644 --- a/sys/dev/serial/cy/cy.c +++ b/sys/dev/serial/cy/cy.c @@ -28,7 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/cy.c,v 1.97.2.2 2001/08/22 13:04:58 bde Exp $ - * $DragonFly: src/sys/dev/serial/cy/cy.c,v 1.19 2005/10/13 08:50:33 sephe Exp $ + * $DragonFly: src/sys/dev/serial/cy/cy.c,v 1.20 2006/07/28 02:17:38 dillon Exp $ */ #include "opt_compat.h" @@ -380,24 +380,15 @@ static d_write_t siowrite; static d_ioctl_t sioioctl; #define CDEV_MAJOR 48 -static struct cdevsw sio_cdevsw = { - /* name */ driver_name, - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ sioopen, - /* close */ sioclose, - /* read */ ttyread, - /* write */ siowrite, - /* ioctl */ sioioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops sio_ops = { + { driver_name, CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = sioopen, + .d_close = sioclose, + .d_read = ttyread, + .d_write = siowrite, + .d_ioctl = sioioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; static int comconsole = -1; @@ -624,23 +615,23 @@ cyattach_common(cy_iobase, cy_align) sio_registered = TRUE; } minorbase = UNIT_TO_MINOR(unit); - cdevsw_add(&sio_cdevsw, UNIT_TO_MINOR(-1), minorbase); - make_dev(&sio_cdevsw, minorbase, + dev_ops_add(&sio_ops, UNIT_TO_MINOR(-1), minorbase); + make_dev(&sio_ops, minorbase, UID_ROOT, GID_WHEEL, 0600, "ttyc%r%r", adapter, unit % CY_MAX_PORTS); - make_dev(&sio_cdevsw, minorbase | CONTROL_INIT_STATE, + make_dev(&sio_ops, minorbase | CONTROL_INIT_STATE, UID_ROOT, GID_WHEEL, 0600, "ttyic%r%r", adapter, unit % CY_MAX_PORTS); - make_dev(&sio_cdevsw, minorbase | CONTROL_LOCK_STATE, + make_dev(&sio_ops, minorbase | CONTROL_LOCK_STATE, UID_ROOT, GID_WHEEL, 0600, "ttylc%r%r", adapter, unit % CY_MAX_PORTS); - make_dev(&sio_cdevsw, minorbase | CALLOUT_MASK, + make_dev(&sio_ops, minorbase | CALLOUT_MASK, UID_UUCP, GID_DIALER, 0660, "cuac%r%r", adapter, unit % CY_MAX_PORTS); - make_dev(&sio_cdevsw, minorbase | CALLOUT_MASK | CONTROL_INIT_STATE, + make_dev(&sio_ops, minorbase | CALLOUT_MASK | CONTROL_INIT_STATE, UID_UUCP, GID_DIALER, 0660, "cuaic%r%r", adapter, unit % CY_MAX_PORTS); - make_dev(&sio_cdevsw, minorbase | CALLOUT_MASK | CONTROL_LOCK_STATE, + make_dev(&sio_ops, minorbase | CALLOUT_MASK | CONTROL_LOCK_STATE, UID_UUCP, GID_DIALER, 0660, "cualc%r%r", adapter, unit % CY_MAX_PORTS); @@ -655,8 +646,9 @@ cyattach_common(cy_iobase, cy_align) } static int -sioopen(dev_t dev, int flag, int mode, struct thread *td) +sioopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct com_s *com; int error; int mynor; @@ -698,7 +690,7 @@ open_top: } } else { if (com->active_out) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; goto out; } @@ -710,7 +702,7 @@ open_top: } } if (tp->t_state & TS_XCLUDE && - suser(td)) { + suser_cred(ap->a_cred, 0)) { error = EBUSY; goto out; } @@ -814,7 +806,7 @@ open_top: * Wait for DCD if necessary. */ if (!(tp->t_state & TS_CARR_ON) && !(mynor & CALLOUT_MASK) - && !(tp->t_cflag & CLOCAL) && !(flag & O_NONBLOCK)) { + && !(tp->t_cflag & CLOCAL) && !(ap->a_oflags & O_NONBLOCK)) { ++com->wopeners; error = tsleep(TSA_CARR_ON(tp), PCATCH, "cydcd", 0); --com->wopeners; @@ -835,8 +827,9 @@ out: } static int -sioclose(dev_t dev, int flag, int mode, struct thread *td) +sioclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct com_s *com; int mynor; struct tty *tp; @@ -848,7 +841,7 @@ sioclose(dev_t dev, int flag, int mode, struct thread *td) tp = com->tp; crit_enter(); cd_etc(com, CD1400_ETC_STOPBREAK); - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); disc_optim(tp, &tp->t_termios, com); comstop(tp, FREAD | FWRITE); comhardclose(com); @@ -942,11 +935,10 @@ comhardclose(com) } static int -siowrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +siowrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int mynor; struct tty *tp; int unit; @@ -971,7 +963,7 @@ siowrite(dev, uio, flag) * sessions are raw anyhow. */ #else - return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); + return ((*linesw[tp->t_line].l_write)(tp, uio, ap->a_ioflag)); #endif } @@ -1561,8 +1553,11 @@ siointr1(com) #endif static int -sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +sioioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; + u_long cmd = ap->a_cmd; struct com_s *com; int error; int mynor; @@ -1589,7 +1584,7 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } switch (cmd) { case TIOCSETA: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return (error); *ct = *(struct termios *)data; @@ -1639,11 +1634,12 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if (lt->c_ospeed != 0) dt->c_ospeed = tp->t_ospeed; } - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return (error); crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, cmd, data, ap->a_fflag); disc_optim(tp, &tp->t_termios, com); if (error != ENOIOCTL) { crit_exit(); @@ -1688,7 +1684,7 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; case TIOCMSDTRWAIT: /* must be root since the wait applies to following logins */ - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) { crit_exit(); return (error); diff --git a/sys/dev/serial/dgb/dgm.c b/sys/dev/serial/dgb/dgm.c index e876b2deb1..2f480d478a 100644 --- a/sys/dev/serial/dgb/dgm.c +++ b/sys/dev/serial/dgb/dgm.c @@ -1,6 +1,6 @@ /*- * $FreeBSD: src/sys/dev/dgb/dgm.c,v 1.31.2.3 2001/10/07 09:02:25 brian Exp $ - * $DragonFly: src/sys/dev/serial/dgb/dgm.c,v 1.12 2005/06/16 16:03:10 dillon Exp $ + * $DragonFly: src/sys/dev/serial/dgb/dgm.c,v 1.13 2006/07/28 02:17:38 dillon Exp $ * * This driver and the associated header files support the ISA PC/Xem * Digiboards. Its evolutionary roots are described below. @@ -241,24 +241,15 @@ static driver_t dgmdriver = { static devclass_t dgmdevclass; #define CDEV_MAJOR 101 -static struct cdevsw dgm_cdevsw = { - /* name */ "dgm", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ dgmopen, - /* close */ dgmclose, - /* read */ ttyread, - /* write */ ttywrite, - /* ioctl */ dgmioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops dgm_ops = { + { "dgm", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = dgmopen, + .d_close = dgmclose, + .d_read = ttyread, + .d_write = ttywrite, + .d_ioctl = dgmioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; static int @@ -791,7 +782,7 @@ dgmattach(device_t dev) else shrinkmem = 0; - cdevsw_add(&dgm_cdevsw, DGM_UNITMASK, DGM_UNIT(sc->unit)); + dev_ops_add(&dgm_ops, DGM_UNITMASK, DGM_UNIT(sc->unit)); for (i = 0; i < sc->numports; i++, bc++) { DPRINT3(DB_INFO, "dgm%d: Set up port %d\n", sc->unit, i); port = &sc->ports[i]; @@ -866,17 +857,17 @@ dgmattach(device_t dev) port->it_out = port->it_in; DPRINT3(DB_INFO, "dgm%d port %d: make devices\n", sc->unit, i); - make_dev(&dgm_cdevsw, (sc->unit*65536) + i, UID_ROOT, + make_dev(&dgm_ops, (sc->unit*65536) + i, UID_ROOT, GID_WHEEL, 0600, "ttyM%d%x", sc->unit, i + 0xa0); - make_dev(&dgm_cdevsw, sc->unit * 65536 + i + 64, UID_ROOT, + make_dev(&dgm_ops, sc->unit * 65536 + i + 64, UID_ROOT, GID_WHEEL, 0600, "ttyiM%d%x", sc->unit, i + 0xa0); - make_dev(&dgm_cdevsw, sc->unit * 65536 + i + 128, UID_ROOT, + make_dev(&dgm_ops, sc->unit * 65536 + i + 128, UID_ROOT, GID_WHEEL, 0600, "ttylM%d%x", sc->unit, i + 0xa0); - make_dev(&dgm_cdevsw, sc->unit * 65536 + i + 262144, UID_UUCP, + make_dev(&dgm_ops, sc->unit * 65536 + i + 262144, UID_UUCP, GID_DIALER, 0660, "cuaM%d%x", sc->unit, i + 0xa0); - make_dev(&dgm_cdevsw, sc->unit * 65536 + i + 262208, UID_UUCP, + make_dev(&dgm_ops, sc->unit * 65536 + i + 262208, UID_UUCP, GID_DIALER, 0660, "cuaiM%d%x", sc->unit, i + 0xa0); - make_dev(&dgm_cdevsw, sc->unit * 65536 + i + 262272, UID_UUCP, + make_dev(&dgm_ops, sc->unit * 65536 + i + 262272, UID_UUCP, GID_DIALER, 0660, "cualM%d%x", sc->unit, i + 0xa0); } @@ -906,11 +897,11 @@ dgmdetach(device_t dev) DPRINT2(DB_INFO, "dgm%d: detach\n", sc->unit); /* - * The cdevsw_remove() call will destroy all associated devices + * The dev_ops_remove() call will destroy all associated devices * and dereference any ad-hoc-created devices, but does not * dereference devices created via make_dev(). */ - cdevsw_remove(&dgm_cdevsw, DGM_UNITMASK, DGM_UNIT(sc->unit)); + dev_ops_remove(&dgm_ops, DGM_UNITMASK, DGM_UNIT(sc->unit)); callout_stop(&sc->toh); @@ -937,8 +928,9 @@ dgmshutdown(device_t dev) /* ARGSUSED */ static int -dgmopen(dev_t dev, int flag, int mode, struct thread *td) +dgmopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct dgm_softc *sc; struct tty *tp; int unit; @@ -1008,7 +1000,7 @@ open_top: goto out; } } else if (port->active_out) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; DPRINT4(DB_OPEN, "dgm%d: port%d:" " BUSY error = %d\n", unit, pnum, error); @@ -1023,7 +1015,7 @@ open_top: crit_exit(); goto open_top; } - if (tp->t_state & TS_XCLUDE && suser(td)) { + if (tp->t_state & TS_XCLUDE && suser_cred(ap->a_cred, 0)) { error = EBUSY; goto out; } @@ -1076,7 +1068,7 @@ open_top: * Wait for DCD if necessary. */ if (!(tp->t_state & TS_CARR_ON) && !(mynor & CALLOUT_MASK) - && !(tp->t_cflag & CLOCAL) && !(flag & O_NONBLOCK)) { + && !(tp->t_cflag & CLOCAL) && !(ap->a_oflags & O_NONBLOCK)) { ++port->wopeners; error = tsleep(TSA_CARR_ON(tp), PCATCH, "dgdcd", 0); --port->wopeners; @@ -1117,8 +1109,9 @@ out: /*ARGSUSED*/ static int -dgmclose(dev_t dev, int flag, int mode, struct thread *td) +dgmclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int mynor; struct tty *tp; int unit, pnum; @@ -1145,7 +1138,7 @@ dgmclose(dev_t dev, int flag, int mode, struct thread *td) port->closing = 1; DPRINT3(DB_CLOSE, "dgm%d: port%d: closing line disc\n", unit, pnum); - linesw[tp->t_line].l_close(tp, flag); + linesw[tp->t_line].l_close(tp, ap->a_fflag); disc_optim(tp, &tp->t_termios); DPRINT3(DB_CLOSE, "dgm%d: port%d: hard closing\n", unit, pnum); @@ -1487,8 +1480,11 @@ dgmpoll(void *unit_c) } static int -dgmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +dgmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; struct dgm_softc *sc; int unit, pnum; struct dgm_p *port; @@ -1529,7 +1525,7 @@ dgmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } switch (cmd) { case TIOCSETA: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return (error); *ct = *(struct termios *)data; @@ -1604,11 +1600,12 @@ dgmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if (cmd == TIOCSETAW || cmd == TIOCSETAF) port->mustdrain = 1; - error = linesw[tp->t_line].l_ioctl(tp, cmd, data, flag, td); + error = linesw[tp->t_line].l_ioctl(tp, cmd, data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return error; crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, cmd, data, ap->a_fflag); disc_optim(tp, &tp->t_termios); port->mustdrain = 0; if (error != ENOIOCTL) { @@ -1751,7 +1748,7 @@ dgmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; case TIOCMSDTRWAIT: /* must be root since the wait applies to following logins */ - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) { crit_exit(); return (error); diff --git a/sys/dev/serial/digi/digi.c b/sys/dev/serial/digi/digi.c index 462d4c689e..0b0257ddab 100644 --- a/sys/dev/serial/digi/digi.c +++ b/sys/dev/serial/digi/digi.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/digi/digi.c,v 1.36 2003/09/26 09:05:57 phk Exp $ - * $DragonFly: src/sys/dev/serial/digi/digi.c,v 1.4 2005/06/25 19:54:55 dillon Exp $ + * $DragonFly: src/sys/dev/serial/digi/digi.c,v 1.5 2006/07/28 02:17:38 dillon Exp $ */ /*- @@ -143,23 +143,15 @@ const struct digi_control_signals digi_normal_signals = { 0x02, 0x80, 0x20, 0x10, 0x40, 0x01 }; -static struct cdevsw digi_sw = { - /* name */ "dgm", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY, - /* port */ NULL, - /* clone */ NULL, - /* open */ digiopen, - /* close */ digiclose, - /* read */ digiread, - /* write */ digiwrite, - /* ioctl */ digiioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* stragety */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops digi_ops = { + { "dgm", CDEV_MAJOR, D_TTY }, + .d_open = digiopen, + .d_close = digiclose, + .d_read = digiread, + .d_write = digiwrite, + .d_ioctl = digiioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; static void @@ -628,21 +620,21 @@ digi_init(struct digi_softc *sc) port->it_out = port->it_in; port->send_ring = 1; /* Default action on signal RI */ - port->dev[0] = make_dev(&digi_sw, (sc->res.unit << 16) + i, + port->dev[0] = make_dev(&digi_ops, (sc->res.unit << 16) + i, UID_ROOT, GID_WHEEL, 0600, "ttyD%d.%d", sc->res.unit, i); - port->dev[1] = make_dev(&digi_sw, ((sc->res.unit << 16) + i) | + port->dev[1] = make_dev(&digi_ops, ((sc->res.unit << 16) + i) | CONTROL_INIT_STATE, UID_ROOT, GID_WHEEL, 0600, "ttyiD%d.%d", sc->res.unit, i); - port->dev[2] = make_dev(&digi_sw, ((sc->res.unit << 16) + i) | + port->dev[2] = make_dev(&digi_ops, ((sc->res.unit << 16) + i) | CONTROL_LOCK_STATE, UID_ROOT, GID_WHEEL, 0600, "ttylD%d.%d", sc->res.unit, i); - port->dev[3] = make_dev(&digi_sw, ((sc->res.unit << 16) + i) | + port->dev[3] = make_dev(&digi_ops, ((sc->res.unit << 16) + i) | CALLOUT_MASK, UID_UUCP, GID_DIALER, 0660, "cuaD%d.%d", sc->res.unit, i); - port->dev[4] = make_dev(&digi_sw, ((sc->res.unit << 16) + i) | + port->dev[4] = make_dev(&digi_ops, ((sc->res.unit << 16) + i) | CALLOUT_MASK | CONTROL_INIT_STATE, UID_UUCP, GID_DIALER, 0660, "cuaiD%d.%d", sc->res.unit, i); - port->dev[5] = make_dev(&digi_sw, ((sc->res.unit << 16) + i) | + port->dev[5] = make_dev(&digi_ops, ((sc->res.unit << 16) + i) | CALLOUT_MASK | CONTROL_LOCK_STATE, UID_UUCP, GID_DIALER, 0660, "cualD%d.%d", sc->res.unit, i); } @@ -717,8 +709,9 @@ digi_disc_optim(struct tty *tp, struct termios *t, struct digi_p *port) } static int -digiopen(dev_t dev, int flag, int mode, struct thread *td) +digiopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct digi_softc *sc; struct tty *tp; int unit; @@ -776,7 +769,7 @@ open_top: goto out; } } else if (port->active_out) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; DLOG(DIGIDB_OPEN, (sc->dev, "port %d: BUSY error = %d\n", pnum, error)); @@ -793,7 +786,7 @@ open_top: } goto open_top; } - if (tp->t_state & TS_XCLUDE && suser(td) != 0) { + if (tp->t_state & TS_XCLUDE && suser_cred(ap->a_cred, 0) != 0) { error = EBUSY; goto out; } @@ -845,7 +838,7 @@ open_top: /* Wait for DCD if necessary */ if (!(tp->t_state & TS_CARR_ON) && !(mynor & CALLOUT_MASK) && - !(tp->t_cflag & CLOCAL) && !(flag & O_NONBLOCK)) { + !(tp->t_cflag & CLOCAL) && !(ap->a_oflags & O_NONBLOCK)) { port->wopeners++; error = tsleep(TSA_CARR_ON(tp), PCATCH, "digidcd", 0); port->wopeners--; @@ -881,8 +874,9 @@ out: } static int -digiclose(dev_t dev, int flag, int mode, struct thread *td) +digiclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int mynor; struct tty *tp; int unit, pnum; @@ -907,7 +901,7 @@ digiclose(dev_t dev, int flag, int mode, struct thread *td) DLOG(DIGIDB_CLOSE, (sc->dev, "port %d: closing\n", pnum)); crit_enter(); - linesw[tp->t_line].l_close(tp, flag); + linesw[tp->t_line].l_close(tp, ap->a_fflag); digi_disc_optim(tp, &tp->t_termios, port); digistop(tp, FREAD | FWRITE); digihardclose(port); @@ -960,8 +954,9 @@ digihardclose(struct digi_p *port) } static int -digiread(dev_t dev, struct uio *uio, int flag) +digiread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; int mynor; struct tty *tp; int error, unit, pnum; @@ -978,7 +973,7 @@ digiread(dev_t dev, struct uio *uio, int flag) KASSERT(sc, ("digi%d: softc not allocated in digiclose\n", unit)); tp = &sc->ttys[pnum]; - error = linesw[tp->t_line].l_read(tp, uio, flag); + error = linesw[tp->t_line].l_read(tp, ap->a_uio, ap->a_ioflag); DLOG(DIGIDB_READ, (sc->dev, "port %d: read() returns %d\n", pnum, error)); @@ -986,8 +981,9 @@ digiread(dev_t dev, struct uio *uio, int flag) } static int -digiwrite(dev_t dev, struct uio *uio, int flag) +digiwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; int mynor; struct tty *tp; int error, unit, pnum; @@ -1004,7 +1000,7 @@ digiwrite(dev_t dev, struct uio *uio, int flag) KASSERT(sc, ("digi%d: softc not allocated in digiclose\n", unit)); tp = &sc->ttys[pnum]; - error = linesw[tp->t_line].l_write(tp, uio, flag); + error = linesw[tp->t_line].l_write(tp, ap->a_uio, ap->a_ioflag); DLOG(DIGIDB_WRITE, (sc->dev, "port %d: write() returns %d\n", pnum, error)); @@ -1056,8 +1052,11 @@ digi_loaddata(struct digi_softc *sc) } static int -digiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +digiioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; int unit, pnum, mynor, error; struct digi_softc *sc; struct digi_p *port; @@ -1130,7 +1129,7 @@ digiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) switch (cmd) { case TIOCSETA: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return (error); *ct = *(struct termios *)data; @@ -1251,14 +1250,15 @@ digiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if (lt->c_ospeed != 0) dt->c_ospeed = tp->t_ospeed; } - error = linesw[tp->t_line].l_ioctl(tp, cmd, data, flag, td); + error = linesw[tp->t_line].l_ioctl(tp, cmd, data, + ap->a_fflag, ap->a_cred); if (error == 0 && cmd == TIOCGETA) ((struct termios *)data)->c_iflag |= port->c_iflag; if (error >= 0 && error != ENOIOCTL) return (error); crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, cmd, data, ap->a_fflag); if (error == 0 && cmd == TIOCGETA) ((struct termios *)data)->c_iflag |= port->c_iflag; @@ -1301,7 +1301,7 @@ digiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) *(int *)data = digimctl(port, 0, DMGET); break; case TIOCMSDTRWAIT: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) { crit_exit(); return (error); @@ -1822,7 +1822,7 @@ digi_errortxt(int id) int digi_attach(struct digi_softc *sc) { - sc->res.ctldev = make_dev(&digi_sw, + sc->res.ctldev = make_dev(&digi_ops, (sc->res.unit << 16) | CTRL_DEV, UID_ROOT, GID_WHEEL, 0600, "digi%r.ctl", sc->res.unit); diff --git a/sys/dev/serial/rc/rc.c b/sys/dev/serial/rc/rc.c index 61d4702570..79b8056ff1 100644 --- a/sys/dev/serial/rc/rc.c +++ b/sys/dev/serial/rc/rc.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/rc.c,v 1.53.2.1 2001/02/26 04:23:10 jlemon Exp $ - * $DragonFly: src/sys/dev/serial/rc/rc.c,v 1.16 2005/10/13 00:02:41 dillon Exp $ + * $DragonFly: src/sys/dev/serial/rc/rc.c,v 1.17 2006/07/28 02:17:38 dillon Exp $ * */ @@ -91,24 +91,15 @@ static d_close_t rcclose; static d_ioctl_t rcioctl; #define CDEV_MAJOR 63 -static struct cdevsw rc_cdevsw = { - /* name */ "rc", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ rcopen, - /* close */ rcclose, - /* read */ ttyread, - /* write */ ttywrite, - /* ioctl */ rcioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops rc_ops = { + { "rc", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = rcopen, + .d_close = rcclose, + .d_read = ttyread, + .d_write = ttywrite, + .d_ioctl = rcioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; /* Per-board structure */ @@ -270,7 +261,7 @@ rcattach(dvp) } rcb->rcb_probed = RC_ATTACHED; if (!rc_started) { - cdevsw_add(&rc_cdevsw, -1, rcb->rcb_unit); + dev_ops_add(&rc_ops, -1, rcb->rcb_unit); register_swi(SWI_TTY, rcpoll, NULL, "rcpoll", NULL); callout_init(&rc_wakeup_ch); rc_wakeup(NULL); @@ -720,11 +711,9 @@ rc_stop(tp, rw) } static int -rcopen(dev, flag, mode, td) - dev_t dev; - int flag, mode; - struct thread *td; +rcopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct rc_chans *rc; struct tty *tp; int unit, nec, error = 0; @@ -757,7 +746,7 @@ again: } } else { if (rc->rc_flags & RC_ACTOUT) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; goto out; } @@ -768,7 +757,7 @@ again: } } if (tp->t_state & TS_XCLUDE && - suser(td)) { + suser_cred(ap->a_cred, 0)) { error = EBUSY; goto out; } @@ -792,7 +781,7 @@ again: (*linesw[tp->t_line].l_modem)(tp, 1); } if (!(tp->t_state & TS_CARR_ON) && !CALLOUT(dev) - && !(tp->t_cflag & CLOCAL) && !(flag & O_NONBLOCK)) { + && !(tp->t_cflag & CLOCAL) && !(ap->a_oflags & O_NONBLOCK)) { rc->rc_dcdwaits++; error = tsleep(TSA_CARR_ON(tp), PCATCH, "rcdcd", 0); rc->rc_dcdwaits--; @@ -814,11 +803,9 @@ out: } static int -rcclose(dev, flag, mode, td) - dev_t dev; - int flag, mode; - struct thread *td; +rcclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct rc_chans *rc; struct tty *tp; int unit = GET_UNIT(dev); @@ -831,7 +818,7 @@ rcclose(dev, flag, mode, td) printf("rc%d/%d: rcclose dev %x\n", rc->rc_rcb->rcb_unit, unit, dev); #endif crit_enter(); - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); disc_optim(tp, &tp->t_termios, rc); rc_stop(tp, FREAD | FWRITE); rc_hardclose(rc); @@ -1069,27 +1056,24 @@ struct rc_softc *rcb; } static int -rcioctl(dev, cmd, data, flag, td) -dev_t dev; -u_long cmd; -int flag; -caddr_t data; -struct thread *td; +rcioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct rc_chans *rc = &rc_chans[GET_UNIT(dev)]; int error; struct tty *tp = rc->rc_tp; - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return (error); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, ap->a_cmd, ap->a_data, ap->a_fflag); disc_optim(tp, &tp->t_termios, rc); if (error != ENOIOCTL) return (error); crit_enter(); - switch (cmd) { + switch (ap->a_cmd) { case TIOCSBRK: rc->rc_pendcmd = CD180_C_SBRK; break; @@ -1107,32 +1091,32 @@ struct thread *td; break; case TIOCMGET: - *(int *) data = rc_modctl(rc, 0, DMGET); + *(int *) ap->a_data = rc_modctl(rc, 0, DMGET); break; case TIOCMSET: - (void) rc_modctl(rc, *(int *) data, DMSET); + (void) rc_modctl(rc, *(int *) ap->a_data, DMSET); break; case TIOCMBIC: - (void) rc_modctl(rc, *(int *) data, DMBIC); + (void) rc_modctl(rc, *(int *) ap->a_data, DMBIC); break; case TIOCMBIS: - (void) rc_modctl(rc, *(int *) data, DMBIS); + (void) rc_modctl(rc, *(int *) ap->a_data, DMBIS); break; case TIOCMSDTRWAIT: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) { crit_exit(); return (error); } - rc->rc_dtrwait = *(int *)data * hz / 100; + rc->rc_dtrwait = *(int *)ap->a_data * hz / 100; break; case TIOCMGDTRWAIT: - *(int *)data = rc->rc_dtrwait * 100 / hz; + *(int *)ap->a_data = rc->rc_dtrwait * 100 / hz; break; default: diff --git a/sys/dev/serial/rp/rp.c b/sys/dev/serial/rp/rp.c index c9149f8c2e..6435d5b563 100644 --- a/sys/dev/serial/rp/rp.c +++ b/sys/dev/serial/rp/rp.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/rp/rp.c,v 1.45.2.2 2002/11/07 22:26:59 tegge Exp $ - * $DragonFly: src/sys/dev/serial/rp/rp.c,v 1.15 2005/12/11 01:54:09 swildner Exp $ + * $DragonFly: src/sys/dev/serial/rp/rp.c,v 1.16 2006/07/28 02:17:38 dillon Exp $ */ /* @@ -572,23 +572,14 @@ static d_write_t rpwrite; static d_ioctl_t rpioctl; #define CDEV_MAJOR 81 -struct cdevsw rp_cdevsw = { - /* name */ "rp", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY, - /* port */ NULL, - /* clone */ NULL, - - /* open */ rpopen, - /* close */ rpclose, - /* read */ ttyread, - /* write */ rpwrite, - /* ioctl */ rpioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +struct dev_ops rp_ops = { + { "rp", CDEV_MAJOR, D_TTY }, + .d_open = rpopen, + .d_close = rpclose, + .d_read = ttyread, + .d_write = rpwrite, + .d_ioctl = rpioctl, + .d_poll = ttypoll, }; static int rp_num_ports_open = 0; @@ -837,24 +828,24 @@ rp_attachcommon(CONTROLLER_T *ctlp, int num_aiops, int num_ports) rp_addr(unit) = rp; crit_exit(); - cdevsw_add(&rp_cdevsw, 0xffff0000, (unit + 1) << 16); + dev_ops_add(&rp_ops, 0xffff0000, (unit + 1) << 16); for (i = 0 ; i < rp_num_ports[unit] ; i++) { - make_dev(&rp_cdevsw, ((unit + 1) << 16) | i, + make_dev(&rp_ops, ((unit + 1) << 16) | i, UID_ROOT, GID_WHEEL, 0666, "ttyR%c", i <= 9 ? '0' + i : 'a' + i - 10); - make_dev(&rp_cdevsw, ((unit + 1) << 16) | i | 0x20, + make_dev(&rp_ops, ((unit + 1) << 16) | i | 0x20, UID_ROOT, GID_WHEEL, 0666, "ttyiR%c", i <= 9 ? '0' + i : 'a' + i - 10); - make_dev(&rp_cdevsw, ((unit + 1) << 16) | i | 0x40, + make_dev(&rp_ops, ((unit + 1) << 16) | i | 0x40, UID_ROOT, GID_WHEEL, 0666, "ttylR%c", i <= 9 ? '0' + i : 'a' + i - 10); - make_dev(&rp_cdevsw, ((unit + 1) << 16) | i | 0x80, + make_dev(&rp_ops, ((unit + 1) << 16) | i | 0x80, UID_ROOT, GID_WHEEL, 0666, "cuaR%c", i <= 9 ? '0' + i : 'a' + i - 10); - make_dev(&rp_cdevsw, ((unit + 1) << 16) | i | 0xa0, + make_dev(&rp_ops, ((unit + 1) << 16) | i | 0xa0, UID_ROOT, GID_WHEEL, 0666, "cuaiR%c", i <= 9 ? '0' + i : 'a' + i - 10); - make_dev(&rp_cdevsw, ((unit + 1) << 16) | i | 0xc0, + make_dev(&rp_ops, ((unit + 1) << 16) | i | 0xc0, UID_ROOT, GID_WHEEL, 0666, "cualR%c", i <= 9 ? '0' + i : 'a' + i - 10); } @@ -936,12 +927,13 @@ rp_releaseresource(CONTROLLER_t *ctlp) } if (ctlp->dev != NULL) ctlp->dev = NULL; - cdevsw_remove(&rp_cdevsw, 0xffff0000, (unit + 1) << 16); + dev_ops_remove(&rp_ops, 0xffff0000, (unit + 1) << 16); } int -rpopen(dev_t dev, int flag, int mode, d_thread_t *td) +rpopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct rp_port *rp; int unit, port, mynor, umynor, flags; /* SG */ struct tty *tp; @@ -985,7 +977,7 @@ open_top: } } else { if(rp->active_out) { - if(flag & O_NONBLOCK) { + if(ap->a_oflags & O_NONBLOCK) { error = EBUSY; goto out; } @@ -996,7 +988,7 @@ open_top: goto open_top; } } - if(tp->t_state & TS_XCLUDE && suser(td) != 0) { + if(tp->t_state & TS_XCLUDE && suser_cred(ap->a_cred, 0) != 0) { crit_exit(); error = EBUSY; goto out2; @@ -1070,7 +1062,7 @@ open_top: } - if(!(flag&O_NONBLOCK) && !(tp->t_cflag&CLOCAL) && + if(!(ap->a_oflags&O_NONBLOCK) && !(tp->t_cflag&CLOCAL) && !(tp->t_state & TS_CARR_ON) && !(IS_CALLOUT(dev))) { ++rp->wopeners; error = tsleep(TSA_CARR_ON(tp), PCATCH, "rpdcd", 0); @@ -1100,8 +1092,9 @@ out2: } int -rpclose(dev_t dev, int flag, int mode, d_thread_t *td) +rpclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit, mynor, umynor, port; /* SG */ struct rp_port *rp; struct tty *tp; @@ -1119,7 +1112,7 @@ rpclose(dev_t dev, int flag, int mode, d_thread_t *td) tp = rp->rp_tty; crit_enter(); - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); rp_disc_optim(tp, &tp->t_termios); rpstop(tp, FREAD | FWRITE); rphardclose(rp); @@ -1173,8 +1166,9 @@ rphardclose(struct rp_port *rp) static int -rpwrite(dev_t dev, struct uio *uio, int flag) +rpwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct rp_port *rp; struct tty *tp; int unit, mynor, port, umynor, error = 0; /* SG */ @@ -1195,7 +1189,7 @@ rpwrite(dev_t dev, struct uio *uio, int flag) return(error); } - error = (*linesw[tp->t_line].l_write)(tp, uio, flag); + error = (*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag); return error; } @@ -1210,8 +1204,11 @@ rpdtrwakeup(void *chan) } int -rpioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) +rpioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; struct rp_port *rp; CHANNEL_t *cp; struct tty *tp; @@ -1241,7 +1238,7 @@ rpioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) } switch (cmd) { case TIOCSETA: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if(error != 0) return(error); *ct = *(struct termios *)data; @@ -1298,7 +1295,8 @@ rpioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) t = &tp->t_termios; - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, + ap->a_fflag, ap->a_cred); if(error != ENOIOCTL) { return(error); } @@ -1306,7 +1304,7 @@ rpioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) flags = rp->rp_channel.TxControl[3]; - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, cmd, data, ap->a_fflag); flags = rp->rp_channel.TxControl[3]; rp_disc_optim(tp, &tp->t_termios); if(error != ENOIOCTL) { @@ -1386,7 +1384,7 @@ rpioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) *(int *)data = result; break; case TIOCMSDTRWAIT: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if(error != 0) { crit_exit(); return(error); diff --git a/sys/dev/serial/si/si.c b/sys/dev/serial/si/si.c index cb2a12d64a..830c1f0eea 100644 --- a/sys/dev/serial/si/si.c +++ b/sys/dev/serial/si/si.c @@ -31,7 +31,7 @@ * NO EVENT SHALL THE AUTHORS BE LIABLE. * * $FreeBSD: src/sys/dev/si/si.c,v 1.101.2.1 2001/02/26 04:23:06 jlemon Exp $ - * $DragonFly: src/sys/dev/serial/si/si.c,v 1.15 2005/06/08 08:25:50 okumoto Exp $ + * $DragonFly: src/sys/dev/serial/si/si.c,v 1.16 2006/07/28 02:17:38 dillon Exp $ */ #ifndef lint @@ -97,7 +97,7 @@ enum si_mctl { GET, SET, BIS, BIC }; static void si_command(struct si_port *, int, int); static int si_modem(struct si_port *, enum si_mctl, int); static void si_write_enable(struct si_port *, int); -static int si_Sioctl(dev_t, u_long, caddr_t, int, struct thread *); +static int si_Sioctl(dev_t, u_long, caddr_t, int, struct ucred *); static void si_start(struct tty *); static void si_stop(struct tty *, int); static timeout_t si_lstart; @@ -120,24 +120,15 @@ static d_write_t siwrite; static d_ioctl_t siioctl; #define CDEV_MAJOR 68 -static struct cdevsw si_cdevsw = { - /* name */ "si", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ siopen, - /* close */ siclose, - /* read */ ttyread, - /* write */ siwrite, - /* ioctl */ siioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops si_ops = { + { "si", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = siopen, + .d_close = siclose, + .d_read = ttyread, + .d_write = siwrite, + .d_ioctl = siioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; static int si_Nports; @@ -609,25 +600,26 @@ try_next2: done_chartimes = 1; } - cdevsw_add(&si_cdevsw, 0x7f, unit); + dev_ops_add(&si_ops, 0x7f, unit); /* path name devsw minor type uid gid perm*/ for (x = 0; x < sc->sc_nport; x++) { /* sync with the manuals that start at 1 */ y = x + 1 + unit * (1 << SI_CARDSHIFT); - make_dev(&si_cdevsw, x, 0, 0, 0600, "ttyA%02d", y); - make_dev(&si_cdevsw, x + 0x00080, 0, 0, 0600, "cuaA%02d", y); - make_dev(&si_cdevsw, x + 0x10000, 0, 0, 0600, "ttyiA%02d", y); - make_dev(&si_cdevsw, x + 0x10080, 0, 0, 0600, "cuaiA%02d", y); - make_dev(&si_cdevsw, x + 0x20000, 0, 0, 0600, "ttylA%02d", y); - make_dev(&si_cdevsw, x + 0x20080, 0, 0, 0600, "cualA%02d", y); + make_dev(&si_ops, x, 0, 0, 0600, "ttyA%02d", y); + make_dev(&si_ops, x + 0x00080, 0, 0, 0600, "cuaA%02d", y); + make_dev(&si_ops, x + 0x10000, 0, 0, 0600, "ttyiA%02d", y); + make_dev(&si_ops, x + 0x10080, 0, 0, 0600, "cuaiA%02d", y); + make_dev(&si_ops, x + 0x20000, 0, 0, 0600, "ttylA%02d", y); + make_dev(&si_ops, x + 0x20080, 0, 0, 0600, "cualA%02d", y); } - make_dev(&si_cdevsw, 0x40000, 0, 0, 0600, "si_control"); + make_dev(&si_ops, 0x40000, 0, 0, 0600, "si_control"); return (0); } static int -siopen(dev_t dev, int flag, int mode, struct thread *td) +siopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int error; int card, port; struct si_softc *sc; @@ -638,7 +630,7 @@ siopen(dev_t dev, int flag, int mode, struct thread *td) /* quickly let in /dev/si_control */ if (IS_CONTROLDEV(mynor)) { - if ((error = suser(td))) + if ((error = suser_cred(ap->a_cred, 0))) return(error); return(0); } @@ -680,8 +672,8 @@ siopen(dev_t dev, int flag, int mode, struct thread *td) tp = pp->sp_tty; /* the "real" tty */ dev->si_tty = tp; ccbp = pp->sp_ccb; /* Find control block */ - DPRINT((pp, DBG_ENTRY|DBG_OPEN, "siopen(%s,%x,%x,%x)\n", - devtoname(dev), flag, mode, td)); + DPRINT((pp, DBG_ENTRY|DBG_OPEN, "siopen(%s,%x,%x)\n", + devtoname(dev), ap->a_oflags, ap->a_devtype)); crit_enter(); /* Keep others out */ error = 0; @@ -705,7 +697,7 @@ open_top: } } else { if (pp->sp_active_out) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; goto out; } @@ -717,7 +709,7 @@ open_top: } } if (tp->t_state & TS_XCLUDE && - suser(td)) { + suser_cred(ap->a_cred, 0)) { DPRINT((pp, DBG_OPEN|DBG_FAIL, "already open and EXCLUSIVE set\n")); error = EBUSY; @@ -766,7 +758,7 @@ open_top: if (!(tp->t_state & TS_CARR_ON) && !IS_CALLOUT(mynor) && !(tp->t_cflag & CLOCAL) && - !(flag & O_NONBLOCK)) { + !(ap->a_oflags & O_NONBLOCK)) { ++pp->sp_wopeners; DPRINT((pp, DBG_OPEN, "sleeping for carrier\n")); error = tsleep(TSA_CARR_ON(tp), PCATCH, "sidcd", 0); @@ -795,8 +787,9 @@ out: } static int -siclose(dev_t dev, int flag, int mode, struct thread *td) +siclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct si_port *pp; struct tty *tp; int error = 0; @@ -810,8 +803,8 @@ siclose(dev_t dev, int flag, int mode, struct thread *td) pp = MINOR2PP(mynor); tp = pp->sp_tty; - DPRINT((pp, DBG_ENTRY|DBG_CLOSE, "siclose(%s,%x,%x,%x) sp_state:%x\n", - devtoname(dev), flag, mode, td, pp->sp_state)); + DPRINT((pp, DBG_ENTRY|DBG_CLOSE, "siclose(%s,%x,%x) sp_state:%x\n", + devtoname(dev), ap->a_fflag, ap->a_devtype, pp->sp_state)); /* did we sleep and loose a race? */ if (pp->sp_state & SS_CLOSING) { @@ -825,7 +818,7 @@ siclose(dev_t dev, int flag, int mode, struct thread *td) si_write_enable(pp, 0); /* block writes for ttywait() */ /* THIS MAY SLEEP IN TTYWAIT!!! */ - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); si_write_enable(pp, 1); @@ -905,8 +898,9 @@ sidtrwakeup(void *chan) } static int -siwrite(dev_t dev, struct uio *uio, int flag) +siwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct si_port *pp; struct tty *tp; int error = 0; @@ -918,7 +912,7 @@ siwrite(dev_t dev, struct uio *uio, int flag) } pp = MINOR2PP(mynor); tp = pp->sp_tty; - DPRINT((pp, DBG_WRITE, "siwrite(%s,%x,%x)\n", devtoname(dev), uio, flag)); + DPRINT((pp, DBG_WRITE, "siwrite(%s,%x,%x)\n", devtoname(dev), ap->a_uio, ap->a_ioflag)); crit_enter(); /* @@ -935,7 +929,7 @@ siwrite(dev_t dev, struct uio *uio, int flag) } } - error = (*linesw[tp->t_line].l_write)(tp, uio, flag); + error = (*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag); out: crit_exit(); return (error); @@ -943,8 +937,11 @@ out: static int -siioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +siioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; + u_long cmd = ap->a_cmd; struct si_port *pp; struct tty *tp; int error; @@ -956,13 +953,13 @@ siioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) #endif if (IS_SI_IOCTL(cmd)) - return(si_Sioctl(dev, cmd, data, flag, td)); + return(si_Sioctl(dev, cmd, data, ap->a_fflag, ap->a_cred)); pp = MINOR2PP(mynor); tp = pp->sp_tty; DPRINT((pp, DBG_ENTRY|DBG_IOCTL, "siioctl(%s,%lx,%x,%x)\n", - devtoname(dev), cmd, data, flag)); + devtoname(dev), cmd, data, ap->a_fflag)); if (IS_STATE(mynor)) { struct termios *ct; @@ -978,7 +975,7 @@ siioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } switch (cmd) { case TIOCSETA: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return (error); *ct = *(struct termios *)data; @@ -1050,13 +1047,14 @@ siioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) si_write_enable(pp, 0); } - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) goto out; crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, cmd, data, ap->a_fflag); si_disc_optim(tp, &tp->t_termios, pp); if (error != ENOIOCTL) { crit_exit(); @@ -1091,7 +1089,7 @@ siioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; case TIOCMSDTRWAIT: /* must be root since the wait applies to following logins */ - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error == 0) pp->sp_dtr_wait = *(int *)data * hz / 100; break; @@ -1114,7 +1112,7 @@ out: * Handle the Specialix ioctls. All MUST be called via the CONTROL device */ static int -si_Sioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +si_Sioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct ucred *cred) { struct si_softc *xsc; struct si_port *xpp; @@ -1143,7 +1141,7 @@ si_Sioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) ip = (int *)data; -#define SUCHECK if ((error = suser(td))) goto out +#define SUCHECK if ((error = suser_cred(cred, 0))) goto out switch (cmd) { case TCSIPORTS: diff --git a/sys/dev/serial/sio/sio.c b/sys/dev/serial/sio/sio.c index cfd35e11ee..9b8761e1b0 100644 --- a/sys/dev/serial/sio/sio.c +++ b/sys/dev/serial/sio/sio.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/isa/sio.c,v 1.291.2.35 2003/05/18 08:51:15 murray Exp $ - * $DragonFly: src/sys/dev/serial/sio/sio.c,v 1.31 2005/10/13 00:02:42 dillon Exp $ + * $DragonFly: src/sys/dev/serial/sio/sio.c,v 1.32 2006/07/28 02:17:38 dillon Exp $ * from: @(#)com.c 7.5 (Berkeley) 5/16/91 * from: i386/isa sio.c,v 1.234 */ @@ -252,24 +252,15 @@ static d_write_t siowrite; static d_ioctl_t sioioctl; #define CDEV_MAJOR 28 -static struct cdevsw sio_cdevsw = { - /* name */ driver_name, - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ sioopen, - /* close */ sioclose, - /* read */ sioread, - /* write */ siowrite, - /* ioctl */ sioioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops sio_ops = { + { driver_name, CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = sioopen, + .d_close = sioclose, + .d_read = sioread, + .d_write = siowrite, + .d_ioctl = sioioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; int comconsole = -1; @@ -1203,18 +1194,18 @@ determined_type: ; sio_registered = TRUE; } minorbase = UNIT_TO_MINOR(unit); - cdevsw_add(&sio_cdevsw, UNIT_TO_MINOR(-1), minorbase); - make_dev(&sio_cdevsw, minorbase, + dev_ops_add(&sio_ops, UNIT_TO_MINOR(-1), minorbase); + make_dev(&sio_ops, minorbase, UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); - make_dev(&sio_cdevsw, minorbase | CONTROL_INIT_STATE, + make_dev(&sio_ops, minorbase | CONTROL_INIT_STATE, UID_ROOT, GID_WHEEL, 0600, "ttyid%r", unit); - make_dev(&sio_cdevsw, minorbase | CONTROL_LOCK_STATE, + make_dev(&sio_ops, minorbase | CONTROL_LOCK_STATE, UID_ROOT, GID_WHEEL, 0600, "ttyld%r", unit); - make_dev(&sio_cdevsw, minorbase | CALLOUT_MASK, + make_dev(&sio_ops, minorbase | CALLOUT_MASK, UID_UUCP, GID_DIALER, 0660, "cuaa%r", unit); - make_dev(&sio_cdevsw, minorbase | CALLOUT_MASK | CONTROL_INIT_STATE, + make_dev(&sio_ops, minorbase | CALLOUT_MASK | CONTROL_INIT_STATE, UID_UUCP, GID_DIALER, 0660, "cuaia%r", unit); - make_dev(&sio_cdevsw, minorbase | CALLOUT_MASK | CONTROL_LOCK_STATE, + make_dev(&sio_ops, minorbase | CALLOUT_MASK | CONTROL_LOCK_STATE, UID_UUCP, GID_DIALER, 0660, "cuala%r", unit); com->flags = flags; com->pps.ppscap = PPS_CAPTUREASSERT | PPS_CAPTURECLEAR; @@ -1252,8 +1243,9 @@ determined_type: ; } static int -sioopen(dev_t dev, int flag, int mode, struct thread *td) +sioopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct com_s *com; int error; int mynor; @@ -1297,7 +1289,7 @@ open_top: } } else { if (com->active_out) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; goto out; } @@ -1312,7 +1304,7 @@ open_top: goto open_top; } } - if (tp->t_state & TS_XCLUDE && suser(td)) { + if (tp->t_state & TS_XCLUDE && suser_cred(ap->a_cred, 0)) { error = EBUSY; goto out; } @@ -1409,7 +1401,7 @@ open_top: * Wait for DCD if necessary. */ if (!(tp->t_state & TS_CARR_ON) && !(mynor & CALLOUT_MASK) - && !(tp->t_cflag & CLOCAL) && !(flag & O_NONBLOCK)) { + && !(tp->t_cflag & CLOCAL) && !(ap->a_oflags & O_NONBLOCK)) { ++com->wopeners; error = tsleep(TSA_CARR_ON(tp), PCATCH, "siodcd", 0); if (com_addr(unit) == NULL) { @@ -1434,8 +1426,9 @@ out: } static int -sioclose(dev_t dev, int flag, int mode, struct thread *td) +sioclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct com_s *com; int mynor; struct tty *tp; @@ -1448,7 +1441,7 @@ sioclose(dev_t dev, int flag, int mode, struct thread *td) return (ENODEV); tp = com->tp; crit_enter(); - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); disc_optim(tp, &tp->t_termios, com); comstop(tp, FREAD | FWRITE); comhardclose(com); @@ -1529,11 +1522,9 @@ comhardclose(com) } static int -sioread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +sioread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; int mynor; struct com_s *com; @@ -1543,15 +1534,13 @@ sioread(dev, uio, flag) com = com_addr(MINOR_TO_UNIT(mynor)); if (com == NULL || com->gone) return (ENODEV); - return ((*linesw[com->tp->t_line].l_read)(com->tp, uio, flag)); + return ((*linesw[com->tp->t_line].l_read)(com->tp, ap->a_uio, ap->a_ioflag)); } static int -siowrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +siowrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; int mynor; struct com_s *com; int unit; @@ -1572,7 +1561,7 @@ siowrite(dev, uio, flag) */ if (constty != NULL && unit == comconsole) constty = NULL; - return ((*linesw[com->tp->t_line].l_write)(com->tp, uio, flag)); + return ((*linesw[com->tp->t_line].l_write)(com->tp, ap->a_uio, ap->a_ioflag)); } static void @@ -1985,8 +1974,10 @@ cont: } static int -sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +sioioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; struct com_s *com; int error; int mynor; @@ -2013,9 +2004,9 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) default: return (ENODEV); /* /dev/nodev */ } - switch (cmd) { + switch (ap->a_cmd) { case TIOCSETA: - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) return (error); *ct = *(struct termios *)data; @@ -2036,14 +2027,15 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) tp = com->tp; #if defined(COMPAT_43) || defined(COMPAT_SUNOS) term = tp->t_termios; - oldcmd = cmd; - error = ttsetcompat(tp, &cmd, data, &term); + oldcmd = ap->a_cmd; + error = ttsetcompat(tp, &ap->a_cmd, data, &term); if (error != 0) return (error); - if (cmd != oldcmd) + if (ap->a_cmd != oldcmd) data = (caddr_t)&term; #endif - if (cmd == TIOCSETA || cmd == TIOCSETAW || cmd == TIOCSETAF) { + if (ap->a_cmd == TIOCSETA || ap->a_cmd == TIOCSETAW || + ap->a_cmd == TIOCSETAF) { int cc; struct termios *dt = (struct termios *)data; struct termios *lt = mynor & CALLOUT_MASK @@ -2065,17 +2057,17 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if (lt->c_ospeed != 0) dt->c_ospeed = tp->t_ospeed; } - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, ap->a_cmd, data, ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return (error); crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, ap->a_cmd, data, ap->a_fflag); disc_optim(tp, &tp->t_termios, com); if (error != ENOIOCTL) { crit_exit(); return (error); } - switch (cmd) { + switch (ap->a_cmd) { case TIOCSBRK: sio_setreg(com, com_cfcr, com->cfcr_image |= CFCR_SBREAK); break; @@ -2106,7 +2098,7 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; case TIOCMSDTRWAIT: /* must be root since the wait applies to following logins */ - error = suser(td); + error = suser_cred(ap->a_cred, 0); if (error != 0) { crit_exit(); return (error); @@ -2126,7 +2118,7 @@ sioioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; default: crit_exit(); - error = pps_ioctl(cmd, data, &com->pps); + error = pps_ioctl(ap->a_cmd, data, &com->pps); if (error == ENODEV) error = ENOTTY; return (error); @@ -2983,7 +2975,7 @@ siocnprobe(cp) crit_exit(); if (COM_CONSOLE(flags) && !COM_LLCONSOLE(flags)) { - cp->cn_dev = make_dev(&sio_cdevsw, unit, + cp->cn_dev = make_dev(&sio_ops, unit, UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); cp->cn_pri = COM_FORCECONSOLE(flags) @@ -2997,7 +2989,7 @@ siocnprobe(cp) siogdbiobase = iobase; siogdbunit = unit; #if DDB > 0 - gdbdev = make_dev(&sio_cdevsw, unit, + gdbdev = make_dev(&sio_ops, unit, UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); gdb_getc = siocngetc; @@ -3020,7 +3012,7 @@ siocnprobe(cp) printf("configuration file (currently sio only).\n"); siogdbiobase = siocniobase; siogdbunit = siocnunit; - gdbdev = make_dev(&sio_cdevsw, siocnunit, + gdbdev = make_dev(&sio_ops, siocnunit, UID_ROOT, GID_WHEEL, 0600, "ttyd%r", siocnunit); gdb_getc = siocngetc; diff --git a/sys/dev/serial/stl/stallion.c b/sys/dev/serial/stl/stallion.c index 81bb142f63..9914782ad3 100644 --- a/sys/dev/serial/stl/stallion.c +++ b/sys/dev/serial/stl/stallion.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/stallion.c,v 1.39.2.2 2001/08/30 12:29:57 murray Exp $ - * $DragonFly: src/sys/dev/serial/stl/stallion.c,v 1.17 2005/10/27 13:33:19 sephe Exp $ + * $DragonFly: src/sys/dev/serial/stl/stallion.c,v 1.18 2006/07/28 02:17:38 dillon Exp $ */ /*****************************************************************************/ @@ -507,7 +507,7 @@ static void stl_echmcaintr(stlbrd_t *brdp); static void stl_echpciintr(stlbrd_t *brdp); static void stl_echpci64intr(stlbrd_t *brdp); static int stl_memioctl(dev_t dev, unsigned long cmd, caddr_t data, - int flag, struct thread *td); + int flag); static int stl_getbrdstats(caddr_t data); static int stl_getportstats(stlport_t *portp, caddr_t data); static int stl_clrportstats(stlport_t *portp, caddr_t data); @@ -748,24 +748,15 @@ COMPAT_PCI_DRIVER (stlpci, stlpcidriver); */ #define CDEV_MAJOR 72 -static struct cdevsw stl_cdevsw = { - /* name */ "stl", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ stlopen, - /* close */ stlclose, - /* read */ ttyread, - /* write */ ttywrite, - /* ioctl */ stlioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops stl_ops = { + { "stl", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = stlopen, + .d_close = stlclose, + .d_read = ttyread, + .d_write = ttywrite, + .d_ioctl = stlioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; static void stl_drvinit(void *unused) @@ -875,95 +866,95 @@ static int stlattach(struct isa_device *idp) /* register devices for DEVFS */ boardnr = brdp->brdnr; - cdevsw_add(&stl_cdevsw, 31, boardnr); - make_dev(&stl_cdevsw, boardnr + 0x1000000, UID_ROOT, GID_WHEEL, + dev_ops_add(&stl_ops, 31, boardnr); + make_dev(&stl_ops, boardnr + 0x1000000, UID_ROOT, GID_WHEEL, 0600, "staliomem%d", boardnr); for (portnr = 0, minor_dev = boardnr * 0x100000; portnr < 32; portnr++, minor_dev++) { /* hw ports */ - make_dev(&stl_cdevsw, minor_dev, + make_dev(&stl_ops, minor_dev, UID_ROOT, GID_WHEEL, 0600, "ttyE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 32, + make_dev(&stl_ops, minor_dev + 32, UID_ROOT, GID_WHEEL, 0600, "ttyiE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 64, + make_dev(&stl_ops, minor_dev + 64, UID_ROOT, GID_WHEEL, 0600, "ttylE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 128, + make_dev(&stl_ops, minor_dev + 128, UID_ROOT, GID_WHEEL, 0600, "cue%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 160, + make_dev(&stl_ops, minor_dev + 160, UID_ROOT, GID_WHEEL, 0600, "cuie%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 192, + make_dev(&stl_ops, minor_dev + 192, UID_ROOT, GID_WHEEL, 0600, "cule%d", portnr + (boardnr * 64)); /* sw ports */ - make_dev(&stl_cdevsw, minor_dev + 0x10000, + make_dev(&stl_ops, minor_dev + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttyE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 32 + 0x10000, + make_dev(&stl_ops, minor_dev + 32 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttyiE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 64 + 0x10000, + make_dev(&stl_ops, minor_dev + 64 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttylE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 128 + 0x10000, + make_dev(&stl_ops, minor_dev + 128 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cue%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 160 + 0x10000, + make_dev(&stl_ops, minor_dev + 160 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cuie%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 192 + 0x10000, + make_dev(&stl_ops, minor_dev + 192 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cule%d", portnr + (boardnr * 64) + 32); } boardnr = brdp->brdnr; - make_dev(&stl_cdevsw, boardnr + 0x1000000, UID_ROOT, GID_WHEEL, + make_dev(&stl_ops, boardnr + 0x1000000, UID_ROOT, GID_WHEEL, 0600, "staliomem%d", boardnr); for (portnr = 0, minor_dev = boardnr * 0x100000; portnr < 32; portnr++, minor_dev++) { /* hw ports */ - make_dev(&stl_cdevsw, minor_dev, + make_dev(&stl_ops, minor_dev, UID_ROOT, GID_WHEEL, 0600, "ttyE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 32, + make_dev(&stl_ops, minor_dev + 32, UID_ROOT, GID_WHEEL, 0600, "ttyiE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 64, + make_dev(&stl_ops, minor_dev + 64, UID_ROOT, GID_WHEEL, 0600, "ttylE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 128, + make_dev(&stl_ops, minor_dev + 128, UID_ROOT, GID_WHEEL, 0600, "cue%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 160, + make_dev(&stl_ops, minor_dev + 160, UID_ROOT, GID_WHEEL, 0600, "cuie%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 192, + make_dev(&stl_ops, minor_dev + 192, UID_ROOT, GID_WHEEL, 0600, "cule%d", portnr + (boardnr * 64)); /* sw ports */ - make_dev(&stl_cdevsw, minor_dev + 0x10000, + make_dev(&stl_ops, minor_dev + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttyE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 32 + 0x10000, + make_dev(&stl_ops, minor_dev + 32 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttyiE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 64 + 0x10000, + make_dev(&stl_ops, minor_dev + 64 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttylE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 128 + 0x10000, + make_dev(&stl_ops, minor_dev + 128 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cue%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 160 + 0x10000, + make_dev(&stl_ops, minor_dev + 160 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cuie%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 192 + 0x10000, + make_dev(&stl_ops, minor_dev + 192 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cule%d", portnr + (boardnr * 64) + 32); } @@ -1097,48 +1088,48 @@ void stlpciattach(pcici_t tag, int unit) /* register devices for DEVFS */ boardnr = brdp->brdnr; - make_dev(&stl_cdevsw, boardnr + 0x1000000, UID_ROOT, GID_WHEEL, + make_dev(&stl_ops, boardnr + 0x1000000, UID_ROOT, GID_WHEEL, 0600, "staliomem%d", boardnr); for (portnr = 0, minor_dev = boardnr * 0x100000; portnr < 32; portnr++, minor_dev++) { /* hw ports */ - make_dev(&stl_cdevsw, minor_dev, + make_dev(&stl_ops, minor_dev, UID_ROOT, GID_WHEEL, 0600, "ttyE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 32, + make_dev(&stl_ops, minor_dev + 32, UID_ROOT, GID_WHEEL, 0600, "ttyiE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 64, + make_dev(&stl_ops, minor_dev + 64, UID_ROOT, GID_WHEEL, 0600, "ttylE%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 128, + make_dev(&stl_ops, minor_dev + 128, UID_ROOT, GID_WHEEL, 0600, "cue%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 160, + make_dev(&stl_ops, minor_dev + 160, UID_ROOT, GID_WHEEL, 0600, "cuie%d", portnr + (boardnr * 64)); - make_dev(&stl_cdevsw, minor_dev + 192, + make_dev(&stl_ops, minor_dev + 192, UID_ROOT, GID_WHEEL, 0600, "cule%d", portnr + (boardnr * 64)); /* sw ports */ - make_dev(&stl_cdevsw, minor_dev + 0x10000, + make_dev(&stl_ops, minor_dev + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttyE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 32 + 0x10000, + make_dev(&stl_ops, minor_dev + 32 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttyiE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 64 + 0x10000, + make_dev(&stl_ops, minor_dev + 64 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "ttylE%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 128 + 0x10000, + make_dev(&stl_ops, minor_dev + 128 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cue%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 160 + 0x10000, + make_dev(&stl_ops, minor_dev + 160 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cuie%d", portnr + (boardnr * 64) + 32); - make_dev(&stl_cdevsw, minor_dev + 192 + 0x10000, + make_dev(&stl_ops, minor_dev + 192 + 0x10000, UID_ROOT, GID_WHEEL, 0600, "cule%d", portnr + (boardnr * 64) + 32); } @@ -1148,8 +1139,9 @@ void stlpciattach(pcici_t tag, int unit) /*****************************************************************************/ -STATIC int stlopen(dev_t dev, int flag, int mode, struct thread *td) +STATIC int stlopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; stlport_t *portp; int error, callout; @@ -1211,7 +1203,7 @@ stlopen_restart: } } else { if (portp->callout != 0) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; goto stlopen_end; } @@ -1222,7 +1214,7 @@ stlopen_restart: goto stlopen_restart; } } - if ((tp->t_state & TS_XCLUDE) && suser(td)) { + if ((tp->t_state & TS_XCLUDE) && suser_cred(ap->a_cred, 0)) { error = EBUSY; goto stlopen_end; } @@ -1234,7 +1226,7 @@ stlopen_restart: */ if (((tp->t_state & TS_CARR_ON) == 0) && !callout && ((tp->t_cflag & CLOCAL) == 0) && - ((flag & O_NONBLOCK) == 0)) { + ((ap->a_oflags & O_NONBLOCK) == 0)) { portp->waitopens++; error = tsleep(TSA_CARR_ON(tp), PCATCH, "stldcd", 0); portp->waitopens--; @@ -1266,8 +1258,9 @@ stlopen_end: /*****************************************************************************/ -STATIC int stlclose(dev_t dev, int flag, int mode, struct thread *td) +STATIC int stlclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; stlport_t *portp; @@ -1287,7 +1280,7 @@ STATIC int stlclose(dev_t dev, int flag, int mode, struct thread *td) tp = &portp->tty; crit_enter(); - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); stl_ttyoptim(portp, &tp->t_termios); stl_rawclose(portp); ttyclose(tp); @@ -1324,21 +1317,23 @@ STATIC int stlstop(struct tty *tp, int rw) /*****************************************************************************/ -STATIC int stlioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, - struct thread *td) +STATIC int stlioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; struct termios *newtios, *localtios; struct tty *tp; stlport_t *portp; int error, i; #if STLDEBUG - printf("stlioctl(dev=%s,cmd=%lx,data=%p,flag=%x,p=%p)\n", - devtoname(dev), cmd, (void *) data, flag, (void *) p); + printf("stlioctl(dev=%s,cmd=%lx,data=%p,flag=%x)\n", + devtoname(dev), cmd, (void *) data, ap->a_fflag); #endif if (minor(dev) & STL_MEMDEV) - return(stl_memioctl(dev, cmd, data, flag, td)); + return(stl_memioctl(dev, cmd, data, ap->a_fflag)); portp = stl_dev2port(dev); if (portp == (stlport_t *) NULL) @@ -1361,7 +1356,7 @@ STATIC int stlioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, switch (cmd) { case TIOCSETA: - if ((error = suser(td)) == 0) + if ((error = suser_cred(ap->a_cred, 0)) == 0) *localtios = *((struct termios *) data); break; case TIOCGETA: @@ -1428,12 +1423,13 @@ STATIC int stlioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, * Call the line discipline and the common command processing to * process this command (if they can). */ - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return(error); crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, cmd, data, ap->a_fflag); stl_ttyoptim(portp, &tp->t_termios); if (error != ENOIOCTL) { crit_exit(); @@ -1479,7 +1475,7 @@ STATIC int stlioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, *((int *) data) = (stl_getsignals(portp) | TIOCM_LE); break; case TIOCMSDTRWAIT: - if ((error = suser(td)) == 0) + if ((error = suser_cred(ap->a_cred, 0)) == 0) portp->dtrwait = *((int *) data) * hz / 100; break; case TIOCMGDTRWAIT: @@ -2705,8 +2701,7 @@ static int stl_clrportstats(stlport_t *portp, caddr_t data) * The "staliomem" device is used for stats collection in this driver. */ -static int stl_memioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, - struct thread *td) +static int stl_memioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag) { int rc; diff --git a/sys/dev/serial/stli/istallion.c b/sys/dev/serial/stli/istallion.c index c2cb9e12b5..34e118b857 100644 --- a/sys/dev/serial/stli/istallion.c +++ b/sys/dev/serial/stli/istallion.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/istallion.c,v 1.36.2.2 2001/08/30 12:29:57 murray Exp $ - * $DragonFly: src/sys/dev/serial/stli/istallion.c,v 1.16 2005/06/11 09:03:49 swildner Exp $ + * $DragonFly: src/sys/dev/serial/stli/istallion.c,v 1.17 2006/07/28 02:17:38 dillon Exp $ */ /*****************************************************************************/ @@ -573,7 +573,7 @@ static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp); static int stli_memrw(dev_t dev, struct uio *uiop, int flag); static int stli_memioctl(dev_t dev, unsigned long cmd, caddr_t data, - int flag, struct thread *td); + int flag); static int stli_getbrdstats(caddr_t data); static int stli_getportstats(stliport_t *portp, caddr_t data); static int stli_clrportstats(stliport_t *portp, caddr_t data); @@ -631,24 +631,15 @@ struct isa_driver stlidriver = { */ #define CDEV_MAJOR 75 -static struct cdevsw stli_cdevsw = { - /* name */ stli_drvname, - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ stliopen, - /* close */ stliclose, - /* read */ stliread, - /* write */ stliwrite, - /* ioctl */ stliioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops stli_ops = { + { stli_drvname, CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = stliopen, + .d_close = stliclose, + .d_read = stliread, + .d_write = stliwrite, + .d_ioctl = stliioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; #endif @@ -864,8 +855,9 @@ static int stliattach(struct isa_device *idp) /*****************************************************************************/ -STATIC int stliopen(dev_t dev, int flag, int mode, struct thread *td) +STATIC int stliopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; stliport_t *portp; int error, callout; @@ -938,7 +930,7 @@ stliopen_restart: } } else { if (portp->callout != 0) { - if (flag & O_NONBLOCK) { + if (ap->a_oflags & O_NONBLOCK) { error = EBUSY; goto stliopen_end; } @@ -950,7 +942,7 @@ stliopen_restart: } } if ((tp->t_state & TS_XCLUDE) && - suser(td)) { + suser_cred(ap->a_cred, 0)) { error = EBUSY; goto stliopen_end; } @@ -962,7 +954,7 @@ stliopen_restart: */ if (((tp->t_state & TS_CARR_ON) == 0) && !callout && ((tp->t_cflag & CLOCAL) == 0) && - ((flag & O_NONBLOCK) == 0)) { + ((ap->a_oflags & O_NONBLOCK) == 0)) { portp->waitopens++; error = tsleep(TSA_CARR_ON(tp), PCATCH, "stlidcd",0); portp->waitopens--; @@ -994,8 +986,9 @@ stliopen_end: /*****************************************************************************/ -STATIC int stliclose(dev_t dev, int flag, int mode, struct thread *td) +STATIC int stliclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; stliport_t *portp; @@ -1015,7 +1008,7 @@ STATIC int stliclose(dev_t dev, int flag, int mode, struct thread *td) tp = &portp->tty; crit_enter(); - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); stli_ttyoptim(portp, &tp->t_termios); stli_shutdownclose(portp); ttyclose(tp); @@ -1024,24 +1017,25 @@ STATIC int stliclose(dev_t dev, int flag, int mode, struct thread *td) } -STATIC int stliread(dev_t dev, struct uio *uiop, int flag) +STATIC int stliread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; stliport_t *portp; #if STLDEBUG printf("stliread(dev=%s,uiop=%p,flag=%x)\n", devtoname(dev), - (void *) uiop, flag); + ap->a_uio, flag); #endif if (minor(dev) & STL_MEMDEV) - return(stli_memrw(dev, uiop, flag)); + return(stli_memrw(dev, ap->a_uio, ap->a_ioflag)); if (minor(dev) & STL_CTRLDEV) return(ENODEV); portp = stli_dev2port(dev); if (portp == (stliport_t *) NULL) return(ENODEV); - return ttyread(dev, uiop, flag); + return ttyread(ap); } /*****************************************************************************/ @@ -1073,30 +1067,33 @@ STATIC int stlistop(struct tty *tp, int rw) /*****************************************************************************/ -STATIC int stliwrite(dev_t dev, struct uio *uiop, int flag) +STATIC int stliwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; stliport_t *portp; #if STLDEBUG printf("stliwrite(dev=%s,uiop=%p,flag=%x)\n", devtoname(dev), - (void *) uiop, flag); + ap->a_uio, flag); #endif if (minor(dev) & STL_MEMDEV) - return(stli_memrw(dev, uiop, flag)); + return(stli_memrw(dev, ap->a_uio, ap->a_ioflag)); if (minor(dev) & STL_CTRLDEV) return(ENODEV); portp = stli_dev2port(dev); if (portp == (stliport_t *) NULL) return(ENODEV); - return ttywrite(dev, uiop, flag); + return ttywrite(ap); } /*****************************************************************************/ -STATIC int stliioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, - struct thread *td) +STATIC int stliioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t data = ap->a_data; struct termios *newtios, *localtios; struct tty *tp; stlibrd_t *brdp; @@ -1106,11 +1103,11 @@ STATIC int stliioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, #if STLDEBUG printf("stliioctl(dev=%s,cmd=%lx,data=%p,flag=%x,p=%p)\n", - devtoname(dev), cmd, (void *) data, flag, (void *) p); + devtoname(dev), cmd, (void *) data, ap->a_fflag, (void *) p); #endif if (minor(dev) & STL_MEMDEV) - return(stli_memioctl(dev, cmd, data, flag, td)); + return(stli_memioctl(dev, cmd, data, ap->a_fflag)); portp = stli_dev2port(dev); if (portp == (stliport_t *) NULL) @@ -1135,7 +1132,7 @@ STATIC int stliioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, switch (cmd) { case TIOCSETA: - if ((error = suser(td)) == 0) + if ((error = suser_cred(ap->a_cred, 0)) == 0) *localtios = *((struct termios *) data); break; case TIOCGETA: @@ -1202,12 +1199,13 @@ STATIC int stliioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, * Call the line discipline and the common command processing to * process this command (if they can). */ - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) return(error); crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, cmd, data, ap->a_fflag); stli_ttyoptim(portp, &tp->t_termios); if (error != ENOIOCTL) { crit_exit(); @@ -1271,7 +1269,7 @@ STATIC int stliioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, *((int *) data) = (portp->sigs | TIOCM_LE); break; case TIOCMSDTRWAIT: - if ((error = suser(td)) == 0) + if ((error = suser_cred(ap->a_cred, 0)) == 0) portp->dtrwait = *((int *) data) * hz / 100; break; case TIOCMGDTRWAIT: @@ -3415,7 +3413,7 @@ static int stli_brdattach(stlibrd_t *brdp) printf("stli%d: %s (driver version %s), unit=%d nrpanels=%d " "nrports=%d\n", brdp->unitid, stli_brdnames[brdp->brdtype], stli_drvversion, brdp->brdnr, brdp->nrpanels, brdp->nrports); - cdevsw_add(&stli_cdevsw, -1, brdp->unitid); + dev_ops_add(&stli_ops, -1, brdp->unitid); return(0); } @@ -3645,8 +3643,7 @@ STATIC int stli_memrw(dev_t dev, struct uio *uiop, int flag) * reset it, and start/stop it. */ -static int stli_memioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag, - struct thread *td) +static int stli_memioctl(dev_t dev, unsigned long cmd, caddr_t data, int flag) { stlibrd_t *brdp; int brdnr, rc; diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c index 38ff507fd7..dcf6cf5aa9 100644 --- a/sys/dev/sound/pcm/channel.c +++ b/sys/dev/sound/pcm/channel.c @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/channel.c,v 1.19.2.19 2003/03/11 15:15:41 orion Exp $ - * $DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.8 2006/06/13 08:12:02 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.9 2006/07/28 02:17:38 dillon Exp $ */ #include @@ -33,7 +33,7 @@ #include "feeder_if.h" -SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.8 2006/06/13 08:12:02 dillon Exp $"); +SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/channel.c,v 1.9 2006/07/28 02:17:38 dillon Exp $"); #define MIN_CHUNK_SIZE 256 /* for uiomove etc. */ #define DMA_ALIGN_THRESHOLD 4 @@ -532,7 +532,7 @@ chn_sync(struct pcm_channel *c, int threshold) /* called externally, handle locking */ int -chn_poll(struct pcm_channel *c, int ev, struct proc *p) +chn_poll(struct pcm_channel *c, int ev) { struct snd_dbuf *bs = c->bufsoft; int ret; @@ -544,7 +544,7 @@ chn_poll(struct pcm_channel *c, int ev, struct proc *p) if (chn_polltrigger(c) && chn_pollreset(c)) ret = ev; else - selrecord(p->p_thread, sndbuf_getsel(bs)); + selrecord(curthread, sndbuf_getsel(bs)); return ret; } diff --git a/sys/dev/sound/pcm/channel.h b/sys/dev/sound/pcm/channel.h index ac6471823a..a10a2ef9dc 100644 --- a/sys/dev/sound/pcm/channel.h +++ b/sys/dev/sound/pcm/channel.h @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/channel.h,v 1.5.2.6 2002/04/22 15:49:36 cg Exp $ - * $DragonFly: src/sys/dev/sound/pcm/channel.h,v 1.3 2006/06/13 08:12:02 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/channel.h,v 1.4 2006/07/28 02:17:38 dillon Exp $ */ struct pcmchan_children { @@ -75,7 +75,7 @@ int chn_read(struct pcm_channel *c, struct uio *buf, int ioflags); u_int32_t chn_start(struct pcm_channel *c, int force); int chn_sync(struct pcm_channel *c, int threshold); int chn_flush(struct pcm_channel *c); -int chn_poll(struct pcm_channel *c, int ev, struct proc *p); +int chn_poll(struct pcm_channel *c, int ev); int chn_init(struct pcm_channel *c, void *devinfo, int dir); int chn_kill(struct pcm_channel *c); diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index f4cbf147a9..f80ca73ebf 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/dsp.c,v 1.15.2.13 2002/08/30 13:53:03 orion Exp $ - * $DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.9 2006/06/13 08:12:02 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.10 2006/07/28 02:17:38 dillon Exp $ */ #include @@ -32,7 +32,7 @@ #include -SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.9 2006/06/13 08:12:02 dillon Exp $"); +SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/dsp.c,v 1.10 2006/07/28 02:17:38 dillon Exp $"); #define OLDPCM_IOCTL @@ -44,23 +44,15 @@ static d_ioctl_t dsp_ioctl; static d_poll_t dsp_poll; static d_mmap_t dsp_mmap; -static struct cdevsw dsp_cdevsw = { - /* name */ "dsp", - /* maj */ SND_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ dsp_open, - /* close */ dsp_close, - /* read */ dsp_read, - /* write */ dsp_write, - /* ioctl */ dsp_ioctl, - /* poll */ dsp_poll, - /* mmap */ dsp_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops dsp_ops = { + { "dsp", SND_CDEV_MAJOR, 0 }, + .d_open = dsp_open, + .d_close = dsp_close, + .d_read = dsp_read, + .d_write = dsp_write, + .d_ioctl = dsp_ioctl, + .d_poll = dsp_poll, + .d_mmap = dsp_mmap, }; #ifdef USING_DEVFS @@ -175,19 +167,17 @@ relchns(dev_t dev, struct pcm_channel *rdch, struct pcm_channel *wrch, u_int32_t } static int -dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) +dsp_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct pcm_channel *rdch, *wrch; struct snddev_info *d; u_int32_t fmt; int devtype; - struct proc *p = td->td_proc; - - KKASSERT(p != NULL); crit_enter(); - d = dsp_get_info(i_dev); - devtype = PCMDEV(i_dev); + d = dsp_get_info(dev); + devtype = PCMDEV(dev); /* decide default format */ switch (devtype) { @@ -209,7 +199,7 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) case SND_DEV_DSPREC: fmt = AFMT_U8; - if (mode & FWRITE) { + if (ap->a_oflags & FWRITE) { crit_exit(); return EINVAL; } @@ -222,17 +212,18 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) /* lock snddev so nobody else can monkey with it */ pcm_lock(d); - rdch = i_dev->si_drv1; - wrch = i_dev->si_drv2; + rdch = dev->si_drv1; + wrch = dev->si_drv2; - if ((dsp_get_flags(i_dev) & SD_F_SIMPLEX) && (rdch || wrch)) { + if ((dsp_get_flags(dev) & SD_F_SIMPLEX) && (rdch || wrch)) { /* simplex device, already open, exit */ pcm_unlock(d); crit_exit(); return EBUSY; } - if (((flags & FREAD) && rdch) || ((flags & FWRITE) && wrch)) { + if (((ap->a_oflags & FREAD) && rdch) || + ((ap->a_oflags & FWRITE) && wrch)) { /* device already open in one or both directions */ pcm_unlock(d); crit_exit(); @@ -240,12 +231,12 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) } /* if we get here, the open request is valid */ - if (flags & FREAD) { + if (ap->a_oflags & FREAD) { /* open for read */ if (devtype == SND_DEV_DSPREC) - rdch = pcm_chnalloc(d, PCMDIR_REC, p->p_pid, PCMCHAN(i_dev)); + rdch = pcm_chnalloc(d, PCMDIR_REC, curproc->p_pid, PCMCHAN(dev)); else - rdch = pcm_chnalloc(d, PCMDIR_REC, p->p_pid, -1); + rdch = pcm_chnalloc(d, PCMDIR_REC, curproc->p_pid, -1); if (!rdch) { /* no channel available, exit */ pcm_unlock(d); @@ -255,12 +246,12 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) /* got a channel, already locked for us */ } - if (flags & FWRITE) { + if (ap->a_oflags & FWRITE) { /* open for write */ - wrch = pcm_chnalloc(d, PCMDIR_PLAY, p->p_pid, -1); + wrch = pcm_chnalloc(d, PCMDIR_PLAY, curproc->p_pid, -1); if (!wrch) { /* no channel available */ - if (rdch && (flags & FREAD)) { + if (rdch && (ap->a_oflags & FREAD)) { /* just opened a read channel, release it */ pcm_chnrelease(rdch); } @@ -272,17 +263,17 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) /* got a channel, already locked for us */ } - i_dev->si_drv1 = rdch; - i_dev->si_drv2 = wrch; + dev->si_drv1 = rdch; + dev->si_drv2 = wrch; pcm_unlock(d); /* finished with snddev, new channels still locked */ /* bump refcounts, reset and unlock any channels that we just opened */ - if (flags & FREAD) { + if (ap->a_oflags & FREAD) { if (chn_reset(rdch, fmt)) { pcm_lock(d); pcm_chnrelease(rdch); - if (wrch && (flags & FWRITE)) + if (wrch && (ap->a_oflags & FWRITE)) pcm_chnrelease(wrch); pcm_unlock(d); crit_exit(); @@ -290,17 +281,17 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) } #if 0 /* removed, will be passed as an IO_ flag */ - if (flags & O_NONBLOCK) + if (ap->a_oflags & O_NONBLOCK) rdch->flags |= CHN_F_NBIO; #endif pcm_chnref(rdch, 1); CHN_UNLOCK(rdch); } - if (flags & FWRITE) { + if (ap->a_oflags & FWRITE) { if (chn_reset(wrch, fmt)) { pcm_lock(d); pcm_chnrelease(wrch); - if (flags & FREAD) { + if (ap->a_oflags & FREAD) { CHN_LOCK(rdch); pcm_chnref(rdch, -1); pcm_chnrelease(rdch); @@ -312,7 +303,7 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) } #if 0 /* removed, will be passed as an IO_ flag */ - if (flags & O_NONBLOCK) + if (ap->a_oflags & O_NONBLOCK) wrch->flags |= CHN_F_NBIO; #endif pcm_chnref(wrch, 1); @@ -323,17 +314,18 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) } static int -dsp_close(dev_t i_dev, int flags, int mode, struct thread *td) +dsp_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct pcm_channel *rdch, *wrch; struct snddev_info *d; int exit; crit_enter(); - d = dsp_get_info(i_dev); + d = dsp_get_info(dev); pcm_lock(d); - rdch = i_dev->si_drv1; - wrch = i_dev->si_drv2; + rdch = dev->si_drv1; + wrch = dev->si_drv2; exit = 0; @@ -363,10 +355,10 @@ dsp_close(dev_t i_dev, int flags, int mode, struct thread *td) if (pcm_getfakechan(d)) pcm_getfakechan(d)->flags = 0; - i_dev->si_drv1 = NULL; - i_dev->si_drv2 = NULL; + dev->si_drv1 = NULL; + dev->si_drv2 = NULL; - dsp_set_flags(i_dev, dsp_get_flags(i_dev) & ~SD_F_TRANSIENT); + dsp_set_flags(dev, dsp_get_flags(dev) & ~SD_F_TRANSIENT); pcm_unlock(d); if (rdch) { @@ -387,60 +379,65 @@ dsp_close(dev_t i_dev, int flags, int mode, struct thread *td) } static int -dsp_read(dev_t i_dev, struct uio *buf, int flag) +dsp_read(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct pcm_channel *rdch, *wrch; int ret; crit_enter(); - getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD); + getchns(dev, &rdch, &wrch, SD_F_PRIO_RD); KASSERT(rdch, ("dsp_read: nonexistant channel")); KASSERT(rdch->flags & CHN_F_BUSY, ("dsp_read: nonbusy channel")); if (rdch->flags & (CHN_F_MAPPED | CHN_F_DEAD)) { - relchns(i_dev, rdch, wrch, SD_F_PRIO_RD); + relchns(dev, rdch, wrch, SD_F_PRIO_RD); crit_exit(); return EINVAL; } if (!(rdch->flags & CHN_F_RUNNING)) rdch->flags |= CHN_F_RUNNING; - ret = chn_read(rdch, buf, flag); - relchns(i_dev, rdch, wrch, SD_F_PRIO_RD); + ret = chn_read(rdch, ap->a_uio, ap->a_ioflag); + relchns(dev, rdch, wrch, SD_F_PRIO_RD); crit_exit(); return ret; } static int -dsp_write(dev_t i_dev, struct uio *buf, int flag) +dsp_write(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct pcm_channel *rdch, *wrch; int ret; crit_enter(); - getchns(i_dev, &rdch, &wrch, SD_F_PRIO_WR); + getchns(dev, &rdch, &wrch, SD_F_PRIO_WR); KASSERT(wrch, ("dsp_write: nonexistant channel")); KASSERT(wrch->flags & CHN_F_BUSY, ("dsp_write: nonbusy channel")); if (wrch->flags & (CHN_F_MAPPED | CHN_F_DEAD)) { - relchns(i_dev, rdch, wrch, SD_F_PRIO_WR); + relchns(dev, rdch, wrch, SD_F_PRIO_WR); crit_exit(); return EINVAL; } if (!(wrch->flags & CHN_F_RUNNING)) wrch->flags |= CHN_F_RUNNING; - ret = chn_write(wrch, buf, flag); - relchns(i_dev, rdch, wrch, SD_F_PRIO_WR); + ret = chn_write(wrch, ap->a_uio, ap->a_ioflag); + relchns(dev, rdch, wrch, SD_F_PRIO_WR); crit_exit(); return ret; } static int -dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) +dsp_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + u_long cmd = ap->a_cmd; + caddr_t arg = ap->a_data; struct pcm_channel *wrch, *rdch; struct snddev_info *d; int kill; @@ -454,14 +451,15 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) if (IOCGROUP(cmd) == 'M') { dev_t pdev; - pdev = make_adhoc_dev(&dsp_cdevsw, - PCMMKMINOR(PCMUNIT(i_dev), SND_DEV_CTL, 0)); - return mixer_ioctl(pdev, cmd, arg, mode, td); + pdev = make_adhoc_dev(&dsp_ops, + PCMMKMINOR(PCMUNIT(dev), SND_DEV_CTL, 0)); + ap->a_head.a_dev = pdev; + return mixer_ioctl(ap); } crit_enter(); - d = dsp_get_info(i_dev); - getchns(i_dev, &rdch, &wrch, 0); + d = dsp_get_info(dev); + getchns(dev, &rdch, &wrch, 0); kill = 0; if (wrch && (wrch->flags & CHN_F_DEAD)) @@ -469,7 +467,7 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) if (rdch && (rdch->flags & CHN_F_DEAD)) kill |= 2; if (kill == 3) { - relchns(i_dev, rdch, wrch, 0); + relchns(dev, rdch, wrch, 0); crit_exit(); return EINVAL; } @@ -576,8 +574,8 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) p->formats = (rdch? chn_getformats(rdch) : 0xffffffff) & (wrch? chn_getformats(wrch) : 0xffffffff); if (rdch && wrch) - p->formats |= (dsp_get_flags(i_dev) & SD_F_SIMPLEX)? 0 : AFMT_FULLDUPLEX; - pdev = make_adhoc_dev(&dsp_cdevsw, PCMMKMINOR(PCMUNIT(i_dev), SND_DEV_CTL, 0)); + p->formats |= (dsp_get_flags(dev) & SD_F_SIMPLEX)? 0 : AFMT_FULLDUPLEX; + pdev = make_adhoc_dev(&dsp_ops, PCMMKMINOR(PCMUNIT(dev), SND_DEV_CTL, 0)); p->mixers = 1; /* default: one mixer */ p->inputs = pdev->si_drv1? mix_getdevs(pdev->si_drv1) : 0; p->left = p->right = 100; @@ -894,7 +892,7 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) case SNDCTL_DSP_GETCAPS: *arg_i = DSP_CAP_REALTIME | DSP_CAP_MMAP | DSP_CAP_TRIGGER; - if (rdch && wrch && !(dsp_get_flags(i_dev) & SD_F_SIMPLEX)) + if (rdch && wrch && !(dsp_get_flags(dev) & SD_F_SIMPLEX)) *arg_i |= DSP_CAP_DUPLEX; break; @@ -967,104 +965,107 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) ret = EINVAL; break; } - relchns(i_dev, rdch, wrch, 0); + relchns(dev, rdch, wrch, 0); crit_exit(); return ret; } static int -dsp_poll(dev_t i_dev, int events, struct thread *td) +dsp_poll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct pcm_channel *wrch = NULL, *rdch = NULL; int ret, e; crit_enter(); ret = 0; - getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); + getchns(dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); if (wrch) { - e = (events & (POLLOUT | POLLWRNORM)); + e = (ap->a_events & (POLLOUT | POLLWRNORM)); if (e) - ret |= chn_poll(wrch, e, td->td_proc); + ret |= chn_poll(wrch, e); } if (rdch) { - e = (events & (POLLIN | POLLRDNORM)); + e = (ap->a_events & (POLLIN | POLLRDNORM)); if (e) - ret |= chn_poll(rdch, e, td->td_proc); + ret |= chn_poll(rdch, e); } - relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); + relchns(dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); crit_exit(); - return ret; + ap->a_events = ret; + return (0); } static int -dsp_mmap(dev_t i_dev, vm_offset_t offset, int nprot) +dsp_mmap(struct dev_mmap_args *ap) { + dev_t dev = ap->a_head.a_dev; struct pcm_channel *wrch = NULL, *rdch = NULL, *c; int ret; - if (nprot & PROT_EXEC) - return -1; + if (ap->a_nprot & PROT_EXEC) + return EINVAL; crit_enter(); - getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); + getchns(dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); #if 0 /* * XXX the linux api uses the nprot to select read/write buffer * our vm system doesn't allow this, so force write buffer */ - if (wrch && (nprot & PROT_WRITE)) { + if (wrch && (ap->a_nprot & PROT_WRITE)) { c = wrch; - } else if (rdch && (nprot & PROT_READ)) { + } else if (rdch && (ap->a_nprot & PROT_READ)) { c = rdch; } else { crit_exit(); - return -1; + return EINVAL; } #else c = wrch; #endif if (c == NULL) { - relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); + relchns(dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); crit_exit(); - return -1; + return EINVAL; } - if (offset >= sndbuf_getsize(c->bufsoft)) { - relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); + if (ap->a_offset >= sndbuf_getsize(c->bufsoft)) { + relchns(dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); crit_exit(); - return -1; + return EINVAL; } if (!(c->flags & CHN_F_MAPPED)) c->flags |= CHN_F_MAPPED; - ret = atop(vtophys(sndbuf_getbufofs(c->bufsoft, offset))); - relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); - + ret = atop(vtophys(sndbuf_getbufofs(c->bufsoft, ap->a_offset))); + relchns(dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR); crit_exit(); - return ret; + ap->a_result = ret; + return (0); } int dsp_register(int unit, int channel) { - cdevsw_add(&dsp_cdevsw, + dev_ops_add(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_DSP, 0)); - cdevsw_add(&dsp_cdevsw, + dev_ops_add(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_DSP16, 0)); - cdevsw_add(&dsp_cdevsw, + dev_ops_add(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_AUDIO, 0)); - cdevsw_add(&dsp_cdevsw, + dev_ops_add(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_NORESET, 0)); - make_dev(&dsp_cdevsw, PCMMKMINOR(unit, SND_DEV_DSP, channel), + make_dev(&dsp_ops, PCMMKMINOR(unit, SND_DEV_DSP, channel), UID_ROOT, GID_WHEEL, 0666, "dsp%d.%d", unit, channel); - make_dev(&dsp_cdevsw, PCMMKMINOR(unit, SND_DEV_DSP16, channel), + make_dev(&dsp_ops, PCMMKMINOR(unit, SND_DEV_DSP16, channel), UID_ROOT, GID_WHEEL, 0666, "dspW%d.%d", unit, channel); - make_dev(&dsp_cdevsw, PCMMKMINOR(unit, SND_DEV_AUDIO, channel), + make_dev(&dsp_ops, PCMMKMINOR(unit, SND_DEV_AUDIO, channel), UID_ROOT, GID_WHEEL, 0666, "audio%d.%d", unit, channel); return 0; @@ -1073,9 +1074,9 @@ dsp_register(int unit, int channel) int dsp_registerrec(int unit, int channel) { - cdevsw_add(&dsp_cdevsw, + dev_ops_add(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_DSPREC, 0)); - make_dev(&dsp_cdevsw, PCMMKMINOR(unit, SND_DEV_DSPREC, channel), + make_dev(&dsp_ops, PCMMKMINOR(unit, SND_DEV_DSPREC, channel), UID_ROOT, GID_WHEEL, 0666, "dspr%d.%d", unit, channel); return 0; @@ -1084,13 +1085,13 @@ dsp_registerrec(int unit, int channel) int dsp_unregister(int unit, int channel) { - cdevsw_remove(&dsp_cdevsw, + dev_ops_remove(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_DSP, 0)); - cdevsw_remove(&dsp_cdevsw, + dev_ops_remove(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_DSP16, 0)); - cdevsw_remove(&dsp_cdevsw, + dev_ops_remove(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_AUDIO, 0)); - cdevsw_remove(&dsp_cdevsw, + dev_ops_remove(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_NORESET, 0)); return 0; } @@ -1098,7 +1099,7 @@ dsp_unregister(int unit, int channel) int dsp_unregisterrec(int unit, int channel) { - cdevsw_remove(&dsp_cdevsw, + dev_ops_remove(&dsp_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_DSPREC, 0)); return 0; } @@ -1133,7 +1134,7 @@ dsp_clone(void *arg, char *name, int namelen, dev_t *dev) cont = 1; for (i = 0; cont; i++) { - pdev = make_adhoc_dev(&dsp_cdevsw, PCMMKMINOR(unit, devtype, i)); + pdev = make_adhoc_dev(&dsp_ops, PCMMKMINOR(unit, devtype, i)); if (pdev->si_flags & SI_NAMED) { if ((pdev->si_drv1 == NULL) && (pdev->si_drv2 == NULL)) { *dev = pdev; diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c index b9ebc40b80..430719a4ff 100644 --- a/sys/dev/sound/pcm/mixer.c +++ b/sys/dev/sound/pcm/mixer.c @@ -24,14 +24,14 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/mixer.c,v 1.4.2.8 2002/04/22 15:49:36 cg Exp $ - * $DragonFly: src/sys/dev/sound/pcm/mixer.c,v 1.9 2006/06/06 19:30:12 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/mixer.c,v 1.10 2006/07/28 02:17:38 dillon Exp $ */ #include #include "mixer_if.h" -SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/mixer.c,v 1.9 2006/06/06 19:30:12 dillon Exp $"); +SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/mixer.c,v 1.10 2006/07/28 02:17:38 dillon Exp $"); MALLOC_DEFINE(M_MIXER, "mixer", "mixer"); @@ -75,23 +75,11 @@ static char* snd_mixernames[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES; static d_open_t mixer_open; static d_close_t mixer_close; -static struct cdevsw mixer_cdevsw = { - /* name */ "mixer", - /* maj */ SND_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mixer_open, - /* close */ mixer_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ mixer_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mixer_ops = { + { "mixer", SND_CDEV_MAJOR, 0 }, + .d_open = mixer_open, + .d_close = mixer_close, + .d_ioctl = mixer_ioctl, }; #ifdef USING_DEVFS @@ -105,7 +93,7 @@ mixer_get_devt(device_t dev) int unit; unit = device_get_unit(dev); - pdev = make_adhoc_dev(&mixer_cdevsw, PCMMKMINOR(unit, SND_DEV_CTL, 0)); + pdev = make_adhoc_dev(&mixer_ops, PCMMKMINOR(unit, SND_DEV_CTL, 0)); return pdev; } @@ -224,9 +212,9 @@ mixer_init(device_t dev, kobj_class_t cls, void *devinfo) mixer_setrecsrc(m, SOUND_MASK_MIC); unit = device_get_unit(dev); - cdevsw_add(&mixer_cdevsw, + dev_ops_add(&mixer_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_CTL, 0)); - pdev = make_dev(&mixer_cdevsw, PCMMKMINOR(unit, SND_DEV_CTL, 0), + pdev = make_dev(&mixer_ops, PCMMKMINOR(unit, SND_DEV_CTL, 0), UID_ROOT, GID_WHEEL, 0666, "mixer%d", unit); pdev->si_drv1 = m; @@ -259,7 +247,7 @@ mixer_uninit(device_t dev) pdev->si_drv1 = NULL; unit = device_get_unit(dev); - cdevsw_remove(&mixer_cdevsw, + dev_ops_remove(&mixer_ops, PCMMKMINOR(-1, -1, 0), PCMMKMINOR(unit, SND_DEV_CTL, 0)); for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) @@ -404,11 +392,12 @@ mixer_hwvol_step(device_t dev, int left_step, int right_step) /* ----------------------------------------------------------------------- */ static int -mixer_open(dev_t i_dev, int flags, int mode, struct thread *td) +mixer_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct snd_mixer *m; - m = i_dev->si_drv1; + m = dev->si_drv1; crit_enter(); snd_mtxlock(m->lock); @@ -420,11 +409,12 @@ mixer_open(dev_t i_dev, int flags, int mode, struct thread *td) } static int -mixer_close(dev_t i_dev, int flags, int mode, struct thread *td) +mixer_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct snd_mixer *m; - m = i_dev->si_drv1; + m = dev->si_drv1; crit_enter(); snd_mtxlock(m->lock); @@ -441,19 +431,21 @@ mixer_close(dev_t i_dev, int flags, int mode, struct thread *td) } int -mixer_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) +mixer_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t arg = ap->a_data; struct snd_mixer *m; int ret, *arg_i = (int *)arg; - int v = -1, j = cmd & 0xff; + int v = -1, j = ap->a_cmd & 0xff; - m = i_dev->si_drv1; + m = dev->si_drv1; if (!m->busy) return EBADF; crit_enter(); snd_mtxlock(m->lock); - if ((cmd & MIXER_WRITE(0)) == MIXER_WRITE(0)) { + if ((ap->a_cmd & MIXER_WRITE(0)) == MIXER_WRITE(0)) { if (j == SOUND_MIXER_RECSRC) ret = mixer_setrecsrc(m, *arg_i); else @@ -463,7 +455,7 @@ mixer_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) return (ret == 0)? 0 : ENXIO; } - if ((cmd & MIXER_READ(0)) == MIXER_READ(0)) { + if ((ap->a_cmd & MIXER_READ(0)) == MIXER_READ(0)) { switch (j) { case SOUND_MIXER_DEVMASK: case SOUND_MIXER_CAPS: @@ -501,7 +493,7 @@ mixer_clone(void *arg, char *name, int namelen, dev_t *dev) if (*dev != NODEV) return; if (strcmp(name, "mixer") == 0) { - pdev = make_adhoc_dev(&mixer_cdevsw, + pdev = make_adhoc_dev(&mixer_ops, PCMMKMINOR(snd_unit, SND_DEV_CTL, 0)); if (pdev->si_flags & SI_NAMED) *dev = pdev; diff --git a/sys/dev/sound/pcm/mixer.h b/sys/dev/sound/pcm/mixer.h index aba64bba6a..6874edb2f6 100644 --- a/sys/dev/sound/pcm/mixer.h +++ b/sys/dev/sound/pcm/mixer.h @@ -24,13 +24,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/mixer.h,v 1.2.2.6 2002/04/22 15:49:36 cg Exp $ - * $DragonFly: src/sys/dev/sound/pcm/mixer.h,v 1.3 2003/06/23 17:55:34 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/mixer.h,v 1.4 2006/07/28 02:17:38 dillon Exp $ */ int mixer_init(device_t dev, kobj_class_t cls, void *devinfo); int mixer_uninit(device_t dev); int mixer_reinit(device_t dev); -int mixer_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td); +int mixer_ioctl(struct dev_ioctl_args *); int mixer_hwvol_init(device_t dev); void mixer_hwvol_mute(device_t dev); diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c index 6c31cb9f38..3a45f7516a 100644 --- a/sys/dev/sound/pcm/sndstat.c +++ b/sys/dev/sound/pcm/sndstat.c @@ -24,13 +24,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/dev/sound/pcm/sndstat.c,v 1.4.2.2 2002/04/22 15:49:36 cg Exp $ - * $DragonFly: src/sys/dev/sound/pcm/sndstat.c,v 1.8 2005/06/10 23:07:01 dillon Exp $ + * $DragonFly: src/sys/dev/sound/pcm/sndstat.c,v 1.9 2006/07/28 02:17:38 dillon Exp $ */ #include #include -SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/sndstat.c,v 1.8 2005/06/10 23:07:01 dillon Exp $"); +SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/sndstat.c,v 1.9 2006/07/28 02:17:38 dillon Exp $"); #define SS_TYPE_MODULE 0 #define SS_TYPE_FIRST 1 @@ -43,23 +43,11 @@ static d_open_t sndstat_open; static d_close_t sndstat_close; static d_read_t sndstat_read; -static struct cdevsw sndstat_cdevsw = { - /* name */ "sndstat", - /* maj */ SND_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ sndstat_open, - /* close */ sndstat_close, - /* read */ sndstat_read, - /* write */ nowrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops sndstat_ops = { + { "sndstat", SND_CDEV_MAJOR, 0 }, + .d_open = sndstat_open, + .d_close = sndstat_close, + .d_read = sndstat_read, }; struct sndstat_entry { @@ -108,7 +96,7 @@ SYSCTL_PROC(_hw_snd, OID_AUTO, verbose, CTLTYPE_INT | CTLFLAG_RW, 0, sizeof(int), sysctl_hw_sndverbose, "I", ""); static int -sndstat_open(dev_t i_dev, int flags, int mode, struct thread *td) +sndstat_open(struct dev_open_args *ap) { int err; @@ -131,7 +119,7 @@ sndstat_open(dev_t i_dev, int flags, int mode, struct thread *td) } static int -sndstat_close(dev_t i_dev, int flags, int mode, struct thread *td) +sndstat_close(struct dev_close_args *ap) { crit_enter(); if (!sndstat_isopen) { @@ -146,8 +134,9 @@ sndstat_close(dev_t i_dev, int flags, int mode, struct thread *td) } static int -sndstat_read(dev_t i_dev, struct uio *buf, int flag) +sndstat_read(struct dev_read_args *ap) { + struct uio *uio = ap->a_uio; int l, err; crit_enter(); @@ -155,8 +144,11 @@ sndstat_read(dev_t i_dev, struct uio *buf, int flag) crit_exit(); return EBADF; } - l = min(buf->uio_resid, sbuf_len(&sndstat_sbuf) - sndstat_bufptr); - err = (l > 0)? uiomove(sbuf_data(&sndstat_sbuf) + sndstat_bufptr, l, buf) : 0; + l = min(uio->uio_resid, sbuf_len(&sndstat_sbuf) - sndstat_bufptr); + if (l > 0) + err = uiomove(sbuf_data(&sndstat_sbuf) + sndstat_bufptr, l, uio); + else + err = 0; sndstat_bufptr += l; crit_exit(); @@ -317,8 +309,8 @@ sndstat_prepare(struct sbuf *s) static int sndstat_init(void) { - cdevsw_add(&sndstat_cdevsw, -1, SND_DEV_STATUS); - make_dev(&sndstat_cdevsw, SND_DEV_STATUS, + dev_ops_add(&sndstat_ops, -1, SND_DEV_STATUS); + make_dev(&sndstat_ops, SND_DEV_STATUS, UID_ROOT, GID_WHEEL, 0444, "sndstat"); return (0); } @@ -331,7 +323,7 @@ sndstat_uninit(void) crit_exit(); return EBUSY; } - cdevsw_remove(&sndstat_cdevsw, -1, SND_DEV_STATUS); + dev_ops_remove(&sndstat_ops, -1, SND_DEV_STATUS); crit_exit(); return 0; } diff --git a/sys/dev/usbmisc/ucom/ucom.c b/sys/dev/usbmisc/ucom/ucom.c index 864a2310df..e7553781a0 100644 --- a/sys/dev/usbmisc/ucom/ucom.c +++ b/sys/dev/usbmisc/ucom/ucom.c @@ -2,7 +2,7 @@ * $NetBSD: ucom.c,v 1.39 2001/08/16 22:31:24 augustss Exp $ * $NetBSD: ucom.c,v 1.40 2001/11/13 06:24:54 lukem Exp $ * $FreeBSD: src/sys/dev/usb/ucom.c,v 1.35 2003/11/16 11:58:21 akiyama Exp $ - * $DragonFly: src/sys/dev/usbmisc/ucom/ucom.c,v 1.19 2005/06/10 23:11:54 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/ucom/ucom.c,v 1.20 2006/07/28 02:17:39 dillon Exp $ */ /*- * Copyright (c) 2001-2002, Shunsuke Akiyama . @@ -126,24 +126,15 @@ Static d_ioctl_t ucomioctl; #define UCOM_CDEV_MAJOR 138 -static struct cdevsw ucom_cdevsw = { - /* name */ "ucom", - /* maj */ UCOM_CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ucomopen, - /* close */ ucomclose, - /* read */ ucomread, - /* write */ ucomwrite, - /* ioctl */ ucomioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops ucom_ops = { + { "ucom", UCOM_CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = ucomopen, + .d_close = ucomclose, + .d_read = ucomread, + .d_write = ucomwrite, + .d_ioctl = ucomioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; Static void ucom_cleanup(struct ucom_softc *); @@ -191,8 +182,8 @@ ucom_attach(struct ucom_softc *sc) DPRINTF(("ucom_attach: make_dev: ucom%d\n", unit)); - cdevsw_add(&ucom_cdevsw, UCOMUNIT_MASK, unit); - dev = make_dev(&ucom_cdevsw, unit | UCOM_CALLOUT_MASK, + dev_ops_add(&ucom_ops, UCOMUNIT_MASK, unit); + dev = make_dev(&ucom_ops, unit | UCOM_CALLOUT_MASK, UID_UUCP, GID_DIALER, 0660, "ucom%d", unit); dev->si_tty = tp; @@ -238,7 +229,7 @@ ucom_detach(struct ucom_softc *sc) crit_exit(); unit = device_get_unit(sc->sc_dev); - cdevsw_remove(&ucom_cdevsw, UCOMUNIT_MASK, unit); + dev_ops_remove(&ucom_ops, UCOMUNIT_MASK, unit); return (0); } @@ -260,16 +251,15 @@ ucom_shutdown(struct ucom_softc *sc) } Static int -ucomopen(dev_t dev, int flag, int mode, usb_proc_ptr td) +ucomopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UCOMUNIT(dev); struct ucom_softc *sc; usbd_status err; struct tty *tp; int error; - KKASSERT(td != NULL); - USB_GET_SC_OPEN(ucom, unit, sc); if (sc->sc_dying) @@ -281,7 +271,7 @@ ucomopen(dev_t dev, int flag, int mode, usb_proc_ptr td) if (ISSET(tp->t_state, TS_ISOPEN) && ISSET(tp->t_state, TS_XCLUDE) && - suser(td) + suser_cred(ap->a_cred, 0) ) { return (EBUSY); } @@ -457,8 +447,9 @@ bad: } static int -ucomclose(dev_t dev, int flag, int mode, usb_proc_ptr p) +ucomclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ucom_softc *sc; struct tty *tp; @@ -473,7 +464,7 @@ ucomclose(dev_t dev, int flag, int mode, usb_proc_ptr p) goto quit; crit_enter(); - (*linesw[tp->t_line].l_close)(tp, flag); + (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); disc_optim(tp, &tp->t_termios, sc); ttyclose(tp); crit_exit(); @@ -506,8 +497,9 @@ quit: } static int -ucomread(dev_t dev, struct uio *uio, int flag) +ucomread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ucom_softc *sc; struct tty *tp; int error; @@ -515,12 +507,12 @@ ucomread(dev_t dev, struct uio *uio, int flag) USB_GET_SC(ucom, UCOMUNIT(dev), sc); tp = sc->sc_tty; - DPRINTF(("ucomread: tp = %p, flag = 0x%x\n", tp, flag)); + DPRINTF(("ucomread: tp = %p, flag = 0x%x\n", tp, ap->a_ioflag)); if (sc->sc_dying) return (EIO); - error = (*linesw[tp->t_line].l_read)(tp, uio, flag); + error = (*linesw[tp->t_line].l_read)(tp, ap->a_uio, ap->a_ioflag); DPRINTF(("ucomread: error = %d\n", error)); @@ -528,8 +520,9 @@ ucomread(dev_t dev, struct uio *uio, int flag) } static int -ucomwrite(dev_t dev, struct uio *uio, int flag) +ucomwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ucom_softc *sc; struct tty *tp; int error; @@ -537,12 +530,12 @@ ucomwrite(dev_t dev, struct uio *uio, int flag) USB_GET_SC(ucom, UCOMUNIT(dev), sc); tp = sc->sc_tty; - DPRINTF(("ucomwrite: tp = %p, flag = 0x%x\n", tp, flag)); + DPRINTF(("ucomwrite: tp = %p, flag = 0x%x\n", tp, ap->a_ioflag)); if (sc->sc_dying) return (EIO); - error = (*linesw[tp->t_line].l_write)(tp, uio, flag); + error = (*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag); DPRINTF(("ucomwrite: error = %d\n", error)); @@ -550,8 +543,9 @@ ucomwrite(dev_t dev, struct uio *uio, int flag) } static int -ucomioctl(dev_t dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) +ucomioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ucom_softc *sc; struct tty *tp; int error; @@ -563,9 +557,10 @@ ucomioctl(dev_t dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) if (sc->sc_dying) return (EIO); - DPRINTF(("ucomioctl: cmd = 0x%08lx\n", cmd)); + DPRINTF(("ucomioctl: cmd = 0x%08lx\n", ap->a_cmd)); - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p); + error = (*linesw[tp->t_line].l_ioctl)(tp, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); if (error != ENOIOCTL) { DPRINTF(("ucomioctl: l_ioctl: error = %d\n", error)); return (error); @@ -573,7 +568,7 @@ ucomioctl(dev_t dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) crit_enter(); - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, ap->a_cmd, ap->a_data, ap->a_fflag); disc_optim(tp, &tp->t_termios, sc); if (error != ENOIOCTL) { crit_exit(); @@ -584,7 +579,8 @@ ucomioctl(dev_t dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) if (sc->sc_callback->ucom_ioctl != NULL) { error = sc->sc_callback->ucom_ioctl(sc->sc_parent, sc->sc_portno, - cmd, data, flag, p); + ap->a_cmd, ap->a_data, + ap->a_fflag, curthread); if (error >= 0) { crit_exit(); return (error); @@ -593,9 +589,9 @@ ucomioctl(dev_t dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) error = 0; - DPRINTF(("ucomioctl: our cmd = 0x%08lx\n", cmd)); + DPRINTF(("ucomioctl: our cmd = 0x%08lx\n", ap->a_cmd)); - switch (cmd) { + switch (ap->a_cmd) { case TIOCSBRK: DPRINTF(("ucomioctl: TIOCSBRK\n")); ucom_break(sc, 1); @@ -615,28 +611,28 @@ ucomioctl(dev_t dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) break; case TIOCMSET: - d = *(int *)data; + d = *(int *)ap->a_data; DPRINTF(("ucomioctl: TIOCMSET, 0x%x\n", d)); (void)ucomctl(sc, d, DMSET); break; case TIOCMBIS: - d = *(int *)data; + d = *(int *)ap->a_data; DPRINTF(("ucomioctl: TIOCMBIS, 0x%x\n", d)); (void)ucomctl(sc, d, DMBIS); break; case TIOCMBIC: - d = *(int *)data; + d = *(int *)ap->a_data; DPRINTF(("ucomioctl: TIOCMBIC, 0x%x\n", d)); (void)ucomctl(sc, d, DMBIC); break; case TIOCMGET: d = ucomctl(sc, 0, DMGET); DPRINTF(("ucomioctl: TIOCMGET, 0x%x\n", d)); - *(int *)data = d; + *(int *)ap->a_data = d; break; default: - DPRINTF(("ucomioctl: error: our cmd = 0x%08lx\n", cmd)); + DPRINTF(("ucomioctl: error: our cmd = 0x%08lx\n", ap->a_cmd)); error = ENOTTY; break; } diff --git a/sys/dev/usbmisc/ufm/ufm.c b/sys/dev/usbmisc/ufm/ufm.c index d8653b3f15..848cba301a 100644 --- a/sys/dev/usbmisc/ufm/ufm.c +++ b/sys/dev/usbmisc/ufm/ufm.c @@ -30,7 +30,7 @@ /* * $FreeBSD: src/sys/dev/usb/ufm.c,v 1.16 2003/10/04 21:41:01 joe Exp $ - * $DragonFly: src/sys/dev/usbmisc/ufm/ufm.c,v 1.9 2005/06/02 20:40:47 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/ufm/ufm.c,v 1.10 2006/07/28 02:17:39 dillon Exp $ */ #include @@ -93,15 +93,11 @@ d_ioctl_t ufmioctl; #define UFM_CDEV_MAJOR 200 -Static struct cdevsw ufm_cdevsw = { - /* name */ "ufm", - /* cmaj */ UFM_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - ufmopen, ufmclose, noread, nowrite, - ufmioctl, nopoll, nommap, nostrategy, - nodump, nopsize +Static struct dev_ops ufm_ops = { + { "ufm", UFM_CDEV_MAJOR, 0 }, + .d_open = ufmopen, + .d_close = ufmclose, + .d_ioctl = ufmioctl, }; #endif /*defined(__FreeBSD__)*/ @@ -209,8 +205,8 @@ USB_ATTACH(ufm) #if defined(__FreeBSD__) || defined(__DragonFly__) /* XXX no error trapping, no storing of dev_t */ - cdevsw_add(&ufm_cdevsw, -1, device_get_unit(self)); - make_dev(&ufm_cdevsw, device_get_unit(self), + dev_ops_add(&ufm_ops, -1, device_get_unit(self)); + make_dev(&ufm_ops, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0644, "ufm%d", device_get_unit(self)); #elif defined(__NetBSD__) || defined(__OpenBSD__) @@ -229,20 +225,21 @@ USB_ATTACH(ufm) int -ufmopen(dev_t dev, int flag, int mode, usb_proc_ptr td) +ufmopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ufm_softc *sc; int unit = UFMUNIT(dev); USB_GET_SC_OPEN(ufm, unit, sc); DPRINTFN(5, ("ufmopen: flag=%d, mode=%d, unit=%d\n", - flag, mode, unit)); + ap->a_oflags, ap->a_devtype, unit)); if (sc->sc_opened) return (EBUSY); - if ((flag & (FWRITE|FREAD)) != (FWRITE|FREAD)) + if ((ap->a_oflags & (FWRITE|FREAD)) != (FWRITE|FREAD)) return (EACCES); sc->sc_opened = 1; @@ -250,14 +247,16 @@ ufmopen(dev_t dev, int flag, int mode, usb_proc_ptr td) } int -ufmclose(dev_t dev, int flag, int mode, usb_proc_ptr td) +ufmclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ufm_softc *sc; int unit = UFMUNIT(dev); USB_GET_SC(ufm, unit, sc); - DPRINTFN(5, ("ufmclose: flag=%d, mode=%d, unit=%d\n", flag, mode, unit)); + DPRINTFN(5, ("ufmclose: flag=%d, mode=%d, unit=%d\n", + ap->a_fflag, ap->a_devtype, unit)); sc->sc_opened = 0; sc->sc_refcnt = 0; return 0; @@ -372,8 +371,10 @@ ufm_get_stat(struct ufm_softc *sc, caddr_t addr) } int -ufmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr td) +ufmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t addr = ap->a_data; struct ufm_softc *sc; int unit = UFMUNIT(dev); @@ -381,7 +382,7 @@ ufmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr td) USB_GET_SC(ufm, unit, sc); - switch (cmd) { + switch (ap->a_cmd) { case FM_SET_FREQ: error = ufm_set_freq(sc, addr); break; diff --git a/sys/dev/usbmisc/ugen/ugen.c b/sys/dev/usbmisc/ugen/ugen.c index 61c3b6bea1..4c306d9d38 100644 --- a/sys/dev/usbmisc/ugen/ugen.c +++ b/sys/dev/usbmisc/ugen/ugen.c @@ -2,7 +2,7 @@ * $NetBSD: ugen.c,v 1.27 1999/10/28 12:08:38 augustss Exp $ * $NetBSD: ugen.c,v 1.59 2002/07/11 21:14:28 augustss Exp $ * $FreeBSD: src/sys/dev/usb/ugen.c,v 1.81 2003/11/09 09:17:22 tanimura Exp $ - * $DragonFly: src/sys/dev/usbmisc/ugen/ugen.c,v 1.17 2006/06/13 08:12:02 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/ugen/ugen.c,v 1.18 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -158,23 +158,14 @@ d_poll_t ugenpoll; #define UGEN_CDEV_MAJOR 114 -Static struct cdevsw ugen_cdevsw = { - /* name */ "ugen", - /* maj */ UGEN_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ugenopen, - /* close */ ugenclose, - /* read */ ugenread, - /* write */ ugenwrite, - /* ioctl */ ugenioctl, - /* poll */ ugenpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +Static struct dev_ops ugen_ops = { + { "ugen", UGEN_CDEV_MAJOR, 0 }, + .d_open = ugenopen, + .d_close = ugenclose, + .d_read = ugenread, + .d_write = ugenwrite, + .d_ioctl = ugenioctl, + .d_poll = ugenpoll, }; #endif @@ -185,7 +176,7 @@ Static void ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr, Static int ugen_do_read(struct ugen_softc *, int, struct uio *, int); Static int ugen_do_write(struct ugen_softc *, int, struct uio *, int); Static int ugen_do_ioctl(struct ugen_softc *, int, u_long, - caddr_t, int, usb_proc_ptr); + caddr_t, int); #if defined(__FreeBSD__) || defined(__DragonFly__) Static void ugen_make_devnodes(struct ugen_softc *sc); Static void ugen_destroy_devnodes(struct ugen_softc *sc); @@ -254,9 +245,9 @@ USB_ATTACH(ugen) #if defined(__FreeBSD__) || defined(__DragonFly__) /* the main device, ctrl endpoint */ - cdevsw_add(&ugen_cdevsw, + dev_ops_add(&ugen_ops, UGENUNITMASK, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0)); - make_dev(&ugen_cdevsw, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0), + make_dev(&ugen_ops, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0), UID_ROOT, GID_OPERATOR, 0644, "%s", USBDEVNAME(sc->sc_dev)); #endif @@ -281,7 +272,7 @@ ugen_make_devnodes(struct ugen_softc *sc) * In the if clause above we check whether one * of the structs is populated. */ - dev = make_dev(&ugen_cdevsw, + dev = make_dev(&ugen_ops, UGENMINOR(USBDEVUNIT(sc->sc_dev), endptno), UID_ROOT, GID_OPERATOR, 0644, "%s.%d", @@ -408,8 +399,9 @@ ugen_set_config(struct ugen_softc *sc, int configno) } int -ugenopen(dev_t dev, int flag, int mode, usb_proc_ptr p) +ugenopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ugen_softc *sc; int unit = UGENUNIT(dev); int endpt = UGENENDPOINT(dev); @@ -424,7 +416,7 @@ ugenopen(dev_t dev, int flag, int mode, usb_proc_ptr p) USB_GET_SC_OPEN(ugen, unit, sc); DPRINTFN(5, ("ugenopen: flag=%d, mode=%d, unit=%d endpt=%d\n", - flag, mode, unit, endpt)); + ap->a_oflags, ap->a_devtype, unit, endpt)); if (sc == NULL || sc->sc_dying) return (ENXIO); @@ -439,7 +431,7 @@ ugenopen(dev_t dev, int flag, int mode, usb_proc_ptr p) /* Make sure there are pipes for all directions. */ for (dir = OUT; dir <= IN; dir++) { - if (flag & (dir == OUT ? FWRITE : FREAD)) { + if (ap->a_oflags & (dir == OUT ? FWRITE : FREAD)) { sce = &sc->sc_endpoints[endpt][dir]; if (sce == 0 || sce->edesc == 0) return (ENXIO); @@ -449,7 +441,7 @@ ugenopen(dev_t dev, int flag, int mode, usb_proc_ptr p) /* Actually open the pipes. */ /* XXX Should back out properly if it fails. */ for (dir = OUT; dir <= IN; dir++) { - if (!(flag & (dir == OUT ? FWRITE : FREAD))) + if (!(ap->a_oflags & (dir == OUT ? FWRITE : FREAD))) continue; sce = &sc->sc_endpoints[endpt][dir]; sce->state = 0; @@ -548,8 +540,9 @@ ugenopen(dev_t dev, int flag, int mode, usb_proc_ptr p) } int -ugenclose(dev_t dev, int flag, int mode, usb_proc_ptr p) +ugenclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int endpt = UGENENDPOINT(dev); struct ugen_softc *sc; struct ugen_endpoint *sce; @@ -559,7 +552,7 @@ ugenclose(dev_t dev, int flag, int mode, usb_proc_ptr p) USB_GET_SC(ugen, UGENUNIT(dev), sc); DPRINTFN(5, ("ugenclose: flag=%d, mode=%d, unit=%d, endpt=%d\n", - flag, mode, UGENUNIT(dev), endpt)); + ap->a_fflag, ap->a_devtype, UGENUNIT(dev), endpt)); #ifdef DIAGNOSTIC if (!sc->sc_is_open[endpt]) { @@ -575,7 +568,7 @@ ugenclose(dev_t dev, int flag, int mode, usb_proc_ptr p) } for (dir = OUT; dir <= IN; dir++) { - if (!(flag & (dir == OUT ? FWRITE : FREAD))) + if (!(ap->a_fflag & (dir == OUT ? FWRITE : FREAD))) continue; sce = &sc->sc_endpoints[endpt][dir]; if (sce == NULL || sce->pipeh == NULL) @@ -763,8 +756,9 @@ done: } int -ugenread(dev_t dev, struct uio *uio, int flag) +ugenread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; int endpt = UGENENDPOINT(dev); struct ugen_softc *sc; int error; @@ -772,7 +766,7 @@ ugenread(dev_t dev, struct uio *uio, int flag) USB_GET_SC(ugen, UGENUNIT(dev), sc); sc->sc_refcnt++; - error = ugen_do_read(sc, endpt, uio, flag); + error = ugen_do_read(sc, endpt, ap->a_uio, ap->a_ioflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); @@ -873,8 +867,9 @@ done: } int -ugenwrite(dev_t dev, struct uio *uio, int flag) +ugenwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; int endpt = UGENENDPOINT(dev); struct ugen_softc *sc; int error; @@ -882,7 +877,7 @@ ugenwrite(dev_t dev, struct uio *uio, int flag) USB_GET_SC(ugen, UGENUNIT(dev), sc); sc->sc_refcnt++; - error = ugen_do_write(sc, endpt, uio, flag); + error = ugen_do_write(sc, endpt, ap->a_uio, ap->a_ioflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); @@ -952,7 +947,7 @@ USB_DETACH(ugen) #elif defined(__FreeBSD__) || defined(__DragonFly__) /* destroy the device for the control endpoint */ ugen_destroy_devnodes(sc); - cdevsw_remove(&ugen_cdevsw, + dev_ops_remove(&ugen_ops, UGENUNITMASK, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0)); #endif return (0); @@ -1169,7 +1164,7 @@ ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx) Static int ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, - caddr_t addr, int flag, usb_proc_ptr p) + caddr_t addr, int flag) { struct ugen_endpoint *sce; usbd_status err; @@ -1349,7 +1344,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, uio.uio_offset = 0; uio.uio_segflg = UIO_USERSPACE; uio.uio_rw = UIO_READ; - uio.uio_procp = p; + uio.uio_procp = curthread; error = uiomove((void *)cdesc, len, &uio); free(cdesc, M_TEMP); return (error); @@ -1395,7 +1390,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, uio.uio_rw = ur->ucr_request.bmRequestType & UT_READ ? UIO_READ : UIO_WRITE; - uio.uio_td = p; + uio.uio_td = curthread; ptr = malloc(len, M_TEMP, M_WAITOK); if (uio.uio_rw == UIO_WRITE) { error = uiomove(ptr, len, &uio); @@ -1433,8 +1428,9 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, } int -ugenioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) +ugenioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int endpt = UGENENDPOINT(dev); struct ugen_softc *sc; int error; @@ -1442,15 +1438,16 @@ ugenioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) USB_GET_SC(ugen, UGENUNIT(dev), sc); sc->sc_refcnt++; - error = ugen_do_ioctl(sc, endpt, cmd, addr, flag, p); + error = ugen_do_ioctl(sc, endpt, ap->a_cmd, ap->a_data, ap->a_fflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); } int -ugenpoll(dev_t dev, int events, usb_proc_ptr p) +ugenpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ugen_softc *sc; struct ugen_endpoint *sce; int revents = 0; @@ -1477,19 +1474,19 @@ ugenpoll(dev_t dev, int events, usb_proc_ptr p) crit_enter(); switch (sce->edesc->bmAttributes & UE_XFERTYPE) { case UE_INTERRUPT: - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sce->q.c_cc > 0) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(p, &sce->rsel); + selrecord(curthread, &sce->rsel); } break; case UE_ISOCHRONOUS: - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sce->cur != sce->fill) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(p, &sce->rsel); + selrecord(curthread, &sce->rsel); } break; case UE_BULK: @@ -1498,14 +1495,15 @@ ugenpoll(dev_t dev, int events, usb_proc_ptr p) * yield any data or a write will happen. * Pretend they will. */ - revents |= events & + revents |= ap->a_events & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM); break; default: break; } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } #if defined(__FreeBSD__) || defined(__DragonFly__) diff --git a/sys/dev/usbmisc/uhid/uhid.c b/sys/dev/usbmisc/uhid/uhid.c index 05219c8b2e..c18b14246d 100644 --- a/sys/dev/usbmisc/uhid/uhid.c +++ b/sys/dev/usbmisc/uhid/uhid.c @@ -1,7 +1,7 @@ /* * $NetBSD: uhid.c,v 1.46 2001/11/13 06:24:55 lukem Exp $ * $FreeBSD: src/sys/dev/usb/uhid.c,v 1.65 2003/11/09 09:17:22 tanimura Exp $ - * $DragonFly: src/sys/dev/usbmisc/uhid/uhid.c,v 1.15 2006/06/13 08:12:02 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/uhid/uhid.c,v 1.16 2006/07/28 02:17:39 dillon Exp $ */ /* Also already merged from NetBSD: @@ -154,23 +154,14 @@ d_poll_t uhidpoll; #define UHID_CDEV_MAJOR 122 -Static struct cdevsw uhid_cdevsw = { - /* name */ "uhid", - /* maj */ UHID_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ uhidopen, - /* close */ uhidclose, - /* read */ uhidread, - /* write */ uhidwrite, - /* ioctl */ uhidioctl, - /* poll */ uhidpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +Static struct dev_ops uhid_ops = { + { "uhid", UHID_CDEV_MAJOR, 0 }, + .d_open = uhidopen, + .d_close = uhidclose, + .d_read = uhidread, + .d_write = uhidwrite, + .d_ioctl = uhidioctl, + .d_poll = uhidpoll, }; #endif @@ -179,8 +170,7 @@ Static void uhid_intr(usbd_xfer_handle, usbd_private_handle, Static int uhid_do_read(struct uhid_softc *, struct uio *uio, int); Static int uhid_do_write(struct uhid_softc *, struct uio *uio, int); -Static int uhid_do_ioctl(struct uhid_softc *, u_long, caddr_t, int, - usb_proc_ptr); +Static int uhid_do_ioctl(struct uhid_softc *, u_long, caddr_t, int); USB_DECLARE_DRIVER(uhid); @@ -273,8 +263,8 @@ USB_ATTACH(uhid) sc->sc_repdesc_size = size; #if defined(__FreeBSD__) || defined(__DragonFly__) - cdevsw_add(&uhid_cdevsw, -1, device_get_unit(self)); - make_dev(&uhid_cdevsw, device_get_unit(self), + dev_ops_add(&uhid_ops, -1, device_get_unit(self)); + make_dev(&uhid_ops, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0644, "uhid%d", device_get_unit(self)); #endif @@ -338,7 +328,7 @@ USB_DETACH(uhid) mn = self->dv_unit; vdevgone(maj, mn, mn, VCHR); #elif defined(__FreeBSD__) || defined(__DragonFly__) - cdevsw_remove(&uhid_cdevsw, -1, device_get_unit(self)); + dev_ops_remove(&uhid_ops, -1, device_get_unit(self)); #endif if (sc->sc_repdesc) @@ -392,8 +382,9 @@ uhid_intr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status) } int -uhidopen(dev_t dev, int flag, int mode, usb_proc_ptr p) +uhidopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uhid_softc *sc; usbd_status err; @@ -439,8 +430,9 @@ uhidopen(dev_t dev, int flag, int mode, usb_proc_ptr p) } int -uhidclose(dev_t dev, int flag, int mode, usb_proc_ptr p) +uhidclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uhid_softc *sc; USB_GET_SC(uhid, UHIDUNIT(dev), sc); @@ -528,15 +520,16 @@ uhid_do_read(struct uhid_softc *sc, struct uio *uio, int flag) } int -uhidread(dev_t dev, struct uio *uio, int flag) +uhidread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uhid_softc *sc; int error; USB_GET_SC(uhid, UHIDUNIT(dev), sc); sc->sc_refcnt++; - error = uhid_do_read(sc, uio, flag); + error = uhid_do_read(sc, ap->a_uio, ap->a_ioflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); @@ -574,23 +567,23 @@ uhid_do_write(struct uhid_softc *sc, struct uio *uio, int flag) } int -uhidwrite(dev_t dev, struct uio *uio, int flag) +uhidwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uhid_softc *sc; int error; USB_GET_SC(uhid, UHIDUNIT(dev), sc); sc->sc_refcnt++; - error = uhid_do_write(sc, uio, flag); + error = uhid_do_write(sc, ap->a_uio, ap->a_ioflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); } int -uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, int flag, - usb_proc_ptr p) +uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, int flag) { struct usb_ctl_report_desc *rd; struct usb_ctl_report *re; @@ -608,7 +601,7 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, int flag, if (sc->sc_async != NULL) return (EBUSY); #if defined(__DragonFly__) - sc->sc_async = p->td_proc; + sc->sc_async = curproc; #elif __FreeBSD_version >= 500000 sc->sc_async = p->td_proc; #else @@ -706,23 +699,25 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, int flag, } int -uhidioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) +uhidioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uhid_softc *sc; int error; USB_GET_SC(uhid, UHIDUNIT(dev), sc); sc->sc_refcnt++; - error = uhid_do_ioctl(sc, cmd, addr, flag, p); + error = uhid_do_ioctl(sc, ap->a_cmd, ap->a_data, ap->a_fflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); } int -uhidpoll(dev_t dev, int events, usb_proc_ptr p) +uhidpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uhid_softc *sc; int revents = 0; @@ -732,16 +727,17 @@ uhidpoll(dev_t dev, int events, usb_proc_ptr p) return (EIO); crit_enter(); - if (events & (POLLOUT | POLLWRNORM)) - revents |= events & (POLLOUT | POLLWRNORM); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLOUT | POLLWRNORM)) + revents |= ap->a_events & (POLLOUT | POLLWRNORM); + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sc->sc_q.c_cc > 0) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(p, &sc->sc_rsel); + selrecord(curthread, &sc->sc_rsel); } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } #if defined(__FreeBSD__) || defined(__DragonFly__) diff --git a/sys/dev/usbmisc/ulpt/ulpt.c b/sys/dev/usbmisc/ulpt/ulpt.c index a8a65da19b..aa83cea473 100644 --- a/sys/dev/usbmisc/ulpt/ulpt.c +++ b/sys/dev/usbmisc/ulpt/ulpt.c @@ -1,7 +1,7 @@ /* * $NetBSD: ulpt.c,v 1.55 2002/10/23 09:14:01 jdolecek Exp $ * $FreeBSD: src/sys/dev/usb/ulpt.c,v 1.59 2003/09/28 20:48:13 phk Exp $ - * $DragonFly: src/sys/dev/usbmisc/ulpt/ulpt.c,v 1.12 2005/06/02 20:40:58 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/ulpt/ulpt.c,v 1.13 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -59,6 +59,7 @@ #endif #include #include +#include #include #include #include @@ -143,23 +144,12 @@ Static d_ioctl_t ulptioctl; #define ULPT_CDEV_MAJOR 113 -Static struct cdevsw ulpt_cdevsw = { - /* name */ "ulpt", - /* maj */ ULPT_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ulptopen, - /* close */ ulptclose, - /* read */ noread, - /* write */ ulptwrite, - /* ioctl */ ulptioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +Static struct dev_ops ulpt_ops = { + { "ulpt", ULPT_CDEV_MAJOR, 0 }, + .d_open = ulptopen, + .d_close = ulptclose, + .d_write = ulptwrite, + .d_ioctl = ulptioctl, }; #endif @@ -341,10 +331,10 @@ USB_ATTACH(ulpt) #endif #if defined(__FreeBSD__) || defined(__DragonFly__) - cdevsw_add(&ulpt_cdevsw, -1, device_get_unit(self)); - make_dev(&ulpt_cdevsw, device_get_unit(self), + dev_ops_add(&ulpt_ops, -1, device_get_unit(self)); + make_dev(&ulpt_ops, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0644, "ulpt%d", device_get_unit(self)); - make_dev(&ulpt_cdevsw, + make_dev(&ulpt_ops, device_get_unit(self)|ULPT_NOPRIME, UID_ROOT, GID_OPERATOR, 0644, "unlpt%d", device_get_unit(self)); #endif @@ -421,7 +411,7 @@ USB_DETACH(ulpt) mn = self->dv_unit; vdevgone(maj, mn, mn, VCHR); #elif defined(__FreeBSD__) || defined(__DragonFly__) - cdevsw_remove(&ulpt_cdevsw, -1, device_get_unit(self)); + dev_ops_remove(&ulpt_ops, -1, device_get_unit(self)); #endif usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, @@ -499,8 +489,9 @@ int ulptusein = 1; * Reset the printer, then wait until it's selected and not busy. */ int -ulptopen(dev_t dev, int flag, int mode, usb_proc_ptr p) +ulptopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; u_char flags = ULPTFLAGS(dev); struct ulpt_softc *sc; usbd_status err; @@ -634,8 +625,9 @@ ulpt_statusmsg(u_char status, struct ulpt_softc *sc) } int -ulptclose(dev_t dev, int flag, int mode, usb_proc_ptr p) +ulptclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ulpt_softc *sc; USB_GET_SC(ulpt, ULPTUNIT(dev), sc); @@ -706,8 +698,9 @@ ulpt_do_write(struct ulpt_softc *sc, struct uio *uio, int flags) } int -ulptwrite(dev_t dev, struct uio *uio, int flags) +ulptwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ulpt_softc *sc; int error; @@ -717,18 +710,18 @@ ulptwrite(dev_t dev, struct uio *uio, int flags) return (EIO); sc->sc_refcnt++; - error = ulpt_do_write(sc, uio, flags); + error = ulpt_do_write(sc, ap->a_uio, ap->a_ioflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); } int -ulptioctl(dev_t dev, u_long cmd, caddr_t data, int flag, usb_proc_ptr p) +ulptioctl(struct dev_ioctl_args *ap) { int error = 0; - switch (cmd) { + switch (ap->a_cmd) { default: error = ENODEV; } diff --git a/sys/dev/usbmisc/ums/ums.c b/sys/dev/usbmisc/ums/ums.c index bfbfa3ebb0..1ee1b345f6 100644 --- a/sys/dev/usbmisc/ums/ums.c +++ b/sys/dev/usbmisc/ums/ums.c @@ -1,6 +1,6 @@ /* * $FreeBSD: src/sys/dev/usb/ums.c,v 1.64 2003/11/09 09:17:22 tanimura Exp $ - * $DragonFly: src/sys/dev/usbmisc/ums/ums.c,v 1.16 2005/12/11 01:54:09 swildner Exp $ + * $DragonFly: src/sys/dev/usbmisc/ums/ums.c,v 1.17 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -154,23 +154,13 @@ Static d_poll_t ums_poll; #define UMS_CDEV_MAJOR 111 -Static struct cdevsw ums_cdevsw = { - /* name */ "ums", - /* maj */ UMS_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ums_open, - /* close */ ums_close, - /* read */ ums_read, - /* write */ nowrite, - /* ioctl */ ums_ioctl, - /* poll */ ums_poll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +Static struct dev_ops ums_ops = { + { "ums", UMS_CDEV_MAJOR, 0 }, + .d_open = ums_open, + .d_close = ums_close, + .d_read = ums_read, + .d_ioctl = ums_ioctl, + .d_poll = ums_poll, }; USB_DECLARE_DRIVER(ums); @@ -348,8 +338,8 @@ USB_ATTACH(ums) sc->rsel.si_flags = 0; sc->rsel.si_pid = 0; #endif - cdevsw_add(&ums_cdevsw, -1, device_get_unit(self)); - make_dev(&ums_cdevsw, device_get_unit(self), + dev_ops_add(&ums_ops, -1, device_get_unit(self)); + make_dev(&ums_ops, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0644, "ums%d", device_get_unit(self)); @@ -392,7 +382,7 @@ ums_detach(device_t self) sc->state &= ~UMS_SELECT; selwakeuppri(&sc->rsel, 0); } - cdevsw_remove(&ums_cdevsw, -1, device_get_unit(self)); + dev_ops_remove(&ums_ops, -1, device_get_unit(self)); return 0; } @@ -579,8 +569,9 @@ ums_disable(void *priv) } Static int -ums_open(dev_t dev, int flag, int fmt, usb_proc_ptr p) +ums_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ums_softc *sc; USB_GET_SC_OPEN(ums, UMSUNIT(dev), sc); @@ -589,8 +580,9 @@ ums_open(dev_t dev, int flag, int fmt, usb_proc_ptr p) } Static int -ums_close(dev_t dev, int flag, int fmt, usb_proc_ptr p) +ums_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ums_softc *sc; USB_GET_SC(ums, UMSUNIT(dev), sc); @@ -605,8 +597,10 @@ ums_close(dev_t dev, int flag, int fmt, usb_proc_ptr p) } Static int -ums_read(dev_t dev, struct uio *uio, int flag) +ums_read(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct ums_softc *sc; char buf[sizeof(sc->qbuf)]; int l = 0; @@ -621,7 +615,7 @@ ums_read(dev_t dev, struct uio *uio, int flag) } while (sc->qcount == 0 ) { - if (flag & IO_NDELAY) { /* non-blocking I/O */ + if (ap->a_ioflag & IO_NDELAY) { /* non-blocking I/O */ crit_exit(); return EWOULDBLOCK; } @@ -673,33 +667,37 @@ ums_read(dev_t dev, struct uio *uio, int flag) } Static int -ums_poll(dev_t dev, int events, usb_proc_ptr p) +ums_poll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ums_softc *sc; int revents = 0; USB_GET_SC(ums, UMSUNIT(dev), sc); - if (!sc) + if (!sc) { + ap->a_events = 0; return 0; + } crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sc->qcount) { - revents = events & (POLLIN | POLLRDNORM); + revents = ap->a_events & (POLLIN | POLLRDNORM); } else { sc->state |= UMS_SELECT; - selrecord(p, &sc->rsel); + selrecord(curthread, &sc->rsel); } } crit_exit(); - - return revents; + ap->a_events = revents; + return (0); } int -ums_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) +ums_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ums_softc *sc; int error = 0; mousemode_t mode; @@ -709,15 +707,15 @@ ums_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) if (!sc) return EIO; - switch(cmd) { + switch(ap->a_cmd) { case MOUSE_GETHWINFO: - *(mousehw_t *)addr = sc->hw; + *(mousehw_t *)ap->a_data = sc->hw; break; case MOUSE_GETMODE: - *(mousemode_t *)addr = sc->mode; + *(mousemode_t *)ap->a_data = sc->mode; break; case MOUSE_SETMODE: - mode = *(mousemode_t *)addr; + mode = *(mousemode_t *)ap->a_data; if (mode.level == -1) /* don't change the current setting */ @@ -754,14 +752,14 @@ ums_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) break; case MOUSE_GETLEVEL: - *(int *)addr = sc->mode.level; + *(int *)ap->a_data = sc->mode.level; break; case MOUSE_SETLEVEL: - if (*(int *)addr < 0 || *(int *)addr > 1) + if (*(int *)ap->a_data < 0 || *(int *)ap->a_data > 1) return (EINVAL); crit_enter(); - sc->mode.level = *(int *)addr; + sc->mode.level = *(int *)ap->a_data; if (sc->mode.level == 0) { if (sc->nbuttons > MOUSE_MSC_MAXBUTTON) @@ -789,7 +787,7 @@ ums_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) break; case MOUSE_GETSTATUS: { - mousestatus_t *status = (mousestatus_t *) addr; + mousestatus_t *status = (mousestatus_t *) ap->a_data; crit_enter(); *status = sc->status; diff --git a/sys/dev/usbmisc/urio/urio.c b/sys/dev/usbmisc/urio/urio.c index aaa82ec7ca..ff801190e0 100644 --- a/sys/dev/usbmisc/urio/urio.c +++ b/sys/dev/usbmisc/urio/urio.c @@ -30,7 +30,7 @@ /* * $FreeBSD: src/sys/dev/usb/urio.c,v 1.28 2003/08/25 22:01:06 joe Exp $ - * $DragonFly: src/sys/dev/usbmisc/urio/urio.c,v 1.11 2005/06/02 20:41:04 dillon Exp $ + * $DragonFly: src/sys/dev/usbmisc/urio/urio.c,v 1.12 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -120,15 +120,13 @@ d_ioctl_t urioioctl; #define URIO_CDEV_MAJOR 143 -Static struct cdevsw urio_cdevsw = { - /* name */ "urio", - /* cmaj */ URIO_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - urioopen, urioclose, urioread, uriowrite, - urioioctl, nopoll, nommap, nostrategy, - nodump, nopsize +Static struct dev_ops urio_ops = { + { "urio", URIO_CDEV_MAJOR, 0 }, + .d_open = urioopen, + .d_close = urioclose, + .d_read = urioread, + .d_write = uriowrite, + .d_ioctl = urioioctl, }; #define RIO_UE_GET_DIR(p) ((UE_GET_DIR(p) == UE_DIR_IN) ? RIO_IN :\ ((UE_GET_DIR(p) == UE_DIR_OUT) ? RIO_OUT :\ @@ -260,8 +258,8 @@ USB_ATTACH(urio) } #if defined(__FreeBSD__) || defined(__DragonFly__) - cdevsw_add(&urio_cdevsw, -1, device_get_unit(self)); - make_dev(&urio_cdevsw, device_get_unit(self), + dev_ops_add(&urio_ops, -1, device_get_unit(self)); + make_dev(&urio_ops, device_get_unit(self), UID_ROOT, GID_OPERATOR, 0644, "urio%d", device_get_unit(self)); #elif defined(__NetBSD__) || defined(__OpenBSD__) @@ -280,8 +278,9 @@ USB_ATTACH(urio) int -urioopen(dev_t dev, int flag, int mode, usb_proc_ptr p) +urioopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; #if (USBDI >= 1) struct urio_softc * sc; #endif @@ -289,12 +288,12 @@ urioopen(dev_t dev, int flag, int mode, usb_proc_ptr p) USB_GET_SC_OPEN(urio, unit, sc); DPRINTFN(5, ("urioopen: flag=%d, mode=%d, unit=%d\n", - flag, mode, unit)); + ap->a_oflags, ap->a_devtype, unit)); if (sc->sc_opened) return EBUSY; - if ((flag & (FWRITE|FREAD)) != (FWRITE|FREAD)) + if ((ap->a_oflags & (FWRITE|FREAD)) != (FWRITE|FREAD)) return EACCES; sc->sc_opened = 1; @@ -320,15 +319,17 @@ urioopen(dev_t dev, int flag, int mode, usb_proc_ptr p) } int -urioclose(dev_t dev, int flag, int mode, usb_proc_ptr p) +urioclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; #if (USBDI >= 1) struct urio_softc * sc; #endif int unit = URIOUNIT(dev); USB_GET_SC(urio, unit, sc); - DPRINTFN(5, ("urioclose: flag=%d, mode=%d, unit=%d\n", flag, mode, unit)); + DPRINTFN(5, ("urioclose: flag=%d, mode=%d, unit=%d\n", + ap->a_fflag, ap->a_devtype, unit)); if (sc->sc_pipeh_in) usbd_close_pipe(sc->sc_pipeh_in); @@ -343,8 +344,10 @@ urioclose(dev_t dev, int flag, int mode, usb_proc_ptr p) } int -urioread(dev_t dev, struct uio *uio, int flag) +urioread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; #if (USBDI >= 1) struct urio_softc * sc; usbd_xfer_handle reqh; @@ -417,8 +420,10 @@ urioread(dev_t dev, struct uio *uio, int flag) } int -uriowrite(dev_t dev, struct uio *uio, int flag) +uriowrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; #if (USBDI >= 1) struct urio_softc * sc; usbd_xfer_handle reqh; @@ -484,8 +489,9 @@ uriowrite(dev_t dev, struct uio *uio, int flag) int -urioioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) +urioioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; #if (USBDI >= 1) struct urio_softc * sc; #endif @@ -502,11 +508,11 @@ urioioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) USB_GET_SC(urio, unit, sc); - switch (cmd) { + switch (ap->a_cmd) { case RIO_RECV_COMMAND: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; - rio_cmd = (struct RioCommand *)addr; + rio_cmd = (struct RioCommand *)ap->a_data; if (rio_cmd == NULL) return EINVAL; len = rio_cmd->length; @@ -517,9 +523,9 @@ urioioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) break; case RIO_SEND_COMMAND: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; - rio_cmd = (struct RioCommand *)addr; + rio_cmd = (struct RioCommand *)ap->a_data; if (rio_cmd == NULL) return EINVAL; len = rio_cmd->length; @@ -554,7 +560,7 @@ urioioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, usb_proc_ptr p) uio.uio_rw = req.bmRequestType & UT_READ ? UIO_READ : UIO_WRITE; - uio.uio_td = p; + uio.uio_td = curthread; ptr = malloc(len, M_TEMP, M_WAITOK); if (uio.uio_rw == UIO_WRITE) { error = uiomove(ptr, len, &uio); @@ -674,7 +680,7 @@ Static int urio_detach(device_t self) { DPRINTF(("%s: disconnected\n", USBDEVNAME(self))); - cdevsw_remove(&urio_cdevsw, -1, device_get_unit(self)); + dev_ops_remove(&urio_ops, -1, device_get_unit(self)); /* XXX not implemented yet */ device_set_desc(self, NULL); return 0; diff --git a/sys/dev/usbmisc/uscanner/uscanner.c b/sys/dev/usbmisc/uscanner/uscanner.c index b70ce8f031..beccda8c0a 100644 --- a/sys/dev/usbmisc/uscanner/uscanner.c +++ b/sys/dev/usbmisc/uscanner/uscanner.c @@ -1,7 +1,7 @@ /* * $NetBSD: uscanner.c,v 1.30 2002/07/11 21:14:36 augustss Exp $ * $FreeBSD: src/sys/dev/usb/uscanner.c,v 1.48 2003/12/22 19:58:27 sanpei Exp $ - * $DragonFly: src/sys/dev/usbmisc/uscanner/uscanner.c,v 1.11 2006/06/22 08:22:27 corecode Exp $ + * $DragonFly: src/sys/dev/usbmisc/uscanner/uscanner.c,v 1.12 2006/07/28 02:17:39 dillon Exp $ */ /* Also already merged from NetBSD: @@ -265,23 +265,13 @@ d_poll_t uscannerpoll; #define USCANNER_CDEV_MAJOR 156 -Static struct cdevsw uscanner_cdevsw = { - /* name */ "uscanner", - /* maj */ USCANNER_CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ uscanneropen, - /* close */ uscannerclose, - /* read */ uscannerread, - /* write */ uscannerwrite, - /* ioctl */ noioctl, - /* poll */ uscannerpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +Static struct dev_ops uscanner_ops = { + { "uscanner", USCANNER_CDEV_MAJOR, 0 }, + .d_open = uscanneropen, + .d_close = uscannerclose, + .d_read = uscannerread, + .d_write = uscannerwrite, + .d_poll = uscannerpoll, }; #endif @@ -371,8 +361,8 @@ USB_ATTACH(uscanner) #if defined(__FreeBSD__) || defined(__DragonFly__) /* the main device, ctrl endpoint */ - cdevsw_add(&uscanner_cdevsw, -1, USBDEVUNIT(sc->sc_dev)); - make_dev(&uscanner_cdevsw, USBDEVUNIT(sc->sc_dev), + dev_ops_add(&uscanner_ops, -1, USBDEVUNIT(sc->sc_dev)); + make_dev(&uscanner_ops, USBDEVUNIT(sc->sc_dev), UID_ROOT, GID_OPERATOR, 0644, "%s", USBDEVNAME(sc->sc_dev)); #endif @@ -383,8 +373,9 @@ USB_ATTACH(uscanner) } int -uscanneropen(dev_t dev, int flag, int mode, usb_proc_ptr p) +uscanneropen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uscanner_softc *sc; int unit = USCANNERUNIT(dev); usbd_status err; @@ -392,7 +383,7 @@ uscanneropen(dev_t dev, int flag, int mode, usb_proc_ptr p) USB_GET_SC_OPEN(uscanner, unit, sc); DPRINTFN(5, ("uscanneropen: flag=%d, mode=%d, unit=%d\n", - flag, mode, unit)); + ap->a_oflags, ap->a_devtype, unit)); if (sc->sc_dying) return (ENXIO); @@ -446,14 +437,15 @@ uscanneropen(dev_t dev, int flag, int mode, usb_proc_ptr p) } int -uscannerclose(dev_t dev, int flag, int mode, usb_proc_ptr p) +uscannerclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uscanner_softc *sc; USB_GET_SC(uscanner, USCANNERUNIT(dev), sc); DPRINTFN(5, ("uscannerclose: flag=%d, mode=%d, unit=%d\n", - flag, mode, USCANNERUNIT(dev))); + ap->a_fflag, ap->a_devtype, USCANNERUNIT(dev))); #ifdef DIAGNOSTIC if (!(sc->sc_state & USCANNER_OPEN)) { @@ -544,15 +536,16 @@ uscanner_do_read(struct uscanner_softc *sc, struct uio *uio, int flag) } int -uscannerread(dev_t dev, struct uio *uio, int flag) +uscannerread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uscanner_softc *sc; int error; USB_GET_SC(uscanner, USCANNERUNIT(dev), sc); sc->sc_refcnt++; - error = uscanner_do_read(sc, uio, flag); + error = uscanner_do_read(sc, ap->a_uio, ap->a_ioflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); @@ -594,15 +587,16 @@ uscanner_do_write(struct uscanner_softc *sc, struct uio *uio, int flag) } int -uscannerwrite(dev_t dev, struct uio *uio, int flag) +uscannerwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uscanner_softc *sc; int error; USB_GET_SC(uscanner, USCANNERUNIT(dev), sc); sc->sc_refcnt++; - error = uscanner_do_write(sc, uio, flag); + error = uscanner_do_write(sc, ap->a_uio, ap->a_ioflag); if (--sc->sc_refcnt < 0) usb_detach_wakeup(USBDEV(sc->sc_dev)); return (error); @@ -666,7 +660,7 @@ USB_DETACH(uscanner) vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR); #elif defined(__FreeBSD__) || defined(__DragonFly__) /* destroy the device for the control endpoint */ - cdevsw_remove(&uscanner_cdevsw, -1, USBDEVUNIT(sc->sc_dev)); + dev_ops_remove(&uscanner_ops, -1, USBDEVUNIT(sc->sc_dev)); #endif usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, @@ -676,8 +670,9 @@ USB_DETACH(uscanner) } int -uscannerpoll(dev_t dev, int events, usb_proc_ptr p) +uscannerpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct uscanner_softc *sc; int revents = 0; @@ -691,10 +686,11 @@ uscannerpoll(dev_t dev, int events, usb_proc_ptr p) * yield any data or a write will happen. * Pretend they will. */ - revents |= events & + revents |= ap->a_events & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM); - return (revents); + ap->a_events = revents; + return (0); } #if defined(__FreeBSD__) || defined(__DragonFly__) diff --git a/sys/dev/video/bktr/bktr_os.c b/sys/dev/video/bktr/bktr_os.c index 7fe9f08564..df68ac12ba 100644 --- a/sys/dev/video/bktr/bktr_os.c +++ b/sys/dev/video/bktr/bktr_os.c @@ -31,7 +31,7 @@ * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/bktr/bktr_os.c,v 1.45 2004/03/17 17:50:28 njl Exp $ - * $DragonFly: src/sys/dev/video/bktr/bktr_os.c,v 1.13 2005/10/12 17:35:55 dillon Exp $ + * $DragonFly: src/sys/dev/video/bktr/bktr_os.c,v 1.14 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -54,6 +54,7 @@ #include #include #include +#include #include #include #include @@ -171,23 +172,15 @@ static d_mmap_t bktr_mmap; static d_poll_t bktr_poll; #define CDEV_MAJOR 92 -static struct cdevsw bktr_cdevsw = { - /* name */ "bktr", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ bktr_open, - /* close */ bktr_close, - /* read */ bktr_read, - /* write */ bktr_write, - /* ioctl */ bktr_ioctl, - /* poll */ bktr_poll, - /* mmap */ bktr_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops bktr_ops = { + { "bktr", CDEV_MAJOR, 0 }, + .d_open = bktr_open, + .d_close = bktr_close, + .d_read = bktr_read, + .d_write = bktr_write, + .d_ioctl = bktr_ioctl, + .d_poll = bktr_poll, + .d_mmap = bktr_mmap, }; DRIVER_MODULE(bktr, pci, bktr_driver, bktr_devclass, 0, 0); @@ -364,10 +357,10 @@ bktr_attach( device_t dev ) common_bktr_attach( bktr, unit, fun, rev ); /* make the device entries */ - cdevsw_add(&bktr_cdevsw, 0x0f, unit); - make_dev(&bktr_cdevsw, unit, 0, 0, 0444, "bktr%d", unit); - make_dev(&bktr_cdevsw, unit+16, 0, 0, 0444, "tuner%d", unit); - make_dev(&bktr_cdevsw, unit+32, 0, 0, 0444, "vbi%d" , unit); + dev_ops_add(&bktr_ops, 0x0f, unit); + make_dev(&bktr_ops, unit, 0, 0, 0444, "bktr%d", unit); + make_dev(&bktr_ops, unit+16, 0, 0, 0444, "tuner%d", unit); + make_dev(&bktr_ops, unit+32, 0, 0, 0444, "vbi%d" , unit); return 0; @@ -412,8 +405,8 @@ bktr_detach( device_t dev ) /* The memory is retained by the bktr_mem module so we can unload and */ /* then reload the main bktr driver module */ - /* removing the cdevsw automatically destroys all related devices */ - cdevsw_remove(&bktr_cdevsw, 0x0f, device_get_unit(dev)); + /* removing the ops automatically destroys all related devices */ + dev_ops_remove(&bktr_ops, 0x0f, device_get_unit(dev)); /* * Deallocate resources. @@ -481,8 +474,9 @@ get_bktr_mem( int unit, unsigned size ) * */ static int -bktr_open( dev_t dev, int flags, int fmt, struct thread *td ) +bktr_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; bktr_ptr_t bktr; int unit; int result; @@ -581,8 +575,9 @@ bktr_open( dev_t dev, int flags, int fmt, struct thread *td ) * */ static int -bktr_close( dev_t dev, int flags, int fmt, struct thread *td ) +bktr_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; bktr_ptr_t bktr; int unit; int result; @@ -620,8 +615,9 @@ bktr_close( dev_t dev, int flags, int fmt, struct thread *td ) * */ static int -bktr_read( dev_t dev, struct uio *uio, int ioflag ) +bktr_read(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; bktr_ptr_t bktr; int unit; @@ -636,9 +632,9 @@ bktr_read( dev_t dev, struct uio *uio, int ioflag ) switch ( FUNCTION( minor(dev) ) ) { case VIDEO_DEV: - return( video_read( bktr, unit, dev, uio ) ); + return( video_read( bktr, unit, dev, ap->a_uio ) ); case VBI_DEV: - return( vbi_read( bktr, uio, ioflag ) ); + return( vbi_read( bktr, ap->a_uio, ap->a_ioflag ) ); } return( ENXIO ); } @@ -648,7 +644,7 @@ bktr_read( dev_t dev, struct uio *uio, int ioflag ) * */ static int -bktr_write( dev_t dev, struct uio *uio, int ioflag ) +bktr_write(struct dev_write_args *ap) { return( EINVAL ); /* XXX or ENXIO ? */ } @@ -658,8 +654,9 @@ bktr_write( dev_t dev, struct uio *uio, int ioflag ) * */ static int -bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct thread *td ) +bktr_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; bktr_ptr_t bktr; int unit; @@ -677,9 +674,9 @@ bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct thread *td switch ( FUNCTION( minor(dev) ) ) { case VIDEO_DEV: - return( video_ioctl( bktr, unit, cmd, arg, td ) ); + return( video_ioctl( bktr, unit, ap->a_cmd, ap->a_data, curthread ) ); case TUNER_DEV: - return( tuner_ioctl( bktr, unit, cmd, arg, td ) ); + return( tuner_ioctl( bktr, unit, ap->a_cmd, ap->a_data, curthread ) ); } return( ENXIO ); @@ -690,15 +687,16 @@ bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct thread *td * */ static int -bktr_mmap( dev_t dev, vm_offset_t offset, int nprot ) +bktr_mmap(struct dev_mmap_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; bktr_ptr_t bktr; unit = UNIT(minor(dev)); if (FUNCTION(minor(dev)) > 0) /* only allow mmap on /dev/bktr[n] */ - return( -1 ); + return(EINVAL); /* Get the device data */ bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit); @@ -707,21 +705,23 @@ bktr_mmap( dev_t dev, vm_offset_t offset, int nprot ) return (ENXIO); } - if (nprot & PROT_EXEC) - return( -1 ); + if (ap->a_nprot & PROT_EXEC) + return(EINVAL); - if (offset < 0) - return( -1 ); + if (ap->a_offset < 0) + return(EINVAL); - if (offset >= bktr->alloc_pages * PAGE_SIZE) - return( -1 ); + if (ap->a_offset >= bktr->alloc_pages * PAGE_SIZE) + return(EINVAL); - return(atop(vtophys(bktr->bigbuf) + offset)); + ap->a_result = atop(vtophys(bktr->bigbuf) + ap->a_offset); + return(0); } static int -bktr_poll( dev_t dev, int events, struct thread *td) +bktr_poll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; bktr_ptr_t bktr; int revents = 0; @@ -738,14 +738,14 @@ bktr_poll( dev_t dev, int events, struct thread *td) LOCK_VBI(bktr); crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { switch ( FUNCTION( minor(dev) ) ) { case VBI_DEV: if(bktr->vbisize == 0) - selrecord(td, &bktr->vbi_select); + selrecord(curthread, &bktr->vbi_select); else - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); break; } } @@ -753,5 +753,6 @@ bktr_poll( dev_t dev, int events, struct thread *td) crit_exit(); UNLOCK_VBI(bktr); - return (revents); + ap->a_events = revents; + return (0); } diff --git a/sys/dev/video/ctx/ctx.c b/sys/dev/video/ctx/ctx.c index 2f59116940..a25856a6ef 100644 --- a/sys/dev/video/ctx/ctx.c +++ b/sys/dev/video/ctx/ctx.c @@ -9,7 +9,7 @@ * for damages incurred with its use. * * $FreeBSD: src/sys/i386/isa/ctx.c,v 1.36 2000/01/29 16:17:31 peter Exp $ - * $DragonFly: src/sys/dev/video/ctx/ctx.c,v 1.8 2004/05/19 22:52:53 dillon Exp $ + * $DragonFly: src/sys/dev/video/ctx/ctx.c,v 1.9 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -114,6 +114,7 @@ #include #include #include +#include #include #include #include @@ -140,23 +141,13 @@ static d_write_t ctxwrite; static d_ioctl_t ctxioctl; #define CDEV_MAJOR 40 -static struct cdevsw ctx_cdevsw = { - /* name */ "ctx", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ctxopen, - /* close */ ctxclose, - /* read */ ctxread, - /* write */ ctxwrite, - /* ioctl */ ctxioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops ctx_ops = { + { "ctx", CDEV_MAJOR, 0 }, + .d_open = ctxopen, + .d_close = ctxclose, + .d_read = ctxread, + .d_write = ctxwrite, + .d_ioctl = ctxioctl, }; @@ -202,15 +193,16 @@ ctxattach(struct isa_device * devp) sr->iobase = devp->id_iobase; sr->maddr = devp->id_maddr; sr->msize = devp->id_msize; - cdevsw_add(&ctx_cdevsw, -1, devp->id_unit); - make_dev(&ctx_cdevsw, devp->id_unit, 0, 0, 0600, + dev_ops_add(&ctx_ops, -1, devp->id_unit); + make_dev(&ctx_ops, devp->id_unit, 0, 0, 0600, "ctx%d", devp->id_unit); return (1); } static int -ctxopen(dev_t dev, int flags, int fmt, struct thread *td) +ctxopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ctx_soft_registers *sr; u_char unit; int i; @@ -264,8 +256,9 @@ ctxopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -ctxclose(dev_t dev, int flags, int fmt, struct thread *td) +ctxclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; unit = UNIT(minor(dev)); @@ -276,8 +269,10 @@ ctxclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -ctxwrite(dev_t dev, struct uio * uio, int ioflag) +ctxwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int unit, status = 0; int page, count, offset; struct ctx_soft_registers *sr; @@ -328,8 +323,10 @@ ctxwrite(dev_t dev, struct uio * uio, int ioflag) } static int -ctxread(dev_t dev, struct uio * uio, int ioflag) +ctxread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int unit, status = 0; int page, count, offset; struct ctx_soft_registers *sr; @@ -378,8 +375,9 @@ ctxread(dev_t dev, struct uio * uio, int ioflag) } static int -ctxioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +ctxioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int error; int unit, i; struct ctx_soft_registers *sr; @@ -388,7 +386,7 @@ ctxioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) unit = UNIT(minor(dev)); sr = &(ctx_sr[unit]); - switch (cmd) { + switch (ap->a_cmd) { case CTX_LIVE: sr->cp0 &= ~SEE_STORED_VIDEO; outb(sr->iobase + ctx_cp0, sr->cp0); @@ -419,7 +417,7 @@ ctxioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) outb(sr->iobase + ctx_cp0, sr->cp0); break; case CTX_SET_LUT: - bcopy((u_char *) data, sr->lutp, LUTSIZE); + bcopy((u_char *) ap->a_data, sr->lutp, LUTSIZE); outb(sr->iobase + ctx_cp0, (u_char) 0); outb(sr->iobase + ctx_cp1, (u_char) (LUT_LOAD_ENABLE | BLANK_DISPLAY)); for (i = 0; i < LUTSIZE; i++) { @@ -431,7 +429,7 @@ ctxioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) outb(sr->iobase + ctx_cp1, sr->cp1); break; case CTX_GET_LUT: - bcopy(sr->lutp, (u_char *) data, LUTSIZE); + bcopy(sr->lutp, (u_char *) ap->a_data, LUTSIZE); break; default: error = ENODEV; diff --git a/sys/dev/video/fb/fb.c b/sys/dev/video/fb/fb.c index 8073ec9245..ee1ada2ce1 100644 --- a/sys/dev/video/fb/fb.c +++ b/sys/dev/video/fb/fb.c @@ -26,7 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/fb/fb.c,v 1.11.2.2 2000/08/02 22:35:22 peter Exp $ - * $DragonFly: src/sys/dev/video/fb/fb.c,v 1.13 2005/10/30 23:00:56 swildner Exp $ + * $DragonFly: src/sys/dev/video/fb/fb.c,v 1.14 2006/07/28 02:17:39 dillon Exp $ */ #include "opt_fb.h" @@ -351,32 +351,15 @@ fbattach(device_t dev) #define FB_UNIT(dev) minor(dev) #define FB_MKMINOR(unit) (u) +static d_default_t fboperate; static d_open_t fbopen; -static d_close_t fbclose; -static d_read_t fbread; -static d_write_t fbwrite; -static d_ioctl_t fbioctl; -static d_mmap_t fbmmap; #define CDEV_MAJOR 123 /* XXX */ -static struct cdevsw fb_cdevsw = { - /* name */ FB_DRIVER_NAME, - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ fbopen, - /* close */ fbclose, - /* read */ fbread, - /* write */ fbwrite, - /* ioctl */ fbioctl, - /* poll */ nopoll, - /* mmap */ fbmmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops fb_ops = { + { FB_DRIVER_NAME, CDEV_MAJOR, 0 }, + .d_default = fboperate, + .d_open = fbopen }; static void @@ -385,7 +368,7 @@ vfbattach(void *arg) static int fb_devsw_installed = FALSE; if (!fb_devsw_installed) { - cdevsw_add(&fb_cdevsw, 0, 0); + dev_ops_add(&fb_ops, 0, 0); fb_devsw_installed = TRUE; } } @@ -434,83 +417,34 @@ fb_detach(dev_t dev, video_adapter_t *adp) } static int -fbopen(dev_t dev, int flag, int mode, struct thread *td) +fbopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit; dev_t fdev; unit = FB_UNIT(dev); - if (unit >= adapters) - return ENXIO; - if ((fdev = vidcdevsw[unit]) == NULL) - return ENXIO; - return dev_dopen(fdev, flag, mode, td); -} - -static int -fbclose(dev_t dev, int flag, int mode, struct thread *td) -{ - int unit; - dev_t fdev; - - unit = FB_UNIT(dev); - if ((fdev = vidcdevsw[unit]) == NULL) - return ENXIO; - return dev_dclose(fdev, flag, mode, td); -} - -static int -fbread(dev_t dev, struct uio *uio, int flag) -{ - int unit; - dev_t fdev; - - unit = FB_UNIT(dev); - if ((fdev = vidcdevsw[unit]) == NULL) - return ENXIO; - return dev_dread(fdev, uio, flag); -} - -static int -fbwrite(dev_t dev, struct uio *uio, int flag) -{ - int unit; - dev_t fdev; - - unit = FB_UNIT(dev); - if ((fdev = vidcdevsw[unit]) == NULL) + if (unit < 0 || unit >= adapters) return ENXIO; - return dev_dwrite(fdev, uio, flag); -} - -static int -fbioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) -{ - int unit; - dev_t fdev; - - unit = FB_UNIT(dev); if ((fdev = vidcdevsw[unit]) == NULL) return ENXIO; - return dev_dioctl(fdev, cmd, arg, flag, td); + return dev_dopen(fdev, ap->a_oflags, ap->a_devtype, ap->a_cred); } static int -fbmmap(dev_t dev, vm_offset_t offset, int nprot) +fboperate(struct dev_generic_args *ap) { + dev_t dev = ap->a_dev; int unit; dev_t fdev; unit = FB_UNIT(dev); if ((fdev = vidcdevsw[unit]) == NULL) return ENXIO; - return (dev_dmmap(fdev, offset, nprot)); + ap->a_dev = fdev; + return dev_doperate(ap); } -#if experimental -DEV_DRIVER_MODULE(fb, ???, fb_driver, fb_devclass, fb_cdevsw, 0, 0); -#endif - /* * Generic frame buffer cdev driver functions * Frame buffer subdrivers may call these functions to implement common @@ -518,7 +452,7 @@ DEV_DRIVER_MODULE(fb, ???, fb_driver, fb_devclass, fb_cdevsw, 0, 0); */ int genfbopen(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode, - struct thread *td) + struct ucred *cred) { crit_enter(); if (!(sc->gfb_flags & FB_OPEN)) @@ -527,8 +461,7 @@ int genfbopen(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode, return 0; } -int genfbclose(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode, - struct thread *td) +int genfbclose(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode) { crit_enter(); sc->gfb_flags &= ~FB_OPEN; @@ -569,7 +502,7 @@ int genfbwrite(genfb_softc_t *sc, video_adapter_t *adp, struct uio *uio, } int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp, u_long cmd, - caddr_t arg, int flag, struct thread *td) + caddr_t arg, int flag, struct ucred *cred) { int error; diff --git a/sys/dev/video/fb/fbreg.h b/sys/dev/video/fb/fbreg.h index 69d63991c8..f76cb1b9bb 100644 --- a/sys/dev/video/fb/fbreg.h +++ b/sys/dev/video/fb/fbreg.h @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/fb/fbreg.h,v 1.6 1999/12/29 04:35:36 peter Exp $ - * $DragonFly: src/sys/dev/video/fb/fbreg.h,v 1.6 2005/02/01 16:30:02 joerg Exp $ + * $DragonFly: src/sys/dev/video/fb/fbreg.h,v 1.7 2006/07/28 02:17:39 dillon Exp $ */ #ifndef _DEV_FB_FBREG_H_ @@ -181,15 +181,16 @@ typedef struct genfb_softc { } genfb_softc_t; int genfbopen(genfb_softc_t *sc, video_adapter_t *adp, - int flag, int mode, struct thread *td); + int flag, int mode, struct ucred *cred); int genfbclose(genfb_softc_t *sc, video_adapter_t *adp, - int flag, int mode, struct thread *td); + int flag, int mode); int genfbread(genfb_softc_t *sc, video_adapter_t *adp, struct uio *uio, int flag); int genfbwrite(genfb_softc_t *sc, video_adapter_t *adp, struct uio *uio, int flag); int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp, - u_long cmd, caddr_t arg, int flag, struct thread *td); + u_long cmd, caddr_t arg, int flag, + struct ucred *cred); int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp, vm_offset_t offset, int prot); diff --git a/sys/dev/video/fb/vga.c b/sys/dev/video/fb/vga.c index 84fbb64ad6..2f90762513 100644 --- a/sys/dev/video/fb/vga.c +++ b/sys/dev/video/fb/vga.c @@ -27,7 +27,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/fb/vga.c,v 1.9.2.1 2001/08/11 02:58:44 yokota Exp $ - * $DragonFly: src/sys/dev/video/fb/vga.c,v 1.15 2005/10/30 23:00:56 swildner Exp $ + * $DragonFly: src/sys/dev/video/fb/vga.c,v 1.16 2006/07/28 02:17:39 dillon Exp $ */ #include "opt_vga.h" @@ -96,21 +96,23 @@ vga_attach_unit(int unit, vga_softc_t *sc, int flags) #ifdef FB_INSTALL_CDEV +struct ucred; + int -vga_open(dev_t dev, vga_softc_t *sc, int flag, int mode, struct thread *td) +vga_open(dev_t dev, vga_softc_t *sc, int flag, int mode, struct ucred *cred) { if (sc == NULL) return ENXIO; if (mode & (O_CREAT | O_APPEND | O_TRUNC)) return ENODEV; - return genfbopen(&sc->gensc, sc->adp, flag, mode, td); + return genfbopen(&sc->gensc, sc->adp, flag, mode, cred); } int -vga_close(dev_t dev, vga_softc_t *sc, int flag, int mode, struct thread *td) +vga_close(dev_t dev, vga_softc_t *sc, int flag, int mode) { - return genfbclose(&sc->gensc, sc->adp, flag, mode, td); + return genfbclose(&sc->gensc, sc->adp, flag, mode); } int @@ -127,9 +129,9 @@ vga_write(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag) int vga_ioctl(dev_t dev, vga_softc_t *sc, u_long cmd, caddr_t arg, int flag, - struct thread *td) + struct ucred *cred) { - return genfbioctl(&sc->gensc, sc->adp, cmd, arg, flag, td); + return genfbioctl(&sc->gensc, sc->adp, cmd, arg, flag, cred); } int diff --git a/sys/dev/video/fb/vgareg.h b/sys/dev/video/fb/vgareg.h index 3b3625bc57..780ff45738 100644 --- a/sys/dev/video/fb/vgareg.h +++ b/sys/dev/video/fb/vgareg.h @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/fb/vgareg.h,v 1.4 1999/12/29 04:35:37 peter Exp $ - * $DragonFly: src/sys/dev/video/fb/vgareg.h,v 1.6 2005/07/10 13:06:18 swildner Exp $ + * $DragonFly: src/sys/dev/video/fb/vgareg.h,v 1.7 2006/07/28 02:17:39 dillon Exp $ */ #ifndef _DEV_FB_VGAREG_H_ @@ -82,13 +82,12 @@ int vga_attach_unit(int unit, vga_softc_t *sc, int flags); #ifdef FB_INSTALL_CDEV int vga_open(dev_t dev, vga_softc_t *sc, int flag, int mode, - struct thread *td); -int vga_close(dev_t dev, vga_softc_t *sc, int flag, int mode, - struct thread *td); + struct ucred *cred); +int vga_close(dev_t dev, vga_softc_t *sc, int flag, int mode); int vga_read(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag); int vga_write(dev_t dev, vga_softc_t *sc, struct uio *uio, int flag); int vga_ioctl(dev_t dev, vga_softc_t *sc, u_long cmd, caddr_t arg, - int flag, struct thread *td); + int flag, struct ucred *cred); int vga_mmap(dev_t dev, vga_softc_t *sc, vm_offset_t offset, int prot); #endif diff --git a/sys/dev/video/gsc/gsc.c b/sys/dev/video/gsc/gsc.c index 3402402cde..60bf673c0a 100644 --- a/sys/dev/video/gsc/gsc.c +++ b/sys/dev/video/gsc/gsc.c @@ -32,7 +32,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/i386/isa/gsc.c,v 1.35.2.1 2000/08/08 19:49:53 peter Exp $ - * $DragonFly: src/sys/dev/video/gsc/gsc.c,v 1.11 2006/04/30 17:22:17 dillon Exp $ + * $DragonFly: src/sys/dev/video/gsc/gsc.c,v 1.12 2006/07/28 02:17:39 dillon Exp $ * */ @@ -183,23 +183,12 @@ static d_read_t gscread; static d_ioctl_t gscioctl; #define CDEV_MAJOR 47 -static struct cdevsw gsc_cdevsw = { - /* name */ "gsc", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ gscopen, - /* close */ gscclose, - /* read */ gscread, - /* write */ nowrite, - /* ioctl */ gscioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops gsc_ops = { + { "gsc", CDEV_MAJOR, 0 }, + .d_open = gscopen, + .d_close = gscclose, + .d_read = gscread, + .d_ioctl = gscioctl, }; @@ -529,13 +518,13 @@ gscattach(struct isa_device *isdp) scu->flags &= ~FLAG_DEBUG; #define GSC_UID 0 #define GSC_GID 13 - cdevsw_add(&gsc_cdevsw, 0xc0, unit << 6); - make_dev(&gsc_cdevsw, unit<<6, GSC_UID, GSC_GID, 0666, "gsc%d", unit); - make_dev(&gsc_cdevsw, ((unit<<6) + FRMT_PBM), + dev_ops_add(&gsc_ops, 0xc0, unit << 6); + make_dev(&gsc_ops, unit<<6, GSC_UID, GSC_GID, 0666, "gsc%d", unit); + make_dev(&gsc_ops, ((unit<<6) + FRMT_PBM), GSC_UID, GSC_GID, 0666, "gsc%dp", unit); - make_dev(&gsc_cdevsw, ((unit<<6) + DBUG_MASK), + make_dev(&gsc_ops, ((unit<<6) + DBUG_MASK), GSC_UID, GSC_GID, 0666, "gsc%dd", unit); - make_dev(&gsc_cdevsw, ((unit<<6) + DBUG_MASK+FRMT_PBM), + make_dev(&gsc_ops, ((unit<<6) + DBUG_MASK+FRMT_PBM), GSC_UID, GSC_GID, 0666, "gsc%dpd", unit); return ATTACH_SUCCESS; @@ -551,8 +540,9 @@ gscattach(struct isa_device *isdp) */ static int -gscopen (dev_t dev, int flags, int fmt, struct thread *td) +gscopen (struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct gsc_unit *scu; int unit; @@ -618,8 +608,9 @@ gscopen (dev_t dev, int flags, int fmt, struct thread *td) */ static int -gscclose (dev_t dev, int flags, int fmt, struct thread *td) +gscclose (struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT(minor(dev)); struct gsc_unit *scu = unittab + unit; @@ -651,8 +642,10 @@ gscclose (dev_t dev, int flags, int fmt, struct thread *td) */ static int -gscread (dev_t dev, struct uio *uio, int ioflag) +gscread (struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int unit = UNIT(minor(dev)); struct gsc_unit *scu = unittab + unit; size_t nbytes; @@ -741,8 +734,10 @@ gscread (dev_t dev, struct uio *uio, int ioflag) */ static int -gscioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +gscioctl (struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; int unit = UNIT(minor(dev)); struct gsc_unit *scu = unittab + unit; @@ -756,7 +751,7 @@ gscioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) return ENXIO; } - switch(cmd) { + switch(ap->a_cmd) { case GSC_SRESSW: lprintf(("gsc%d.ioctl:GSC_SRESSW\n", unit)); if ( scu->flags & READING ) @@ -780,7 +775,7 @@ gscioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) unit, *(int *)data)); { int g; struct gsc_geom geom = NEW_GEOM; - if ( cmd == GSC_SRES ) + if ( ap->a_cmd == GSC_SRES ) geom.dpi = *(int *)data; else geom.dpl = *(int *)data; diff --git a/sys/dev/video/meteor/meteor.c b/sys/dev/video/meteor/meteor.c index 4d990d66cb..d38ce044e7 100644 --- a/sys/dev/video/meteor/meteor.c +++ b/sys/dev/video/meteor/meteor.c @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/meteor.c,v 1.49 1999/09/25 18:24:41 phk Exp $ - * $DragonFly: src/sys/dev/video/meteor/meteor.c,v 1.15 2005/06/16 21:12:43 dillon Exp $ + * $DragonFly: src/sys/dev/video/meteor/meteor.c,v 1.16 2006/07/28 02:17:39 dillon Exp $ */ /* Change History: @@ -152,6 +152,7 @@ #include #include #include +#include #include #include #include @@ -220,23 +221,14 @@ static d_ioctl_t meteor_ioctl; static d_mmap_t meteor_mmap; #define CDEV_MAJOR 67 -static struct cdevsw meteor_cdevsw = { - /* name */ "meteor", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ meteor_open, - /* close */ meteor_close, - /* read */ meteor_read, - /* write */ meteor_write, - /* ioctl */ meteor_ioctl, - /* poll */ nopoll, - /* mmap */ meteor_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops meteor_ops = { + { "meteor", CDEV_MAJOR, 0 }, + .d_open = meteor_open, + .d_close = meteor_close, + .d_read = meteor_read, + .d_write = meteor_write, + .d_ioctl = meteor_ioctl, + .d_mmap = meteor_mmap, }; #endif @@ -1113,8 +1105,8 @@ met_attach(pcici_t tag, int unit) mtr->flags |= METEOR_INITALIZED | METEOR_AUTOMODE | METEOR_DEV0 | METEOR_RGB16; - cdevsw_add(&meteor_cdevsw, -1, unit); - make_dev(&meteor_cdevsw, unit, 0, 0, 0644, "meteor"); + dev_ops_add(&meteor_ops, -1, unit); + make_dev(&meteor_ops, unit, 0, 0, 0644, "meteor"); } #define UNIT(x) ((x) & 0x07) @@ -1152,10 +1144,10 @@ struct saa7116_regs *m; **--------------------------------------------------------- */ - int -meteor_open(dev_t dev, int flags, int fmt, struct thread *td) +meteor_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; meteor_reg_t *mtr; int unit; int i; @@ -1198,8 +1190,9 @@ meteor_open(dev_t dev, int flags, int fmt, struct thread *td) } int -meteor_close(dev_t dev, int flags, int fmt, struct thread *td) +meteor_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; meteor_reg_t *mtr; int unit; #ifdef METEOR_DEALLOC_ABOVE @@ -1278,8 +1271,10 @@ mreg_t *cap = &mtr->base->cap_cntl; } int -meteor_read(dev_t dev, struct uio *uio, int ioflag) +meteor_read(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; meteor_reg_t *mtr; int unit; int status; @@ -1315,14 +1310,16 @@ meteor_read(dev_t dev, struct uio *uio, int ioflag) } int -meteor_write(dev_t dev, struct uio *uio, int ioflag) +meteor_write(struct dev_write_args *ap) { return(0); } int -meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) +meteor_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; int error; int unit; unsigned int temp; @@ -1339,7 +1336,8 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) error = 0; - if (!arg) return(EINVAL); + if (data == NULL) + return(EINVAL); unit = UNIT(minor(dev)); if (unit >= NMETEOR) /* unit out of range */ return(ENXIO); @@ -1347,29 +1345,29 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) mtr = &(meteor[unit]); base = mtr->base; - switch (cmd) { + switch (ap->a_cmd) { case METEORSTS: - if(*arg) + if(*data) mtr->flags |= METEOR_WANT_TS; else mtr->flags &= ~METEOR_WANT_TS; break; case METEORGTS: if(mtr->flags & METEOR_WANT_TS) - *arg = 1; + *data = 1; else - *arg = 0; + *data = 0; break; #ifdef METEOR_TEST_VIDEO case METEORGVIDEO: - video = (struct meteor_video *)arg; + video = (struct meteor_video *)data; video->addr = mtr->video.addr; video->width = mtr->video.width; video->banksize = mtr->video.banksize; video->ramsize = mtr->video.ramsize; break; case METEORSVIDEO: - video = (struct meteor_video *)arg; + video = (struct meteor_video *)data; mtr->video.addr = video->addr; mtr->video.width = video->width; mtr->video.banksize = video->banksize; @@ -1377,23 +1375,23 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) break; #endif case METEORSFPS: - set_fps(mtr, *(u_short *)arg); + set_fps(mtr, *(u_short *)data); break; case METEORGFPS: - *(u_short *)arg = mtr->fps; + *(u_short *)data = mtr->fps; break; case METEORSSIGNAL: - if (*(int *)arg < 0 || *(int *)arg > _SIG_MAXSIG) + if (*(int *)data < 0 || *(int *)data > _SIG_MAXSIG) return EINVAL; - mtr->signal = *(int *) arg; + mtr->signal = *(int *) data; if (mtr->signal) { - mtr->proc = td->td_proc; /* might be NULL */ + mtr->proc = curproc; /* might be NULL */ } else { mtr->proc = (struct proc *)0; } break; case METEORGSIGNAL: - *(int *)arg = mtr->signal; + *(int *)data = mtr->signal; break; case METEORSTATUS: /* get 7196 status */ temp = 0; @@ -1405,64 +1403,64 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) SAA7196_REG(mtr, SAA7196_STDC) & ~0x02); SAA7196_READ(mtr); temp |= (base->i2c_read & 0xff000000L) >> 16; - *(u_short *)arg = temp; + *(u_short *)data = temp; break; case METEORSHUE: /* set hue */ - SAA7196_WRITE(mtr, SAA7196_HUEC, *(char *)arg); + SAA7196_WRITE(mtr, SAA7196_HUEC, *(char *)data); break; case METEORGHUE: /* get hue */ - *(char *)arg = SAA7196_REG(mtr, SAA7196_HUEC); + *(char *)data = SAA7196_REG(mtr, SAA7196_HUEC); break; case METEORSCHCV: /* set chrominance gain */ - SAA7196_WRITE(mtr, SAA7196_CGAINR, *(char *)arg); + SAA7196_WRITE(mtr, SAA7196_CGAINR, *(char *)data); break; case METEORGCHCV: /* get chrominance gain */ - *(char *)arg = SAA7196_REG(mtr, SAA7196_CGAINR); + *(char *)data = SAA7196_REG(mtr, SAA7196_CGAINR); break; case METEORSBRIG: /* set brightness */ - SAA7196_WRITE(mtr, SAA7196_BRIG, *(char *)arg); + SAA7196_WRITE(mtr, SAA7196_BRIG, *(char *)data); break; case METEORGBRIG: /* get brightness */ - *(char *)arg = SAA7196_REG(mtr, SAA7196_BRIG); + *(char *)data = SAA7196_REG(mtr, SAA7196_BRIG); break; case METEORSCSAT: /* set chroma saturation */ - SAA7196_WRITE(mtr, SAA7196_CSAT, *(char *)arg); + SAA7196_WRITE(mtr, SAA7196_CSAT, *(char *)data); break; case METEORGCSAT: /* get chroma saturation */ - *(char *)arg = SAA7196_REG(mtr, SAA7196_CSAT); + *(char *)data = SAA7196_REG(mtr, SAA7196_CSAT); break; case METEORSCONT: /* set contrast */ - SAA7196_WRITE(mtr, SAA7196_CONT, *(char *)arg); + SAA7196_WRITE(mtr, SAA7196_CONT, *(char *)data); break; case METEORGCONT: /* get contrast */ - *(char *)arg = SAA7196_REG(mtr, SAA7196_CONT); + *(char *)data = SAA7196_REG(mtr, SAA7196_CONT); break; case METEORSBT254: if((mtr->flags & METEOR_RGB) == 0) return EINVAL; - temp = *(unsigned short *)arg; + temp = *(unsigned short *)data; bt254_write(mtr, temp & 0xf, (temp & 0x0ff0) >> 4); break; case METEORGBT254: if((mtr->flags & METEOR_RGB) == 0) return EINVAL; - temp = *(unsigned short *)arg & 0x7; - *(unsigned short *)arg = mtr->bt254_reg[temp] << 4 | temp; + temp = *(unsigned short *)data & 0x7; + *(unsigned short *)data = mtr->bt254_reg[temp] << 4 | temp; break; case METEORSHWS: /* set horizontal window start */ - SAA7196_WRITE(mtr, SAA7196_HWS, *(char *)arg); + SAA7196_WRITE(mtr, SAA7196_HWS, *(char *)data); break; case METEORGHWS: /* get horizontal window start */ - *(char *)arg = SAA7196_REG(mtr, SAA7196_HWS); + *(char *)data = SAA7196_REG(mtr, SAA7196_HWS); break; case METEORSVWS: /* set vertical window start */ - SAA7196_WRITE(mtr, SAA7196_VWS, *(char *)arg); + SAA7196_WRITE(mtr, SAA7196_VWS, *(char *)data); break; case METEORGVWS: /* get vertical window start */ - *(char *)arg = SAA7196_REG(mtr, SAA7196_VWS); + *(char *)data = SAA7196_REG(mtr, SAA7196_VWS); break; case METEORSINPUT: /* set input device */ - switch(*(unsigned long *)arg & METEOR_DEV_MASK) { + switch(*(unsigned long *)data & METEOR_DEV_MASK) { case 0: /* default */ case METEOR_INPUT_DEV0: if(mtr->flags & METEOR_RGB) @@ -1532,10 +1530,10 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } break; case METEORGINPUT: /* get input device */ - *(u_long *)arg = mtr->flags & METEOR_DEV_MASK; + *(u_long *)data = mtr->flags & METEOR_DEV_MASK; break; case METEORSFMT: /* set input format */ - switch(*(unsigned long *)arg & METEOR_FORM_MASK ) { + switch(*(unsigned long *)data & METEOR_FORM_MASK ) { case 0: /* default */ case METEOR_FMT_NTSC: mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) | @@ -1601,11 +1599,11 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } break; case METEORGFMT: /* get input format */ - *(u_long *)arg = mtr->flags & METEOR_FORM_MASK; + *(u_long *)data = mtr->flags & METEOR_FORM_MASK; break; case METEORCAPTUR: temp = mtr->flags; - switch (*(int *) arg) { + switch (*(int *) data) { case METEOR_CAP_SINGLE: if (mtr->bigbuf==0) /* no frame buffer allocated */ return(ENOMEM); @@ -1646,7 +1644,7 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } break; case METEORCAPFRM: - frame = (struct meteor_capframe *) arg; + frame = (struct meteor_capframe *) data; if (!frame) return(EINVAL); switch (frame->command) { @@ -1704,7 +1702,7 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) break; case METEORSETGEO: - geo = (struct meteor_geomet *) arg; + geo = (struct meteor_geomet *) data; /* Either even or odd, if even & odd, then these a zero */ if((geo->oformat & METEOR_GEO_ODD_ONLY) && @@ -2052,7 +2050,7 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) ((geo->oformat&METEOR_GEO_UNSIGNED)?0:0x10)); break; case METEORGETGEO: - geo = (struct meteor_geomet *) arg; + geo = (struct meteor_geomet *) data; geo->rows = mtr->rows; geo->columns = mtr->cols; geo->frames = mtr->frames; @@ -2072,7 +2070,7 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } break; case METEORSCOUNT: /* (re)set error counts */ - cnt = (struct meteor_counts *) arg; + cnt = (struct meteor_counts *) data; mtr->fifo_errors = cnt->fifo_errors; mtr->dma_errors = cnt->dma_errors; mtr->frames_captured = cnt->frames_captured; @@ -2080,7 +2078,7 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) mtr->odd_fields_captured = cnt->odd_fields_captured; break; case METEORGCOUNT: /* get error counts */ - cnt = (struct meteor_counts *) arg; + cnt = (struct meteor_counts *) data; cnt->fifo_errors = mtr->fifo_errors; cnt->dma_errors = mtr->dma_errors; cnt->frames_captured = mtr->frames_captured; @@ -2096,9 +2094,9 @@ meteor_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } int -meteor_mmap(dev_t dev, vm_offset_t offset, int nprot) +meteor_mmap(struct dev_mmap_args *ap) { - + dev_t dev = ap->a_head.a_dev; int unit; meteor_reg_t *mtr; @@ -2109,11 +2107,11 @@ meteor_mmap(dev_t dev, vm_offset_t offset, int nprot) mtr = &(meteor[unit]); - if(nprot & PROT_EXEC) + if (ap->a_nprot & PROT_EXEC) return -1; - if(offset >= mtr->alloc_pages * PAGE_SIZE) + if (ap->a_offset >= mtr->alloc_pages * PAGE_SIZE) return -1; - return i386_btop(vtophys(mtr->bigbuf) + offset); + return i386_btop(vtophys(mtr->bigbuf) + ap->a_offset); } diff --git a/sys/i386/acpica5/acpi_machdep.c b/sys/i386/acpica5/acpi_machdep.c index 116cb416e4..b1a888883b 100644 --- a/sys/i386/acpica5/acpi_machdep.c +++ b/sys/i386/acpica5/acpi_machdep.c @@ -24,12 +24,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.20 2004/05/05 19:51:15 njl Exp $ - * $DragonFly: src/sys/i386/acpica5/Attic/acpi_machdep.c,v 1.8 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/i386/acpica5/Attic/acpi_machdep.c,v 1.9 2006/07/28 02:17:39 dillon Exp $ */ #include #include #include +#include #include #include #include @@ -65,17 +66,13 @@ static d_ioctl_t apmioctl; static d_poll_t apmpoll; #define CDEV_MAJOR 39 -static struct cdevsw apm_cdevsw = { - .d_name = "apm", - .d_maj = CDEV_MAJOR, - .d_flags = 0, - .d_port = NULL, - .d_clone = NULL, - .old_open = apmopen, - .old_close = apmclose, - .old_write = apmwrite, - .old_ioctl = apmioctl, - .old_poll = apmpoll +static struct dev_ops apm_ops = { + { "apm", CDEV_MAJOR, 0 }, + .d_open = apmopen, + .d_close = apmclose, + .d_write = apmwrite, + .d_ioctl = apmioctl, + .d_poll = apmpoll }; static int @@ -195,19 +192,19 @@ acpi_capm_get_pwstatus(apm_pwstatus_t app) } static int -apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) +apmopen(struct dev_open_args *ap) { return (0); } static int -apmclose(dev_t dev, int flag, int fmt, d_thread_t *td) +apmclose(struct dev_close_args *ap) { return (0); } static int -apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) +apmioctl(struct dev_ioctl_args *ap) { int error = 0; struct acpi_softc *acpi_sc; @@ -216,9 +213,9 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) acpi_sc = device_get_softc(acpi_dev); - switch (cmd) { + switch (ap->a_cmd) { case APMIO_SUSPEND: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); if (apm_softc.active) acpi_SetSleepState(acpi_sc, acpi_sc->acpi_suspend_sx); @@ -226,7 +223,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) error = EINVAL; break; case APMIO_STANDBY: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); if (apm_softc.active) acpi_SetSleepState(acpi_sc, acpi_sc->acpi_standby_sx); @@ -236,7 +233,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) case APMIO_GETINFO_OLD: if (acpi_capm_get_info(&info)) error = ENXIO; - aiop = (apm_info_old_t)addr; + aiop = (apm_info_old_t)ap->a_data; aiop->ai_major = info.ai_major; aiop->ai_minor = info.ai_minor; aiop->ai_acline = info.ai_acline; @@ -245,20 +242,20 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) aiop->ai_status = info.ai_status; break; case APMIO_GETINFO: - if (acpi_capm_get_info((apm_info_t)addr)) + if (acpi_capm_get_info((apm_info_t)ap->a_data)) error = ENXIO; break; case APMIO_GETPWSTATUS: - if (acpi_capm_get_pwstatus((apm_pwstatus_t)addr)) + if (acpi_capm_get_pwstatus((apm_pwstatus_t)ap->a_data)) error = ENXIO; break; case APMIO_ENABLE: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); apm_softc.active = 1; break; case APMIO_DISABLE: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); apm_softc.active = 0; break; @@ -267,13 +264,13 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) case APMIO_NOTHALTCPU: break; case APMIO_DISPLAY: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); break; case APMIO_BIOS: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); - bzero(addr, sizeof(struct apm_bios_arg)); + bzero(ap->a_data, sizeof(struct apm_bios_arg)); break; default: error = EINVAL; @@ -284,23 +281,24 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } static int -apmwrite(dev_t dev, struct uio *uio, int ioflag) +apmwrite(struct dev_write_args *ap) { - return (uio->uio_resid); + return (ap->a_uio->uio_resid); } static int -apmpoll(dev_t dev, int events, d_thread_t *td) +apmpoll(struct dev_poll_args *ap) { + ap->a_events = 0; return (0); } static void acpi_capm_init(struct acpi_softc *sc) { - cdevsw_add(&apm_cdevsw, 0, 0); - make_dev(&apm_cdevsw, 0, 0, 5, 0664, "apm"); - make_dev(&apm_cdevsw, 8, 0, 5, 0664, "apm"); + dev_ops_add(&apm_ops, 0, 0); + make_dev(&apm_ops, 0, 0, 5, 0664, "apm"); + make_dev(&apm_ops, 8, 0, 5, 0664, "apm"); printf("Warning: ACPI is disabling APM's device. You can't run both\n"); } diff --git a/sys/i386/apm/apm.c b/sys/i386/apm/apm.c index 53f2d73c5b..169e81a8e5 100644 --- a/sys/i386/apm/apm.c +++ b/sys/i386/apm/apm.c @@ -16,13 +16,14 @@ * Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * * $FreeBSD: src/sys/i386/apm/apm.c,v 1.114.2.5 2002/11/02 04:41:50 iwasaki Exp $ - * $DragonFly: src/sys/i386/apm/Attic/apm.c,v 1.14 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/i386/apm/Attic/apm.c,v 1.15 2006/07/28 02:17:39 dillon Exp $ */ #include #include #include #include +#include #include #include #include @@ -84,23 +85,13 @@ static d_ioctl_t apmioctl; static d_poll_t apmpoll; #define CDEV_MAJOR 39 -static struct cdevsw apm_cdevsw = { - /* name */ "apm", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ apmopen, - /* close */ apmclose, - /* read */ noread, - /* write */ apmwrite, - /* ioctl */ apmioctl, - /* poll */ apmpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops apm_ops = { + { "apm", CDEV_MAJOR, 0 }, + .d_open = apmopen, + .d_close = apmclose, + .d_write = apmwrite, + .d_ioctl = apmioctl, + .d_poll = apmpoll, }; static int apm_suspend_delay = 1; @@ -1099,15 +1090,16 @@ apm_attach(device_t dev) sc->initialized = 1; - cdevsw_add(&apm_cdevsw, 0, 0); - make_dev(&apm_cdevsw, 0, UID_ROOT, GID_OPERATOR, 0660, "apm"); - make_dev(&apm_cdevsw, 8, UID_ROOT, GID_OPERATOR, 0660, "apmctl"); + dev_ops_add(&apm_ops, 0, 0); + make_dev(&apm_ops, 0, UID_ROOT, GID_OPERATOR, 0660, "apm"); + make_dev(&apm_ops, 8, UID_ROOT, GID_OPERATOR, 0660, "apmctl"); return 0; } static int -apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) +apmopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct apm_softc *sc = &apm_softc; int ctl = APMDEV(dev); @@ -1116,7 +1108,7 @@ apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) switch (ctl) { case APMDEV_CTL: - if (!(flag & FWRITE)) + if (!(ap->a_oflags & FWRITE)) return EINVAL; if (sc->sc_flags & SCFLAG_OCTL) return EBUSY; @@ -1134,8 +1126,9 @@ apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) } static int -apmclose(dev_t dev, int flag, int fmt, d_thread_t *td) +apmclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct apm_softc *sc = &apm_softc; int ctl = APMDEV(dev); @@ -1157,8 +1150,9 @@ apmclose(dev_t dev, int flag, int fmt, d_thread_t *td) } static int -apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) +apmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct apm_softc *sc = &apm_softc; struct apm_bios_arg *args; int error = 0; @@ -1167,10 +1161,11 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) if (!sc->initialized) return (ENXIO); - APM_DPRINT("APM ioctl: cmd = 0x%lx\n", cmd); - switch (cmd) { + APM_DPRINT("APM ioctl: cmd = 0x%lx\n", ap->a_cmd); + + switch (ap->a_cmd) { case APMIO_SUSPEND: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); if (sc->active) apm_suspend(PMST_SUSPEND); @@ -1179,7 +1174,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) break; case APMIO_STANDBY: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); if (sc->active) apm_suspend(PMST_STANDBY); @@ -1194,7 +1189,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) if (apm_get_info(&info)) error = ENXIO; - aiop = (apm_info_old_t)addr; + aiop = (apm_info_old_t)ap->a_data; aiop->ai_major = info.ai_major; aiop->ai_minor = info.ai_minor; aiop->ai_acline = info.ai_acline; @@ -1204,45 +1199,45 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } break; case APMIO_GETINFO: - if (apm_get_info((apm_info_t)addr)) + if (apm_get_info((apm_info_t)ap->a_data)) error = ENXIO; break; case APMIO_GETPWSTATUS: - if (apm_get_pwstatus((apm_pwstatus_t)addr)) + if (apm_get_pwstatus((apm_pwstatus_t)ap->a_data)) error = ENXIO; break; case APMIO_ENABLE: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_event_enable(); break; case APMIO_DISABLE: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_event_disable(); break; case APMIO_HALTCPU: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_halt_cpu(); break; case APMIO_NOTHALTCPU: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_not_halt_cpu(); break; case APMIO_DISPLAY: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); - newstate = *(int *)addr; + newstate = *(int *)ap->a_data; if (apm_display(newstate)) error = ENXIO; break; case APMIO_BIOS: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); /* XXX compatibility with the old interface */ - args = (struct apm_bios_arg *)addr; + args = (struct apm_bios_arg *)ap->a_data; sc->bios.r.eax = args->eax; sc->bios.r.ebx = args->ebx; sc->bios.r.ecx = args->ecx; @@ -1284,12 +1279,12 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) int i; error = 0; - switch (cmd) { + switch (ap->a_cmd) { case APMIO_NEXTEVENT: if (!sc->event_count) { error = EAGAIN; } else { - evp = (struct apm_event_info *)addr; + evp = (struct apm_event_info *)ap->a_data; i = sc->event_ptr + APM_NEVENTS - sc->event_count; i %= APM_NEVENTS; *evp = sc->event_list[i]; @@ -1311,8 +1306,10 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } static int -apmwrite(dev_t dev, struct uio *uio, int ioflag) +apmwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct apm_softc *sc = &apm_softc; u_int event_type; int error; @@ -1341,20 +1338,20 @@ apmwrite(dev_t dev, struct uio *uio, int ioflag) } static int -apmpoll(dev_t dev, int events, d_thread_t *td) +apmpoll(struct dev_poll_args *ap) { struct apm_softc *sc = &apm_softc; int revents = 0; - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sc->event_count) { - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); } else { - selrecord(td, &sc->sc_rsel); + selrecord(curthread, &sc->sc_rsel); } } - - return (revents); + ap->a_events = revents; + return (0); } /* diff --git a/sys/i386/i386/elan-mmcr.c b/sys/i386/i386/elan-mmcr.c index 65cc4a1f0c..3fee2247a8 100644 --- a/sys/i386/i386/elan-mmcr.c +++ b/sys/i386/i386/elan-mmcr.c @@ -7,7 +7,7 @@ * ---------------------------------------------------------------------------- * * $FreeBSD: src/sys/i386/i386/elan-mmcr.c,v 1.6.2.1 2002/09/17 22:39:53 sam Exp $ - * $DragonFly: src/sys/i386/i386/Attic/elan-mmcr.c,v 1.7 2004/05/19 22:52:57 dillon Exp $ + * $DragonFly: src/sys/i386/i386/Attic/elan-mmcr.c,v 1.8 2006/07/28 02:17:39 dillon Exp $ * The AMD Elan sc520 is a system-on-chip gadget which is used in embedded * kind of things, see www.soekris.com for instance, and it has a few quirks * we need to deal with. @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -95,47 +96,37 @@ static d_ioctl_t elan_ioctl; static d_mmap_t elan_mmap; #define CDEV_MAJOR 100 /* Share with xrpu */ -static struct cdevsw elan_cdevsw = { - /* name */ "elan", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ elan_open, - /* close */ elan_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ elan_ioctl, - /* poll */ nopoll, - /* mmap */ elan_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops elan_ops = { + { "elan", CDEV_MAJOR, 0 }, + .d_open = elan_open, + .d_close = elan_close, + .d_ioctl = elan_ioctl, + .d_mmap = elan_mmap, }; static int -elan_open(dev_t dev, int flag, int mode, struct thread *td) +elan_open(struct dev_open_args *ap) { return (0); } static int -elan_close(dev_t dev, int flag, int mode, struct thread *td) +elan_close(struct dev_close_args *ap) { return (0); } static int -elan_mmap(dev_t dev, vm_offset_t offset, int nprot) +elan_mmap(struct dev_mmap_args *ap) { - if (offset >= 0x1000) - return (-1); - return (i386_btop(0xfffef000)); + if (ap->a_offset >= 0x1000) + return (EINVAL); + ap->a_result = i386_btop(0xfffef000); + return(0); } static int -elan_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) +elan_ioctl(struct dev_ioctl_args *ap) { return(ENOENT); } @@ -147,8 +138,8 @@ elan_drvinit(void) if (elan_mmcr == NULL) return; printf("Elan-mmcr driver: MMCR at %p\n", elan_mmcr); - cdevsw_add(&elan_cdevsw, 0, 0); - make_dev(&elan_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "elan-mmcr"); + dev_ops_add(&elan_ops, 0, 0); + make_dev(&elan_ops, 0, UID_ROOT, GID_WHEEL, 0600, "elan-mmcr"); return; } diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c index daab6be556..260c446d2c 100644 --- a/sys/i386/i386/mem.c +++ b/sys/i386/i386/mem.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/i386/i386/Attic/mem.c,v 1.16 2006/07/10 21:06:08 dillon Exp $ + * $DragonFly: src/sys/i386/i386/Attic/mem.c,v 1.17 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -74,49 +74,53 @@ static d_open_t mmopen; static d_close_t mmclose; -static d_read_t mmrw; +static d_read_t mmread; +static d_write_t mmwrite; static d_ioctl_t mmioctl; static d_mmap_t memmmap; static d_poll_t mmpoll; #define CDEV_MAJOR 2 -static struct cdevsw mem_cdevsw = { - /* name */ "mem", - /* maj */ CDEV_MAJOR, - /* flags */ D_MEM, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mmopen, - /* close */ mmclose, - /* read */ mmrw, - /* write */ mmrw, - /* ioctl */ mmioctl, - /* poll */ mmpoll, - /* mmap */ memmmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mem_ops = { + { "mem", CDEV_MAJOR, D_MEM }, + .d_open = mmopen, + .d_close = mmclose, + .d_read = mmread, + .d_write = mmwrite, + .d_ioctl = mmioctl, + .d_poll = mmpoll, + .d_mmap = memmmap, }; static int rand_bolt; static caddr_t zbuf; MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors"); -static int mem_ioctl (dev_t, u_long, caddr_t, int, struct thread *); -static int random_ioctl (dev_t, u_long, caddr_t, int, struct thread *); +static int mem_ioctl (dev_t, u_long, caddr_t, int, struct ucred *); +static int random_ioctl (dev_t, u_long, caddr_t, int, struct ucred *); struct mem_range_softc mem_range_softc; static int -mmclose(dev_t dev, int flags, int fmt, struct thread *td) +mmopen(struct dev_open_args *ap) { - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; + int error; switch (minor(dev)) { + case 0: + case 1: + if ((ap->a_oflags & FWRITE) && securelevel > 0) + return (EPERM); + break; case 14: - p->p_md.md_regs->tf_eflags &= ~PSL_IOPL; + error = suser_cred(ap->a_cred, 0); + if (error != 0) + return (error); + if (securelevel > 0) + return (EPERM); + curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; break; default: break; @@ -125,24 +129,13 @@ mmclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -mmopen(dev_t dev, int flags, int fmt, struct thread *td) +mmclose(struct dev_close_args *ap) { - int error; - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; switch (minor(dev)) { - case 0: - case 1: - if ((flags & FWRITE) && securelevel > 0) - return (EPERM); - break; case 14: - error = suser(td); - if (error != 0) - return (error); - if (securelevel > 0) - return (EPERM); - p->p_md.md_regs->tf_eflags |= PSL_IOPL; + curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; break; default: break; @@ -150,11 +143,9 @@ mmopen(dev_t dev, int flags, int fmt, struct thread *td) return (0); } + static int -mmrw(dev, uio, flags) - dev_t dev; - struct uio *uio; - int flags; +mmrw(dev_t dev, struct uio *uio, int flags) { int o; u_int c, v; @@ -308,6 +299,19 @@ mmrw(dev, uio, flags) return (error); } +static int +mmread(struct dev_read_args *ap) +{ + return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + +static int +mmwrite(struct dev_write_args *ap) +{ + return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + + @@ -315,35 +319,44 @@ mmrw(dev, uio, flags) * allow user processes to MMAP some memory sections * * instead of going through read/write * \*******************************************************/ + static int -memmmap(dev_t dev, vm_offset_t offset, int nprot) +memmmap(struct dev_mmap_args *ap) { - switch (minor(dev)) - { + dev_t dev = ap->a_head.a_dev; -/* minor device 0 is physical memory */ + switch (minor(dev)) { case 0: - return i386_btop(offset); - -/* minor device 1 is kernel memory */ + /* + * minor device 0 is physical memory + */ + ap->a_result = i386_btop(ap->a_offset); + return 0; case 1: - return i386_btop(vtophys(offset)); + /* + * minor device 1 is kernel memory + */ + ap->a_result = i386_btop(vtophys(ap->a_offset)); + return 0; default: - return -1; + return EINVAL; } } static int -mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +mmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; switch (minor(dev)) { case 0: - return mem_ioctl(dev, cmd, data, flags, td); + return mem_ioctl(dev, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); case 3: case 4: - return random_ioctl(dev, cmd, data, flags, td); + return random_ioctl(dev, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); } return (ENODEV); } @@ -355,7 +368,7 @@ mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) * and mem_range_attr_set. */ static int -mem_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +mem_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) { int nd, error = 0; struct mem_range_op *mo = (struct mem_range_op *)data; @@ -449,7 +462,7 @@ mem_range_AP_init(void) #endif static int -random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) { int error; int intr; @@ -466,7 +479,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_SETIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -474,7 +487,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_CLEARIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -485,7 +498,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_FINDIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -502,22 +515,29 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) } int -mmpoll(dev_t dev, int events, struct thread *td) +mmpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; + int revents; + switch (minor(dev)) { case 3: /* /dev/random */ - return random_poll(dev, events, td); + revents = random_poll(dev, ap->a_events); + break; case 4: /* /dev/urandom */ default: - return seltrue(dev, events, td); + revents = seltrue(dev, ap->a_events); + break; } + ap->a_events = revents; + return (0); } int iszerodev(dev) dev_t dev; { - return ((major(dev) == mem_cdevsw.d_maj) + return ((major(dev) == mem_ops.head.maj) && minor(dev) == 12); } @@ -529,14 +549,14 @@ mem_drvinit(void *unused) if (mem_range_softc.mr_op != NULL) mem_range_softc.mr_op->init(&mem_range_softc); - cdevsw_add(&mem_cdevsw, 0xf0, 0); - make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM, 0640, "mem"); - make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); - make_dev(&mem_cdevsw, 2, UID_ROOT, GID_WHEEL, 0666, "null"); - make_dev(&mem_cdevsw, 3, UID_ROOT, GID_WHEEL, 0644, "random"); - make_dev(&mem_cdevsw, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); - make_dev(&mem_cdevsw, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); - make_dev(&mem_cdevsw, 14, UID_ROOT, GID_WHEEL, 0600, "io"); + dev_ops_add(&mem_ops, 0xf0, 0); + make_dev(&mem_ops, 0, UID_ROOT, GID_KMEM, 0640, "mem"); + make_dev(&mem_ops, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); + make_dev(&mem_ops, 2, UID_ROOT, GID_WHEEL, 0666, "null"); + make_dev(&mem_ops, 3, UID_ROOT, GID_WHEEL, 0644, "random"); + make_dev(&mem_ops, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); + make_dev(&mem_ops, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); + make_dev(&mem_ops, 14, UID_ROOT, GID_WHEEL, 0600, "io"); } SYSINIT(memdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,mem_drvinit,NULL) diff --git a/sys/i386/i386/perfmon.c b/sys/i386/i386/perfmon.c index 7611c58db9..0ed5d52bef 100644 --- a/sys/i386/i386/perfmon.c +++ b/sys/i386/i386/perfmon.c @@ -27,12 +27,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/i386/perfmon.c,v 1.21 1999/09/25 18:24:04 phk Exp $ - * $DragonFly: src/sys/i386/i386/Attic/perfmon.c,v 1.8 2004/05/19 22:52:57 dillon Exp $ + * $DragonFly: src/sys/i386/i386/Attic/perfmon.c,v 1.9 2006/07/28 02:17:39 dillon Exp $ */ #include #include #include +#include #include #include @@ -56,28 +57,16 @@ static int writectl5(int); static int writectl6(int); #endif -static d_close_t perfmon_close; -static d_open_t perfmon_open; -static d_ioctl_t perfmon_ioctl; +static d_close_t perfmon_close; +static d_open_t perfmon_open; +static d_ioctl_t perfmon_ioctl; #define CDEV_MAJOR 2 /* We're really a minor of mem.c */ -static struct cdevsw perfmon_cdevsw = { - /* name */ "perfmon", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ perfmon_open, - /* close */ perfmon_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ perfmon_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops perfmon_ops = { + { "perfmon", CDEV_MAJOR, 0 }, + .d_open = perfmon_open, + .d_close = perfmon_close, + .d_ioctl = perfmon_ioctl, }; /* @@ -112,8 +101,8 @@ perfmon_init(void) #endif /* SMP */ /* NOTE: really a minor of mem. perfmon gets 32-47 */ - cdevsw_add(&perfmon_cdevsw, 0xf0, 32); - make_dev(&perfmon_cdevsw, 32, UID_ROOT, GID_KMEM, 0640, "perfmon"); + dev_ops_add(&perfmon_ops, 0xf0, 32); + make_dev(&perfmon_ops, 32, UID_ROOT, GID_KMEM, 0640, "perfmon"); } int @@ -290,12 +279,12 @@ static int writer; static int writerpmc; static int -perfmon_open(dev_t dev, int flags, int fmt, struct thread *td) +perfmon_open(struct dev_open_args *ap) { if (!perfmon_cpuok) return ENXIO; - if (flags & FWRITE) { + if (ap->a_oflags & FWRITE) { if (writer) { return EBUSY; } else { @@ -307,9 +296,9 @@ perfmon_open(dev_t dev, int flags, int fmt, struct thread *td) } static int -perfmon_close(dev_t dev, int flags, int fmt, struct thread *td) +perfmon_close(struct dev_close_args *ap) { - if (flags & FWRITE) { + if (ap->a_fflag & FWRITE) { int i; for (i = 0; i < NPMC; i++) { @@ -322,17 +311,18 @@ perfmon_close(dev_t dev, int flags, int fmt, struct thread *td) } static int -perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td) +perfmon_ioctl(struct dev_ioctl_args *ap) { + caddr_t param = ap->a_data; struct pmc *pmc; struct pmc_data *pmcd; struct pmc_tstamp *pmct; int *ip; int rv; - switch(cmd) { + switch(ap->a_cmd) { case PMIOSETUP: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; pmc = (struct pmc *)param; @@ -348,7 +338,7 @@ perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td break; case PMIOSTART: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; ip = (int *)param; @@ -356,7 +346,7 @@ perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td break; case PMIOSTOP: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; ip = (int *)param; @@ -364,7 +354,7 @@ perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td break; case PMIORESET: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; ip = (int *)param; diff --git a/sys/i386/isa/asc.c b/sys/i386/isa/asc.c index bfe6e0e1b1..849adb0bdc 100644 --- a/sys/i386/isa/asc.c +++ b/sys/i386/isa/asc.c @@ -35,7 +35,7 @@ */ /* * $FreeBSD: src/sys/i386/isa/asc.c,v 1.42.2.2 2001/03/01 03:22:39 jlemon Exp $ - * $DragonFly: src/sys/i386/isa/Attic/asc.c,v 1.13 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/i386/isa/Attic/asc.c,v 1.14 2006/07/28 02:17:39 dillon Exp $ */ #include "use_asc.h" @@ -187,23 +187,13 @@ static d_poll_t ascpoll; #define CDEV_MAJOR 71 -static struct cdevsw asc_cdevsw = { - /* name */ "asc", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ascopen, - /* close */ ascclose, - /* read */ ascread, - /* write */ nowrite, - /* ioctl */ ascioctl, - /* poll */ ascpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops asc_ops = { + { "asc", CDEV_MAJOR, 0 }, + .d_open = ascopen, + .d_close = ascclose, + .d_read = ascread, + .d_ioctl = ascioctl, + .d_poll = ascpoll, }; #define STATIC static @@ -480,13 +470,13 @@ ascattach(struct isa_device *isdp) scu->selp.si_pid=(pid_t)0; #define ASC_UID 0 #define ASC_GID 13 - cdevsw_add(&asc_cdevsw, 0xc0, unit << 6); - make_dev(&asc_cdevsw, unit<<6, ASC_UID, ASC_GID, 0666, "asc%d", unit); - make_dev(&asc_cdevsw, ((unit<<6) + FRMT_PBM), + dev_ops_add(&asc_ops, 0xc0, unit << 6); + make_dev(&asc_ops, unit<<6, ASC_UID, ASC_GID, 0666, "asc%d", unit); + make_dev(&asc_ops, ((unit<<6) + FRMT_PBM), ASC_UID, ASC_GID, 0666, "asc%dp", unit); - make_dev(&asc_cdevsw, ((unit<<6) + DBUG_MASK), + make_dev(&asc_ops, ((unit<<6) + DBUG_MASK), ASC_UID, ASC_GID, 0666, "asc%dd", unit); - make_dev(&asc_cdevsw, ((unit<<6) + DBUG_MASK+FRMT_PBM), + make_dev(&asc_ops, ((unit<<6) + DBUG_MASK+FRMT_PBM), ASC_UID, ASC_GID, 0666, "asc%dpd", unit); return ATTACH_SUCCESS; } @@ -543,8 +533,9 @@ ascintr(void *arg) ***/ STATIC int -ascopen(dev_t dev, int flags, int fmt, struct thread *td) +ascopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct asc_unit *scu; int unit; @@ -638,8 +629,9 @@ asc_startread(struct asc_unit *scu) ***/ STATIC int -ascclose(dev_t dev, int flags, int fmt, struct thread *td) +ascclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; @@ -696,8 +688,10 @@ pbm_init(struct asc_unit *scu) ***/ STATIC int -ascread(dev_t dev, struct uio *uio, int ioflag) +ascread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; size_t nbytes; @@ -785,8 +779,10 @@ ascread(dev_t dev, struct uio *uio, int ioflag) ***/ STATIC int -ascioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +ascioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; @@ -798,7 +794,7 @@ ascioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) unit, scu->flags); return ENXIO; } - switch(cmd) { + switch(ap->a_cmd) { case ASC_GRES: asc_reset(scu); get_resolution(scu); @@ -850,22 +846,19 @@ ascioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) } STATIC int -ascpoll(dev_t dev, int events, struct thread *td) +ascpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; - struct proc *p; struct proc *p1; int revents = 0; - p = td->td_proc; - KKASSERT(p); - crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (scu->sbuf.count >0) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else { if (!(scu->flags & DMA_ACTIVE)) dma_restart(scu); @@ -874,9 +867,10 @@ ascpoll(dev_t dev, int events, struct thread *td) && p1->p_wchan == (caddr_t)&selwait) scu->selp.si_flags = SI_COLL; else - scu->selp.si_pid = p->p_pid; + scu->selp.si_pid = curproc->p_pid; } } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index d1bbbd5017..6d1d33b0c2 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/kern/kern_conf.c,v 1.73.2.3 2003/03/10 02:18:25 imp Exp $ - * $DragonFly: src/sys/kern/kern_conf.c,v 1.11 2005/03/23 02:50:53 dillon Exp $ + * $DragonFly: src/sys/kern/kern_conf.c,v 1.12 2006/07/28 02:17:40 dillon Exp $ */ #include @@ -114,7 +114,7 @@ lminor(dev_t x) */ static dev_t -hashdev(struct cdevsw *devsw, int x, int y) +hashdev(struct dev_ops *ops, int x, int y) { struct specinfo *si; udev_t udev; @@ -124,7 +124,7 @@ hashdev(struct cdevsw *devsw, int x, int y) udev = makeudev(x, y); hash = udev % DEVT_HASH; LIST_FOREACH(si, &dev_hash[hash], si_hash) { - if (si->si_devsw == devsw && si->si_udev == udev) + if (si->si_ops == ops && si->si_udev == udev) return (si); } if (stashed >= DEVT_STASH) { @@ -137,15 +137,15 @@ hashdev(struct cdevsw *devsw, int x, int y) si = devt_stash + stashed++; si->si_flags |= SI_STASHED; } - si->si_devsw = devsw; + si->si_ops = ops; si->si_flags |= SI_HASHED | SI_ADHOC; si->si_udev = udev; si->si_refs = 1; LIST_INSERT_HEAD(&dev_hash[hash], si, si_hash); - si->si_port = devsw->d_port; - devsw->d_clone(si); - if (devsw != &dead_cdevsw) - ++devsw->d_refs; + + dev_dclone(si); + if (ops != &dead_dev_ops) + ++ops->head.refs; if (dev_ref_debug) { printf("create dev %p %s(minor=%08x) refs=%d\n", si, devtoname(si), uminor(si->si_udev), @@ -178,21 +178,21 @@ dev_t udev2dev(udev_t x, int b) { dev_t dev; - struct cdevsw *devsw; + struct dev_ops *ops; if (x == NOUDEV || b != 0) return(NODEV); - devsw = cdevsw_get(umajor(x), uminor(x)); - if (devsw == NULL) + ops = dev_ops_get(umajor(x), uminor(x)); + if (ops == NULL) return(NODEV); - dev = hashdev(devsw, umajor(x), uminor(x)); + dev = hashdev(ops, umajor(x), uminor(x)); return(dev); } int dev_is_good(dev_t dev) { - if (dev != NODEV && dev->si_devsw != &dead_cdevsw) + if (dev != NODEV && dev->si_ops != &dead_dev_ops) return(1); return(0); } @@ -223,7 +223,7 @@ makeudev(int x, int y) * * Device majors can be overloaded and used directly by the kernel without * conflict, but userland will only see the particular device major that - * has been installed with cdevsw_add(). + * has been installed with dev_ops_add(). * * This routine creates and returns an unreferenced ad-hoc entry for the * device which will remain intact until the device is destroyed. If the @@ -234,7 +234,7 @@ makeudev(int x, int y) * its cred requirements and name (XXX DEVFS interface). */ dev_t -make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, +make_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid, int perms, const char *fmt, ...) { dev_t dev; @@ -244,8 +244,8 @@ make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, /* * compile the cdevsw and install the device */ - compile_devsw(devsw); - dev = hashdev(devsw, devsw->d_maj, minor); + compile_dev_ops(ops); + dev = hashdev(ops, ops->head.maj, minor); /* * Set additional fields (XXX DEVFS interface goes here) @@ -263,11 +263,11 @@ make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, * need be specified. */ dev_t -make_adhoc_dev(struct cdevsw *devsw, int minor) +make_adhoc_dev(struct dev_ops *ops, int minor) { dev_t dev; - dev = hashdev(devsw, devsw->d_maj, minor); + dev = hashdev(ops, ops->head.maj, minor); return(dev); } @@ -280,7 +280,7 @@ make_sub_dev(dev_t odev, int minor) { dev_t dev; - dev = hashdev(odev->si_devsw, umajor(odev->si_udev), minor); + dev = hashdev(odev->si_ops, umajor(odev->si_udev), minor); /* * Copy cred requirements and name info XXX DEVFS. @@ -292,7 +292,7 @@ make_sub_dev(dev_t odev, int minor) /* * destroy_dev() removes the adhoc association for a device and revectors - * its devsw to &dead_cdevsw. + * its ops to &dead_dev_ops. * * This routine releases the reference count associated with the ADHOC * entry, plus releases the reference count held by the caller. What this @@ -331,17 +331,16 @@ destroy_dev(dev_t dev) } /* - * We have to release the cdevsw reference before we replace the - * device switch with dead_cdevsw. + * We have to release the ops reference before we replace the + * device switch with dead_dev_ops. */ - if (dead_cdevsw.d_port == NULL) - compile_devsw(&dead_cdevsw); - if (dev->si_devsw && dev->si_devsw != &dead_cdevsw) - cdevsw_release(dev->si_devsw); + if (dead_dev_ops.d_strategy == NULL) + compile_dev_ops(&dead_dev_ops); + if (dev->si_ops && dev->si_ops != &dead_dev_ops) + dev_ops_release(dev->si_ops); dev->si_drv1 = NULL; dev->si_drv2 = NULL; - dev->si_devsw = &dead_cdevsw; - dev->si_port = dev->si_devsw->d_port; + dev->si_ops = &dead_dev_ops; --dev->si_refs; /* release adhoc association reference */ release_dev(dev); /* release callers reference */ } @@ -351,7 +350,7 @@ destroy_dev(dev_t dev) * device switch. Only the minor numbers are included in the mask/match * values. * - * Unlike the cdevsw functions whos link structures do not contain + * Unlike the ops functions whos link structures do not contain * any major bits, this function scans through the dev list via si_udev * which is a 32 bit field that contains both major and minor bits. * Because of this, we must mask the minor bits in the passed mask variable @@ -360,7 +359,7 @@ destroy_dev(dev_t dev) * The caller must not include any major bits in the match value. */ void -destroy_all_dev(struct cdevsw *devsw, u_int mask, u_int match) +destroy_all_devs(struct dev_ops *ops, u_int mask, u_int match) { int i; dev_t dev; @@ -372,7 +371,7 @@ destroy_all_dev(struct cdevsw *devsw, u_int mask, u_int match) while ((dev = ndev) != NULL) { ndev = LIST_NEXT(dev, si_hash); KKASSERT(dev->si_flags & SI_ADHOC); - if (dev->si_devsw == devsw && + if (dev->si_ops == ops && (dev->si_udev & mask) == match ) { ++dev->si_refs; @@ -410,7 +409,7 @@ reference_dev(dev_t dev) * reference has been released. * * NOTE: we must use si_udev to figure out the original (major, minor), - * because si_devsw could already be pointing at dead_cdevsw. + * because si_ops could already be pointing at dead_dev_ops. */ void release_dev(dev_t dev) @@ -453,9 +452,9 @@ release_dev(dev_t dev) dev, devtoname(dev)); free_devt = 0; /* prevent bad things from occuring */ } - if (dev->si_devsw && dev->si_devsw != &dead_cdevsw) { - cdevsw_release(dev->si_devsw); - dev->si_devsw = NULL; + if (dev->si_ops && dev->si_ops != &dead_dev_ops) { + dev_ops_release(dev->si_ops); + dev->si_ops = NULL; } if (free_devt) { if (dev->si_flags & SI_STASHED) { diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index f5cccb8ee1..f84bf52006 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -70,7 +70,7 @@ * * @(#)kern_descrip.c 8.6 (Berkeley) 4/19/94 * $FreeBSD: src/sys/kern/kern_descrip.c,v 1.81.2.19 2004/02/28 00:43:31 tegge Exp $ - * $DragonFly: src/sys/kern/kern_descrip.c,v 1.69 2006/06/14 16:58:04 dillon Exp $ + * $DragonFly: src/sys/kern/kern_descrip.c,v 1.70 2006/07/28 02:17:40 dillon Exp $ */ #include "opt_compat.h" @@ -79,6 +79,7 @@ #include #include #include +#include #include #include #include @@ -119,23 +120,9 @@ static d_open_t fdopen; #define NUMFDESC 64 #define CDEV_MAJOR 22 -static struct cdevsw fildesc_cdevsw = { - /* name */ "FD", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ fdopen, - /* close */ noclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops fildesc_ops = { + { "FD", CDEV_MAJOR, 0 }, + .d_open = fdopen, }; static int badfo_readwrite (struct file *fp, struct uio *uio, @@ -2215,8 +2202,10 @@ done: */ /* ARGSUSED */ static int -fdopen(dev_t dev, int mode, int type, struct thread *td) +fdopen(struct dev_open_args *ap) { + thread_t td = curthread; + KKASSERT(td->td_lwp != NULL); /* @@ -2227,7 +2216,7 @@ fdopen(dev_t dev, int mode, int type, struct thread *td) * actions in dupfdopen below. Other callers of vn_open or VOP_OPEN * will simply report the error. */ - td->td_lwp->lwp_dupfd = minor(dev); + td->td_lwp->lwp_dupfd = minor(ap->a_head.a_dev); return (ENODEV); } @@ -2458,14 +2447,14 @@ fildesc_drvinit(void *unused) { int fd; - cdevsw_add(&fildesc_cdevsw, 0, 0); + dev_ops_add(&fildesc_ops, 0, 0); for (fd = 0; fd < NUMFDESC; fd++) { - make_dev(&fildesc_cdevsw, fd, + make_dev(&fildesc_ops, fd, UID_BIN, GID_BIN, 0666, "fd/%d", fd); } - make_dev(&fildesc_cdevsw, 0, UID_ROOT, GID_WHEEL, 0666, "stdin"); - make_dev(&fildesc_cdevsw, 1, UID_ROOT, GID_WHEEL, 0666, "stdout"); - make_dev(&fildesc_cdevsw, 2, UID_ROOT, GID_WHEEL, 0666, "stderr"); + make_dev(&fildesc_ops, 0, UID_ROOT, GID_WHEEL, 0666, "stdin"); + make_dev(&fildesc_ops, 1, UID_ROOT, GID_WHEEL, 0666, "stdout"); + make_dev(&fildesc_ops, 2, UID_ROOT, GID_WHEEL, 0666, "stderr"); } /* diff --git a/sys/kern/kern_device.c b/sys/kern/kern_device.c index ceee328f99..c74b6fe7c2 100644 --- a/sys/kern/kern_device.c +++ b/sys/kern/kern_device.c @@ -3,6 +3,8 @@ * cdevsw from kern/kern_conf.c Copyright (c) 1995 Terrence R. Lambert * cdevsw from kern/kern_conf.c Copyright (c) 1995 Julian R. Elishcer, * All rights reserved. + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -25,9 +27,10 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/kern_device.c,v 1.17 2006/04/30 17:22:17 dillon Exp $ + * $DragonFly: src/sys/kern/kern_device.c,v 1.18 2006/07/28 02:17:40 dillon Exp $ */ #include +#include #include #include #include @@ -38,162 +41,177 @@ #include #include #include -#include #include -#include +#include #include +#include #include -#include -static struct cdevlink *cdevbase[NUMCDEVSW]; - -static int cdevsw_putport(lwkt_port_t port, lwkt_msg_t msg); - -struct cdevsw dead_cdevsw; +/* + * system link descriptors identify the command in the + * arguments structure. + */ +#define DDESCNAME(name) __CONCAT(__CONCAT(dev_,name),_desc) + +#define DEVOP_DESC_INIT(name) \ + struct syslink_desc DDESCNAME(name) = { \ + __offsetof(struct dev_ops, __CONCAT(d_, name)), \ + #name } + +DEVOP_DESC_INIT(default); +DEVOP_DESC_INIT(open); +DEVOP_DESC_INIT(close); +DEVOP_DESC_INIT(read); +DEVOP_DESC_INIT(write); +DEVOP_DESC_INIT(ioctl); +DEVOP_DESC_INIT(dump); +DEVOP_DESC_INIT(psize); +DEVOP_DESC_INIT(poll); +DEVOP_DESC_INIT(mmap); +DEVOP_DESC_INIT(strategy); +DEVOP_DESC_INIT(kqfilter); +DEVOP_DESC_INIT(clone); /* - * Initialize a message port to serve as the default message-handling port - * for device operations. This message port provides compatibility with - * traditional cdevsw dispatch functions by running them synchronously. - * - * YYY NOTE: ms_cmd can now hold a function pointer, should this code be - * converted from an integer op to a function pointer with a flag to - * indicate legacy operation? + * Misc default ops + */ +struct dev_ops dead_dev_ops; + +struct dev_ops default_dev_ops = { + { "null" }, + .d_default = NULL, /* must be NULL */ + .d_open = noopen, + .d_close = noclose, + .d_read = noread, + .d_write = nowrite, + .d_ioctl = noioctl, + .d_poll = nopoll, + .d_mmap = nommap, + .d_strategy = nostrategy, + .d_dump = nodump, + .d_psize = nopsize, + .d_kqfilter = nokqfilter, + .d_clone = noclone +}; + +/* + * This is used to look-up devices */ -static void -init_default_cdevsw_port(lwkt_port_t port) +static struct dev_ops_link *dev_ops_array[NUMCDEVSW]; + +/************************************************************************ + * GENERAL DEVICE API FUNCTIONS * + ************************************************************************/ + +int +dev_dopen(dev_t dev, int oflags, int devtype, struct ucred *cred) { - lwkt_initport(port, NULL); - port->mp_putport = cdevsw_putport; + struct dev_open_args ap; + + ap.a_head.a_desc = &dev_open_desc; + ap.a_head.a_dev = dev; + ap.a_oflags = oflags; + ap.a_devtype = devtype; + ap.a_cred = cred; + return(dev->si_ops->d_open(&ap)); } -static int -cdevsw_putport(lwkt_port_t port, lwkt_msg_t lmsg) -{ - cdevallmsg_t msg = (cdevallmsg_t)lmsg; - struct cdevsw *devsw = msg->am_msg.dev->si_devsw; - int error; - - /* - * Run the device switch function synchronously in the context of the - * caller and return a synchronous error code (anything not EASYNC). - */ - switch(msg->am_lmsg.ms_cmd.cm_op) { - case CDEV_CMD_OPEN: - error = devsw->old_open( - msg->am_open.msg.dev, - msg->am_open.oflags, - msg->am_open.devtype, - msg->am_open.td); - break; - case CDEV_CMD_CLOSE: - error = devsw->old_close( - msg->am_close.msg.dev, - msg->am_close.fflag, - msg->am_close.devtype, - msg->am_close.td); - break; - case CDEV_CMD_STRATEGY: - devsw->old_strategy(msg->am_strategy.msg.dev, msg->am_strategy.bio); - error = 0; - break; - case CDEV_CMD_IOCTL: - error = devsw->old_ioctl( - msg->am_ioctl.msg.dev, - msg->am_ioctl.cmd, - msg->am_ioctl.data, - msg->am_ioctl.fflag, - msg->am_ioctl.td); - break; - case CDEV_CMD_DUMP: - error = devsw->old_dump( - msg->am_dump.msg.dev, - msg->am_dump.count, - msg->am_dump.blkno, - msg->am_dump.secsize); - break; - case CDEV_CMD_PSIZE: - msg->am_psize.result = devsw->old_psize(msg->am_psize.msg.dev); - error = 0; /* XXX */ - break; - case CDEV_CMD_READ: - error = devsw->old_read( - msg->am_read.msg.dev, - msg->am_read.uio, - msg->am_read.ioflag); - break; - case CDEV_CMD_WRITE: - error = devsw->old_write( - msg->am_read.msg.dev, - msg->am_read.uio, - msg->am_read.ioflag); - break; - case CDEV_CMD_POLL: - msg->am_poll.events = devsw->old_poll( - msg->am_poll.msg.dev, - msg->am_poll.events, - msg->am_poll.td); - error = 0; - break; - case CDEV_CMD_KQFILTER: - msg->am_kqfilter.result = devsw->old_kqfilter( - msg->am_kqfilter.msg.dev, - msg->am_kqfilter.kn); - error = 0; - break; - case CDEV_CMD_MMAP: - msg->am_mmap.result = devsw->old_mmap( - msg->am_mmap.msg.dev, - msg->am_mmap.offset, - msg->am_mmap.nprot); - error = 0; /* XXX */ - break; - default: - error = ENOSYS; - break; - } - KKASSERT(error != EASYNC); - return(error); +dev_dclose(dev_t dev, int fflag, int devtype) +{ + struct dev_close_args ap; + + ap.a_head.a_desc = &dev_close_desc; + ap.a_head.a_dev = dev; + ap.a_fflag = fflag; + ap.a_devtype = devtype; + return(dev->si_ops->d_close(&ap)); } -static __inline -lwkt_port_t -_init_cdevmsg(dev_t dev, cdevmsg_t msg, int cmd) +int +dev_dread(dev_t dev, struct uio *uio, int ioflag) { - lwkt_initmsg_simple(&msg->msg, cmd); - msg->dev = dev; - return(dev->si_port); + struct dev_read_args ap; + int error; + + ap.a_head.a_desc = &dev_read_desc; + ap.a_head.a_dev = dev; + ap.a_uio = uio; + ap.a_ioflag = ioflag; + error = dev->si_ops->d_read(&ap); + if (error == 0) + dev->si_lastread = time_second; + return (error); } int -dev_dopen(dev_t dev, int oflags, int devtype, thread_t td) +dev_dwrite(dev_t dev, struct uio *uio, int ioflag) { - struct cdevmsg_open msg; - lwkt_port_t port; + struct dev_write_args ap; + int error; + + dev->si_lastwrite = time_second; + ap.a_head.a_desc = &dev_write_desc; + ap.a_head.a_dev = dev; + ap.a_uio = uio; + ap.a_ioflag = ioflag; + error = dev->si_ops->d_write(&ap); + return (error); +} - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_OPEN); - if (port == NULL) - return(ENXIO); - msg.oflags = oflags; - msg.devtype = devtype; - msg.td = td; - return(lwkt_domsg(port, &msg.msg.msg)); +int +dev_dioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct ucred *cred) +{ + struct dev_ioctl_args ap; + + ap.a_head.a_desc = &dev_ioctl_desc; + ap.a_head.a_dev = dev; + ap.a_cmd = cmd; + ap.a_data = data; + ap.a_fflag = fflag; + ap.a_cred = cred; + return(dev->si_ops->d_ioctl(&ap)); +} + +int +dev_dpoll(dev_t dev, int events) +{ + struct dev_poll_args ap; + int error; + + ap.a_head.a_desc = &dev_poll_desc; + ap.a_head.a_dev = dev; + ap.a_events = events; + error = dev->si_ops->d_poll(&ap); + if (error == 0) + return(ap.a_events); + return (seltrue(dev, events)); +} + +int +dev_dmmap(dev_t dev, vm_offset_t offset, int nprot) +{ + struct dev_mmap_args ap; + int error; + + ap.a_head.a_desc = &dev_mmap_desc; + ap.a_head.a_dev = dev; + ap.a_offset = offset; + ap.a_nprot = nprot; + error = dev->si_ops->d_mmap(&ap); + if (error == 0) + return(ap.a_result); + return(-1); } int -dev_dclose(dev_t dev, int fflag, int devtype, thread_t td) +dev_dclone(dev_t dev) { - struct cdevmsg_close msg; - lwkt_port_t port; + struct dev_clone_args ap; - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_CLOSE); - if (port == NULL) - return(ENXIO); - msg.fflag = fflag; - msg.devtype = devtype; - msg.td = td; - return(lwkt_domsg(port, &msg.msg.msg)); + ap.a_head.a_desc = &dev_clone_desc; + ap.a_head.a_dev = dev; + return (dev->si_ops->d_clone(&ap)); } /* @@ -206,52 +224,34 @@ dev_dclose(dev_t dev, int fflag, int devtype, thread_t td) void dev_dstrategy(dev_t dev, struct bio *bio) { - struct cdevmsg_strategy msg; - struct bio_track *track; - lwkt_port_t port; - - KKASSERT(bio->bio_track == NULL); - KKASSERT(bio->bio_buf->b_cmd != BUF_CMD_DONE); - if (bio->bio_buf->b_cmd == BUF_CMD_READ) - track = &dev->si_track_read; - else - track = &dev->si_track_write; - atomic_add_int(&track->bk_active, 1); - bio->bio_track = track; - - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_STRATEGY); - KKASSERT(port); /* 'nostrategy' function is NULL YYY */ - msg.bio = bio; - lwkt_domsg(port, &msg.msg.msg); + struct dev_strategy_args ap; + struct bio_track *track; + + ap.a_head.a_desc = &dev_strategy_desc; + ap.a_head.a_dev = dev; + ap.a_bio = bio; + + KKASSERT(bio->bio_track == NULL); + KKASSERT(bio->bio_buf->b_cmd != BUF_CMD_DONE); + if (bio->bio_buf->b_cmd == BUF_CMD_READ) + track = &dev->si_track_read; + else + track = &dev->si_track_write; + atomic_add_int(&track->bk_active, 1); + bio->bio_track = track; + (void)dev->si_ops->d_strategy(&ap); } void dev_dstrategy_chain(dev_t dev, struct bio *bio) { - struct cdevmsg_strategy msg; - lwkt_port_t port; - - KKASSERT(bio->bio_track != NULL); - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_STRATEGY); - KKASSERT(port); /* 'nostrategy' function is NULL YYY */ - msg.bio = bio; - lwkt_domsg(port, &msg.msg.msg); -} - -int -dev_dioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, thread_t td) -{ - struct cdevmsg_ioctl msg; - lwkt_port_t port; + struct dev_strategy_args ap; - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_IOCTL); - if (port == NULL) - return(ENXIO); - msg.cmd = cmd; - msg.data = data; - msg.fflag = fflag; - msg.td = td; - return(lwkt_domsg(port, &msg.msg.msg)); + KKASSERT(bio->bio_track != NULL); + ap.a_head.a_desc = &dev_strategy_desc; + ap.a_head.a_dev = dev; + ap.a_bio = bio; + (void)dev->si_ops->d_strategy(&ap); } /* @@ -261,192 +261,129 @@ dev_dioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, thread_t td) int dev_ddump(dev_t dev) { - struct cdevmsg_dump msg; - lwkt_port_t port; - - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_DUMP); - if (port == NULL) - return(ENXIO); - msg.count = 0; - msg.blkno = 0; - msg.secsize = 0; - return(lwkt_domsg(port, &msg.msg.msg)); + struct dev_dump_args ap; + + ap.a_head.a_desc = &dev_dump_desc; + ap.a_head.a_dev = dev; + ap.a_count = 0; + ap.a_blkno = 0; + ap.a_secsize = 0; + return(dev->si_ops->d_dump(&ap)); } int dev_dpsize(dev_t dev) { - struct cdevmsg_psize msg; - lwkt_port_t port; - int error; - - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_PSIZE); - if (port == NULL) + struct dev_psize_args ap; + int error; + + ap.a_head.a_desc = &dev_psize_desc; + ap.a_head.a_dev = dev; + error = dev->si_ops->d_psize(&ap); + if (error == 0) + return (ap.a_result); return(-1); - error = lwkt_domsg(port, &msg.msg.msg); - if (error == 0) - return(msg.result); - return(-1); } int -dev_dread(dev_t dev, struct uio *uio, int ioflag) +dev_dkqfilter(dev_t dev, struct knote *kn) { - struct cdevmsg_read msg; - lwkt_port_t port; - int error; - - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_READ); - if (port == NULL) - return(ENXIO); - msg.uio = uio; - msg.ioflag = ioflag; - error = lwkt_domsg(port, &msg.msg.msg); - if (error == 0) - dev->si_lastread = time_second; - return (error); + struct dev_kqfilter_args ap; + int error; + + ap.a_head.a_desc = &dev_kqfilter_desc; + ap.a_head.a_dev = dev; + ap.a_kn = kn; + error = dev->si_ops->d_kqfilter(&ap); + if (error == 0) + return(ap.a_result); + return(ENODEV); } -int -dev_dwrite(dev_t dev, struct uio *uio, int ioflag) -{ - struct cdevmsg_write msg; - lwkt_port_t port; +/************************************************************************ + * DEVICE HELPER FUNCTIONS * + ************************************************************************/ - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_WRITE); - if (port == NULL) - return(ENXIO); - dev->si_lastwrite = time_second; - msg.uio = uio; - msg.ioflag = ioflag; - return(lwkt_domsg(port, &msg.msg.msg)); -} - -int -dev_dpoll(dev_t dev, int events, thread_t td) +const char * +dev_dname(dev_t dev) { - struct cdevmsg_poll msg; - lwkt_port_t port; - int error; - - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_POLL); - if (port == NULL) - return(ENXIO); - msg.events = events; - msg.td = td; - error = lwkt_domsg(port, &msg.msg.msg); - if (error == 0) - return(msg.events); - return(seltrue(dev, msg.events, td)); + return(dev->si_ops->head.name); } int -dev_dkqfilter(dev_t dev, struct knote *kn) +dev_dflags(dev_t dev) { - struct cdevmsg_kqfilter msg; - lwkt_port_t port; - int error; - - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_KQFILTER); - if (port == NULL) - return(ENXIO); - msg.kn = kn; - error = lwkt_domsg(port, &msg.msg.msg); - if (error == 0) - return(msg.result); - return(ENODEV); + return(dev->si_ops->head.flags); } int -dev_dmmap(dev_t dev, vm_offset_t offset, int nprot) -{ - struct cdevmsg_mmap msg; - lwkt_port_t port; - int error; - - port = _init_cdevmsg(dev, &msg.msg, CDEV_CMD_MMAP); - if (port == NULL) - return(-1); - msg.offset = offset; - msg.nprot = nprot; - error = lwkt_domsg(port, &msg.msg.msg); - if (error == 0) - return(msg.result); - return(-1); -} - -const char * -dev_dname(dev_t dev) +dev_dmaj(dev_t dev) { - return(dev->si_devsw->d_name); + return(dev->si_ops->head.maj); } +/* + * Used when forwarding a request through layers. The caller adjusts + * ap->a_head.a_dev and then calls this function. + */ int -dev_dflags(dev_t dev) +dev_doperate(struct dev_generic_args *ap) { - return(dev->si_devsw->d_flags); + int (*func)(struct dev_generic_args *); + + func = *(void **)((char *)ap->a_dev->si_ops + ap->a_desc->sd_offset); + return (func(ap)); } +/* + * Used by the console intercept code only. Issue an operation through + * a foreign ops structure allowing the ops structure associated + * with the device to remain intact. + */ int -dev_dmaj(dev_t dev) +dev_doperate_ops(struct dev_ops *ops, struct dev_generic_args *ap) { - return(dev->si_devsw->d_maj); -} + int (*func)(struct dev_generic_args *); -lwkt_port_t -dev_dport(dev_t dev) -{ - return(dev->si_port); + func = *(void **)((char *)ops + ap->a_desc->sd_offset); + return (func(ap)); } /* - * Convert a cdevsw template into the real thing, filling in fields the - * device left empty with appropriate defaults. + * Convert a template dev_ops into the real thing by filling in + * uninitialized fields. */ void -compile_devsw(struct cdevsw *devsw) +compile_dev_ops(struct dev_ops *ops) { - static lwkt_port devsw_compat_port; - - if (devsw_compat_port.mp_putport == NULL) - init_default_cdevsw_port(&devsw_compat_port); - - if (devsw->old_open == NULL) - devsw->old_open = noopen; - if (devsw->old_close == NULL) - devsw->old_close = noclose; - if (devsw->old_read == NULL) - devsw->old_read = noread; - if (devsw->old_write == NULL) - devsw->old_write = nowrite; - if (devsw->old_ioctl == NULL) - devsw->old_ioctl = noioctl; - if (devsw->old_poll == NULL) - devsw->old_poll = nopoll; - if (devsw->old_mmap == NULL) - devsw->old_mmap = nommap; - if (devsw->old_strategy == NULL) - devsw->old_strategy = nostrategy; - if (devsw->old_dump == NULL) - devsw->old_dump = nodump; - if (devsw->old_psize == NULL) - devsw->old_psize = nopsize; - if (devsw->old_kqfilter == NULL) - devsw->old_kqfilter = nokqfilter; - - if (devsw->d_port == NULL) - devsw->d_port = &devsw_compat_port; - if (devsw->d_clone == NULL) - devsw->d_clone = noclone; + int offset; + + for (offset = offsetof(struct dev_ops, dev_ops_first_field); + offset <= offsetof(struct dev_ops, dev_ops_last_field); + offset += sizeof(void *) + ) { + void **func_p = (void **)((char *)ops + offset); + void **def_p = (void **)((char *)&default_dev_ops + offset); + if (*func_p == NULL) { + if (ops->d_default) + *func_p = ops->d_default; + else + *func_p = *def_p; + } + } } +/************************************************************************ + * MAJOR/MINOR SPACE FUNCTION * + ************************************************************************/ + /* - * This makes a cdevsw entry visible to userland (e.g /dev/). + * This makes a dev_ops entry visible to userland (e.g /dev/). * - * The kernel can overload a major number by making multiple cdevsw_add() - * calls, but only the most recent one (the first one in the cdevbase[] list - * matching the mask/match) will be visible to userland. make_dev() does - * not automatically call cdevsw_add() (nor do we want it to, since + * The kernel can overload a major number by making multiple dev_ops_add() + * calls, but only the most recent one (the first one in the dev_ops_array[] + * list matching the mask/match) will be visible to userland. make_dev() does + * not automatically call dev_ops_add() (nor do we want it to, since * partition-managed disk devices are overloaded on top of the raw device). * * Disk devices typically register their major, e.g. 'ad0', and then call @@ -454,174 +391,300 @@ compile_devsw(struct cdevsw *devsw) * to support all the various slice and partition combinations. * * The mask/match supplied in this call are a full 32 bits and the same - * mask and match must be specified in a later cdevsw_remove() call to + * mask and match must be specified in a later dev_ops_remove() call to * match this add. However, the match value for the minor number should never * have any bits set in the major number's bit range (8-15). The mask value * may be conveniently specified as -1 without creating any major number * interference. */ int -cdevsw_add(struct cdevsw *devsw, u_int mask, u_int match) +dev_ops_add(struct dev_ops *ops, u_int mask, u_int match) { int maj; - struct cdevlink *link; + struct dev_ops_link *link; - compile_devsw(devsw); - maj = devsw->d_maj; + compile_dev_ops(ops); + maj = ops->head.maj; if (maj < 0 || maj >= NUMCDEVSW) { - printf("%s: ERROR: driver has bogus cdevsw->d_maj = %d\n", - devsw->d_name, maj); - return (EINVAL); + printf("%s: ERROR: driver has bogus dev_ops->head.maj = %d\n", + ops->head.name, maj); + return (EINVAL); } - for (link = cdevbase[maj]; link; link = link->next) { - /* - * If we get an exact match we usurp the target, but we only print - * a warning message if a different device switch is installed. - */ - if (link->mask == mask && link->match == match) { - if (link->devsw != devsw) { - printf("WARNING: \"%s\" (%p) is usurping \"%s\"'s (%p)" - " cdevsw[]\n", - devsw->d_name, devsw, - link->devsw->d_name, link->devsw); - link->devsw = devsw; - ++devsw->d_refs; + for (link = dev_ops_array[maj]; link; link = link->next) { + /* + * If we get an exact match we usurp the target, but we only print + * a warning message if a different device switch is installed. + */ + if (link->mask == mask && link->match == match) { + if (link->ops != ops) { + printf("WARNING: \"%s\" (%p) is usurping \"%s\"'s" + " (%p) dev_ops_array[]\n", + ops->head.name, ops, + link->ops->head.name, link->ops); + link->ops = ops; + ++ops->head.refs; + } + return(0); } - return(0); - } - /* - * XXX add additional warnings for overlaps - */ + /* + * XXX add additional warnings for overlaps + */ } - link = malloc(sizeof(struct cdevlink), M_DEVBUF, M_INTWAIT|M_ZERO); + link = malloc(sizeof(struct dev_ops_link), M_DEVBUF, M_INTWAIT|M_ZERO); link->mask = mask; link->match = match; - link->devsw = devsw; - link->next = cdevbase[maj]; - cdevbase[maj] = link; - ++devsw->d_refs; + link->ops = ops; + link->next = dev_ops_array[maj]; + dev_ops_array[maj] = link; + ++ops->head.refs; return(0); } /* * Should only be used by udev2dev(). * - * If the minor number is -1, we match the first cdevsw we find for this + * If the minor number is -1, we match the first ops we find for this * major. If the mask is not -1 then multiple minor numbers can match - * the same devsw. + * the same ops. * * Note that this function will return NULL if the minor number is not within * the bounds of the installed mask(s). * * The specified minor number should NOT include any major bits. */ -struct cdevsw * -cdevsw_get(int x, int y) +struct dev_ops * +dev_ops_get(int x, int y) { - struct cdevlink *link; + struct dev_ops_link *link; - if (x < 0 || x >= NUMCDEVSW) + if (x < 0 || x >= NUMCDEVSW) + return(NULL); + for (link = dev_ops_array[x]; link; link = link->next) { + if (y == -1 || (link->mask & y) == link->match) + return(link->ops); + } return(NULL); - for (link = cdevbase[x]; link; link = link->next) { - if (y == -1 || (link->mask & y) == link->match) - return(link->devsw); - } - return(NULL); } /* - * Use the passed cdevsw as a template to create our intercept cdevsw, - * and install and return ours. + * Take a cookie cutter to the major/minor device space for the passed + * device and generate a new dev_ops visible to userland which the caller + * can then modify. The original device is not modified but portions of + * its major/minor space will no longer be visible to userland. */ -struct cdevsw * -cdevsw_add_override(dev_t backing_dev, u_int mask, u_int match) +struct dev_ops * +dev_ops_add_override(dev_t backing_dev, struct dev_ops *template, + u_int mask, u_int match) { - struct cdevsw *devsw; - struct cdevsw *bsw = backing_dev->si_devsw; - - devsw = malloc(sizeof(struct cdevsw), M_DEVBUF, M_INTWAIT|M_ZERO); - devsw->d_name = bsw->d_name; - devsw->d_maj = bsw->d_maj; - devsw->d_flags = bsw->d_flags; - compile_devsw(devsw); - cdevsw_add(devsw, mask, match); + struct dev_ops *ops; + struct dev_ops *backing_ops = backing_dev->si_ops; + + ops = malloc(sizeof(struct dev_ops), M_DEVBUF, M_INTWAIT); + *ops = *template; + ops->head.name = backing_ops->head.name; + ops->head.maj = backing_ops->head.maj; + ops->head.flags = backing_ops->head.flags; + compile_dev_ops(ops); + dev_ops_add(ops, mask, match); + + return(ops); +} - return(devsw); +/* + * Remove all matching dev_ops entries from the dev_ops_array[] major + * array so no new user opens can be performed, and destroy all devices + * installed in the hash table that are associated with this dev_ops. (see + * destroy_all_devs()). + * + * The mask and match should match a previous call to dev_ops_add*(). + */ +int +dev_ops_remove(struct dev_ops *ops, u_int mask, u_int match) +{ + int maj = ops->head.maj; + struct dev_ops_link *link; + struct dev_ops_link **plink; + + if (maj < 0 || maj >= NUMCDEVSW) { + printf("%s: ERROR: driver has bogus ops->d_maj = %d\n", + ops->head.name, maj); + return EINVAL; + } + if (ops != &dead_dev_ops) + destroy_all_devs(ops, mask, match); + for (plink = &dev_ops_array[maj]; (link = *plink) != NULL; + plink = &link->next) { + if (link->mask == mask && link->match == match) { + if (link->ops == ops) + break; + printf("%s: ERROR: cannot remove from dev_ops_array[], " + "its major number %d was stolen by %s\n", + ops->head.name, maj, + link->ops->head.name + ); + } + } + if (link == NULL) { + printf("%s(%d)[%08x/%08x]: WARNING: ops removed " + "multiple times!\n", + ops->head.name, maj, mask, match); + } else { + *plink = link->next; + --ops->head.refs; /* XXX ops_release() / record refs */ + free(link, M_DEVBUF); + } + if (dev_ops_array[maj] == NULL && ops->head.refs != 0) { + printf("%s(%d)[%08x/%08x]: Warning: dev_ops_remove() called " + "while %d device refs still exist!\n", + ops->head.name, maj, mask, match, ops->head.refs); + } else { + printf("%s: ops removed\n", ops->head.name); + } + return 0; } /* - * Override a device's port, returning the previously installed port. This - * is XXX very dangerous. + * Release a ops entry. When the ref count reaches zero, recurse + * through the stack. */ -lwkt_port_t -cdevsw_dev_override(dev_t dev, lwkt_port_t port) +void +dev_ops_release(struct dev_ops *ops) +{ + --ops->head.refs; + if (ops->head.refs == 0) { + /* XXX */ + } +} + +struct dev_ops * +dev_ops_intercept(dev_t dev, struct dev_ops *iops) +{ + struct dev_ops *oops = dev->si_ops; + + compile_dev_ops(iops); + iops->head.maj = oops->head.maj; + iops->head.data = oops->head.data; + iops->head.flags = oops->head.flags; + dev->si_ops = iops; + + return (oops); +} + +void +dev_ops_restore(dev_t dev, struct dev_ops *oops) { - lwkt_port_t oport; + struct dev_ops *iops = dev->si_ops; - oport = dev->si_port; - dev->si_port = port; - return(oport); + dev->si_ops = oops; + iops->head.maj = 0; + iops->head.data = NULL; + iops->head.flags = 0; } +/************************************************************************ + * DEFAULT DEV OPS FUNCTIONS * + ************************************************************************/ + + /* - * Remove a cdevsw entry from the cdevbase[] major array so no new user opens - * can be performed, and destroy all devices installed in the hash table - * which are associated with this cdevsw. (see destroy_all_dev()). + * Unsupported devswitch functions (e.g. for writing to read-only device). + * XXX may belong elsewhere. */ + int -cdevsw_remove(struct cdevsw *devsw, u_int mask, u_int match) +noclone(struct dev_clone_args *ap) { - int maj = devsw->d_maj; - struct cdevlink *link; - struct cdevlink **plink; - - if (maj < 0 || maj >= NUMCDEVSW) { - printf("%s: ERROR: driver has bogus cdevsw->d_maj = %d\n", - devsw->d_name, maj); - return EINVAL; - } - if (devsw != &dead_cdevsw) - destroy_all_dev(devsw, mask, match); - for (plink = &cdevbase[maj]; (link = *plink) != NULL; plink = &link->next) { - if (link->mask == mask && link->match == match) { - if (link->devsw == devsw) - break; - printf("%s: ERROR: cannot remove from cdevsw[], its major" - " number %d was stolen by %s\n", - devsw->d_name, maj, - link->devsw->d_name - ); - } - } - if (link == NULL) { - printf("%s(%d)[%08x/%08x]: WARNING: cdevsw removed multiple times!\n", - devsw->d_name, maj, mask, match); - } else { - *plink = link->next; - --devsw->d_refs; /* XXX cdevsw_release() / record refs */ - free(link, M_DEVBUF); - } - if (cdevbase[maj] == NULL && devsw->d_refs != 0) { - printf("%s(%d)[%08x/%08x]: Warning: cdevsw_remove() called while " - "%d device refs still exist!\n", - devsw->d_name, maj, mask, match, devsw->d_refs); - } else { - printf("%s: cdevsw removed\n", devsw->d_name); - } - return 0; + /* take no action */ + return (0); /* allow the clone */ +} + +int +noopen(struct dev_open_args *ap) +{ + return (ENODEV); +} + +int +noclose(struct dev_close_args *ap) +{ + return (ENODEV); +} + +int +noread(struct dev_read_args *ap) +{ + return (ENODEV); +} + +int +nowrite(struct dev_write_args *ap) +{ + return (ENODEV); +} + +int +noioctl(struct dev_ioctl_args *ap) +{ + return (ENODEV); +} + +int +nokqfilter(struct dev_kqfilter_args *ap) +{ + return (ENODEV); +} + +int +nommap(struct dev_mmap_args *ap) +{ + return (ENODEV); +} + +int +nopoll(struct dev_poll_args *ap) +{ + ap->a_events = 0; + return(0); +} + +int +nostrategy(struct dev_strategy_args *ap) +{ + struct bio *bio = ap->a_bio; + + bio->bio_buf->b_flags |= B_ERROR; + bio->bio_buf->b_error = EOPNOTSUPP; + biodone(bio); + return(0); +} + +int +nopsize(struct dev_psize_args *ap) +{ + ap->a_result = 0; + return(0); +} + +int +nodump(struct dev_dump_args *ap) +{ + return (ENODEV); } /* - * Release a cdevsw entry. When the ref count reaches zero, recurse - * through the stack. + * XXX this is probably bogus. Any device that uses it isn't checking the + * minor number. */ -void -cdevsw_release(struct cdevsw *devsw) +int +nullopen(struct dev_open_args *ap) { - --devsw->d_refs; - if (devsw->d_refs == 0) { - /* XXX */ - } + return (0); +} + +int +nullclose(struct dev_close_args *ap) +{ + return (0); } diff --git a/sys/kern/kern_memio.c b/sys/kern/kern_memio.c index bbd45ea22a..7ba9f8ebe2 100644 --- a/sys/kern/kern_memio.c +++ b/sys/kern/kern_memio.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/kern/kern_memio.c,v 1.16 2006/07/10 21:06:08 dillon Exp $ + * $DragonFly: src/sys/kern/kern_memio.c,v 1.17 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -74,49 +74,53 @@ static d_open_t mmopen; static d_close_t mmclose; -static d_read_t mmrw; +static d_read_t mmread; +static d_write_t mmwrite; static d_ioctl_t mmioctl; static d_mmap_t memmmap; static d_poll_t mmpoll; #define CDEV_MAJOR 2 -static struct cdevsw mem_cdevsw = { - /* name */ "mem", - /* maj */ CDEV_MAJOR, - /* flags */ D_MEM, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mmopen, - /* close */ mmclose, - /* read */ mmrw, - /* write */ mmrw, - /* ioctl */ mmioctl, - /* poll */ mmpoll, - /* mmap */ memmmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mem_ops = { + { "mem", CDEV_MAJOR, D_MEM }, + .d_open = mmopen, + .d_close = mmclose, + .d_read = mmread, + .d_write = mmwrite, + .d_ioctl = mmioctl, + .d_poll = mmpoll, + .d_mmap = memmmap, }; static int rand_bolt; static caddr_t zbuf; MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors"); -static int mem_ioctl (dev_t, u_long, caddr_t, int, struct thread *); -static int random_ioctl (dev_t, u_long, caddr_t, int, struct thread *); +static int mem_ioctl (dev_t, u_long, caddr_t, int, struct ucred *); +static int random_ioctl (dev_t, u_long, caddr_t, int, struct ucred *); struct mem_range_softc mem_range_softc; static int -mmclose(dev_t dev, int flags, int fmt, struct thread *td) +mmopen(struct dev_open_args *ap) { - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; + int error; switch (minor(dev)) { + case 0: + case 1: + if ((ap->a_oflags & FWRITE) && securelevel > 0) + return (EPERM); + break; case 14: - p->p_md.md_regs->tf_eflags &= ~PSL_IOPL; + error = suser_cred(ap->a_cred, 0); + if (error != 0) + return (error); + if (securelevel > 0) + return (EPERM); + curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; break; default: break; @@ -125,24 +129,13 @@ mmclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -mmopen(dev_t dev, int flags, int fmt, struct thread *td) +mmclose(struct dev_close_args *ap) { - int error; - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; switch (minor(dev)) { - case 0: - case 1: - if ((flags & FWRITE) && securelevel > 0) - return (EPERM); - break; case 14: - error = suser(td); - if (error != 0) - return (error); - if (securelevel > 0) - return (EPERM); - p->p_md.md_regs->tf_eflags |= PSL_IOPL; + curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; break; default: break; @@ -150,11 +143,9 @@ mmopen(dev_t dev, int flags, int fmt, struct thread *td) return (0); } + static int -mmrw(dev, uio, flags) - dev_t dev; - struct uio *uio; - int flags; +mmrw(dev_t dev, struct uio *uio, int flags) { int o; u_int c, v; @@ -308,6 +299,19 @@ mmrw(dev, uio, flags) return (error); } +static int +mmread(struct dev_read_args *ap) +{ + return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + +static int +mmwrite(struct dev_write_args *ap) +{ + return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + + @@ -315,35 +319,44 @@ mmrw(dev, uio, flags) * allow user processes to MMAP some memory sections * * instead of going through read/write * \*******************************************************/ + static int -memmmap(dev_t dev, vm_offset_t offset, int nprot) +memmmap(struct dev_mmap_args *ap) { - switch (minor(dev)) - { + dev_t dev = ap->a_head.a_dev; -/* minor device 0 is physical memory */ + switch (minor(dev)) { case 0: - return i386_btop(offset); - -/* minor device 1 is kernel memory */ + /* + * minor device 0 is physical memory + */ + ap->a_result = i386_btop(ap->a_offset); + return 0; case 1: - return i386_btop(vtophys(offset)); + /* + * minor device 1 is kernel memory + */ + ap->a_result = i386_btop(vtophys(ap->a_offset)); + return 0; default: - return -1; + return EINVAL; } } static int -mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +mmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; switch (minor(dev)) { case 0: - return mem_ioctl(dev, cmd, data, flags, td); + return mem_ioctl(dev, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); case 3: case 4: - return random_ioctl(dev, cmd, data, flags, td); + return random_ioctl(dev, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); } return (ENODEV); } @@ -355,7 +368,7 @@ mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) * and mem_range_attr_set. */ static int -mem_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +mem_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) { int nd, error = 0; struct mem_range_op *mo = (struct mem_range_op *)data; @@ -449,7 +462,7 @@ mem_range_AP_init(void) #endif static int -random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) { int error; int intr; @@ -466,7 +479,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_SETIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -474,7 +487,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_CLEARIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -485,7 +498,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_FINDIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -502,22 +515,29 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) } int -mmpoll(dev_t dev, int events, struct thread *td) +mmpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; + int revents; + switch (minor(dev)) { case 3: /* /dev/random */ - return random_poll(dev, events, td); + revents = random_poll(dev, ap->a_events); + break; case 4: /* /dev/urandom */ default: - return seltrue(dev, events, td); + revents = seltrue(dev, ap->a_events); + break; } + ap->a_events = revents; + return (0); } int iszerodev(dev) dev_t dev; { - return ((major(dev) == mem_cdevsw.d_maj) + return ((major(dev) == mem_ops.head.maj) && minor(dev) == 12); } @@ -529,14 +549,14 @@ mem_drvinit(void *unused) if (mem_range_softc.mr_op != NULL) mem_range_softc.mr_op->init(&mem_range_softc); - cdevsw_add(&mem_cdevsw, 0xf0, 0); - make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM, 0640, "mem"); - make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); - make_dev(&mem_cdevsw, 2, UID_ROOT, GID_WHEEL, 0666, "null"); - make_dev(&mem_cdevsw, 3, UID_ROOT, GID_WHEEL, 0644, "random"); - make_dev(&mem_cdevsw, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); - make_dev(&mem_cdevsw, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); - make_dev(&mem_cdevsw, 14, UID_ROOT, GID_WHEEL, 0600, "io"); + dev_ops_add(&mem_ops, 0xf0, 0); + make_dev(&mem_ops, 0, UID_ROOT, GID_KMEM, 0640, "mem"); + make_dev(&mem_ops, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); + make_dev(&mem_ops, 2, UID_ROOT, GID_WHEEL, 0666, "null"); + make_dev(&mem_ops, 3, UID_ROOT, GID_WHEEL, 0644, "random"); + make_dev(&mem_ops, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); + make_dev(&mem_ops, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); + make_dev(&mem_ops, 14, UID_ROOT, GID_WHEEL, 0600, "io"); } SYSINIT(memdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,mem_drvinit,NULL) diff --git a/sys/kern/kern_nrandom.c b/sys/kern/kern_nrandom.c index 242e1da713..ae98af0777 100644 --- a/sys/kern/kern_nrandom.c +++ b/sys/kern/kern_nrandom.c @@ -22,7 +22,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/kern_nrandom.c,v 1.2 2006/07/10 21:06:09 dillon Exp $ + * $DragonFly: src/sys/kern/kern_nrandom.c,v 1.3 2006/07/28 02:17:40 dillon Exp $ */ /* --- NOTES --- * @@ -490,7 +490,7 @@ add_buffer_randomness(const char *buf, int bytes) * Poll (always succeeds) */ int -random_poll(dev_t dev, int events, struct thread *td) +random_poll(dev_t dev, int events) { int revents = 0; diff --git a/sys/kern/kern_physio.c b/sys/kern/kern_physio.c index 29f35a6093..2ced0ce130 100644 --- a/sys/kern/kern_physio.c +++ b/sys/kern/kern_physio.c @@ -17,7 +17,7 @@ * are met. * * $FreeBSD: src/sys/kern/kern_physio.c,v 1.46.2.4 2003/11/14 09:51:47 simokawa Exp $ - * $DragonFly: src/sys/kern/kern_physio.c,v 1.21 2006/05/03 20:44:49 dillon Exp $ + * $DragonFly: src/sys/kern/kern_physio.c,v 1.22 2006/07/28 02:17:40 dillon Exp $ */ #include @@ -39,7 +39,7 @@ physwakeup(struct bio *bio) wakeup(bio); } -int +static int physio(dev_t dev, struct uio *uio, int ioflag) { int i; @@ -131,3 +131,16 @@ doerror: relpbuf(bp, NULL); return (error); } + +int +physread(struct dev_read_args *ap) +{ + return(physio(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + +int +physwrite(struct dev_write_args *ap) +{ + return(physio(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index a5d5d19f24..3eae883954 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -77,7 +77,7 @@ * @(#)ufs_disksubr.c 8.5 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/subr_disk.c,v 1.20.2.6 2001/10/05 07:14:57 peter Exp $ * $FreeBSD: src/sys/ufs/ufs/ufs_disksubr.c,v 1.44.2.3 2001/03/05 05:42:19 obrien Exp $ - * $DragonFly: src/sys/kern/subr_disk.c,v 1.24 2006/05/03 20:44:49 dillon Exp $ + * $DragonFly: src/sys/kern/subr_disk.c,v 1.25 2006/07/28 02:17:40 dillon Exp $ */ #include @@ -102,70 +102,72 @@ static MALLOC_DEFINE(M_DISK, "disk", "disk data"); -static d_strategy_t diskstrategy; static d_open_t diskopen; static d_close_t diskclose; static d_ioctl_t diskioctl; +static d_strategy_t diskstrategy; static d_psize_t diskpsize; static d_clone_t diskclone; -static int disk_putport(lwkt_port_t port, lwkt_msg_t msg); +static d_dump_t diskdump; static LIST_HEAD(, disk) disklist = LIST_HEAD_INITIALIZER(&disklist); +static struct dev_ops disk_ops = { + { "disk" }, + .d_open = diskopen, + .d_close = diskclose, + .d_read = physread, + .d_write = physwrite, + .d_ioctl = diskioctl, + .d_strategy = diskstrategy, + .d_dump = diskdump, + .d_psize = diskpsize, + .d_clone = diskclone +}; + /* - * Create a slice and unit managed disk. - * - * Our port layer will be responsible for assigning blkno and handling - * high level partition operations, then forwarding the requests to the - * raw device. + * Create a raw device for the dev_ops template (which is returned). Also + * create a slice and unit managed disk and overload the user visible + * device space with it. * - * The disk_create() function clones the provided rawsw for creating a - * managed disk device. In addition, the cdevsw intercept port is - * changed to disk_putport, which is used to transform requests for the - * managed disk device. - * - * The raw device (based on rawsw) is returned to the caller, NOT the - * slice and unit managed cdev. The caller typically sets various - * driver parameters and IO limits on the returned rawdev which we must - * inherit when our managed device is opened. + * NOTE: The returned raw device is NOT a slice and unit managed device. + * It is an actual raw device representing the raw disk as specified by + * the passed dev_ops. The disk layer not only returns such a raw device, + * it also uses it internally when passing (modified) commands through. */ dev_t -disk_create(int unit, struct disk *dp, int flags, struct cdevsw *rawsw) +disk_create(int unit, struct disk *dp, int flags, struct dev_ops *raw_ops) { dev_t rawdev; - struct cdevsw *devsw; + struct dev_ops *dev_ops; /* * Create the raw backing device */ - compile_devsw(rawsw); - rawdev = make_dev(rawsw, dkmakeminor(unit, WHOLE_DISK_SLICE, RAW_PART), + compile_dev_ops(raw_ops); + rawdev = make_dev(raw_ops, + dkmakeminor(unit, WHOLE_DISK_SLICE, RAW_PART), UID_ROOT, GID_OPERATOR, 0640, - "%s%d", rawsw->d_name, unit); + "%s%d", raw_ops->head.name, unit); - /* - * Initialize our intercept port - */ bzero(dp, sizeof(*dp)); - lwkt_initport(&dp->d_port, NULL); - dp->d_port.mp_putport = disk_putport; - dp->d_rawsw = rawsw; /* * We install a custom cdevsw rather then the passed cdevsw, * and save our disk structure in d_data so we can get at it easily * without any complex cloning code. */ - devsw = cdevsw_add_override(rawdev, dkunitmask(), dkmakeunit(unit)); - devsw->d_port = &dp->d_port; - devsw->d_data = dp; - devsw->d_clone = diskclone; - dp->d_devsw = devsw; + dev_ops = dev_ops_add_override(rawdev, &disk_ops, + dkunitmask(), dkmakeunit(unit)); + dev_ops->head.data = dp; + dp->d_rawdev = rawdev; - dp->d_cdev = make_dev(devsw, + dp->d_raw_ops = raw_ops; + dp->d_dev_ops = dev_ops; + dp->d_cdev = make_dev(dev_ops, dkmakeminor(unit, WHOLE_DISK_SLICE, RAW_PART), UID_ROOT, GID_OPERATOR, 0640, - "%s%d", devsw->d_name, unit); + "%s%d", dev_ops->head.name, unit); dp->d_dsflags = flags; LIST_INSERT_HEAD(&disklist, dp, d_list); @@ -180,13 +182,13 @@ disk_create(int unit, struct disk *dp, int flags, struct cdevsw *rawsw) void disk_destroy(struct disk *disk) { - if (disk->d_devsw) { - cdevsw_remove(disk->d_devsw, dkunitmask(), + if (disk->d_dev_ops) { + dev_ops_remove(disk->d_dev_ops, dkunitmask(), dkmakeunit(dkunit(disk->d_cdev))); LIST_REMOVE(disk, d_list); } - if (disk->d_rawsw) { - destroy_all_dev(disk->d_rawsw, dkunitmask(), + if (disk->d_raw_ops) { + destroy_all_devs(disk->d_raw_ops, dkunitmask(), dkmakeunit(dkunit(disk->d_rawdev))); } bzero(disk, sizeof(*disk)); @@ -265,123 +267,24 @@ sysctl_disks(SYSCTL_HANDLER_ARGS) SYSCTL_PROC(_kern, OID_AUTO, disks, CTLTYPE_STRING | CTLFLAG_RD, 0, NULL, sysctl_disks, "A", "names of available disks"); -/* - * The port intercept functions - */ -static -int -disk_putport(lwkt_port_t port, lwkt_msg_t lmsg) -{ - struct disk *disk = (struct disk *)port; - cdevallmsg_t msg = (cdevallmsg_t)lmsg; - int error; - - switch(msg->am_lmsg.ms_cmd.cm_op) { - case CDEV_CMD_OPEN: - error = diskopen( - msg->am_open.msg.dev, - msg->am_open.oflags, - msg->am_open.devtype, - msg->am_open.td); - break; - case CDEV_CMD_CLOSE: - error = diskclose( - msg->am_close.msg.dev, - msg->am_close.fflag, - msg->am_close.devtype, - msg->am_close.td); - break; - case CDEV_CMD_IOCTL: - error = diskioctl( - msg->am_ioctl.msg.dev, - msg->am_ioctl.cmd, - msg->am_ioctl.data, - msg->am_ioctl.fflag, - msg->am_ioctl.td); - break; - case CDEV_CMD_STRATEGY: - diskstrategy(msg->am_strategy.msg.dev, msg->am_strategy.bio); - error = 0; - break; - case CDEV_CMD_PSIZE: - msg->am_psize.result = diskpsize(msg->am_psize.msg.dev); - error = 0; /* XXX */ - break; - case CDEV_CMD_READ: - error = physio(msg->am_read.msg.dev, - msg->am_read.uio, msg->am_read.ioflag); - break; - case CDEV_CMD_WRITE: - error = physio(msg->am_write.msg.dev, - msg->am_write.uio, msg->am_write.ioflag); - break; - case CDEV_CMD_POLL: - case CDEV_CMD_KQFILTER: - error = ENODEV; - case CDEV_CMD_MMAP: - error = -1; - break; - case CDEV_CMD_DUMP: - error = disk_dumpcheck(msg->am_dump.msg.dev, - &msg->am_dump.count, - &msg->am_dump.blkno, - &msg->am_dump.secsize); - if (error == 0) { - msg->am_dump.msg.dev = disk->d_rawdev; - error = lwkt_forwardmsg(disk->d_rawdev->si_port, - &msg->am_dump.msg.msg); - printf("error2 %d\n", error); - } - break; - default: - error = ENOTSUP; - break; - } - return(error); -} - -/* - * When new device entries are instantiated, make sure they inherit our - * si_disk structure and block and iosize limits from the raw device. - * - * This routine is always called synchronously in the context of the - * client. - * - * XXX The various io and block size constraints are not always initialized - * properly by devices. - */ -static -int -diskclone(dev_t dev) -{ - struct disk *dp; - - dp = dev->si_devsw->d_data; - KKASSERT(dp != NULL); - dev->si_disk = dp; - dev->si_iosize_max = dp->d_rawdev->si_iosize_max; - dev->si_bsize_phys = dp->d_rawdev->si_bsize_phys; - dev->si_bsize_best = dp->d_rawdev->si_bsize_best; - return(0); -} - /* * Open a disk device or partition. */ static int -diskopen(dev_t dev, int oflags, int devtype, struct thread *td) +diskopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct disk *dp; int error; /* * dp can't be NULL here XXX. */ - error = 0; dp = dev->si_disk; if (dp == NULL) return (ENXIO); + error = 0; /* * Deal with open races @@ -402,22 +305,24 @@ diskopen(dev_t dev, int oflags, int devtype, struct thread *td) if (!pdev->si_iosize_max) pdev->si_iosize_max = dev->si_iosize_max; #endif - error = dev_dopen(dp->d_rawdev, oflags, devtype, td); + error = dev_dopen(dp->d_rawdev, ap->a_oflags, + ap->a_devtype, ap->a_cred); } /* * Inherit properties from the underlying device now that it is * open. */ - diskclone(dev); + dev_dclone(dev); if (error) goto out; - error = dsopen(dev, devtype, dp->d_dsflags, &dp->d_slice, &dp->d_label); + error = dsopen(dev, ap->a_devtype, dp->d_dsflags, + &dp->d_slice, &dp->d_label); if (!dsisopen(dp->d_slice)) - dev_dclose(dp->d_rawdev, oflags, devtype, td); + dev_dclose(dp->d_rawdev, ap->a_oflags, ap->a_devtype); out: dp->d_flags &= ~DISKFLAG_LOCK; if (dp->d_flags & DISKFLAG_WANTED) { @@ -433,17 +338,41 @@ out: */ static int -diskclose(dev_t dev, int fflag, int devtype, struct thread *td) +diskclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct disk *dp; int error; error = 0; dp = dev->si_disk; - dsclose(dev, devtype, dp->d_slice); + dsclose(dev, ap->a_devtype, dp->d_slice); if (!dsisopen(dp->d_slice)) - error = dev_dclose(dp->d_rawdev, fflag, devtype, td); + error = dev_dclose(dp->d_rawdev, ap->a_fflag, ap->a_devtype); + return (error); +} + +/* + * First execute the ioctl on the disk device, and if it isn't supported + * try running it on the backing device. + */ +static +int +diskioctl(struct dev_ioctl_args *ap) +{ + dev_t dev = ap->a_head.a_dev; + struct disk *dp; + int error; + + dp = dev->si_disk; + if (dp == NULL) + return (ENXIO); + error = dsioctl(dev, ap->a_cmd, ap->a_data, ap->a_fflag, &dp->d_slice); + if (error == ENOIOCTL) { + error = dev_dioctl(dp->d_rawdev, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); + } return (error); } @@ -451,9 +380,11 @@ diskclose(dev_t dev, int fflag, int devtype, struct thread *td) * Execute strategy routine */ static -void -diskstrategy(dev_t dev, struct bio *bio) +int +diskstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct bio *nbio; struct disk *dp; @@ -463,7 +394,7 @@ diskstrategy(dev_t dev, struct bio *bio) bio->bio_buf->b_error = ENXIO; bio->bio_buf->b_flags |= B_ERROR; biodone(bio); - return; + return(0); } KKASSERT(dev->si_disk == dp); @@ -478,51 +409,69 @@ diskstrategy(dev_t dev, struct bio *bio) dev_dstrategy(dp->d_rawdev, nbio); else biodone(bio); + return(0); } /* - * First execute the ioctl on the disk device, and if it isn't supported - * try running it on the backing device. + * Return the partition size in ?blocks? */ static int -diskioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td) +diskpsize(struct dev_psize_args *ap) { + dev_t dev = ap->a_head.a_dev; struct disk *dp; - int error; dp = dev->si_disk; if (dp == NULL) - return (ENXIO); - - error = dsioctl(dev, cmd, data, fflag, &dp->d_slice); - if (error == ENOIOCTL) - error = dev_dioctl(dp->d_rawdev, cmd, data, fflag, td); - return (error); + return(ENODEV); + ap->a_result = dssize(dev, &dp->d_slice); + return(0); } /* + * When new device entries are instantiated, make sure they inherit our + * si_disk structure and block and iosize limits from the raw device. + * + * This routine is always called synchronously in the context of the + * client. * + * XXX The various io and block size constraints are not always initialized + * properly by devices. */ static int -diskpsize(dev_t dev) +diskclone(struct dev_clone_args *ap) { + dev_t dev = ap->a_head.a_dev; struct disk *dp; - dp = dev->si_disk; - if (dp == NULL) - return (-1); - return(dssize(dev, &dp->d_slice)); -#if 0 - if (dp != dev->si_disk) { - dev->si_drv1 = pdev->si_drv1; - dev->si_drv2 = pdev->si_drv2; - /* XXX: don't set bp->b_dev->si_disk (?) */ + dp = dev->si_ops->head.data; + KKASSERT(dp != NULL); + dev->si_disk = dp; + dev->si_iosize_max = dp->d_rawdev->si_iosize_max; + dev->si_bsize_phys = dp->d_rawdev->si_bsize_phys; + dev->si_bsize_best = dp->d_rawdev->si_bsize_best; + return(0); +} + +int +diskdump(struct dev_dump_args *ap) +{ + dev_t dev = ap->a_head.a_dev; + struct disk *dp = dev->si_ops->head.data; + int error; + + error = disk_dumpcheck(dev, &ap->a_count, &ap->a_blkno, &ap->a_secsize); + if (error == 0) { + ap->a_head.a_dev = dp->d_rawdev; + error = dev_doperate(&ap->a_head); } -#endif + + return(error); } + SYSCTL_INT(_debug_sizeof, OID_AUTO, disklabel, CTLFLAG_RD, 0, sizeof(struct disklabel), "sizeof(struct disklabel)"); diff --git a/sys/kern/subr_diskslice.c b/sys/kern/subr_diskslice.c index 098427be0d..a2ef98ed4b 100644 --- a/sys/kern/subr_diskslice.c +++ b/sys/kern/subr_diskslice.c @@ -44,7 +44,7 @@ * from: @(#)ufs_disksubr.c 7.16 (Berkeley) 5/4/91 * from: ufs_disksubr.c,v 1.8 1994/06/07 01:21:39 phk Exp $ * $FreeBSD: src/sys/kern/subr_diskslice.c,v 1.82.2.6 2001/07/24 09:49:41 dd Exp $ - * $DragonFly: src/sys/kern/subr_diskslice.c,v 1.20 2006/07/04 19:54:08 dillon Exp $ + * $DragonFly: src/sys/kern/subr_diskslice.c,v 1.21 2006/07/28 02:17:40 dillon Exp $ */ #include @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -820,9 +821,9 @@ dssize(dev_t dev, struct diskslices **sspp) ssp = *sspp; if (ssp == NULL || slice >= ssp->dss_nslices || !(ssp->dss_slices[slice].ds_openmask & (1 << part))) { - if (dev_dopen(dev, FREAD, S_IFCHR, NULL) != 0) + if (dev_dopen(dev, FREAD, S_IFCHR, proc0.p_ucred) != 0) return (-1); - dev_dclose(dev, FREAD, S_IFCHR, NULL); + dev_dclose(dev, FREAD, S_IFCHR); ssp = *sspp; } lp = ssp->dss_slices[slice].ds_label; diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index 70bd1ace91..11bb6033c4 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -32,7 +32,7 @@ * * @(#)subr_log.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/kern/subr_log.c,v 1.39.2.2 2001/06/02 08:11:25 phk Exp $ - * $DragonFly: src/sys/kern/subr_log.c,v 1.9 2006/06/13 08:12:03 dillon Exp $ + * $DragonFly: src/sys/kern/subr_log.c,v 1.10 2006/07/28 02:17:40 dillon Exp $ */ /* @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -66,23 +67,13 @@ static d_poll_t logpoll; static void logtimeout(void *arg); #define CDEV_MAJOR 7 -static struct cdevsw log_cdevsw = { - /* name */ "log", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ logopen, - /* close */ logclose, - /* read */ logread, - /* write */ nowrite, - /* ioctl */ logioctl, - /* poll */ logpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops log_ops = { + { "log", CDEV_MAJOR, 0 }, + .d_open = logopen, + .d_close = logclose, + .d_read = logread, + .d_ioctl = logioctl, + .d_poll = logpoll, }; static struct logsoftc { @@ -101,9 +92,9 @@ SYSCTL_INT(_kern, OID_AUTO, log_wakeups_per_second, CTLFLAG_RW, /*ARGSUSED*/ static int -logopen(dev_t dev, int flags, int mode, struct thread *td) +logopen(struct dev_open_args *ap) { - struct proc *p = td->td_proc; + struct proc *p = curproc; KKASSERT(p != NULL); if (log_open) @@ -118,9 +109,8 @@ logopen(dev_t dev, int flags, int mode, struct thread *td) /*ARGSUSED*/ static int -logclose(dev_t dev, int flag, int mode, struct thread *td) +logclose(struct dev_close_args *ap) { - log_open = 0; callout_stop(&logsoftc.sc_callout); logsoftc.sc_state = 0; @@ -130,15 +120,16 @@ logclose(dev_t dev, int flag, int mode, struct thread *td) /*ARGSUSED*/ static int -logread(dev_t dev, struct uio *uio, int flag) +logread(struct dev_read_args *ap) { + struct uio *uio = ap->a_uio; struct msgbuf *mbp = msgbufp; long l; int error = 0; crit_enter(); while (mbp->msg_bufr == mbp->msg_bufx) { - if (flag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { crit_exit(); return (EWOULDBLOCK); } @@ -171,19 +162,20 @@ logread(dev_t dev, struct uio *uio, int flag) /*ARGSUSED*/ static int -logpoll(dev_t dev, int events, struct thread *td) +logpoll(struct dev_poll_args *ap) { int revents = 0; crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (msgbufp->msg_bufr != msgbufp->msg_bufx) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else - selrecord(td, &logsoftc.sc_selp); + selrecord(curthread, &logsoftc.sc_selp); } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } static void @@ -211,43 +203,42 @@ logtimeout(void *arg) /*ARGSUSED*/ static int -logioctl(dev_t dev, u_long com, caddr_t data, int flag, struct thread *td) +logioctl(struct dev_ioctl_args *ap) { long l; - switch (com) { - - /* return number of characters immediately available */ + switch (ap->a_cmd) { case FIONREAD: + /* return number of characters immediately available */ crit_enter(); l = msgbufp->msg_bufx - msgbufp->msg_bufr; crit_exit(); if (l < 0) l += msgbufp->msg_size; - *(int *)data = l; + *(int *)ap->a_data = l; break; case FIOASYNC: - if (*(int *)data) + if (*(int *)ap->a_data) logsoftc.sc_state |= LOG_ASYNC; else logsoftc.sc_state &= ~LOG_ASYNC; break; case FIOSETOWN: - return (fsetown(*(int *)data, &logsoftc.sc_sigio)); + return (fsetown(*(int *)ap->a_data, &logsoftc.sc_sigio)); case FIOGETOWN: - *(int *)data = fgetown(logsoftc.sc_sigio); + *(int *)ap->a_data = fgetown(logsoftc.sc_sigio); break; /* This is deprecated, FIOSETOWN should be used instead. */ case TIOCSPGRP: - return (fsetown(-(*(int *)data), &logsoftc.sc_sigio)); + return (fsetown(-(*(int *)ap->a_data), &logsoftc.sc_sigio)); /* This is deprecated, FIOGETOWN should be used instead */ case TIOCGPGRP: - *(int *)data = -fgetown(logsoftc.sc_sigio); + *(int *)ap->a_data = -fgetown(logsoftc.sc_sigio); break; default: @@ -259,8 +250,8 @@ logioctl(dev_t dev, u_long com, caddr_t data, int flag, struct thread *td) static void log_drvinit(void *unused) { - cdevsw_add(&log_cdevsw, 0, 0); - make_dev(&log_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "klog"); + dev_ops_add(&log_ops, 0, 0); + make_dev(&log_ops, 0, UID_ROOT, GID_WHEEL, 0600, "klog"); } SYSINIT(logdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,log_drvinit,NULL) diff --git a/sys/kern/subr_xxx.c b/sys/kern/subr_xxx.c deleted file mode 100644 index 66212f7c77..0000000000 --- a/sys/kern/subr_xxx.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)subr_xxx.c 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/kern/subr_xxx.c,v 1.15.2.1 2001/02/26 04:23:16 jlemon Exp $ - * $DragonFly: src/sys/kern/Attic/subr_xxx.c,v 1.5 2006/02/17 19:18:06 dillon Exp $ - */ - -/* - * Miscellaneous trivial functions. - */ -#include -#include -#include - -/* - * Return error for operation not supported - * on a specific object or file type. - */ -int -eopnotsupp(void) -{ - return (EOPNOTSUPP); -} - -/* - * Return error for an inval operation - * on a specific object or file type. - */ -int -einval(void) -{ - return (EINVAL); -} - -/* - * Generic null operation, always returns success. - */ -int -nullop(void) -{ - return (0); -} - -#include - -/* - * Unsupported devswitch functions (e.g. for writing to read-only device). - * XXX may belong elsewhere. - */ - -int -noclone(dev_t dev) -{ - /* take no action */ - return (0); /* allow the clone */ -} - -int -noopen(dev_t dev, int flags, int fmt, struct thread *td) -{ - return (ENODEV); -} - -int -noclose(dev_t dev, int flags, int fmt, struct thread *td) -{ - return (ENODEV); -} - -int -noread(dev_t dev, struct uio *uio, int ioflag) -{ - return (ENODEV); -} - -int -nowrite(dev_t dev, struct uio *uio, int ioflag) -{ - return (ENODEV); -} - -int -noioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) -{ - return (ENODEV); -} - -int -nokqfilter(dev_t dev, struct knote *kn) -{ - return (ENODEV); -} - -int -nommap(dev_t dev, vm_offset_t offset, int nprot) -{ - /* Don't return ENODEV. That would allow mapping address ENODEV! */ - return (-1); -} - -int -nopoll(dev_t dev, int events, d_thread_t *td) -{ - return(0); -} - -void -nostrategy(dev_t dev, struct bio *bio) -{ - bio->bio_buf->b_flags |= B_ERROR; - bio->bio_buf->b_error = EOPNOTSUPP; - biodone(bio); -} - -int -nopsize(dev_t dev) -{ - return(0); -} - -int -nodump(dev_t dev, u_int count, u_int blkno, u_int secsize) -{ - return (ENODEV); -} - -/* - * Null devswitch functions (for when the operation always succeeds). - * XXX may belong elsewhere. - * XXX not all are here (e.g., seltrue() isn't). - */ - -/* - * XXX this is probably bogus. Any device that uses it isn't checking the - * minor number. - */ -int -nullopen(dev_t dev, int flags, int fmt, struct thread *td) -{ - return (0); -} - -int -nullclose(dev_t dev, int flags, int fmt, struct thread *td) -{ - return (0); -} - diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 41adbee29e..86b11f5aa1 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -37,7 +37,7 @@ * * @(#)sys_generic.c 8.5 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/sys_generic.c,v 1.55.2.10 2001/03/17 10:39:32 peter Exp $ - * $DragonFly: src/sys/kern/sys_generic.c,v 1.33 2006/06/13 08:12:03 dillon Exp $ + * $DragonFly: src/sys/kern/sys_generic.c,v 1.34 2006/07/28 02:17:40 dillon Exp $ */ #include "opt_ktrace.h" @@ -1059,7 +1059,7 @@ sys_openbsd_poll(struct openbsd_poll_args *uap) /*ARGSUSED*/ int -seltrue(dev_t dev, int events, struct thread *td) +seltrue(dev_t dev, int events) { return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)); } diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 5486ef4dab..8749d95898 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -37,7 +37,7 @@ * * @(#)tty.c 8.8 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/tty.c,v 1.129.2.5 2002/03/11 01:32:31 dd Exp $ - * $DragonFly: src/sys/kern/tty.c,v 1.24 2006/06/13 08:12:03 dillon Exp $ + * $DragonFly: src/sys/kern/tty.c,v 1.25 2006/07/28 02:17:40 dillon Exp $ */ /*- @@ -1117,25 +1117,27 @@ ttioctl(struct tty *tp, u_long cmd, void *data, int flag) } int -ttypoll(dev, events, td) - dev_t dev; - int events; - struct thread *td; +ttypoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; + int events = ap->a_events; int revents = 0; struct tty *tp; tp = dev->si_tty; - if (tp == NULL) /* XXX used to return ENXIO, but that means true! */ - return ((events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)) - | POLLHUP); + /* XXX used to return ENXIO, but that means true! */ + if (tp == NULL) { + ap->a_events = (events & (POLLIN | POLLOUT | POLLRDNORM | + POLLWRNORM)) | POLLHUP; + return(0); + } crit_enter(); if (events & (POLLIN | POLLRDNORM)) { if (ttnread(tp) > 0 || ISSET(tp->t_state, TS_ZOMBIE)) revents |= events & (POLLIN | POLLRDNORM); else - selrecord(td, &tp->t_rsel); + selrecord(curthread, &tp->t_rsel); } if (events & (POLLOUT | POLLWRNORM)) { if ((tp->t_outq.c_cc <= tp->t_olowat && @@ -1143,10 +1145,11 @@ ttypoll(dev, events, td) || ISSET(tp->t_state, TS_ZOMBIE)) revents |= events & (POLLOUT | POLLWRNORM); else - selrecord(td, &tp->t_wsel); + selrecord(curthread, &tp->t_wsel); } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } static struct filterops ttyread_filtops = @@ -1155,13 +1158,14 @@ static struct filterops ttywrite_filtops = { 1, NULL, filt_ttywdetach, filt_ttywrite }; int -ttykqfilter(dev, kn) - dev_t dev; - struct knote *kn; +ttykqfilter(struct dev_kqfilter_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct knote *kn = ap->a_kn; struct tty *tp = dev->si_tty; struct klist *klist; + ap->a_result = 0; switch (kn->kn_filter) { case EVFILT_READ: klist = &tp->t_rsel.si_note; @@ -1172,7 +1176,8 @@ ttykqfilter(dev, kn) kn->kn_fop = &ttywrite_filtops; break; default: - return (1); + ap->a_result = 1; + return (0); } kn->kn_hook = (caddr_t)dev; @@ -2629,29 +2634,23 @@ nottystop(tp, rw) } int -ttyread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +ttyread(struct dev_read_args *ap) { struct tty *tp; - tp = dev->si_tty; + tp = ap->a_head.a_dev->si_tty; if (tp == NULL) return (ENODEV); - return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); + return ((*linesw[tp->t_line].l_read)(tp, ap->a_uio, ap->a_ioflag)); } int -ttywrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +ttywrite(struct dev_write_args *ap) { struct tty *tp; - tp = dev->si_tty; + tp = ap->a_head.a_dev->si_tty; if (tp == NULL) return (ENODEV); - return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); + return ((*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag)); } diff --git a/sys/kern/tty_conf.c b/sys/kern/tty_conf.c index 43fdc8522b..b55f9c8c46 100644 --- a/sys/kern/tty_conf.c +++ b/sys/kern/tty_conf.c @@ -37,7 +37,7 @@ * * @(#)tty_conf.c 8.4 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/tty_conf.c,v 1.16.2.1 2002/03/11 01:14:55 dd Exp $ - * $DragonFly: src/sys/kern/tty_conf.c,v 1.3 2003/06/23 17:55:41 dillon Exp $ + * $DragonFly: src/sys/kern/tty_conf.c,v 1.4 2006/07/28 02:17:40 dillon Exp $ */ #include "opt_compat.h" @@ -199,12 +199,8 @@ l_nostart(tp) * discipline specific ioctl command. */ int -l_nullioctl(tp, cmd, data, flags, td) - struct tty *tp; - u_long cmd; - char *data; - int flags; - struct thread *td; +l_nullioctl(struct tty *tp, u_long cmd, char *data, int flags, + struct ucred *cred) { return (ENOIOCTL); diff --git a/sys/kern/tty_cons.c b/sys/kern/tty_cons.c index 97a6600344..d8166ad19d 100644 --- a/sys/kern/tty_cons.c +++ b/sys/kern/tty_cons.c @@ -37,7 +37,7 @@ * * from: @(#)cons.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/kern/tty_cons.c,v 1.81.2.4 2001/12/17 18:44:41 guido Exp $ - * $DragonFly: src/sys/kern/tty_cons.c,v 1.15 2006/02/17 19:18:06 dillon Exp $ + * $DragonFly: src/sys/kern/tty_cons.c,v 1.16 2006/07/28 02:17:40 dillon Exp $ */ #include "opt_ddb.h" @@ -60,33 +60,38 @@ #include -static int cnopen(struct cdevmsg_open *msg); -static int cnclose(struct cdevmsg_close *msg); -static int cnread(struct cdevmsg_read *msg); -static int cnwrite(struct cdevmsg_write *msg); -static int cnioctl(struct cdevmsg_ioctl *msg); -static int cnpoll(struct cdevmsg_poll *msg); -static int cnkqfilter(struct cdevmsg_kqfilter *msg); +static d_open_t cnopen; +static d_close_t cnclose; +static d_read_t cnread; +static d_write_t cnwrite; +static d_ioctl_t cnioctl; +static d_poll_t cnpoll; +static d_kqfilter_t cnkqfilter; -static int console_putport(lwkt_port_t port, lwkt_msg_t lmsg); -static int console_interceptport(lwkt_port_t port, lwkt_msg_t lmsg); - -static struct lwkt_port cn_port; /* console device port */ -static struct lwkt_port cn_iport; /* intercept port */ +static int cnintercept(struct dev_generic_args *ap); #define CDEV_MAJOR 0 -static struct cdevsw cn_cdevsw = { - /* name */ "console", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY | D_KQFILTER, - /* port */ &cn_port, - /* clone */ NULL +static struct dev_ops cn_ops = { + { "console", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_open = cnopen, + .d_close = cnclose, + .d_read = cnread, + .d_write = cnwrite, + .d_ioctl = cnioctl, + .d_poll = cnpoll, + .d_kqfilter = cnkqfilter, +}; + +static struct dev_ops cn_iops = { + { "intercept", CDEV_MAJOR, D_TTY | D_KQFILTER }, + .d_default = cnintercept }; -static dev_t cn_dev_t; -static udev_t cn_udev_t; +static struct dev_ops *cn_fwd_ops; +static dev_t cn_dev; +static udev_t cn_udev; SYSCTL_OPAQUE(_machdep, CPU_CONSDEV, consdev, CTLFLAG_RD, - &cn_udev_t, sizeof cn_udev_t, "T,dev_t", ""); + &cn_udev, sizeof cn_udev, "T,dev_t", ""); static int cn_mute; @@ -104,8 +109,6 @@ static u_char console_pausing; /* pause after each line during probe */ static char *console_pausestr= ""; -static lwkt_port_t cn_fwd_port; - CONS_DRIVER(cons, NULL, NULL, NULL, NULL, NULL, NULL, NULL); SET_DECLARE(cons_set, struct consdev); @@ -114,14 +117,6 @@ cninit() { struct consdev *best_cp, *cp, **list; - /* - * Our port intercept - */ - lwkt_initport(&cn_port, NULL); - cn_port.mp_putport = console_putport; - lwkt_initport(&cn_iport, NULL); - cn_iport.mp_putport = console_interceptport; - /* * Find the first console with the highest priority. */ @@ -186,9 +181,9 @@ cninit_finish() * Hook the open and close functions. XXX bad hack. */ if (dev_is_good(cn_tab->cn_dev)) - cn_fwd_port = cdevsw_dev_override(cn_tab->cn_dev, &cn_iport); - cn_dev_t = cn_tab->cn_dev; - cn_udev_t = dev2udev(cn_dev_t); + cn_fwd_ops = dev_ops_intercept(cn_tab->cn_dev, &cn_iops); + cn_dev = cn_tab->cn_dev; + cn_udev = dev2udev(cn_dev); console_pausing = 0; } @@ -201,11 +196,11 @@ cnuninit(void) /* * Unhook the open and close functions. XXX bad hack */ - if (cn_fwd_port) - cdevsw_dev_override(cn_tab->cn_dev, cn_fwd_port); - cn_fwd_port = NULL; - cn_dev_t = NODEV; - cn_udev_t = NOUDEV; + if (cn_fwd_ops) + dev_ops_restore(cn_tab->cn_dev, cn_fwd_ops); + cn_fwd_ops = NULL; + cn_dev = NULL; + cn_udev = NOUDEV; } /* @@ -229,8 +224,8 @@ sysctl_kern_consmute(SYSCTL_HANDLER_ARGS) cninit_finish(); if (cn_is_open) { /* XXX curproc is not what we want really */ - error = dev_dopen(cn_dev_t, openflag, - openmode, curthread); + error = dev_dopen(cn_dev, openflag, + openmode, curproc->p_ucred); } /* if it failed, back it out */ if ( error != 0) cnuninit(); @@ -240,8 +235,8 @@ sysctl_kern_consmute(SYSCTL_HANDLER_ARGS) * if it's only open via /dev/console */ if (cn_is_open) { - error = dev_dclose(cn_dev_t, openflag, - openmode, curthread); + error = dev_dclose(cn_dev, openflag, + openmode); } if (error == 0) cnuninit(); @@ -264,99 +259,38 @@ SYSCTL_PROC(_kern, OID_AUTO, consmute, CTLTYPE_INT|CTLFLAG_RW, * forward the rest through. */ static int -console_interceptport(lwkt_port_t port, lwkt_msg_t lmsg) -{ - cdevallmsg_t msg = (cdevallmsg_t)lmsg; - int error; - - switch(msg->am_lmsg.ms_cmd.cm_op) { - case CDEV_CMD_OPEN: - error = cnopen(&msg->am_open); - break; - case CDEV_CMD_CLOSE: - error = cnclose(&msg->am_close); - break; - default: - error = lwkt_forwardmsg(cn_fwd_port, &msg->am_lmsg); - break; - } - return(error); -} - -/* - * This is the port handler for /dev/console. These functions will basically - * past the request through to the actual physical device representing the - * console. - * - * Note, however, that cnopen() and cnclose() are also called from the mute - * code and the intercept code. - */ -static int -console_putport(lwkt_port_t port, lwkt_msg_t lmsg) +cnintercept(struct dev_generic_args *ap) { - cdevallmsg_t msg = (cdevallmsg_t)lmsg; int error; - switch(msg->am_lmsg.ms_cmd.cm_op) { - case CDEV_CMD_OPEN: - error = cnopen(&msg->am_open); - break; - case CDEV_CMD_CLOSE: - error = cnclose(&msg->am_close); - break; - case CDEV_CMD_STRATEGY: - nostrategy(msg->am_strategy.msg.dev, msg->am_strategy.bio); - error = 0; - break; - case CDEV_CMD_IOCTL: - error = cnioctl(&msg->am_ioctl); - break; - case CDEV_CMD_DUMP: - error = nodump(msg->am_dump.msg.dev, 0, 0, 0); - break; - case CDEV_CMD_PSIZE: - error = nopsize(msg->am_psize.msg.dev); - break; - case CDEV_CMD_READ: - error = cnread(&msg->am_read); - break; - case CDEV_CMD_WRITE: - error = cnwrite(&msg->am_write); - break; - case CDEV_CMD_POLL: - error = cnpoll(&msg->am_poll); - break; - case CDEV_CMD_KQFILTER: - error = cnkqfilter(&msg->am_kqfilter); - break; - case CDEV_CMD_MMAP: - error = nommap(msg->am_mmap.msg.dev, - msg->am_mmap.offset, - msg->am_mmap.nprot); - break; - default: - error = ENODEV; - break; + if (ap->a_desc == &dev_open_desc) { + error = cnopen((struct dev_open_args *)ap); + } else if (ap->a_desc == &dev_close_desc) { + error = cnclose((struct dev_close_args *)ap); + } else if (cn_fwd_ops) { + error = dev_doperate_ops(cn_fwd_ops, ap); + } else { + error = ENXIO; } - return(error); + return (error); } /* - * cnopen() is called as a port intercept function (dev will be that of the + * cnopen() is called as an intercept function (dev will be that of the * actual physical device representing our console), and also called from * the muting code and from the /dev/console switch (dev will have the * console's cdevsw). */ static int -cnopen(struct cdevmsg_open *msg) +cnopen(struct dev_open_args *ap) { - dev_t dev = msg->msg.dev; - int flag = msg->oflags; - int mode = msg->devtype; + dev_t dev = ap->a_head.a_dev; + int flag = ap->a_oflags; + int mode = ap->a_devtype; dev_t cndev, physdev; int retval = 0; - if (cn_tab == NULL || cn_fwd_port == NULL) + if (cn_tab == NULL || cn_fwd_ops == NULL) return (0); cndev = cn_tab->cn_dev; physdev = (major(dev) == major(cndev) ? dev : cndev); @@ -366,12 +300,18 @@ cnopen(struct cdevmsg_open *msg) * so we don't need to check for that. They bypass this and go * straight to the device. * + * It is important to note that due to our intercept and the fact + * that we might be called via the original (intercepted) device, + * the original device's ops may point to us, so to avoid an + * infinite recursion we have to forward through cn_fwd_ops. + * This is a severe hack that really needs to be fixed XXX. + * * XXX at the moment we assume that the port forwarding function * is synchronous for open. */ if (!cn_mute) { - msg->msg.dev = physdev; - retval = lwkt_forwardmsg(cn_fwd_port, &msg->msg.msg); + ap->a_head.a_dev = physdev; + retval = dev_doperate_ops(cn_fwd_ops, &ap->a_head); } if (retval == 0) { /* @@ -397,13 +337,13 @@ cnopen(struct cdevmsg_open *msg) * console's cdevsw). */ static int -cnclose(struct cdevmsg_close *msg) +cnclose(struct dev_close_args *ap) { - dev_t dev = msg->msg.dev; + dev_t dev = ap->a_head.a_dev; dev_t cndev; struct tty *cn_tp; - if (cn_tab == NULL || cn_fwd_port == NULL) + if (cn_tab == NULL || cn_fwd_ops == NULL) return (0); cndev = cn_tab->cn_dev; cn_tp = cndev->si_tty; @@ -431,35 +371,35 @@ cnclose(struct cdevmsg_close *msg) return (0); dev = cndev; } - if (cn_fwd_port) { - msg->msg.dev = dev; - return(lwkt_forwardmsg(cn_fwd_port, &msg->msg.msg)); + if (cn_fwd_ops) { + ap->a_head.a_dev = dev; + return (dev_doperate_ops(cn_fwd_ops, &ap->a_head)); } return (0); } /* * The following functions are dispatched solely from the /dev/console - * port switch. Their job is primarily to forward the request through. + * device. Their job is primarily to forward the request through. * If the console is not attached to anything then write()'s are sunk * to null and reads return 0 (mostly). */ static int -cnread(struct cdevmsg_read *msg) +cnread(struct dev_read_args *ap) { - if (cn_tab == NULL || cn_fwd_port == NULL) + if (cn_tab == NULL || cn_fwd_ops == NULL) return (0); - msg->msg.dev = cn_tab->cn_dev; - return(lwkt_forwardmsg(cn_fwd_port, &msg->msg.msg)); + ap->a_head.a_dev = cn_tab->cn_dev; + return (dev_doperate(&ap->a_head)); } static int -cnwrite(struct cdevmsg_write *msg) +cnwrite(struct dev_write_args *ap) { - struct uio *uio = msg->uio; + struct uio *uio = ap->a_uio; dev_t dev; - if (cn_tab == NULL || cn_fwd_port == NULL) { + if (cn_tab == NULL || cn_fwd_ops == NULL) { uio->uio_resid = 0; /* dump the data */ return (0); } @@ -468,50 +408,51 @@ cnwrite(struct cdevmsg_write *msg) else dev = cn_tab->cn_dev; log_console(uio); - msg->msg.dev = dev; - return(lwkt_forwardmsg(cn_fwd_port, &msg->msg.msg)); + ap->a_head.a_dev = dev; + return (dev_doperate(&ap->a_head)); } static int -cnioctl(struct cdevmsg_ioctl *msg) +cnioctl(struct dev_ioctl_args *ap) { - u_long cmd = msg->cmd; int error; - if (cn_tab == NULL || cn_fwd_port == NULL) + if (cn_tab == NULL || cn_fwd_ops == NULL) return (0); - KKASSERT(msg->td->td_proc != NULL); + KKASSERT(curproc != NULL); /* * Superuser can always use this to wrest control of console * output from the "virtual" console. */ - if (cmd == TIOCCONS && constty) { - error = suser(msg->td); - if (error) - return (error); + if (ap->a_cmd == TIOCCONS && constty) { + if (ap->a_cred) { + error = suser_cred(ap->a_cred, 0); + if (error) + return (error); + } constty = NULL; return (0); } - msg->msg.dev = cn_tab->cn_dev; - return(lwkt_forwardmsg(cn_fwd_port, &msg->msg.msg)); + ap->a_head.a_dev = cn_tab->cn_dev; + return (dev_doperate(&ap->a_head)); } static int -cnpoll(struct cdevmsg_poll *msg) +cnpoll(struct dev_poll_args *ap) { - if ((cn_tab == NULL) || cn_mute || cn_fwd_port == NULL) + if ((cn_tab == NULL) || cn_mute || cn_fwd_ops == NULL) return (1); - msg->msg.dev = cn_tab->cn_dev; - return(lwkt_forwardmsg(cn_fwd_port, &msg->msg.msg)); + ap->a_head.a_dev = cn_tab->cn_dev; + return (dev_doperate(&ap->a_head)); } static int -cnkqfilter(struct cdevmsg_kqfilter *msg) +cnkqfilter(struct dev_kqfilter_args *ap) { - if ((cn_tab == NULL) || cn_mute || cn_fwd_port == NULL) + if ((cn_tab == NULL) || cn_mute || cn_fwd_ops == NULL) return (1); - msg->msg.dev = cn_tab->cn_dev; - return(lwkt_forwardmsg(cn_fwd_port, &msg->msg.msg)); + ap->a_head.a_dev = cn_tab->cn_dev; + return (dev_doperate(&ap->a_head)); } /* @@ -584,8 +525,8 @@ cndbctl(int on) static void cn_drvinit(void *unused) { - cdevsw_add(&cn_cdevsw, 0, 0); - cn_devfsdev = make_dev(&cn_cdevsw, 0, UID_ROOT, GID_WHEEL, + dev_ops_add(&cn_ops, 0, 0); + cn_devfsdev = make_dev(&cn_ops, 0, UID_ROOT, GID_WHEEL, 0600, "console"); } diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c index a8bd5dc20b..088d21b939 100644 --- a/sys/kern/tty_pty.c +++ b/sys/kern/tty_pty.c @@ -32,12 +32,12 @@ * * @(#)tty_pty.c 8.4 (Berkeley) 2/20/95 * $FreeBSD: src/sys/kern/tty_pty.c,v 1.74.2.4 2002/02/20 19:58:13 dillon Exp $ - * $DragonFly: src/sys/kern/tty_pty.c,v 1.13 2005/06/06 15:02:28 dillon Exp $ + * $DragonFly: src/sys/kern/tty_pty.c,v 1.14 2006/07/28 02:17:40 dillon Exp $ */ /* * Pseudo-teletype Driver - * (Actually two drivers, requiring two entries in 'cdevsw') + * (Actually two drivers, requiring two dev_ops structures) */ #include "use_pty.h" /* XXX */ #include "opt_compat.h" @@ -78,45 +78,27 @@ static d_write_t ptcwrite; static d_poll_t ptcpoll; #define CDEV_MAJOR_S 5 -static struct cdevsw pts_cdevsw = { - /* name */ "pts", - /* maj */ CDEV_MAJOR_S, - /* flags */ D_TTY | D_KQFILTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ptsopen, - /* close */ ptsclose, - /* read */ ptsread, - /* write */ ptswrite, - /* ioctl */ ptyioctl, - /* poll */ ttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops pts_ops = { + { "pts", CDEV_MAJOR_S, D_TTY | D_KQFILTER }, + .d_open = ptsopen, + .d_close = ptsclose, + .d_read = ptsread, + .d_write = ptswrite, + .d_ioctl = ptyioctl, + .d_poll = ttypoll, + .d_kqfilter = ttykqfilter }; #define CDEV_MAJOR_C 6 -static struct cdevsw ptc_cdevsw = { - /* name */ "ptc", - /* maj */ CDEV_MAJOR_C, - /* flags */ D_TTY | D_KQFILTER | D_MASTER, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ptcopen, - /* close */ ptcclose, - /* read */ ptcread, - /* write */ ptcwrite, - /* ioctl */ ptyioctl, - /* poll */ ptcpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ ttykqfilter +static struct dev_ops ptc_ops = { + { "ptc", CDEV_MAJOR_C, D_TTY | D_KQFILTER | D_MASTER }, + .d_open = ptcopen, + .d_close = ptcclose, + .d_read = ptcread, + .d_write = ptcwrite, + .d_ioctl = ptyioctl, + .d_poll = ptcpoll, + .d_kqfilter = ttykqfilter }; #define BUFSIZ 100 /* Chunk size iomoved to/from user */ @@ -160,9 +142,9 @@ ptyinit(n) pt = malloc(sizeof(*pt), M_PTY, M_WAITOK); bzero(pt, sizeof(*pt)); - pt->devs = devs = make_dev(&pts_cdevsw, n, + pt->devs = devs = make_dev(&pts_ops, n, 0, 0, 0666, "tty%c%r", names[n / 32], n % 32); - pt->devc = devc = make_dev(&ptc_cdevsw, n, + pt->devc = devc = make_dev(&ptc_ops, n, 0, 0, 0666, "pty%c%r", names[n / 32], n % 32); devs->si_drv1 = devc->si_drv1 = pt; @@ -173,8 +155,9 @@ ptyinit(n) /*ARGSUSED*/ static int -ptsopen(dev_t dev, int flag, int devtype, struct thread *td) +ptsopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; int error; int minr; @@ -182,10 +165,6 @@ ptsopen(dev_t dev, int flag, int devtype, struct thread *td) dev_t nextdev; #endif struct pt_ioctl *pti; - struct proc *p; - - p = td->td_proc; - KKASSERT(p != NULL); minr = lminor(dev); #if 0 @@ -214,15 +193,15 @@ ptsopen(dev_t dev, int flag, int devtype, struct thread *td) tp->t_lflag = TTYDEF_LFLAG; tp->t_cflag = TTYDEF_CFLAG; tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; - } else if (tp->t_state & TS_XCLUDE && suser(td)) { + } else if ((tp->t_state & TS_XCLUDE) && suser_cred(ap->a_cred, 0)) { return (EBUSY); - } else if (pti->pt_prison != p->p_ucred->cr_prison) { + } else if (pti->pt_prison != ap->a_cred->cr_prison) { return (EBUSY); } if (tp->t_oproc) /* Ctrlr still around. */ (void)(*linesw[tp->t_line].l_modem)(tp, 1); while ((tp->t_state & TS_CARR_ON) == 0) { - if (flag&FNONBLOCK) + if (ap->a_oflags & FNONBLOCK) break; error = ttysleep(tp, TSA_CARR_ON(tp), PCATCH, "ptsopn", 0); if (error) @@ -235,27 +214,23 @@ ptsopen(dev_t dev, int flag, int devtype, struct thread *td) } static int -ptsclose(dev, flag, mode, td) - dev_t dev; - int flag, mode; - struct thread *td; +ptsclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; int err; tp = dev->si_tty; - err = (*linesw[tp->t_line].l_close)(tp, flag); + err = (*linesw[tp->t_line].l_close)(tp, ap->a_fflag); ptsstop(tp, FREAD|FWRITE); (void) ttyclose(tp); return (err); } static int -ptsread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +ptsread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct proc *p = curproc; struct tty *tp = dev->si_tty; struct pt_ioctl *pti = dev->si_drv1; @@ -274,7 +249,7 @@ again: return (error); } if (tp->t_canq.c_cc == 0) { - if (flag & IO_NDELAY) + if (ap->a_ioflag & IO_NDELAY) return (EWOULDBLOCK); error = ttysleep(tp, TSA_PTS_READ(tp), PCATCH, "ptsin", 0); @@ -282,8 +257,8 @@ again: return (error); goto again; } - while (tp->t_canq.c_cc > 1 && uio->uio_resid > 0) - if (ureadc(getc(&tp->t_canq), uio) < 0) { + while (tp->t_canq.c_cc > 1 && ap->a_uio->uio_resid > 0) + if (ureadc(getc(&tp->t_canq), ap->a_uio) < 0) { error = EFAULT; break; } @@ -293,7 +268,7 @@ again: return (error); } else if (tp->t_oproc) - error = (*linesw[tp->t_line].l_read)(tp, uio, flag); + error = (*linesw[tp->t_line].l_read)(tp, ap->a_uio, ap->a_ioflag); ptcwakeup(tp, FWRITE); return (error); } @@ -304,17 +279,15 @@ again: * indirectly, when tty driver calls ptsstart. */ static int -ptswrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +ptswrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; tp = dev->si_tty; if (tp->t_oproc == 0) return (EIO); - return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); + return ((*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag)); } /* @@ -354,11 +327,9 @@ ptcwakeup(tp, flag) } static int -ptcopen(dev, flag, devtype, td) - dev_t dev; - int flag, devtype; - struct thread *td; +ptcopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; struct pt_ioctl *pti; @@ -369,13 +340,12 @@ ptcopen(dev, flag, devtype, td) tp = dev->si_tty; if (tp->t_oproc) return (EIO); - KKASSERT(td->td_proc != NULL); tp->t_oproc = ptsstart; tp->t_stop = ptsstop; (void)(*linesw[tp->t_line].l_modem)(tp, 1); tp->t_lflag &= ~EXTPROC; pti = dev->si_drv1; - pti->pt_prison = td->td_proc->p_ucred->cr_prison; + pti->pt_prison = ap->a_cred->cr_prison; pti->pt_flags = 0; pti->pt_send = 0; pti->pt_ucntl = 0; @@ -383,12 +353,9 @@ ptcopen(dev, flag, devtype, td) } static int -ptcclose(dev, flags, fmt, td) - dev_t dev; - int flags; - int fmt; - struct thread *td; +ptcclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp; tp = dev->si_tty; @@ -413,11 +380,9 @@ ptcclose(dev, flags, fmt, td) } static int -ptcread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +ptcread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp = dev->si_tty; struct pt_ioctl *pti = dev->si_drv1; char buf[BUFSIZ]; @@ -432,20 +397,20 @@ ptcread(dev, uio, flag) for (;;) { if (tp->t_state&TS_ISOPEN) { if (pti->pt_flags&PF_PKT && pti->pt_send) { - error = ureadc((int)pti->pt_send, uio); + error = ureadc((int)pti->pt_send, ap->a_uio); if (error) return (error); if (pti->pt_send & TIOCPKT_IOCTL) { - cc = min(uio->uio_resid, + cc = min(ap->a_uio->uio_resid, sizeof(tp->t_termios)); uiomove((caddr_t)&tp->t_termios, cc, - uio); + ap->a_uio); } pti->pt_send = 0; return (0); } if (pti->pt_flags&PF_UCNTL && pti->pt_ucntl) { - error = ureadc((int)pti->pt_ucntl, uio); + error = ureadc((int)pti->pt_ucntl, ap->a_uio); if (error) return (error); pti->pt_ucntl = 0; @@ -456,19 +421,19 @@ ptcread(dev, uio, flag) } if ((tp->t_state & TS_CONNECTED) == 0) return (0); /* EOF */ - if (flag & IO_NDELAY) + if (ap->a_ioflag & IO_NDELAY) return (EWOULDBLOCK); error = tsleep(TSA_PTC_READ(tp), PCATCH, "ptcin", 0); if (error) return (error); } if (pti->pt_flags & (PF_PKT|PF_UCNTL)) - error = ureadc(0, uio); - while (uio->uio_resid > 0 && error == 0) { - cc = q_to_b(&tp->t_outq, buf, min(uio->uio_resid, BUFSIZ)); + error = ureadc(0, ap->a_uio); + while (ap->a_uio->uio_resid > 0 && error == 0) { + cc = q_to_b(&tp->t_outq, buf, min(ap->a_uio->uio_resid, BUFSIZ)); if (cc <= 0) break; - error = uiomove(buf, cc, uio); + error = uiomove(buf, cc, ap->a_uio); } ttwwakeup(tp); return (error); @@ -499,60 +464,59 @@ ptsstop(tp, flush) } static int -ptcpoll(dev, events, td) - dev_t dev; - int events; - struct thread *td; +ptcpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp = dev->si_tty; struct pt_ioctl *pti = dev->si_drv1; int revents = 0; - if ((tp->t_state & TS_CONNECTED) == 0) - return (seltrue(dev, events, td) | POLLHUP); + if ((tp->t_state & TS_CONNECTED) == 0) { + ap->a_events = seltrue(dev, ap->a_events) | POLLHUP; + return(0); + } /* * Need to block timeouts (ttrstart). */ crit_enter(); - if (events & (POLLIN | POLLRDNORM)) + if (ap->a_events & (POLLIN | POLLRDNORM)) if ((tp->t_state & TS_ISOPEN) && ((tp->t_outq.c_cc && (tp->t_state & TS_TTSTOP) == 0) || ((pti->pt_flags & PF_PKT) && pti->pt_send) || ((pti->pt_flags & PF_UCNTL) && pti->pt_ucntl))) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); - if (events & (POLLOUT | POLLWRNORM)) + if (ap->a_events & (POLLOUT | POLLWRNORM)) if (tp->t_state & TS_ISOPEN && ((pti->pt_flags & PF_REMOTE) ? (tp->t_canq.c_cc == 0) : ((tp->t_rawq.c_cc + tp->t_canq.c_cc < TTYHOG - 2) || (tp->t_canq.c_cc == 0 && (tp->t_lflag & ICANON))))) - revents |= events & (POLLOUT | POLLWRNORM); + revents |= ap->a_events & (POLLOUT | POLLWRNORM); - if (events & POLLHUP) + if (ap->a_events & POLLHUP) if ((tp->t_state & TS_CARR_ON) == 0) revents |= POLLHUP; if (revents == 0) { - if (events & (POLLIN | POLLRDNORM)) - selrecord(td, &pti->pt_selr); + if (ap->a_events & (POLLIN | POLLRDNORM)) + selrecord(curthread, &pti->pt_selr); - if (events & (POLLOUT | POLLWRNORM)) - selrecord(td, &pti->pt_selw); + if (ap->a_events & (POLLOUT | POLLWRNORM)) + selrecord(curthread, &pti->pt_selw); } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } static int -ptcwrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +ptcwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp = dev->si_tty; u_char *cp = 0; int cc = 0; @@ -567,19 +531,19 @@ again: if (pti->pt_flags & PF_REMOTE) { if (tp->t_canq.c_cc) goto block; - while ((uio->uio_resid > 0 || cc > 0) && + while ((ap->a_uio->uio_resid > 0 || cc > 0) && tp->t_canq.c_cc < TTYHOG - 1) { if (cc == 0) { - cc = min(uio->uio_resid, BUFSIZ); + cc = min(ap->a_uio->uio_resid, BUFSIZ); cc = min(cc, TTYHOG - 1 - tp->t_canq.c_cc); cp = locbuf; - error = uiomove((caddr_t)cp, cc, uio); + error = uiomove((caddr_t)cp, cc, ap->a_uio); if (error) return (error); /* check again for safety */ if ((tp->t_state & TS_ISOPEN) == 0) { /* adjust as usual */ - uio->uio_resid += cc; + ap->a_uio->uio_resid += cc; return (EIO); } } @@ -598,23 +562,23 @@ again: } } /* adjust for data copied in but not written */ - uio->uio_resid += cc; + ap->a_uio->uio_resid += cc; (void) putc(0, &tp->t_canq); ttwakeup(tp); wakeup(TSA_PTS_READ(tp)); return (0); } - while (uio->uio_resid > 0 || cc > 0) { + while (ap->a_uio->uio_resid > 0 || cc > 0) { if (cc == 0) { - cc = min(uio->uio_resid, BUFSIZ); + cc = min(ap->a_uio->uio_resid, BUFSIZ); cp = locbuf; - error = uiomove((caddr_t)cp, cc, uio); + error = uiomove((caddr_t)cp, cc, ap->a_uio); if (error) return (error); /* check again for safety */ if ((tp->t_state & TS_ISOPEN) == 0) { /* adjust for data copied in but not written */ - uio->uio_resid += cc; + ap->a_uio->uio_resid += cc; return (EIO); } } @@ -638,12 +602,12 @@ block: */ if ((tp->t_state & TS_CONNECTED) == 0) { /* adjust for data copied in but not written */ - uio->uio_resid += cc; + ap->a_uio->uio_resid += cc; return (EIO); } - if (flag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { /* adjust for data copied in but not written */ - uio->uio_resid += cc; + ap->a_uio->uio_resid += cc; if (cnt == 0) return (EWOULDBLOCK); return (0); @@ -651,7 +615,7 @@ block: error = tsleep(TSA_PTC_WRITE(tp), PCATCH, "ptcout", 0); if (error) { /* adjust for data copied in but not written */ - uio->uio_resid += cc; + ap->a_uio->uio_resid += cc; return (error); } goto again; @@ -659,31 +623,27 @@ block: /*ARGSUSED*/ static int -ptyioctl(dev, cmd, data, flag, td) - dev_t dev; - u_long cmd; - caddr_t data; - int flag; - struct thread *td; +ptyioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tty *tp = dev->si_tty; struct pt_ioctl *pti = dev->si_drv1; u_char *cc = tp->t_cc; int stop, error; if (dev_dflags(dev) & D_MASTER) { - switch (cmd) { + switch (ap->a_cmd) { case TIOCGPGRP: /* * We avoid calling ttioctl on the controller since, * in that case, tp must be the controlling terminal. */ - *(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : 0; + *(int *)ap->a_data = tp->t_pgrp ? tp->t_pgrp->pg_id : 0; return (0); case TIOCPKT: - if (*(int *)data) { + if (*(int *)ap->a_data) { if (pti->pt_flags & PF_UCNTL) return (EINVAL); pti->pt_flags |= PF_PKT; @@ -692,7 +652,7 @@ ptyioctl(dev, cmd, data, flag, td) return (0); case TIOCUCNTL: - if (*(int *)data) { + if (*(int *)ap->a_data) { if (pti->pt_flags & PF_PKT) return (EINVAL); pti->pt_flags |= PF_UCNTL; @@ -701,7 +661,7 @@ ptyioctl(dev, cmd, data, flag, td) return (0); case TIOCREMOTE: - if (*(int *)data) + if (*(int *)ap->a_data) pti->pt_flags |= PF_REMOTE; else pti->pt_flags &= ~PF_REMOTE; @@ -716,7 +676,7 @@ ptyioctl(dev, cmd, data, flag, td) if ((tp->t_state & TS_ISOPEN) == 0) return (EAGAIN); - switch (cmd) { + switch (ap->a_cmd) { #ifdef COMPAT_43 case TIOCSETP: case TIOCSETN: @@ -734,25 +694,25 @@ ptyioctl(dev, cmd, data, flag, td) break; case TIOCSIG: - if (*(unsigned int *)data >= NSIG || - *(unsigned int *)data == 0) + if (*(unsigned int *)ap->a_data >= NSIG || + *(unsigned int *)ap->a_data == 0) return(EINVAL); if ((tp->t_lflag&NOFLSH) == 0) ttyflush(tp, FREAD|FWRITE); - pgsignal(tp->t_pgrp, *(unsigned int *)data, 1); - if ((*(unsigned int *)data == SIGINFO) && + pgsignal(tp->t_pgrp, *(unsigned int *)ap->a_data, 1); + if ((*(unsigned int *)ap->a_data == SIGINFO) && ((tp->t_lflag&NOKERNINFO) == 0)) ttyinfo(tp); return(0); } } - if (cmd == TIOCEXT) { + if (ap->a_cmd == TIOCEXT) { /* * When the EXTPROC bit is being toggled, we need * to send an TIOCPKT_IOCTL if the packet driver * is turned on. */ - if (*(int *)data) { + if (*(int *)ap->a_data) { if (pti->pt_flags & PF_PKT) { pti->pt_send |= TIOCPKT_IOCTL; ptcwakeup(tp, FREAD); @@ -768,14 +728,15 @@ ptyioctl(dev, cmd, data, flag, td) } return(0); } - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td); + error = (*linesw[tp->t_line].l_ioctl)(tp, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); if (error == ENOIOCTL) - error = ttioctl(tp, cmd, data, flag); + error = ttioctl(tp, ap->a_cmd, ap->a_data, ap->a_fflag); if (error == ENOIOCTL) { if (pti->pt_flags & PF_UCNTL && - (cmd & ~0xff) == UIOCCMD(0)) { - if (cmd & 0xff) { - pti->pt_ucntl = (u_char)cmd; + (ap->a_cmd & ~0xff) == UIOCCMD(0)) { + if (ap->a_cmd & 0xff) { + pti->pt_ucntl = (u_char)ap->a_cmd; ptcwakeup(tp, FREAD); } return (0); @@ -786,7 +747,7 @@ ptyioctl(dev, cmd, data, flag, td) * If external processing and packet mode send ioctl packet. */ if ((tp->t_lflag&EXTPROC) && (pti->pt_flags & PF_PKT)) { - switch(cmd) { + switch(ap->a_cmd) { case TIOCSETA: case TIOCSETAW: case TIOCSETAF: @@ -834,8 +795,8 @@ static void ptc_drvinit(unused) void *unused; { - cdevsw_add(&pts_cdevsw, 0, 0); - cdevsw_add(&ptc_cdevsw, 0, 0); + dev_ops_add(&pts_ops, 0, 0); + dev_ops_add(&ptc_ops, 0, 0); /* XXX: Gross hack for DEVFS */ /* XXX: DEVFS is no more, should this be removed? */ ptyinit(0); diff --git a/sys/kern/tty_tty.c b/sys/kern/tty_tty.c index 1c8b62f4f9..1e1cbc371a 100644 --- a/sys/kern/tty_tty.c +++ b/sys/kern/tty_tty.c @@ -32,7 +32,7 @@ * * @(#)tty_tty.c 8.2 (Berkeley) 9/23/93 * $FreeBSD: src/sys/kern/tty_tty.c,v 1.30 1999/09/25 18:24:24 phk Exp $ - * $DragonFly: src/sys/kern/tty_tty.c,v 1.15 2006/05/06 02:43:12 dillon Exp $ + * $DragonFly: src/sys/kern/tty_tty.c,v 1.16 2006/07/28 02:17:40 dillon Exp $ */ /* @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -58,23 +59,14 @@ static d_poll_t cttypoll; #define CDEV_MAJOR 1 /* Don't make this static, since fdesc_vnops uses it. */ -struct cdevsw ctty_cdevsw = { - /* name */ "ctty", - /* maj */ CDEV_MAJOR, - /* flags */ D_TTY, - /* port */ NULL, - /* clone */ NULL, - - /* open */ cttyopen, - /* close */ cttyclose, - /* read */ cttyread, - /* write */ cttywrite, - /* ioctl */ cttyioctl, - /* poll */ cttypoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +struct dev_ops ctty_ops = { + { "ctty", CDEV_MAJOR, D_TTY }, + .d_open = cttyopen, + .d_close = cttyclose, + .d_read = cttyread, + .d_write = cttywrite, + .d_ioctl = cttyioctl, + .d_poll = cttypoll, }; #define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (p)->p_session->s_ttyvp : NULL) @@ -85,9 +77,9 @@ struct cdevsw ctty_cdevsw = { * locked to FREAD|FWRITE. */ static int -cttyopen(dev_t dev, int flag, int mode, struct thread *td) +cttyopen(struct dev_open_args *ap) { - struct proc *p = td->td_proc; + struct proc *p = curproc; struct vnode *ttyvp; int error; @@ -99,7 +91,7 @@ cttyopen(dev_t dev, int flag, int mode, struct thread *td) } else { vsetflags(ttyvp, VCTTYISOPEN); vn_lock(ttyvp, LK_EXCLUSIVE | LK_RETRY); - error = VOP_OPEN(ttyvp, FREAD|FWRITE, NOCRED, NULL); + error = VOP_OPEN(ttyvp, FREAD|FWRITE, ap->a_cred, NULL); if (error) vclrflags(ttyvp, VCTTYISOPEN); VOP_UNLOCK(ttyvp, 0); @@ -116,9 +108,9 @@ cttyopen(dev_t dev, int flag, int mode, struct thread *td) * locked to FREAD|FWRITE. */ static int -cttyclose(dev_t dev, int fflag, int devtype, struct thread *td) +cttyclose(struct dev_close_args *ap) { - struct proc *p = td->td_proc; + struct proc *p = curproc; struct vnode *ttyvp; int error; @@ -151,13 +143,9 @@ cttyclose(dev_t dev, int fflag, int devtype, struct thread *td) * so use vget() instead of VOP_LOCK. */ static int -cttyread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +cttyread(struct dev_read_args *ap) { - struct thread *td = uio->uio_td; - struct proc *p = td->td_proc; + struct proc *p = curproc; struct vnode *ttyvp; int error; @@ -166,7 +154,7 @@ cttyread(dev, uio, flag) if (ttyvp == NULL) return (EIO); if ((error = vget(ttyvp, LK_EXCLUSIVE | LK_RETRY)) == 0) { - error = VOP_READ(ttyvp, uio, flag, NOCRED); + error = VOP_READ(ttyvp, ap->a_uio, ap->a_ioflag, NOCRED); vput(ttyvp); } return (error); @@ -179,13 +167,9 @@ cttyread(dev, uio, flag) * so use vget() instead of VOP_LOCK. */ static int -cttywrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +cttywrite(struct dev_write_args *ap) { - struct thread *td = uio->uio_td; - struct proc *p = td->td_proc; + struct proc *p = curproc; struct vnode *ttyvp; int error; @@ -194,7 +178,7 @@ cttywrite(dev, uio, flag) if (ttyvp == NULL) return (EIO); if ((error = vget(ttyvp, LK_EXCLUSIVE | LK_RETRY)) == 0) { - error = VOP_WRITE(ttyvp, uio, flag, NOCRED); + error = VOP_WRITE(ttyvp, ap->a_uio, ap->a_ioflag, NOCRED); vput(ttyvp); } return (error); @@ -202,54 +186,57 @@ cttywrite(dev, uio, flag) /*ARGSUSED*/ static int -cttyioctl(dev, cmd, addr, flag, td) - dev_t dev; - u_long cmd; - caddr_t addr; - int flag; - struct thread *td; +cttyioctl(struct dev_ioctl_args *ap) { struct vnode *ttyvp; - struct proc *p = td->td_proc; + struct proc *p = curproc; KKASSERT(p); ttyvp = cttyvp(p); if (ttyvp == NULL) return (EIO); - if (cmd == TIOCSCTTY) /* don't allow controlling tty to be set */ - return EINVAL; /* to controlling tty -- infinite recursion */ - if (cmd == TIOCNOTTY) { + /* + * Don't allow controlling tty to be set to the controlling tty + * (infinite recursion). + */ + if (ap->a_cmd == TIOCSCTTY) + return EINVAL; + if (ap->a_cmd == TIOCNOTTY) { if (!SESS_LEADER(p)) { p->p_flag &= ~P_CONTROLT; return (0); - } else + } else { return (EINVAL); + } } - return (VOP_IOCTL(ttyvp, cmd, addr, flag, NOCRED)); + return (VOP_IOCTL(ttyvp, ap->a_cmd, ap->a_data, ap->a_fflag, ap->a_cred)); } /*ARGSUSED*/ static int -cttypoll(dev_t dev, int events, struct thread *td) +cttypoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct vnode *ttyvp; - struct proc *p = td->td_proc; + struct proc *p = curproc; KKASSERT(p); ttyvp = cttyvp(p); + /* + * try operation to get EOF/failure + */ if (ttyvp == NULL) - /* try operation to get EOF/failure */ - return (seltrue(dev, events, td)); - return (VOP_POLL(ttyvp, events, p->p_ucred)); + ap->a_events = seltrue(dev, ap->a_events); + else + ap->a_events = VOP_POLL(ttyvp, ap->a_events, p->p_ucred); + return(0); } -static void ctty_drvinit (void *unused); static void -ctty_drvinit(unused) - void *unused; +ctty_drvinit(void *unused __unused) { - cdevsw_add(&ctty_cdevsw, 0, 0); - make_dev(&ctty_cdevsw, 0, 0, 0, 0666, "tty"); + dev_ops_add(&ctty_ops, 0, 0); + make_dev(&ctty_ops, 0, 0, 0, 0666, "tty"); } SYSINIT(cttydev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,ctty_drvinit,NULL) diff --git a/sys/kern/vfs_sync.c b/sys/kern/vfs_sync.c index 65db8f793a..a637a5d003 100644 --- a/sys/kern/vfs_sync.c +++ b/sys/kern/vfs_sync.c @@ -37,7 +37,7 @@ * * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 * $FreeBSD: src/sys/kern/vfs_subr.c,v 1.249.2.30 2003/04/04 20:35:57 tegge Exp $ - * $DragonFly: src/sys/kern/vfs_sync.c,v 1.11 2006/07/18 22:22:12 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_sync.c,v 1.12 2006/07/28 02:17:40 dillon Exp $ */ /* @@ -296,14 +296,11 @@ speedup_syncer(void) /* * Routine to create and manage a filesystem syncer vnode. */ -#define sync_close ((int (*) (struct vop_close_args *))nullop) -static int sync_fsync (struct vop_fsync_args *); -static int sync_inactive (struct vop_inactive_args *); -static int sync_reclaim (struct vop_reclaim_args *); -#define sync_lock ((int (*) (struct vop_lock_args *))vop_stdlock) -#define sync_unlock ((int (*) (struct vop_unlock_args *))vop_stdunlock) -static int sync_print (struct vop_print_args *); -#define sync_islocked ((int(*) (struct vop_islocked_args *))vop_stdislocked) +static int sync_close(struct vop_close_args *); +static int sync_fsync(struct vop_fsync_args *); +static int sync_inactive(struct vop_inactive_args *); +static int sync_reclaim (struct vop_reclaim_args *); +static int sync_print(struct vop_print_args *); static struct vop_ops sync_vnode_vops = { .vop_default = vop_eopnotsupp, @@ -311,10 +308,10 @@ static struct vop_ops sync_vnode_vops = { .vop_fsync = sync_fsync, .vop_inactive = sync_inactive, .vop_reclaim = sync_reclaim, - .vop_lock = sync_lock, - .vop_unlock = sync_unlock, + .vop_lock = vop_stdlock, + .vop_unlock = vop_stdunlock, .vop_print = sync_print, - .vop_islocked = sync_islocked + .vop_islocked = vop_stdislocked }; static struct vop_ops *sync_vnode_vops_p = &sync_vnode_vops; @@ -365,6 +362,12 @@ vfs_allocate_syncvnode(struct mount *mp) return (0); } +static int +sync_close(struct vop_close_args *ap) +{ + return (0); +} + /* * Do a lazy sync of the filesystem. * diff --git a/sys/kern/vfs_vopops.c b/sys/kern/vfs_vopops.c index dfc225518a..88effa3b01 100644 --- a/sys/kern/vfs_vopops.c +++ b/sys/kern/vfs_vopops.c @@ -32,7 +32,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.30 2006/07/20 20:16:24 dillon Exp $ + * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.31 2006/07/28 02:17:40 dillon Exp $ */ #include @@ -76,7 +76,6 @@ #include #define VDESCNAME(name) __CONCAT(__CONCAT(vop_,name),_desc) -#define VARGSSTRUCT(name) struct __CONCAT(__CONCAT(vop_,name),_args) #define VNODEOP_DESC_INIT(name) \ struct syslink_desc VDESCNAME(name) = { \ diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 5194a802f2..b21b257ca1 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -38,7 +38,7 @@ * @(#)bpf.c 8.2 (Berkeley) 3/28/94 * * $FreeBSD: src/sys/net/bpf.c,v 1.59.2.12 2002/04/14 21:41:48 luigi Exp $ - * $DragonFly: src/sys/net/bpf.c,v 1.30 2006/06/13 08:12:03 dillon Exp $ + * $DragonFly: src/sys/net/bpf.c,v 1.31 2006/07/28 02:17:40 dillon Exp $ */ #include "use_bpf.h" @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -117,23 +118,14 @@ static d_ioctl_t bpfioctl; static d_poll_t bpfpoll; #define CDEV_MAJOR 23 -static struct cdevsw bpf_cdevsw = { - /* name */ "bpf", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ bpfopen, - /* close */ bpfclose, - /* read */ bpfread, - /* write */ bpfwrite, - /* ioctl */ bpfioctl, - /* poll */ bpfpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops bpf_ops = { + { "bpf", CDEV_MAJOR, 0 }, + .d_open = bpfopen, + .d_close = bpfclose, + .d_read = bpfread, + .d_write = bpfwrite, + .d_ioctl = bpfioctl, + .d_poll = bpfpoll, }; @@ -301,14 +293,12 @@ bpf_detachd(struct bpf_d *d) */ /* ARGSUSED */ static int -bpfopen(dev_t dev, int flags, int fmt, struct thread *td) +bpfopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct bpf_d *d; - struct proc *p = td->td_proc; - KKASSERT(p != NULL); - - if (p->p_ucred->cr_prison) + if (ap->a_cred->cr_prison) return(EPERM); d = dev->si_drv1; @@ -318,7 +308,7 @@ bpfopen(dev_t dev, int flags, int fmt, struct thread *td) */ if (d != NULL) return(EBUSY); - make_dev(&bpf_cdevsw, minor(dev), 0, 0, 0600, "bpf%d", lminor(dev)); + make_dev(&bpf_ops, minor(dev), 0, 0, 0600, "bpf%d", lminor(dev)); MALLOC(d, struct bpf_d *, sizeof *d, M_BPF, M_WAITOK | M_ZERO); dev->si_drv1 = d; d->bd_bufsize = bpf_bufsize; @@ -334,8 +324,9 @@ bpfopen(dev_t dev, int flags, int fmt, struct thread *td) */ /* ARGSUSED */ static int -bpfclose(dev_t dev, int flags, int fmt, struct thread *td) +bpfclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct bpf_d *d = dev->si_drv1; funsetown(d->bd_sigio); @@ -368,8 +359,9 @@ bpfclose(dev_t dev, int flags, int fmt, struct thread *td) * bpfread - read next chunk of packets from buffers */ static int -bpfread(dev_t dev, struct uio *uio, int ioflag) +bpfread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct bpf_d *d = dev->si_drv1; int timed_out; int error; @@ -378,7 +370,7 @@ bpfread(dev_t dev, struct uio *uio, int ioflag) * Restrict application to use a buffer the same size as * as kernel buffers. */ - if (uio->uio_resid != d->bd_bufsize) + if (ap->a_uio->uio_resid != d->bd_bufsize) return(EINVAL); crit_enter(); @@ -413,7 +405,7 @@ bpfread(dev_t dev, struct uio *uio, int ioflag) return(ENXIO); } - if (ioflag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { crit_exit(); return(EWOULDBLOCK); } @@ -454,7 +446,7 @@ bpfread(dev_t dev, struct uio *uio, int ioflag) * We know the entire buffer is transferred since * we checked above that the read buffer is bpf_bufsize bytes. */ - error = uiomove(d->bd_hbuf, d->bd_hlen, uio); + error = uiomove(d->bd_hbuf, d->bd_hlen, ap->a_uio); crit_enter(); d->bd_fbuf = d->bd_hbuf; @@ -502,8 +494,9 @@ bpf_timed_out(void *arg) } static int -bpfwrite(dev_t dev, struct uio *uio, int ioflag) +bpfwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; struct bpf_d *d = dev->si_drv1; struct ifnet *ifp; struct mbuf *m; @@ -516,10 +509,11 @@ bpfwrite(dev_t dev, struct uio *uio, int ioflag) ifp = d->bd_bif->bif_ifp; - if (uio->uio_resid == 0) + if (ap->a_uio->uio_resid == 0) return(0); - error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, &m, &dst, &datlen); + error = bpf_movein(ap->a_uio, (int)d->bd_bif->bif_dlt, &m, + &dst, &datlen); if (error) return(error); @@ -582,8 +576,9 @@ reset_d(struct bpf_d *d) */ /* ARGSUSED */ static int -bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) +bpfioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct bpf_d *d = dev->si_drv1; int error = 0; @@ -593,8 +588,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) d->bd_state = BPF_IDLE; crit_exit(); - switch (cmd) { - + switch (ap->a_cmd) { default: error = EINVAL; break; @@ -612,7 +606,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) n += d->bd_hlen; crit_exit(); - *(int *)addr = n; + *(int *)ap->a_data = n; break; } @@ -625,8 +619,8 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) else { ifp = d->bd_bif->bif_ifp; lwkt_serialize_enter(ifp->if_serializer); - error = ifp->if_ioctl(ifp, cmd, addr, - td->td_proc->p_ucred); + error = ifp->if_ioctl(ifp, ap->a_cmd, + ap->a_data, ap->a_cred); lwkt_serialize_exit(ifp->if_serializer); } break; @@ -636,7 +630,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) * Get buffer len [for read()]. */ case BIOCGBLEN: - *(u_int *)addr = d->bd_bufsize; + *(u_int *)ap->a_data = d->bd_bufsize; break; /* @@ -646,12 +640,12 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) if (d->bd_bif != 0) error = EINVAL; else { - u_int size = *(u_int *)addr; + u_int size = *(u_int *)ap->a_data; if (size > bpf_maxbufsize) - *(u_int *)addr = size = bpf_maxbufsize; + *(u_int *)ap->a_data = size = bpf_maxbufsize; else if (size < BPF_MINBUFSIZE) - *(u_int *)addr = size = BPF_MINBUFSIZE; + *(u_int *)ap->a_data = size = BPF_MINBUFSIZE; d->bd_bufsize = size; } break; @@ -660,7 +654,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) * Set link layer read filter. */ case BIOCSETF: - error = bpf_setf(d, (struct bpf_program *)addr); + error = bpf_setf(d, (struct bpf_program *)ap->a_data); break; /* @@ -699,7 +693,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) if (d->bd_bif == NULL) error = EINVAL; else - *(u_int *)addr = d->bd_bif->bif_dlt; + *(u_int *)ap->a_data = d->bd_bif->bif_dlt; break; /* @@ -709,7 +703,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) if (d->bd_bif == NULL) error = EINVAL; else - error = bpf_getdltlist(d, (struct bpf_dltlist *)addr); + error = bpf_getdltlist(d, (struct bpf_dltlist *)ap->a_data); break; /* @@ -719,7 +713,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) if (d->bd_bif == NULL) error = EINVAL; else - error = bpf_setdlt(d, *(u_int *)addr); + error = bpf_setdlt(d, *(u_int *)ap->a_data); break; /* @@ -730,7 +724,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) error = EINVAL; } else { struct ifnet *const ifp = d->bd_bif->bif_ifp; - struct ifreq *const ifr = (struct ifreq *)addr; + struct ifreq *const ifr = (struct ifreq *)ap->a_data; strlcpy(ifr->ifr_name, ifp->if_xname, sizeof ifr->ifr_name); @@ -741,7 +735,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) * Set interface. */ case BIOCSETIF: - error = bpf_setif(d, (struct ifreq *)addr); + error = bpf_setif(d, (struct ifreq *)ap->a_data); break; /* @@ -749,7 +743,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) */ case BIOCSRTIMEOUT: { - struct timeval *tv = (struct timeval *)addr; + struct timeval *tv = (struct timeval *)ap->a_data; /* * Subtract 1 tick from tvtohz() since this isn't @@ -765,7 +759,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) */ case BIOCGRTIMEOUT: { - struct timeval *tv = (struct timeval *)addr; + struct timeval *tv = (struct timeval *)ap->a_data; tv->tv_sec = d->bd_rtout / hz; tv->tv_usec = (d->bd_rtout % hz) * tick; @@ -777,7 +771,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) */ case BIOCGSTATS: { - struct bpf_stat *bs = (struct bpf_stat *)addr; + struct bpf_stat *bs = (struct bpf_stat *)ap->a_data; bs->bs_recv = d->bd_rcount; bs->bs_drop = d->bd_dcount; @@ -788,12 +782,12 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) * Set immediate mode. */ case BIOCIMMEDIATE: - d->bd_immediate = *(u_int *)addr; + d->bd_immediate = *(u_int *)ap->a_data; break; case BIOCVERSION: { - struct bpf_version *bv = (struct bpf_version *)addr; + struct bpf_version *bv = (struct bpf_version *)ap->a_data; bv->bv_major = BPF_MAJOR_VERSION; bv->bv_minor = BPF_MINOR_VERSION; @@ -804,57 +798,57 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) * Get "header already complete" flag */ case BIOCGHDRCMPLT: - *(u_int *)addr = d->bd_hdrcmplt; + *(u_int *)ap->a_data = d->bd_hdrcmplt; break; /* * Set "header already complete" flag */ case BIOCSHDRCMPLT: - d->bd_hdrcmplt = *(u_int *)addr ? 1 : 0; + d->bd_hdrcmplt = *(u_int *)ap->a_data ? 1 : 0; break; /* * Get "see sent packets" flag */ case BIOCGSEESENT: - *(u_int *)addr = d->bd_seesent; + *(u_int *)ap->a_data = d->bd_seesent; break; /* * Set "see sent packets" flag */ case BIOCSSEESENT: - d->bd_seesent = *(u_int *)addr; + d->bd_seesent = *(u_int *)ap->a_data; break; case FIOASYNC: /* Send signal on receive packets */ - d->bd_async = *(int *)addr; + d->bd_async = *(int *)ap->a_data; break; case FIOSETOWN: - error = fsetown(*(int *)addr, &d->bd_sigio); + error = fsetown(*(int *)ap->a_data, &d->bd_sigio); break; case FIOGETOWN: - *(int *)addr = fgetown(d->bd_sigio); + *(int *)ap->a_data = fgetown(d->bd_sigio); break; /* This is deprecated, FIOSETOWN should be used instead. */ case TIOCSPGRP: - error = fsetown(-(*(int *)addr), &d->bd_sigio); + error = fsetown(-(*(int *)ap->a_data), &d->bd_sigio); break; /* This is deprecated, FIOGETOWN should be used instead. */ case TIOCGPGRP: - *(int *)addr = -fgetown(d->bd_sigio); + *(int *)ap->a_data = -fgetown(d->bd_sigio); break; case BIOCSRSIG: /* Set receive signal */ { u_int sig; - sig = *(u_int *)addr; + sig = *(u_int *)ap->a_data; if (sig >= NSIG) error = EINVAL; @@ -863,7 +857,7 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) break; } case BIOCGRSIG: - *(u_int *)addr = d->bd_sig; + *(u_int *)ap->a_data = d->bd_sig; break; } return(error); @@ -981,8 +975,9 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr) * Otherwise, return false but make a note that a selwakeup() must be done. */ int -bpfpoll(dev_t dev, int events, struct thread *td) +bpfpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct bpf_d *d; int revents; @@ -990,9 +985,9 @@ bpfpoll(dev_t dev, int events, struct thread *td) if (d->bd_bif == NULL) return(ENXIO); - revents = events & (POLLOUT | POLLWRNORM); + revents = ap->a_events & (POLLOUT | POLLWRNORM); crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { /* * An imitation of the FIONREAD ioctl code. * XXX not quite. An exact imitation: @@ -1002,9 +997,9 @@ bpfpoll(dev_t dev, int events, struct thread *td) if (d->bd_hlen != 0 || ((d->bd_immediate || d->bd_state == BPF_TIMED_OUT) && d->bd_slen != 0)) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else { - selrecord(td, &d->bd_sel); + selrecord(curthread, &d->bd_sel); /* Start the read timeout if necessary. */ if (d->bd_rtout > 0 && d->bd_state == BPF_IDLE) { callout_reset(&d->bd_callout, d->bd_rtout, @@ -1014,7 +1009,8 @@ bpfpoll(dev_t dev, int events, struct thread *td) } } crit_exit(); - return(revents); + ap->a_events = revents; + return(0); } /* @@ -1393,7 +1389,7 @@ bpf_setdlt(struct bpf_d *d, u_int dlt) static void bpf_drvinit(void *unused) { - cdevsw_add(&bpf_cdevsw, 0, 0); + dev_ops_add(&bpf_ops, 0, 0); } SYSINIT(bpfdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bpf_drvinit,NULL) diff --git a/sys/net/i4b/driver/i4b_ctl.c b/sys/net/i4b/driver/i4b_ctl.c index 3b55747d66..14c3015553 100644 --- a/sys/net/i4b/driver/i4b_ctl.c +++ b/sys/net/i4b/driver/i4b_ctl.c @@ -30,7 +30,7 @@ * $Id: i4b_ctl.c,v 1.37 2000/05/31 08:04:43 hm Exp $ * * $FreeBSD: src/sys/i4b/driver/i4b_ctl.c,v 1.10.2.3 2001/08/12 16:22:48 hm Exp $ - * $DragonFly: src/sys/net/i4b/driver/i4b_ctl.c,v 1.11 2005/06/14 21:19:18 joerg Exp $ + * $DragonFly: src/sys/net/i4b/driver/i4b_ctl.c,v 1.12 2006/07/28 02:17:40 dillon Exp $ * * last edit-date: [Sat Aug 11 18:06:38 2001] * @@ -46,11 +46,11 @@ #include -#include - #include #include #include +#include +#include #include #include @@ -72,23 +72,12 @@ static d_poll_t i4bctlpoll; #define CDEV_MAJOR 55 -static struct cdevsw i4bctl_cdevsw = { - /* name */ "i4bctl", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ i4bctlopen, - /* close */ i4bctlclose, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ i4bctlioctl, - /* poll */ POLLFIELD, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops i4bctl_ops = { + { "i4bctl", CDEV_MAJOR, 0 }, + .d_open = i4bctlopen, + .d_close = i4bctlclose, + .d_ioctl = i4bctlioctl, + .d_poll = POLLFIELD, }; static void i4bctlattach(void *); @@ -102,7 +91,7 @@ PSEUDO_SET(i4bctlattach, i4b_i4bctldrv); static void i4bctlinit(void *unused) { - cdevsw_add(&i4bctl_cdevsw, 0, 0); + dev_ops_add(&i4bctl_ops, 0, 0); } SYSINIT(i4bctldev, SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR, &i4bctlinit, NULL); @@ -122,16 +111,14 @@ i4bctlattach(void *dummy) * i4bctlopen - device driver open routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bctlopen(dev_t dev, int flag, int fmt, struct thread *td) +i4bctlopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; if(minor(dev)) return (ENXIO); - if(openflag) return (EBUSY); - openflag = 1; - return (0); } @@ -139,7 +126,7 @@ i4bctlopen(dev_t dev, int flag, int fmt, struct thread *td) * i4bctlclose - device driver close routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bctlclose(dev_t dev, int flag, int fmt, struct thread *td) +i4bctlclose(struct dev_close_args *ap) { openflag = 0; return (0); @@ -149,8 +136,9 @@ i4bctlclose(dev_t dev, int flag, int fmt, struct thread *td) * i4bctlioctl - device driver ioctl routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +i4bctlioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; #if DO_I4B_DEBUG ctl_debug_t *cdbg; int error = 0; @@ -162,10 +150,10 @@ i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if(minor(dev)) return(ENODEV); - switch(cmd) + switch(ap->a_cmd) { case I4B_CTL_GET_DEBUG: - cdbg = (ctl_debug_t *)data; + cdbg = (ctl_debug_t *)ap->a_data; cdbg->l1 = i4b_l1_debug; cdbg->l2 = i4b_l2_debug; cdbg->l3 = i4b_l3_debug; @@ -173,7 +161,7 @@ i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; case I4B_CTL_SET_DEBUG: - cdbg = (ctl_debug_t *)data; + cdbg = (ctl_debug_t *)ap->a_data; i4b_l1_debug = cdbg->l1; i4b_l2_debug = cdbg->l2; i4b_l3_debug = cdbg->l3; @@ -183,7 +171,7 @@ i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case I4B_CTL_GET_CHIPSTAT: { struct chipstat *cst; - cst = (struct chipstat *)data; + cst = (struct chipstat *)ap->a_data; (*ctrl_desc[cst->driver_unit].N_MGMT_COMMAND)(cst->driver_unit, CMR_GCST, cst); break; } @@ -191,7 +179,7 @@ i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) case I4B_CTL_CLR_CHIPSTAT: { struct chipstat *cst; - cst = (struct chipstat *)data; + cst = (struct chipstat *)ap->a_data; (*ctrl_desc[cst->driver_unit].N_MGMT_COMMAND)(cst->driver_unit, CMR_CCST, cst); break; } @@ -200,7 +188,7 @@ i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) { l2stat_t *l2s; l2_softc_t *sc; - l2s = (l2stat_t *)data; + l2s = (l2stat_t *)ap->a_data; if( l2s->unit < 0 || l2s->unit > MAXL1UNITS) { @@ -218,7 +206,7 @@ i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) { int *up; l2_softc_t *sc; - up = (int *)data; + up = (int *)ap->a_data; if( *up < 0 || *up > MAXL1UNITS) { @@ -244,7 +232,7 @@ i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) * i4bctlpoll - device driver poll routine *---------------------------------------------------------------------------*/ static int -i4bctlpoll (dev_t dev, int events, struct thread *td) +i4bctlpoll (struct dev_poll_args *ap) { return (ENODEV); } diff --git a/sys/net/i4b/driver/i4b_rbch.c b/sys/net/i4b/driver/i4b_rbch.c index f06ff49257..b731e32189 100644 --- a/sys/net/i4b/driver/i4b_rbch.c +++ b/sys/net/i4b/driver/i4b_rbch.c @@ -28,7 +28,7 @@ * --------------------------------------------------- * * $FreeBSD: src/sys/i4b/driver/i4b_rbch.c,v 1.10.2.3 2001/08/12 16:22:48 hm Exp $ - * $DragonFly: src/sys/net/i4b/driver/i4b_rbch.c,v 1.19 2006/06/14 21:07:09 swildner Exp $ + * $DragonFly: src/sys/net/i4b/driver/i4b_rbch.c,v 1.20 2006/07/28 02:17:40 dillon Exp $ * * last edit-date: [Sat Aug 11 18:06:57 2001] * @@ -117,7 +117,7 @@ static void rbch_clrq(int unit); PDEVSTATIC d_open_t i4brbchopen; PDEVSTATIC d_close_t i4brbchclose; PDEVSTATIC d_read_t i4brbchread; -PDEVSTATIC d_read_t i4brbchwrite; +PDEVSTATIC d_write_t i4brbchwrite; PDEVSTATIC d_ioctl_t i4brbchioctl; PDEVSTATIC d_poll_t i4brbchpoll; @@ -125,23 +125,14 @@ PDEVSTATIC d_poll_t i4brbchpoll; #define CDEV_MAJOR 57 -static struct cdevsw i4brbch_cdevsw = { - /* name */ "i4brbch", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ i4brbchopen, - /* close */ i4brbchclose, - /* read */ i4brbchread, - /* write */ i4brbchwrite, - /* ioctl */ i4brbchioctl, - /* poll */ POLLFIELD, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops i4brbch_ops = { + { "i4brbch", CDEV_MAJOR, 0 }, + .d_open = i4brbchopen, + .d_close = i4brbchclose, + .d_read = i4brbchread, + .d_write = i4brbchwrite, + .d_ioctl = i4brbchioctl, + .d_poll = POLLFIELD, }; static void i4brbchattach(void *); @@ -157,7 +148,7 @@ PSEUDO_SET(i4brbchattach, i4b_rbch); static void i4brbchinit(void *unused) { - cdevsw_add(&i4brbch_cdevsw, 0, 0); + dev_ops_add(&i4brbch_ops, 0, 0); } SYSINIT(i4brbchdev, SI_SUB_DRIVERS, @@ -177,7 +168,7 @@ i4brbchattach(void *dummy) for(i=0; i < NI4BRBCH; i++) { - make_dev(&i4brbch_cdevsw, i, + make_dev(&i4brbch_ops, i, UID_ROOT, GID_WHEEL, 0600, "i4brbch%d", i); #if I4BRBCHACCT @@ -197,8 +188,9 @@ i4brbchattach(void *dummy) * open rbch device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4brbchopen(dev_t dev, int flag, int fmt, struct thread *td) +i4brbchopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); if(unit >= NI4BRBCH) @@ -222,8 +214,9 @@ i4brbchopen(dev_t dev, int flag, int fmt, struct thread *td) * close rbch device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4brbchclose(dev_t dev, int flag, int fmt, struct thread *td) +i4brbchclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); struct rbch_softc *sc = &rbch_softc[unit]; @@ -243,8 +236,10 @@ i4brbchclose(dev_t dev, int flag, int fmt, struct thread *td) * read from rbch device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4brbchread(dev_t dev, struct uio *uio, int ioflag) +i4brbchread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct mbuf *m; int error = 0; int unit = minor(dev); @@ -263,7 +258,7 @@ i4brbchread(dev_t dev, struct uio *uio, int ioflag) return(EIO); } - if((sc->sc_devstate & ST_NOBLOCK) || (ioflag & IO_NDELAY)) + if((sc->sc_devstate & ST_NOBLOCK) || (ap->a_ioflag & IO_NDELAY)) { if(!(sc->sc_devstate & ST_CONNECTED)) { CRIT_END; @@ -343,8 +338,10 @@ i4brbchread(dev_t dev, struct uio *uio, int ioflag) * write to rbch device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4brbchwrite(dev_t dev, struct uio * uio, int ioflag) +i4brbchwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct mbuf *m; int error = 0; int unit = minor(dev); @@ -362,7 +359,7 @@ i4brbchwrite(dev_t dev, struct uio * uio, int ioflag) return(EIO); } - if((sc->sc_devstate & ST_NOBLOCK) || (ioflag & IO_NDELAY)) + if((sc->sc_devstate & ST_NOBLOCK) || (ap->a_ioflag & IO_NDELAY)) { if(!(sc->sc_devstate & ST_CONNECTED)) { CRIT_END; @@ -461,16 +458,17 @@ i4brbchwrite(dev_t dev, struct uio * uio, int ioflag) * rbch device ioctl handlibg *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct thread *td) +i4brbchioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int error = 0; int unit = minor(dev); struct rbch_softc *sc = &rbch_softc[unit]; - switch(cmd) + switch(ap->a_cmd) { case FIOASYNC: /* Set async mode */ - if (*(int *)data) + if (*(int *)ap->a_data) { NDBGL4(L4_RBCHDBG, "unit %d, setting async mode", unit); } @@ -492,12 +490,12 @@ i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct thread * { size_t l; - for (l = 0; l < TELNO_MAX && ((char *)data)[l]; l++) + for (l = 0; l < TELNO_MAX && ((char *)ap->a_data)[l]; l++) ; if (l) { - NDBGL4(L4_RBCHDBG, "unit %d, attempting dialout to %s", unit, (char *)data); - i4b_l4_dialoutnumber(BDRV_RBCH, unit, l, (char *)data); + NDBGL4(L4_RBCHDBG, "unit %d, attempting dialout to %s", unit, (char *)ap->a_data); + i4b_l4_dialoutnumber(BDRV_RBCH, unit, l, (char *)ap->a_data); break; } /* fall through to SDTR */ @@ -512,20 +510,20 @@ i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct thread * break; case TIOCGETA: /* Get termios struct */ - *(struct termios *)data = sc->it_in; + *(struct termios *)ap->a_data = sc->it_in; break; case TIOCMGET: - *(int *)data = TIOCM_LE|TIOCM_DTR|TIOCM_RTS|TIOCM_CTS|TIOCM_DSR; + *(int *)ap->a_data = TIOCM_LE|TIOCM_DTR|TIOCM_RTS|TIOCM_CTS|TIOCM_DSR; if (sc->sc_devstate & ST_CONNECTED) - *(int *)data |= TIOCM_CD; + *(int *)ap->a_data |= TIOCM_CD; break; case I4B_RBCH_VR_REQ: { msg_vr_req_t *mvr; - mvr = (msg_vr_req_t *)data; + mvr = (msg_vr_req_t *)ap->a_data; mvr->version = VERSION; mvr->release = REL; @@ -534,7 +532,7 @@ i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct thread * } default: /* Unknown stuff */ - NDBGL4(L4_RBCHDBG, "unit %d, ioctl, unknown cmd %lx", unit, (u_long)cmd); + NDBGL4(L4_RBCHDBG, "unit %d, ioctl, unknown cmd %lx", unit, ap->a_cmd); error = EINVAL; break; } @@ -545,8 +543,9 @@ i4brbchioctl(dev_t dev, IOCTL_CMD_T cmd, caddr_t data, int flag, struct thread * * device driver poll *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4brbchpoll(dev_t dev, int events, struct thread *td) +i4brbchpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; int revents = 0; /* Events we found */ int unit = minor(dev); struct rbch_softc *sc = &rbch_softc[unit]; @@ -565,16 +564,16 @@ i4brbchpoll(dev_t dev, int events, struct thread *td) * transmit queue can take them */ - if((events & (POLLOUT|POLLWRNORM)) && + if((ap->a_events & (POLLOUT|POLLWRNORM)) && (sc->sc_devstate & ST_CONNECTED) && !IF_QFULL(isdn_linktab[unit]->tx_queue)) { - revents |= (events & (POLLOUT|POLLWRNORM)); + revents |= (ap->a_events & (POLLOUT|POLLWRNORM)); } /* ... while reads are OK if we have any data */ - if((events & (POLLIN|POLLRDNORM)) && + if((ap->a_events & (POLLIN|POLLRDNORM)) && (sc->sc_devstate & ST_CONNECTED)) { struct ifqueue *iqp; @@ -585,14 +584,15 @@ i4brbchpoll(dev_t dev, int events, struct thread *td) iqp = isdn_linktab[unit]->rx_queue; if(!IF_QEMPTY(iqp)) - revents |= (events & (POLLIN|POLLRDNORM)); + revents |= (ap->a_events & (POLLIN|POLLRDNORM)); } if(revents == 0) - selrecord(td, &sc->selp); + selrecord(curthread, &sc->selp); crit_exit(); - return(revents); + ap->a_events = revents; + return (0); } #if I4BRBCHACCT diff --git a/sys/net/i4b/driver/i4b_tel.c b/sys/net/i4b/driver/i4b_tel.c index 3027498203..8e4d3bd79c 100644 --- a/sys/net/i4b/driver/i4b_tel.c +++ b/sys/net/i4b/driver/i4b_tel.c @@ -28,7 +28,7 @@ * -------------------------------------------- * * $FreeBSD: src/sys/i4b/driver/i4b_tel.c,v 1.10.2.4 2001/12/16 15:12:57 hm Exp $ - * $DragonFly: src/sys/net/i4b/driver/i4b_tel.c,v 1.12 2005/06/15 11:56:03 joerg Exp $ + * $DragonFly: src/sys/net/i4b/driver/i4b_tel.c,v 1.13 2006/07/28 02:17:40 dillon Exp $ * * last edit-date: [Sat Aug 11 18:07:05 2001] * @@ -140,7 +140,7 @@ static u_char sinetab[]; PDEVSTATIC d_open_t i4btelopen; PDEVSTATIC d_close_t i4btelclose; PDEVSTATIC d_read_t i4btelread; -PDEVSTATIC d_read_t i4btelwrite; +PDEVSTATIC d_write_t i4btelwrite; PDEVSTATIC d_ioctl_t i4btelioctl; PDEVSTATIC d_poll_t i4btelpoll; @@ -148,23 +148,14 @@ PDEVSTATIC d_poll_t i4btelpoll; #define CDEV_MAJOR 56 -static struct cdevsw i4btel_cdevsw = { - /* name */ "i4btel", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ i4btelopen, - /* close */ i4btelclose, - /* read */ i4btelread, - /* write */ i4btelwrite, - /* ioctl */ i4btelioctl, - /* poll */ POLLFIELD, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops i4btel_ops = { + { "i4btel", CDEV_MAJOR, 0 }, + .d_open = i4btelopen, + .d_close = i4btelclose, + .d_read = i4btelread, + .d_write = i4btelwrite, + .d_ioctl = i4btelioctl, + .d_poll = POLLFIELD, }; PDEVSTATIC void i4btelinit(void *unused); @@ -182,7 +173,7 @@ PSEUDO_SET(i4btelattach, i4b_tel); PDEVSTATIC void i4btelinit(void *unused) { - cdevsw_add(&i4btel_cdevsw, 0, 0); + dev_ops_add(&i4btel_ops, 0, 0); } SYSINIT(i4bteldev, SI_SUB_DRIVERS, @@ -211,13 +202,13 @@ i4btelattach(void *dummy) switch(j) { case FUNCTEL: /* normal i4btel device */ - make_dev(&i4btel_cdevsw, i, + make_dev(&i4btel_ops, i, UID_ROOT, GID_WHEEL, 0600, "i4btel%d", i); break; case FUNCDIAL: /* i4bteld dialout device */ - make_dev(&i4btel_cdevsw, i+(1<a_head.a_dev; int unit = UNIT(dev); int func = FUNC(dev); @@ -260,8 +252,9 @@ i4btelopen(dev_t dev, int flag, int fmt, struct thread *td) * close tel device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btelclose(dev_t dev, int flag, int fmt, struct thread *td) +i4btelclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT(dev); int func = FUNC(dev); tel_sc_t *sc; @@ -302,8 +295,9 @@ i4btelclose(dev_t dev, int flag, int fmt, struct thread *td) * i4btelioctl - device driver ioctl routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btelioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +i4btelioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT(dev); int func = FUNC(dev); int error = 0; @@ -313,14 +307,14 @@ i4btelioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) if(func == FUNCTEL) { - switch(cmd) + switch(ap->a_cmd) { case I4B_TEL_GETAUDIOFMT: - *(int *)data = sc->audiofmt; + *(int *)ap->a_data = sc->audiofmt; break; case I4B_TEL_SETAUDIOFMT: - switch (*(int *)data) + switch (*(int *)ap->a_data) { case CVT_NONE: sc->rcvttab = 0; @@ -343,7 +337,7 @@ i4btelioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) break; } if(error == 0) - sc->audiofmt = *(int *)data; + sc->audiofmt = *(int *)ap->a_data; break; case I4B_TEL_EMPTYINPUTQUEUE: @@ -363,7 +357,7 @@ i4btelioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) { msg_vr_req_t *mvr; - mvr = (msg_vr_req_t *)data; + mvr = (msg_vr_req_t *)ap->a_data; mvr->version = VERSION; mvr->release = REL; @@ -374,7 +368,7 @@ i4btelioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) { struct i4b_tel_tones *tt; - tt = (struct i4b_tel_tones *)data; + tt = (struct i4b_tel_tones *)ap->a_data; crit_enter(); while ((sc->devstate & ST_TONE) && sc->tones.duration[sc->toneidx] != 0) { @@ -409,7 +403,7 @@ i4btelioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } else if(func == FUNCDIAL) { - switch(cmd) + switch(ap->a_cmd) { default: error = ENOTTY; @@ -423,8 +417,10 @@ i4btelioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) * read from tel device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btelread(dev_t dev, struct uio *uio, int ioflag) +i4btelread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int unit = UNIT(dev); int func = FUNC(dev); @@ -541,8 +537,10 @@ i4btelread(dev_t dev, struct uio *uio, int ioflag) * write to tel device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btelwrite(dev_t dev, struct uio * uio, int ioflag) +i4btelwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int unit = UNIT(dev); int func = FUNC(dev); struct mbuf *m; @@ -700,8 +698,9 @@ tel_tone(tel_sc_t *sc) * device driver poll *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btelpoll(dev_t dev, int events, struct thread *td) +i4btelpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; int revents = 0; /* Events we found */ int unit = UNIT(dev); int func = FUNC(dev); @@ -714,6 +713,7 @@ i4btelpoll(dev_t dev, int events, struct thread *td) { NDBGL4(L4_TELDBG, "i4btel%d, !ST_ISOPEN", unit); crit_exit(); + ap->a_events = 0; return(0); } @@ -724,55 +724,56 @@ i4btelpoll(dev_t dev, int events, struct thread *td) * transmit queue can take them */ - if((events & (POLLOUT|POLLWRNORM)) && + if((ap->a_events & (POLLOUT|POLLWRNORM)) && (sc->devstate & ST_CONNECTED) && (sc->isdn_linktab != NULL) && (!IF_QFULL(sc->isdn_linktab->tx_queue))) { NDBGL4(L4_TELDBG, "i4btel%d, POLLOUT", unit); - revents |= (events & (POLLOUT|POLLWRNORM)); + revents |= (ap->a_events & (POLLOUT|POLLWRNORM)); } /* ... while reads are OK if we have any data */ - if((events & (POLLIN|POLLRDNORM)) && + if((ap->a_events & (POLLIN|POLLRDNORM)) && (sc->devstate & ST_CONNECTED) && (sc->isdn_linktab != NULL) && (!IF_QEMPTY(sc->isdn_linktab->rx_queue))) { NDBGL4(L4_TELDBG, "i4btel%d, POLLIN", unit); - revents |= (events & (POLLIN|POLLRDNORM)); + revents |= (ap->a_events & (POLLIN|POLLRDNORM)); } if(revents == 0) { NDBGL4(L4_TELDBG, "i4btel%d, selrecord", unit); - selrecord(td, &sc->selp); + selrecord(curthread, &sc->selp); } } else if(func == FUNCDIAL) { - if(events & (POLLOUT|POLLWRNORM)) + if(ap->a_events & (POLLOUT|POLLWRNORM)) { NDBGL4(L4_TELDBG, "i4bteld%d, POLLOUT", unit); - revents |= (events & (POLLOUT|POLLWRNORM)); + revents |= (ap->a_events & (POLLOUT|POLLWRNORM)); } - if(events & (POLLIN|POLLRDNORM)) + if(ap->a_events & (POLLIN|POLLRDNORM)) { NDBGL4(L4_TELDBG, "i4bteld%d, POLLIN, result = %d", unit, sc->result); if(sc->result != 0) - revents |= (events & (POLLIN|POLLRDNORM)); + revents |= (ap->a_events & (POLLIN|POLLRDNORM)); } if(revents == 0) { NDBGL4(L4_TELDBG, "i4bteld%d, selrecord", unit); - selrecord(td, &sc->selp); + selrecord(curthread, &sc->selp); } } crit_exit(); - return(revents); + ap->a_events = revents; + return (0); } /*===========================================================================* diff --git a/sys/net/i4b/driver/i4b_trace.c b/sys/net/i4b/driver/i4b_trace.c index 327091ad53..7c6ce5610a 100644 --- a/sys/net/i4b/driver/i4b_trace.c +++ b/sys/net/i4b/driver/i4b_trace.c @@ -30,7 +30,7 @@ * last edit-date: [Sat Aug 11 18:07:15 2001] * * $FreeBSD: src/sys/i4b/driver/i4b_trace.c,v 1.9.2.3 2001/08/12 16:22:48 hm Exp $ - * $DragonFly: src/sys/net/i4b/driver/i4b_trace.c,v 1.14 2006/01/14 11:05:18 swildner Exp $ + * $DragonFly: src/sys/net/i4b/driver/i4b_trace.c,v 1.15 2006/07/28 02:17:40 dillon Exp $ * *---------------------------------------------------------------------------*/ @@ -79,23 +79,13 @@ static d_poll_t i4btrcpoll; #define CDEV_MAJOR 59 -static struct cdevsw i4btrc_cdevsw = { - /* name */ "i4btrc", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ i4btrcopen, - /* close */ i4btrcclose, - /* read */ i4btrcread, - /* write */ nowrite, - /* ioctl */ i4btrcioctl, - /* poll */ POLLFIELD, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops i4btrc_ops = { + { "i4btrc", CDEV_MAJOR, 0 }, + .d_open = i4btrcopen, + .d_close = i4btrcclose, + .d_read = i4btrcread, + .d_ioctl = i4btrcioctl, + .d_poll = POLLFIELD, }; /*---------------------------------------------------------------------------* @@ -104,7 +94,7 @@ static struct cdevsw i4btrc_cdevsw = { static void i4btrcinit(void *unused) { - cdevsw_add(&i4btrc_cdevsw, 0, 0); + dev_ops_add(&i4btrc_ops, 0, 0); } SYSINIT(i4btrcdev, SI_SUB_DRIVERS, @@ -128,7 +118,7 @@ i4btrcattach(void *dummy) for(i=0; i < NI4BTRC; i++) { - make_dev(&i4btrc_cdevsw, i, + make_dev(&i4btrc_ops, i, UID_ROOT, GID_WHEEL, 0600, "i4btrc%d", i); trace_queue[i].ifq_maxlen = IFQ_MAXLEN; @@ -242,8 +232,9 @@ get_trace_data_from_l1(i4b_trace_hdr_t *hdr, int len, char *buf) * open trace device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btrcopen(dev_t dev, int flag, int fmt, struct thread *td) +i4btrcopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); if(unit >= NI4BTRC) @@ -268,8 +259,9 @@ i4btrcopen(dev_t dev, int flag, int fmt, struct thread *td) * close trace device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btrcclose(dev_t dev, int flag, int fmt, struct thread *td) +i4btrcclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = minor(dev); int i; int cno = -1; @@ -314,8 +306,10 @@ i4btrcclose(dev_t dev, int flag, int fmt, struct thread *td) * read from trace device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btrcread(dev_t dev, struct uio * uio, int ioflag) +i4btrcread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct mbuf *m; int error = 0; int unit = minor(dev); @@ -357,7 +351,7 @@ i4btrcread(dev_t dev, struct uio * uio, int ioflag) * poll device *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btrcpoll(dev_t dev, int events, struct thread *td) +i4btrcpoll(struct dev_poll_args *ap) { return(ENODEV); } @@ -366,8 +360,9 @@ i4btrcpoll(dev_t dev, int events, struct thread *td) * device driver ioctl routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4btrcioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +i4btrcioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; int error = 0; int unit = minor(dev); i4b_trace_setupa_t *tsa; @@ -386,16 +381,16 @@ i4btrcioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } } - switch(cmd) + switch(ap->a_cmd) { case I4B_TRC_SET: if(cno < 0) return ENOTTY; - (*ctrl_desc[cno].N_MGMT_COMMAND)(ctrl_desc[cno].unit, CMR_SETTRACE, (void *)*(unsigned int *)data); + (*ctrl_desc[cno].N_MGMT_COMMAND)(ctrl_desc[cno].unit, CMR_SETTRACE, (void *)*(unsigned int *)ap->a_data); break; case I4B_TRC_SETA: - tsa = (i4b_trace_setupa_t *)data; + tsa = (i4b_trace_setupa_t *)ap->a_data; if(tsa->rxunit >= 0 && tsa->rxunit < NI4BTRC) rxunit = tsa->rxunit; diff --git a/sys/net/i4b/layer4/i4b_i4bdrv.c b/sys/net/i4b/layer4/i4b_i4bdrv.c index 4b76117f10..8c757f4d72 100644 --- a/sys/net/i4b/layer4/i4b_i4bdrv.c +++ b/sys/net/i4b/layer4/i4b_i4bdrv.c @@ -28,7 +28,7 @@ * -------------------------------------------- * * $FreeBSD: src/sys/i4b/layer4/i4b_i4bdrv.c,v 1.11.2.5 2001/12/16 15:12:59 hm Exp $ - * $DragonFly: src/sys/net/i4b/layer4/i4b_i4bdrv.c,v 1.14 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/net/i4b/layer4/i4b_i4bdrv.c,v 1.15 2006/07/28 02:17:40 dillon Exp $ * * last edit-date: [Sat Aug 11 18:08:10 2001] * @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -93,23 +94,13 @@ PDEVSTATIC d_poll_t i4bpoll; #define CDEV_MAJOR 60 -static struct cdevsw i4b_cdevsw = { - /* name */ "i4b", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ i4bopen, - /* close */ i4bclose, - /* read */ i4bread, - /* write */ nowrite, - /* ioctl */ i4bioctl, - /* poll */ POLLFIELD, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops i4b_ops = { + { "i4b", CDEV_MAJOR, 0 }, + .d_open = i4bopen, + .d_close = i4bclose, + .d_read = i4bread, + .d_ioctl = i4bioctl, + .d_poll = POLLFIELD, }; PDEVSTATIC void i4battach(void *); @@ -118,7 +109,7 @@ PSEUDO_SET(i4battach, i4b_i4bdrv); static void i4b_drvinit(void *unused) { - cdevsw_add(&i4b_cdevsw, 0, 0); + dev_ops_add(&i4b_ops, 0, 0); } SYSINIT(i4bdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,i4b_drvinit,NULL) @@ -133,21 +124,21 @@ i4battach(void *dummy) i4b_rdqueue.ifq_maxlen = IFQ_MAXLEN; - make_dev(&i4b_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "i4b"); + make_dev(&i4b_ops, 0, UID_ROOT, GID_WHEEL, 0600, "i4b"); } /*---------------------------------------------------------------------------* * i4bopen - device driver open routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bopen(dev_t dev, int flag, int fmt, struct thread *td) +i4bopen(struct dev_open_args *ap) { - if(minor(dev)) - return(ENXIO); + dev_t dev = ap->a_head.a_dev; - if(openflag) + if (minor(dev)) + return(ENXIO); + if (openflag) return(EBUSY); - crit_enter(); openflag = 1; i4b_l4_daemon_attached(); @@ -160,7 +151,7 @@ i4bopen(dev_t dev, int flag, int fmt, struct thread *td) * i4bclose - device driver close routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bclose(dev_t dev, int flag, int fmt, struct thread *td) +i4bclose(struct dev_close_args *ap) { crit_enter(); openflag = 0; @@ -174,12 +165,13 @@ i4bclose(dev_t dev, int flag, int fmt, struct thread *td) * i4bread - device driver read routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bread(dev_t dev, struct uio *uio, int ioflag) +i4bread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; struct mbuf *m; int error = 0; - if(minor(dev)) + if (minor(dev)) return(ENODEV); crit_enter(); @@ -198,7 +190,7 @@ i4bread(dev_t dev, struct uio *uio, int ioflag) crit_exit(); if(m && m->m_len) - error = uiomove(m->m_data, m->m_len, uio); + error = uiomove(m->m_data, m->m_len, ap->a_uio); else error = EIO; @@ -212,15 +204,17 @@ i4bread(dev_t dev, struct uio *uio, int ioflag) * i4bioctl - device driver ioctl routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +i4bioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; call_desc_t *cd; int error = 0; if(minor(dev)) return(ENODEV); - switch(cmd) + switch(ap->a_cmd) { /* cdid request, reserve cd and return cdid */ @@ -770,27 +764,31 @@ diag_done: * i4bpoll - device driver poll routine *---------------------------------------------------------------------------*/ PDEVSTATIC int -i4bpoll(dev_t dev, int events, struct thread *td) +i4bpoll(struct dev_poll_args *ap) { - if(minor(dev)) + dev_t dev = ap->a_head.a_dev; + int revents; + + if (minor(dev)) return(ENODEV); - if((events & POLLIN) || (events & POLLRDNORM)) - { - if(!IF_QEMPTY(&i4b_rdqueue)) - return(1); + revents = 0; + if (ap->a_events & (POLLIN|POLLRDNORM)) { crit_enter(); - selrecord(td, &select_rd_info); - selflag = 1; + if (!IF_QEMPTY(&i4b_rdqueue)) { + revents |= POLLIN | POLLRDNORM; + } else { + selrecord(curthread, &select_rd_info); + selflag = 1; + } crit_exit(); return(0); } - else if((events & POLLOUT) || (events & POLLWRNORM)) - { - return(1); + if (ap->a_events & (POLLOUT|POLLWRNORM)) { + revents |= ap->a_events & (POLLOUT | POLLWRNORM); } - + ap->a_events = revents; return(0); } diff --git a/sys/net/pf/pf_ioctl.c b/sys/net/pf/pf_ioctl.c index 341b0fb6ab..0b0905b6dc 100644 --- a/sys/net/pf/pf_ioctl.c +++ b/sys/net/pf/pf_ioctl.c @@ -1,6 +1,6 @@ /* $FreeBSD: src/sys/contrib/pf/net/pf_ioctl.c,v 1.12 2004/08/12 14:15:42 mlaier Exp $ */ /* $OpenBSD: pf_ioctl.c,v 1.112.2.2 2004/07/24 18:28:12 brad Exp $ */ -/* $DragonFly: src/sys/net/pf/pf_ioctl.c,v 1.5 2005/06/15 16:32:58 joerg Exp $ */ +/* $DragonFly: src/sys/net/pf/pf_ioctl.c,v 1.6 2006/07/28 02:17:40 dillon Exp $ */ /* * Copyright (c) 2004 The DragonFly Project. All rights reserved. @@ -45,6 +45,8 @@ #include #include +#include +#include #include #include #include @@ -55,7 +57,6 @@ #include #include #include -#include #include #include @@ -86,18 +87,16 @@ #include #include + void init_zone_var(void); void cleanup_pf_zone(void); int pfattach(void); -int pfopen(dev_t, int, int, struct thread *); -int pfclose(dev_t, int, int, struct thread *); struct pf_pool *pf_get_pool(char *, char *, u_int32_t, u_int8_t, u_int32_t, u_int8_t, u_int8_t, u_int8_t); int pf_get_ruleset_number(u_int8_t); void pf_init_ruleset(struct pf_ruleset *); void pf_mv_pool(struct pf_palist *, struct pf_palist *); void pf_empty_pool(struct pf_palist *); -int pfioctl(dev_t, u_long, caddr_t, int, struct thread *); #ifdef ALTQ int pf_begin_altq(u_int32_t *); int pf_rollback_altq(u_int32_t); @@ -156,12 +155,15 @@ static int shutdown_pf(void); static int pf_load(void); static int pf_unload(void); -static struct cdevsw pf_cdevsw = { /* XXX convert to port model */ - .d_name = PF_NAME, - .d_maj = 73, /* XXX */ - .old_open = pfopen, - .old_close = pfclose, - .old_ioctl = pfioctl +d_open_t pfopen; +d_close_t pfclose; +d_ioctl_t pfioctl; + +static struct dev_ops pf_ops = { /* XXX convert to port model */ + { PF_NAME, 73, 0 }, + .d_open = pfopen, + .d_close = pfclose, + .d_ioctl = pfioctl }; static volatile int pf_pfil_hooked = 0; @@ -287,16 +289,18 @@ pfattach(void) } int -pfopen(dev_t dev, int flags, int devtype, struct thread *td) +pfopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; if (minor(dev) >= 1) return (ENXIO); return (0); } int -pfclose(dev_t dev, int flags, int fmt, struct thread *td) +pfclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; if (minor(dev) >= 1) return (ENXIO); return (0); @@ -849,8 +853,10 @@ pf_commit_rules(u_int32_t ticket, int rs_num, char *anchor, char *ruleset) } int -pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) +pfioctl(struct dev_ioctl_args *ap) { + u_long cmd = ap->a_cmd; + caddr_t addr = ap->a_data; struct pf_pooladdr *pa = NULL; struct pf_pool *pool = NULL; int error = 0; @@ -909,7 +915,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td) return (EPERM); } - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) switch (cmd) { case DIOCGETRULES: case DIOCGETRULE: @@ -3063,13 +3069,13 @@ pf_load(void) int error; init_zone_var(); - error = cdevsw_add(&pf_cdevsw, 0, 0); + error = dev_ops_add(&pf_ops, 0, 0); if (error) return (error); - pf_dev = make_dev(&pf_cdevsw, 0, 0, 0, 0600, PF_NAME); + pf_dev = make_dev(&pf_ops, 0, 0, 0, 0600, PF_NAME); error = pfattach(); if (error) { - cdevsw_remove(&pf_cdevsw, 0, 0); + dev_ops_remove(&pf_ops, 0, 0); return (error); } return (0); @@ -3096,7 +3102,7 @@ pf_unload(void) pf_osfp_flush(); pf_osfp_cleanup(); cleanup_pf_zone(); - cdevsw_remove(&pf_cdevsw, 0, 0); + dev_ops_remove(&pf_ops, 0, 0); return 0; } diff --git a/sys/net/ppp/if_ppp.c b/sys/net/ppp/if_ppp.c index 308a0b1f01..bde644ff28 100644 --- a/sys/net/ppp/if_ppp.c +++ b/sys/net/ppp/if_ppp.c @@ -70,7 +70,7 @@ */ /* $FreeBSD: src/sys/net/if_ppp.c,v 1.67.2.4 2002/04/14 21:41:48 luigi Exp $ */ -/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.31 2006/06/06 18:04:15 dillon Exp $ */ +/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.32 2006/07/28 02:17:40 dillon Exp $ */ /* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */ /* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */ @@ -371,7 +371,7 @@ pppdealloc(struct ppp_softc *sc) */ int pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data, - int flag, struct thread *td) + int flag, struct ucred *cred) { int error, flags, mru, npx; u_int nb; @@ -402,7 +402,7 @@ pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data, break; case PPPIOCSFLAGS: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) return (error); flags = *(int *)data & SC_MASK; crit_enter(); @@ -415,7 +415,7 @@ pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data, break; case PPPIOCSMRU: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) return (error); mru = *(int *)data; if (mru >= PPP_MRU && mru <= PPP_MAXMRU) @@ -428,7 +428,7 @@ pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data, #ifdef VJC case PPPIOCSMAXCID: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) return (error); if (sc->sc_comp) { crit_enter(); @@ -439,14 +439,14 @@ pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data, #endif case PPPIOCXFERUNIT: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) return (error); - sc->sc_xfer = td; + sc->sc_xfer = curthread; break; #ifdef PPP_COMPRESS case PPPIOCSCOMPRESS: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) return (error); odp = (struct ppp_option_data *) data; nb = odp->length; @@ -514,7 +514,7 @@ pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data, if (cmd == PPPIOCGNPMODE) { npi->mode = sc->sc_npmode[npx]; } else { - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) return (error); if (npi->mode != sc->sc_npmode[npx]) { crit_enter(); @@ -582,7 +582,6 @@ pppioctl(struct ppp_softc *sc, u_long cmd, caddr_t data, static int pppsioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr) { - struct thread *td = curthread; /* XXX */ struct ppp_softc *sc = &ppp_softc[ifp->if_dunit]; struct ifaddr *ifa = (struct ifaddr *)data; struct ifreq *ifr = (struct ifreq *)data; @@ -634,7 +633,7 @@ pppsioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr) break; case SIOCSIFMTU: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cr, 0)) != 0) break; if (ifr->ifr_mtu > PPP_MAXMTU) error = EINVAL; diff --git a/sys/net/ppp/if_pppvar.h b/sys/net/ppp/if_pppvar.h index bb198378dc..9b62943698 100644 --- a/sys/net/ppp/if_pppvar.h +++ b/sys/net/ppp/if_pppvar.h @@ -40,7 +40,7 @@ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * $FreeBSD: src/sys/net/if_pppvar.h,v 1.15 2000/01/29 16:56:23 peter Exp $ - * $DragonFly: src/sys/net/ppp/if_pppvar.h,v 1.5 2004/09/16 04:39:30 dillon Exp $ + * $DragonFly: src/sys/net/ppp/if_pppvar.h,v 1.6 2006/07/28 02:17:40 dillon Exp $ */ /* @@ -104,7 +104,7 @@ extern struct ppp_softc ppp_softc[]; struct ppp_softc *pppalloc (struct thread *td); void pppdealloc (struct ppp_softc *sc); int pppioctl (struct ppp_softc *sc, u_long cmd, caddr_t data, - int flag, struct thread *td); + int flag, struct ucred *cred); int pppoutput (struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, struct rtentry *rtp); void ppp_restart (struct ppp_softc *sc); diff --git a/sys/net/ppp_layer/ppp_tty.c b/sys/net/ppp_layer/ppp_tty.c index 6fdfc1af23..ec71b6f4f6 100644 --- a/sys/net/ppp_layer/ppp_tty.c +++ b/sys/net/ppp_layer/ppp_tty.c @@ -71,7 +71,7 @@ */ /* $FreeBSD: src/sys/net/ppp_tty.c,v 1.43.2.1 2002/02/13 00:43:11 dillon Exp $ */ -/* $DragonFly: src/sys/net/ppp_layer/ppp_tty.c,v 1.17 2006/02/06 01:49:37 y0netan1 Exp $ */ +/* $DragonFly: src/sys/net/ppp_layer/ppp_tty.c,v 1.18 2006/07/28 02:17:40 dillon Exp $ */ #include "opt_ppp.h" /* XXX for ppp_defs.h */ @@ -108,7 +108,7 @@ static int pppclose (struct tty *tp, int flag); static int pppread (struct tty *tp, struct uio *uio, int flag); static int pppwrite (struct tty *tp, struct uio *uio, int flag); static int ppptioctl (struct tty *tp, u_long cmd, caddr_t data, - int flag, struct thread *); + int flag, struct ucred *); static int pppinput (int c, struct tty *tp); static int pppstart (struct tty *tp); @@ -423,7 +423,7 @@ pppwrite(struct tty *tp, struct uio *uio, int flag) */ /* ARGSUSED */ static int -ppptioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *td) +ppptioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct ucred *cr) { struct ppp_softc *sc = (struct ppp_softc *) tp->t_sc; int error; @@ -434,7 +434,7 @@ ppptioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *td) error = 0; switch (cmd) { case PPPIOCSASYNCMAP: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cr, 0)) != 0) break; sc->sc_asyncmap[0] = *(u_int *)data; break; @@ -444,7 +444,7 @@ ppptioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *td) break; case PPPIOCSRASYNCMAP: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cr, 0)) != 0) break; sc->sc_rasyncmap = *(u_int *)data; break; @@ -454,7 +454,7 @@ ppptioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *td) break; case PPPIOCSXASYNCMAP: - if ((error = suser(td)) != 0) + if ((error = suser_cred(cr, 0)) != 0) break; crit_enter(); bcopy(data, sc->sc_asyncmap, sizeof(sc->sc_asyncmap)); @@ -469,7 +469,7 @@ ppptioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *td) break; default: - error = pppioctl(sc, cmd, data, flag, td); + error = pppioctl(sc, cmd, data, flag, cr); if (error == 0 && cmd == PPPIOCSMRU) pppgetm(sc); } diff --git a/sys/net/sl/if_sl.c b/sys/net/sl/if_sl.c index 037b621492..8484e1862b 100644 --- a/sys/net/sl/if_sl.c +++ b/sys/net/sl/if_sl.c @@ -32,7 +32,7 @@ * * @(#)if_sl.c 8.6 (Berkeley) 2/1/94 * $FreeBSD: src/sys/net/if_sl.c,v 1.84.2.2 2002/02/13 00:43:10 dillon Exp $ - * $DragonFly: src/sys/net/sl/if_sl.c,v 1.24 2006/02/12 19:53:56 dillon Exp $ + * $DragonFly: src/sys/net/sl/if_sl.c,v 1.25 2006/07/28 02:17:40 dillon Exp $ */ /* @@ -186,7 +186,7 @@ static timeout_t sl_outfill; static int slclose (struct tty *,int); static int slinput (int, struct tty *); static int slioctl (struct ifnet *, u_long, caddr_t, struct ucred *); -static int sltioctl (struct tty *, u_long, caddr_t, int, struct thread *); +static int sltioctl (struct tty *, u_long, caddr_t, int, struct ucred *); static int slopen (dev_t, struct tty *); static int sloutput (struct ifnet *, struct mbuf *, struct sockaddr *, struct rtentry *); @@ -343,7 +343,7 @@ slclose(struct tty *tp, int flag) */ /* ARGSUSED */ static int -sltioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *p) +sltioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct ucred *cred) { struct sl_softc *sc = (struct sl_softc *)tp->t_sc, *nc, *tmpnc; int nsl; diff --git a/sys/net/tap/if_tap.c b/sys/net/tap/if_tap.c index fe4fab3d96..4db619c117 100644 --- a/sys/net/tap/if_tap.c +++ b/sys/net/tap/if_tap.c @@ -32,7 +32,7 @@ /* * $FreeBSD: src/sys/net/if_tap.c,v 1.3.2.3 2002/04/14 21:41:48 luigi Exp $ - * $DragonFly: src/sys/net/tap/if_tap.c,v 1.26 2006/07/21 00:51:13 corecode Exp $ + * $DragonFly: src/sys/net/tap/if_tap.c,v 1.27 2006/07/28 02:17:40 dillon Exp $ * $Id: if_tap.c,v 0.21 2000/07/23 21:46:02 max Exp $ */ @@ -40,6 +40,7 @@ #include #include +#include #include #include #include @@ -99,23 +100,14 @@ static d_write_t tapwrite; static d_ioctl_t tapioctl; static d_poll_t tappoll; -static struct cdevsw tap_cdevsw = { - /* dev name */ CDEV_NAME, - /* dev major */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ tapopen, - /* close */ tapclose, - /* read */ tapread, - /* write */ tapwrite, - /* ioctl */ tapioctl, - /* poll */ tappoll, - /* mmap */ nommap, - /* startegy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops tap_ops = { + { CDEV_NAME, CDEV_MAJOR, 0 }, + .d_open = tapopen, + .d_close = tapclose, + .d_read = tapread, + .d_write = tapwrite, + .d_ioctl = tapioctl, + .d_poll = tappoll, }; static int taprefcnt = 0; /* module ref. counter */ @@ -144,7 +136,7 @@ tapmodevent(module_t mod, int type, void *data) if (attached) return (EEXIST); - cdevsw_add(&tap_cdevsw, 0, 0); + dev_ops_add(&tap_ops, 0, 0); attached = 1; break; @@ -152,7 +144,7 @@ tapmodevent(module_t mod, int type, void *data) if (taprefcnt > 0) return (EBUSY); - cdevsw_remove(&tap_cdevsw, 0, 0); + dev_ops_remove(&tap_ops, 0, 0); /* XXX: maintain tap ifs in a local list */ unit = 0; @@ -220,7 +212,7 @@ tapcreate(dev_t dev) unit = lminor(dev); } - tp->tap_dev = make_dev(&tap_cdevsw, minor(dev), UID_ROOT, GID_WHEEL, + tp->tap_dev = make_dev(&tap_ops, minor(dev), UID_ROOT, GID_WHEEL, 0600, "%s%d", name, unit); tp->tap_dev->si_drv1 = dev->si_drv1 = tp; reference_dev(tp->tap_dev); /* so we can destroy it later */ @@ -261,12 +253,13 @@ tapcreate(dev_t dev) * to open tunnel. must be superuser */ static int -tapopen(dev_t dev, int flag, int mode, d_thread_t *td) +tapopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tap_softc *tp = NULL; int error; - if ((error = suser(td)) != 0) + if ((error = suser_cred(ap->a_cred, 0)) != 0) return (error); tp = dev->si_drv1; @@ -280,7 +273,7 @@ tapopen(dev_t dev, int flag, int mode, d_thread_t *td) bcopy(tp->arpcom.ac_enaddr, tp->ether_addr, sizeof(tp->ether_addr)); - tp->tap_td = td; + tp->tap_td = curthread; tp->tap_flags |= TAP_OPEN; taprefcnt ++; @@ -298,8 +291,9 @@ tapopen(dev_t dev, int flag, int mode, d_thread_t *td) * close the device - mark i/f down & delete routing info */ static int -tapclose(dev_t dev, int foo, int bar, d_thread_t *td) +tapclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tap_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tap_if; @@ -485,11 +479,13 @@ tapifstart(struct ifnet *ifp) /* * tapioctl * - * the cdevsw interface is now pretty minimal + * the ops interface is now pretty minimal */ static int -tapioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) +tapioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; struct tap_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tap_if; struct tapinfo *tapp = NULL; @@ -500,7 +496,7 @@ tapioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) lwkt_serialize_enter(ifp->if_serializer); error = 0; - switch (cmd) { + switch (ap->a_cmd) { case TAPSIFINFO: tapp = (struct tapinfo *)data; ifp->if_mtu = tapp->mtu; @@ -591,12 +587,14 @@ tapioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) /* * tapread * - * the cdevsw read interface - reads a packet at a time, or at + * the ops read interface - reads a packet at a time, or at * least as much of a packet as can be read */ static int -tapread(dev_t dev, struct uio *uio, int flag) +tapread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct tap_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tap_if; struct mbuf *m0 = NULL; @@ -618,7 +616,7 @@ tapread(dev_t dev, struct uio *uio, int flag) lwkt_serialize_enter(ifp->if_serializer); m0 = ifq_dequeue(&ifp->if_snd, NULL); if (m0 == NULL) { - if (flag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { lwkt_serialize_exit(ifp->if_serializer); return (EWOULDBLOCK); } @@ -660,11 +658,13 @@ tapread(dev_t dev, struct uio *uio, int flag) /* * tapwrite * - * the cdevsw write interface - an atomic write is a packet - or else! + * the ops write interface - an atomic write is a packet - or else! */ static int -tapwrite(dev_t dev, struct uio *uio, int flag) +tapwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct tap_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tap_if; struct mbuf *top = NULL, **mp = NULL, *m = NULL; @@ -737,8 +737,9 @@ tapwrite(dev_t dev, struct uio *uio, int flag) * anyway, it either accepts the packet or drops it */ static int -tappoll(dev_t dev, int events, d_thread_t *td) +tappoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tap_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tap_if; int revents = 0; @@ -746,24 +747,25 @@ tappoll(dev_t dev, int events, d_thread_t *td) TAPDEBUG(ifp, "polling, minor = %#x\n", minor(tp->tap_dev)); lwkt_serialize_enter(ifp->if_serializer); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (!ifq_is_empty(&ifp->if_snd)) { TAPDEBUG(ifp, "has data in queue. minor = %#x\n", minor(tp->tap_dev)); - revents |= (events & (POLLIN | POLLRDNORM)); + revents |= (ap->a_events & (POLLIN | POLLRDNORM)); } else { TAPDEBUG(ifp, "waiting for data, minor = %#x\n", minor(tp->tap_dev)); - selrecord(td, &tp->tap_rsel); + selrecord(curthread, &tp->tap_rsel); } } lwkt_serialize_exit(ifp->if_serializer); - if (events & (POLLOUT | POLLWRNORM)) - revents |= (events & (POLLOUT | POLLWRNORM)); - return (revents); + if (ap->a_events & (POLLOUT | POLLWRNORM)) + revents |= (ap->a_events & (POLLOUT | POLLWRNORM)); + ap->a_events = revents; + return(0); } /* tappoll */ diff --git a/sys/net/tun/if_tun.c b/sys/net/tun/if_tun.c index dcdb564d9d..0b6689762c 100644 --- a/sys/net/tun/if_tun.c +++ b/sys/net/tun/if_tun.c @@ -14,7 +14,7 @@ * operation though. * * $FreeBSD: src/sys/net/if_tun.c,v 1.74.2.8 2002/02/13 00:43:11 dillon Exp $ - * $DragonFly: src/sys/net/tun/if_tun.c,v 1.28 2006/06/13 08:12:03 dillon Exp $ + * $DragonFly: src/sys/net/tun/if_tun.c,v 1.29 2006/07/28 02:17:40 dillon Exp $ */ #include "opt_atalk.h" @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -36,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -81,29 +82,20 @@ static d_ioctl_t tunioctl; static d_poll_t tunpoll; #define CDEV_MAJOR 52 -static struct cdevsw tun_cdevsw = { - /* name */ "tun", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ tunopen, - /* close */ tunclose, - /* read */ tunread, - /* write */ tunwrite, - /* ioctl */ tunioctl, - /* poll */ tunpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops tun_ops = { + { "tun", CDEV_MAJOR, 0 }, + .d_open = tunopen, + .d_close = tunclose, + .d_read = tunread, + .d_write = tunwrite, + .d_ioctl = tunioctl, + .d_poll = tunpoll, }; static void tunattach(void *dummy) { - cdevsw_add(&tun_cdevsw, 0, 0); + dev_ops_add(&tun_ops, 0, 0); } static void @@ -112,7 +104,7 @@ tuncreate(dev_t dev) struct tun_softc *sc; struct ifnet *ifp; - dev = make_dev(&tun_cdevsw, minor(dev), + dev = make_dev(&tun_ops, minor(dev), UID_UUCP, GID_DIALER, 0600, "tun%d", lminor(dev)); MALLOC(sc, struct tun_softc *, sizeof(*sc), M_TUN, M_WAITOK); @@ -140,14 +132,14 @@ tuncreate(dev_t dev) * configured in */ static int -tunopen(dev_t dev, int flag, int mode, struct thread *td) +tunopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct ifnet *ifp; struct tun_softc *tp; int error; - KKASSERT(td->td_proc); - if ((error = suser(td)) != NULL) + if ((error = suser_cred(ap->a_cred, 0)) != NULL) return (error); tp = dev->si_drv1; @@ -157,7 +149,7 @@ tunopen(dev_t dev, int flag, int mode, struct thread *td) } if (tp->tun_flags & TUN_OPEN) return EBUSY; - tp->tun_pid = td->td_proc->p_pid; + tp->tun_pid = curproc->p_pid; ifp = &tp->tun_if; tp->tun_flags |= TUN_OPEN; TUNDEBUG(ifp, "open\n"); @@ -169,8 +161,9 @@ tunopen(dev_t dev, int flag, int mode, struct thread *td) * routing info */ static int -tunclose(dev_t dev, int foo, int bar, struct thread *td) +tunclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tun_softc *tp; struct ifnet *ifp; @@ -391,17 +384,18 @@ tunoutput(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, } /* - * the cdevsw interface is now pretty minimal. + * the ops interface is now pretty minimal. */ static int -tunioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +tunioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tun_softc *tp = dev->si_drv1; struct tuninfo *tunp; - switch (cmd) { + switch (ap->a_cmd) { case TUNSIFINFO: - tunp = (struct tuninfo *)data; + tunp = (struct tuninfo *)ap->a_data; if (tunp->mtu < IF_MINMTU) return (EINVAL); tp->tun_if.if_mtu = tunp->mtu; @@ -409,44 +403,44 @@ tunioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) tp->tun_if.if_baudrate = tunp->baudrate; break; case TUNGIFINFO: - tunp = (struct tuninfo *)data; + tunp = (struct tuninfo *)ap->a_data; tunp->mtu = tp->tun_if.if_mtu; tunp->type = tp->tun_if.if_type; tunp->baudrate = tp->tun_if.if_baudrate; break; case TUNSDEBUG: - tundebug = *(int *)data; + tundebug = *(int *)ap->a_data; break; case TUNGDEBUG: - *(int *)data = tundebug; + *(int *)ap->a_data = tundebug; break; case TUNSLMODE: - if (*(int *)data) { + if (*(int *)ap->a_data) { tp->tun_flags |= TUN_LMODE; tp->tun_flags &= ~TUN_IFHEAD; } else tp->tun_flags &= ~TUN_LMODE; break; case TUNSIFHEAD: - if (*(int *)data) { + if (*(int *)ap->a_data) { tp->tun_flags |= TUN_IFHEAD; tp->tun_flags &= ~TUN_LMODE; } else tp->tun_flags &= ~TUN_IFHEAD; break; case TUNGIFHEAD: - *(int *)data = (tp->tun_flags & TUN_IFHEAD) ? 1 : 0; + *(int *)ap->a_data = (tp->tun_flags & TUN_IFHEAD) ? 1 : 0; break; case TUNSIFMODE: /* deny this if UP */ if (tp->tun_if.if_flags & IFF_UP) return(EBUSY); - switch (*(int *)data & ~IFF_MULTICAST) { + switch (*(int *)ap->a_data & ~IFF_MULTICAST) { case IFF_POINTOPOINT: case IFF_BROADCAST: tp->tun_if.if_flags &= ~(IFF_BROADCAST|IFF_POINTOPOINT); - tp->tun_if.if_flags |= *(int *)data; + tp->tun_if.if_flags |= *(int *)ap->a_data; break; default: return(EINVAL); @@ -456,7 +450,7 @@ tunioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) tp->tun_pid = curproc->p_pid; break; case FIOASYNC: - if (*(int *)data) + if (*(int *)ap->a_data) tp->tun_flags |= TUN_ASYNC; else tp->tun_flags &= ~TUN_ASYNC; @@ -467,27 +461,27 @@ tunioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) struct mbuf *mb; mb = ifq_poll(&tp->tun_if.if_snd); - for( *(int *)data = 0; mb != 0; mb = mb->m_next) - *(int *)data += mb->m_len; + for( *(int *)ap->a_data = 0; mb != 0; mb = mb->m_next) + *(int *)ap->a_data += mb->m_len; } else { - *(int *)data = 0; + *(int *)ap->a_data = 0; } lwkt_serialize_exit(tp->tun_if.if_serializer); break; case FIOSETOWN: - return (fsetown(*(int *)data, &tp->tun_sigio)); + return (fsetown(*(int *)ap->a_data, &tp->tun_sigio)); case FIOGETOWN: - *(int *)data = fgetown(tp->tun_sigio); + *(int *)ap->a_data = fgetown(tp->tun_sigio); return (0); /* This is deprecated, FIOSETOWN should be used instead. */ case TIOCSPGRP: - return (fsetown(-(*(int *)data), &tp->tun_sigio)); + return (fsetown(-(*(int *)ap->a_data), &tp->tun_sigio)); /* This is deprecated, FIOGETOWN should be used instead. */ case TIOCGPGRP: - *(int *)data = -fgetown(tp->tun_sigio); + *(int *)ap->a_data = -fgetown(tp->tun_sigio); return (0); default: @@ -497,12 +491,14 @@ tunioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } /* - * The cdevsw read interface - reads a packet at a time, or at + * The ops read interface - reads a packet at a time, or at * least as much of a packet as can be read. */ static int -tunread(dev_t dev, struct uio *uio, int flag) +tunread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct tun_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tun_if; struct mbuf *m0; @@ -519,7 +515,7 @@ tunread(dev_t dev, struct uio *uio, int flag) lwkt_serialize_enter(ifp->if_serializer); while ((m0 = ifq_dequeue(&ifp->if_snd, NULL)) == NULL) { - if (flag & IO_NDELAY) { + if (ap->a_ioflag & IO_NDELAY) { lwkt_serialize_exit(ifp->if_serializer); return EWOULDBLOCK; } @@ -547,11 +543,13 @@ tunread(dev_t dev, struct uio *uio, int flag) } /* - * the cdevsw write interface - an atomic write is a packet - or else! + * the ops write interface - an atomic write is a packet - or else! */ static int -tunwrite(dev_t dev, struct uio *uio, int flag) +tunwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct tun_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tun_if; struct mbuf *top, **mp, *m; @@ -675,8 +673,9 @@ tunwrite(dev_t dev, struct uio *uio, int flag) * anyway, it either accepts the packet or drops it. */ static int -tunpoll(dev_t dev, int events, struct thread *td) +tunpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct tun_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tun_if; int revents = 0; @@ -685,21 +684,21 @@ tunpoll(dev_t dev, int events, struct thread *td) lwkt_serialize_enter(ifp->if_serializer); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (!ifq_is_empty(&ifp->if_snd)) { TUNDEBUG(ifp, "tunpoll q=%d\n", ifp->if_snd.ifq_len); - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); } else { TUNDEBUG(ifp, "tunpoll waiting\n"); - selrecord(td, &tp->tun_rsel); + selrecord(curthread, &tp->tun_rsel); } } - if (events & (POLLOUT | POLLWRNORM)) - revents |= events & (POLLOUT | POLLWRNORM); + if (ap->a_events & (POLLOUT | POLLWRNORM)) + revents |= ap->a_events & (POLLOUT | POLLWRNORM); lwkt_serialize_exit(ifp->if_serializer); - - return (revents); + ap->a_events = revents; + return(0); } /* diff --git a/sys/netgraph/tty/ng_tty.c b/sys/netgraph/tty/ng_tty.c index e9ceb7da35..52a488ad70 100644 --- a/sys/netgraph/tty/ng_tty.c +++ b/sys/netgraph/tty/ng_tty.c @@ -37,7 +37,7 @@ * Author: Archie Cobbs * * $FreeBSD: src/sys/netgraph/ng_tty.c,v 1.7.2.3 2002/02/13 00:43:12 dillon Exp $ - * $DragonFly: src/sys/netgraph/tty/ng_tty.c,v 1.11 2005/06/16 21:12:48 dillon Exp $ + * $DragonFly: src/sys/netgraph/tty/ng_tty.c,v 1.12 2006/07/28 02:17:40 dillon Exp $ * $Whistle: ng_tty.c,v 1.21 1999/11/01 09:24:52 julian Exp $ */ @@ -128,7 +128,7 @@ static int ngt_close(struct tty *tp, int flag); static int ngt_read(struct tty *tp, struct uio *uio, int flag); static int ngt_write(struct tty *tp, struct uio *uio, int flag); static int ngt_tioctl(struct tty *tp, - u_long cmd, caddr_t data, int flag, d_thread_t *td); + u_long cmd, caddr_t data, int flag, struct ucred *cred); static int ngt_input(int c, struct tty *tp); static int ngt_start(struct tty *tp); @@ -311,7 +311,7 @@ ngt_write(struct tty *tp, struct uio *uio, int flag) * We implement the NGIOCGINFO ioctl() defined in ng_message.h. */ static int -ngt_tioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, d_thread_t *td) +ngt_tioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct ucred *cred) { const sc_p sc = (sc_p) tp->t_sc; int error = 0; diff --git a/sys/netproto/smb/smb_conn.c b/sys/netproto/smb/smb_conn.c index b59a20f256..20549040e6 100644 --- a/sys/netproto/smb/smb_conn.c +++ b/sys/netproto/smb/smb_conn.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netsmb/smb_conn.c,v 1.1.2.1 2001/05/22 08:32:33 bp Exp $ - * $DragonFly: src/sys/netproto/smb/smb_conn.c,v 1.16 2006/05/05 21:15:09 dillon Exp $ + * $DragonFly: src/sys/netproto/smb/smb_conn.c,v 1.17 2006/07/28 02:17:41 dillon Exp $ */ /* @@ -61,8 +61,7 @@ SYSCTL_NODE(_net, OID_AUTO, smb, CTLFLAG_RW, NULL, "SMB protocol"); MALLOC_DEFINE(M_SMBCONN, "SMB conn", "SMB connection"); -static void smb_co_init(struct smb_connobj *cp, int level, char *objname, - struct thread *td); +static void smb_co_init(struct smb_connobj *cp, int level, char *objname); static void smb_co_done(struct smb_connobj *cp); static int smb_co_lockstatus(struct smb_connobj *cp, struct thread *td); @@ -73,12 +72,12 @@ static void smb_vc_gone(struct smb_connobj *cp, struct smb_cred *scred); /* * Connection object */ -static void smb_co_ref(struct smb_connobj *cp, struct thread *td); +static void smb_co_ref(struct smb_connobj *cp); static void smb_co_rele(struct smb_connobj *cp, struct smb_cred *scred); static int smb_co_get(struct smb_connobj *cp, int flags, struct smb_cred *scred); static void smb_co_put(struct smb_connobj *cp, struct smb_cred *scred); -static int smb_co_lock(struct smb_connobj *cp, int flags, struct thread *td); -static void smb_co_unlock(struct smb_connobj *cp, int flags, struct thread *td); +static int smb_co_lock(struct smb_connobj *cp, int flags); +static void smb_co_unlock(struct smb_connobj *cp, int flags); static smb_co_free_t smb_share_free; static smb_co_gone_t smb_share_gone; @@ -91,8 +90,8 @@ SYSCTL_PROC(_net_smb, OID_AUTO, treedump, CTLFLAG_RD | CTLTYPE_OPAQUE, int smb_sm_init(void) { - smb_co_init(&smb_vclist, SMBL_SM, "smbsm", curthread); - smb_co_unlock(&smb_vclist, 0, curthread); + smb_co_init(&smb_vclist, SMBL_SM, "smbsm"); + smb_co_unlock(&smb_vclist, 0); return 0; } @@ -110,22 +109,21 @@ smb_sm_done(void) } static int -smb_sm_lockvclist(int flags, struct thread *td) +smb_sm_lockvclist(int flags) { - return smb_co_lock(&smb_vclist, flags | LK_CANRECURSE, td); + return smb_co_lock(&smb_vclist, flags | LK_CANRECURSE); } static void -smb_sm_unlockvclist(struct thread *td) +smb_sm_unlockvclist(void) { - smb_co_unlock(&smb_vclist, LK_RELEASE, td); + smb_co_unlock(&smb_vclist, LK_RELEASE); } static int smb_sm_lookupint(struct smb_vcspec *vcspec, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_vc **vcpp) { - struct thread *td = scred->scr_td; struct smb_vc *vcp; int exact = 1; int error; @@ -133,7 +131,7 @@ smb_sm_lookupint(struct smb_vcspec *vcspec, struct smb_sharespec *shspec, vcspec->shspec = shspec; error = ENOENT; SMBCO_FOREACH((struct smb_connobj*)vcp, &smb_vclist) { - error = smb_vc_lock(vcp, LK_EXCLUSIVE, td); + error = smb_vc_lock(vcp, LK_EXCLUSIVE); if (error) continue; itry { @@ -165,14 +163,14 @@ smb_sm_lookupint(struct smb_vcspec *vcspec, struct smb_sharespec *shspec, error = 0; break; } icatch(error) { - smb_vc_unlock(vcp, 0, td); + smb_vc_unlock(vcp, 0); } ifinally { } iendtry; if (error == 0) break; } if (vcp) { - smb_vc_ref(vcp, td); + smb_vc_ref(vcp); *vcpp = vcp; } return error; @@ -182,19 +180,18 @@ int smb_sm_lookup(struct smb_vcspec *vcspec, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_vc **vcpp) { - struct thread *td = scred->scr_td; struct smb_vc *vcp; struct smb_share *ssp = NULL; int error; *vcpp = vcp = NULL; - error = smb_sm_lockvclist(LK_EXCLUSIVE, td); + error = smb_sm_lockvclist(LK_EXCLUSIVE); if (error) return error; error = smb_sm_lookupint(vcspec, shspec, scred, vcpp); if (error == 0 || (vcspec->flags & SMBV_CREATE) == 0) { - smb_sm_unlockvclist(td); + smb_sm_unlockvclist(); return error; } error = smb_sm_lookupint(vcspec, NULL, scred, &vcp); @@ -217,7 +214,7 @@ smb_sm_lookup(struct smb_vcspec *vcspec, struct smb_sharespec *shspec, else smb_share_put(ssp, scred); out: - smb_sm_unlockvclist(td); + smb_sm_unlockvclist(); if (error == 0) *vcpp = vcp; else if (vcp) @@ -229,14 +226,14 @@ out: * Common code for connection object */ static void -smb_co_init(struct smb_connobj *cp, int level, char *objname, struct thread *td) +smb_co_init(struct smb_connobj *cp, int level, char *objname) { SLIST_INIT(&cp->co_children); smb_sl_init(&cp->co_interlock, objname); lockinit(&cp->co_lock, objname, 0, 0); cp->co_level = level; cp->co_usecount = 1; - smb_co_lock(cp, LK_EXCLUSIVE, td); + smb_co_lock(cp, LK_EXCLUSIVE); } static void @@ -255,7 +252,7 @@ smb_co_gone(struct smb_connobj *cp, struct smb_cred *scred) cp->co_gone(cp, scred); parent = cp->co_parent; if (parent) { - smb_co_lock(parent, LK_EXCLUSIVE, scred->scr_td); + smb_co_lock(parent, LK_EXCLUSIVE); SLIST_REMOVE(&parent->co_children, cp, smb_connobj, co_next); smb_co_put(parent, scred); } @@ -268,7 +265,7 @@ smb_co_gone(struct smb_connobj *cp, struct smb_cred *scred) } void -smb_co_ref(struct smb_connobj *cp, struct thread *td) +smb_co_ref(struct smb_connobj *cp) { SMB_CO_LOCK(cp); cp->co_usecount++; @@ -309,7 +306,7 @@ smb_co_get(struct smb_connobj *cp, int flags, struct smb_cred *scred) SMB_CO_LOCK(cp); cp->co_usecount++; SMB_CO_UNLOCK(cp); - error = smb_co_lock(cp, flags, scred->scr_td); + error = smb_co_lock(cp, flags); if (error) { SMB_CO_LOCK(cp); if (cp->co_usecount > 1) { @@ -370,7 +367,7 @@ smb_co_lockstatus(struct smb_connobj *cp, struct thread *td) } int -smb_co_lock(struct smb_connobj *cp, int flags, struct thread *td) +smb_co_lock(struct smb_connobj *cp, int flags) { int error; @@ -379,7 +376,7 @@ smb_co_lock(struct smb_connobj *cp, int flags, struct thread *td) return EINVAL; if ((flags & LK_TYPE_MASK) == 0) flags |= LK_EXCLUSIVE; - if (smb_co_lockstatus(cp, td) == LK_EXCLUSIVE && + if (smb_co_lockstatus(cp, curthread) == LK_EXCLUSIVE && (flags & LK_CANRECURSE) == 0) { SMBERROR("recursive lock for object %d\n", cp->co_level); return 0; @@ -393,7 +390,7 @@ smb_co_lock(struct smb_connobj *cp, int flags, struct thread *td) } void -smb_co_unlock(struct smb_connobj *cp, int flags, struct thread *td) +smb_co_unlock(struct smb_connobj *cp, int flags) { lockmgr(&cp->co_lock, flags | LK_RELEASE); } @@ -404,7 +401,7 @@ smb_co_addchild(struct smb_connobj *parent, struct smb_connobj *child) KASSERT(smb_co_lockstatus(parent, curthread) == LK_EXCLUSIVE, ("smb_co_addchild: parent not locked")); KASSERT(smb_co_lockstatus(child, curthread) == LK_EXCLUSIVE, ("smb_co_addchild: child not locked")); - smb_co_ref(parent, curthread); + smb_co_ref(parent); SLIST_INSERT_HEAD(&parent->co_children, child, co_next); child->co_parent = parent; } @@ -418,7 +415,6 @@ smb_vc_create(struct smb_vcspec *vcspec, struct smb_cred *scred, struct smb_vc **vcpp) { struct smb_vc *vcp; - struct thread *td = scred->scr_td; struct ucred *cred = scred->scr_cred; uid_t uid = vcspec->owner; gid_t gid = vcspec->group; @@ -436,7 +432,7 @@ smb_vc_create(struct smb_vcspec *vcspec, return EPERM; vcp = smb_zmalloc(sizeof(*vcp), M_SMBCONN, M_WAITOK); - smb_co_init(VCTOCP(vcp), SMBL_VC, "smb_vc", td); + smb_co_init(VCTOCP(vcp), SMBL_VC, "smb_vc"); vcp->obj.co_free = smb_vc_free; vcp->obj.co_gone = smb_vc_gone; vcp->vc_number = smb_vcnext++; @@ -529,9 +525,9 @@ smb_vc_gone(struct smb_connobj *cp, struct smb_cred *scred) } void -smb_vc_ref(struct smb_vc *vcp, struct thread *td) +smb_vc_ref(struct smb_vc *vcp) { - smb_co_ref(VCTOCP(vcp), td); + smb_co_ref(VCTOCP(vcp)); } void @@ -553,15 +549,15 @@ smb_vc_put(struct smb_vc *vcp, struct smb_cred *scred) } int -smb_vc_lock(struct smb_vc *vcp, int flags, struct thread *td) +smb_vc_lock(struct smb_vc *vcp, int flags) { - return smb_co_lock(VCTOCP(vcp), flags, td); + return smb_co_lock(VCTOCP(vcp), flags); } void -smb_vc_unlock(struct smb_vc *vcp, int flags, struct thread *td) +smb_vc_unlock(struct smb_vc *vcp, int flags) { - smb_co_unlock(VCTOCP(vcp), flags, td); + smb_co_unlock(VCTOCP(vcp), flags); } int @@ -613,22 +609,21 @@ int smb_vc_lookupshare(struct smb_vc *vcp, struct smb_sharespec *dp, struct smb_cred *scred, struct smb_share **sspp) { - struct thread *td = scred->scr_td; struct smb_share *ssp = NULL; int error; *sspp = NULL; dp->scred = scred; SMBCO_FOREACH((struct smb_connobj*)ssp, VCTOCP(vcp)) { - error = smb_share_lock(ssp, LK_EXCLUSIVE, td); + error = smb_share_lock(ssp, LK_EXCLUSIVE); if (error) continue; if (smb_vc_cmpshare(ssp, dp) == 0) break; - smb_share_unlock(ssp, 0, td); + smb_share_unlock(ssp, 0); } if (ssp) { - smb_share_ref(ssp, td); + smb_share_ref(ssp); *sspp = ssp; error = 0; } else @@ -707,7 +702,6 @@ smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_share **sspp) { struct smb_share *ssp; - struct thread *td = scred->scr_td; struct ucred *cred = scred->scr_cred; uid_t realuid = cred->cr_uid; uid_t uid = shspec->owner; @@ -732,7 +726,7 @@ smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec, if (gid == SMBM_ANY_GROUP) gid = cred->cr_groups[0]; ssp = smb_zmalloc(sizeof(*ssp), M_SMBCONN, M_WAITOK); - smb_co_init(SSTOCP(ssp), SMBL_SHARE, "smbss", td); + smb_co_init(SSTOCP(ssp), SMBL_SHARE, "smbss"); ssp->obj.co_free = smb_share_free; ssp->obj.co_gone = smb_share_gone; smb_sl_init(&ssp->ss_stlock, "ssstlock"); @@ -770,9 +764,9 @@ smb_share_gone(struct smb_connobj *cp, struct smb_cred *scred) } void -smb_share_ref(struct smb_share *ssp, struct thread *td) +smb_share_ref(struct smb_share *ssp) { - smb_co_ref(SSTOCP(ssp), td); + smb_co_ref(SSTOCP(ssp)); } void @@ -794,15 +788,15 @@ smb_share_put(struct smb_share *ssp, struct smb_cred *scred) } int -smb_share_lock(struct smb_share *ssp, int flags, struct thread *td) +smb_share_lock(struct smb_share *ssp, int flags) { - return smb_co_lock(SSTOCP(ssp), flags, td); + return smb_co_lock(SSTOCP(ssp), flags); } void -smb_share_unlock(struct smb_share *ssp, int flags, struct thread *td) +smb_share_unlock(struct smb_share *ssp, int flags) { - smb_co_unlock(SSTOCP(ssp), flags, td); + smb_co_unlock(SSTOCP(ssp), flags); } int @@ -879,32 +873,32 @@ smb_sysctl_treedump(SYSCTL_HANDLER_ARGS) ucred = td->td_proc->p_ucred; smb_makescred(&scred, td, ucred); - error = smb_sm_lockvclist(LK_SHARED, td); + error = smb_sm_lockvclist(LK_SHARED); if (error) return error; SMBCO_FOREACH((struct smb_connobj*)vcp, &smb_vclist) { - error = smb_vc_lock(vcp, LK_SHARED, td); + error = smb_vc_lock(vcp, LK_SHARED); if (error) continue; smb_vc_getinfo(vcp, &vci); error = SYSCTL_OUT(req, &vci, sizeof(struct smb_vc_info)); if (error) { - smb_vc_unlock(vcp, 0, td); + smb_vc_unlock(vcp, 0); break; } SMBCO_FOREACH((struct smb_connobj*)ssp, VCTOCP(vcp)) { - error = smb_share_lock(ssp, LK_SHARED, td); + error = smb_share_lock(ssp, LK_SHARED); if (error) { error = 0; continue; } smb_share_getinfo(ssp, &ssi); - smb_share_unlock(ssp, 0, td); + smb_share_unlock(ssp, 0); error = SYSCTL_OUT(req, &ssi, sizeof(struct smb_share_info)); if (error) break; } - smb_vc_unlock(vcp, 0, td); + smb_vc_unlock(vcp, 0); if (error) break; } @@ -912,6 +906,6 @@ smb_sysctl_treedump(SYSCTL_HANDLER_ARGS) itype = SMB_INFO_NONE; error = SYSCTL_OUT(req, &itype, sizeof(itype)); } - smb_sm_unlockvclist(td); + smb_sm_unlockvclist(); return error; } diff --git a/sys/netproto/smb/smb_conn.h b/sys/netproto/smb/smb_conn.h index 66dec2a214..4561ec5545 100644 --- a/sys/netproto/smb/smb_conn.h +++ b/sys/netproto/smb/smb_conn.h @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netsmb/smb_conn.h,v 1.1.2.3 2002/04/23 03:45:01 bp Exp $ - * $DragonFly: src/sys/netproto/smb/smb_conn.h,v 1.7 2006/04/23 02:29:33 dillon Exp $ + * $DragonFly: src/sys/netproto/smb/smb_conn.h,v 1.8 2006/07/28 02:17:41 dillon Exp $ */ #ifndef _NETINET_IN_H_ #include @@ -365,10 +365,10 @@ int smb_vc_connect(struct smb_vc *vcp, struct smb_cred *scred); int smb_vc_access(struct smb_vc *vcp, struct smb_cred *scred, mode_t mode); int smb_vc_get(struct smb_vc *vcp, int flags, struct smb_cred *scred); void smb_vc_put(struct smb_vc *vcp, struct smb_cred *scred); -void smb_vc_ref(struct smb_vc *vcp, struct thread *td); +void smb_vc_ref(struct smb_vc *vcp); void smb_vc_rele(struct smb_vc *vcp, struct smb_cred *scred); -int smb_vc_lock(struct smb_vc *vcp, int flags, struct thread *td); -void smb_vc_unlock(struct smb_vc *vcp, int flags, struct thread *td); +int smb_vc_lock(struct smb_vc *vcp, int flags); +void smb_vc_unlock(struct smb_vc *vcp, int flags); int smb_vc_lookupshare(struct smb_vc *vcp, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_share **sspp); const char * smb_vc_getpass(struct smb_vc *vcp); @@ -380,12 +380,12 @@ u_short smb_vc_nextmid(struct smb_vc *vcp); int smb_share_create(struct smb_vc *vcp, struct smb_sharespec *shspec, struct smb_cred *scred, struct smb_share **sspp); int smb_share_access(struct smb_share *ssp, struct smb_cred *scred, mode_t mode); -void smb_share_ref(struct smb_share *ssp, struct thread *td); +void smb_share_ref(struct smb_share *ssp); void smb_share_rele(struct smb_share *ssp, struct smb_cred *scred); int smb_share_get(struct smb_share *ssp, int flags, struct smb_cred *scred); void smb_share_put(struct smb_share *ssp, struct smb_cred *scred); -int smb_share_lock(struct smb_share *ssp, int flags, struct thread *td); -void smb_share_unlock(struct smb_share *ssp, int flags, struct thread *td); +int smb_share_lock(struct smb_share *ssp, int flags); +void smb_share_unlock(struct smb_share *ssp, int flags); void smb_share_invalidate(struct smb_share *ssp); int smb_share_valid(struct smb_share *ssp); const char * smb_share_getpass(struct smb_share *ssp); diff --git a/sys/netproto/smb/smb_dev.c b/sys/netproto/smb/smb_dev.c index 5786600f40..e4fe23952a 100644 --- a/sys/netproto/smb/smb_dev.c +++ b/sys/netproto/smb/smb_dev.c @@ -30,12 +30,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netsmb/smb_dev.c,v 1.2.2.1 2001/05/22 08:32:33 bp Exp $ - * $DragonFly: src/sys/netproto/smb/smb_dev.c,v 1.12 2006/05/19 07:33:45 dillon Exp $ + * $DragonFly: src/sys/netproto/smb/smb_dev.c,v 1.13 2006/07/28 02:17:41 dillon Exp $ */ #include #include #include #include +#include #include #include #include @@ -87,35 +88,22 @@ static MALLOC_DEFINE(M_NSMBDEV, "NETSMBDEV", "NET/SMB device"); int smb_dev_queue(struct smb_dev *ndp, struct smb_rq *rqp, int prio); */ -static struct cdevsw nsmb_cdevsw = { - /* name */ NSMB_NAME, - /* maj */ NSMB_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ nsmb_dev_open, - /* close */ nsmb_dev_close, - /* read */ nsmb_dev_read, - /* write */ nsmb_dev_write, - /* ioctl */ nsmb_dev_ioctl, - /* poll */ nsmb_dev_poll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops nsmb_ops = { + { NSMB_NAME, NSMB_MAJOR, 0 }, + .d_open = nsmb_dev_open, + .d_close = nsmb_dev_close, + .d_read = nsmb_dev_read, + .d_write = nsmb_dev_write, + .d_ioctl = nsmb_dev_ioctl, + .d_poll = nsmb_dev_poll, }; static int -nsmb_dev_open(dev_t dev, int oflags, int devtype, d_thread_t *td) +nsmb_dev_open(struct dev_open_args *ap) { - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; struct smb_dev *sdp; - struct ucred *cred; - - KKASSERT(p != NULL); - cred = p->p_ucred; sdp = SMB_GETDEV(dev); if (sdp && (sdp->sd_flags & NSMBFL_OPEN)) @@ -129,7 +117,8 @@ nsmb_dev_open(dev_t dev, int oflags, int devtype, d_thread_t *td) * device... someone should take care of it. */ if ((dev->si_flags & SI_NAMED) == 0) { - make_dev(&nsmb_cdevsw, minor(dev), cred->cr_uid, cred->cr_gid, + make_dev(&nsmb_ops, minor(dev), + ap->a_cred->cr_uid, ap->a_cred->cr_gid, 0700, NSMB_NAME"%d", lminor(dev)); } bzero(sdp, sizeof(*sdp)); @@ -146,8 +135,9 @@ nsmb_dev_open(dev_t dev, int oflags, int devtype, d_thread_t *td) } static int -nsmb_dev_close(dev_t dev, int flag, int fmt, d_thread_t *td) +nsmb_dev_close(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct smb_dev *sdp; struct smb_vc *vcp; struct smb_share *ssp; @@ -159,7 +149,7 @@ nsmb_dev_close(dev_t dev, int flag, int fmt, d_thread_t *td) crit_exit(); return EBADF; } - smb_makescred(&scred, td, NULL); + smb_makescred(&scred, curthread, NULL); ssp = sdp->sd_share; if (ssp != NULL) smb_share_rele(ssp, &scred); @@ -178,8 +168,10 @@ nsmb_dev_close(dev_t dev, int flag, int fmt, d_thread_t *td) static int -nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) +nsmb_dev_ioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; struct smb_dev *sdp; struct smb_vc *vcp; struct smb_share *ssp; @@ -190,8 +182,8 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if ((sdp->sd_flags & NSMBFL_OPEN) == 0) return EBADF; - smb_makescred(&scred, td, NULL); - switch (cmd) { + smb_makescred(&scred, NULL, ap->a_cred); + switch (ap->a_cmd) { case SMBIOC_OPENSESSION: if (sdp->sd_vc) return EISCONN; @@ -200,7 +192,7 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if (error) break; sdp->sd_vc = vcp; - smb_vc_unlock(vcp, 0, td); + smb_vc_unlock(vcp, 0); sdp->sd_level = SMBL_VC; break; case SMBIOC_OPENSHARE: @@ -213,7 +205,7 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) if (error) break; sdp->sd_share = ssp; - smb_share_unlock(ssp, 0, td); + smb_share_unlock(ssp, 0); sdp->sd_level = SMBL_SHARE; break; case SMBIOC_REQUEST: @@ -242,7 +234,7 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) break; if (on && (vcp->obj.co_flags & SMBV_PERMANENT) == 0) { vcp->obj.co_flags |= SMBV_PERMANENT; - smb_vc_ref(vcp, td); + smb_vc_ref(vcp); } else if (!on && (vcp->obj.co_flags & SMBV_PERMANENT)) { vcp->obj.co_flags &= ~SMBV_PERMANENT; smb_vc_rele(vcp, &scred); @@ -260,7 +252,7 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) break; if (on && (ssp->obj.co_flags & SMBS_PERMANENT) == 0) { ssp->obj.co_flags |= SMBS_PERMANENT; - smb_share_ref(ssp, td); + smb_share_ref(ssp); } else if (!on && (ssp->obj.co_flags & SMBS_PERMANENT)) { ssp->obj.co_flags &= ~SMBS_PERMANENT; smb_share_rele(ssp, &scred); @@ -283,12 +275,12 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) break; if (vcp) { sdp->sd_vc = vcp; - smb_vc_unlock(vcp, 0, td); + smb_vc_unlock(vcp, 0); sdp->sd_level = SMBL_VC; } if (ssp) { sdp->sd_share = ssp; - smb_share_unlock(ssp, 0, td); + smb_share_unlock(ssp, 0); sdp->sd_level = SMBL_SHARE; } break; @@ -306,9 +298,9 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) auio.uio_offset = rwrq->ioc_offset; auio.uio_resid = rwrq->ioc_cnt; auio.uio_segflg = UIO_USERSPACE; - auio.uio_rw = (cmd == SMBIOC_READ) ? UIO_READ : UIO_WRITE; - auio.uio_td = td; - if (cmd == SMBIOC_READ) + auio.uio_rw = (ap->a_cmd == SMBIOC_READ) ? UIO_READ : UIO_WRITE; + auio.uio_td = curthread; + if (ap->a_cmd == SMBIOC_READ) error = smb_read(ssp, rwrq->ioc_fh, &auio, &scred); else error = smb_write(ssp, rwrq->ioc_fh, &auio, &scred); @@ -322,19 +314,19 @@ nsmb_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, d_thread_t *td) } static int -nsmb_dev_read(dev_t dev, struct uio *uio, int flag) +nsmb_dev_read(struct dev_read_args *ap) { return EACCES; } static int -nsmb_dev_write(dev_t dev, struct uio *uio, int flag) +nsmb_dev_write(struct dev_write_args *ap) { return EACCES; } static int -nsmb_dev_poll(dev_t dev, int events, d_thread_t *td) +nsmb_dev_poll(struct dev_poll_args *ap) { return ENODEV; } @@ -354,14 +346,14 @@ nsmb_dev_load(module_t mod, int cmd, void *arg) smb_sm_done(); break; } - cdevsw_add(&nsmb_cdevsw, 0, 0); + dev_ops_add(&nsmb_ops, 0, 0); printf("netsmb_dev: loaded\n"); break; case MOD_UNLOAD: smb_iod_done(); error = smb_sm_done(); error = 0; - cdevsw_remove(&nsmb_cdevsw, 0, 0); + dev_ops_remove(&nsmb_ops, 0, 0); printf("netsmb_dev: unloaded\n"); break; default: diff --git a/sys/opencrypto/cryptodev.c b/sys/opencrypto/cryptodev.c index 120127f926..9167051b6b 100644 --- a/sys/opencrypto/cryptodev.c +++ b/sys/opencrypto/cryptodev.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/opencrypto/cryptodev.c,v 1.4.2.4 2003/06/03 00:09:02 sam Exp $ */ -/* $DragonFly: src/sys/opencrypto/cryptodev.c,v 1.17 2006/05/26 15:55:13 dillon Exp $ */ +/* $DragonFly: src/sys/opencrypto/cryptodev.c,v 1.18 2006/07/28 02:17:41 dillon Exp $ */ /* $OpenBSD: cryptodev.c,v 1.52 2002/06/19 07:22:46 deraadt Exp $ */ /* @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -711,7 +712,7 @@ csefree(struct csession *cse) } static int -cryptoopen(dev_t dev, int oflags, int devtype, struct thread *td) +cryptoopen(struct dev_open_args *ap) { if (crypto_usercrypto == 0) return (ENXIO); @@ -719,32 +720,33 @@ cryptoopen(dev_t dev, int oflags, int devtype, struct thread *td) } static int -cryptoread(dev_t dev, struct uio *uio, int ioflag) +cryptoread(struct dev_read_args *ap) { return (EIO); } static int -cryptowrite(dev_t dev, struct uio *uio, int ioflag) +cryptowrite(struct dev_write_args *ap) { return (EIO); } static int -cryptoioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) +cryptoioctl(struct dev_ioctl_args *ap) { struct file *f; struct fcrypt *fcr; int fd, error; - switch (cmd) { + + switch (ap->a_cmd) { case CRIOGET: MALLOC(fcr, struct fcrypt *, sizeof(struct fcrypt), M_XDATA, M_WAITOK); TAILQ_INIT(&fcr->csessions); fcr->sesn = 0; - KKASSERT(td->td_proc); - error = falloc(td->td_proc, &f, &fd); + KKASSERT(curproc); + error = falloc(curproc, &f, &fd); if (error) { FREE(fcr, M_XDATA); @@ -754,8 +756,8 @@ cryptoioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) f->f_flag = FREAD | FWRITE; f->f_ops = &cryptofops; f->f_data = fcr; - fsetfd(td->td_proc, f, fd); - *(u_int32_t *)data = fd; + fsetfd(curproc, f, fd); + *(u_int32_t *)ap->a_data = fd; fdrop(f); break; default: @@ -766,24 +768,13 @@ cryptoioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td) } #define CRYPTO_MAJOR 70 /* from openbsd */ -static struct cdevsw crypto_cdevsw = { - /* dev name */ "crypto", - /* dev major */ CRYPTO_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ cryptoopen, - /* close */ nullclose, - /* read */ cryptoread, - /* write */ cryptowrite, - /* ioctl */ cryptoioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize, - /* kqfilter */ NULL +static struct dev_ops crypto_ops = { + { "crypto", CRYPTO_MAJOR, 0 }, + .d_open = cryptoopen, + .d_close = nullclose, + .d_read = cryptoread, + .d_write = cryptowrite, + .d_ioctl = cryptoioctl, }; /* @@ -796,13 +787,13 @@ cryptodev_modevent(module_t mod, int type, void *unused) case MOD_LOAD: if (bootverbose) printf("crypto: \n"); - cdevsw_add(&crypto_cdevsw, 0, 0); - make_dev(&crypto_cdevsw, 0, UID_ROOT, GID_WHEEL, + dev_ops_add(&crypto_ops, 0, 0); + make_dev(&crypto_ops, 0, UID_ROOT, GID_WHEEL, 0666, "crypto"); return 0; case MOD_UNLOAD: /*XXX disallow if active sessions */ - cdevsw_remove(&crypto_cdevsw, 0, 0); + dev_ops_remove(&crypto_ops, 0, 0); return 0; } return EINVAL; diff --git a/sys/platform/pc32/acpica5/acpi_machdep.c b/sys/platform/pc32/acpica5/acpi_machdep.c index 71797196be..a5493e0ca2 100644 --- a/sys/platform/pc32/acpica5/acpi_machdep.c +++ b/sys/platform/pc32/acpica5/acpi_machdep.c @@ -24,12 +24,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.20 2004/05/05 19:51:15 njl Exp $ - * $DragonFly: src/sys/platform/pc32/acpica5/acpi_machdep.c,v 1.8 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/acpica5/acpi_machdep.c,v 1.9 2006/07/28 02:17:39 dillon Exp $ */ #include #include #include +#include #include #include #include @@ -65,17 +66,13 @@ static d_ioctl_t apmioctl; static d_poll_t apmpoll; #define CDEV_MAJOR 39 -static struct cdevsw apm_cdevsw = { - .d_name = "apm", - .d_maj = CDEV_MAJOR, - .d_flags = 0, - .d_port = NULL, - .d_clone = NULL, - .old_open = apmopen, - .old_close = apmclose, - .old_write = apmwrite, - .old_ioctl = apmioctl, - .old_poll = apmpoll +static struct dev_ops apm_ops = { + { "apm", CDEV_MAJOR, 0 }, + .d_open = apmopen, + .d_close = apmclose, + .d_write = apmwrite, + .d_ioctl = apmioctl, + .d_poll = apmpoll }; static int @@ -195,19 +192,19 @@ acpi_capm_get_pwstatus(apm_pwstatus_t app) } static int -apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) +apmopen(struct dev_open_args *ap) { return (0); } static int -apmclose(dev_t dev, int flag, int fmt, d_thread_t *td) +apmclose(struct dev_close_args *ap) { return (0); } static int -apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) +apmioctl(struct dev_ioctl_args *ap) { int error = 0; struct acpi_softc *acpi_sc; @@ -216,9 +213,9 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) acpi_sc = device_get_softc(acpi_dev); - switch (cmd) { + switch (ap->a_cmd) { case APMIO_SUSPEND: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); if (apm_softc.active) acpi_SetSleepState(acpi_sc, acpi_sc->acpi_suspend_sx); @@ -226,7 +223,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) error = EINVAL; break; case APMIO_STANDBY: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); if (apm_softc.active) acpi_SetSleepState(acpi_sc, acpi_sc->acpi_standby_sx); @@ -236,7 +233,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) case APMIO_GETINFO_OLD: if (acpi_capm_get_info(&info)) error = ENXIO; - aiop = (apm_info_old_t)addr; + aiop = (apm_info_old_t)ap->a_data; aiop->ai_major = info.ai_major; aiop->ai_minor = info.ai_minor; aiop->ai_acline = info.ai_acline; @@ -245,20 +242,20 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) aiop->ai_status = info.ai_status; break; case APMIO_GETINFO: - if (acpi_capm_get_info((apm_info_t)addr)) + if (acpi_capm_get_info((apm_info_t)ap->a_data)) error = ENXIO; break; case APMIO_GETPWSTATUS: - if (acpi_capm_get_pwstatus((apm_pwstatus_t)addr)) + if (acpi_capm_get_pwstatus((apm_pwstatus_t)ap->a_data)) error = ENXIO; break; case APMIO_ENABLE: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); apm_softc.active = 1; break; case APMIO_DISABLE: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); apm_softc.active = 0; break; @@ -267,13 +264,13 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) case APMIO_NOTHALTCPU: break; case APMIO_DISPLAY: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); break; case APMIO_BIOS: - if ((flag & FWRITE) == 0) + if ((ap->a_fflag & FWRITE) == 0) return (EPERM); - bzero(addr, sizeof(struct apm_bios_arg)); + bzero(ap->a_data, sizeof(struct apm_bios_arg)); break; default: error = EINVAL; @@ -284,23 +281,24 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } static int -apmwrite(dev_t dev, struct uio *uio, int ioflag) +apmwrite(struct dev_write_args *ap) { - return (uio->uio_resid); + return (ap->a_uio->uio_resid); } static int -apmpoll(dev_t dev, int events, d_thread_t *td) +apmpoll(struct dev_poll_args *ap) { + ap->a_events = 0; return (0); } static void acpi_capm_init(struct acpi_softc *sc) { - cdevsw_add(&apm_cdevsw, 0, 0); - make_dev(&apm_cdevsw, 0, 0, 5, 0664, "apm"); - make_dev(&apm_cdevsw, 8, 0, 5, 0664, "apm"); + dev_ops_add(&apm_ops, 0, 0); + make_dev(&apm_ops, 0, 0, 5, 0664, "apm"); + make_dev(&apm_ops, 8, 0, 5, 0664, "apm"); printf("Warning: ACPI is disabling APM's device. You can't run both\n"); } diff --git a/sys/platform/pc32/apm/apm.c b/sys/platform/pc32/apm/apm.c index 0d89c01b89..5ec46ed301 100644 --- a/sys/platform/pc32/apm/apm.c +++ b/sys/platform/pc32/apm/apm.c @@ -16,13 +16,14 @@ * Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * * $FreeBSD: src/sys/i386/apm/apm.c,v 1.114.2.5 2002/11/02 04:41:50 iwasaki Exp $ - * $DragonFly: src/sys/platform/pc32/apm/apm.c,v 1.14 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/apm/apm.c,v 1.15 2006/07/28 02:17:39 dillon Exp $ */ #include #include #include #include +#include #include #include #include @@ -84,23 +85,13 @@ static d_ioctl_t apmioctl; static d_poll_t apmpoll; #define CDEV_MAJOR 39 -static struct cdevsw apm_cdevsw = { - /* name */ "apm", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ apmopen, - /* close */ apmclose, - /* read */ noread, - /* write */ apmwrite, - /* ioctl */ apmioctl, - /* poll */ apmpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops apm_ops = { + { "apm", CDEV_MAJOR, 0 }, + .d_open = apmopen, + .d_close = apmclose, + .d_write = apmwrite, + .d_ioctl = apmioctl, + .d_poll = apmpoll, }; static int apm_suspend_delay = 1; @@ -1099,15 +1090,16 @@ apm_attach(device_t dev) sc->initialized = 1; - cdevsw_add(&apm_cdevsw, 0, 0); - make_dev(&apm_cdevsw, 0, UID_ROOT, GID_OPERATOR, 0660, "apm"); - make_dev(&apm_cdevsw, 8, UID_ROOT, GID_OPERATOR, 0660, "apmctl"); + dev_ops_add(&apm_ops, 0, 0); + make_dev(&apm_ops, 0, UID_ROOT, GID_OPERATOR, 0660, "apm"); + make_dev(&apm_ops, 8, UID_ROOT, GID_OPERATOR, 0660, "apmctl"); return 0; } static int -apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) +apmopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct apm_softc *sc = &apm_softc; int ctl = APMDEV(dev); @@ -1116,7 +1108,7 @@ apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) switch (ctl) { case APMDEV_CTL: - if (!(flag & FWRITE)) + if (!(ap->a_oflags & FWRITE)) return EINVAL; if (sc->sc_flags & SCFLAG_OCTL) return EBUSY; @@ -1134,8 +1126,9 @@ apmopen(dev_t dev, int flag, int fmt, d_thread_t *td) } static int -apmclose(dev_t dev, int flag, int fmt, d_thread_t *td) +apmclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct apm_softc *sc = &apm_softc; int ctl = APMDEV(dev); @@ -1157,8 +1150,9 @@ apmclose(dev_t dev, int flag, int fmt, d_thread_t *td) } static int -apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) +apmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; struct apm_softc *sc = &apm_softc; struct apm_bios_arg *args; int error = 0; @@ -1167,10 +1161,11 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) if (!sc->initialized) return (ENXIO); - APM_DPRINT("APM ioctl: cmd = 0x%lx\n", cmd); - switch (cmd) { + APM_DPRINT("APM ioctl: cmd = 0x%lx\n", ap->a_cmd); + + switch (ap->a_cmd) { case APMIO_SUSPEND: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); if (sc->active) apm_suspend(PMST_SUSPEND); @@ -1179,7 +1174,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) break; case APMIO_STANDBY: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); if (sc->active) apm_suspend(PMST_STANDBY); @@ -1194,7 +1189,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) if (apm_get_info(&info)) error = ENXIO; - aiop = (apm_info_old_t)addr; + aiop = (apm_info_old_t)ap->a_data; aiop->ai_major = info.ai_major; aiop->ai_minor = info.ai_minor; aiop->ai_acline = info.ai_acline; @@ -1204,45 +1199,45 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } break; case APMIO_GETINFO: - if (apm_get_info((apm_info_t)addr)) + if (apm_get_info((apm_info_t)ap->a_data)) error = ENXIO; break; case APMIO_GETPWSTATUS: - if (apm_get_pwstatus((apm_pwstatus_t)addr)) + if (apm_get_pwstatus((apm_pwstatus_t)ap->a_data)) error = ENXIO; break; case APMIO_ENABLE: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_event_enable(); break; case APMIO_DISABLE: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_event_disable(); break; case APMIO_HALTCPU: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_halt_cpu(); break; case APMIO_NOTHALTCPU: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); apm_not_halt_cpu(); break; case APMIO_DISPLAY: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); - newstate = *(int *)addr; + newstate = *(int *)ap->a_data; if (apm_display(newstate)) error = ENXIO; break; case APMIO_BIOS: - if (!(flag & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return (EPERM); /* XXX compatibility with the old interface */ - args = (struct apm_bios_arg *)addr; + args = (struct apm_bios_arg *)ap->a_data; sc->bios.r.eax = args->eax; sc->bios.r.ebx = args->ebx; sc->bios.r.ecx = args->ecx; @@ -1284,12 +1279,12 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) int i; error = 0; - switch (cmd) { + switch (ap->a_cmd) { case APMIO_NEXTEVENT: if (!sc->event_count) { error = EAGAIN; } else { - evp = (struct apm_event_info *)addr; + evp = (struct apm_event_info *)ap->a_data; i = sc->event_ptr + APM_NEVENTS - sc->event_count; i %= APM_NEVENTS; *evp = sc->event_list[i]; @@ -1311,8 +1306,10 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } static int -apmwrite(dev_t dev, struct uio *uio, int ioflag) +apmwrite(struct dev_write_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; struct apm_softc *sc = &apm_softc; u_int event_type; int error; @@ -1341,20 +1338,20 @@ apmwrite(dev_t dev, struct uio *uio, int ioflag) } static int -apmpoll(dev_t dev, int events, d_thread_t *td) +apmpoll(struct dev_poll_args *ap) { struct apm_softc *sc = &apm_softc; int revents = 0; - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (sc->event_count) { - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); } else { - selrecord(td, &sc->sc_rsel); + selrecord(curthread, &sc->sc_rsel); } } - - return (revents); + ap->a_events = revents; + return (0); } /* diff --git a/sys/platform/pc32/i386/elan-mmcr.c b/sys/platform/pc32/i386/elan-mmcr.c index ec35d10c06..b9ee0e8f0d 100644 --- a/sys/platform/pc32/i386/elan-mmcr.c +++ b/sys/platform/pc32/i386/elan-mmcr.c @@ -7,7 +7,7 @@ * ---------------------------------------------------------------------------- * * $FreeBSD: src/sys/i386/i386/elan-mmcr.c,v 1.6.2.1 2002/09/17 22:39:53 sam Exp $ - * $DragonFly: src/sys/platform/pc32/i386/elan-mmcr.c,v 1.7 2004/05/19 22:52:57 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/elan-mmcr.c,v 1.8 2006/07/28 02:17:39 dillon Exp $ * The AMD Elan sc520 is a system-on-chip gadget which is used in embedded * kind of things, see www.soekris.com for instance, and it has a few quirks * we need to deal with. @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -95,47 +96,37 @@ static d_ioctl_t elan_ioctl; static d_mmap_t elan_mmap; #define CDEV_MAJOR 100 /* Share with xrpu */ -static struct cdevsw elan_cdevsw = { - /* name */ "elan", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ elan_open, - /* close */ elan_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ elan_ioctl, - /* poll */ nopoll, - /* mmap */ elan_mmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops elan_ops = { + { "elan", CDEV_MAJOR, 0 }, + .d_open = elan_open, + .d_close = elan_close, + .d_ioctl = elan_ioctl, + .d_mmap = elan_mmap, }; static int -elan_open(dev_t dev, int flag, int mode, struct thread *td) +elan_open(struct dev_open_args *ap) { return (0); } static int -elan_close(dev_t dev, int flag, int mode, struct thread *td) +elan_close(struct dev_close_args *ap) { return (0); } static int -elan_mmap(dev_t dev, vm_offset_t offset, int nprot) +elan_mmap(struct dev_mmap_args *ap) { - if (offset >= 0x1000) - return (-1); - return (i386_btop(0xfffef000)); + if (ap->a_offset >= 0x1000) + return (EINVAL); + ap->a_result = i386_btop(0xfffef000); + return(0); } static int -elan_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td) +elan_ioctl(struct dev_ioctl_args *ap) { return(ENOENT); } @@ -147,8 +138,8 @@ elan_drvinit(void) if (elan_mmcr == NULL) return; printf("Elan-mmcr driver: MMCR at %p\n", elan_mmcr); - cdevsw_add(&elan_cdevsw, 0, 0); - make_dev(&elan_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "elan-mmcr"); + dev_ops_add(&elan_ops, 0, 0); + make_dev(&elan_ops, 0, UID_ROOT, GID_WHEEL, 0600, "elan-mmcr"); return; } diff --git a/sys/platform/pc32/i386/mem.c b/sys/platform/pc32/i386/mem.c index d65c1f6446..a4e9e60b4b 100644 --- a/sys/platform/pc32/i386/mem.c +++ b/sys/platform/pc32/i386/mem.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/platform/pc32/i386/Attic/mem.c,v 1.16 2006/07/10 21:06:08 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/Attic/mem.c,v 1.17 2006/07/28 02:17:39 dillon Exp $ */ /* @@ -74,49 +74,53 @@ static d_open_t mmopen; static d_close_t mmclose; -static d_read_t mmrw; +static d_read_t mmread; +static d_write_t mmwrite; static d_ioctl_t mmioctl; static d_mmap_t memmmap; static d_poll_t mmpoll; #define CDEV_MAJOR 2 -static struct cdevsw mem_cdevsw = { - /* name */ "mem", - /* maj */ CDEV_MAJOR, - /* flags */ D_MEM, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mmopen, - /* close */ mmclose, - /* read */ mmrw, - /* write */ mmrw, - /* ioctl */ mmioctl, - /* poll */ mmpoll, - /* mmap */ memmmap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mem_ops = { + { "mem", CDEV_MAJOR, D_MEM }, + .d_open = mmopen, + .d_close = mmclose, + .d_read = mmread, + .d_write = mmwrite, + .d_ioctl = mmioctl, + .d_poll = mmpoll, + .d_mmap = memmmap, }; static int rand_bolt; static caddr_t zbuf; MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors"); -static int mem_ioctl (dev_t, u_long, caddr_t, int, struct thread *); -static int random_ioctl (dev_t, u_long, caddr_t, int, struct thread *); +static int mem_ioctl (dev_t, u_long, caddr_t, int, struct ucred *); +static int random_ioctl (dev_t, u_long, caddr_t, int, struct ucred *); struct mem_range_softc mem_range_softc; static int -mmclose(dev_t dev, int flags, int fmt, struct thread *td) +mmopen(struct dev_open_args *ap) { - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; + int error; switch (minor(dev)) { + case 0: + case 1: + if ((ap->a_oflags & FWRITE) && securelevel > 0) + return (EPERM); + break; case 14: - p->p_md.md_regs->tf_eflags &= ~PSL_IOPL; + error = suser_cred(ap->a_cred, 0); + if (error != 0) + return (error); + if (securelevel > 0) + return (EPERM); + curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; break; default: break; @@ -125,24 +129,13 @@ mmclose(dev_t dev, int flags, int fmt, struct thread *td) } static int -mmopen(dev_t dev, int flags, int fmt, struct thread *td) +mmclose(struct dev_close_args *ap) { - int error; - struct proc *p = td->td_proc; + dev_t dev = ap->a_head.a_dev; switch (minor(dev)) { - case 0: - case 1: - if ((flags & FWRITE) && securelevel > 0) - return (EPERM); - break; case 14: - error = suser(td); - if (error != 0) - return (error); - if (securelevel > 0) - return (EPERM); - p->p_md.md_regs->tf_eflags |= PSL_IOPL; + curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; break; default: break; @@ -150,11 +143,9 @@ mmopen(dev_t dev, int flags, int fmt, struct thread *td) return (0); } + static int -mmrw(dev, uio, flags) - dev_t dev; - struct uio *uio; - int flags; +mmrw(dev_t dev, struct uio *uio, int flags) { int o; u_int c, v; @@ -308,6 +299,19 @@ mmrw(dev, uio, flags) return (error); } +static int +mmread(struct dev_read_args *ap) +{ + return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + +static int +mmwrite(struct dev_write_args *ap) +{ + return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); +} + + @@ -315,35 +319,44 @@ mmrw(dev, uio, flags) * allow user processes to MMAP some memory sections * * instead of going through read/write * \*******************************************************/ + static int -memmmap(dev_t dev, vm_offset_t offset, int nprot) +memmmap(struct dev_mmap_args *ap) { - switch (minor(dev)) - { + dev_t dev = ap->a_head.a_dev; -/* minor device 0 is physical memory */ + switch (minor(dev)) { case 0: - return i386_btop(offset); - -/* minor device 1 is kernel memory */ + /* + * minor device 0 is physical memory + */ + ap->a_result = i386_btop(ap->a_offset); + return 0; case 1: - return i386_btop(vtophys(offset)); + /* + * minor device 1 is kernel memory + */ + ap->a_result = i386_btop(vtophys(ap->a_offset)); + return 0; default: - return -1; + return EINVAL; } } static int -mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +mmioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; switch (minor(dev)) { case 0: - return mem_ioctl(dev, cmd, data, flags, td); + return mem_ioctl(dev, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); case 3: case 4: - return random_ioctl(dev, cmd, data, flags, td); + return random_ioctl(dev, ap->a_cmd, ap->a_data, + ap->a_fflag, ap->a_cred); } return (ENODEV); } @@ -355,7 +368,7 @@ mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) * and mem_range_attr_set. */ static int -mem_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +mem_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) { int nd, error = 0; struct mem_range_op *mo = (struct mem_range_op *)data; @@ -449,7 +462,7 @@ mem_range_AP_init(void) #endif static int -random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) { int error; int intr; @@ -466,7 +479,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_SETIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -474,7 +487,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_CLEARIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -485,7 +498,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) break; case MEM_FINDIRQ: intr = *(int16_t *)data; - if ((error = suser(td)) != 0) + if ((error = suser_cred(cred, 0)) != 0) break; if (intr < 0 || intr >= MAX_INTS) return (EINVAL); @@ -502,22 +515,29 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) } int -mmpoll(dev_t dev, int events, struct thread *td) +mmpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; + int revents; + switch (minor(dev)) { case 3: /* /dev/random */ - return random_poll(dev, events, td); + revents = random_poll(dev, ap->a_events); + break; case 4: /* /dev/urandom */ default: - return seltrue(dev, events, td); + revents = seltrue(dev, ap->a_events); + break; } + ap->a_events = revents; + return (0); } int iszerodev(dev) dev_t dev; { - return ((major(dev) == mem_cdevsw.d_maj) + return ((major(dev) == mem_ops.head.maj) && minor(dev) == 12); } @@ -529,14 +549,14 @@ mem_drvinit(void *unused) if (mem_range_softc.mr_op != NULL) mem_range_softc.mr_op->init(&mem_range_softc); - cdevsw_add(&mem_cdevsw, 0xf0, 0); - make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM, 0640, "mem"); - make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); - make_dev(&mem_cdevsw, 2, UID_ROOT, GID_WHEEL, 0666, "null"); - make_dev(&mem_cdevsw, 3, UID_ROOT, GID_WHEEL, 0644, "random"); - make_dev(&mem_cdevsw, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); - make_dev(&mem_cdevsw, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); - make_dev(&mem_cdevsw, 14, UID_ROOT, GID_WHEEL, 0600, "io"); + dev_ops_add(&mem_ops, 0xf0, 0); + make_dev(&mem_ops, 0, UID_ROOT, GID_KMEM, 0640, "mem"); + make_dev(&mem_ops, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); + make_dev(&mem_ops, 2, UID_ROOT, GID_WHEEL, 0666, "null"); + make_dev(&mem_ops, 3, UID_ROOT, GID_WHEEL, 0644, "random"); + make_dev(&mem_ops, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); + make_dev(&mem_ops, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); + make_dev(&mem_ops, 14, UID_ROOT, GID_WHEEL, 0600, "io"); } SYSINIT(memdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,mem_drvinit,NULL) diff --git a/sys/platform/pc32/i386/perfmon.c b/sys/platform/pc32/i386/perfmon.c index 9a1e5b10bc..5948e25405 100644 --- a/sys/platform/pc32/i386/perfmon.c +++ b/sys/platform/pc32/i386/perfmon.c @@ -27,12 +27,13 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/i386/perfmon.c,v 1.21 1999/09/25 18:24:04 phk Exp $ - * $DragonFly: src/sys/platform/pc32/i386/perfmon.c,v 1.8 2004/05/19 22:52:57 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/perfmon.c,v 1.9 2006/07/28 02:17:39 dillon Exp $ */ #include #include #include +#include #include #include @@ -56,28 +57,16 @@ static int writectl5(int); static int writectl6(int); #endif -static d_close_t perfmon_close; -static d_open_t perfmon_open; -static d_ioctl_t perfmon_ioctl; +static d_close_t perfmon_close; +static d_open_t perfmon_open; +static d_ioctl_t perfmon_ioctl; #define CDEV_MAJOR 2 /* We're really a minor of mem.c */ -static struct cdevsw perfmon_cdevsw = { - /* name */ "perfmon", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ perfmon_open, - /* close */ perfmon_close, - /* read */ noread, - /* write */ nowrite, - /* ioctl */ perfmon_ioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops perfmon_ops = { + { "perfmon", CDEV_MAJOR, 0 }, + .d_open = perfmon_open, + .d_close = perfmon_close, + .d_ioctl = perfmon_ioctl, }; /* @@ -112,8 +101,8 @@ perfmon_init(void) #endif /* SMP */ /* NOTE: really a minor of mem. perfmon gets 32-47 */ - cdevsw_add(&perfmon_cdevsw, 0xf0, 32); - make_dev(&perfmon_cdevsw, 32, UID_ROOT, GID_KMEM, 0640, "perfmon"); + dev_ops_add(&perfmon_ops, 0xf0, 32); + make_dev(&perfmon_ops, 32, UID_ROOT, GID_KMEM, 0640, "perfmon"); } int @@ -290,12 +279,12 @@ static int writer; static int writerpmc; static int -perfmon_open(dev_t dev, int flags, int fmt, struct thread *td) +perfmon_open(struct dev_open_args *ap) { if (!perfmon_cpuok) return ENXIO; - if (flags & FWRITE) { + if (ap->a_oflags & FWRITE) { if (writer) { return EBUSY; } else { @@ -307,9 +296,9 @@ perfmon_open(dev_t dev, int flags, int fmt, struct thread *td) } static int -perfmon_close(dev_t dev, int flags, int fmt, struct thread *td) +perfmon_close(struct dev_close_args *ap) { - if (flags & FWRITE) { + if (ap->a_fflag & FWRITE) { int i; for (i = 0; i < NPMC; i++) { @@ -322,17 +311,18 @@ perfmon_close(dev_t dev, int flags, int fmt, struct thread *td) } static int -perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td) +perfmon_ioctl(struct dev_ioctl_args *ap) { + caddr_t param = ap->a_data; struct pmc *pmc; struct pmc_data *pmcd; struct pmc_tstamp *pmct; int *ip; int rv; - switch(cmd) { + switch(ap->a_cmd) { case PMIOSETUP: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; pmc = (struct pmc *)param; @@ -348,7 +338,7 @@ perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td break; case PMIOSTART: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; ip = (int *)param; @@ -356,7 +346,7 @@ perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td break; case PMIOSTOP: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; ip = (int *)param; @@ -364,7 +354,7 @@ perfmon_ioctl(dev_t dev, u_long cmd, caddr_t param, int flags, struct thread *td break; case PMIORESET: - if (!(flags & FWRITE)) + if (!(ap->a_fflag & FWRITE)) return EPERM; ip = (int *)param; diff --git a/sys/platform/pc32/isa/asc.c b/sys/platform/pc32/isa/asc.c index b498f179f2..ab8c62e01e 100644 --- a/sys/platform/pc32/isa/asc.c +++ b/sys/platform/pc32/isa/asc.c @@ -35,7 +35,7 @@ */ /* * $FreeBSD: src/sys/i386/isa/asc.c,v 1.42.2.2 2001/03/01 03:22:39 jlemon Exp $ - * $DragonFly: src/sys/platform/pc32/isa/asc.c,v 1.13 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/isa/asc.c,v 1.14 2006/07/28 02:17:39 dillon Exp $ */ #include "use_asc.h" @@ -187,23 +187,13 @@ static d_poll_t ascpoll; #define CDEV_MAJOR 71 -static struct cdevsw asc_cdevsw = { - /* name */ "asc", - /* maj */ CDEV_MAJOR, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ ascopen, - /* close */ ascclose, - /* read */ ascread, - /* write */ nowrite, - /* ioctl */ ascioctl, - /* poll */ ascpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops asc_ops = { + { "asc", CDEV_MAJOR, 0 }, + .d_open = ascopen, + .d_close = ascclose, + .d_read = ascread, + .d_ioctl = ascioctl, + .d_poll = ascpoll, }; #define STATIC static @@ -480,13 +470,13 @@ ascattach(struct isa_device *isdp) scu->selp.si_pid=(pid_t)0; #define ASC_UID 0 #define ASC_GID 13 - cdevsw_add(&asc_cdevsw, 0xc0, unit << 6); - make_dev(&asc_cdevsw, unit<<6, ASC_UID, ASC_GID, 0666, "asc%d", unit); - make_dev(&asc_cdevsw, ((unit<<6) + FRMT_PBM), + dev_ops_add(&asc_ops, 0xc0, unit << 6); + make_dev(&asc_ops, unit<<6, ASC_UID, ASC_GID, 0666, "asc%d", unit); + make_dev(&asc_ops, ((unit<<6) + FRMT_PBM), ASC_UID, ASC_GID, 0666, "asc%dp", unit); - make_dev(&asc_cdevsw, ((unit<<6) + DBUG_MASK), + make_dev(&asc_ops, ((unit<<6) + DBUG_MASK), ASC_UID, ASC_GID, 0666, "asc%dd", unit); - make_dev(&asc_cdevsw, ((unit<<6) + DBUG_MASK+FRMT_PBM), + make_dev(&asc_ops, ((unit<<6) + DBUG_MASK+FRMT_PBM), ASC_UID, ASC_GID, 0666, "asc%dpd", unit); return ATTACH_SUCCESS; } @@ -543,8 +533,9 @@ ascintr(void *arg) ***/ STATIC int -ascopen(dev_t dev, int flags, int fmt, struct thread *td) +ascopen(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; struct asc_unit *scu; int unit; @@ -638,8 +629,9 @@ asc_startread(struct asc_unit *scu) ***/ STATIC int -ascclose(dev_t dev, int flags, int fmt, struct thread *td) +ascclose(struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; @@ -696,8 +688,10 @@ pbm_init(struct asc_unit *scu) ***/ STATIC int -ascread(dev_t dev, struct uio *uio, int ioflag) +ascread(struct dev_read_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct uio *uio = ap->a_uio; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; size_t nbytes; @@ -785,8 +779,10 @@ ascread(dev_t dev, struct uio *uio, int ioflag) ***/ STATIC int -ascioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) +ascioctl(struct dev_ioctl_args *ap) { + dev_t dev = ap->a_head.a_dev; + caddr_t data = ap->a_data; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; @@ -798,7 +794,7 @@ ascioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) unit, scu->flags); return ENXIO; } - switch(cmd) { + switch(ap->a_cmd) { case ASC_GRES: asc_reset(scu); get_resolution(scu); @@ -850,22 +846,19 @@ ascioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td) } STATIC int -ascpoll(dev_t dev, int events, struct thread *td) +ascpoll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; int unit = UNIT(minor(dev)); struct asc_unit *scu = unittab + unit; - struct proc *p; struct proc *p1; int revents = 0; - p = td->td_proc; - KKASSERT(p); - crit_enter(); - if (events & (POLLIN | POLLRDNORM)) { + if (ap->a_events & (POLLIN | POLLRDNORM)) { if (scu->sbuf.count >0) - revents |= events & (POLLIN | POLLRDNORM); + revents |= ap->a_events & (POLLIN | POLLRDNORM); else { if (!(scu->flags & DMA_ACTIVE)) dma_restart(scu); @@ -874,9 +867,10 @@ ascpoll(dev_t dev, int events, struct thread *td) && p1->p_wchan == (caddr_t)&selwait) scu->selp.si_flags = SI_COLL; else - scu->selp.si_pid = p->p_pid; + scu->selp.si_pid = curproc->p_pid; } } crit_exit(); - return (revents); + ap->a_events = revents; + return (0); } diff --git a/sys/sys/buf.h b/sys/sys/buf.h index 7e42472417..45988f6b36 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -37,7 +37,7 @@ * * @(#)buf.h 8.9 (Berkeley) 3/30/95 * $FreeBSD: src/sys/sys/buf.h,v 1.88.2.10 2003/01/25 19:02:23 dillon Exp $ - * $DragonFly: src/sys/sys/buf.h,v 1.37 2006/05/25 19:31:14 dillon Exp $ + * $DragonFly: src/sys/sys/buf.h,v 1.38 2006/07/28 02:17:41 dillon Exp $ */ #ifndef _SYS_BUF_H_ @@ -380,9 +380,8 @@ int cluster_read (struct vnode *, off_t, off_t, int, int, int, struct buf **); int cluster_wbuild (struct vnode *, int, off_t, int); void cluster_write (struct buf *, off_t, int); -int physio (dev_t dev, struct uio *uio, int ioflag); -#define physread physio -#define physwrite physio +int physread (struct dev_read_args *); +int physwrite (struct dev_write_args *); void vfs_bio_set_validclean (struct buf *, int base, int size); void vfs_bio_clrbuf (struct buf *); void vfs_busy_pages (struct vnode *, struct buf *); diff --git a/sys/sys/conf.h b/sys/sys/conf.h index 50e3547081..fb099276d5 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -37,7 +37,7 @@ * * @(#)conf.h 8.5 (Berkeley) 1/9/95 * $FreeBSD: src/sys/sys/conf.h,v 1.103.2.6 2002/03/11 01:14:55 dd Exp $ - * $DragonFly: src/sys/sys/conf.h,v 1.10 2006/02/17 19:18:07 dillon Exp $ + * $DragonFly: src/sys/sys/conf.h,v 1.11 2006/07/28 02:17:41 dillon Exp $ */ #ifndef _SYS_CONF_H_ @@ -52,7 +52,7 @@ struct tty; struct disk; struct vnode; -struct lwkt_port; +struct dev_ops; struct specinfo { u_int si_flags; @@ -62,8 +62,7 @@ struct specinfo { char si_name[SPECNAMELEN + 1]; void *si_drv1; void *si_drv2; - struct cdevsw *si_devsw; /* direct device switch */ - struct lwkt_port *si_port; /* direct port dispatch */ + struct dev_ops *si_ops; /* device operations vector */ int si_iosize_max; /* maximum I/O size (for physio &al) */ int si_refs; union { @@ -110,114 +109,20 @@ struct bio; struct proc; struct uio; struct knote; - -/* - * Note: d_thread_t is provided as a transition aid for those drivers - * that treat struct proc/struct thread as an opaque data type and - * exist in substantially the same form in both 4.x and 5.x. Writers - * of drivers that dips into the d_thread_t structure should use - * struct thread or struct proc as appropriate for the version of the - * OS they are using. It is provided in lieu of each device driver - * inventing its own way of doing this. While it does violate style(9) - * in a number of ways, this violation is deemed to be less - * important than the benefits that a uniform API between releases - * gives. - * - * Users of struct thread/struct proc that aren't device drivers should - * not use d_thread_t. - */ +struct ucred; struct thread; -struct lwkt_port; - -typedef struct thread d_thread_t; -typedef int d_clone_t (dev_t dev); -typedef int d_open_t (dev_t dev, int oflags, int devtype, d_thread_t *td); -typedef int d_close_t (dev_t dev, int fflag, int devtype, d_thread_t *td); -typedef void d_strategy_t (dev_t dev, struct bio *bio); -typedef int d_ioctl_t (dev_t dev, u_long cmd, caddr_t data, - int fflag, d_thread_t *td); -typedef int d_dump_t (dev_t dev, u_int count, u_int blkno, u_int secsize); -typedef int d_psize_t (dev_t dev); - -typedef int d_read_t (dev_t dev, struct uio *uio, int ioflag); -typedef int d_write_t (dev_t dev, struct uio *uio, int ioflag); -typedef int d_poll_t (dev_t dev, int events, d_thread_t *td); -typedef int d_kqfilter_t (dev_t dev, struct knote *kn); -typedef int d_mmap_t (dev_t dev, vm_offset_t offset, int nprot); typedef int l_open_t (dev_t dev, struct tty *tp); typedef int l_close_t (struct tty *tp, int flag); typedef int l_read_t (struct tty *tp, struct uio *uio, int flag); typedef int l_write_t (struct tty *tp, struct uio *uio, int flag); -typedef int l_ioctl_t (struct tty *tp, u_long cmd, caddr_t data, - int flag, d_thread_t *td); +typedef int l_ioctl_t (struct tty *tp, u_long cmd, caddr_t data, int flag, + struct ucred *cred); typedef int l_rint_t (int c, struct tty *tp); typedef int l_start_t (struct tty *tp); typedef int l_modem_t (struct tty *tp, int flag); -/* - * Types for d_flags. - */ -#define D_TAPE 0x0001 -#define D_DISK 0x0002 -#define D_TTY 0x0004 -#define D_MEM 0x0008 - -#define D_TYPEMASK 0xffff - -/* - * Flags for d_flags. - */ -#define D_MEMDISK 0x00010000 /* memory type disk */ -#define D_NAGGED 0x00020000 /* nagged about missing make_dev() */ -#define D_CANFREE 0x00040000 /* can free blocks */ -#define D_TRACKCLOSE 0x00080000 /* track all closes */ -#define D_MASTER 0x00100000 /* used by pty/tty code */ -#define D_KQFILTER 0x00200000 /* has kqfilter entry */ - -/* - * Character device switch table. - * - * NOTE: positions are hard coded for static structure initialization. - */ -struct cdevsw { - const char *d_name; /* base device name, e.g. 'vn' */ - int d_maj; /* major (char) device number */ - u_int d_flags; /* D_ flags */ - struct lwkt_port *d_port; /* port (template only) */ - d_clone_t *d_clone; /* clone from base cdevsw */ - - /* - * Old style vectors are used only if d_port is NULL when the cdevsw - * is added to the system. They have been renamed to prevent misuse. - */ - d_open_t *old_open; - d_close_t *old_close; - d_read_t *old_read; - d_write_t *old_write; - d_ioctl_t *old_ioctl; - d_poll_t *old_poll; - d_mmap_t *old_mmap; - d_strategy_t *old_strategy; - d_dump_t *old_dump; - d_psize_t *old_psize; - d_kqfilter_t *old_kqfilter; - void (*old_dummy1)(void); /* expansion space */ - void (*old_dummy2)(void); - void (*old_dummy3)(void); - void (*old_dummy4)(void); - int d_refs; /* ref count */ - void *d_data; /* custom driver data */ -}; - -struct cdevlink { - struct cdevlink *next; - u_int mask; - u_int match; - struct cdevsw *devsw; -}; - /* * Line discipline switch table */ @@ -257,24 +162,9 @@ struct swdevt { #define sw_freed sw_flags /* XXX compat */ #ifdef _KERNEL -d_open_t noopen; -d_close_t noclose; -d_read_t noread; -d_write_t nowrite; -d_ioctl_t noioctl; -d_clone_t noclone; -d_mmap_t nommap; -d_kqfilter_t nokqfilter; -d_strategy_t nostrategy; -d_poll_t nopoll; -d_psize_t nopsize; -d_dump_t nodump; #define NUMCDEVSW 256 -d_open_t nullopen; -d_close_t nullclose; - l_ioctl_t l_nullioctl; l_read_t l_noread; l_write_t l_nowrite; @@ -295,28 +185,16 @@ static moduledata_t name##_mod = { \ }; \ DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE) -extern struct cdevsw dead_cdevsw; - -void compile_devsw(struct cdevsw *); -int cdevsw_add (struct cdevsw *, u_int mask, u_int match); -struct cdevsw *cdevsw_add_override (dev_t, u_int mask, u_int match); -struct lwkt_port *cdevsw_dev_override(dev_t dev, struct lwkt_port *port); - -int cdevsw_remove (struct cdevsw *, u_int mask, u_int match); -struct cdevsw *cdevsw_get (int x, int y); -void cdevsw_release (struct cdevsw *); int count_dev (dev_t dev); int count_udev (udev_t dev); void destroy_dev (dev_t dev); -void destroy_all_dev (struct cdevsw *, u_int mask, u_int match); void release_dev (dev_t dev); dev_t reference_dev (dev_t dev); -struct cdevsw *devsw (dev_t dev); +struct dev_ops *devsw (dev_t dev); const char *devtoname (dev_t dev); void freedev (dev_t dev); int iszerodev (dev_t dev); -dev_t make_dev (struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, const char *fmt, ...) __printflike(6, 7); -dev_t make_adhoc_dev (struct cdevsw *devsw, int minor); + dev_t make_sub_dev (dev_t dev, int minor); int lminor (dev_t dev); void setconf (void); diff --git a/sys/sys/device.h b/sys/sys/device.h index 38ea7229a1..5a1478efd5 100644 --- a/sys/sys/device.h +++ b/sys/sys/device.h @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/sys/device.h,v 1.5 2006/05/20 02:42:13 dillon Exp $ + * $DragonFly: src/sys/sys/device.h,v 1.6 2006/07/28 02:17:41 dillon Exp $ */ #ifndef _SYS_DEVICE_H_ @@ -40,183 +40,295 @@ #ifndef _SYS_TYPES_H_ #include #endif -#ifndef _SYS_MSGPORT_H_ -#include +#ifndef _SYS_SYSLINK_H_ +#include #endif /* - * This structure is at the base of every CDEVSW port message + * This structure is at the base of every device args structure */ -struct cdevmsg { - lwkt_msg msg; - dev_t dev; +struct dev_generic_args { + struct syslink_desc *a_desc; + dev_t a_dev; }; +typedef struct dev_generic_args dev_default_args; + /* - * int d_open(dev_t dev, int oflags, int devtype, thread_t td) + * int d_open(dev_t dev, int oflags, int devtype, struct ucred *cred) */ -struct cdevmsg_open { - struct cdevmsg msg; - int oflags; - int devtype; - struct thread *td; +struct dev_open_args { + struct dev_generic_args a_head; + int a_oflags; + int a_devtype; + struct ucred *a_cred; }; /* - * int d_close(dev_t dev, int fflag, int devtype, thread_t td) + * int d_close(dev_t dev, int fflag, int devtype) */ -struct cdevmsg_close { - struct cdevmsg msg; - int fflag; - int devtype; - struct thread *td; +struct dev_close_args { + struct dev_generic_args a_head; + int a_fflag; + int a_devtype; }; /* - * void d_strategy(dev_t dev, struct bio *bio) + * int d_read(dev_t dev, struct uio *uio, int ioflag) */ -struct cdevmsg_strategy { - struct cdevmsg msg; - struct bio *bio; +struct dev_read_args { + struct dev_generic_args a_head; + struct uio *a_uio; + int a_ioflag; }; /* - * int d_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, thread_t td) + * int d_write(dev_t dev, struct uio *uio, int ioflag) */ -struct cdevmsg_ioctl { - struct cdevmsg msg; - u_long cmd; - caddr_t data; - int fflag; - struct thread *td; +struct dev_write_args { + struct dev_generic_args a_head; + struct uio *a_uio; + int a_ioflag; }; /* - * void d_dump(dev_t dev) + * int d_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, + * struct ucred *cred) */ -struct cdevmsg_dump { - struct cdevmsg msg; - u_int count; - u_int blkno; - u_int secsize; +struct dev_ioctl_args { + struct dev_generic_args a_head; + u_long a_cmd; + caddr_t a_data; + int a_fflag; + struct ucred *a_cred; }; /* - * int d_psize(dev_t dev) + * int d_poll(dev_t dev, int events) */ -struct cdevmsg_psize { - struct cdevmsg msg; - int result; +struct dev_poll_args { + struct dev_generic_args a_head; + int a_events; }; /* - * int d_read(dev_t dev, struct uio *uio, int ioflag) + * int d_mmap(dev_t dev, vm_offset_t offset, int nprot) */ -struct cdevmsg_read { - struct cdevmsg msg; - struct uio *uio; - int ioflag; +struct dev_mmap_args { + struct dev_generic_args a_head; + vm_offset_t a_offset; + int a_nprot; + int a_result; /* page number */ }; /* - * int d_write(dev_t dev, struct uio *uio, int ioflag) + * void d_strategy(dev_t dev, struct bio *bio) */ -struct cdevmsg_write { - struct cdevmsg msg; - struct uio *uio; - int ioflag; +struct dev_strategy_args { + struct dev_generic_args a_head; + struct bio *a_bio; }; /* - * int d_poll(dev_t dev, int events, thread_t td) + * void d_dump(dev_t dev) */ -struct cdevmsg_poll { - struct cdevmsg msg; - int events; - struct thread *td; +struct dev_dump_args { + struct dev_generic_args a_head; + u_int a_count; + u_int a_blkno; + u_int a_secsize; +}; + +/* + * int d_psize(dev_t dev) + */ +struct dev_psize_args { + struct dev_generic_args a_head; + int a_result; }; /* * int d_kqfilter(dev_t dev, struct knote *kn) */ -struct cdevmsg_kqfilter { - struct cdevmsg msg; - struct knote *kn; - int result; +struct dev_kqfilter_args { + struct dev_generic_args a_head; + struct knote *a_kn; + int a_result; +}; + +struct dev_clone_args { + struct dev_generic_args a_head; }; /* - * int d_mmap(dev_t dev, vm_offset_t offset, int nprot) + * Typedefs to help drivers declare the driver routines and such + */ +typedef int d_default_t (struct dev_generic_args *ap); +typedef int d_open_t (struct dev_open_args *ap); +typedef int d_close_t (struct dev_close_args *ap); +typedef int d_read_t (struct dev_read_args *ap); +typedef int d_write_t (struct dev_write_args *ap); +typedef int d_ioctl_t (struct dev_ioctl_args *ap); +typedef int d_poll_t (struct dev_poll_args *ap); +typedef int d_mmap_t (struct dev_mmap_args *ap); +typedef int d_strategy_t (struct dev_strategy_args *ap); +typedef int d_dump_t (struct dev_dump_args *ap); +typedef int d_psize_t (struct dev_psize_args *ap); +typedef int d_kqfilter_t (struct dev_kqfilter_args *ap); +typedef int d_clone_t (struct dev_clone_args *ap); + +/* + * Character device switch table. + * + * NOTE: positions are hard coded for static structure initialization. + */ +struct dev_ops { + struct { + const char *name; /* base name, e.g. 'da' */ + int maj; /* major device number */ + u_int flags; /* D_XXX flags */ + void *data; /* custom driver data */ + int refs; /* ref count */ + } head; + +#define dev_ops_first_field d_default + d_default_t *d_default; + d_open_t *d_open; + d_close_t *d_close; + d_read_t *d_read; + d_write_t *d_write; + d_ioctl_t *d_ioctl; + d_poll_t *d_poll; + d_mmap_t *d_mmap; + d_strategy_t *d_strategy; + d_dump_t *d_dump; + d_psize_t *d_psize; + d_kqfilter_t *d_kqfilter; + d_clone_t *d_clone; /* clone from base dev_ops */ +#define dev_ops_last_field d_clone +}; + +/* + * Types for d_flags. */ -struct cdevmsg_mmap { - struct cdevmsg msg; - vm_offset_t offset; - int nprot; - int result; /* page number */ -}; - -union cdevallmsg { - struct lwkt_msg am_lmsg; - struct cdevmsg am_msg; - struct cdevmsg_open am_open; - struct cdevmsg_close am_close; - struct cdevmsg_strategy am_strategy; - struct cdevmsg_ioctl am_ioctl; - struct cdevmsg_dump am_dump; - struct cdevmsg_psize am_psize; - struct cdevmsg_read am_read; - struct cdevmsg_write am_write; - struct cdevmsg_poll am_poll; - struct cdevmsg_kqfilter am_kqfilter; - struct cdevmsg_mmap am_mmap; -}; - -typedef union cdevallmsg *cdevallmsg_t; -typedef struct cdevmsg *cdevmsg_t; -typedef struct cdevmsg_open *cdevmsg_open_t; -typedef struct cdevmsg_close *cdevmsg_close_t; -typedef struct cdevmsg_strategy *cdevmsg_strategy_t; -typedef struct cdevmsg_ioctl *cdevmsg_ioctl_t; -typedef struct cdevmsg_dump *cdevmsg_dump_t; -typedef struct cdevmsg_psize *cdevmsg_psize_t; -typedef struct cdevmsg_read *cdevmsg_read_t; -typedef struct cdevmsg_write *cdevmsg_write_t; -typedef struct cdevmsg_poll *cdevmsg_poll_t; -typedef struct cdevmsg_kqfilter *cdevmsg_kqfilter_t; -typedef struct cdevmsg_mmap *cdevmsg_mmap_t; - -#define CDEV_CMD_OPEN (MSG_CMD_CDEV|0x0001) -#define CDEV_CMD_CLOSE (MSG_CMD_CDEV|0x0002) -#define CDEV_CMD_STRATEGY (MSG_CMD_CDEV|0x0003) -#define CDEV_CMD_IOCTL (MSG_CMD_CDEV|0x0004) -#define CDEV_CMD_DUMP (MSG_CMD_CDEV|0x0005) -#define CDEV_CMD_PSIZE (MSG_CMD_CDEV|0x0006) -#define CDEV_CMD_READ (MSG_CMD_CDEV|0x0007) -#define CDEV_CMD_WRITE (MSG_CMD_CDEV|0x0008) -#define CDEV_CMD_POLL (MSG_CMD_CDEV|0x0009) -#define CDEV_CMD_KQFILTER (MSG_CMD_CDEV|0x000A) -#define CDEV_CMD_MMAP (MSG_CMD_CDEV|0x000B) +#define D_TAPE 0x0001 +#define D_DISK 0x0002 +#define D_TTY 0x0004 +#define D_MEM 0x0008 + +#define D_TYPEMASK 0xffff + +/* + * Flags for d_flags. + */ +#define D_MEMDISK 0x00010000 /* memory type disk */ +#define D_NAGGED 0x00020000 /* nagged about missing make_dev() */ +#define D_CANFREE 0x00040000 /* can free blocks */ +#define D_TRACKCLOSE 0x00080000 /* track all closes */ +#define D_MASTER 0x00100000 /* used by pty/tty code */ +#define D_KQFILTER 0x00200000 /* has kqfilter entry */ + +/* + * A union of all possible argument structures. + */ +union dev_args_union { + struct dev_generic_args du_head; + struct dev_open_args du_open; + struct dev_close_args du_close; + struct dev_read_args du_read; + struct dev_write_args du_write; + struct dev_ioctl_args du_ioctl; + struct dev_poll_args du_poll; + struct dev_mmap_args du_mmap; + struct dev_strategy_args du_strategy; + struct dev_dump_args du_dump; + struct dev_psize_args du_psize; + struct dev_kqfilter_args du_kqfilter; + struct dev_clone_args du_clone; +}; + +/* + * Linking structure for mask/match registration + */ +struct dev_ops_link { + struct dev_ops_link *next; + u_int mask; + u_int match; + struct dev_ops *ops; +}; #ifdef _KERNEL +extern struct dev_ops dead_dev_ops; + struct disk; -const char *dev_dname(dev_t dev); -struct lwkt_port *dev_dport(dev_t dev); -int dev_dflags(dev_t dev); -int dev_dmaj(dev_t dev); -int dev_dopen(dev_t dev, int oflags, int devtype, struct thread *td); -int dev_dclose(dev_t dev, int fflag, int devtype, struct thread *td); +int dev_dopen(dev_t dev, int oflags, int devtype, struct ucred *cred); +int dev_dclose(dev_t dev, int fflag, int devtype); void dev_dstrategy(dev_t dev, struct bio *bio); void dev_dstrategy_chain(dev_t dev, struct bio *bio); -int dev_dioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td); +int dev_dioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, + struct ucred *cred); int dev_ddump(dev_t dev); int dev_dpsize(dev_t dev); int dev_dread(dev_t dev, struct uio *uio, int ioflag); int dev_dwrite(dev_t dev, struct uio *uio, int ioflag); -int dev_dpoll(dev_t dev, int events, struct thread *td); +int dev_dpoll(dev_t dev, int events); int dev_dkqfilter(dev_t dev, struct knote *kn); int dev_dmmap(dev_t dev, vm_offset_t offset, int nprot); +int dev_dclone(dev_t dev); + +const char *dev_dname(dev_t dev); +int dev_dmaj(dev_t dev); +int dev_dflags(dev_t dev); +int dev_doperate(struct dev_generic_args *ap); +int dev_doperate_ops(struct dev_ops *, struct dev_generic_args *ap); + +d_default_t nodefault; +d_open_t noopen; +d_close_t noclose; +d_read_t noread; +d_write_t nowrite; +d_ioctl_t noioctl; +d_poll_t nopoll; +d_mmap_t nommap; +d_strategy_t nostrategy; +d_dump_t nodump; +d_psize_t nopsize; +d_kqfilter_t nokqfilter; +d_clone_t noclone; + +d_open_t nullopen; +d_close_t nullclose; + +extern struct syslink_desc dev_default_desc; +extern struct syslink_desc dev_open_desc; +extern struct syslink_desc dev_close_desc; +extern struct syslink_desc dev_read_desc; +extern struct syslink_desc dev_write_desc; +extern struct syslink_desc dev_ioctl_desc; +extern struct syslink_desc dev_dump_desc; +extern struct syslink_desc dev_psize_desc; +extern struct syslink_desc dev_poll_desc; +extern struct syslink_desc dev_mmap_desc; +extern struct syslink_desc dev_strategu_desc; +extern struct syslink_desc dev_kqfilter_desc; +extern struct syslink_desc dev_clone_desc; + +void compile_dev_ops(struct dev_ops *); +int dev_ops_add(struct dev_ops *, u_int mask, u_int match); +int dev_ops_remove(struct dev_ops *, u_int mask, u_int match); +void dev_ops_release(struct dev_ops *); +struct dev_ops *dev_ops_add_override(dev_t, struct dev_ops *, u_int, u_int); + +struct dev_ops *dev_ops_intercept(dev_t, struct dev_ops *); +void dev_ops_restore(dev_t, struct dev_ops *); +struct dev_ops *dev_ops_get(int x, int y); + +void destroy_all_devs(struct dev_ops *, u_int mask, u_int match); +dev_t make_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid, + int perms, const char *fmt, ...) __printflike(6, 7); +dev_t make_adhoc_dev (struct dev_ops *ops, int minor); #endif diff --git a/sys/sys/disk.h b/sys/sys/disk.h index 07eb6d7ded..132ad4faf1 100644 --- a/sys/sys/disk.h +++ b/sys/sys/disk.h @@ -39,7 +39,7 @@ * ---------------------------------------------------------------------------- * * $FreeBSD: src/sys/sys/disk.h,v 1.16.2.3 2001/06/20 16:11:01 scottl Exp $ - * $DragonFly: src/sys/sys/disk.h,v 1.7 2004/12/30 07:01:52 cpressey Exp $ + * $DragonFly: src/sys/sys/disk.h,v 1.8 2006/07/28 02:17:41 dillon Exp $ */ #ifndef _SYS_DISK_H_ @@ -62,9 +62,8 @@ #endif struct disk { - struct lwkt_port d_port; /* interception port */ - struct cdevsw *d_devsw; /* our device switch */ - struct cdevsw *d_rawsw; /* the raw device switch */ + struct dev_ops *d_dev_ops; /* our device switch */ + struct dev_ops *d_raw_ops; /* the raw device switch */ u_int d_flags; u_int d_dsflags; dev_t d_rawdev; /* backing raw device */ @@ -78,7 +77,7 @@ struct disk { #define DISKFLAG_WANTED 0x2 #ifdef _KERNEL -dev_t disk_create (int unit, struct disk *disk, int flags, struct cdevsw *sw); +dev_t disk_create (int unit, struct disk *disk, int flags, struct dev_ops *raw_ops); void disk_destroy (struct disk *disk); int disk_dumpcheck (dev_t dev, u_int *count, u_int *blkno, u_int *secsize); struct disk *disk_enumerate (struct disk *disk); diff --git a/sys/sys/random.h b/sys/sys/random.h index 23c37f10a9..a4f27586f6 100644 --- a/sys/sys/random.h +++ b/sys/sys/random.h @@ -2,7 +2,7 @@ * random.h -- A strong random number generator * * $FreeBSD: src/sys/sys/random.h,v 1.19.2.2 2002/09/17 17:11:54 sam Exp $ - * $DragonFly: src/sys/sys/random.h,v 1.8 2006/07/16 21:44:18 dillon Exp $ + * $DragonFly: src/sys/sys/random.h,v 1.9 2006/07/28 02:17:41 dillon Exp $ * * Version 0.95, last modified 18-Oct-95 * @@ -95,7 +95,7 @@ u_int read_random_unlimited(void *buf, u_int size); u_int write_random(const char *buf, u_int nbytes); #endif struct thread; -int random_poll(dev_t dev, int events, struct thread *td); +int random_poll(dev_t dev, int events); #endif /* _KERNEL */ diff --git a/sys/sys/systm.h b/sys/sys/systm.h index e0cfaba307..f514b30d1d 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -37,7 +37,7 @@ * * @(#)systm.h 8.7 (Berkeley) 3/29/95 * $FreeBSD: src/sys/sys/systm.h,v 1.111.2.18 2002/12/17 18:04:02 sam Exp $ - * $DragonFly: src/sys/sys/systm.h,v 1.38 2006/05/27 01:51:27 dillon Exp $ + * $DragonFly: src/sys/sys/systm.h,v 1.39 2006/07/28 02:17:41 dillon Exp $ */ #ifndef _SYS_SYSTM_H_ @@ -124,9 +124,7 @@ void backtrace(void); void mi_gdinit (struct globaldata *gd, int cpu); int dumpstatus (vm_offset_t addr, off_t count); int nullop (void); -int eopnotsupp (void); -int einval (void); -int seltrue (dev_t dev, int which, struct thread *td); +int seltrue (dev_t dev, int which); int ureadc (int, struct uio *); void *hashinit (int count, struct malloc_type *type, u_long *hashmask); void *phashinit (int count, struct malloc_type *type, u_long *nentries); diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 16cdc44e0a..759f4bcda8 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -37,7 +37,7 @@ * * @(#)tty.h 8.6 (Berkeley) 1/21/94 * $FreeBSD: src/sys/sys/tty.h,v 1.53.2.1 2001/02/26 04:23:21 jlemon Exp $ - * $DragonFly: src/sys/sys/tty.h,v 1.9 2006/06/10 20:00:17 dillon Exp $ + * $DragonFly: src/sys/sys/tty.h,v 1.10 2006/07/28 02:17:41 dillon Exp $ */ #ifndef _SYS_TTY_H_ @@ -49,6 +49,9 @@ #ifndef _SYS_SELINFO_H_ #include #endif +#ifdef _KERNEL +#include +#endif /* * Clists are character lists, which is a variable length linked list @@ -277,14 +280,14 @@ int ttylclose (struct tty *tp, int flag); struct tty *ttymalloc (struct tty *tp); int ttymodem (struct tty *tp, int flag); int ttyopen (dev_t device, struct tty *tp); -int ttypoll (dev_t dev, int events, struct thread *td); -int ttykqfilter (dev_t dev, struct knote *kn); -int ttyread (dev_t dev, struct uio *uio, int flag); +int ttypoll (struct dev_poll_args *); +int ttykqfilter (struct dev_kqfilter_args *); +int ttyread (struct dev_read_args *); void ttyregister (struct tty *tp); int ttysleep (struct tty *tp, void *chan, int slpflags, char *wmesg, int timeout); int ttywait (struct tty *tp); -int ttywrite (dev_t dev, struct uio *uio, int flag); +int ttywrite (struct dev_write_args *); int unputc (struct clist *q); #endif /* _KERNEL */ diff --git a/sys/sys/vfsops.h b/sys/sys/vfsops.h index 5383c52e27..b40a8018e4 100644 --- a/sys/sys/vfsops.h +++ b/sys/sys/vfsops.h @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/sys/vfsops.h,v 1.24 2006/07/19 06:08:07 dillon Exp $ + * $DragonFly: src/sys/sys/vfsops.h,v 1.25 2006/07/28 02:17:41 dillon Exp $ */ /* @@ -68,6 +68,7 @@ #include #endif +struct syslink_desc; struct vnode; struct thread; struct namecache; diff --git a/sys/vfs/coda/coda_fbsd.c b/sys/vfs/coda/coda_fbsd.c index 2e1f6d59b7..4465c9ae01 100644 --- a/sys/vfs/coda/coda_fbsd.c +++ b/sys/vfs/coda/coda_fbsd.c @@ -28,7 +28,7 @@ * * @(#) src/sys/coda/coda_fbsd.cr,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $ * $FreeBSD: src/sys/coda/coda_fbsd.c,v 1.18 1999/09/25 18:23:43 phk Exp $ - * $DragonFly: src/sys/vfs/coda/Attic/coda_fbsd.c,v 1.12 2006/07/19 05:59:54 dillon Exp $ + * $DragonFly: src/sys/vfs/coda/Attic/coda_fbsd.c,v 1.13 2006/07/28 02:17:41 dillon Exp $ * */ @@ -37,12 +37,13 @@ #include #include #include +#include +#include #include #include #include #include #include -#include #include #include @@ -66,23 +67,14 @@ #define VC_DEV_NO 93 -static struct cdevsw codadevsw = { - /* name */ "Coda", - /* maj */ VC_DEV_NO, - /* flags */ 0, - /* port */ NULL, - /* clone */ NULL, - - /* open */ vc_nb_open, - /* close */ vc_nb_close, - /* read */ vc_nb_read, - /* write */ vc_nb_write, - /* ioctl */ vc_nb_ioctl, - /* poll */ vc_nb_poll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops coda_dev_ops = { + { "Coda", VC_DEV_NO, 0 }, + .d_open = vc_nb_open, + .d_close = vc_nb_close, + .d_read = vc_nb_read, + .d_write = vc_nb_write, + .d_ioctl = vc_nb_ioctl, + .d_poll = vc_nb_poll, }; int vcdebug = 1; @@ -93,10 +85,10 @@ codadev_modevent(module_t mod, int type, void *data) { switch (type) { case MOD_LOAD: - cdevsw_add(&codadevsw, 0, 0); + dev_ops_add(&coda_dev_ops, 0, 0); break; case MOD_UNLOAD: - cdevsw_remove(&codadevsw, 0, 0); + dev_ops_remove(&coda_dev_ops, 0, 0); break; default: break; diff --git a/sys/vfs/coda/coda_psdev.c b/sys/vfs/coda/coda_psdev.c index df39c6225c..f01d856e37 100644 --- a/sys/vfs/coda/coda_psdev.c +++ b/sys/vfs/coda/coda_psdev.c @@ -28,7 +28,7 @@ * * @(#) src/sys/coda/coda_psdev.c,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $ * $FreeBSD: src/sys/coda/coda_psdev.c,v 1.13 1999/09/29 15:03:46 marcel Exp $ - * $DragonFly: src/sys/vfs/coda/Attic/coda_psdev.c,v 1.11 2006/05/06 18:48:52 dillon Exp $ + * $DragonFly: src/sys/vfs/coda/Attic/coda_psdev.c,v 1.12 2006/07/28 02:17:41 dillon Exp $ * */ @@ -59,6 +59,8 @@ extern int coda_nc_initialized; /* Set if cache has been initialized */ #include #include +#include +#include #include #include #include @@ -66,7 +68,6 @@ extern int coda_nc_initialized; /* Set if cache has been initialized */ #include #include #include -#include #include "coda.h" #include "cnode.h" @@ -114,8 +115,10 @@ vcodaattach(int n) } int -vc_nb_open(dev_t dev, int flag, int mode, d_thread_t *td) +vc_nb_open(struct dev_open_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct vcomm *vcp; ENTRY; @@ -142,8 +145,9 @@ vc_nb_open(dev_t dev, int flag, int mode, d_thread_t *td) } int -vc_nb_close (dev_t dev, int flag, int mode, d_thread_t *td) +vc_nb_close (struct dev_close_args *ap) { + dev_t dev = ap->a_head.a_dev; struct vcomm *vcp; struct vmsg *vmp, *nvmp = NULL; struct coda_mntinfo *mi; @@ -214,7 +218,7 @@ vc_nb_close (dev_t dev, int flag, int mode, d_thread_t *td) #endif } - err = dounmount(mi->mi_vfsp, flag); + err = dounmount(mi->mi_vfsp, ap->a_fflag); if (err) myprintf(("Error %d unmounting vfs in vcclose(%d)\n", err, minor(dev))); @@ -222,9 +226,10 @@ vc_nb_close (dev_t dev, int flag, int mode, d_thread_t *td) } int -vc_nb_read(dev_t dev, struct uio *uiop, int flag) +vc_nb_read(struct dev_read_args *ap) { - struct vcomm * vcp; + dev_t dev = ap->a_head.a_dev; + struct vcomm *vcp; struct vmsg *vmp; int error = 0; @@ -241,8 +246,7 @@ vc_nb_read(dev_t dev, struct uio *uiop, int flag) vmp = (struct vmsg *)GETNEXT(vcp->vc_requests); /* Move the input args into userspace */ - uiop->uio_rw = UIO_READ; - error = uiomove(vmp->vm_data, vmp->vm_inSize, uiop); + error = uiomove(vmp->vm_data, vmp->vm_inSize, ap->a_uio); if (error) { myprintf(("vcread: error (%d) on uiomove\n", error)); error = EINVAL; @@ -273,9 +277,12 @@ vc_nb_read(dev_t dev, struct uio *uiop, int flag) } int -vc_nb_write(dev_t dev, struct uio *uiop, int flag) +vc_nb_write(struct dev_write_args *ap) { - struct vcomm * vcp; + dev_t dev = ap->a_head.a_dev; + struct uio *uiop = ap->a_uio; + + struct vcomm *vcp; struct vmsg *vmp; struct coda_out_hdr *out; u_long seq; @@ -291,7 +298,6 @@ vc_nb_write(dev_t dev, struct uio *uiop, int flag) vcp = &coda_mnttbl[minor(dev)].mi_vcomm; /* Peek at the opcode, unique without transfering the data. */ - uiop->uio_rw = UIO_WRITE; error = uiomove((caddr_t)buf, sizeof(int) * 2, uiop); if (error) { myprintf(("vcwrite: error (%d) on uiomove\n", error)); @@ -308,7 +314,6 @@ vc_nb_write(dev_t dev, struct uio *uiop, int flag) union outputArgs pbuf; /* get the rest of the data. */ - uiop->uio_rw = UIO_WRITE; error = uiomove((caddr_t)&pbuf.coda_purgeuser.oh.result, sizeof(pbuf) - (sizeof(int)*2), uiop); if (error) { myprintf(("vcwrite: error (%d) on uiomove (Op %ld seq %ld)\n", @@ -350,7 +355,6 @@ vc_nb_write(dev_t dev, struct uio *uiop, int flag) } buf[0] = uiop->uio_resid; /* Save this value. */ - uiop->uio_rw = UIO_WRITE; error = uiomove((caddr_t) &out->result, vmp->vm_outSize - (sizeof(int) * 2), uiop); if (error) { myprintf(("vcwrite: error (%d) on uiomove (op %ld seq %ld)\n", @@ -370,13 +374,13 @@ vc_nb_write(dev_t dev, struct uio *uiop, int flag) } int -vc_nb_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) +vc_nb_ioctl(struct dev_ioctl_args *ap) { ENTRY; - switch(cmd) { + switch(ap->a_cmd) { case CODARESIZE: { - struct coda_resize *data = (struct coda_resize *)addr; + struct coda_resize *data = (struct coda_resize *)ap->a_data; return(coda_nc_resize(data->hashsize, data->heapsize, IS_DOWNCALL)); break; } @@ -397,14 +401,14 @@ vc_nb_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } break; case CIOC_KERNEL_VERSION: - switch (*(u_int *)addr) { + switch (*(u_int *)ap->a_data) { case 0: - *(u_int *)addr = coda_kernel_version; + *(u_int *)ap->a_data = coda_kernel_version; return 0; break; case 1: case 2: - if (coda_kernel_version != *(u_int *)addr) + if (coda_kernel_version != *(u_int *)ap->a_data) return ENOENT; else return 0; @@ -419,8 +423,9 @@ vc_nb_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td) } int -vc_nb_poll(dev_t dev, int events, d_thread_t *td) +vc_nb_poll(struct dev_poll_args *ap) { + dev_t dev = ap->a_head.a_dev; struct vcomm *vcp; int event_msk = 0; @@ -431,15 +436,15 @@ vc_nb_poll(dev_t dev, int events, d_thread_t *td) vcp = &coda_mnttbl[minor(dev)].mi_vcomm; - event_msk = events & (POLLIN|POLLRDNORM); - if (!event_msk) - return(0); - - if (!EMPTY(vcp->vc_requests)) - return(events & (POLLIN|POLLRDNORM)); - - selrecord(td, &(vcp->vc_selproc)); - + event_msk = ap->a_events & (POLLIN|POLLRDNORM); + if (event_msk) { + if (!EMPTY(vcp->vc_requests)) { + ap->a_events &= (POLLIN|POLLRDNORM); + return(0); + } + selrecord(curthread, &(vcp->vc_selproc)); + } + ap->a_events = 0; return(0); } diff --git a/sys/vfs/coda/coda_psdev.h b/sys/vfs/coda/coda_psdev.h index fa92e3c957..2a9cbe673b 100644 --- a/sys/vfs/coda/coda_psdev.h +++ b/sys/vfs/coda/coda_psdev.h @@ -28,13 +28,13 @@ * * @(#) src/sys/coda/coda_psdev.c,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $ * $FreeBSD: src/sys/coda/coda_psdev.h,v 1.2 1999/08/28 00:40:55 peter Exp $ - * $DragonFly: src/sys/vfs/coda/Attic/coda_psdev.h,v 1.3 2003/06/23 17:55:26 dillon Exp $ + * $DragonFly: src/sys/vfs/coda/Attic/coda_psdev.h,v 1.4 2006/07/28 02:17:41 dillon Exp $ * */ -int vc_nb_open(dev_t dev, int flag, int mode, d_thread_t *td); -int vc_nb_close (dev_t dev, int flag, int mode, d_thread_t *td); -int vc_nb_read(dev_t dev, struct uio *uiop, int flag); -int vc_nb_write(dev_t dev, struct uio *uiop, int flag); -int vc_nb_ioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td); -int vc_nb_poll(dev_t dev, int events, d_thread_t *td); +d_open_t vc_nb_open; +d_close_t vc_nb_close; +d_read_t vc_nb_read; +d_write_t vc_nb_write; +d_ioctl_t vc_nb_ioctl; +d_poll_t vc_nb_poll; diff --git a/sys/vfs/coda/coda_vfsops.c b/sys/vfs/coda/coda_vfsops.c index d0cb710f26..dd783bf6e7 100644 --- a/sys/vfs/coda/coda_vfsops.c +++ b/sys/vfs/coda/coda_vfsops.c @@ -28,7 +28,7 @@ * * @(#) src/sys/cfs/coda_vfsops.c,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $ * $FreeBSD: src/sys/coda/coda_vfsops.c,v 1.24.2.1 2001/07/26 20:36:45 iedowse Exp $ - * $DragonFly: src/sys/vfs/coda/Attic/coda_vfsops.c,v 1.24 2006/05/06 18:48:52 dillon Exp $ + * $DragonFly: src/sys/vfs/coda/Attic/coda_vfsops.c,v 1.25 2006/07/28 02:17:41 dillon Exp $ * */ @@ -85,7 +85,6 @@ struct coda_op_stats coda_vfsopstats[CODA_VFSOPS_SIZE]; #define MRAK_INT_GEN(op) (coda_vfsopstats[op].gen_intrn++) extern int coda_nc_initialized; /* Set if cache has been initialized */ -extern int vc_nb_open (dev_t, int, int, d_thread_t *); int coda_vfsopstats_init(void) @@ -156,17 +155,6 @@ coda_mount(struct mount *vfsp, /* Allocated and initialized by mount(2) */ udev = dvp->v_udev; vrele(dvp); -#if 0 /* YYY huh? what paranoia is this? */ - /* - * See if the device table matches our expectations. - */ - if (devsw(dev)->d_open != vc_nb_open) - { - MARK_INT_FAIL(CODA_MOUNT_STATS); - return(ENXIO); - } -#endif - if (uminor(udev) >= NVCODA || uminor(udev) < 0) { MARK_INT_FAIL(CODA_MOUNT_STATS); return(ENXIO); diff --git a/sys/vfs/fdesc/fdesc_vnops.c b/sys/vfs/fdesc/fdesc_vnops.c index 4eda09eb91..fff5e4e678 100644 --- a/sys/vfs/fdesc/fdesc_vnops.c +++ b/sys/vfs/fdesc/fdesc_vnops.c @@ -36,7 +36,7 @@ * @(#)fdesc_vnops.c 8.9 (Berkeley) 1/21/94 * * $FreeBSD: src/sys/miscfs/fdesc/fdesc_vnops.c,v 1.47.2.1 2001/10/22 22:49:26 chris Exp $ - * $DragonFly: src/sys/vfs/fdesc/fdesc_vnops.c,v 1.31 2006/07/18 22:22:15 dillon Exp $ + * $DragonFly: src/sys/vfs/fdesc/fdesc_vnops.c,v 1.32 2006/07/28 02:17:41 dillon Exp $ */ /* @@ -489,7 +489,7 @@ done: static int fdesc_poll(struct vop_poll_args *ap) { - return seltrue(0, ap->a_events, curthread); + return seltrue(0, ap->a_events); } /* diff --git a/sys/vfs/gnu/ext2fs/ext2_vfsops.c b/sys/vfs/gnu/ext2fs/ext2_vfsops.c index 8de4e1c4f2..46b133d896 100644 --- a/sys/vfs/gnu/ext2fs/ext2_vfsops.c +++ b/sys/vfs/gnu/ext2fs/ext2_vfsops.c @@ -38,7 +38,7 @@ * * @(#)ffs_vfsops.c 8.8 (Berkeley) 4/18/94 * $FreeBSD: src/sys/gnu/ext2fs/ext2_vfsops.c,v 1.63.2.7 2002/07/01 00:18:51 iedowse Exp $ - * $DragonFly: src/sys/vfs/gnu/ext2fs/ext2_vfsops.c,v 1.44 2006/07/18 22:22:15 dillon Exp $ + * $DragonFly: src/sys/vfs/gnu/ext2fs/ext2_vfsops.c,v 1.45 2006/07/28 02:17:41 dillon Exp $ */ #include "opt_quota.h" @@ -78,7 +78,7 @@ extern struct vop_ops ext2_fifo_vops; static int ext2_fhtovp (struct mount *, struct fid *, struct vnode **); static int ext2_flushfiles (struct mount *mp, int flags); static int ext2_mount (struct mount *, char *, caddr_t, struct ucred *); -static int ext2_mountfs (struct vnode *, struct mount *); +static int ext2_mountfs (struct vnode *, struct mount *, struct ucred *); static int ext2_root(struct mount *, struct vnode **); static int ext2_reload (struct mount *mountp, struct ucred *cred); static int ext2_sbupdate (struct ext2mount *, int); @@ -367,7 +367,7 @@ ext2_mount(struct mount *mp, char *path, caddr_t data, struct ucred *cred) } if ((mp->mnt_flag & MNT_UPDATE) == 0) { - error = ext2_mountfs(devvp, mp); + error = ext2_mountfs(devvp, mp, cred); } else { if (devvp != ump->um_devvp) error = EINVAL; /* needs translation */ @@ -691,7 +691,7 @@ ext2_reload_scan2(struct mount *mp, struct vnode *vp, void *data) * Common code for mount and mountroot */ static int -ext2_mountfs(struct vnode *devvp, struct mount *mp) +ext2_mountfs(struct vnode *devvp, struct mount *mp, struct ucred *cred) { struct ext2mount *ump; struct buf *bp; @@ -731,7 +731,7 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) mp->mnt_iosize_max = dev->si_iosize_max; if (mp->mnt_iosize_max > MAXPHYS) mp->mnt_iosize_max = MAXPHYS; - if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, NOCRED) != 0) + if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, cred) != 0) size = DEV_BSIZE; else { havepart = 1; diff --git a/sys/vfs/isofs/cd9660/cd9660_vfsops.c b/sys/vfs/isofs/cd9660/cd9660_vfsops.c index f094d37bdc..20f09396d9 100644 --- a/sys/vfs/isofs/cd9660/cd9660_vfsops.c +++ b/sys/vfs/isofs/cd9660/cd9660_vfsops.c @@ -37,7 +37,7 @@ * * @(#)cd9660_vfsops.c 8.18 (Berkeley) 5/22/95 * $FreeBSD: src/sys/isofs/cd9660/cd9660_vfsops.c,v 1.74.2.7 2002/04/08 09:39:29 bde Exp $ - * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vfsops.c,v 1.37 2006/07/18 22:22:15 dillon Exp $ + * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vfsops.c,v 1.38 2006/07/28 02:17:41 dillon Exp $ */ #include @@ -114,16 +114,15 @@ iso_get_ssector(dev_t dev) { struct ioc_toc_header h; struct ioc_read_toc_single_entry t; - thread_t td = curthread; int i; - if (dev_dioctl(dev, CDIOREADTOCHEADER, (caddr_t)&h, FREAD, td) != 0) + if (dev_dioctl(dev, CDIOREADTOCHEADER, (caddr_t)&h, FREAD, proc0.p_ucred) != 0) return 0; for (i = h.ending_track; i >= 0; i--) { t.address_format = CD_LBA_FORMAT; t.track = i; - if (dev_dioctl(dev, CDIOREADTOCENTRY, (caddr_t)&t, FREAD, td) != 0) { + if (dev_dioctl(dev, CDIOREADTOCENTRY, (caddr_t)&t, FREAD, proc0.p_ucred) != 0) { return 0; } if ((t.entry.control & 4) != 0) diff --git a/sys/vfs/mfs/mfs_vfsops.c b/sys/vfs/mfs/mfs_vfsops.c index 439cf59054..c8e61b5b33 100644 --- a/sys/vfs/mfs/mfs_vfsops.c +++ b/sys/vfs/mfs/mfs_vfsops.c @@ -32,13 +32,14 @@ * * @(#)mfs_vfsops.c 8.11 (Berkeley) 6/19/95 * $FreeBSD: src/sys/ufs/mfs/mfs_vfsops.c,v 1.81.2.3 2001/07/04 17:35:21 tegge Exp $ - * $DragonFly: src/sys/vfs/mfs/mfs_vfsops.c,v 1.33 2006/07/18 22:22:15 dillon Exp $ + * $DragonFly: src/sys/vfs/mfs/mfs_vfsops.c,v 1.34 2006/07/28 02:17:41 dillon Exp $ */ #include #include #include +#include #include #include #include @@ -85,23 +86,13 @@ d_strategy_t mfsstrategy; #define MFS_CDEV_MAJOR 253 -static struct cdevsw mfs_cdevsw = { - /* name */ "MFS", - /* maj */ MFS_CDEV_MAJOR, - /* flags */ D_DISK, - /* port */ NULL, - /* clone */ NULL, - - /* open */ mfsopen, - /* close */ mfsclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ mfsstrategy, - /* dump */ nodump, - /* psize */ nopsize +static struct dev_ops mfs_ops = { + { "MFS", MFS_CDEV_MAJOR, D_DISK }, + .d_open = mfsopen, + .d_close = mfsclose, + .d_read = physread, + .d_write = physwrite, + .d_strategy = mfsstrategy, }; /* @@ -128,9 +119,11 @@ VFS_SET(mfs_vfsops, mfs, 0); * We allow the underlying MFS block device to be opened and read. */ int -mfsopen(dev_t dev, int flags, int mode, struct thread *td) +mfsopen(struct dev_open_args *ap) { - if (flags & FWRITE) + dev_t dev = ap->a_head.a_dev; + + if (ap->a_oflags & FWRITE) return(EROFS); if (dev->si_drv1) return(0); @@ -138,14 +131,16 @@ mfsopen(dev_t dev, int flags, int mode, struct thread *td) } int -mfsclose(dev_t dev, int flags, int mode, struct thread *td) +mfsclose(struct dev_close_args *ap) { return(0); } -void -mfsstrategy(dev_t dev, struct bio *bio) +int +mfsstrategy(struct dev_strategy_args *ap) { + dev_t dev = ap->a_head.a_dev; + struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; off_t boff = bio->bio_offset; off_t eoff = boff + bp->b_bcount; @@ -178,7 +173,7 @@ mfsstrategy(dev_t dev, struct bio *bio) */ bioq_insert_tail(&mfsp->bio_queue, bio); wakeup((caddr_t)mfsp); - return; + return(0); /* * Failure conditions on bio @@ -189,6 +184,7 @@ error: bp->b_flags |= B_ERROR | B_INVAL; done: biodone(bio); + return(0); } /* @@ -320,7 +316,7 @@ mfs_mount(struct mount *mp, char *path, caddr_t data, struct ucred *cred) ((curproc->p_pid & ~0xFF) << 8); devvp->v_type = VCHR; - dev = make_dev(&mfs_cdevsw, minnum, UID_ROOT, GID_WHEEL, 0600, + dev = make_dev(&mfs_ops, minnum, UID_ROOT, GID_WHEEL, 0600, "MFS%d", minnum >> 16); /* It is not clear that these will get initialized otherwise */ dev->si_bsize_phys = DEV_BSIZE; @@ -478,6 +474,6 @@ mfs_statfs(struct mount *mp, struct statfs *sbp, struct ucred *cred) static int mfs_init(struct vfsconf *vfsp) { - cdevsw_add(&mfs_cdevsw, 0, 0); + dev_ops_add(&mfs_ops, 0, 0); return (0); } diff --git a/sys/vfs/smbfs/smbfs_vfsops.c b/sys/vfs/smbfs/smbfs_vfsops.c index 9099d3b280..7cda039e91 100644 --- a/sys/vfs/smbfs/smbfs_vfsops.c +++ b/sys/vfs/smbfs/smbfs_vfsops.c @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/fs/smbfs/smbfs_vfsops.c,v 1.2.2.5 2003/01/17 08:20:26 tjr Exp $ - * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.28 2006/07/18 22:22:16 dillon Exp $ + * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.29 2006/07/28 02:17:41 dillon Exp $ */ #include "opt_netsmb.h" #ifndef NETSMB @@ -151,7 +151,7 @@ smbfs_mount(struct mount *mp, char *path, caddr_t data, struct ucred *cred) return error; } vcp = SSTOVC(ssp); - smb_share_unlock(ssp, 0, curthread); + smb_share_unlock(ssp, 0); mp->mnt_stat.f_iosize = SSTOVC(ssp)->vc_txmax; #ifdef SMBFS_USEZONE diff --git a/sys/vfs/specfs/spec_vnops.c b/sys/vfs/specfs/spec_vnops.c index 7e69acdb97..f168ff39df 100644 --- a/sys/vfs/specfs/spec_vnops.c +++ b/sys/vfs/specfs/spec_vnops.c @@ -32,7 +32,7 @@ * * @(#)spec_vnops.c 8.14 (Berkeley) 5/21/95 * $FreeBSD: src/sys/miscfs/specfs/spec_vnops.c,v 1.131.2.4 2001/02/26 04:23:20 jlemon Exp $ - * $DragonFly: src/sys/vfs/specfs/spec_vnops.c,v 1.46 2006/07/19 06:08:14 dillon Exp $ + * $DragonFly: src/sys/vfs/specfs/spec_vnops.c,v 1.47 2006/07/28 02:17:41 dillon Exp $ */ #include @@ -131,7 +131,7 @@ static void spec_getpages_iodone (struct bio *bio); * Open a special file. * * spec_open(struct vnode *a_vp, int a_mode, struct ucred *a_cred, - * struct file *a_fp, struct thread *a_td) + * struct file *a_fp) */ /* ARGSUSED */ static int @@ -240,7 +240,7 @@ spec_open(struct vop_open_args *ap) * only called for the last close unless D_TRACKCLOSE is set. */ VOP_UNLOCK(vp, 0); - error = dev_dopen(dev, ap->a_mode, S_IFCHR, curthread); + error = dev_dopen(dev, ap->a_mode, S_IFCHR, ap->a_cred); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); if (error) @@ -361,7 +361,7 @@ spec_write(struct vop_write_args *ap) * Device ioctl operation. * * spec_ioctl(struct vnode *a_vp, int a_command, caddr_t a_data, - * int a_fflag, struct ucred *a_cred, struct thread *a_td) + * int a_fflag, struct ucred *a_cred) */ /* ARGSUSED */ static int @@ -373,12 +373,11 @@ spec_ioctl(struct vop_ioctl_args *ap) return (EBADF); /* device was revoked */ return (dev_dioctl(dev, ap->a_command, ap->a_data, - ap->a_fflag,curthread)); + ap->a_fflag, ap->a_cred)); } /* - * spec_poll(struct vnode *a_vp, int a_events, struct ucred *a_cred, - * struct thread *a_td) + * spec_poll(struct vnode *a_vp, int a_events, struct ucred *a_cred) */ /* ARGSUSED */ static int @@ -388,7 +387,7 @@ spec_poll(struct vop_poll_args *ap) if ((dev = ap->a_vp->v_rdev) == NULL) return (EBADF); /* device was revoked */ - return (dev_dpoll(dev, ap->a_events, curthread)); + return (dev_dpoll(dev, ap->a_events)); } /* @@ -584,7 +583,7 @@ spec_close(struct vop_close_args *ap) needrelock = 1; VOP_UNLOCK(vp, 0); } - error = dev_dclose(dev, ap->a_fflag, S_IFCHR, curthread); + error = dev_dclose(dev, ap->a_fflag, S_IFCHR); if (needrelock) vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); } else { diff --git a/sys/vfs/ufs/ffs_vfsops.c b/sys/vfs/ufs/ffs_vfsops.c index a3b16b33a6..b510baed4a 100644 --- a/sys/vfs/ufs/ffs_vfsops.c +++ b/sys/vfs/ufs/ffs_vfsops.c @@ -32,7 +32,7 @@ * * @(#)ffs_vfsops.c 8.31 (Berkeley) 5/20/95 * $FreeBSD: src/sys/ufs/ffs/ffs_vfsops.c,v 1.117.2.10 2002/06/23 22:34:52 iedowse Exp $ - * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.45 2006/07/18 22:22:16 dillon Exp $ + * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.46 2006/07/28 02:17:41 dillon Exp $ */ #include "opt_quota.h" @@ -470,7 +470,7 @@ ffs_reload(struct mount *mp, struct ucred *cred) /* * Step 2: re-read superblock from disk. */ - if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, NOCRED) != 0) + if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, cred) != 0) size = DEV_BSIZE; else size = dpart.disklab->d_secsize;