#ifndef _SYS_TTYDEVSW_H_
#define _SYS_TTYDEVSW_H_
#ifndef _SYS_TTY_H_
#error "can only be included through <sys/tty.h>"
#endif
typedef int tsw_open_t(struct tty *tp);
typedef void tsw_close_t(struct tty *tp);
typedef void tsw_outwakeup_t(struct tty *tp);
typedef void tsw_inwakeup_t(struct tty *tp);
typedef int tsw_ioctl_t(struct tty *tp, u_long cmd, caddr_t data,
struct thread *td);
typedef int tsw_cioctl_t(struct tty *tp, int unit, u_long cmd, caddr_t data,
struct thread *td);
typedef int tsw_param_t(struct tty *tp, struct termios *t);
typedef int tsw_modem_t(struct tty *tp, int sigon, int sigoff);
typedef int tsw_mmap_t(struct tty *tp, vm_ooffset_t offset,
vm_paddr_t * paddr, int nprot, vm_memattr_t *memattr);
typedef void tsw_pktnotify_t(struct tty *tp, char event);
typedef void tsw_free_t(void *softc);
typedef bool tsw_busy_t(struct tty *tp);
struct ttydevsw {
unsigned int tsw_flags;
tsw_open_t *tsw_open;
tsw_close_t *tsw_close;
tsw_outwakeup_t *tsw_outwakeup;
tsw_inwakeup_t *tsw_inwakeup;
tsw_ioctl_t *tsw_ioctl;
tsw_cioctl_t *tsw_cioctl;
tsw_param_t *tsw_param;
tsw_modem_t *tsw_modem;
tsw_mmap_t *tsw_mmap;
tsw_pktnotify_t *tsw_pktnotify;
tsw_free_t *tsw_free;
tsw_busy_t *tsw_busy;
void *tsw_spare[3];
};
static __inline int
ttydevsw_open(struct tty *tp)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
return (tp->t_devsw->tsw_open(tp));
}
static __inline void
ttydevsw_close(struct tty *tp)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
tp->t_devsw->tsw_close(tp);
}
static __inline void
ttydevsw_outwakeup(struct tty *tp)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
if (ttydisc_getc_poll(tp) == 0)
return;
tp->t_devsw->tsw_outwakeup(tp);
}
static __inline void
ttydevsw_inwakeup(struct tty *tp)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
if (tp->t_flags & TF_HIWAT_IN)
return;
tp->t_devsw->tsw_inwakeup(tp);
}
static __inline int
ttydevsw_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
return (tp->t_devsw->tsw_ioctl(tp, cmd, data, td));
}
static __inline int
ttydevsw_cioctl(struct tty *tp, int unit, u_long cmd, caddr_t data,
struct thread *td)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
return (tp->t_devsw->tsw_cioctl(tp, unit, cmd, data, td));
}
static __inline int
ttydevsw_param(struct tty *tp, struct termios *t)
{
MPASS(!tty_gone(tp));
return (tp->t_devsw->tsw_param(tp, t));
}
static __inline int
ttydevsw_modem(struct tty *tp, int sigon, int sigoff)
{
MPASS(!tty_gone(tp));
return (tp->t_devsw->tsw_modem(tp, sigon, sigoff));
}
static __inline int
ttydevsw_mmap(struct tty *tp, vm_ooffset_t offset, vm_paddr_t *paddr,
int nprot, vm_memattr_t *memattr)
{
MPASS(!tty_gone(tp));
return (tp->t_devsw->tsw_mmap(tp, offset, paddr, nprot, memattr));
}
static __inline void
ttydevsw_pktnotify(struct tty *tp, char event)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
tp->t_devsw->tsw_pktnotify(tp, event);
}
static __inline void
ttydevsw_free(struct tty *tp)
{
MPASS(tty_gone(tp));
tp->t_devsw->tsw_free(tty_softc(tp));
}
static __inline bool
ttydevsw_busy(struct tty *tp)
{
tty_assert_locked(tp);
MPASS(!tty_gone(tp));
return (tp->t_devsw->tsw_busy(tp));
}
#endif