diff options
author | phk <phk@FreeBSD.org> | 2004-06-04 15:25:36 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-06-04 15:25:36 +0000 |
commit | 0cd8626a9e713fa77653c5a005a4fd4b90fbacc5 (patch) | |
tree | cbc1687af680530a4b0c5fcbafaad9692a50e4fa /sys | |
parent | cd67996294550903867924d399dc8f27db616873 (diff) | |
download | FreeBSD-src-0cd8626a9e713fa77653c5a005a4fd4b90fbacc5.zip FreeBSD-src-0cd8626a9e713fa77653c5a005a4fd4b90fbacc5.tar.gz |
Move the line discipline related stuff out of <sys/conf.h> and into
<sys/linedisc.h> (repocopied).
Temporarily use a nested include from <sys/tty.h> to get <sys/linedisc.h>
into relevant source files.
Introduce a set of inline functions named ttyld_...() to invoke
linedisc methods instead of groping around in the linesw array.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/sys/conf.h | 35 | ||||
-rw-r--r-- | sys/sys/linedisc.h | 313 | ||||
-rw-r--r-- | sys/sys/tty.h | 5 |
3 files changed, 50 insertions, 303 deletions
diff --git a/sys/sys/conf.h b/sys/sys/conf.h index c45b141..acbd04b 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -159,16 +159,6 @@ typedef int d_kqfilter_t(dev_t dev, struct knote *kn); typedef int d_mmap_t(dev_t dev, vm_offset_t offset, vm_paddr_t *paddr, 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, struct thread *td); -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); - typedef int dumper_t( void *priv, /* Private to the driver. */ void *virtual, /* Virtual (mapped) address. */ @@ -239,27 +229,6 @@ struct cdevsw { int d_refcount; }; -/* - * Line discipline switch table - */ -struct linesw { - l_open_t *l_open; - l_close_t *l_close; - l_read_t *l_read; - l_write_t *l_write; - l_ioctl_t *l_ioctl; - l_rint_t *l_rint; - l_start_t *l_start; - l_modem_t *l_modem; - u_char l_hotchar; -}; - -extern struct linesw linesw[]; -extern int nlinesw; - -int ldisc_register(int , struct linesw *); -void ldisc_deregister(int); -#define LDISC_LOAD -1 /* Loadable line discipline */ #endif /* _KERNEL */ #ifdef _KERNEL @@ -272,10 +241,6 @@ void ldisc_deregister(int); */ #define MAJOR_AUTO 0 /* XXX: Not GM */ -l_ioctl_t l_nullioctl; -l_read_t l_noread; -l_write_t l_nowrite; - struct module; struct devsw_module_data { diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h index c45b141..7fb8732 100644 --- a/sys/sys/linedisc.h +++ b/sys/sys/linedisc.h @@ -1,7 +1,7 @@ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. - * Copyright (c) 2000 + * Copyright (c) 2004 * Poul-Henning Kamp. All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed @@ -37,127 +37,12 @@ * $FreeBSD$ */ -#ifndef _SYS_CONF_H_ -#define _SYS_CONF_H_ +#ifndef _SYS_LINEDISC_H_ +#define _SYS_LINEDISC_H_ #ifdef _KERNEL -#include <sys/eventhandler.h> struct tty; -struct disk; -struct vnode; -struct buf; -TAILQ_HEAD(snaphead, inode); - -struct cdev { - u_int si_flags; -#define SI_STASHED 0x0001 /* created in stashed storage */ -#define SI_ALIAS 0x0002 /* carrier of alias name */ -#define SI_NAMED 0x0004 /* make_dev{_alias} has been called */ -#define SI_CHEAPCLONE 0x0008 /* can be removed_dev'ed when vnode reclaims */ -#define SI_CHILD 0x0010 /* child of another dev_t */ -#define SI_DEVOPEN 0x0020 /* opened by device */ -#define SI_CONSOPEN 0x0040 /* opened by console */ -#define SI_DUMPDEV 0x0080 /* is kernel dumpdev */ -#define SI_CANDELETE 0x0100 /* can do BIO_DELETE */ -#define SI_CLONELIST 0x0200 /* on a clone list */ - struct timespec si_atime; - struct timespec si_ctime; - struct timespec si_mtime; - udev_t si_udev; - int si_refcount; - LIST_ENTRY(cdev) si_list; - LIST_ENTRY(cdev) si_clone; - LIST_ENTRY(cdev) si_hash; - SLIST_HEAD(, vnode) si_hlist; - LIST_HEAD(, cdev) si_children; - LIST_ENTRY(cdev) si_siblings; - dev_t si_parent; - u_int si_inode; - char *si_name; - void *si_drv1, *si_drv2; - struct cdevsw *si_devsw; - int si_iosize_max; /* maximum I/O size (for physio &al) */ - u_int si_stripesize; - u_int si_stripeoffset; - uid_t si_uid; - gid_t si_gid; - mode_t si_mode; - u_long si_usecount; - union { - struct { - struct tty *__sit_tty; - } __si_tty; - struct { - struct mount *__sid_mountpoint; - int __sid_bsize_phys; /* min physical block size */ - int __sid_bsize_best; /* optimal block size */ - struct snaphead __sid_snapshots; - daddr_t __sid_snaplistsize; /* size of snapblklist. */ - daddr_t *__sid_snapblklist; /* known snapshot blocks. */ - int (*__sid_copyonwrite)(struct vnode *, struct buf *); - } __si_disk; - } __si_u; - char __si_namebuf[SPECNAMELEN + 1]; -}; - -#define si_tty __si_u.__si_tty.__sit_tty -#define si_mountpoint __si_u.__si_disk.__sid_mountpoint -#define si_bsize_phys __si_u.__si_disk.__sid_bsize_phys -#define si_bsize_best __si_u.__si_disk.__sid_bsize_best -#define si_snapshots __si_u.__si_disk.__sid_snapshots -#define si_snaplistsize __si_u.__si_disk.__sid_snaplistsize -#define si_snapblklist __si_u.__si_disk.__sid_snapblklist -#define si_copyonwrite __si_u.__si_disk.__sid_copyonwrite - -/* - * Special device management - */ -#define SPECHSZ 64 -#define SPECHASH(rdev) (((unsigned)(minor(rdev)))%SPECHSZ) - -/* - * Definitions of device driver entry switches - */ - -struct bio; -struct buf; -struct thread; -struct uio; -struct knote; -struct clonedevs; - -/* - * 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. - */ - -typedef struct thread d_thread_t; - -typedef int d_open_t(dev_t dev, int oflags, int devtype, struct thread *td); -typedef int d_fdopen_t(dev_t dev, int oflags, struct thread *td, int fdidx); -typedef int d_close_t(dev_t dev, int fflag, int devtype, struct thread *td); -typedef void d_strategy_t(struct bio *bp); -typedef int d_ioctl_t(dev_t dev, u_long cmd, caddr_t data, - int fflag, struct thread *td); - -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, struct thread *td); -typedef int d_kqfilter_t(dev_t dev, struct knote *kn); -typedef int d_mmap_t(dev_t dev, vm_offset_t offset, vm_paddr_t *paddr, - int nprot); typedef int l_open_t(dev_t dev, struct tty *tp); typedef int l_close_t(struct tty *tp, int flag); @@ -169,76 +54,6 @@ 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); -typedef int dumper_t( - void *priv, /* Private to the driver. */ - void *virtual, /* Virtual (mapped) address. */ - vm_offset_t physical, /* Physical address of virtual. */ - off_t offset, /* Byte-offset to write at. */ - size_t length); /* Number of bytes to dump. */ - -#define DEV_STRATEGY(bp) dev_strategy(bp) - -#endif /* _KERNEL */ - -/* - * Types for d_flags. - */ -#define D_TAPE 0x0001 -#define D_DISK 0x0002 -#define D_TTY 0x0004 -#define D_MEM 0x0008 - -#ifdef _KERNEL - -#define D_TYPEMASK 0xffff - -/* - * Flags for d_flags which the drivers can set. - */ -#define D_MEMDISK 0x00010000 /* memory type disk */ -#define D_TRACKCLOSE 0x00080000 /* track all closes */ -#define D_MMAP_ANON 0x00100000 /* special treatment in vm_mmap.c */ -#define D_PSEUDO 0x00200000 /* make_dev() can return NULL */ -#define D_NEEDGIANT 0x00400000 /* driver want Giant */ - -/* - * Version numbers. - */ -#define D_VERSION_00 0x20011966 -#define D_VERSION D_VERSION_00 - -/* - * Flags used for internal housekeeping - */ -#define D_INIT 0x80000000 /* cdevsw initialized */ -#define D_ALLOCMAJ 0x40000000 /* major# is allocated */ - -/* - * Character device switch table - */ -struct cdevsw { - int d_version; - int d_maj; - u_int d_flags; - const char *d_name; - d_open_t *d_open; - d_fdopen_t *d_fdopen; - 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; - dumper_t *d_dump; - d_kqfilter_t *d_kqfilter; - - /* These fields should not be messed with by drivers */ - LIST_ENTRY(cdevsw) d_list; - LIST_HEAD(, cdev) d_devs; - int d_refcount; -}; - /* * Line discipline switch table */ @@ -260,105 +75,67 @@ extern int nlinesw; int ldisc_register(int , struct linesw *); void ldisc_deregister(int); #define LDISC_LOAD -1 /* Loadable line discipline */ -#endif /* _KERNEL */ - -#ifdef _KERNEL - -#define NUMCDEVSW 256 - -/* - * XXX: do not use MAJOR_AUTO unless you have no choice. In general drivers - * should just not initialize .d_maj and that will DTRT. - */ -#define MAJOR_AUTO 0 /* XXX: Not GM */ l_ioctl_t l_nullioctl; l_read_t l_noread; l_write_t l_nowrite; -struct module; +static __inline int +ttyld_open(struct tty *tp) +{ -struct devsw_module_data { - int (*chainevh)(struct module *, int, void *); /* next handler */ - void *chainarg; /* arg for next event handler */ - /* Do not initialize fields hereafter */ -}; + return ((*linesw[tp->t_line].l_open)(tp->t_dev, tp)); +} -#define DEV_MODULE(name, evh, arg) \ -static moduledata_t name##_mod = { \ - #name, \ - evh, \ - arg \ -}; \ -DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE) +static __inline int +ttyld_close(struct tty *tp, int flag) +{ + return ((*linesw[tp->t_line].l_close)(tp, flag)); +} -void clone_setup(struct clonedevs **cdp); -void clone_cleanup(struct clonedevs **); -#define CLONE_UNITMASK 0xfffff -#define CLONE_FLAG0 (CLONE_UNITMASK + 1) -int clone_create(struct clonedevs **, struct cdevsw *, int *unit, dev_t *dev, u_int extra); +static __inline int +ttyld_read(struct tty *tp, struct uio *uio, int flag) +{ -int count_dev(dev_t _dev); -void destroy_dev(dev_t _dev); -struct cdevsw *devsw(dev_t _dev); -void cdevsw_ref(struct cdevsw *); -void cdevsw_rel(struct cdevsw *); -const char *devtoname(dev_t _dev); -int dev_named(dev_t _pdev, const char *_name); -void dev_depends(dev_t _pdev, dev_t _cdev); -void dev_ref(dev_t dev); -void dev_rel(dev_t dev); -void dev_strategy(struct buf *bp); -dev_t makebdev(int _maj, int _min); -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_dev_alias(dev_t _pdev, const char *_fmt, ...) __printflike(2, 3); -int dev2unit(dev_t _dev); -int unit2minor(int _unit); -void setconf(void); -dev_t getdiskbyname(char *_name); + return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); +} -void devfs_create(dev_t dev); -void devfs_destroy(dev_t dev); +static __inline int +ttyld_write(struct tty *tp, struct uio *uio, int flag) +{ -#define UID_ROOT 0 -#define UID_BIN 3 -#define UID_UUCP 66 + return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); +} -#define GID_WHEEL 0 -#define GID_KMEM 2 -#define GID_OPERATOR 5 -#define GID_BIN 7 -#define GID_GAMES 13 -#define GID_DIALER 68 +static __inline int +ttyld_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct thread *td) +{ -typedef void (*dev_clone_fn)(void *arg, char *name, int namelen, dev_t *result); + return ((*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td)); +} -int dev_stdclone(char *_name, char **_namep, const char *_stem, int *_unit); -EVENTHANDLER_DECLARE(dev_clone, dev_clone_fn); +static __inline int +ttyld_rint(struct tty *tp, int c) +{ -/* Stuff relating to kernel-dump */ + return ((*linesw[tp->t_line].l_rint)(c, tp)); +} -struct dumperinfo { - dumper_t *dumper; /* Dumping function. */ - void *priv; /* Private parts. */ - u_int blocksize; /* Size of block in bytes. */ - off_t mediaoffset; /* Initial offset in bytes. */ - off_t mediasize; /* Space available in bytes. */ -}; +static __inline int +ttyld_start(struct tty *tp) +{ + + return ((*linesw[tp->t_line].l_start)(tp)); +} -int set_dumper(struct dumperinfo *); -void dumpsys(struct dumperinfo *); -extern int dumping; /* system is dumping */ +static __inline int +ttyld_modem(struct tty *tp, int flag) +{ -/* D_TTY related functions */ -d_ioctl_t ttyioctl; -d_kqfilter_t ttykqfilter; -d_poll_t ttypoll; -d_read_t ttyread; -d_write_t ttywrite; + return ((*linesw[tp->t_line].l_modem)(tp, flag)); +} #endif /* _KERNEL */ -#endif /* !_SYS_CONF_H_ */ +#endif /* !_SYS_LINEDISC_H_ */ diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 5565456..0d16b6a 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -310,6 +310,11 @@ int ttysleep(struct tty *tp, void *chan, int pri, char *wmesg, int timo); int ttywait(struct tty *tp); int unputc(struct clist *q); +/* + * XXX: temporary + */ +#include <sys/linedisc.h> + #endif /* _KERNEL */ #endif /* !_SYS_TTY_H_ */ |