usba_ugend.h revision d29f5a711240f866521445b1656d114da090335e
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_USBA_UGEND_H
#define _SYS_USBA_UGEND_H
/*
* UGEN - USB Generic Driver Support
* This file contains the UGEN specific data structure definitions
* and UGEN specific macros.
*/
#ifdef __cplusplus
extern "C" {
#endif
/* ugen handle passed to client drivers as an opaque token */
typedef struct {
struct ugen_state *hdl_ugenp;
char *hdl_log_name;
/* devt lookup support */
typedef struct ugen_devt_list_entry {
struct ugen_devt_list_entry *list_next;
struct ugen_devt_list_entry *list_prev;
struct ugen_state *list_state;
typedef struct ugen_devt_cache_entry {
struct ugen_state *cache_state;
#define UGEN_DEVT_CACHE_SIZE 10
/* minor node definition */
#ifdef _LP64
#define UGEN_MINOR_NODE_SIZE 32
#else
#define UGEN_MINOR_NODE_SIZE 18
#endif
#define UGEN_MINOR_INSTANCE_MASK(ugenp) \
#define UGEN_MINOR_INSTANCE_LIMIT(ugenp) \
#define UGEN_MINOR_INSTANCE_SHIFT(ugenp) \
#define UGEN_MINOR_IDX_SHIFT(ugenp) \
#define UGEN_MINOR_IDX_LIMIT(ugenp) \
#define UGEN_N_ENDPOINTS 32
/* UGEN specific macros */
/*
* minor node is contructed as follows for ugen driver (other client
* drivers that export a ugen interface may have a different layout):
*
* 17 9 0
* +---------------------+----------------------+
* | minor index | instance |
* +---------------------+----------------------+
*
* Note that only 512 endpoint minor nodes can be supported (each
* endpoint requires a status endpoint as well so we can only support
* 256 endpoints)
*
* the real minor node is:
*
* 47 40 32 24 16 8 0
* +-------+-------+-------+------+-------+-------+
* | cfgval| cfgidx| iface | alt |epidx | type |
* +-------+-------+-------+------+-------+-------+
*
* We get from the minor code to minor number thru ugen_minor_node_table
*/
typedef uint64_t ugen_minor_t;
#define UGEN_MINOR_DEV_STAT_NODE 0x00
#define UGEN_MINOR_EP_XFER_NODE 0x01
#define UGEN_MINOR_EP_STAT_NODE 0x02
#define UGEN_OWNS_DEVICE 0x04
#define UGEN_MINOR_EPIDX_SHIFT 8
#define UGEN_MINOR_ALT_SHIFT 16
#define UGEN_MINOR_IF_SHIFT 24
#define UGEN_MINOR_CFGIDX_SHIFT 32
#define UGEN_MINOR_CFGVAL_SHIFT 40
/*
* According to usb2.0 spec (table 9-13), for all ep, bits 10..0 specify the
* additional transaction opportunities per microframe.
*/
/*
* Structure for holding isoc data packets information
*/
typedef struct ugen_isoc_pkt_info {
/*
* Endpoint structure
* Holds all the information needed to manage the endpoint
*/
typedef struct ugen_ep {
int ep_xfer_oflag; /* open flag */
int ep_stat_oflag; /* open flag */
int ep_isoc_in_inited; /* isoc IN init flag */
} ugen_ep_t;
/* endpoints descriptor access */
#define UGEN_INTR_BUF_LIMIT 4096
#define UGEN_EP_STATE_NONE 0x00
#define UGEN_EP_STATE_ACTIVE 0x01
#define UGEN_EP_STATE_XFER_OPEN 0x02
#define UGEN_EP_STATE_STAT_OPEN 0x04
#define UGEN_EP_STATE_XS_OPEN (UGEN_EP_STATE_XFER_OPEN | \
#define UGEN_EP_STATE_INTR_IN_POLLING_ON 0x10
#define UGEN_EP_STATE_INTR_IN_POLLING_IS_STOPPED 0x20
#define UGEN_EP_STATE_INTR_IN_POLL_PENDING 0x40
#define UGEN_EP_STATE_ISOC_IN_POLLING_ON 0x100
#define UGEN_EP_STATE_ISOC_IN_POLLING_IS_STOPPED 0x200
#define UGEN_EP_STATE_ISOC_IN_POLL_PENDING 0x400
typedef struct ugen_dev_stat {
int dev_oflag; /* open flag */
/* dev_stat */
#define UGEN_DEV_STATUS_INACTIVE 0x0
#define UGEN_DEV_STATUS_ACTIVE 0x1
#define UGEN_DEV_STATUS_POLL_PENDING 0x2
#define UGEN_DEV_STATUS_CHANGED 0x4
/* Power Management support */
typedef struct ugen_power {
int pwr_busy; /* busy accounting */
} ugen_power_t;
/* UGEN state structure */
typedef struct ugen_state {
/* locks */
/* USB debugging system support */
/* registration data */
/* Endpoint management list */
/* encoding minor numbers as we only have 8 bits in the minor # */
/* device status management */
/* PM Support */
/* Maximum transfer size for bulk endpoints */
/* Used to deallocate allocated resources */
} ugen_state_t;
/* ugen_cleanup_flags */
#define UGEN_INIT_LOCKS 0x01
/* additional USB device states */
#define USB_UGEN_DEV_UNAVAILABLE_RESUME 0x90
#define USB_UGEN_DEV_UNAVAILABLE_RECONNECT 0x91
/* Debugging information */
#define UGEN_PRINT_ATTA 0x1
#define UGEN_PRINT_CBOPS 0x2
#define UGEN_PRINT_CPR 0x4
#define UGEN_PRINT_POLL 0x8
#define UGEN_PRINT_XFER 0x10
#define UGEN_PRINT_HOTPLUG 0x20
#define UGEN_PRINT_STAT 0x40
#define UGEN_PRINT_PM 0x80
#define UGEN_PRINT_ALL 0xFFFFFFFF
#ifdef __cplusplus
}
#endif
#endif /* _SYS_USBA_UGEND_H */