after a warm start we have really odd memory issues:
authorBernhard Urban <lewurm@gmx.net>
Mon, 21 Sep 2009 00:44:54 +0000 (02:44 +0200)
committerBernhard Urban <lewurm@gmx.net>
Mon, 21 Sep 2009 01:17:00 +0000 (03:17 +0200)
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
usb/host/ohci.c

diff --git a/main.c b/main.c
index bbb7d39c9c81b72da7091708cbcdac569cb1a92f..18cc42220e94461b00249626e61743d4e607d6ea 100644 (file)
--- 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;
 }
 
index d696294a04de06bad11a3a5b151cde5a2a61daf3..e8c7db44f6b40cb53143c96138777ab405f8cc43 100644 (file)
@@ -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) */