fullspeed devices will be detected now
[ppcskel.git] / usb / host / ohci.c
index fe0c67c2b8cbec976c436cded6e3339fcdc5402b..db83e0f90e5f55609e9ae7edc82f147626c81d5a 100644 (file)
@@ -69,7 +69,7 @@ static void dbg_op_state()
        }
 }
 
-#ifdef _DU_OHCI_Q
+#ifdef _DU_OHCI_F_HALT
 static void dbg_td_flag(u32 flag)
 {
        printf("**************** dbg_td_flag: 0x%08X ***************\n", flag);
@@ -83,7 +83,7 @@ static void dbg_td_flag(u32 flag)
 }
 #endif
 
-static void general_td_fill(struct general_td *dest, const usb_transfer_descriptor *src)
+static void general_td_fill(struct general_td *dest, const struct usb_transfer_descriptor *src)
 {
        if(src->actlen) {
                dest->cbp = LE(virt_to_phys(src->buffer));
@@ -143,7 +143,7 @@ static void general_td_fill(struct general_td *dest, const usb_transfer_descript
        dest->flags |= LE(OHCI_TD_SET_DELAY_INTERRUPT(7));
 }
 
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
 static void dump_address(void *addr, u32 size, const char* str)
 {
        printf("%s hexdump (%d) @ 0x%08X:\n", str, size, addr);
@@ -208,37 +208,37 @@ void hcdi_fire()
                if((LE(edhead->headp) & OHCI_ENDPOINT_HALTED)) {
                        n = phys_to_virt(LE(edhead->headp)&~0xf);
                        prev = phys_to_virt((u32)prev);
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
                        printf("halted!\n");
 #endif
 
                        sync_before_read((void*) n, sizeof(struct general_td));
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
                        printf("n: 0x%08X\n", n);
                        dump_address(n, sizeof(struct general_td), "n(after)");
 #endif
                        if(n->buflen > 0) {
                                sync_before_read((void*) n->bufaddr, n->buflen);
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
                                dump_address((void*) n->bufaddr, n->buflen, "n->bufaddr(after)");
 #endif
                        }
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
                        dbg_td_flag(LE(n->flags));
 #endif
 
                        sync_before_read((void*) prev, sizeof(struct general_td));
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
                        printf("prev: 0x%08X\n", prev);
                        dump_address(prev, sizeof(struct general_td), "prev(after)");
 #endif
                        if(prev->buflen >0) {
                                sync_before_read((void*) prev->bufaddr, prev->buflen);
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
                                dump_address((void*) prev->bufaddr, prev->buflen, "prev->bufaddr(after)");
 #endif
                        }
-#ifdef _DU_OHCI_F
+#ifdef _DU_OHCI_F_HALT
                        dbg_td_flag(LE(prev->flags));
                        printf("halted end!\n");
 #endif
@@ -305,7 +305,7 @@ void hcdi_fire()
 /**
  * Enqueue a transfer descriptor.
  */
-u8 hcdi_enqueue(const usb_transfer_descriptor *td) {
+u8 hcdi_enqueue(const struct usb_transfer_descriptor *td) {
 #ifdef _DU_OHCI_Q
        printf("*()*()*()*()*()*()*() hcdi_enqueue(start)\n");
 #endif
@@ -314,8 +314,12 @@ u8 hcdi_enqueue(const usb_transfer_descriptor *td) {
                memset(edhead, 0, sizeof(struct endpoint_descriptor));
                edhead->flags = LE(OHCI_ENDPOINT_GENERAL_FORMAT);
                edhead->headp = edhead->tailp = edhead->nexted = LE(0);
-               edhead->flags |= LE(OHCI_ENDPOINT_LOW_SPEED |
-                               OHCI_ENDPOINT_SET_DEVICE_ADDRESS(td->devaddress) |
+               if(td->fullspeed) {
+                       edhead->flags |= LE(OHCI_ENDPOINT_FULL_SPEED);
+               } else {
+                       edhead->flags |= LE(OHCI_ENDPOINT_LOW_SPEED);
+               }
+               edhead->flags |= LE(OHCI_ENDPOINT_SET_DEVICE_ADDRESS(td->devaddress) |
                                OHCI_ENDPOINT_SET_ENDPOINT_NUMBER(td->endpoint) |
                                OHCI_ENDPOINT_SET_MAX_PACKET_SIZE(td->maxp));
                edhead->tdcount = 0;
@@ -354,7 +358,7 @@ u8 hcdi_enqueue(const usb_transfer_descriptor *td) {
 /**
  * Remove an transfer descriptor from transfer queue.
  */
-u8 hcdi_dequeue(usb_transfer_descriptor *td) {
+u8 hcdi_dequeue(struct usb_transfer_descriptor *td) {
        return 0;
 }
 
@@ -479,7 +483,8 @@ static void setup_port(u32 reg, u8 from_init)
                printf("loop done\n");
 #endif
 
-               (void) usb_add_device();
+               /* returns usb_device struct */
+               (void) usb_add_device((read32(reg) & RH_PS_LSDA) >> 8);
        }
 }