From d41a4eea2e3e97cb074c3869ad40b804d84ad36a Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 21 Sep 2009 02:44:54 +0200 Subject: [PATCH] after a warm start we have really odd memory issues: ohci0 isn't able to read or write (actually we don't know exactly) from an allocated resource. may some malloc/free/sync/mmu fail?! no idea! :( therefore here a hack to in ohci_init. when the ohci isn't in the RESET state (that is after an hardware reset), we know it is an warm start and allocated some memory... but this is no real useful workaround :( --- main.c | 11 ++--------- usb/host/ohci.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/main.c b/main.c index bbb7d39..18cc422 100644 --- a/main.c +++ b/main.c @@ -100,8 +100,6 @@ int main(void) VIDEO_SetFrameBuffer(get_xfb()); VISetupEncoder(); - usb_init(); - u32 version = ipc_getvers(); u16 mini_version_major = version >> 16 & 0xFFFF; u16 mini_version_minor = version & 0xFFFF; @@ -115,19 +113,14 @@ int main(void) ; // better ideas welcome! } + usb_init(); + /* print_str_noscroll(112, 112, "ohai, world!\n"); testOTP(); printf("bye, world!\n"); */ - while(1) { - // just to get sure we are still in this loop - //_CPU_ISR_Enable() // don't know why this is needed... - //udelay(100000); - //printf("x"); - } - return 0; } diff --git a/usb/host/ohci.c b/usb/host/ohci.c index d696294..e8c7db4 100644 --- a/usb/host/ohci.c +++ b/usb/host/ohci.c @@ -288,10 +288,6 @@ void hcdi_fire() n = next; prev = 0; while(virt_to_phys(n)) { - if(prev) { - free(prev); - } - dump_address(n, sizeof(struct general_td), "n(after)"); if(n->buflen > 0) { @@ -301,8 +297,6 @@ void hcdi_fire() dbg_td_flag(LE(n->flags)); prev = n; n = (struct general_td*) n->nexttd; - } - if(prev) { free(prev); } @@ -374,6 +368,16 @@ void hcdi_init() /* disable hc interrupts */ set32(OHCI0_HC_INT_DISABLE, OHCI_INTR_MIE); +#if 1 + /* after a warm start we have some really odd memory issues. + * some malloc/free/sync/mmu fail?! no idea! + */ + if((read32(OHCI0_HC_CONTROL) & OHCI_CTRL_HCFS) != OHCI_USB_RESET) { + (void) malloc(256); + printf("WTF malloc\n"); + } +#endif + /* save fmInterval and calculate FSMPS */ #define FSMP(fi) (0x7fff & ((6 * ((fi) - 210)) / 7)) #define FI 0x2edf /* 12000 bits per frame (-1) */ -- 2.25.1