diff options
| author | pooka <pooka@NetBSD.org> | 2007-11-22 11:26:27 +0000 |
|---|---|---|
| committer | pooka <pooka@NetBSD.org> | 2007-11-22 11:26:27 +0000 |
| commit | 2bde3fa647019bc1a6bbec14ec01a95f70f26d4e (patch) | |
| tree | 2c715e34a9b72b5e35630b0ddd2a569344722c8e /sys/dev/pud | |
| parent | a3dbd7068389525e501a4fdce27cea30ad5fe148 (diff) | |
Support bdev/cdev ioctl.
Diffstat (limited to 'sys/dev/pud')
| -rw-r--r-- | sys/dev/pud/pud_dev.c | 52 | ||||
| -rw-r--r-- | sys/dev/pud/pud_msgif.h | 20 |
2 files changed, 53 insertions, 19 deletions
diff --git a/sys/dev/pud/pud_dev.c b/sys/dev/pud/pud_dev.c index a1e065dcf8f..f52e664b055 100644 --- a/sys/dev/pud/pud_dev.c +++ b/sys/dev/pud/pud_dev.c @@ -1,4 +1,4 @@ -/* $NetBSD: pud_dev.c,v 1.3 2007/11/21 18:10:48 pooka Exp $ */ +/* $NetBSD: pud_dev.c,v 1.4 2007/11/22 11:26:27 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -29,20 +29,25 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pud_dev.c,v 1.3 2007/11/21 18:10:48 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pud_dev.c,v 1.4 2007/11/22 11:26:27 pooka Exp $"); #include <sys/param.h> #include <sys/buf.h> #include <sys/conf.h> #include <sys/event.h> +#include <sys/ioccom.h> #include <sys/kmem.h> #include <sys/poll.h> #include <sys/socketvar.h> #include <dev/pud/pud_sys.h> +/* + * b/c independent helpers + */ + static int -openclose(dev_t dev, int flags, int fmt, int class, int type) +doopenclose(dev_t dev, int flags, int fmt, int class, int type) { struct pud_req_openclose pc_oc; /* XXX: stack = stupid */ @@ -52,6 +57,33 @@ openclose(dev_t dev, int flags, int fmt, int class, int type) return pud_request(dev, &pc_oc, sizeof(pc_oc), class, type); } +static int +doioctl(dev_t dev, u_long cmd, void *data, int flag, int class, int type) +{ + struct pud_req_ioctl *pc_ioctl; + size_t dlen, allocsize; + int error; + + dlen = IOCPARM_LEN(cmd); + allocsize = sizeof(struct pud_req_ioctl) + dlen; + pc_ioctl = kmem_zalloc(allocsize, KM_SLEEP); + + pc_ioctl->pm_iocmd = cmd; + pc_ioctl->pm_flag = flag; + + if (cmd & IOC_IN) + memcpy(pc_ioctl->pm_data, data, dlen); + error = pud_request(dev, pc_ioctl, allocsize, class, type); + if (error) + goto out; + if (cmd & IOC_OUT) + memcpy(data, pc_ioctl->pm_data, dlen); + + out: + kmem_free(pc_ioctl, allocsize); + return error; +} + /* * Block de-vices */ @@ -80,14 +112,14 @@ static int pud_bdev_open(dev_t dev, int flags, int fmt, lwp_t *l) { - return openclose(dev, flags, fmt, PUD_REQ_BDEV, PUD_BDEV_OPEN); + return doopenclose(dev, flags, fmt, PUD_REQ_BDEV, PUD_BDEV_OPEN); } static int pud_bdev_close(dev_t dev, int flags, int fmt, lwp_t *l) { - return openclose(dev, flags, fmt, PUD_REQ_BDEV, PUD_BDEV_CLOSE); + return doopenclose(dev, flags, fmt, PUD_REQ_BDEV, PUD_BDEV_CLOSE); } static void @@ -128,10 +160,10 @@ pud_bdev_strategy(struct buf *bp) } int -pud_bdev_ioctl(dev_t dev, u_long cmd, void *data, int dlen, lwp_t *l) +pud_bdev_ioctl(dev_t dev, u_long cmd, void *data, int flag, lwp_t *l) { - return EOPNOTSUPP; + return doioctl(dev, cmd, data, flag, PUD_REQ_BDEV, PUD_BDEV_IOCTL); } /* hnmmm */ @@ -184,14 +216,14 @@ static int pud_cdev_open(dev_t dev, int flags, int fmt, lwp_t *l) { - return openclose(dev, flags, fmt, PUD_REQ_CDEV, PUD_CDEV_OPEN); + return doopenclose(dev, flags, fmt, PUD_REQ_CDEV, PUD_CDEV_OPEN); } static int pud_cdev_close(dev_t dev, int flags, int fmt, lwp_t *l) { - return openclose(dev, flags, fmt, PUD_REQ_CDEV, PUD_CDEV_OPEN); + return doopenclose(dev, flags, fmt, PUD_REQ_CDEV, PUD_CDEV_OPEN); } static int @@ -259,7 +291,7 @@ static int pud_cdev_ioctl(dev_t dev, u_long cmd, void *data, int flag, lwp_t *l) { - return EOPNOTSUPP; + return doioctl(dev, cmd, data, flag, PUD_REQ_CDEV, PUD_CDEV_IOCTL); } static paddr_t diff --git a/sys/dev/pud/pud_msgif.h b/sys/dev/pud/pud_msgif.h index 8ffcd9b61e3..7f032bb4405 100644 --- a/sys/dev/pud/pud_msgif.h +++ b/sys/dev/pud/pud_msgif.h @@ -1,4 +1,4 @@ -/* $NetBSD: pud_msgif.h,v 1.2 2007/11/21 18:10:48 pooka Exp $ */ +/* $NetBSD: pud_msgif.h,v 1.3 2007/11/22 11:26:27 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -79,6 +79,15 @@ struct pud_req_readwrite { uint8_t pm_data[0]; }; +struct pud_req_ioctl { + struct pud_req pm_pdr; + + u_long pm_iocmd; + int pm_flag; /* XXX: I feel like a cargo cult */ + + uint8_t pm_data[0]; +}; + #define PUD_DEVNAME_MAX 31 struct pud_conf_reg { struct pud_req pm_pdr; @@ -89,13 +98,6 @@ struct pud_conf_reg { }; #define PUD_CONFFLAG_BDEV 1 -struct pud_conf_ioctl { - struct pud_req pm_pdr; - - u_long pm_iocmd; - size_t pm_dsize; -}; - enum { PUD_CDEV_OPEN, PUD_CDEV_CLOSE, PUD_CDEV_READ, PUD_CDEV_WRITE, PUD_CDEV_IOCTL, PUD_CDEV_POLL, PUD_CDEV_MMAP, PUD_CDEV_KQFILTER, @@ -108,7 +110,7 @@ enum { }; enum { - PUD_CONF_REG, PUD_CONF_DEREG, PUD_CONF_IOCTL, PUD_CONF_MMAP, + PUD_CONF_REG, PUD_CONF_DEREG, PUD_CONF_MMAP, }; #endif /* _DEV_PUD_PUDMSGIF_H_ */ |
