usb_device.h revision 184610
118334Speter/* $FreeBSD: head/sys/dev/usb2/core/usb2_device.h 184610 2008-11-04 02:31:03Z alfred $ */
218334Speter/*-
318334Speter * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
418334Speter *
518334Speter * Redistribution and use in source and binary forms, with or without
618334Speter * modification, are permitted provided that the following conditions
718334Speter * are met:
818334Speter * 1. Redistributions of source code must retain the above copyright
918334Speter *    notice, this list of conditions and the following disclaimer.
1018334Speter * 2. Redistributions in binary form must reproduce the above copyright
1118334Speter *    notice, this list of conditions and the following disclaimer in the
1218334Speter *    documentation and/or other materials provided with the distribution.
1318334Speter *
1418334Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1518334Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1618334Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1718334Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1818334Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1918334Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2018334Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2118334Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2218334Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2318334Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2418334Speter * SUCH DAMAGE.
2518334Speter */
2618334Speter
2718334Speter#ifndef _USB2_DEVICE_H_
2818334Speter#define	_USB2_DEVICE_H_
2918334Speter
3018334Speterstruct usb2_symlink;
3118334Speter
3218334Speter#define	USB_DEFAULT_XFER_MAX 2
3318334Speter
3418334Speterstruct usb2_clear_stall_msg {
3518334Speter	struct usb2_proc_msg hdr;
3618334Speter	struct usb2_device *udev;
3718334Speter};
3818334Speter
3918334Speter/*
4018334Speter * The following structure defines an USB pipe which is equal to an
4118334Speter * USB endpoint.
4218334Speter */
4318334Speterstruct usb2_pipe {
4418334Speter	struct usb2_xfer_queue pipe_q;	/* queue of USB transfers */
4518334Speter
4618334Speter	struct usb2_xfer *xfer_block;	/* blocking USB transfer */
4718334Speter	struct usb2_endpoint_descriptor *edesc;
4818334Speter	struct usb2_pipe_methods *methods;	/* set by HC driver */
4918334Speter
5018334Speter	uint16_t isoc_next;
5118334Speter	uint16_t refcount;
5218334Speter
5318334Speter	uint8_t	toggle_next:1;		/* next data toggle value */
5418334Speter	uint8_t	is_stalled:1;		/* set if pipe is stalled */
5518334Speter	uint8_t	is_synced:1;		/* set if we a synchronised */
5618334Speter	uint8_t	unused:5;
5718334Speter	uint8_t	iface_index;		/* not used by "default pipe" */
5818334Speter};
5918334Speter
6018334Speter/*
6118334Speter * The following structure defines an USB interface.
6218334Speter */
6318334Speterstruct usb2_interface {
6418334Speter	struct usb2_perm perm;		/* interface permissions */
6518334Speter	struct usb2_interface_descriptor *idesc;
6618334Speter	device_t subdev;
6718334Speter	uint8_t	alt_index;
6818334Speter	uint8_t	parent_iface_index;
6918334Speter};
7018334Speter
7118334Speter/*
7218334Speter * The following structure defines the USB device flags.
7318334Speter */
7418334Speterstruct usb2_device_flags {
7518334Speter	uint8_t	usb2_mode:1;		/* USB mode (see USB_MODE_XXX) */
7618334Speter	uint8_t	self_powered:1;		/* set if USB device is self powered */
7718334Speter	uint8_t	suspended:1;		/* set if USB device is suspended */
7818334Speter	uint8_t	no_strings:1;		/* set if USB device does not support
7918334Speter					 * strings */
8018334Speter	uint8_t	remote_wakeup:1;	/* set if remote wakeup is enabled */
8118334Speter	uint8_t	uq_bus_powered:1;	/* set if BUS powered quirk is present */
8218334Speter	uint8_t	uq_power_claim:1;	/* set if power claim quirk is present */
8318334Speter};
8418334Speter
8518334Speter/*
8618334Speter * The following structure defines an USB device. There exists one of
8718334Speter * these structures for every USB device.
8818334Speter */
8918334Speterstruct usb2_device {
9018334Speter	struct usb2_clear_stall_msg cs_msg[2];	/* generic clear stall
9118334Speter						 * messages */
9218334Speter	struct usb2_perm perm;
9318334Speter	struct sx default_sx[2];
9418334Speter	struct mtx default_mtx[1];
9518334Speter	struct cv default_cv[2];
9618334Speter	struct usb2_interface ifaces[USB_IFACE_MAX];
9718334Speter	struct usb2_pipe default_pipe;	/* Control Endpoint 0 */
9818334Speter	struct usb2_pipe pipes[USB_EP_MAX];
9918334Speter
10018334Speter	struct usb2_bus *bus;		/* our USB BUS */
10118334Speter	device_t parent_dev;		/* parent device */
10218334Speter	struct usb2_device *parent_hub;
10318334Speter	struct usb2_config_descriptor *cdesc;	/* full config descr */
10418334Speter	struct usb2_hub *hub;		/* only if this is a hub */
10518334Speter	struct usb_device *linux_dev;
10618334Speter	struct usb2_xfer *default_xfer[USB_DEFAULT_XFER_MAX];
10718334Speter	struct usb2_temp_data *usb2_template_ptr;
10818334Speter	struct usb2_pipe *pipe_curr;	/* current clear stall pipe */
10918334Speter	struct usb2_fifo *fifo[USB_FIFO_MAX];
11018334Speter	struct usb2_symlink *ugen_symlink;	/* our generic symlink */
11118334Speter
11218334Speter	uint32_t plugtime;		/* copy of "ticks" */
11318334Speter
11418334Speter	uint16_t refcount;
11518334Speter#define	USB_DEV_REF_MAX 0xffff
11618334Speter
11718334Speter	uint16_t power;			/* mA the device uses */
11818334Speter	uint16_t langid;		/* language for strings */
11918334Speter
12018334Speter	uint8_t	address;		/* device addess */
12118334Speter	uint8_t	device_index;		/* device index in "bus->devices" */
122	uint8_t	curr_config_index;	/* current configuration index */
123	uint8_t	curr_config_no;		/* current configuration number */
124	uint8_t	depth;			/* distance from root HUB */
125	uint8_t	speed;			/* low/full/high speed */
126	uint8_t	port_index;		/* parent HUB port index */
127	uint8_t	port_no;		/* parent HUB port number */
128	uint8_t	hs_hub_addr;		/* high-speed HUB address */
129	uint8_t	hs_port_no;		/* high-speed HUB port number */
130	uint8_t	driver_added_refcount;	/* our driver added generation count */
131	uint8_t	power_mode;		/* see USB_POWER_XXX */
132
133	/* the "flags" field is write-protected by "bus->mtx" */
134
135	struct usb2_device_flags flags;
136
137	struct usb2_endpoint_descriptor default_ep_desc;	/* for pipe 0 */
138	struct usb2_device_descriptor ddesc;	/* device descriptor */
139
140	char	serial[64];		/* serial number */
141	char	manufacturer[64];	/* manufacturer string */
142	char	product[64];		/* product string */
143};
144
145/* function prototypes */
146
147struct usb2_device *usb2_alloc_device(device_t parent_dev, struct usb2_bus *bus, struct usb2_device *parent_hub, uint8_t depth, uint8_t port_index, uint8_t port_no, uint8_t speed, uint8_t usb2_mode);
148struct usb2_pipe *usb2_get_pipe(struct usb2_device *udev, uint8_t iface_index, const struct usb2_config *setup);
149struct usb2_pipe *usb2_get_pipe_by_addr(struct usb2_device *udev, uint8_t ea_val);
150usb2_error_t usb2_interface_count(struct usb2_device *udev, uint8_t *count);
151usb2_error_t usb2_probe_and_attach(struct usb2_device *udev, uint8_t iface_index);
152usb2_error_t usb2_reset_iface_endpoints(struct usb2_device *udev, uint8_t iface_index);
153usb2_error_t usb2_set_config_index(struct usb2_device *udev, uint8_t index);
154usb2_error_t usb2_set_endpoint_stall(struct usb2_device *udev, struct usb2_pipe *pipe, uint8_t do_stall);
155usb2_error_t usb2_suspend_resume(struct usb2_device *udev, uint8_t do_suspend);
156void	usb2_detach_device(struct usb2_device *udev, uint8_t iface_index, uint8_t free_subdev);
157void	usb2_devinfo(struct usb2_device *udev, char *dst_ptr, uint16_t dst_len);
158void	usb2_free_device(struct usb2_device *udev);
159void   *usb2_find_descriptor(struct usb2_device *udev, void *id, uint8_t iface_index, uint8_t type, uint8_t type_mask, uint8_t subtype, uint8_t subtype_mask);
160void	usb_linux_free_device(struct usb_device *dev);
161
162#endif					/* _USB2_DEVICE_H_ */
163