Changes in uspace/srv/devman/devman.h [80a96d2:3ad7b1c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.h
r80a96d2 r3ad7b1c 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2011 Jiri Svoboda4 3 * All rights reserved. 5 4 * … … 42 41 #include <adt/hash_table.h> 43 42 #include <ipc/devman.h> 44 #include <ipc/ loc.h>43 #include <ipc/devmap.h> 45 44 #include <fibril_synch.h> 46 45 #include <atomic.h> 47 #include <async.h>48 46 49 47 #include "util.h" … … 54 52 #define DEVICE_BUCKETS 256 55 53 56 #define LOC_DEVICE_NAMESPACE "devices" 57 #define LOC_SEPARATOR '\\' 54 #define DEVMAP_CLASS_NAMESPACE "class" 55 #define DEVMAP_DEVICE_NAMESPACE "devices" 56 #define DEVMAP_SEPARATOR '\\' 58 57 59 58 struct dev_node; … … 62 61 struct fun_node; 63 62 typedef struct fun_node fun_node_t; 64 65 typedef struct {66 fibril_mutex_t mutex;67 struct driver *driver;68 } client_t;69 63 70 64 typedef enum { … … 93 87 int state; 94 88 95 /** Sessionasociated with this driver. */96 async_sess_t *sess;89 /** Phone asociated with this driver. */ 90 int phone; 97 91 /** Name of the device driver. */ 98 92 char *name; … … 101 95 /** List of device ids for device-to-driver matching. */ 102 96 match_id_list_t match_ids; 103 /** List of devices controlled by this driver. */104 li st_t devices;105 106 /** 107 * Fibril mutex for this driver - driver state, list of devices, session.97 /** Pointer to the linked list of devices controlled by this driver. */ 98 link_t devices; 99 100 /** 101 * Fibril mutex for this driver - driver state, list of devices, phone. 108 102 */ 109 103 fibril_mutex_t driver_mutex; … … 113 107 typedef struct driver_list { 114 108 /** List of drivers */ 115 li st_t drivers;109 link_t drivers; 116 110 /** Fibril mutex for list of drivers. */ 117 111 fibril_mutex_t drivers_mutex; 118 112 } driver_list_t; 119 113 120 /** Device state*/114 /** The state of the device. */ 121 115 typedef enum { 122 116 DEVICE_NOT_INITIALIZED = 0, 123 117 DEVICE_USABLE, 124 118 DEVICE_NOT_PRESENT, 125 DEVICE_INVALID, 126 /** Device node has been removed from the tree */ 127 DEVICE_REMOVED 119 DEVICE_INVALID 128 120 } device_state_t; 129 121 130 122 /** Device node in the device tree. */ 131 123 struct dev_node { 132 /** Reference count */133 atomic_t refcnt;134 135 124 /** The global unique identifier of the device. */ 136 125 devman_handle_t handle; … … 140 129 141 130 /** List of device functions. */ 142 li st_t functions;131 link_t functions; 143 132 /** Driver of this device. */ 144 133 driver_t *drv; … … 159 148 }; 160 149 161 /** Function state */162 typedef enum {163 FUN_INIT = 0,164 FUN_OFF_LINE,165 FUN_ON_LINE,166 /** Function node has been removed from the tree */167 FUN_REMOVED168 } fun_state_t;169 170 150 /** Function node in the device tree. */ 171 151 struct fun_node { 172 /** Reference count */173 atomic_t refcnt;174 /** State */175 fun_state_t state;176 177 152 /** The global unique identifier of the function */ 178 153 devman_handle_t handle; 179 154 /** Name of the function, assigned by the device driver */ 180 155 char *name; 181 /** Function type */182 fun_type_t ftype;183 156 184 157 /** Full path and name of the device in device hierarchy */ … … 196 169 match_id_list_t match_ids; 197 170 198 /** Service ID if the device function is registered with loc. */ 199 service_id_t service_id; 171 /** The list of device classes to which this device function belongs. */ 172 link_t classes; 173 /** Devmap handle if the device function is registered by devmap. */ 174 devmap_handle_t devmap_handle; 200 175 201 176 /** … … 205 180 206 181 /** 207 * Used by the hash table of functions indexed by service IDs.208 */ 209 link_t loc_fun;182 * Used by the hash table of functions indexed by devmap device handles. 183 */ 184 link_t devmap_fun; 210 185 }; 211 186 … … 232 207 233 208 /** 234 * Hash table of services registered with location service, indexed by235 * service IDs.236 */ 237 hash_table_t loc_functions;209 * Hash table of devices registered by devmapper, indexed by devmap 210 * handles. 211 */ 212 hash_table_t devmap_functions; 238 213 } dev_tree_t; 214 215 typedef struct dev_class { 216 /** The name of the class. */ 217 const char *name; 218 219 /** 220 * Pointer to the previous and next class in the list of registered 221 * classes. 222 */ 223 link_t link; 224 225 /** 226 * List of dev_class_info structures - one for each device registered by 227 * this class. 228 */ 229 link_t devices; 230 231 /** 232 * Default base name for the device within the class, might be overrided 233 * by the driver. 234 */ 235 const char *base_dev_name; 236 237 /** Unique numerical identifier of the newly added device. */ 238 size_t curr_dev_idx; 239 /** Synchronize access to the list of devices in this class. */ 240 fibril_mutex_t mutex; 241 } dev_class_t; 242 243 /** 244 * Provides n-to-m mapping between function nodes and classes - each function 245 * can register in an arbitrary number of classes and each class can contain 246 * an arbitrary number of device functions. 247 */ 248 typedef struct dev_class_info { 249 /** The class. */ 250 dev_class_t *dev_class; 251 /** The device. */ 252 fun_node_t *fun; 253 254 /** 255 * Pointer to the previous and next class info in the list of devices 256 * registered by the class. 257 */ 258 link_t link; 259 260 /** 261 * Pointer to the previous and next class info in the list of classes 262 * by which the device is registered. 263 */ 264 link_t dev_classes; 265 266 /** The name of the device function within the class. */ 267 char *dev_name; 268 /** The handle of the device by device mapper in the class namespace. */ 269 devmap_handle_t devmap_handle; 270 271 /** 272 * Link in the hash table of devices registered by the devmapper using 273 * their class names. 274 */ 275 link_t devmap_link; 276 } dev_class_info_t; 277 278 /** The list of device classes. */ 279 typedef struct class_list { 280 /** List of classes. */ 281 link_t classes; 282 283 /** 284 * Hash table of devices registered by devmapper using their class name, 285 * indexed by devmap handles. 286 */ 287 hash_table_t devmap_functions; 288 289 /** Fibril mutex for list of classes. */ 290 fibril_rwlock_t rwlock; 291 } class_list_t; 239 292 240 293 /* Match ids and scores */ … … 258 311 259 312 extern void add_driver(driver_list_t *, driver_t *); 260 extern void attach_driver(dev_tree_t *, dev_node_t *, driver_t *); 261 extern void detach_driver(dev_tree_t *, dev_node_t *); 262 extern void add_device(driver_t *, dev_node_t *, dev_tree_t *); 313 extern void attach_driver(dev_node_t *, driver_t *); 314 extern void add_device(int, driver_t *, dev_node_t *, dev_tree_t *); 263 315 extern bool start_driver(driver_t *); 264 extern int driver_dev_remove(dev_tree_t *, dev_node_t *);265 extern int driver_dev_gone(dev_tree_t *, dev_node_t *);266 extern int driver_fun_online(dev_tree_t *, fun_node_t *);267 extern int driver_fun_offline(dev_tree_t *, fun_node_t *);268 316 269 317 extern driver_t *find_driver(driver_list_t *, const char *); … … 278 326 extern dev_node_t *create_dev_node(void); 279 327 extern void delete_dev_node(dev_node_t *node); 280 extern void dev_add_ref(dev_node_t *);281 extern void dev_del_ref(dev_node_t *);282 328 extern dev_node_t *find_dev_node_no_lock(dev_tree_t *tree, 283 329 devman_handle_t handle); 284 330 extern dev_node_t *find_dev_node(dev_tree_t *tree, devman_handle_t handle); 285 331 extern dev_node_t *find_dev_function(dev_node_t *, const char *); 286 extern int dev_get_functions(dev_tree_t *tree, dev_node_t *, devman_handle_t *,287 size_t, size_t *);288 332 289 333 extern fun_node_t *create_fun_node(void); 290 334 extern void delete_fun_node(fun_node_t *); 291 extern void fun_add_ref(fun_node_t *);292 extern void fun_del_ref(fun_node_t *);293 335 extern fun_node_t *find_fun_node_no_lock(dev_tree_t *tree, 294 336 devman_handle_t handle); 295 337 extern fun_node_t *find_fun_node(dev_tree_t *tree, devman_handle_t handle); 296 338 extern fun_node_t *find_fun_node_by_path(dev_tree_t *, char *); 297 extern fun_node_t *find_fun_node_in_device(dev_ tree_t *tree, dev_node_t *,298 339 extern fun_node_t *find_fun_node_in_device(dev_node_t *, const char *); 340 extern fun_node_t *find_fun_node_by_class(class_list_t *, const char *, const char *); 299 341 300 342 /* Device tree */ … … 303 345 extern bool create_root_nodes(dev_tree_t *); 304 346 extern bool insert_dev_node(dev_tree_t *, dev_node_t *, fun_node_t *); 305 extern void remove_dev_node(dev_tree_t *, dev_node_t *);306 347 extern bool insert_fun_node(dev_tree_t *, fun_node_t *, char *, dev_node_t *); 307 extern void remove_fun_node(dev_tree_t *, fun_node_t *); 308 309 /* Loc services */ 310 311 extern void loc_register_tree_function(fun_node_t *, dev_tree_t *); 312 313 extern fun_node_t *find_loc_tree_function(dev_tree_t *, service_id_t); 314 315 extern void tree_add_loc_function(dev_tree_t *, fun_node_t *); 348 349 /* Device classes */ 350 351 extern dev_class_t *create_dev_class(void); 352 extern dev_class_info_t *create_dev_class_info(void); 353 extern size_t get_new_class_dev_idx(dev_class_t *); 354 extern char *create_dev_name_for_class(dev_class_t *, const char *); 355 extern dev_class_info_t *add_function_to_class(fun_node_t *, dev_class_t *, 356 const char *); 357 358 extern void init_class_list(class_list_t *); 359 360 extern dev_class_t *get_dev_class(class_list_t *, char *); 361 extern dev_class_t *find_dev_class_no_lock(class_list_t *, const char *); 362 extern dev_class_info_t *find_dev_in_class(dev_class_t *, const char *); 363 extern void add_dev_class_no_lock(class_list_t *, dev_class_t *); 364 365 /* Devmap devices */ 366 367 extern void devmap_register_tree_function(fun_node_t *, dev_tree_t *); 368 369 extern fun_node_t *find_devmap_tree_function(dev_tree_t *, devmap_handle_t); 370 extern fun_node_t *find_devmap_class_function(class_list_t *, devmap_handle_t); 371 372 extern void class_add_devmap_function(class_list_t *, dev_class_info_t *); 373 extern void tree_add_devmap_function(dev_tree_t *, fun_node_t *); 316 374 317 375 #endif
Note:
See TracChangeset
for help on using the changeset viewer.