From 1857a7c4faa63b728fdfdd0455bcc3b9bd12ce23 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Fri, 18 Sep 2009 22:30:04 +0200 Subject: [PATCH] roothubports will be configured after init of ohci --- usb/host/ohci.c | 92 ++++++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/usb/host/ohci.c b/usb/host/ohci.c index a04743a..8a2eff6 100644 --- a/usb/host/ohci.c +++ b/usb/host/ohci.c @@ -26,8 +26,17 @@ Copyright (C) 2009 Sebastian Falbesoner (((dword) & 0x0000FF00) << 8) | \ (((dword) & 0x000000FF) << 24) ) +static struct endpoint_descriptor *allocate_endpoint(); +static struct general_td *allocate_general_td(size_t); +static void control_quirk(); +static void dbg_op_state(); +static void dbg_td_flag(u32 flag); +static void configure_ports(u8 from_init); +static void setup_port(u32 reg, u8 from_init); + static struct ohci_hcca hcca_oh0; + static struct endpoint_descriptor *allocate_endpoint() { struct endpoint_descriptor *ep; @@ -358,9 +367,48 @@ void hcdi_init() irq_restore(cookie); + configure_ports((u8)1); + dbg_op_state(); } +static void configure_ports(u8 from_init) +{ + printf("OHCI0_HC_RH_DESCRIPTOR_A:\t0x%08X\n", read32(OHCI0_HC_RH_DESCRIPTOR_A)); + printf("OHCI0_HC_RH_DESCRIPTOR_B:\t0x%08X\n", read32(OHCI0_HC_RH_DESCRIPTOR_B)); + printf("OHCI0_HC_RH_STATUS:\t\t0x%08X\n", read32(OHCI0_HC_RH_STATUS)); + printf("OHCI0_HC_RH_PORT_STATUS_1:\t0x%08X\n", read32(OHCI0_HC_RH_PORT_STATUS_1)); + printf("OHCI0_HC_RH_PORT_STATUS_2:\t0x%08X\n", read32(OHCI0_HC_RH_PORT_STATUS_2)); + + setup_port(OHCI0_HC_RH_PORT_STATUS_1, from_init); + setup_port(OHCI0_HC_RH_PORT_STATUS_2, from_init); +} + +static void setup_port(u32 reg, u8 from_init) +{ + u32 port = read32(reg); + if((port & RH_PS_CCS) && ((port & RH_PS_CSC) || from_init)) { + if(!from_init) + write32(reg, RH_PS_CSC); + + wait_ms(100); + + /* clear CSC flag, set PES and start port reset (PRS) */ + write32(reg, RH_PS_PES); + write32(reg, RH_PS_PRS); + + /* spin until port reset is complete */ + port = read32(reg); + while(!(port & RH_PS_PRSC)) { + udelay(2); + printf("fuck\n"); + port = read32(reg); + } + + (void) usb_add_device(); + } +} + void hcdi_irq() { /* read interrupt status */ @@ -393,49 +441,7 @@ void hcdi_irq() if (flags & OHCI_INTR_RHSC) { printf("RootHubStatusChange\n"); /* TODO: set some next_statechange variable... */ - u32 port1 = read32(OHCI0_HC_RH_PORT_STATUS_1); - u32 port2 = read32(OHCI0_HC_RH_PORT_STATUS_2); - printf("OHCI0_HC_RH_DESCRIPTOR_A:\t0x%08X\n", read32(OHCI0_HC_RH_DESCRIPTOR_A)); - printf("OHCI0_HC_RH_DESCRIPTOR_B:\t0x%08X\n", read32(OHCI0_HC_RH_DESCRIPTOR_B)); - printf("OHCI0_HC_RH_STATUS:\t\t0x%08X\n", read32(OHCI0_HC_RH_STATUS)); - printf("OHCI0_HC_RH_PORT_STATUS_1:\t0x%08X\n", port1); - printf("OHCI0_HC_RH_PORT_STATUS_2:\t0x%08X\n", port2); - - if((port1 & RH_PS_CCS) && (port1 & RH_PS_CSC)) { - write32(OHCI0_HC_RH_PORT_STATUS_1, RH_PS_CSC); - - wait_ms(100); - - /* clear CSC flag, set PES and start port reset (PRS) */ - write32(OHCI0_HC_RH_PORT_STATUS_1, RH_PS_PES); - write32(OHCI0_HC_RH_PORT_STATUS_1, RH_PS_PRS); - - /* spin until port reset is complete */ - port1 = read32(OHCI0_HC_RH_PORT_STATUS_1); - while(!(port1 & RH_PS_PRSC)) { - udelay(2); - printf("fuck"); - port1 = read32(OHCI0_HC_RH_PORT_STATUS_1); - } - - (void) usb_add_device(); - } - if((port2 & RH_PS_CCS) && (port2 & RH_PS_CSC)) { - wait_ms(100); - - /* clear CSC flag, set PES and start port reset (PRS) */ - write32(OHCI0_HC_RH_PORT_STATUS_2, port2 | RH_PS_CSC | RH_PS_PES | RH_PS_PRS); - - /* spin until port reset is complete */ - port2 = read32(OHCI0_HC_RH_PORT_STATUS_2); - while(!(port2 & RH_PS_PRSC)) { - udelay(2); - port2 = read32(OHCI0_HC_RH_PORT_STATUS_2); - } - - (void) usb_add_device(); - } - + configure_ports(0); write32(OHCI0_HC_INT_STATUS, OHCI_INTR_RD | OHCI_INTR_RHSC); } /* ResumeDetected */ -- 2.25.1