Deleted Added
full compact
29c29
< __FBSDID("$FreeBSD: head/sys/dev/io/iodev.c 202097 2010-01-11 18:10:13Z marcel $");
---
> __FBSDID("$FreeBSD: head/sys/dev/io/iodev.c 207329 2010-04-28 15:38:01Z attilio $");
33d32
< #include <sys/fcntl.h>
35,36c34
< #include <sys/lock.h>
< #include <sys/malloc.h>
---
> #include <sys/ioccom.h>
38c36
< #include <sys/mutex.h>
---
> #include <sys/priv.h>
40d37
< #include <sys/signalvar.h>
42d38
< #include <sys/uio.h>
44,46d39
< #include <vm/vm.h>
< #include <vm/pmap.h>
<
48a42,53
> #include <dev/io/iodev.h>
>
> static int ioopen(struct cdev *dev, int flags, int fmt,
> struct thread *td);
> static int ioclose(struct cdev *dev, int flags, int fmt,
> struct thread *td);
> static int ioioctl(struct cdev *dev, u_long cmd, caddr_t data,
> int fflag, struct thread *td);
>
> static int iopio_read(struct iodev_pio_req *req);
> static int iopio_write(struct iodev_pio_req *req);
>
60a66,188
> ioopen(struct cdev *dev __unused, int flags __unused, int fmt __unused,
> struct thread *td)
> {
> int error;
>
> error = priv_check(td, PRIV_IO);
> if (error != 0)
> return (error);
> error = securelevel_gt(td->td_ucred, 0);
> if (error != 0)
> return (error);
> error = iodev_open(td);
>
> return (error);
> }
>
> /* ARGSUSED */
> static int
> ioclose(struct cdev *dev __unused, int flags __unused, int fmt __unused,
> struct thread *td)
> {
>
> return (iodev_close(td));
> }
>
> /* ARGSUSED */
> static int
> ioioctl(struct cdev *dev __unused, u_long cmd, caddr_t data,
> int fflag __unused, struct thread *td __unused)
> {
> struct iodev_pio_req *pio_req;
> int error;
>
> switch (cmd) {
> case IODEV_PIO:
> pio_req = (struct iodev_pio_req *)data;
> switch (pio_req->access) {
> case IODEV_PIO_READ:
> error = iopio_read(pio_req);
> break;
> case IODEV_PIO_WRITE:
> error = iopio_write(pio_req);
> break;
> default:
> error = EINVAL;
> break;
> }
> break;
> default:
> error = iodev_ioctl(cmd, data);
> }
>
> return (error);
> }
>
> static int
> iopio_read(struct iodev_pio_req *req)
> {
>
> switch (req->width) {
> case 1:
> req->val = iodev_read_1(req->port);
> break;
> case 2:
> if (req->port & 1) {
> req->val = iodev_read_1(req->port);
> req->val |= iodev_read_1(req->port + 1) << 8;
> } else
> req->val = iodev_read_2(req->port);
> break;
> case 4:
> if (req->port & 1) {
> req->val = iodev_read_1(req->port);
> req->val |= iodev_read_2(req->port + 1) << 8;
> req->val |= iodev_read_1(req->port + 3) << 24;
> } else if (req->port & 2) {
> req->val = iodev_read_2(req->port);
> req->val |= iodev_read_2(req->port + 2) << 16;
> } else
> req->val = iodev_read_4(req->port);
> break;
> default:
> return (EINVAL);
> }
>
> return (0);
> }
>
> static int
> iopio_write(struct iodev_pio_req *req)
> {
>
> switch (req->width) {
> case 1:
> iodev_write_1(req->port, req->val);
> break;
> case 2:
> if (req->port & 1) {
> iodev_write_1(req->port, req->val);
> iodev_write_1(req->port + 1, req->val >> 8);
> } else
> iodev_write_2(req->port, req->val);
> break;
> case 4:
> if (req->port & 1) {
> iodev_write_1(req->port, req->val);
> iodev_write_2(req->port + 1, req->val >> 8);
> iodev_write_1(req->port + 3, req->val >> 24);
> } else if (req->port & 2) {
> iodev_write_2(req->port, req->val);
> iodev_write_2(req->port + 2, req->val >> 16);
> } else
> iodev_write_4(req->port, req->val);
> break;
> default:
> return (EINVAL);
> }
>
> return (0);
> }
>
> /* ARGSUSED */
> static int