/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
* 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
* to the University of California by American Telephone and Telegraph
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
* the permission of UNIX System Laboratories, Inc.
*
* 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.
* 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.
*
* @(#)conf.h 8.5 (Berkeley) 1/9/95
* $FreeBSD$
*/
#ifndef _SYS_LINEDISC_H_
#define _SYS_LINEDISC_H_
#ifdef _KERNEL
struct tty;
typedef int l_open_t(struct cdev *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);
/*
* 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;
};
extern struct linesw *linesw[];
extern int nlinesw;
int ldisc_register(int , struct linesw *);
void ldisc_deregister(int);
#define LDISC_LOAD -1 /* Loadable line discipline */
l_read_t l_noread;
l_write_t l_nowrite;
l_ioctl_t l_nullioctl;
static __inline int
ttyld_open(struct tty *tp, struct cdev *dev)
{
return ((*linesw[tp->t_line]->l_open)(dev, tp));
}
static __inline int
ttyld_close(struct tty *tp, int flag)
{
return ((*linesw[tp->t_line]->l_close)(tp, flag));
}
static __inline int
ttyld_read(struct tty *tp, struct uio *uio, int flag)
{
return ((*linesw[tp->t_line]->l_read)(tp, uio, flag));
}
static __inline int
ttyld_write(struct tty *tp, struct uio *uio, int flag)
{
return ((*linesw[tp->t_line]->l_write)(tp, uio, flag));
}
static __inline int
ttyld_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag,
struct thread *td)
{
return ((*linesw[tp->t_line]->l_ioctl)(tp, cmd, data, flag, td));
}
static __inline int
ttyld_rint(struct tty *tp, int c)
{
return ((*linesw[tp->t_line]->l_rint)(c, tp));
}
static __inline int
ttyld_start(struct tty *tp)
{
return ((*linesw[tp->t_line]->l_start)(tp));
}
static __inline int
ttyld_modem(struct tty *tp, int flag)
{
return ((*linesw[tp->t_line]->l_modem)(tp, flag));
}
#endif /* _KERNEL */
#endif /* !_SYS_LINEDISC_H_ */