#ifndef _USB_COMPAT_LINUX_H
#define _USB_COMPAT_LINUX_H
#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/condvar.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include <linux/pm.h>
struct usb_device;
struct usb_interface;
struct usb_driver;
struct urb;
typedef void (usb_complete_t)(struct urb *);
#define USB_MAX_FULL_SPEED_ISOC_FRAMES (60 * 1)
#define USB_MAX_HIGH_SPEED_ISOC_FRAMES (60 * 8)
#define USB_DEVICE_ID_MATCH_DEVICE \
(USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)
#define USB_DEVICE(vend,prod) \
.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor = (vend), \
.idProduct = (prod)
struct usb_driver {
const char *name;
int (*probe)(struct usb_interface *intf,
const struct usb_device_id *id);
void (*disconnect)(struct usb_interface *intf);
int (*ioctl)(struct usb_interface *intf, unsigned int code, void *buf);
int (*suspend)(struct usb_interface *intf, pm_message_t message);
int (*resume)(struct usb_interface *intf);
const struct usb_device_id *id_table;
void (*shutdown)(struct usb_interface *intf);
LIST_ENTRY(usb_driver) linux_driver_list;
};
#define USB_DRIVER_EXPORT(id,p_usb_drv) \
SYSINIT(id,SI_SUB_KLD,SI_ORDER_FIRST,usb_linux_register,p_usb_drv); \
SYSUNINIT(id,SI_SUB_KLD,SI_ORDER_ANY,usb_linux_deregister,p_usb_drv)
#define USB_DT_ENDPOINT_SIZE 7
#define USB_DT_ENDPOINT_AUDIO_SIZE 9
#define USB_ENDPOINT_NUMBER_MASK 0x0f
#define USB_ENDPOINT_DIR_MASK 0x80
#define USB_ENDPOINT_XFERTYPE_MASK 0x03
#define USB_ENDPOINT_XFER_CONTROL 0
#define USB_ENDPOINT_XFER_ISOC 1
#define USB_ENDPOINT_XFER_BULK 2
#define USB_ENDPOINT_XFER_INT 3
#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
#define USB_DIR_MASK 0x80
#define USB_DIR_OUT 0x00
#define USB_DIR_IN 0x80
#define USB_TYPE_MASK (0x03 << 5)
#define USB_TYPE_STANDARD (0x00 << 5)
#define USB_TYPE_CLASS (0x01 << 5)
#define USB_TYPE_VENDOR (0x02 << 5)
#define USB_TYPE_RESERVED (0x03 << 5)
#define USB_RECIP_MASK 0x1f
#define USB_RECIP_DEVICE 0x00
#define USB_RECIP_INTERFACE 0x01
#define USB_RECIP_ENDPOINT 0x02
#define USB_RECIP_OTHER 0x03
#define USB_REQ_GET_STATUS 0x00
#define USB_REQ_CLEAR_FEATURE 0x01
#define USB_REQ_SET_FEATURE 0x03
#define USB_REQ_SET_ADDRESS 0x05
#define USB_REQ_GET_DESCRIPTOR 0x06
#define USB_REQ_SET_DESCRIPTOR 0x07
#define USB_REQ_GET_CONFIGURATION 0x08
#define USB_REQ_SET_CONFIGURATION 0x09
#define USB_REQ_GET_INTERFACE 0x0A
#define USB_REQ_SET_INTERFACE 0x0B
#define USB_REQ_SYNCH_FRAME 0x0C
#define USB_REQ_SET_ENCRYPTION 0x0D
#define USB_REQ_GET_ENCRYPTION 0x0E
#define USB_REQ_SET_HANDSHAKE 0x0F
#define USB_REQ_GET_HANDSHAKE 0x10
#define USB_REQ_SET_CONNECTION 0x11
#define USB_REQ_SET_SECURITY_DATA 0x12
#define USB_REQ_GET_SECURITY_DATA 0x13
#define USB_REQ_SET_WUSB_DATA 0x14
#define USB_REQ_LOOPBACK_DATA_WRITE 0x15
#define USB_REQ_LOOPBACK_DATA_READ 0x16
#define USB_REQ_SET_INTERFACE_DS 0x17
#define USB_DEVICE_SELF_POWERED 0
#define USB_DEVICE_REMOTE_WAKEUP 1
#define USB_DEVICE_TEST_MODE 2
#define USB_DEVICE_BATTERY 2
#define USB_DEVICE_B_HNP_ENABLE 3
#define USB_DEVICE_WUSB_DEVICE 3
#define USB_DEVICE_A_HNP_SUPPORT 4
#define USB_DEVICE_A_ALT_HNP_SUPPORT 5
#define USB_DEVICE_DEBUG_MODE 6
#define USB_ENDPOINT_HALT 0
#define PIPE_ISOCHRONOUS 0x01
#define PIPE_INTERRUPT 0x03
#define PIPE_CONTROL 0x00
#define PIPE_BULK 0x02
#define usb_sndctrlpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_CONTROL, (endpoint) | USB_DIR_OUT)
#define usb_rcvctrlpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_CONTROL, (endpoint) | USB_DIR_IN)
#define usb_sndisocpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_ISOCHRONOUS, (endpoint) | USB_DIR_OUT)
#define usb_rcvisocpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_ISOCHRONOUS, (endpoint) | USB_DIR_IN)
#define usb_sndbulkpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_BULK, (endpoint) | USB_DIR_OUT)
#define usb_rcvbulkpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_BULK, (endpoint) | USB_DIR_IN)
#define usb_sndintpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_INTERRUPT, (endpoint) | USB_DIR_OUT)
#define usb_rcvintpipe(dev,endpoint) \
usb_find_host_endpoint(dev, PIPE_INTERRUPT, (endpoint) | USB_DIR_IN)
struct usb_iso_packet_descriptor {
uint32_t offset;
uint16_t length;
uint16_t actual_length;
int16_t status;
};
struct urb {
TAILQ_ENTRY(urb) bsd_urb_list;
struct cv cv_wait;
struct usb_device *dev;
struct usb_host_endpoint *endpoint;
uint8_t *setup_packet;
uint8_t *bsd_data_ptr;
void *transfer_buffer;
void *context;
usb_complete_t *complete;
usb_size_t transfer_buffer_length;
usb_size_t bsd_length_rem;
usb_size_t actual_length;
usb_timeout_t timeout;
uint16_t transfer_flags;
#define URB_SHORT_NOT_OK 0x0001
#define URB_ISO_ASAP 0x0002
#define URB_ZERO_PACKET 0x0004
#define URB_NO_TRANSFER_DMA_MAP 0x0008
#define URB_WAIT_WAKEUP 0x0010
#define URB_IS_SLEEPING 0x0020
usb_frcount_t start_frame;
usb_frcount_t number_of_packets;
uint16_t interval;
uint16_t error_count;
int16_t status;
uint8_t setup_dma;
uint8_t transfer_dma;
uint8_t bsd_isread;
uint8_t kill_count;
struct usb_iso_packet_descriptor iso_frame_desc[];
};
int usb_submit_urb(struct urb *urb, uint16_t mem_flags);
int usb_unlink_urb(struct urb *urb);
int usb_clear_halt(struct usb_device *dev, struct usb_host_endpoint *uhe);
int usb_control_msg(struct usb_device *dev, struct usb_host_endpoint *ep,
uint8_t request, uint8_t requesttype, uint16_t value,
uint16_t index, void *data, uint16_t size, usb_timeout_t timeout);
int usb_set_interface(struct usb_device *dev, uint8_t ifnum,
uint8_t alternate);
int usb_setup_endpoint(struct usb_device *dev,
struct usb_host_endpoint *uhe, usb_frlength_t bufsize);
struct usb_host_endpoint *usb_find_host_endpoint(struct usb_device *dev,
uint8_t type, uint8_t ep);
struct urb *usb_alloc_urb(uint16_t iso_packets, uint16_t mem_flags);
struct usb_host_interface *usb_altnum_to_altsetting(
const struct usb_interface *intf, uint8_t alt_index);
struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, uint8_t iface_no);
void *usb_buffer_alloc(struct usb_device *dev, usb_size_t size,
uint16_t mem_flags, uint8_t *dma_addr);
void *usbd_get_intfdata(struct usb_interface *intf);
void usb_buffer_free(struct usb_device *dev, usb_size_t size, void *addr, uint8_t dma_addr);
void usb_free_urb(struct urb *urb);
void usb_init_urb(struct urb *urb);
void usb_kill_urb(struct urb *urb);
void usb_set_intfdata(struct usb_interface *intf, void *data);
void usb_linux_register(void *arg);
void usb_linux_deregister(void *arg);
void usb_fill_bulk_urb(struct urb *, struct usb_device *,
struct usb_host_endpoint *, void *, int, usb_complete_t, void *);
int usb_bulk_msg(struct usb_device *, struct usb_host_endpoint *,
void *, int, uint16_t *, usb_timeout_t);
#define interface_to_usbdev(intf) (intf)->linux_udev
#define interface_to_bsddev(intf) (intf)->linux_udev
#endif