xref: /f-stack/freebsd/sys/ttydevsw.h (revision 22ce4aff)
1a9643ea8Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*22ce4affSfengbojiang  *
4a9643ea8Slogwang  * Copyright (c) 2008 Ed Schouten <[email protected]>
5a9643ea8Slogwang  * All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Portions of this software were developed under sponsorship from Snow
8a9643ea8Slogwang  * B.V., the Netherlands.
9a9643ea8Slogwang  *
10a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
11a9643ea8Slogwang  * modification, are permitted provided that the following conditions
12a9643ea8Slogwang  * are met:
13a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
14a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
15a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
16a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
17a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
18a9643ea8Slogwang  *
19a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29a9643ea8Slogwang  * SUCH DAMAGE.
30a9643ea8Slogwang  *
31a9643ea8Slogwang  * $FreeBSD$
32a9643ea8Slogwang  */
33a9643ea8Slogwang 
34a9643ea8Slogwang #ifndef _SYS_TTYDEVSW_H_
35a9643ea8Slogwang #define	_SYS_TTYDEVSW_H_
36a9643ea8Slogwang 
37a9643ea8Slogwang #ifndef _SYS_TTY_H_
38a9643ea8Slogwang #error "can only be included through <sys/tty.h>"
39a9643ea8Slogwang #endif /* !_SYS_TTY_H_ */
40a9643ea8Slogwang 
41a9643ea8Slogwang /*
42a9643ea8Slogwang  * Driver routines that are called from the line discipline to adjust
43a9643ea8Slogwang  * hardware parameters and such.
44a9643ea8Slogwang  */
45a9643ea8Slogwang typedef int tsw_open_t(struct tty *tp);
46a9643ea8Slogwang typedef void tsw_close_t(struct tty *tp);
47a9643ea8Slogwang typedef void tsw_outwakeup_t(struct tty *tp);
48a9643ea8Slogwang typedef void tsw_inwakeup_t(struct tty *tp);
49a9643ea8Slogwang typedef int tsw_ioctl_t(struct tty *tp, u_long cmd, caddr_t data,
50a9643ea8Slogwang     struct thread *td);
51a9643ea8Slogwang typedef int tsw_cioctl_t(struct tty *tp, int unit, u_long cmd, caddr_t data,
52a9643ea8Slogwang     struct thread *td);
53a9643ea8Slogwang typedef int tsw_param_t(struct tty *tp, struct termios *t);
54a9643ea8Slogwang typedef int tsw_modem_t(struct tty *tp, int sigon, int sigoff);
55a9643ea8Slogwang typedef int tsw_mmap_t(struct tty *tp, vm_ooffset_t offset,
56a9643ea8Slogwang     vm_paddr_t * paddr, int nprot, vm_memattr_t *memattr);
57a9643ea8Slogwang typedef void tsw_pktnotify_t(struct tty *tp, char event);
58a9643ea8Slogwang typedef void tsw_free_t(void *softc);
59a9643ea8Slogwang typedef bool tsw_busy_t(struct tty *tp);
60a9643ea8Slogwang 
61a9643ea8Slogwang struct ttydevsw {
62a9643ea8Slogwang 	unsigned int	tsw_flags;	/* Default TTY flags. */
63a9643ea8Slogwang 
64a9643ea8Slogwang 	tsw_open_t	*tsw_open;	/* Device opening. */
65a9643ea8Slogwang 	tsw_close_t	*tsw_close;	/* Device closure. */
66a9643ea8Slogwang 
67a9643ea8Slogwang 	tsw_outwakeup_t	*tsw_outwakeup;	/* Output available. */
68a9643ea8Slogwang 	tsw_inwakeup_t	*tsw_inwakeup;	/* Input can be stored again. */
69a9643ea8Slogwang 
70a9643ea8Slogwang 	tsw_ioctl_t	*tsw_ioctl;	/* ioctl() hooks. */
71a9643ea8Slogwang 	tsw_cioctl_t	*tsw_cioctl;	/* ioctl() on control devices. */
72a9643ea8Slogwang 	tsw_param_t	*tsw_param;	/* TIOCSETA device parameter setting. */
73a9643ea8Slogwang 	tsw_modem_t	*tsw_modem;	/* Modem sigon/sigoff. */
74a9643ea8Slogwang 
75a9643ea8Slogwang 	tsw_mmap_t	*tsw_mmap;	/* mmap() hooks. */
76a9643ea8Slogwang 	tsw_pktnotify_t	*tsw_pktnotify;	/* TIOCPKT events. */
77a9643ea8Slogwang 
78a9643ea8Slogwang 	tsw_free_t	*tsw_free;	/* Destructor. */
79a9643ea8Slogwang 
80a9643ea8Slogwang 	tsw_busy_t	*tsw_busy;	/* Draining output. */
81a9643ea8Slogwang 
82a9643ea8Slogwang 	void		*tsw_spare[3];	/* For future use. */
83a9643ea8Slogwang };
84a9643ea8Slogwang 
85a9643ea8Slogwang static __inline int
ttydevsw_open(struct tty * tp)86a9643ea8Slogwang ttydevsw_open(struct tty *tp)
87a9643ea8Slogwang {
88a9643ea8Slogwang 
89*22ce4affSfengbojiang 	tty_assert_locked(tp);
90a9643ea8Slogwang 	MPASS(!tty_gone(tp));
91a9643ea8Slogwang 
92a9643ea8Slogwang 	return (tp->t_devsw->tsw_open(tp));
93a9643ea8Slogwang }
94a9643ea8Slogwang 
95a9643ea8Slogwang static __inline void
ttydevsw_close(struct tty * tp)96a9643ea8Slogwang ttydevsw_close(struct tty *tp)
97a9643ea8Slogwang {
98a9643ea8Slogwang 
99*22ce4affSfengbojiang 	tty_assert_locked(tp);
100a9643ea8Slogwang 	MPASS(!tty_gone(tp));
101a9643ea8Slogwang 
102a9643ea8Slogwang 	tp->t_devsw->tsw_close(tp);
103a9643ea8Slogwang }
104a9643ea8Slogwang 
105a9643ea8Slogwang static __inline void
ttydevsw_outwakeup(struct tty * tp)106a9643ea8Slogwang ttydevsw_outwakeup(struct tty *tp)
107a9643ea8Slogwang {
108a9643ea8Slogwang 
109*22ce4affSfengbojiang 	tty_assert_locked(tp);
110a9643ea8Slogwang 	MPASS(!tty_gone(tp));
111a9643ea8Slogwang 
112a9643ea8Slogwang 	/* Prevent spurious wakeups. */
113a9643ea8Slogwang 	if (ttydisc_getc_poll(tp) == 0)
114a9643ea8Slogwang 		return;
115a9643ea8Slogwang 
116a9643ea8Slogwang 	tp->t_devsw->tsw_outwakeup(tp);
117a9643ea8Slogwang }
118a9643ea8Slogwang 
119a9643ea8Slogwang static __inline void
ttydevsw_inwakeup(struct tty * tp)120a9643ea8Slogwang ttydevsw_inwakeup(struct tty *tp)
121a9643ea8Slogwang {
122a9643ea8Slogwang 
123*22ce4affSfengbojiang 	tty_assert_locked(tp);
124a9643ea8Slogwang 	MPASS(!tty_gone(tp));
125a9643ea8Slogwang 
126a9643ea8Slogwang 	/* Prevent spurious wakeups. */
127a9643ea8Slogwang 	if (tp->t_flags & TF_HIWAT_IN)
128a9643ea8Slogwang 		return;
129a9643ea8Slogwang 
130a9643ea8Slogwang 	tp->t_devsw->tsw_inwakeup(tp);
131a9643ea8Slogwang }
132a9643ea8Slogwang 
133a9643ea8Slogwang static __inline int
ttydevsw_ioctl(struct tty * tp,u_long cmd,caddr_t data,struct thread * td)134a9643ea8Slogwang ttydevsw_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
135a9643ea8Slogwang {
136a9643ea8Slogwang 
137*22ce4affSfengbojiang 	tty_assert_locked(tp);
138a9643ea8Slogwang 	MPASS(!tty_gone(tp));
139a9643ea8Slogwang 
140a9643ea8Slogwang 	return (tp->t_devsw->tsw_ioctl(tp, cmd, data, td));
141a9643ea8Slogwang }
142a9643ea8Slogwang 
143a9643ea8Slogwang static __inline int
ttydevsw_cioctl(struct tty * tp,int unit,u_long cmd,caddr_t data,struct thread * td)144a9643ea8Slogwang ttydevsw_cioctl(struct tty *tp, int unit, u_long cmd, caddr_t data,
145a9643ea8Slogwang     struct thread *td)
146a9643ea8Slogwang {
147a9643ea8Slogwang 
148*22ce4affSfengbojiang 	tty_assert_locked(tp);
149a9643ea8Slogwang 	MPASS(!tty_gone(tp));
150a9643ea8Slogwang 
151a9643ea8Slogwang 	return (tp->t_devsw->tsw_cioctl(tp, unit, cmd, data, td));
152a9643ea8Slogwang }
153a9643ea8Slogwang 
154a9643ea8Slogwang static __inline int
ttydevsw_param(struct tty * tp,struct termios * t)155a9643ea8Slogwang ttydevsw_param(struct tty *tp, struct termios *t)
156a9643ea8Slogwang {
157a9643ea8Slogwang 
158a9643ea8Slogwang 	MPASS(!tty_gone(tp));
159a9643ea8Slogwang 
160a9643ea8Slogwang 	return (tp->t_devsw->tsw_param(tp, t));
161a9643ea8Slogwang }
162a9643ea8Slogwang 
163a9643ea8Slogwang static __inline int
ttydevsw_modem(struct tty * tp,int sigon,int sigoff)164a9643ea8Slogwang ttydevsw_modem(struct tty *tp, int sigon, int sigoff)
165a9643ea8Slogwang {
166a9643ea8Slogwang 
167a9643ea8Slogwang 	MPASS(!tty_gone(tp));
168a9643ea8Slogwang 
169a9643ea8Slogwang 	return (tp->t_devsw->tsw_modem(tp, sigon, sigoff));
170a9643ea8Slogwang }
171a9643ea8Slogwang 
172a9643ea8Slogwang static __inline int
ttydevsw_mmap(struct tty * tp,vm_ooffset_t offset,vm_paddr_t * paddr,int nprot,vm_memattr_t * memattr)173a9643ea8Slogwang ttydevsw_mmap(struct tty *tp, vm_ooffset_t offset, vm_paddr_t *paddr,
174a9643ea8Slogwang     int nprot, vm_memattr_t *memattr)
175a9643ea8Slogwang {
176a9643ea8Slogwang 
177a9643ea8Slogwang 	MPASS(!tty_gone(tp));
178a9643ea8Slogwang 
179a9643ea8Slogwang 	return (tp->t_devsw->tsw_mmap(tp, offset, paddr, nprot, memattr));
180a9643ea8Slogwang }
181a9643ea8Slogwang 
182a9643ea8Slogwang static __inline void
ttydevsw_pktnotify(struct tty * tp,char event)183a9643ea8Slogwang ttydevsw_pktnotify(struct tty *tp, char event)
184a9643ea8Slogwang {
185a9643ea8Slogwang 
186*22ce4affSfengbojiang 	tty_assert_locked(tp);
187a9643ea8Slogwang 	MPASS(!tty_gone(tp));
188a9643ea8Slogwang 
189a9643ea8Slogwang 	tp->t_devsw->tsw_pktnotify(tp, event);
190a9643ea8Slogwang }
191a9643ea8Slogwang 
192a9643ea8Slogwang static __inline void
ttydevsw_free(struct tty * tp)193a9643ea8Slogwang ttydevsw_free(struct tty *tp)
194a9643ea8Slogwang {
195a9643ea8Slogwang 
196a9643ea8Slogwang 	MPASS(tty_gone(tp));
197a9643ea8Slogwang 
198a9643ea8Slogwang 	tp->t_devsw->tsw_free(tty_softc(tp));
199a9643ea8Slogwang }
200a9643ea8Slogwang 
201a9643ea8Slogwang static __inline bool
ttydevsw_busy(struct tty * tp)202a9643ea8Slogwang ttydevsw_busy(struct tty *tp)
203a9643ea8Slogwang {
204a9643ea8Slogwang 
205*22ce4affSfengbojiang 	tty_assert_locked(tp);
206a9643ea8Slogwang 	MPASS(!tty_gone(tp));
207a9643ea8Slogwang 
208a9643ea8Slogwang 	return (tp->t_devsw->tsw_busy(tp));
209a9643ea8Slogwang }
210a9643ea8Slogwang 
211a9643ea8Slogwang #endif /* !_SYS_TTYDEVSW_H_ */
212