29#ifdef USB_GLOBAL_INCLUDE_FILE
30#include USB_GLOBAL_INCLUDE_FILE
32#include <sys/stdint.h>
33#include <sys/stddef.h>
38#include <sys/kernel.h>
40#include <sys/module.h>
43#include <sys/condvar.h>
44#include <sys/sysctl.h>
46#include <sys/unistd.h>
47#include <sys/callout.h>
48#include <sys/malloc.h>
56#define USB_DEBUG_VAR usb_proc_debug
61#include <sys/kthread.h>
65#if (__FreeBSD_version < 700000)
66#define thread_lock(td) mtx_lock_spin(&sched_lock)
67#define thread_unlock(td) mtx_unlock_spin(&sched_lock)
70#if (__FreeBSD_version >= 800000)
71static struct proc *usbproc;
73#define USB_THREAD_CREATE(f, s, p, ...) \
74 kproc_kthread_add((f), (s), &usbproc, (p), RFHIGHPID, \
75 0, "usb", __VA_ARGS__)
76#if (__FreeBSD_version >= 900000)
77#define USB_THREAD_SUSPEND_CHECK() kthread_suspend_check()
79#define USB_THREAD_SUSPEND_CHECK() kthread_suspend_check(curthread)
81#define USB_THREAD_SUSPEND(p) kthread_suspend(p,0)
82#define USB_THREAD_EXIT(err) kthread_exit()
84#define USB_THREAD_CREATE(f, s, p, ...) \
85 kthread_create((f), (s), (p), RFHIGHPID, 0, __VA_ARGS__)
86#define USB_THREAD_SUSPEND_CHECK() kthread_suspend_check(curproc)
87#define USB_THREAD_SUSPEND(p) kthread_suspend(p,0)
88#define USB_THREAD_EXIT(err) kthread_exit(err)
92static int usb_proc_debug;
94static SYSCTL_NODE(_hw_usb, OID_AUTO, proc, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
96SYSCTL_INT(_hw_usb_proc, OID_AUTO,
debug, CTLFLAG_RWTUN, &usb_proc_debug, 0,
172 pm = TAILQ_FIRST(&up->up_qhead);
175 DPRINTF(
"Message pm=%p, cb=%p (enter)\n",
180 if (pm == TAILQ_FIRST(&up->up_qhead)) {
182 TAILQ_REMOVE(&up->up_qhead, pm, pm_qentry);
183 pm->pm_qentry.tqe_prev = NULL;
185 DPRINTF(
"Message pm=%p (leave)\n", pm);
199 cv_signal(&up->
up_cv);
201#if (__FreeBSD_version >= 800000)
203 if (--usb_pcount == 0)
225 const char *pmesg, uint8_t prio)
230 TAILQ_INIT(&up->up_qhead);
232 cv_init(&up->
up_cv,
"-");
236 &up->
up_ptr,
"%s", pmesg)) {
237 DPRINTFN(0,
"Unable to create USB process.");
241#if (__FreeBSD_version >= 800000)
269 cv_destroy(&up->
up_cv);
305 if (pm0->pm_qentry.tqe_prev) {
308 if (pm1->pm_qentry.tqe_prev) {
337 if (d & 0x80000000) {
343 TAILQ_REMOVE(&up->up_qhead, pm2, pm_qentry);
353 TAILQ_INSERT_TAIL(&up->up_qhead, pm2, pm_qentry);
359 cv_signal(&up->
up_cv);
407 if (pm0->pm_qentry.tqe_prev) {
408 TAILQ_REMOVE(&up->up_qhead, pm0, pm_qentry);
409 pm0->pm_qentry.tqe_prev = NULL;
411 if (pm1->pm_qentry.tqe_prev) {
412 TAILQ_REMOVE(&up->up_qhead, pm1, pm_qentry);
413 pm1->pm_qentry.tqe_prev = NULL;
416 while (pm0->pm_qentry.tqe_prev ||
417 pm1->pm_qentry.tqe_prev) {
457 cv_signal(&up->
up_cv);
459#ifndef EARLY_AP_STARTUP
463 printf(
"WARNING: A USB process has "
464 "been left suspended\n");
475 DPRINTF(
"WARNING: Someone is waiting "
476 "for USB process drain!\n");
503 cv_signal(&up->
up_cv);
static SYSCTL_NODE(_hw_usb, OID_AUTO, dwc_otg, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB DWC OTG")
SYSCTL_INT(_hw_usb_dwc_otg, OID_AUTO, phy_type, CTLFLAG_RDTUN, &dwc_otg_phy_type, 0, "DWC OTG PHY TYPE - 0/1/2/3 - ULPI/HSIC/INTERNAL/UTMI+")
usb_proc_callback_t * pm_callback
#define USB_IN_POLLING_MODE_FUNC()
int usb_proc_create(struct usb_process *up, struct mtx *p_mtx, const char *pmesg, uint8_t prio)
#define USB_THREAD_EXIT(err)
uint8_t usb_proc_is_gone(struct usb_process *up)
void usb_proc_mwait(struct usb_process *up, void *_pm0, void *_pm1)
#define thread_unlock(td)
static void usb_process(void *arg)
void usb_proc_drain(struct usb_process *up)
int usb_proc_is_called_from(struct usb_process *up)
#define USB_THREAD_CREATE(f, s, p,...)
void * usb_proc_msignal(struct usb_process *up, void *_pm0, void *_pm1)
#define USB_THREAD_SUSPEND(p)
void usb_proc_rewakeup(struct usb_process *up)
void usb_proc_free(struct usb_process *up)
#define USB_THREAD_SUSPEND_CHECK()
#define USB_MTX_UNLOCK(_m)
#define USB_MTX_ASSERT(_m, _t)