Changes in uspace/srv/devman/devman.h [3ad7b1c:80a96d2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.h
r3ad7b1c r80a96d2 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2011 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 41 42 #include <adt/hash_table.h> 42 43 #include <ipc/devman.h> 43 #include <ipc/ devmap.h>44 #include <ipc/loc.h> 44 45 #include <fibril_synch.h> 45 46 #include <atomic.h> 47 #include <async.h> 46 48 47 49 #include "util.h" … … 52 54 #define DEVICE_BUCKETS 256 53 55 54 #define DEVMAP_CLASS_NAMESPACE "class" 55 #define DEVMAP_DEVICE_NAMESPACE "devices" 56 #define DEVMAP_SEPARATOR '\\' 56 #define LOC_DEVICE_NAMESPACE "devices" 57 #define LOC_SEPARATOR '\\' 57 58 58 59 struct dev_node; … … 61 62 struct fun_node; 62 63 typedef struct fun_node fun_node_t; 64 65 typedef struct { 66 fibril_mutex_t mutex; 67 struct driver *driver; 68 } client_t; 63 69 64 70 typedef enum { … … 87 93 int state; 88 94 89 /** Phoneasociated with this driver. */90 int phone;95 /** Session asociated with this driver. */ 96 async_sess_t *sess; 91 97 /** Name of the device driver. */ 92 98 char *name; … … 95 101 /** List of device ids for device-to-driver matching. */ 96 102 match_id_list_t match_ids; 97 /** Pointer to the linked list of devices controlled by this driver. */98 li nk_t devices;99 100 /** 101 * Fibril mutex for this driver - driver state, list of devices, phone.103 /** List of devices controlled by this driver. */ 104 list_t devices; 105 106 /** 107 * Fibril mutex for this driver - driver state, list of devices, session. 102 108 */ 103 109 fibril_mutex_t driver_mutex; … … 107 113 typedef struct driver_list { 108 114 /** List of drivers */ 109 li nk_t drivers;115 list_t drivers; 110 116 /** Fibril mutex for list of drivers. */ 111 117 fibril_mutex_t drivers_mutex; 112 118 } driver_list_t; 113 119 114 /** The state of the device.*/120 /** Device state */ 115 121 typedef enum { 116 122 DEVICE_NOT_INITIALIZED = 0, 117 123 DEVICE_USABLE, 118 124 DEVICE_NOT_PRESENT, 119 DEVICE_INVALID 125 DEVICE_INVALID, 126 /** Device node has been removed from the tree */ 127 DEVICE_REMOVED 120 128 } device_state_t; 121 129 122 130 /** Device node in the device tree. */ 123 131 struct dev_node { 132 /** Reference count */ 133 atomic_t refcnt; 134 124 135 /** The global unique identifier of the device. */ 125 136 devman_handle_t handle; … … 129 140 130 141 /** List of device functions. */ 131 li nk_t functions;142 list_t functions; 132 143 /** Driver of this device. */ 133 144 driver_t *drv; … … 148 159 }; 149 160 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_REMOVED 168 } fun_state_t; 169 150 170 /** Function node in the device tree. */ 151 171 struct fun_node { 172 /** Reference count */ 173 atomic_t refcnt; 174 /** State */ 175 fun_state_t state; 176 152 177 /** The global unique identifier of the function */ 153 178 devman_handle_t handle; 154 179 /** Name of the function, assigned by the device driver */ 155 180 char *name; 181 /** Function type */ 182 fun_type_t ftype; 156 183 157 184 /** Full path and name of the device in device hierarchy */ … … 169 196 match_id_list_t match_ids; 170 197 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; 198 /** Service ID if the device function is registered with loc. */ 199 service_id_t service_id; 175 200 176 201 /** … … 180 205 181 206 /** 182 * Used by the hash table of functions indexed by devmap device handles.183 */ 184 link_t devmap_fun;207 * Used by the hash table of functions indexed by service IDs. 208 */ 209 link_t loc_fun; 185 210 }; 186 211 … … 207 232 208 233 /** 209 * Hash table of devices registered by devmapper, indexed by devmap210 * handles.211 */ 212 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; 213 238 } 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 registered221 * classes.222 */223 link_t link;224 225 /**226 * List of dev_class_info structures - one for each device registered by227 * this class.228 */229 link_t devices;230 231 /**232 * Default base name for the device within the class, might be overrided233 * 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 function245 * can register in an arbitrary number of classes and each class can contain246 * 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 devices256 * registered by the class.257 */258 link_t link;259 260 /**261 * Pointer to the previous and next class info in the list of classes262 * 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 using273 * 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;292 239 293 240 /* Match ids and scores */ … … 311 258 312 259 extern void add_driver(driver_list_t *, driver_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 *); 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 *); 315 263 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 *); 316 268 317 269 extern driver_t *find_driver(driver_list_t *, const char *); … … 326 278 extern dev_node_t *create_dev_node(void); 327 279 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 *); 328 282 extern dev_node_t *find_dev_node_no_lock(dev_tree_t *tree, 329 283 devman_handle_t handle); 330 284 extern dev_node_t *find_dev_node(dev_tree_t *tree, devman_handle_t handle); 331 285 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 *); 332 288 333 289 extern fun_node_t *create_fun_node(void); 334 290 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 *); 335 293 extern fun_node_t *find_fun_node_no_lock(dev_tree_t *tree, 336 294 devman_handle_t handle); 337 295 extern fun_node_t *find_fun_node(dev_tree_t *tree, devman_handle_t handle); 338 296 extern fun_node_t *find_fun_node_by_path(dev_tree_t *, char *); 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 *);297 extern fun_node_t *find_fun_node_in_device(dev_tree_t *tree, dev_node_t *, 298 const char *); 341 299 342 300 /* Device tree */ … … 345 303 extern bool create_root_nodes(dev_tree_t *); 346 304 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 *); 347 306 extern bool insert_fun_node(dev_tree_t *, fun_node_t *, char *, dev_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 *); 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 *); 374 316 375 317 #endif
Note:
See TracChangeset
for help on using the changeset viewer.