source: mainline/uspace/srv/devman/devman.h@ 76f566d

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 76f566d was a35b458, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

  • Property mode set to 100644
File size: 5.8 KB
Line 
1/*
2 * Copyright (c) 2010 Lenka Trochtova
3 * Copyright (c) 2011 Jiri Svoboda
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup devman
31 * @{
32 */
33
34#ifndef DEVMAN_H_
35#define DEVMAN_H_
36
37#include <stdbool.h>
38#include <adt/list.h>
39#include <adt/hash_table.h>
40#include <ipc/devman.h>
41#include <ipc/loc.h>
42#include <fibril_synch.h>
43#include <atomic.h>
44#include <async.h>
45
46#include "util.h"
47
48#define NAME "devman"
49
50#define LOC_DEVICE_NAMESPACE "devices"
51#define LOC_SEPARATOR '\\'
52
53struct dev_node;
54typedef struct dev_node dev_node_t;
55
56struct fun_node;
57typedef struct fun_node fun_node_t;
58
59typedef struct {
60 fibril_mutex_t mutex;
61 struct driver *driver;
62} client_t;
63
64/** Representation of device driver. */
65typedef struct driver {
66 /** Pointers to previous and next drivers in a linked list. */
67 link_t drivers;
68 /** Handle */
69 devman_handle_t handle;
70
71 /**
72 * Specifies whether the driver has been started and wheter is running
73 * and prepared to receive requests.
74 */
75 driver_state_t state;
76
77 /** Session asociated with this driver. */
78 async_sess_t *sess;
79 /** Name of the device driver. */
80 char *name;
81 /** Path to the driver's binary. */
82 char *binary_path;
83 /** List of device ids for device-to-driver matching. */
84 match_id_list_t match_ids;
85 /** List of devices controlled by this driver. */
86 list_t devices;
87
88 /**
89 * Fibril mutex for this driver - driver state, list of devices, session.
90 */
91 fibril_mutex_t driver_mutex;
92} driver_t;
93
94/** The list of drivers. */
95typedef struct driver_list {
96 /** List of drivers */
97 list_t drivers;
98 /** Fibril mutex for list of drivers. */
99 fibril_mutex_t drivers_mutex;
100 /** Next free handle */
101 devman_handle_t next_handle;
102} driver_list_t;
103
104/** Device state */
105typedef enum {
106 DEVICE_NOT_INITIALIZED = 0,
107 DEVICE_USABLE,
108 DEVICE_NOT_PRESENT,
109 DEVICE_INVALID,
110 /** Device node has been removed from the tree */
111 DEVICE_REMOVED
112} device_state_t;
113
114/** Device node in the device tree. */
115struct dev_node {
116 /** Reference count */
117 atomic_t refcnt;
118
119 /** The global unique identifier of the device. */
120 devman_handle_t handle;
121
122 /** (Parent) function the device is attached to. */
123 fun_node_t *pfun;
124
125 /** List of device functions. */
126 list_t functions;
127 /** Driver of this device. */
128 driver_t *drv;
129 /** The state of the device. */
130 device_state_t state;
131 /** Link to list of devices owned by driver (driver_t.devices) */
132 link_t driver_devices;
133
134 /**
135 * Used by the hash table of devices indexed by devman device handles.
136 */
137 ht_link_t devman_dev;
138
139 /**
140 * Whether this device was already passed to the driver.
141 */
142 bool passed_to_driver;
143};
144
145/** Function state */
146typedef enum {
147 FUN_INIT = 0,
148 FUN_OFF_LINE,
149 FUN_ON_LINE,
150 /** Function node has been removed from the tree */
151 FUN_REMOVED
152} fun_state_t;
153
154/** Function node in the device tree. */
155struct fun_node {
156 /** Reference count */
157 atomic_t refcnt;
158 /** State */
159 fun_state_t state;
160 /** Locked while performing reconfiguration operations */
161 fibril_mutex_t busy_lock;
162
163 /** The global unique identifier of the function */
164 devman_handle_t handle;
165 /** Name of the function, assigned by the device driver */
166 char *name;
167 /** Function type */
168 fun_type_t ftype;
169
170 /** Full path and name of the device in device hierarchy */
171 char *pathname;
172
173 /** Device which this function belongs to */
174 dev_node_t *dev;
175
176 /** Link to list of functions in the device (ddf_dev_t.functions) */
177 link_t dev_functions;
178
179 /** Child device node (if any attached). */
180 dev_node_t *child;
181 /** List of device ids for device-to-driver matching. */
182 match_id_list_t match_ids;
183
184 /** Service ID if the device function is registered with loc. */
185 service_id_t service_id;
186
187 /**
188 * Used by the hash table of functions indexed by devman device handles.
189 */
190 ht_link_t devman_fun;
191
192 /**
193 * Used by the hash table of functions indexed by service IDs.
194 */
195 ht_link_t loc_fun;
196};
197
198/** Represents device tree. */
199typedef struct dev_tree {
200 /** Root device node. */
201 fun_node_t *root_node;
202
203 /**
204 * The next available handle - handles are assigned in a sequential
205 * manner.
206 */
207 devman_handle_t current_handle;
208
209 /** Synchronize access to the device tree. */
210 fibril_rwlock_t rwlock;
211
212 /** Hash table of all devices indexed by devman handles. */
213 hash_table_t devman_devices;
214
215 /** Hash table of all devices indexed by devman handles. */
216 hash_table_t devman_functions;
217
218 /**
219 * Hash table of services registered with location service, indexed by
220 * service IDs.
221 */
222 hash_table_t loc_functions;
223} dev_tree_t;
224
225#endif
226
227/** @}
228 */
Note: See TracBrowser for help on using the repository browser.