Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devman/devman.c

    r8b1e15ac rca2a18e  
    4141#include "devman.h"
    4242
    43 fun_node_t *find_node_child(fun_node_t *parent, const char *name);
    44 
    4543/* hash table operations */
    4644
     
    5351    link_t *item)
    5452{
    55         dev_node_t *dev = hash_table_get_instance(item, dev_node_t, devman_dev);
     53        node_t *dev = hash_table_get_instance(item, node_t, devman_link);
    5654        return (dev->handle == (devman_handle_t) key[0]);
    5755}
    5856
    59 static int devman_functions_compare(unsigned long key[], hash_count_t keys,
     57static int devmap_devices_compare(unsigned long key[], hash_count_t keys,
    6058    link_t *item)
    6159{
    62         fun_node_t *fun = hash_table_get_instance(item, fun_node_t, devman_fun);
    63         return (fun->handle == (devman_handle_t) key[0]);
    64 }
    65 
    66 static int devmap_functions_compare(unsigned long key[], hash_count_t keys,
    67     link_t *item)
    68 {
    69         fun_node_t *fun = hash_table_get_instance(item, fun_node_t, devmap_fun);
    70         return (fun->devmap_handle == (devmap_handle_t) key[0]);
     60        node_t *dev = hash_table_get_instance(item, node_t, devmap_link);
     61        return (dev->devmap_handle == (devmap_handle_t) key[0]);
    7162}
    7263
     
    9182};
    9283
    93 static hash_table_operations_t devman_functions_ops = {
    94         .hash = devices_hash,
    95         .compare = devman_functions_compare,
    96         .remove_callback = devices_remove_callback
    97 };
    98 
    9984static hash_table_operations_t devmap_devices_ops = {
    10085        .hash = devices_hash,
    101         .compare = devmap_functions_compare,
     86        .compare = devmap_devices_compare,
    10287        .remove_callback = devices_remove_callback
    10388};
     
    388373}
    389374
    390 /** Create root device and function node in the device tree.
     375/** Create root device node in the device tree.
    391376 *
    392377 * @param tree  The device tree.
    393378 * @return      True on success, false otherwise.
    394379 */
    395 bool create_root_nodes(dev_tree_t *tree)
    396 {
    397         fun_node_t *fun;
    398         dev_node_t *dev;
    399        
    400         printf(NAME ": create_root_nodes\n");
    401        
     380bool create_root_node(dev_tree_t *tree)
     381{
     382        node_t *node;
     383
     384        printf(NAME ": create_root_node\n");
     385
    402386        fibril_rwlock_write_lock(&tree->rwlock);
    403        
    404         /*
    405          * Create root function. This is a pseudo function to which
    406          * the root device node is attached. It allows us to match
    407          * the root device driver in a standard manner, i.e. against
    408          * the parent function.
    409          */
    410        
    411         fun = create_fun_node();
    412         if (fun == NULL) {
    413                 fibril_rwlock_write_unlock(&tree->rwlock);
    414                 return false;
    415         }
    416        
    417         insert_fun_node(tree, fun, clone_string(""), NULL);
    418         match_id_t *id = create_match_id();
    419         id->id = clone_string("root");
    420         id->score = 100;
    421         add_match_id(&fun->match_ids, id);
    422         tree->root_node = fun;
    423        
    424         /*
    425          * Create root device node.
    426          */
    427         dev = create_dev_node();
    428         if (dev == NULL) {
    429                 fibril_rwlock_write_unlock(&tree->rwlock);
    430                 return false;
    431         }
    432        
    433         insert_dev_node(tree, dev, fun);
    434        
     387        node = create_dev_node();
     388        if (node != NULL) {
     389                insert_dev_node(tree, node, clone_string(""), NULL);
     390                match_id_t *id = create_match_id();
     391                id->id = clone_string("root");
     392                id->score = 100;
     393                add_match_id(&node->match_ids, id);
     394                tree->root_node = node;
     395        }
    435396        fibril_rwlock_write_unlock(&tree->rwlock);
    436        
    437         return dev != NULL;
     397
     398        return node != NULL;
    438399}
    439400
     
    453414 *                      is found.
    454415 */
    455 driver_t *find_best_match_driver(driver_list_t *drivers_list, dev_node_t *node)
     416driver_t *find_best_match_driver(driver_list_t *drivers_list, node_t *node)
    456417{
    457418        driver_t *best_drv = NULL, *drv = NULL;
     
    481442 * @param drv           The driver.
    482443 */
    483 void attach_driver(dev_node_t *dev, driver_t *drv)
     444void attach_driver(node_t *node, driver_t *drv)
    484445{
    485446        printf(NAME ": attach_driver %s to device %s\n",
    486             drv->name, dev->pfun->pathname);
     447            drv->name, node->pathname);
    487448       
    488449        fibril_mutex_lock(&drv->driver_mutex);
    489450       
    490         dev->drv = drv;
    491         list_append(&dev->driver_devices, &drv->devices);
     451        node->drv = drv;
     452        list_append(&node->driver_devices, &drv->devices);
    492453       
    493454        fibril_mutex_unlock(&drv->driver_mutex);
     
    569530static void pass_devices_to_driver(driver_t *driver, dev_tree_t *tree)
    570531{
    571         dev_node_t *dev;
     532        node_t *dev;
    572533        link_t *link;
    573534        int phone;
     
    590551        link = driver->devices.next;
    591552        while (link != &driver->devices) {
    592                 dev = list_get_instance(link, dev_node_t, driver_devices);
     553                dev = list_get_instance(link, node_t, driver_devices);
    593554                if (dev->passed_to_driver) {
    594555                        link = link->next;
     
    708669}
    709670
    710 /** Create devmap path and name for the function. */
    711 void devmap_register_tree_function(fun_node_t *fun, dev_tree_t *tree)
     671/** Create devmap path and name for the device. */
     672static void devmap_register_tree_device(node_t *node, dev_tree_t *tree)
    712673{
    713674        char *devmap_pathname = NULL;
    714675        char *devmap_name = NULL;
    715676       
    716         asprintf(&devmap_name, "%s", fun->pathname);
     677        asprintf(&devmap_name, "%s", node->pathname);
    717678        if (devmap_name == NULL)
    718679                return;
     
    728689       
    729690        devmap_device_register_with_iface(devmap_pathname,
    730             &fun->devmap_handle, DEVMAN_CONNECT_FROM_DEVMAP);
    731        
    732         tree_add_devmap_function(tree, fun);
     691            &node->devmap_handle, DEVMAN_CONNECT_FROM_DEVMAP);
     692       
     693        tree_add_devmap_device(tree, node);
    733694       
    734695        free(devmap_name);
     
    741702 * @param node          The device's node in the device tree.
    742703 */
    743 void add_device(int phone, driver_t *drv, dev_node_t *dev, dev_tree_t *tree)
     704void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree)
    744705{
    745706        /*
     
    748709         */
    749710        printf(NAME ": add_device (driver `%s', device `%s')\n", drv->name,
    750             dev->pfun->name);
     711            node->name);
    751712       
    752713        sysarg_t rc;
     
    755716        /* Send the device to the driver. */
    756717        devman_handle_t parent_handle;
    757         if (dev->pfun) {
    758                 parent_handle = dev->pfun->handle;
     718        if (node->parent) {
     719                parent_handle = node->parent->handle;
    759720        } else {
    760721                parent_handle = 0;
    761722        }
    762723
    763         aid_t req = async_send_2(phone, DRIVER_ADD_DEVICE, dev->handle,
     724        aid_t req = async_send_2(phone, DRIVER_ADD_DEVICE, node->handle,
    764725            parent_handle, &answer);
    765726       
    766727        /* Send the device's name to the driver. */
    767         rc = async_data_write_start(phone, dev->pfun->name,
    768             str_size(dev->pfun->name) + 1);
     728        rc = async_data_write_start(phone, node->name,
     729            str_size(node->name) + 1);
    769730        if (rc != EOK) {
    770731                /* TODO handle error */
     
    776737        switch(rc) {
    777738        case EOK:
    778                 dev->state = DEVICE_USABLE;
     739                node->state = DEVICE_USABLE;
     740                devmap_register_tree_device(node, tree);
    779741                break;
    780742        case ENOENT:
    781                 dev->state = DEVICE_NOT_PRESENT;
     743                node->state = DEVICE_NOT_PRESENT;
    782744                break;
    783745        default:
    784                 dev->state = DEVICE_INVALID;
    785         }
    786        
    787         dev->passed_to_driver = true;
     746                node->state = DEVICE_INVALID;
     747        }
     748       
     749        node->passed_to_driver = true;
    788750
    789751        return;
     
    797759 *                      successfully assigned to the device, false otherwise.
    798760 */
    799 bool assign_driver(dev_node_t *dev, driver_list_t *drivers_list,
    800     dev_tree_t *tree)
    801 {
    802         assert(dev != NULL);
    803         assert(drivers_list != NULL);
    804         assert(tree != NULL);
    805        
     761bool assign_driver(node_t *node, driver_list_t *drivers_list, dev_tree_t *tree)
     762{
    806763        /*
    807764         * Find the driver which is the most suitable for handling this device.
    808765         */
    809         driver_t *drv = find_best_match_driver(drivers_list, dev);
     766        driver_t *drv = find_best_match_driver(drivers_list, node);
    810767        if (drv == NULL) {
    811768                printf(NAME ": no driver found for device '%s'.\n",
    812                     dev->pfun->pathname);
     769                    node->pathname);
    813770                return false;
    814771        }
    815772       
    816773        /* Attach the driver to the device. */
    817         attach_driver(dev, drv);
     774        attach_driver(node, drv);
    818775       
    819776        fibril_mutex_lock(&drv->driver_mutex);
     
    829786                int phone = async_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);
    830787                if (phone >= 0) {
    831                         add_device(phone, drv, dev, tree);
     788                        add_device(phone, drv, node, tree);
    832789                        async_hangup(phone);
    833790                }
     
    853810        hash_table_create(&tree->devman_devices, DEVICE_BUCKETS, 1,
    854811            &devman_devices_ops);
    855         hash_table_create(&tree->devman_functions, DEVICE_BUCKETS, 1,
    856             &devman_functions_ops);
    857         hash_table_create(&tree->devmap_functions, DEVICE_BUCKETS, 1,
     812        hash_table_create(&tree->devmap_devices, DEVICE_BUCKETS, 1,
    858813            &devmap_devices_ops);
    859814       
    860815        fibril_rwlock_initialize(&tree->rwlock);
    861816       
    862         /* Create root function and root device and add them to the device tree. */
    863         if (!create_root_nodes(tree))
     817        /* Create root node and add it to the device tree. */
     818        if (!create_root_node(tree))
    864819                return false;
    865820
    866821        /* Find suitable driver and start it. */
    867         return assign_driver(tree->root_node->child, drivers_list, tree);
     822        return assign_driver(tree->root_node, drivers_list, tree);
    868823}
    869824
     
    874829 * @return              A device node structure.
    875830 */
    876 dev_node_t *create_dev_node(void)
    877 {
    878         dev_node_t *res = malloc(sizeof(dev_node_t));
     831node_t *create_dev_node(void)
     832{
     833        node_t *res = malloc(sizeof(node_t));
    879834       
    880835        if (res != NULL) {
    881                 memset(res, 0, sizeof(dev_node_t));
    882                 list_initialize(&res->functions);
    883                 link_initialize(&res->driver_devices);
    884                 link_initialize(&res->devman_dev);
     836                memset(res, 0, sizeof(node_t));
     837                list_initialize(&res->children);
     838                list_initialize(&res->match_ids.ids);
     839                list_initialize(&res->classes);
    885840        }
    886841       
     
    892847 * @param node          The device node structure.
    893848 */
    894 void delete_dev_node(dev_node_t *dev)
    895 {
    896         assert(list_empty(&dev->functions));
    897         assert(dev->pfun == NULL);
    898         assert(dev->drv == NULL);
    899        
    900         free(dev);
     849void delete_dev_node(node_t *node)
     850{
     851        assert(list_empty(&node->children));
     852        assert(node->parent == NULL);
     853        assert(node->drv == NULL);
     854       
     855        clean_match_ids(&node->match_ids);
     856        free_not_null(node->name);
     857        free_not_null(node->pathname);
     858        free(node);
    901859}
    902860
     
    907865 * @return              The device node.
    908866 */
    909 dev_node_t *find_dev_node_no_lock(dev_tree_t *tree, devman_handle_t handle)
     867node_t *find_dev_node_no_lock(dev_tree_t *tree, devman_handle_t handle)
    910868{
    911869        unsigned long key = handle;
     
    915873       
    916874        link = hash_table_find(&tree->devman_devices, &key);
    917         return hash_table_get_instance(link, dev_node_t, devman_dev);
     875        return hash_table_get_instance(link, node_t, devman_link);
    918876}
    919877
     
    924882 * @return              The device node.
    925883 */
    926 dev_node_t *find_dev_node(dev_tree_t *tree, devman_handle_t handle)
    927 {
    928         dev_node_t *dev = NULL;
     884node_t *find_dev_node(dev_tree_t *tree, devman_handle_t handle)
     885{
     886        node_t *node = NULL;
    929887       
    930888        fibril_rwlock_read_lock(&tree->rwlock);
    931         dev = find_dev_node_no_lock(tree, handle);
     889        node = find_dev_node_no_lock(tree, handle);
    932890        fibril_rwlock_read_unlock(&tree->rwlock);
    933891       
    934         return dev;
    935 }
    936 
    937 /* Function nodes */
    938 
    939 /** Create a new function node.
    940  *
    941  * @return              A function node structure.
    942  */
    943 fun_node_t *create_fun_node(void)
    944 {
    945         fun_node_t *res = malloc(sizeof(fun_node_t));
    946        
    947         if (res != NULL) {
    948                 memset(res, 0, sizeof(fun_node_t));
    949                 link_initialize(&res->dev_functions);
    950                 list_initialize(&res->match_ids.ids);
    951                 list_initialize(&res->classes);
    952                 link_initialize(&res->devman_fun);
    953                 link_initialize(&res->devmap_fun);
    954         }
    955        
    956         return res;
    957 }
    958 
    959 /** Delete a function node.
    960  *
    961  * @param fun           The device node structure.
    962  */
    963 void delete_fun_node(fun_node_t *fun)
    964 {
    965         assert(fun->dev == NULL);
    966         assert(fun->child == NULL);
    967        
    968         clean_match_ids(&fun->match_ids);
    969         free_not_null(fun->name);
    970         free_not_null(fun->pathname);
    971         free(fun);
    972 }
    973 
    974 /** Find the function node with the specified handle.
    975  *
    976  * @param tree          The device tree where we look for the device node.
    977  * @param handle        The handle of the function.
    978  * @return              The function node.
    979  */
    980 fun_node_t *find_fun_node_no_lock(dev_tree_t *tree, devman_handle_t handle)
    981 {
    982         unsigned long key = handle;
    983         link_t *link;
    984        
    985         assert(fibril_rwlock_is_locked(&tree->rwlock));
    986        
    987         link = hash_table_find(&tree->devman_functions, &key);
    988         if (link == NULL)
    989                 return NULL;
    990        
    991         return hash_table_get_instance(link, fun_node_t, devman_fun);
    992 }
    993 
    994 /** Find the function node with the specified handle.
    995  *
    996  * @param tree          The device tree where we look for the device node.
    997  * @param handle        The handle of the function.
    998  * @return              The function node.
    999  */
    1000 fun_node_t *find_fun_node(dev_tree_t *tree, devman_handle_t handle)
    1001 {
    1002         fun_node_t *fun = NULL;
    1003        
    1004         fibril_rwlock_read_lock(&tree->rwlock);
    1005         fun = find_fun_node_no_lock(tree, handle);
    1006         fibril_rwlock_read_unlock(&tree->rwlock);
    1007        
    1008         return fun;
    1009 }
     892        return node;
     893}
     894
    1010895
    1011896/** Create and set device's full path in device tree.
     
    1016901 *                      resources etc.).
    1017902 */
    1018 static bool set_fun_path(fun_node_t *fun, fun_node_t *parent)
    1019 {
    1020         assert(fun->name != NULL);
    1021        
    1022         size_t pathsize = (str_size(fun->name) + 1);
     903static bool set_dev_path(node_t *node, node_t *parent)
     904{
     905        assert(node->name != NULL);
     906       
     907        size_t pathsize = (str_size(node->name) + 1);
    1023908        if (parent != NULL)
    1024909                pathsize += str_size(parent->pathname) + 1;
    1025910       
    1026         fun->pathname = (char *) malloc(pathsize);
    1027         if (fun->pathname == NULL) {
     911        node->pathname = (char *) malloc(pathsize);
     912        if (node->pathname == NULL) {
    1028913                printf(NAME ": failed to allocate device path.\n");
    1029914                return false;
     
    1031916       
    1032917        if (parent != NULL) {
    1033                 str_cpy(fun->pathname, pathsize, parent->pathname);
    1034                 str_append(fun->pathname, pathsize, "/");
    1035                 str_append(fun->pathname, pathsize, fun->name);
     918                str_cpy(node->pathname, pathsize, parent->pathname);
     919                str_append(node->pathname, pathsize, "/");
     920                str_append(node->pathname, pathsize, node->name);
    1036921        } else {
    1037                 str_cpy(fun->pathname, pathsize, fun->name);
     922                str_cpy(node->pathname, pathsize, node->name);
    1038923        }
    1039924       
     
    1051936 *                      etc.).
    1052937 */
    1053 bool insert_dev_node(dev_tree_t *tree, dev_node_t *dev, fun_node_t *pfun)
    1054 {
    1055         assert(dev != NULL);
     938bool insert_dev_node(dev_tree_t *tree, node_t *node, char *dev_name,
     939    node_t *parent)
     940{
     941        assert(node != NULL);
    1056942        assert(tree != NULL);
     943        assert(dev_name != NULL);
    1057944        assert(fibril_rwlock_is_write_locked(&tree->rwlock));
    1058945       
     946        node->name = dev_name;
     947        if (!set_dev_path(node, parent)) {
     948                return false;
     949        }
     950       
    1059951        /* Add the node to the handle-to-node map. */
    1060         dev->handle = ++tree->current_handle;
    1061         unsigned long key = dev->handle;
    1062         hash_table_insert(&tree->devman_devices, &key, &dev->devman_dev);
     952        node->handle = ++tree->current_handle;
     953        unsigned long key = node->handle;
     954        hash_table_insert(&tree->devman_devices, &key, &node->devman_link);
    1063955
    1064956        /* Add the node to the list of its parent's children. */
    1065         printf("insert_dev_node: dev=%p, dev->pfun := %p\n", dev, pfun);
    1066         dev->pfun = pfun;
    1067         pfun->child = dev;
     957        node->parent = parent;
     958        if (parent != NULL)
     959                list_append(&node->sibling, &parent->children);
    1068960       
    1069961        return true;
    1070962}
    1071963
    1072 /** Insert new function into device tree.
    1073  *
     964/** Find device node with a specified path in the device tree.
     965 *
     966 * @param path          The path of the device node in the device tree.
    1074967 * @param tree          The device tree.
    1075  * @param node          The newly added function node.
    1076  * @param dev_name      The name of the newly added function.
    1077  * @param parent        Owning device node.
    1078  *
    1079  * @return              True on success, false otherwise (insufficient resources
    1080  *                      etc.).
    1081  */
    1082 bool insert_fun_node(dev_tree_t *tree, fun_node_t *fun, char *fun_name,
    1083     dev_node_t *dev)
    1084 {
    1085         fun_node_t *pfun;
    1086        
    1087         assert(fun != NULL);
    1088         assert(tree != NULL);
    1089         assert(fun_name != NULL);
    1090         assert(fibril_rwlock_is_write_locked(&tree->rwlock));
    1091        
     968 * @return              The device node if it is present in the tree, NULL
     969 *                      otherwise.
     970 */
     971node_t *find_dev_node_by_path(dev_tree_t *tree, char *path)
     972{
     973        fibril_rwlock_read_lock(&tree->rwlock);
     974       
     975        node_t *dev = tree->root_node;
    1092976        /*
    1093          * The root function is a special case, it does not belong to any
    1094          * device so for the root function dev == NULL.
    1095          */
    1096         pfun = (dev != NULL) ? dev->pfun : NULL;
    1097        
    1098         fun->name = fun_name;
    1099         if (!set_fun_path(fun, pfun)) {
    1100                 return false;
    1101         }
    1102        
    1103         /* Add the node to the handle-to-node map. */
    1104         fun->handle = ++tree->current_handle;
    1105         unsigned long key = fun->handle;
    1106         hash_table_insert(&tree->devman_functions, &key, &fun->devman_fun);
    1107 
    1108         /* Add the node to the list of its parent's children. */
    1109         fun->dev = dev;
    1110         if (dev != NULL)
    1111                 list_append(&fun->dev_functions, &dev->functions);
    1112        
    1113         return true;
    1114 }
    1115 
    1116 /** Find function node with a specified path in the device tree.
    1117  *
    1118  * @param path          The path of the function node in the device tree.
    1119  * @param tree          The device tree.
    1120  * @return              The function node if it is present in the tree, NULL
    1121  *                      otherwise.
    1122  */
    1123 fun_node_t *find_fun_node_by_path(dev_tree_t *tree, char *path)
    1124 {
    1125         fibril_rwlock_read_lock(&tree->rwlock);
    1126        
    1127         fun_node_t *fun = tree->root_node;
    1128         /*
    1129          * Relative path to the function from its parent (but with '/' at the
     977         * Relative path to the device from its parent (but with '/' at the
    1130978         * beginning)
    1131979         */
     
    1134982        bool cont = (rel_path[0] == '/');
    1135983       
    1136         while (cont && fun != NULL) {
     984        while (cont && dev != NULL) {
    1137985                next_path_elem  = get_path_elem_end(rel_path + 1);
    1138986                if (next_path_elem[0] == '/') {
     
    1143991                }
    1144992               
    1145                 fun = find_node_child(fun, rel_path + 1);
     993                dev = find_node_child(dev, rel_path + 1);
    1146994               
    1147995                if (cont) {
     
    11541002        fibril_rwlock_read_unlock(&tree->rwlock);
    11551003       
    1156         return fun;
    1157 }
    1158 
    1159 /** Find child function node with a specified name.
     1004        return dev;
     1005}
     1006
     1007/** Find child device node with a specified name.
    11601008 *
    11611009 * Device tree rwlock should be held at least for reading.
    11621010 *
    1163  * @param parent        The parent function node.
    1164  * @param name          The name of the child function.
    1165  * @return              The child function node.
    1166  */
    1167 fun_node_t *find_node_child(fun_node_t *pfun, const char *name)
    1168 {
    1169         fun_node_t *fun;
     1011 * @param parent        The parent device node.
     1012 * @param name          The name of the child device node.
     1013 * @return              The child device node.
     1014 */
     1015node_t *find_node_child(node_t *parent, const char *name)
     1016{
     1017        node_t *dev;
    11701018        link_t *link;
    11711019       
    1172         link = pfun->child->functions.next;
    1173        
    1174         while (link != &pfun->child->functions) {
    1175                 fun = list_get_instance(link, fun_node_t, dev_functions);
     1020        link = parent->children.next;
     1021       
     1022        while (link != &parent->children) {
     1023                dev = list_get_instance(link, node_t, sibling);
    11761024               
    1177                 if (str_cmp(name, fun->name) == 0)
    1178                         return fun;
     1025                if (str_cmp(name, dev->name) == 0)
     1026                        return dev;
    11791027               
    11801028                link = link->next;
     
    12151063        if (info != NULL) {
    12161064                memset(info, 0, sizeof(dev_class_info_t));
    1217                 list_initialize(&info->dev_classes);
    1218                 list_initialize(&info->devmap_link);
    1219                 list_initialize(&info->link);
     1065                link_initialize(&info->dev_classes);
     1066                link_initialize(&info->devmap_link);
     1067                link_initialize(&info->link);
    12201068        }
    12211069       
     
    12591107}
    12601108
    1261 /** Add the device function to the class.
     1109/** Add the device to the class.
    12621110 *
    12631111 * The device may be added to multiple classes and a class may contain multiple
     
    12721120 *                      with the class.
    12731121 */
    1274 dev_class_info_t *add_function_to_class(fun_node_t *fun, dev_class_t *cl,
     1122dev_class_info_t *add_device_to_class(node_t *dev, dev_class_t *cl,
    12751123    const char *base_dev_name)
    12761124{
    1277         dev_class_info_t *info;
    1278 
    1279         assert(fun != NULL);
    1280         assert(cl != NULL);
    1281 
    1282         info = create_dev_class_info();
    1283 
     1125        dev_class_info_t *info = create_dev_class_info();
    12841126       
    12851127        if (info != NULL) {
    12861128                info->dev_class = cl;
    1287                 info->fun = fun;
     1129                info->dev = dev;
    12881130               
    12891131                /* Add the device to the class. */
     
    12931135               
    12941136                /* Add the class to the device. */
    1295                 list_append(&info->dev_classes, &fun->classes);
     1137                list_append(&info->dev_classes, &dev->classes);
    12961138               
    12971139                /* Create unique name for the device within the class. */
     
    13471189        list_initialize(&class_list->classes);
    13481190        fibril_rwlock_initialize(&class_list->rwlock);
    1349         hash_table_create(&class_list->devmap_functions, DEVICE_BUCKETS, 1,
     1191        hash_table_create(&class_list->devmap_devices, DEVICE_BUCKETS, 1,
    13501192            &devmap_devices_class_ops);
    13511193}
     
    13541196/* Devmap devices */
    13551197
    1356 fun_node_t *find_devmap_tree_function(dev_tree_t *tree, devmap_handle_t devmap_handle)
    1357 {
    1358         fun_node_t *fun = NULL;
     1198node_t *find_devmap_tree_device(dev_tree_t *tree, devmap_handle_t devmap_handle)
     1199{
     1200        node_t *dev = NULL;
    13591201        link_t *link;
    13601202        unsigned long key = (unsigned long) devmap_handle;
    13611203       
    13621204        fibril_rwlock_read_lock(&tree->rwlock);
    1363         link = hash_table_find(&tree->devmap_functions, &key);
     1205        link = hash_table_find(&tree->devmap_devices, &key);
    13641206        if (link != NULL)
    1365                 fun = hash_table_get_instance(link, fun_node_t, devmap_fun);
     1207                dev = hash_table_get_instance(link, node_t, devmap_link);
    13661208        fibril_rwlock_read_unlock(&tree->rwlock);
    13671209       
    1368         return fun;
    1369 }
    1370 
    1371 fun_node_t *find_devmap_class_function(class_list_t *classes,
     1210        return dev;
     1211}
     1212
     1213node_t *find_devmap_class_device(class_list_t *classes,
    13721214    devmap_handle_t devmap_handle)
    13731215{
    1374         fun_node_t *fun = NULL;
     1216        node_t *dev = NULL;
    13751217        dev_class_info_t *cli;
    13761218        link_t *link;
     
    13781220       
    13791221        fibril_rwlock_read_lock(&classes->rwlock);
    1380         link = hash_table_find(&classes->devmap_functions, &key);
     1222        link = hash_table_find(&classes->devmap_devices, &key);
    13811223        if (link != NULL) {
    13821224                cli = hash_table_get_instance(link, dev_class_info_t,
    13831225                    devmap_link);
    1384                 fun = cli->fun;
     1226                dev = cli->dev;
    13851227        }
    13861228        fibril_rwlock_read_unlock(&classes->rwlock);
    13871229       
    1388         return fun;
    1389 }
    1390 
    1391 void class_add_devmap_function(class_list_t *class_list, dev_class_info_t *cli)
     1230        return dev;
     1231}
     1232
     1233void class_add_devmap_device(class_list_t *class_list, dev_class_info_t *cli)
    13921234{
    13931235        unsigned long key = (unsigned long) cli->devmap_handle;
    13941236       
    13951237        fibril_rwlock_write_lock(&class_list->rwlock);
    1396         hash_table_insert(&class_list->devmap_functions, &key, &cli->devmap_link);
     1238        hash_table_insert(&class_list->devmap_devices, &key, &cli->devmap_link);
    13971239        fibril_rwlock_write_unlock(&class_list->rwlock);
    13981240
    1399         assert(find_devmap_class_function(class_list, cli->devmap_handle) != NULL);
    1400 }
    1401 
    1402 void tree_add_devmap_function(dev_tree_t *tree, fun_node_t *fun)
    1403 {
    1404         unsigned long key = (unsigned long) fun->devmap_handle;
     1241        assert(find_devmap_class_device(class_list, cli->devmap_handle) != NULL);
     1242}
     1243
     1244void tree_add_devmap_device(dev_tree_t *tree, node_t *node)
     1245{
     1246        unsigned long key = (unsigned long) node->devmap_handle;
    14051247        fibril_rwlock_write_lock(&tree->rwlock);
    1406         hash_table_insert(&tree->devmap_functions, &key, &fun->devmap_fun);
     1248        hash_table_insert(&tree->devmap_devices, &key, &node->devmap_link);
    14071249        fibril_rwlock_write_unlock(&tree->rwlock);
    14081250}
Note: See TracChangeset for help on using the changeset viewer.