1f2b12529SMarkus Pfeiffer /* $FreeBSD: head/sys/dev/usb/usb_bus.h 276717 2015-01-05 20:22:18Z hselasky $ */ 212bd3c8bSSascha Wildner /*- 312bd3c8bSSascha Wildner * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 412bd3c8bSSascha Wildner * 512bd3c8bSSascha Wildner * Redistribution and use in source and binary forms, with or without 612bd3c8bSSascha Wildner * modification, are permitted provided that the following conditions 712bd3c8bSSascha Wildner * are met: 812bd3c8bSSascha Wildner * 1. Redistributions of source code must retain the above copyright 912bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer. 1012bd3c8bSSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 1112bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer in the 1212bd3c8bSSascha Wildner * documentation and/or other materials provided with the distribution. 1312bd3c8bSSascha Wildner * 1412bd3c8bSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1512bd3c8bSSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1612bd3c8bSSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1712bd3c8bSSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1812bd3c8bSSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1912bd3c8bSSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2012bd3c8bSSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2112bd3c8bSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2212bd3c8bSSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2312bd3c8bSSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2412bd3c8bSSascha Wildner * SUCH DAMAGE. 2512bd3c8bSSascha Wildner */ 2612bd3c8bSSascha Wildner 2712bd3c8bSSascha Wildner #ifndef _USB_BUS_H_ 2812bd3c8bSSascha Wildner #define _USB_BUS_H_ 2912bd3c8bSSascha Wildner 30dd681da6SMatthew Dillon struct usb_fs_privdata; 31dd681da6SMatthew Dillon 3212bd3c8bSSascha Wildner /* 3312bd3c8bSSascha Wildner * The following structure defines the USB explore message sent to the USB 3412bd3c8bSSascha Wildner * explore process. 3512bd3c8bSSascha Wildner */ 3612bd3c8bSSascha Wildner 3712bd3c8bSSascha Wildner struct usb_bus_msg { 3812bd3c8bSSascha Wildner struct usb_proc_msg hdr; 3912bd3c8bSSascha Wildner struct usb_bus *bus; 4012bd3c8bSSascha Wildner }; 4112bd3c8bSSascha Wildner 4212bd3c8bSSascha Wildner /* 4312bd3c8bSSascha Wildner * The following structure defines the USB statistics structure. 4412bd3c8bSSascha Wildner */ 4512bd3c8bSSascha Wildner struct usb_bus_stat { 4612bd3c8bSSascha Wildner uint32_t uds_requests[4]; 4712bd3c8bSSascha Wildner }; 4812bd3c8bSSascha Wildner 4912bd3c8bSSascha Wildner /* 5012bd3c8bSSascha Wildner * The following structure defines an USB BUS. There is one USB BUS 5112bd3c8bSSascha Wildner * for every Host or Device controller. 5212bd3c8bSSascha Wildner */ 5312bd3c8bSSascha Wildner struct usb_bus { 5412bd3c8bSSascha Wildner struct usb_bus_stat stats_err; 5512bd3c8bSSascha Wildner struct usb_bus_stat stats_ok; 5657bed822SMarkus Pfeiffer #if USB_HAVE_ROOT_MOUNT_HOLD 5712bd3c8bSSascha Wildner struct root_hold_token *bus_roothold; 5857bed822SMarkus Pfeiffer #endif 5957bed822SMarkus Pfeiffer 6057bed822SMarkus Pfeiffer #if USB_HAVE_PER_BUS_PROCESS 6157bed822SMarkus Pfeiffer #define USB_BUS_GIANT_PROC(bus) (&(bus)->giant_callback_proc) 6257bed822SMarkus Pfeiffer #define USB_BUS_NON_GIANT_PROC(bus) (&(bus)->non_giant_callback_proc) 6357bed822SMarkus Pfeiffer #define USB_BUS_EXPLORE_PROC(bus) (&(bus)->explore_proc) 6457bed822SMarkus Pfeiffer #define USB_BUS_CONTROL_XFER_PROC(bus) (&(bus)->control_xfer_proc) 6557bed822SMarkus Pfeiffer 6612bd3c8bSSascha Wildner /* 6712bd3c8bSSascha Wildner * There are two callback processes. One for Giant locked 6812bd3c8bSSascha Wildner * callbacks. One for non-Giant locked callbacks. This should 6912bd3c8bSSascha Wildner * avoid congestion and reduce response time in most cases. 7012bd3c8bSSascha Wildner */ 7112bd3c8bSSascha Wildner struct usb_process giant_callback_proc; 7212bd3c8bSSascha Wildner struct usb_process non_giant_callback_proc; 7312bd3c8bSSascha Wildner 7412bd3c8bSSascha Wildner /* Explore process */ 7512bd3c8bSSascha Wildner struct usb_process explore_proc; 7612bd3c8bSSascha Wildner 7712bd3c8bSSascha Wildner /* Control request process */ 7812bd3c8bSSascha Wildner struct usb_process control_xfer_proc; 7957bed822SMarkus Pfeiffer #endif 8012bd3c8bSSascha Wildner 8112bd3c8bSSascha Wildner struct usb_bus_msg explore_msg[2]; 8212bd3c8bSSascha Wildner struct usb_bus_msg detach_msg[2]; 8312bd3c8bSSascha Wildner struct usb_bus_msg attach_msg[2]; 8412bd3c8bSSascha Wildner struct usb_bus_msg suspend_msg[2]; 8512bd3c8bSSascha Wildner struct usb_bus_msg resume_msg[2]; 868922de18SMarkus Pfeiffer struct usb_bus_msg reset_msg[2]; 8712bd3c8bSSascha Wildner struct usb_bus_msg shutdown_msg[2]; 88dd681da6SMatthew Dillon #if USB_HAVE_UGEN 89dd681da6SMatthew Dillon struct usb_bus_msg cleanup_msg[2]; 90dd681da6SMatthew Dillon LIST_HEAD(,usb_fs_privdata) pd_cleanup_list; 91dd681da6SMatthew Dillon #endif 9212bd3c8bSSascha Wildner /* 9312bd3c8bSSascha Wildner * This mutex protects the USB hardware: 9412bd3c8bSSascha Wildner */ 95722d05c3SSascha Wildner struct lock bus_lock; 96f2b12529SMarkus Pfeiffer /* 97f2b12529SMarkus Pfeiffer * mpf: this is only used in ARM embedded USB controllers 98f2b12529SMarkus Pfeiffer * up to this point. Why is it not a spinlock? 99f2b12529SMarkus Pfeiffer struct lock bus_spin_lock; 100f2b12529SMarkus Pfeiffer */ 10112bd3c8bSSascha Wildner struct usb_xfer_queue intr_q; 10212bd3c8bSSascha Wildner struct usb_callout power_wdog; /* power management */ 10312bd3c8bSSascha Wildner 10412bd3c8bSSascha Wildner device_t parent; 10512bd3c8bSSascha Wildner device_t bdev; /* filled by HC driver */ 10612bd3c8bSSascha Wildner 10712bd3c8bSSascha Wildner #if USB_HAVE_BUSDMA 10812bd3c8bSSascha Wildner struct usb_dma_parent_tag dma_parent_tag[1]; 10912bd3c8bSSascha Wildner struct usb_dma_tag dma_tags[USB_BUS_DMA_TAG_MAX]; 11012bd3c8bSSascha Wildner #endif 1118922de18SMarkus Pfeiffer const struct usb_bus_methods *methods; /* filled by HC driver */ 11212bd3c8bSSascha Wildner struct usb_device **devices; 11312bd3c8bSSascha Wildner 11412bd3c8bSSascha Wildner struct ifnet *ifp; /* only for USB Packet Filter */ 11512bd3c8bSSascha Wildner 11612bd3c8bSSascha Wildner usb_power_mask_t hw_power_state; /* see USB_HW_POWER_XXX */ 11712bd3c8bSSascha Wildner usb_size_t uframe_usage[USB_HS_MICRO_FRAMES_MAX]; 11812bd3c8bSSascha Wildner 11912bd3c8bSSascha Wildner uint16_t isoc_time_last; /* in milliseconds */ 12012bd3c8bSSascha Wildner 12112bd3c8bSSascha Wildner uint8_t alloc_failed; /* Set if memory allocation failed. */ 12212bd3c8bSSascha Wildner uint8_t driver_added_refcount; /* Current driver generation count */ 12312bd3c8bSSascha Wildner enum usb_revision usbrev; /* USB revision. See "USB_REV_XXX". */ 12412bd3c8bSSascha Wildner 12512bd3c8bSSascha Wildner uint8_t devices_max; /* maximum number of USB devices */ 126*67616947SMatthew Dillon uint8_t do_hook; /* intr_config_hook */ 12712bd3c8bSSascha Wildner uint8_t do_probe; /* set if USB should be re-probed */ 12812bd3c8bSSascha Wildner uint8_t no_explore; /* don't explore USB ports */ 129dd473321SMarkus Pfeiffer uint8_t dma_bits; /* number of DMA address bits */ 130*67616947SMatthew Dillon struct intr_config_hook hook; 13112bd3c8bSSascha Wildner }; 13212bd3c8bSSascha Wildner 13312bd3c8bSSascha Wildner #endif /* _USB_BUS_H_ */ 134