xref: /freebsd/sys/dev/usb/usb_process.h (revision a593f6b8de8b956bd0dd22f74805ede942e3d6a9)
102ac6454SAndrew Thompson /* $FreeBSD$ */
202ac6454SAndrew Thompson /*-
302ac6454SAndrew Thompson  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
402ac6454SAndrew Thompson  *
502ac6454SAndrew Thompson  * Redistribution and use in source and binary forms, with or without
602ac6454SAndrew Thompson  * modification, are permitted provided that the following conditions
702ac6454SAndrew Thompson  * are met:
802ac6454SAndrew Thompson  * 1. Redistributions of source code must retain the above copyright
902ac6454SAndrew Thompson  *    notice, this list of conditions and the following disclaimer.
1002ac6454SAndrew Thompson  * 2. Redistributions in binary form must reproduce the above copyright
1102ac6454SAndrew Thompson  *    notice, this list of conditions and the following disclaimer in the
1202ac6454SAndrew Thompson  *    documentation and/or other materials provided with the distribution.
1302ac6454SAndrew Thompson  *
1402ac6454SAndrew Thompson  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1502ac6454SAndrew Thompson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1602ac6454SAndrew Thompson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1702ac6454SAndrew Thompson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1802ac6454SAndrew Thompson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1902ac6454SAndrew Thompson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2002ac6454SAndrew Thompson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2102ac6454SAndrew Thompson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2202ac6454SAndrew Thompson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2302ac6454SAndrew Thompson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2402ac6454SAndrew Thompson  * SUCH DAMAGE.
2502ac6454SAndrew Thompson  */
2602ac6454SAndrew Thompson 
2702ac6454SAndrew Thompson #ifndef _USB2_PROCESS_H_
2802ac6454SAndrew Thompson #define	_USB2_PROCESS_H_
2902ac6454SAndrew Thompson 
3002ac6454SAndrew Thompson #include <sys/priority.h>
3102ac6454SAndrew Thompson 
3202ac6454SAndrew Thompson /* defines */
3302ac6454SAndrew Thompson #define	USB_PRI_HIGH PI_NET
3402ac6454SAndrew Thompson #define	USB_PRI_MED PI_DISK
3502ac6454SAndrew Thompson 
3602ac6454SAndrew Thompson #define	USB_PROC_WAIT_TIMEOUT 2
3702ac6454SAndrew Thompson #define	USB_PROC_WAIT_DRAIN   1
3802ac6454SAndrew Thompson #define	USB_PROC_WAIT_NORMAL  0
3902ac6454SAndrew Thompson 
4002ac6454SAndrew Thompson /* structure prototypes */
4102ac6454SAndrew Thompson 
42760bc48eSAndrew Thompson struct usb_proc_msg;
4302ac6454SAndrew Thompson 
4402ac6454SAndrew Thompson /* typedefs */
4502ac6454SAndrew Thompson 
46e0a69b51SAndrew Thompson typedef void (usb_proc_callback_t)(struct usb_proc_msg *hdr);
4702ac6454SAndrew Thompson 
4802ac6454SAndrew Thompson /*
4902ac6454SAndrew Thompson  * The following structure defines the USB process message header.
5002ac6454SAndrew Thompson  */
51760bc48eSAndrew Thompson struct usb_proc_msg {
52760bc48eSAndrew Thompson 	TAILQ_ENTRY(usb_proc_msg) pm_qentry;
53e0a69b51SAndrew Thompson 	usb_proc_callback_t *pm_callback;
54f9cb546cSAndrew Thompson 	usb_size_t pm_num;
5502ac6454SAndrew Thompson };
5602ac6454SAndrew Thompson 
5702ac6454SAndrew Thompson /*
5802ac6454SAndrew Thompson  * The following structure defines the USB process.
5902ac6454SAndrew Thompson  */
60760bc48eSAndrew Thompson struct usb_process {
61760bc48eSAndrew Thompson 	TAILQ_HEAD(, usb_proc_msg) up_qhead;
6202ac6454SAndrew Thompson 	struct cv up_cv;
6302ac6454SAndrew Thompson 	struct cv up_drain;
6402ac6454SAndrew Thompson 
6502ac6454SAndrew Thompson 	struct proc *up_ptr;
6602ac6454SAndrew Thompson 	struct thread *up_curtd;
6702ac6454SAndrew Thompson 	struct mtx *up_mtx;
6802ac6454SAndrew Thompson 
69f9cb546cSAndrew Thompson 	usb_size_t up_msg_num;
7002ac6454SAndrew Thompson 
7102ac6454SAndrew Thompson 	uint8_t	up_prio;
7202ac6454SAndrew Thompson 	uint8_t	up_gone;
7302ac6454SAndrew Thompson 	uint8_t	up_msleep;
7402ac6454SAndrew Thompson 	uint8_t	up_csleep;
7502ac6454SAndrew Thompson 	uint8_t	up_dsleep;
7602ac6454SAndrew Thompson };
7702ac6454SAndrew Thompson 
7802ac6454SAndrew Thompson /* prototypes */
7902ac6454SAndrew Thompson 
80a593f6b8SAndrew Thompson uint8_t	usb_proc_is_gone(struct usb_process *up);
81a593f6b8SAndrew Thompson int	usb_proc_create(struct usb_process *up, struct mtx *p_mtx,
8202ac6454SAndrew Thompson 	    const char *pmesg, uint8_t prio);
83a593f6b8SAndrew Thompson void	usb_proc_drain(struct usb_process *up);
84a593f6b8SAndrew Thompson void	usb_proc_mwait(struct usb_process *up, void *pm0, void *pm1);
85a593f6b8SAndrew Thompson void	usb_proc_free(struct usb_process *up);
86a593f6b8SAndrew Thompson void   *usb_proc_msignal(struct usb_process *up, void *pm0, void *pm1);
8702ac6454SAndrew Thompson 
8802ac6454SAndrew Thompson #endif					/* _USB2_PROCESS_H_ */
89