31#define EHCI_TUNE_CERR 0
32#define EHCI_TUNE_RL_HS 4
33#define EHCI_TUNE_RL_TT 0
34#define EHCI_TUNE_MULT_HS 1
35#define EHCI_TUNE_MULT_TT 1
36#define EHCI_TUNE_FLS 2
40 ehci_dbg(
"%s td %p n%08x %08x t%08x p0=%08x\n", label, qtd,
46 ehci_dbg(
" p1=%08x p2=%08x p3=%08x p4=%08x\n",
55 ehci_dbg(
"%s qh %p n%08x info %x %x qtd %x\n", label,
70 ehci_dbg(
"async_next: %08x\n", async);
72 "command %06x %s=%d ithresh=%d%s%s%s%s %s %s\n",
92 "status %04x%s%s%s%s%s%s%s%s%s%s\n",
111 dbg_qh(
ehci,
"qh", qh);
116 dbg_qtd(
ehci,
"qtd", qtd);
127 dbg_qh(
ehci,
"qh", qh);
132 dbg_qtd(
ehci,
"qtd", qtd);
162#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT)
169 u32 mask,
u32 done,
int usec) {
171 u32 result,
status, g_status, g_mstatus, ret = 0;
214 if (result == done) {
219 }
while (temp < usec/*usec > 0*/);
251static int ehci_init(
struct ehci_hcd *
ehci,
int default_ctrlr) {
285 size_t len,
int token,
int maxpacket) {
292 count = 0x1000 - (buf & 0x0fff);
300 for (i = 1; count < len && i < 5; i++) {
306 if ((count + 0x1000) < len)
314 count -= (count % maxpacket);
323#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
325#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
386 head = qtd = ehci_qtd_alloc(
ehci);
388 if (!head)
return NULL;
403 token | (2 << 8), 8);
408 qtd = ehci_qtd_alloc(
ehci);
409 if (!qtd)
goto cleanup;
412 qtd_prev->
next = qtd;
438 this_qtd_len = qtd_fill(qtd, buf, len, token, maxpacket);
451 if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
458 qtd = ehci_qtd_alloc(
ehci);
459 if (!qtd)
goto cleanup;
462 qtd_prev->
next = qtd;
483 qtd = ehci_qtd_alloc(
ehci);
484 if (!qtd)
goto cleanup;
487 qtd_prev->
next = qtd;
490 qtd_fill(qtd, 0, 0, token, 0);
509 u32 info1 = 0, info2 = 0;
528 memset(qh, 0, 12 * 4);
538 info1 |= ((
urb->
ep)&0xf) << 8;
627 qh_end_transfer(
ehci);
642 ehci_dbg(
"urb res end %d\n", retval);
654 ehci_dbg(
"control msg: rt%02X r%02X v%04X i%04X s%04x %p\n", bmRequestType, bmRequest, wValue, wIndex, wLength, buf);
655 req->bRequestType = bmRequestType;
656 req->bRequest = bmRequest;
657 req->wValue = bswap_16(wValue);
658 req->wIndex = bswap_16(wIndex);
659 req->wLength = bswap_16(wLength);
687 urb.
input = (bEndpoint & 0x80) != 0;
691 ehci_dbg(
"bulk msg: ep:%02X size:%02X addr:%04X", bEndpoint, wLength, rpData);
701 int retval = 0, i, f;
710 ehci_dbg(
"port %d has usb2 device connected! reset it...\n",
port);
715 for (i = 0; i < 4; i++)
741 retval = handshake(
ehci, status_reg, status_reg,
759 if (retval >= 0)
break;
803 int i, f, retval = 0;
823 for (i = 0; i < 4; i++)
833 retval = handshake(
ehci, status_reg, status_reg,
836 ehci_dbg(
"ehci_reset_usb_port handshake retval %d\n",retval);
849 printf(
"EHCI bus %d port %d: low speed, releasing to OHCI\n",
ehci->
bus_id,
port+1);
868 for (i = 0; i < 3; i++) {
874 ehci_dbg(
"unable to get device desc (1)...\n");
883 for (i = 0; i < 3; i++) {
891 ehci_dbg(
"unable to get device desc (2)...\n");
900 for (i = 0; i < 3; i++) {
909 ehci_dbg(
"unable to get device desc (3)...\n");
918 if (retval < 0)
return -2201;
926 ehci_dbg(
"unable to set device addr...\n");
927 retval = -8000 -
cnt;
947 ehci_dbg(
"unable to get device desc...\n");
952 else {retval=-1;
continue;}
954 }
while (retval < 0 &&
cnt < 5);
1039 if (dev->
fd ==
fd) {
1046#define g_ehci #error
int ehci_mem_init(struct ehci_hcd *ehci)
int ehci_release_ports(struct ehci_hcd *ehci)
s32 ehci_control_message(struct ehci_hcd *ehci, struct ehci_device *dev, u8 bmRequestType, u8 bmRequest, u16 wValue, u16 wIndex, u16 wLength, void *buf)
void ehci_adquire_port(struct ehci_hcd *ehci, int port)
int ehci_do_urb(struct ehci_hcd *ehci, struct ehci_device *dev, struct ehci_urb *urb)
void dump_qh(struct ehci_hcd *ehci, struct ehci_qh *qh)
int ehci_open_device(struct ehci_hcd *ehci, int vid, int pid, int fd)
void * ehci_fd_to_dev(struct ehci_hcd *ehci, int fd)
int ehci_close_device(struct ehci_device *dev)
int ehci_reset_device(struct ehci_hcd *ehci, struct ehci_device *dev)
int ehci_reset_port_old(struct ehci_hcd *ehci, int port)
int ehci_reset_port(struct ehci_hcd *ehci, int port)
int ehci_init_port(struct ehci_hcd *ehci, int port)
struct ehci_qtd * qh_urb_transaction(struct ehci_hcd *ehci, struct ehci_urb *urb)
#define EHCI_TUNE_MULT_HS
int ehci_reset_usb_port(struct ehci_hcd *ehci, int port)
int ehci_reset_port2(struct ehci_hcd *ehci, int port)
int ehci_get_device_list(struct ehci_hcd *ehci, u8 maxdev, u8 b0, u8 *num, u16 *buf)
#define max_packet(wMaxPacketSize)
int ehci_discover(struct ehci_hcd *ehci)
void debug_qtds(struct ehci_hcd *ehci)
s32 ehci_bulk_message(struct ehci_hcd *ehci, struct ehci_device *dev, u8 bEndpoint, u16 wLength, void *rpData)
dma_addr_t ehci_dma_map_bidir(void *buf, size_t len)
dma_addr_t ehci_dma_map_to(void *buf, size_t len)
void ehci_dma_unmap_bidir(dma_addr_t buf, size_t len)
#define set_toggle(dev, ep, v)
dma_addr_t ehci_dma_map_from(void *buf, size_t len)
void ehci_msleep(int time)
void ehci_usleep(int time)
void ehci_dma_unmap_from(dma_addr_t buf, size_t len)
#define get_toggle(dev, ep)
void ehci_dma_unmap_to(dma_addr_t buf, size_t len)
struct ehci_device devices[EHCI_MAX_ROOT_PORTS]
struct ehci_regs __iomem * regs
struct ehci_qtd * qtd_head
u32 transfer_buffer_length
#define ehci_writel(v, a)
#define print_hex_dump_bytes(a, b, c, d)
#define USB_CTRLTYPE_DIR_HOST2DEVICE
#define USB_CTRLTYPE_DIR_DEVICE2HOST
void * USB_Alloc(int size)
#define USB_REQ_GETDESCRIPTOR
s32 USB_ClearHalt(struct ehci_hcd *ehci, struct ehci_device *fd, u8 endpointAddress)
#define USB_REQ_SETADDRESS
uint64_t u64
64bit unsigned integer
uint8_t u8
8bit unsigned integer
uint16_t u16
16bit unsigned integer
int32_t s32
32bit signed integer
uint32_t u32
32bit unsigned integer