Changeset 31cca4f3 in mainline for uspace/drv/bus/usb/xhci/rh.c


Ignore:
Timestamp:
2017-10-23T18:37:53Z (7 years ago)
Author:
Petr Manek <petr.manek@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e160bfe8
Parents:
81487c4a
Message:

Corrected deadlock in IPC between USB remote interface and usbdev driver. Extracted creation of input context. Now issuing drop endpoint command when the endpoint is removed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/xhci/rh.c

    r81487c4a r31cca4f3  
    315315        }
    316316
     317        /* TODO: Figure out how to handle errors here. So far, they are reported and skipped. */
     318
    317319        /* Make DDF (and all drivers) forget about the device. */
    318320        if ((err = ddf_fun_unbind(dev->base.fun))) {
     
    321323        }
    322324
    323         /* FIXME:
    324          * A deadlock happens on the previous line. For some reason, the HID driver
    325          * does not fully release its DDF function (tracked it down to release_endpoint
    326          * in usb_remote.c so far).
    327          *
    328          * For that reason as well, the following 3 lines are untested.
    329          */
    330 
    331         xhci_bus_remove_device(&rh->hc->bus, rh->hc, &dev->base);
    332         hc_disable_slot(rh->hc, dev->slot_id);
     325        // TODO: Remove EP0.
     326        // TODO: Deconfigure device.
     327
     328        /* Remove device from XHCI bus. */
     329        if ((err = xhci_bus_remove_device(&rh->hc->bus, rh->hc, &dev->base))) {
     330                usb_log_warning("Failed to remove device '%s' from XHCI bus: %s",
     331                    ddf_fun_get_name(dev->base.fun), str_error(err));
     332        }
     333
     334        /* Disable device slot. */
     335        if ((err = hc_disable_slot(rh->hc, dev->slot_id))) {
     336                usb_log_warning("Failed to disable slot for device '%s': %s",
     337                    ddf_fun_get_name(dev->base.fun), str_error(err));
     338        }
     339
     340        /* Destroy DDF device. */
    333341        hcd_ddf_device_destroy(&dev->base);
    334342
Note: See TracChangeset for help on using the changeset viewer.