Changeset a32defa in mainline for uspace/srv/devman/devman.c


Ignore:
Timestamp:
2010-06-01T20:53:07Z (15 years ago)
Author:
Lenka Trochtova <trochtova.lenka@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a6e54c5d
Parents:
ce89036b
Message:

Register devices in the device tree by the device mapper so the device hierarchy can be seen from devfs.

File:
1 edited

Legend:

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

    rce89036b ra32defa  
    3636#include <ipc/driver.h>
    3737#include <ipc/devman.h>
     38#include <devmap.h>
    3839
    3940#include "devman.h"
     
    488489 * @param driver the driver to which the devices are passed.
    489490 */
    490 static void pass_devices_to_driver(driver_t *driver)
     491static void pass_devices_to_driver(driver_t *driver, dev_tree_t *tree)
    491492{       
    492493        printf(NAME ": pass_devices_to_driver\n");
     
    501502                while (link != &driver->devices) {
    502503                        dev = list_get_instance(link, node_t, driver_devices);
    503                         add_device(phone, driver, dev);
     504                        add_device(phone, driver, dev, tree);
    504505                        link = link->next;
    505506                }
     
    516517 * @param driver the driver which registered itself as running by the device manager.
    517518 */
    518 void initialize_running_driver(driver_t *driver)
     519void initialize_running_driver(driver_t *driver, dev_tree_t *tree)
    519520{       
    520521        printf(NAME ": initialize_running_driver\n");
     
    522523       
    523524        // pass devices which have been already assigned to the driver to the driver
    524         pass_devices_to_driver(driver);
     525        pass_devices_to_driver(driver, tree);   
    525526       
    526527        // change driver's state to running
     
    530531}
    531532
     533
     534static void devmap_register_tree_device(node_t *node, dev_tree_t *tree)
     535{
     536        // create devmap path and name for the device
     537        char *devmap_pathname = NULL;
     538        char *devmap_name = NULL;
     539       
     540        asprintf(&devmap_name, "%s", node->pathname);
     541        if (NULL == devmap_name) {
     542                return;
     543        }
     544       
     545        replace_char(devmap_name, '/', DEVMAP_SEPARATOR);
     546       
     547        asprintf(&devmap_pathname, "%s/%s", DEVMAP_DEVICE_NAMESPACE, devmap_name);
     548        if (NULL == devmap_pathname) {
     549                free(devmap_name);
     550                return;
     551        }       
     552       
     553        devmap_device_register(devmap_pathname, &node->devmap_handle);
     554       
     555        tree_add_devmap_device(tree, node);
     556       
     557        free(devmap_name);
     558        free(devmap_pathname); 
     559}
     560
     561
    532562/** Pass a device to running driver.
    533563 *
     
    535565 * @param node the device's node in the device tree.
    536566 */
    537 void add_device(int phone, driver_t *drv, node_t *node)
     567void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree)
    538568{
    539569        printf(NAME ": add_device\n");
     
    556586        case EOK:
    557587                node->state = DEVICE_USABLE;
     588                devmap_register_tree_device(node, tree);
    558589                break;
    559590        case ENOENT:
     
    575606 * @return true if the suitable driver is found and successfully assigned to the device, false otherwise.
    576607 */
    577 bool assign_driver(node_t *node, driver_list_t *drivers_list)
     608bool assign_driver(node_t *node, driver_list_t *drivers_list, dev_tree_t *tree)
    578609{
    579610        //printf(NAME ": assign_driver\n");
     
    598629                int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);
    599630                if (phone > 0) {
    600                         add_device(phone, drv, node);           
     631                        add_device(phone, drv, node, tree);             
    601632                        ipc_hangup(phone);
    602633                }
     
    632663
    633664        // find suitable driver and start it
    634         return assign_driver(tree->root_node, drivers_list);
     665        return assign_driver(tree->root_node, drivers_list, tree);
    635666}
    636667
Note: See TracChangeset for help on using the changeset viewer.