Ignore:
File:
1 edited

Legend:

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

    rb72efe8 r80a96d2  
    11/*
    22 * Copyright (c) 2010 Lenka Trochtova
     3 * Copyright (c) 2011 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    4142#include <adt/hash_table.h>
    4243#include <ipc/devman.h>
    43 #include <ipc/devmap.h>
     44#include <ipc/loc.h>
    4445#include <fibril_synch.h>
    4546#include <atomic.h>
     
    5354#define DEVICE_BUCKETS 256
    5455
    55 #define DEVMAP_CLASS_NAMESPACE "class"
    56 #define DEVMAP_DEVICE_NAMESPACE "devices"
    57 #define DEVMAP_SEPARATOR '\\'
     56#define LOC_DEVICE_NAMESPACE "devices"
     57#define LOC_SEPARATOR '\\'
    5858
    5959struct dev_node;
     
    6262struct fun_node;
    6363typedef struct fun_node fun_node_t;
     64
     65typedef struct {
     66        fibril_mutex_t mutex;
     67        struct driver *driver;
     68} client_t;
    6469
    6570typedef enum {
     
    113118} driver_list_t;
    114119
    115 /** The state of the device. */
     120/** Device state */
    116121typedef enum {
    117122        DEVICE_NOT_INITIALIZED = 0,
    118123        DEVICE_USABLE,
    119124        DEVICE_NOT_PRESENT,
    120         DEVICE_INVALID
     125        DEVICE_INVALID,
     126        /** Device node has been removed from the tree */
     127        DEVICE_REMOVED
    121128} device_state_t;
    122129
    123130/** Device node in the device tree. */
    124131struct dev_node {
     132        /** Reference count */
     133        atomic_t refcnt;
     134       
    125135        /** The global unique identifier of the device. */
    126136        devman_handle_t handle;
     
    149159};
    150160
     161/** Function state */
     162typedef enum {
     163        FUN_INIT = 0,
     164        FUN_OFF_LINE,
     165        FUN_ON_LINE,
     166        /** Function node has been removed from the tree */
     167        FUN_REMOVED
     168} fun_state_t;
     169
    151170/** Function node in the device tree. */
    152171struct fun_node {
     172        /** Reference count */
     173        atomic_t refcnt;
     174        /** State */
     175        fun_state_t state;
     176       
    153177        /** The global unique identifier of the function */
    154178        devman_handle_t handle;
    155179        /** Name of the function, assigned by the device driver */
    156180        char *name;
     181        /** Function type */
     182        fun_type_t ftype;
    157183       
    158184        /** Full path and name of the device in device hierarchy */
     
    170196        match_id_list_t match_ids;
    171197       
    172         /** List of device classes to which this device function belongs. */
    173         list_t classes;
    174         /** Devmap handle if the device function is registered by devmap. */
    175         devmap_handle_t devmap_handle;
     198        /** Service ID if the device function is registered with loc. */
     199        service_id_t service_id;
    176200       
    177201        /**
     
    181205       
    182206        /**
    183          * Used by the hash table of functions indexed by devmap device handles.
    184          */
    185         link_t devmap_fun;
     207         * Used by the hash table of functions indexed by service IDs.
     208         */
     209        link_t loc_fun;
    186210};
    187211
     
    208232       
    209233        /**
    210          * Hash table of devices registered by devmapper, indexed by devmap
    211          * handles.
    212          */
    213         hash_table_t devmap_functions;
     234         * Hash table of services registered with location service, indexed by
     235         * service IDs.
     236         */
     237        hash_table_t loc_functions;
    214238} dev_tree_t;
    215 
    216 typedef struct dev_class {
    217         /** The name of the class. */
    218         const char *name;
    219        
    220         /**
    221          * Pointer to the previous and next class in the list of registered
    222          * classes.
    223          */
    224         link_t link;
    225        
    226         /**
    227          * List of dev_class_info structures - one for each device registered by
    228          * this class.
    229          */
    230         list_t devices;
    231        
    232         /**
    233          * Default base name for the device within the class, might be overrided
    234          * by the driver.
    235          */
    236         const char *base_dev_name;
    237        
    238         /** Unique numerical identifier of the newly added device. */
    239         size_t curr_dev_idx;
    240         /** Synchronize access to the list of devices in this class. */
    241         fibril_mutex_t mutex;
    242 } dev_class_t;
    243 
    244 /**
    245  * Provides n-to-m mapping between function nodes and classes - each function
    246  * can register in an arbitrary number of classes and each class can contain
    247  * an arbitrary number of device functions.
    248  */
    249 typedef struct dev_class_info {
    250         /** The class. */
    251         dev_class_t *dev_class;
    252         /** The device. */
    253         fun_node_t *fun;
    254        
    255         /**
    256          * Pointer to the previous and next class info in the list of devices
    257          * registered by the class.
    258          */
    259         link_t link;
    260        
    261         /**
    262          * Pointer to the previous and next class info in the list of classes
    263          * by which the device is registered.
    264          */
    265         link_t dev_classes;
    266        
    267         /** The name of the device function within the class. */
    268         char *dev_name;
    269         /** The handle of the device by device mapper in the class namespace. */
    270         devmap_handle_t devmap_handle;
    271        
    272         /**
    273          * Link in the hash table of devices registered by the devmapper using
    274          * their class names.
    275          */
    276         link_t devmap_link;
    277 } dev_class_info_t;
    278 
    279 /** The list of device classes. */
    280 typedef struct class_list {
    281         /** List of classes. */
    282         list_t classes;
    283        
    284         /**
    285          * Hash table of devices registered by devmapper using their class name,
    286          * indexed by devmap handles.
    287          */
    288         hash_table_t devmap_functions;
    289        
    290         /** Fibril mutex for list of classes. */
    291         fibril_rwlock_t rwlock;
    292 } class_list_t;
    293239
    294240/* Match ids and scores */
     
    312258
    313259extern void add_driver(driver_list_t *, driver_t *);
    314 extern void attach_driver(dev_node_t *, driver_t *);
    315 extern void add_device(async_sess_t *, driver_t *, dev_node_t *, dev_tree_t *);
     260extern void attach_driver(dev_tree_t *, dev_node_t *, driver_t *);
     261extern void detach_driver(dev_tree_t *, dev_node_t *);
     262extern void add_device(driver_t *, dev_node_t *, dev_tree_t *);
    316263extern bool start_driver(driver_t *);
     264extern int driver_dev_remove(dev_tree_t *, dev_node_t *);
     265extern int driver_dev_gone(dev_tree_t *, dev_node_t *);
     266extern int driver_fun_online(dev_tree_t *, fun_node_t *);
     267extern int driver_fun_offline(dev_tree_t *, fun_node_t *);
    317268
    318269extern driver_t *find_driver(driver_list_t *, const char *);
     
    327278extern dev_node_t *create_dev_node(void);
    328279extern void delete_dev_node(dev_node_t *node);
     280extern void dev_add_ref(dev_node_t *);
     281extern void dev_del_ref(dev_node_t *);
    329282extern dev_node_t *find_dev_node_no_lock(dev_tree_t *tree,
    330283    devman_handle_t handle);
    331284extern dev_node_t *find_dev_node(dev_tree_t *tree, devman_handle_t handle);
    332285extern dev_node_t *find_dev_function(dev_node_t *, const char *);
     286extern int dev_get_functions(dev_tree_t *tree, dev_node_t *, devman_handle_t *,
     287    size_t, size_t *);
    333288
    334289extern fun_node_t *create_fun_node(void);
    335290extern void delete_fun_node(fun_node_t *);
     291extern void fun_add_ref(fun_node_t *);
     292extern void fun_del_ref(fun_node_t *);
    336293extern fun_node_t *find_fun_node_no_lock(dev_tree_t *tree,
    337294    devman_handle_t handle);
    338295extern fun_node_t *find_fun_node(dev_tree_t *tree, devman_handle_t handle);
    339296extern fun_node_t *find_fun_node_by_path(dev_tree_t *, char *);
    340 extern fun_node_t *find_fun_node_in_device(dev_node_t *, const char *);
    341 extern fun_node_t *find_fun_node_by_class(class_list_t *, const char *, const char *);
     297extern fun_node_t *find_fun_node_in_device(dev_tree_t *tree, dev_node_t *,
     298    const char *);
    342299
    343300/* Device tree */
     
    346303extern bool create_root_nodes(dev_tree_t *);
    347304extern bool insert_dev_node(dev_tree_t *, dev_node_t *, fun_node_t *);
     305extern void remove_dev_node(dev_tree_t *, dev_node_t *);
    348306extern bool insert_fun_node(dev_tree_t *, fun_node_t *, char *, dev_node_t *);
    349 
    350 /* Device classes */
    351 
    352 extern dev_class_t *create_dev_class(void);
    353 extern dev_class_info_t *create_dev_class_info(void);
    354 extern size_t get_new_class_dev_idx(dev_class_t *);
    355 extern char *create_dev_name_for_class(dev_class_t *, const char *);
    356 extern dev_class_info_t *add_function_to_class(fun_node_t *, dev_class_t *,
    357     const char *);
    358 
    359 extern void init_class_list(class_list_t *);
    360 
    361 extern dev_class_t *get_dev_class(class_list_t *, char *);
    362 extern dev_class_t *find_dev_class_no_lock(class_list_t *, const char *);
    363 extern dev_class_info_t *find_dev_in_class(dev_class_t *, const char *);
    364 extern void add_dev_class_no_lock(class_list_t *, dev_class_t *);
    365 
    366 /* Devmap devices */
    367 
    368 extern void devmap_register_tree_function(fun_node_t *, dev_tree_t *);
    369 
    370 extern fun_node_t *find_devmap_tree_function(dev_tree_t *, devmap_handle_t);
    371 extern fun_node_t *find_devmap_class_function(class_list_t *, devmap_handle_t);
    372 
    373 extern void class_add_devmap_function(class_list_t *, dev_class_info_t *);
    374 extern void tree_add_devmap_function(dev_tree_t *, fun_node_t *);
     307extern void remove_fun_node(dev_tree_t *, fun_node_t *);
     308
     309/* Loc services */
     310
     311extern void loc_register_tree_function(fun_node_t *, dev_tree_t *);
     312
     313extern fun_node_t *find_loc_tree_function(dev_tree_t *, service_id_t);
     314
     315extern void tree_add_loc_function(dev_tree_t *, fun_node_t *);
    375316
    376317#endif
Note: See TracChangeset for help on using the changeset viewer.