summaryrefslogtreecommitdiff
path: root/sys/dev/pud
diff options
context:
space:
mode:
authorpooka <pooka@NetBSD.org>2007-11-22 11:26:27 +0000
committerpooka <pooka@NetBSD.org>2007-11-22 11:26:27 +0000
commit2bde3fa647019bc1a6bbec14ec01a95f70f26d4e (patch)
tree2c715e34a9b72b5e35630b0ddd2a569344722c8e /sys/dev/pud
parenta3dbd7068389525e501a4fdce27cea30ad5fe148 (diff)
Support bdev/cdev ioctl.
Diffstat (limited to 'sys/dev/pud')
-rw-r--r--sys/dev/pud/pud_dev.c52
-rw-r--r--sys/dev/pud/pud_msgif.h20
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_ */