-/**
- * Enqueue a transfer descriptor.
- */
-u8 first = 0;
-u8 hcdi_enqueue(usb_transfer_descriptor *td) {
- static struct general_td *tSetup,*tData;
- static u32 tSetupbuffer, tDatabuffer, tStatusbuffer;
- static u32 tSetupblen, tDatablen, tStatusblen;
-
- if(first == 0) {
- printf("step 0\n");
- tSetup = allocate_general_td(td->actlen);
- general_td_fill(tSetup, td);
- tSetupbuffer = (u32) phys_to_virt(ACCESS_LE(tSetup->cbp));
- tSetupblen = td->actlen;
- first++;
- return 0;
- }
- if(first == 1) {
- printf("step 1\n");
- tData = allocate_general_td(td->actlen);
- general_td_fill(tData, td);
- tDatabuffer = (u32) phys_to_virt(ACCESS_LE(tData->cbp));
- tDatablen = td->actlen;
- first++;
- return 0;
- }
- first = 0;
- struct general_td *tStatus = allocate_general_td(td->actlen);
- general_td_fill(tStatus, td);
- tStatusbuffer = (u32) phys_to_virt(ACCESS_LE(tStatus->cbp));
- tStatusblen = td->actlen;
-
- printf( "===========================\n"
- "===========================\n");
- control_quirk(); //required? YES! :O ... erm... or no? :/ ... in fact I have no idea
-
- struct endpoint_descriptor *dummyconfig = allocate_endpoint();
- dummyconfig->flags = ACCESS_LE(OHCI_ENDPOINT_GENERAL_FORMAT);
- dummyconfig->headp = dummyconfig->tailp = dummyconfig->nexted = ACCESS_LE(0);
- dummyconfig->flags |= ACCESS_LE(OHCI_ENDPOINT_LOW_SPEED |
- OHCI_ENDPOINT_SET_DEVICE_ADDRESS(td->devaddress) |
- OHCI_ENDPOINT_SET_ENDPOINT_NUMBER(td->endpoint) |
- OHCI_ENDPOINT_SET_MAX_PACKET_SIZE(td->maxp));
- write32(OHCI0_HC_CTRL_HEAD_ED, virt_to_phys(dummyconfig));
-
-#define ED_MASK ((u32)~0x0f)
- dummyconfig->headp |= ACCESS_LE(virt_to_phys((void*) ((u32)tSetup & ED_MASK)));
- tSetup->nexttd = ACCESS_LE(virt_to_phys((void*) ((u32)tData & ED_MASK)));
- tData->nexttd = ACCESS_LE(virt_to_phys((void*) ((u32)tStatus & ED_MASK)));