X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=usb%2Fcore%2Fcore.c;h=a6c84fb2a7dd13aa3409feb94592fa69071052a1;hb=34b9e07b8eafbaef3c81dd850cdaee8610efa1f1;hp=54cfb9792a34649dc166490337fad1cd16f86210;hpb=dd7d06aa840f23f3447befc37ce1ddcbe3a10c29;p=ppcskel.git diff --git a/usb/core/core.c b/usb/core/core.c index 54cfb97..a6c84fb 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -232,12 +232,27 @@ void lsusb(struct usb_device *dev) * Find currently detached device and remove * data structures */ -u8 usb_remove_device(struct usb_device * dev) +u8 usb_remove_device(struct usb_device *dev) { - // FIXME!!!! dieser quatsch ist nur temporaer - free(core.devices->head); - free(core.devices); - core.devices = list_create(); + /* trigger driver for this device */ + struct usb_driver *drv; + struct element *iterator = core.drivers->head; + while (iterator != NULL) { + drv = (struct usb_driver *) iterator->data; + if(drv->data && !memcmp(drv->data, dev, sizeof(struct usb_device))) { + drv->remove(); + break; + } + iterator = iterator->next; + } + + /* remove from device list */ + struct element *tmp = (struct element *) malloc(sizeof(struct element)); + tmp->data = (void *) dev; + list_delete_element(core.devices, tmp); + + printf("REMOVED\n"); + return 1; } @@ -425,62 +440,13 @@ u16 usb_submit_irp(struct usb_irp *irp) break; case USB_BULK: - //u8 runloop=1; - //u16 restlength = irp->len; - //char * td_buf_ptr=irp->buffer; - - /* schleife die die tds generiert */ - while (runloop) { - td = usb_create_transfer_descriptor(irp); - td->endpoint = td->endpoint & 0x7F; /* clear direction bit */ - - /* max packet size for given endpoint */ - td->actlen = irp->epsize; - - /* Generate In Packet */ - if (irp->endpoint & 0x80) - td->pid = USB_PID_IN; - else - /* Generate Out Packet */ - td->pid = USB_PID_OUT; - - /* stop loop if all bytes are send */ - if (restlength <= irp->epsize) { - runloop = 0; - td->actlen = restlength; - } - - td->buffer = td_buf_ptr; - /* move pointer for next packet */ - td_buf_ptr = td_buf_ptr + irp->epsize; - - td->togl = togl; - togl = togl ? 0 : 1; - /**** send token ****/ - hcdi_enqueue(td, irp->dev->ohci); - free(td); - } - /* next togl */ - //if(td->pid == USB_PID_OUT) { - //if(togl==0) togl=1; else togl=0; - //} - irp->dev->epTogl[(irp->endpoint & 0x7F)] = togl; - - break; - case USB_INTR: - //u8 runloop=1; - //u16 restlength = irp->len; - //char * td_buf_ptr=irp->buffer; - - /* schleife die die tds generiert */ while (runloop && (restlength > 0)) { td = usb_create_transfer_descriptor(irp); /* max packet size for given endpoint */ td->actlen = irp->epsize; - td->pid = USB_PID_IN; - /* TODO: USB_PID_OUT */ + td->pid = irp->endpoint & 0x80 ? USB_PID_IN : USB_PID_OUT; /* stop loop if all bytes are send */ if (restlength < irp->epsize) { @@ -519,7 +485,7 @@ struct usb_transfer_descriptor *usb_create_transfer_descriptor(struct usb_irp * (struct usb_transfer_descriptor *) malloc(sizeof(struct usb_transfer_descriptor)); td->devaddress = irp->dev->address; - td->endpoint = irp->endpoint; + td->endpoint = irp->endpoint & 0x7F; td->iso = 0; td->state = USB_TRANSFER_DESCR_NONE; td->maxp = irp->epsize;