Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbmid/main.c

    r065064e6 r9d58539  
    5353        usb_log_info("Taking care of new MID `%s'.\n", dev->ddf_dev->name);
    5454
    55         usb_pipe_start_long_transfer(&dev->ctrl_pipe);
    56 
    57         bool accept = usbmid_explore_device(dev);
    58 
    59         usb_pipe_end_long_transfer(&dev->ctrl_pipe);
     55        const bool accept = usbmid_explore_device(dev);
    6056
    6157        if (!accept) {
     
    6561        return EOK;
    6662}
     63/*----------------------------------------------------------------------------*/
     64/** Callback when a MID device is about to be removed from the host.
     65 *
     66 * @param dev USB device representing the removed device.
     67 * @return Error code.
     68 */
     69static int usbmid_device_remove(usb_device_t *dev)
     70{
     71        assert(dev);
     72        usb_mid_t *usb_mid = dev->driver_data;
     73        assert(usb_mid);
    6774
     75        /* Remove ctl function */
     76        int ret = ddf_fun_unbind(usb_mid->ctl_fun);
     77        if (ret != EOK) {
     78                usb_log_error("Failed to unbind USB MID ctl function: %s.\n",
     79                    str_error(ret));
     80                return ret;
     81        }
     82        ddf_fun_destroy(usb_mid->ctl_fun);
     83
     84        /* Remove all children */
     85        while (!list_empty(&usb_mid->interface_list)) {
     86                link_t *item = list_first(&usb_mid->interface_list);
     87                list_remove(item);
     88
     89                usbmid_interface_t *iface = usbmid_interface_from_link(item);
     90
     91                usb_log_info("Removing child for interface %d (%s).\n",
     92                    iface->interface_no,
     93                    usb_str_class(iface->interface->interface_class));
     94
     95                /* Tell the child to go off-line. */
     96                int pret = ddf_fun_offline(iface->fun);
     97                if (pret != EOK) {
     98                        usb_log_warning("Failed to turn off child for interface"
     99                            " %d (%s): %s\n", iface->interface_no,
     100                            usb_str_class(iface->interface->interface_class),
     101                            str_error(pret));
     102                        ret = pret;
     103                }
     104
     105                /* Now remove the child. */
     106                pret = usbmid_interface_destroy(iface);
     107                if (pret != EOK) {
     108                        usb_log_error("Failed to destroy child for interface "
     109                            "%d (%s): %s\n", iface->interface_no,
     110                            usb_str_class(iface->interface->interface_class),
     111                            str_error(pret));
     112                        ret = pret;
     113                }
     114        }
     115        return ret;
     116}
     117/*----------------------------------------------------------------------------*/
     118/** Callback when a MID device was removed from the host.
     119 *
     120 * @param dev USB device representing the removed device.
     121 * @return Error code.
     122 */
    68123static int usbmid_device_gone(usb_device_t *dev)
    69124{
    70125        assert(dev);
     126        usb_mid_t *usb_mid = dev->driver_data;
     127        assert(usb_mid);
     128
    71129        usb_log_info("USB MID gone: `%s'.\n", dev->ddf_dev->name);
    72130
    73131        /* Remove ctl function */
    74         usb_mid_t *usb_mid = dev->driver_data;
    75132        int ret = ddf_fun_unbind(usb_mid->ctl_fun);
    76133        if (ret != EOK) {
     
    86143                list_remove(item);
    87144
    88                 usbmid_interface_t *iface = list_get_instance(item,
    89                     usbmid_interface_t, link);
     145                usbmid_interface_t *iface = usbmid_interface_from_link(item);
    90146
    91                 usb_log_info("Removing child for interface %d (%s).\n",
     147                usb_log_info("Child for interface %d (%s) gone.\n",
    92148                    iface->interface_no,
    93149                    usb_str_class(iface->interface->interface_class));
     
    107163
    108164/** USB MID driver ops. */
    109 static usb_driver_ops_t mid_driver_ops = {
     165static const usb_driver_ops_t mid_driver_ops = {
    110166        .device_add = usbmid_device_add,
     167        .device_rem = usbmid_device_remove,
    111168        .device_gone = usbmid_device_gone,
    112169};
    113170
    114171/** USB MID driver. */
    115 static usb_driver_t mid_driver = {
     172static const usb_driver_t mid_driver = {
    116173        .name = NAME,
    117174        .ops = &mid_driver_ops,
Note: See TracChangeset for help on using the changeset viewer.