10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * CDDL HEADER START 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * The contents of this file are subject to the terms of the 52125Ssl147100 * Common Development and Distribution License (the "License"). 62125Ssl147100 * You may not use this file except in compliance with the License. 70Sstevel@tonic-gate * 80Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 100Sstevel@tonic-gate * See the License for the specific language governing permissions 110Sstevel@tonic-gate * and limitations under the License. 120Sstevel@tonic-gate * 130Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 140Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 160Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 170Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 180Sstevel@tonic-gate * 190Sstevel@tonic-gate * CDDL HEADER END 200Sstevel@tonic-gate */ 210Sstevel@tonic-gate /* 22*8550SSeth.Goldberg@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 230Sstevel@tonic-gate * Use is subject to license terms. 240Sstevel@tonic-gate */ 250Sstevel@tonic-gate 260Sstevel@tonic-gate #ifndef _SYS_USB_UHCI_H 270Sstevel@tonic-gate #define _SYS_USB_UHCI_H 280Sstevel@tonic-gate 290Sstevel@tonic-gate 300Sstevel@tonic-gate #include <sys/types.h> 310Sstevel@tonic-gate 320Sstevel@tonic-gate #ifdef __cplusplus 330Sstevel@tonic-gate extern "C" { 340Sstevel@tonic-gate #endif 350Sstevel@tonic-gate 360Sstevel@tonic-gate /* 370Sstevel@tonic-gate * Universal Host Controller Driver (UHCI) 380Sstevel@tonic-gate * 390Sstevel@tonic-gate * The UHCI driver is a driver which interfaces to the Universal 400Sstevel@tonic-gate * Serial Bus Driver (USBA) and the Host Controller (HC). The interface to 410Sstevel@tonic-gate * the Host Controller is defined by the Universal Host Controller 420Sstevel@tonic-gate * Interface spec. 430Sstevel@tonic-gate */ 440Sstevel@tonic-gate 450Sstevel@tonic-gate 460Sstevel@tonic-gate #define LEGACYMODE_REG_OFFSET 0xc0 470Sstevel@tonic-gate #define LEGACYMODE_REG_INIT_VALUE 0xaf00 480Sstevel@tonic-gate 490Sstevel@tonic-gate /* 500Sstevel@tonic-gate * The register set of the UCHI controller 510Sstevel@tonic-gate * This structure is laid out for proper alignment so no need to pack(1). 520Sstevel@tonic-gate */ 530Sstevel@tonic-gate typedef volatile struct hcr_regs { 540Sstevel@tonic-gate uint16_t USBCMD; 550Sstevel@tonic-gate uint16_t USBSTS; 560Sstevel@tonic-gate uint16_t USBINTR; 570Sstevel@tonic-gate uint16_t FRNUM; 580Sstevel@tonic-gate uint32_t FRBASEADD; 590Sstevel@tonic-gate uchar_t SOFMOD; 600Sstevel@tonic-gate uchar_t rsvd[3]; 610Sstevel@tonic-gate uint16_t PORTSC[2]; 620Sstevel@tonic-gate } hc_regs_t; 630Sstevel@tonic-gate 640Sstevel@tonic-gate /* 650Sstevel@tonic-gate * #defines for the USB Command Register 660Sstevel@tonic-gate */ 670Sstevel@tonic-gate #define USBCMD_REG_MAXPKT_64 0x0080 680Sstevel@tonic-gate #define USBCMD_REG_CONFIG_FLAG 0x0040 690Sstevel@tonic-gate #define USBCMD_REG_SW_DEBUG 0x0020 700Sstevel@tonic-gate #define USBCMD_REG_FGBL_RESUME 0x0010 71*8550SSeth.Goldberg@Sun.COM #define USBCMD_REG_ENTER_GBL_SUSPEND 0x0008 720Sstevel@tonic-gate #define USBCMD_REG_GBL_RESET 0x0004 730Sstevel@tonic-gate #define USBCMD_REG_HC_RESET 0x0002 740Sstevel@tonic-gate #define USBCMD_REG_HC_RUN 0x0001 750Sstevel@tonic-gate 760Sstevel@tonic-gate 770Sstevel@tonic-gate /* 780Sstevel@tonic-gate * #defines for the USB Status Register 790Sstevel@tonic-gate */ 800Sstevel@tonic-gate #define USBSTS_REG_HC_HALTED 0x0020 810Sstevel@tonic-gate #define USBSTS_REG_HC_PROCESS_ERR 0x0010 820Sstevel@tonic-gate #define USBSTS_REG_HOST_SYS_ERR 0x0008 830Sstevel@tonic-gate #define USBSTS_REG_RESUME_DETECT 0x0004 840Sstevel@tonic-gate #define USBSTS_REG_USB_ERR_INTR 0x0002 850Sstevel@tonic-gate #define USBSTS_REG_USB_INTR 0x0001 860Sstevel@tonic-gate 870Sstevel@tonic-gate /* 880Sstevel@tonic-gate * #defines for the USB Root Hub Port Register 890Sstevel@tonic-gate */ 900Sstevel@tonic-gate #define HCR_PORT_CCS 0x1 910Sstevel@tonic-gate #define HCR_PORT_CSC 0x2 920Sstevel@tonic-gate #define HCR_PORT_ENABLE 0x4 930Sstevel@tonic-gate #define HCR_PORT_ENDIS_CHG 0x8 940Sstevel@tonic-gate #define HCR_PORT_LINE_STATSU 0x30 950Sstevel@tonic-gate #define HCR_PORT_RESUME_DETECT 0x40 960Sstevel@tonic-gate #define HCR_PORT_LSDA 0x100 970Sstevel@tonic-gate #define HCR_PORT_RESET 0x200 980Sstevel@tonic-gate #define HCR_PORT_SUSPEND 0x1000 990Sstevel@tonic-gate 1000Sstevel@tonic-gate /* 1010Sstevel@tonic-gate * #defines for USB Interrupt Enable Register 1020Sstevel@tonic-gate */ 1030Sstevel@tonic-gate #define USBINTR_REG_SPINT_EN 0x0008 1040Sstevel@tonic-gate #define USBINTR_REG_IOC_EN 0x0004 1050Sstevel@tonic-gate #define USBINTR_REG_RESUME_INT_EN 0x0002 1060Sstevel@tonic-gate #define USBINTR_REG_TOCRC_INT_EN 0x0001 1070Sstevel@tonic-gate 1080Sstevel@tonic-gate #define ENABLE_ALL_INTRS 0x000F 1090Sstevel@tonic-gate #define DISABLE_ALL_INTRS 0x0000 1106427Ssl147100 #define UHCI_INTR_MASK 0x1f 1110Sstevel@tonic-gate 1120Sstevel@tonic-gate 1130Sstevel@tonic-gate #define SetReg32(hndl, addr, val) ddi_put32((hndl), \ 1140Sstevel@tonic-gate &(addr), (val)) 1150Sstevel@tonic-gate #define GetReg32(hndl, addr) ddi_get32((hndl), &(addr)) 1160Sstevel@tonic-gate 1170Sstevel@tonic-gate #define SetQH32(ucp, addr, val) \ 1180Sstevel@tonic-gate SetReg32((ucp)->uhci_qh_pool_mem_handle, (addr), (val)) 1190Sstevel@tonic-gate #define GetQH32(ucp, addr) \ 1200Sstevel@tonic-gate GetReg32((ucp)->uhci_qh_pool_mem_handle, (addr)) 1210Sstevel@tonic-gate 1220Sstevel@tonic-gate #define SetTD32(ucp, addr, val) \ 1230Sstevel@tonic-gate SetReg32((ucp)->uhci_td_pool_mem_handle, (addr), (val)) 1240Sstevel@tonic-gate #define GetTD32(ucp, addr) \ 1250Sstevel@tonic-gate GetReg32((ucp)->uhci_td_pool_mem_handle, (addr)) 1260Sstevel@tonic-gate 1270Sstevel@tonic-gate #define SetFL32(ucp, addr, val) \ 1280Sstevel@tonic-gate SetReg32((ucp)->uhci_flt_mem_handle, (addr), (val)) 1290Sstevel@tonic-gate #define GetFL32(ucp, addr) \ 1300Sstevel@tonic-gate GetReg32((ucp)->uhci_flt_mem_handle, (addr)) 1310Sstevel@tonic-gate 1320Sstevel@tonic-gate 1330Sstevel@tonic-gate /* 1340Sstevel@tonic-gate * UHCI Queue Head structure, aligned on 16 byte boundary 1350Sstevel@tonic-gate */ 1360Sstevel@tonic-gate typedef struct uhci_qh { 1370Sstevel@tonic-gate /* Hardware controlled bits */ 1380Sstevel@tonic-gate uint32_t link_ptr; /* Next Queue Head / TD */ 1390Sstevel@tonic-gate uint32_t element_ptr; /* Next queue head / TD */ 1400Sstevel@tonic-gate 1410Sstevel@tonic-gate /* Software controlled bits */ 1420Sstevel@tonic-gate uint16_t node; /* Node that its attached */ 1430Sstevel@tonic-gate uint16_t qh_flag; /* See below */ 1440Sstevel@tonic-gate 1450Sstevel@tonic-gate struct uhci_qh *prev_qh; /* Pointer to Prev queue head */ 1460Sstevel@tonic-gate struct uhci_td *td_tailp; /* Pointer to the last TD of QH */ 1470Sstevel@tonic-gate struct uhci_bulk_isoc_xfer_info *bulk_xfer_info; 1480Sstevel@tonic-gate uint64_t __pad1; /* align to 16 bytes */ 1490Sstevel@tonic-gate } queue_head_t; 1500Sstevel@tonic-gate 1510Sstevel@tonic-gate #define NUM_STATIC_NODES 63 1520Sstevel@tonic-gate #define NUM_INTR_QH_LISTS 64 1530Sstevel@tonic-gate #define NUM_FRAME_LST_ENTRIES 1024 1540Sstevel@tonic-gate #define TREE_HEIGHT 5 1550Sstevel@tonic-gate #define VIRTUAL_TREE_HEIGHT 5 1560Sstevel@tonic-gate #define SIZE_OF_FRAME_LST_TABLE 1024 * 4 1570Sstevel@tonic-gate 1580Sstevel@tonic-gate #define HC_TD_HEAD 0x0 1590Sstevel@tonic-gate #define HC_QUEUE_HEAD 0x2 1600Sstevel@tonic-gate #define HC_DEPTH_FIRST 0x4 1610Sstevel@tonic-gate #define HC_END_OF_LIST 0x1 1620Sstevel@tonic-gate 1630Sstevel@tonic-gate #define QUEUE_HEAD_FLAG_STATIC 0x1 1640Sstevel@tonic-gate #define QUEUE_HEAD_FLAG_FREE 0x2 1650Sstevel@tonic-gate #define QUEUE_HEAD_FLAG_BUSY 0x3 1660Sstevel@tonic-gate 1670Sstevel@tonic-gate #define QH_LINK_PTR_MASK 0xFFFFFFF0 1680Sstevel@tonic-gate #define QH_ELEMENT_PTR_MASK 0xFFFFFFF0 1690Sstevel@tonic-gate #define FRAME_LST_PTR_MASK 0xFFFFFFF0 1700Sstevel@tonic-gate 1710Sstevel@tonic-gate 1720Sstevel@tonic-gate #define GetField(u, td, f, o, l) \ 1730Sstevel@tonic-gate ((GetTD32(u, (td)->f) >> (o)) & ((1U<<l)-1)) 1740Sstevel@tonic-gate 1750Sstevel@tonic-gate #define SetField(u, td, f, o, l, v) \ 1760Sstevel@tonic-gate SetTD32(u, (td)->f, \ 1770Sstevel@tonic-gate (GetTD32(u, (td)->f) & ~(((1U<<l)-1) << o)) | \ 1780Sstevel@tonic-gate (((v) & ((1U<<l)-1)) << o)) 1790Sstevel@tonic-gate 1800Sstevel@tonic-gate #define GetTD_alen(u, td) GetField((u), (td), dw2, 0, 11) 1810Sstevel@tonic-gate #define GetTD_status(u, td) GetField((u), (td), dw2, 16, 8) 1820Sstevel@tonic-gate #define GetTD_ioc(u, td) GetField((u), (td), dw2, 24, 1) 1830Sstevel@tonic-gate #define GetTD_iso(u, td) GetField((u), (td), dw2, 25, 1) 1840Sstevel@tonic-gate #define GetTD_ls(u, td) GetField((u), (td), dw2, 26, 1) 1850Sstevel@tonic-gate #define GetTD_c_err(u, td) GetField((u), (td), dw2, 27, 2) 1860Sstevel@tonic-gate #define GetTD_spd(u, td) GetField((u), (td), dw2, 29, 1) 1870Sstevel@tonic-gate #define GetTD_PID(u, td) GetField((u), (td), dw3, 0, 8) 1880Sstevel@tonic-gate #define GetTD_devaddr(u, td) GetField((u), (td), dw3, 8, 7) 1890Sstevel@tonic-gate #define GetTD_endpt(u, td) GetField((u), (td), dw3, 15, 4) 1900Sstevel@tonic-gate #define GetTD_dtogg(u, td) GetField((u), (td), dw3, 19, 1) 1910Sstevel@tonic-gate #define GetTD_mlen(u, td) GetField((u), (td), dw3, 21, 11) 1920Sstevel@tonic-gate 1930Sstevel@tonic-gate #define SetTD_alen(u, td, v) SetField((u), (td), dw2, 0, 11, (v)) 1940Sstevel@tonic-gate #define SetTD_status(u, td, v) SetField((u), (td), dw2, 16, 8, (v)) 1950Sstevel@tonic-gate #define SetTD_ioc(u, td, v) SetField((u), (td), dw2, 24, 1, (v)) 1960Sstevel@tonic-gate #define SetTD_iso(u, td, v) SetField((u), (td), dw2, 25, 1, (v)) 1970Sstevel@tonic-gate #define SetTD_ls(u, td, v) SetField((u), (td), dw2, 26, 1, (v)) 1980Sstevel@tonic-gate #define SetTD_c_err(u, td, v) SetField((u), (td), dw2, 27, 2, (v)) 1990Sstevel@tonic-gate #define SetTD_spd(u, td, v) SetField((u), (td), dw2, 29, 1, (v)) 2000Sstevel@tonic-gate #define SetTD_PID(u, td, v) SetField((u), (td), dw3, 0, 8, (v)) 2010Sstevel@tonic-gate #define SetTD_devaddr(u, td, v) SetField((u), (td), dw3, 8, 7, (v)) 2020Sstevel@tonic-gate #define SetTD_endpt(u, td, v) SetField((u), (td), dw3, 15, 4, (v)) 2030Sstevel@tonic-gate #define SetTD_dtogg(u, td, v) SetField((u), (td), dw3, 19, 1, (v)) 2040Sstevel@tonic-gate #define SetTD_mlen(u, td, v) SetField((u), (td), dw3, 21, 11, (v)) 2050Sstevel@tonic-gate 2060Sstevel@tonic-gate /* 2070Sstevel@tonic-gate * UHCI Transfer Descriptor structure, aligned on 16 byte boundary 2080Sstevel@tonic-gate */ 2090Sstevel@tonic-gate typedef struct uhci_td { 2100Sstevel@tonic-gate 2110Sstevel@tonic-gate /* Information required by HC for executing the request */ 2120Sstevel@tonic-gate /* Pointer to the next TD/QH */ 2130Sstevel@tonic-gate uint32_t link_ptr; 2140Sstevel@tonic-gate uint32_t dw2; 2150Sstevel@tonic-gate uint32_t dw3; 2162125Ssl147100 /* Data buffer address */ 2170Sstevel@tonic-gate uint32_t buffer_address; 2180Sstevel@tonic-gate 2190Sstevel@tonic-gate /* Information required by HCD for managing the request */ 2200Sstevel@tonic-gate struct uhci_td *qh_td_prev; 2210Sstevel@tonic-gate struct uhci_td *tw_td_next; 2220Sstevel@tonic-gate struct uhci_td *outst_td_next; 2230Sstevel@tonic-gate struct uhci_td *outst_td_prev; 2240Sstevel@tonic-gate struct uhci_trans_wrapper *tw; 2250Sstevel@tonic-gate struct uhci_td *isoc_next; 2260Sstevel@tonic-gate struct uhci_td *isoc_prev; 2270Sstevel@tonic-gate ushort_t isoc_pkt_index; 2280Sstevel@tonic-gate ushort_t flag; 2290Sstevel@tonic-gate uint_t starting_frame; 2300Sstevel@tonic-gate uint_t _pad[3]; /* 16 byte alignment */ 2310Sstevel@tonic-gate } uhci_td_t; 2320Sstevel@tonic-gate 2330Sstevel@tonic-gate #define TD_FLAG_FREE 0x1 2340Sstevel@tonic-gate #define TD_FLAG_BUSY 0x2 2350Sstevel@tonic-gate #define TD_FLAG_DUMMY 0x3 2360Sstevel@tonic-gate 2370Sstevel@tonic-gate #define INTERRUPT_ON_COMPLETION 0x1 2380Sstevel@tonic-gate #define END_POINT_ADDRESS_MASK 0xF 2390Sstevel@tonic-gate #define UHCI_MAX_ERR_COUNT 3 2400Sstevel@tonic-gate #define MAX_NUM_BULK_TDS_PER_XFER 128 2410Sstevel@tonic-gate 2420Sstevel@tonic-gate /* section 3.2.2 of UHCI1.1 spec, bits 23:16 of status field */ 2430Sstevel@tonic-gate #define UHCI_TD_ACTIVE 0x80 2440Sstevel@tonic-gate #define UHCI_TD_STALLED 0x40 2450Sstevel@tonic-gate #define UHCI_TD_DATA_BUFFER_ERR 0x20 2460Sstevel@tonic-gate #define UHCI_TD_BABBLE_ERR 0x10 2470Sstevel@tonic-gate #define UHCI_TD_NAK_RECEIVED 0x08 2480Sstevel@tonic-gate #define UHCI_TD_CRC_TIMEOUT 0x04 2490Sstevel@tonic-gate #define UHCI_TD_BITSTUFF_ERR 0x02 2500Sstevel@tonic-gate 2510Sstevel@tonic-gate #define TD_INACTIVE 0x7F 2520Sstevel@tonic-gate #define TD_STATUS_MASK 0x76 2530Sstevel@tonic-gate #define ZERO_LENGTH 0x7FF 2540Sstevel@tonic-gate 2550Sstevel@tonic-gate #define PID_SETUP 0x2D 2560Sstevel@tonic-gate #define PID_IN 0x69 2570Sstevel@tonic-gate #define PID_OUT 0xe1 2580Sstevel@tonic-gate 2590Sstevel@tonic-gate #define SETUP_SIZE 8 2600Sstevel@tonic-gate 2610Sstevel@tonic-gate #define SETUP 0x11 2620Sstevel@tonic-gate #define DATA 0x12 2630Sstevel@tonic-gate #define STATUS 0x13 2640Sstevel@tonic-gate 2650Sstevel@tonic-gate #define UHCI_INVALID_PTR NULL 2660Sstevel@tonic-gate #define LOW_SPEED_DEVICE 1 2670Sstevel@tonic-gate 2680Sstevel@tonic-gate /* 2690Sstevel@tonic-gate * These provide synchronization between TD deletions. 2700Sstevel@tonic-gate */ 2710Sstevel@tonic-gate #define UHCI_NOT_CLAIMED 0x0 2720Sstevel@tonic-gate #define UHCI_INTR_HDLR_CLAIMED 0x1 2730Sstevel@tonic-gate #define UHCI_MODIFY_TD_BITS_CLAIMED 0x2 2740Sstevel@tonic-gate #define UHCI_TIMEOUT_HDLR_CLAIMED 0x3 2750Sstevel@tonic-gate 2760Sstevel@tonic-gate 2770Sstevel@tonic-gate /* 2782125Ssl147100 * Structure for Bulk and Isoc TD pools 2792125Ssl147100 */ 2802125Ssl147100 typedef struct uhci_bulk_isoc_td_pool { 2812125Ssl147100 caddr_t pool_addr; 2822125Ssl147100 ddi_dma_cookie_t cookie; /* DMA cookie */ 2832125Ssl147100 ddi_dma_handle_t dma_handle; /* DMA handle */ 2842125Ssl147100 ddi_acc_handle_t mem_handle; /* Memory handle */ 2852125Ssl147100 ushort_t num_tds; 2862125Ssl147100 } uhci_bulk_isoc_td_pool_t; 2872125Ssl147100 2882125Ssl147100 /* 2890Sstevel@tonic-gate * Structure for Bulk and Isoc transfers 2900Sstevel@tonic-gate */ 2910Sstevel@tonic-gate typedef struct uhci_bulk_isoc_xfer_info { 2922125Ssl147100 uhci_bulk_isoc_td_pool_t *td_pools; 2932125Ssl147100 ushort_t num_pools; 2942125Ssl147100 ushort_t num_tds; 2952125Ssl147100 } uhci_bulk_isoc_xfer_t; 2962125Ssl147100 2972125Ssl147100 /* 2982125Ssl147100 * Structure for Isoc DMA buffer 2992125Ssl147100 * One Isoc transfer includes multiple Isoc packets. 3002125Ssl147100 * One DMA buffer is allocated for one packet each. 3012125Ssl147100 */ 3022125Ssl147100 typedef struct uhci_isoc_buf { 3032125Ssl147100 caddr_t buf_addr; /* Starting buffer address */ 3040Sstevel@tonic-gate ddi_dma_cookie_t cookie; /* DMA cookie */ 3050Sstevel@tonic-gate ddi_dma_handle_t dma_handle; /* DMA handle */ 3060Sstevel@tonic-gate ddi_acc_handle_t mem_handle; /* Memory handle */ 3072125Ssl147100 size_t length; /* Buffer length */ 3082125Ssl147100 ushort_t index; 3092125Ssl147100 } uhci_isoc_buf_t; 3100Sstevel@tonic-gate 3110Sstevel@tonic-gate /* 3120Sstevel@tonic-gate * Macros related to ISOC transfers 3130Sstevel@tonic-gate */ 3140Sstevel@tonic-gate #define UHCI_SIZE_OF_HW_FRNUM 11 3150Sstevel@tonic-gate #define UHCI_BIT_10_MASK 0x400 3160Sstevel@tonic-gate #define UHCI_MAX_ISOC_FRAMES 1024 3170Sstevel@tonic-gate #define UHCI_MAX_ISOC_PKTS 256 3180Sstevel@tonic-gate #define UHCI_DEFAULT_ISOC_RCV_PKTS 1 /* isoc pkts per req */ 3190Sstevel@tonic-gate 3200Sstevel@tonic-gate #define FRNUM_MASK 0x3FF 3210Sstevel@tonic-gate #define SW_FRNUM_MASK 0xFFFFFFFFFFFFF800 3220Sstevel@tonic-gate #define INVALID_FRNUM 0 3230Sstevel@tonic-gate #define FRNUM_OFFSET 5 3240Sstevel@tonic-gate #define MAX_FRAME_NUM 1023 3250Sstevel@tonic-gate 3260Sstevel@tonic-gate typedef uint32_t frame_lst_table_t; 3270Sstevel@tonic-gate 3280Sstevel@tonic-gate /* 3290Sstevel@tonic-gate * Bandwidth allocation 3300Sstevel@tonic-gate * The following definitions are used during bandwidth 3310Sstevel@tonic-gate * calculations for a given endpoint maximum packet size. 3320Sstevel@tonic-gate */ 3330Sstevel@tonic-gate #define MAX_BUS_BANDWIDTH 1500 /* Up to 1500 bytes per frame */ 3340Sstevel@tonic-gate #define MAX_POLL_INTERVAL 255 /* Maximum polling interval */ 3350Sstevel@tonic-gate #define MIN_POLL_INTERVAL 1 /* Minimum polling interval */ 3360Sstevel@tonic-gate #define SOF 6 /* Length in bytes of SOF */ 3370Sstevel@tonic-gate #define EOF 2 /* Length in bytes of EOF */ 3380Sstevel@tonic-gate 3390Sstevel@tonic-gate /* 3400Sstevel@tonic-gate * Minimum polling interval for low speed endpoint 3410Sstevel@tonic-gate * 3420Sstevel@tonic-gate * According USB Specifications, a full-speed endpoint can specify 3430Sstevel@tonic-gate * a desired polling interval 1ms to 255ms and a low speed endpoints 3440Sstevel@tonic-gate * are limited to specifying only 10ms to 255ms. But some old keyboards 3450Sstevel@tonic-gate * and mice uses polling interval of 8ms. For compatibility purpose, 3460Sstevel@tonic-gate * we are using polling interval between 8ms and 255ms for low speed 3470Sstevel@tonic-gate * endpoints. 3480Sstevel@tonic-gate */ 3490Sstevel@tonic-gate #define MIN_LOW_SPEED_POLL_INTERVAL 8 3500Sstevel@tonic-gate 3510Sstevel@tonic-gate /* 3520Sstevel@tonic-gate * For non-periodic transfers, reserve at least for one low-speed device 3530Sstevel@tonic-gate * transaction and according to USB Bandwidth Analysis white paper, it 3540Sstevel@tonic-gate * comes around 12% of USB frame time. Then periodic transfers will get 3550Sstevel@tonic-gate * 88% of USB frame time. 3560Sstevel@tonic-gate */ 3570Sstevel@tonic-gate #define MAX_PERIODIC_BANDWIDTH (((MAX_BUS_BANDWIDTH - SOF - EOF)*88)/100) 3580Sstevel@tonic-gate 3590Sstevel@tonic-gate /* 3600Sstevel@tonic-gate * The following are the protocol overheads in terms of Bytes for the 3610Sstevel@tonic-gate * different transfer types. All these protocol overhead values are 3620Sstevel@tonic-gate * derived from the 5.9.3 section of USB Specification and with the 3630Sstevel@tonic-gate * help of Bandwidth Analysis white paper which is posted on the USB 3640Sstevel@tonic-gate * developer forum. 3650Sstevel@tonic-gate */ 3660Sstevel@tonic-gate #define FS_NON_ISOC_PROTO_OVERHEAD 14 3670Sstevel@tonic-gate #define FS_ISOC_INPUT_PROTO_OVERHEAD 11 3680Sstevel@tonic-gate #define FS_ISOC_OUTPUT_PROTO_OVERHEAD 10 3690Sstevel@tonic-gate #define LOW_SPEED_PROTO_OVERHEAD 97 3700Sstevel@tonic-gate #define HUB_LOW_SPEED_PROTO_OVERHEAD 01 3710Sstevel@tonic-gate 3720Sstevel@tonic-gate /* 3730Sstevel@tonic-gate * The Host Controller (HC) delays are the USB host controller specific 3740Sstevel@tonic-gate * delays. The value shown below is the host controller delay for the 3750Sstevel@tonic-gate * Sand core USB host controller. 3760Sstevel@tonic-gate */ 3770Sstevel@tonic-gate #define HOST_CONTROLLER_DELAY 18 3780Sstevel@tonic-gate 3790Sstevel@tonic-gate /* 3800Sstevel@tonic-gate * The low speed clock below represents that to transmit one low-speed 3810Sstevel@tonic-gate * bit takes eight times more than one full speed bit time. 3820Sstevel@tonic-gate */ 3830Sstevel@tonic-gate #define LOW_SPEED_CLOCK 8 3840Sstevel@tonic-gate 3850Sstevel@tonic-gate /* the 16 byte alignment is required for every TD and QH start addr */ 3860Sstevel@tonic-gate #define UHCI_QH_ALIGN_SZ 16 3870Sstevel@tonic-gate #define UHCI_TD_ALIGN_SZ 16 3880Sstevel@tonic-gate 3890Sstevel@tonic-gate #ifdef __cplusplus 3900Sstevel@tonic-gate } 3910Sstevel@tonic-gate #endif 3920Sstevel@tonic-gate 3930Sstevel@tonic-gate #endif /* _SYS_USB_UHCI_H */ 394