Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbdev/src/recognise.c

    rffa96c2 rfeeac0d  
    3333 * Functions for recognition of attached devices.
    3434 */
     35
     36/** XXX Fix this */
     37#define _DDF_DATA_IMPLANT
    3538
    3639#include <sys/types.h>
     
    315318 */
    316319int usb_device_register_child_in_devman(usb_pipe_t *ctrl_pipe,
    317     ddf_dev_t *parent, ddf_fun_t *fun, ddf_dev_ops_t *dev_ops)
     320    ddf_dev_t *parent, ddf_dev_ops_t *dev_ops, void *dev_data,
     321    ddf_fun_t **child_fun)
    318322{
    319         if (ctrl_pipe == NULL)
     323        if (child_fun == NULL || ctrl_pipe == NULL)
    320324                return EINVAL;
    321325       
    322         if (!dev_ops && ddf_fun_data_get(fun) != NULL) {
     326        if (!dev_ops && dev_data) {
    323327                usb_log_warning("Using standard fun ops with arbitrary "
    324328                    "driver data. This does not have to work.\n");
     
    330334            (size_t) atomic_preinc(&device_name_index);
    331335       
     336        ddf_fun_t *child = NULL;
    332337        int rc;
    333338       
     
    343348        }
    344349       
    345         rc = ddf_fun_set_name(fun, child_name);
    346         if (rc != EOK)
     350        child = ddf_fun_create(parent, fun_inner, child_name);
     351        if (child == NULL) {
     352                rc = ENOMEM;
    347353                goto failure;
     354        }
    348355       
    349356        if (dev_ops != NULL)
    350                 ddf_fun_set_ops(fun, dev_ops);
     357                ddf_fun_set_ops(child, dev_ops);
    351358        else
    352                 ddf_fun_set_ops(fun, &child_ops);
     359                ddf_fun_set_ops(child, &child_ops);
     360       
     361        ddf_fun_data_implant(child, dev_data);
    353362       
    354363        /*
     
    356365         * driver data if there is no other data
    357366         */
    358         if (ddf_fun_data_get(fun) == NULL) {
     367        if (!dev_data) {
    359368                usb_hub_attached_device_t *new_device = ddf_fun_data_alloc(
    360                     fun, sizeof(usb_hub_attached_device_t));
     369                    child, sizeof(usb_hub_attached_device_t));
    361370                if (!new_device) {
    362371                        rc = ENOMEM;
     
    365374               
    366375                new_device->address = ctrl_pipe->wire->address;
    367                 new_device->fun = fun;
     376                new_device->fun = child;
    368377        }
    369378       
     
    375384       
    376385        list_foreach(match_ids.ids, link, match_id_t, match_id) {
    377                 rc = ddf_fun_add_match_id(fun, match_id->id, match_id->score);
     386                rc = ddf_fun_add_match_id(child, match_id->id, match_id->score);
    378387                if (rc != EOK) {
    379388                        clean_match_ids(&match_ids);
     
    384393        clean_match_ids(&match_ids);
    385394       
    386         rc = ddf_fun_bind(fun);
     395        rc = ddf_fun_bind(child);
    387396        if (rc != EOK)
    388397                goto failure;
    389398       
     399        *child_fun = child;
    390400        return EOK;
    391401       
    392402failure:
     403        if (child != NULL) {
     404                /* This takes care of match_id deallocation as well. */
     405                ddf_fun_destroy(child);
     406        }
     407       
    393408        return rc;
    394409}
Note: See TracChangeset for help on using the changeset viewer.