Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/hid/usbhid/main.c

    rb7fd2a0 re0a5d4c  
    22 * Copyright (c) 2010 Vojtech Horky
    33 * Copyright (c) 2011 Lubos Slovak
     4 * Copyright (c) 2018 Petr Manek, Ondrej Hlavaty
    45 * All rights reserved.
    56 *
     
    5859static errno_t usb_hid_device_add(usb_device_t *dev)
    5960{
    60         usb_log_debug("%s\n", __FUNCTION__);
     61        usb_log_debug("%s", __FUNCTION__);
    6162
    6263        if (dev == NULL) {
    63                 usb_log_error("Wrong parameter given for add_device().\n");
     64                usb_log_error("Wrong parameter given for add_device().");
    6465                return EINVAL;
    6566        }
     
    7374            usb_device_data_alloc(dev, sizeof(usb_hid_dev_t));
    7475        if (hid_dev == NULL) {
    75                 usb_log_error("Failed to create USB/HID device structure.\n");
     76                usb_log_error("Failed to create USB/HID device structure.");
    7677                return ENOMEM;
    7778        }
     
    7980        errno_t rc = usb_hid_init(hid_dev, dev);
    8081        if (rc != EOK) {
    81                 usb_log_error("Failed to initialize USB/HID device.\n");
     82                usb_log_error("Failed to initialize USB/HID device.");
    8283                usb_hid_deinit(hid_dev);
    8384                return rc;
    8485        }
    8586
    86         usb_log_debug("USB/HID device structure initialized.\n");
     87        usb_log_debug("USB/HID device structure initialized.");
    8788
    8889        /* Start automated polling function.
    8990         * This will create a separate fibril that will query the device
    9091         * for the data continuously. */
    91         rc = usb_device_auto_poll_desc(dev,
    92            /* Index of the polling pipe. */
    93            hid_dev->poll_pipe_mapping->description,
    94            /* Callback when data arrives. */
    95            usb_hid_polling_callback,
    96            /* How much data to request. */
    97            hid_dev->poll_pipe_mapping->pipe.max_packet_size,
    98            /* Delay */
    99            -1,
    100            /* Callback when the polling ends. */
    101            usb_hid_polling_ended_callback,
    102            /* Custom argument. */
    103            hid_dev);
     92        rc = usb_polling_start(&hid_dev->polling);
    10493
    10594        if (rc != EOK) {
    106                 usb_log_error("Failed to start polling fibril for `%s'.\n",
     95                usb_log_error("Failed to start polling fibril for `%s'.",
    10796                    usb_device_get_name(dev));
    10897                usb_hid_deinit(hid_dev);
     
    111100        hid_dev->running = true;
    112101
    113         usb_log_info("HID device `%s' ready.\n", usb_device_get_name(dev));
     102        usb_log_info("HID device `%s' ready.", usb_device_get_name(dev));
     103
     104        return EOK;
     105}
     106
     107static errno_t join_and_clean(usb_device_t *dev)
     108{
     109        assert(dev);
     110        usb_hid_dev_t *hid_dev = usb_device_data_get(dev);
     111        assert(hid_dev);
     112
     113        /* Join polling fibril (ignoring error code). */
     114        usb_polling_join(&hid_dev->polling);
     115
     116        /* Clean up. */
     117        usb_hid_deinit(hid_dev);
     118        usb_log_info("%s destruction complete.", usb_device_get_name(dev));
    114119
    115120        return EOK;
     
    122127 * @return Error code.
    123128 */
    124 static errno_t usb_hid_device_rem(usb_device_t *dev)
     129static errno_t usb_hid_device_remove(usb_device_t *dev)
    125130{
    126         // TODO: Stop device polling
    127         // TODO: Call deinit (stops autorepeat too)
    128         return ENOTSUP;
     131        assert(dev);
     132        usb_hid_dev_t *hid_dev = usb_device_data_get(dev);
     133        assert(hid_dev);
     134
     135        usb_log_info("Device %s removed.", usb_device_get_name(dev));
     136        return join_and_clean(dev);
    129137}
    130138
     
    140148        usb_hid_dev_t *hid_dev = usb_device_data_get(dev);
    141149        assert(hid_dev);
    142         unsigned tries = 100;
    143         /* Wait for fail. */
    144         while (hid_dev->running && tries--) {
    145                 async_usleep(100000);
    146         }
    147         if (hid_dev->running) {
    148                 usb_log_error("Can't remove hid, still running.\n");
    149                 return EBUSY;
    150         }
    151150
    152         usb_hid_deinit(hid_dev);
    153         usb_log_debug2("%s destruction complete.\n", usb_device_get_name(dev));
    154         return EOK;
     151        usb_log_info("Device %s gone.", usb_device_get_name(dev));
     152        return join_and_clean(dev);
    155153}
    156154
     
    158156static const usb_driver_ops_t usb_hid_driver_ops = {
    159157        .device_add = usb_hid_device_add,
    160         .device_rem = usb_hid_device_rem,
     158        .device_remove = usb_hid_device_remove,
    161159        .device_gone = usb_hid_device_gone,
    162160};
Note: See TracChangeset for help on using the changeset viewer.