2 * Copyright (c) 2007 Kevin Wolf
4 * This program is free software. It comes without any warranty, to
5 * the extent permitted by applicable law. You can redistribute it
6 * and/or modify it under the terms of the Do What The Fuck You Want
7 * To Public License, Version 2, as published by Sam Hocevar. See
8 * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
13 * Core ist das Basismodul von CDI. Es stellt die grundlegenden Datenstrukturen
14 * und Funktionen bereit, auf die andere Module aufbauen.
16 * \section Datenstrukturen
17 * CDI basiert auf drei grundlegenden Datenstrukturen. Die einzelnen Module
18 * erweitern diese Strukturen in einer kompatiblen Weise: cdi_net_driver ist
19 * beispielsweise eine Struktur, die cdi_driver als erstes Element enthält, so
20 * dass sie auf cdi_driver gecastet werden kann. Bei den Strukturen handelt es
23 * - cdi_device beschreibt ein allgemeines Gerät. Es hat insbesondere einen
24 * zugehörigen Treiber und eine Adresse, die es in seinem Bus eindeutig
26 * - cdi_driver beschreibt einen allgemeinen Treiber. Jeder Treiber hat einen
27 * Typ, der beschreibt, zu welchem Modul er gehört und damit auch, in
28 * welchen Datentyp sowohl der Treiber als auch seine Geräte gecastet werden
29 * können. Jeder Treiber hat außerdem eine Reihe von Funktionspointern, die
30 * es der CDI-Bibliothek erlauben, Funktionen im Treiber aufzurufen (z.B. ein
31 * Netzwerkpaket zu versenden)
32 * - cdi_bus_data enthält busspezifische Informationen zu einem Gerät wie die
33 * Adresse des Geräts auf dem Bus (z.B. bus.dev.func für PCI-Geräte) oder
34 * andere busbezogene Felder enthalten (z.B. Vendor/Device ID). Diese
35 * Struktur wird zur Initialisierung von Geräten benutzt, d.h. wenn das
36 * Gerät noch nicht existiert.
38 * \section core_init Initialisierung
40 * Die Initialisierung der Treiber läuft in folgenden Schritten ab:
42 * -# Initialisierung der Treiber: Es wird der init-Callback jedes Treibers
43 * aufgerufen. Anschließend wird der Treiber bei CDI und dem Betriebssystem
44 * registriert, so dass er vor und während der Ausführung von init keine
45 * Anfragen entgegennehmen muss, aber direkt anschließend dafür bereit
47 * -# Suche und Initialisierung der Geräte: Für jedes verfügbare Gerät wird
48 * init_device nacheinander für alle Treiber aufgerufen, bis ein Treiber
49 * das Gerät akzeptiert (oder alle Treiber erfolglos versucht wurden).
51 * @todo Für jedes Gerät scan_bus aufrufen und die dabei gefundenen
52 * Geräte wiederum initialisieren.
56 * The Core module contains the fundamental CDI data structures and functions
57 * on which the other modules are based.
59 * \section Data structures
60 * CDI is based on three basic structures. The other modules extend these
61 * structures in a compatible way: For example, cdi_net_driver is a structure
62 * that contains a cdi_driver as its first element so that it can be cast to
63 * cdi_device. The structures are:
65 * - cdi_device describes a device. Amongst others, it contains fields that
66 * reference the corresponding driver and an address that identifies the
67 * device uniquely on its bus.
68 * - cdi_driver describes a driver. It has a type which determines to which
69 * CDI module the driver belongs (and thus which type the struct may be cast
70 * to). Moreover, each driver has some function points which can be used by
71 * the CDI library to call driver functions (e.g. for sending a network
73 * - cdi_bus_data contains bus specific information on a device, like the
74 * address of the device on the bus (e.g. bus.dev.func for PCI) or other
75 * bus related information (e.g. device/vendor ID). This structure is used
76 * for initialisation of devices, i.e. when the device itself doesn't exist
79 * \section core_init Initialisation
81 * Drivers are initialised in the following steps:
83 * -# Initialisation of drivers: The init() callback of each driver is called.
84 * After the driver has returned from there, it is registered with CDI and
85 * the operating system. The driver needs not to be able to handle requests
86 * before it has completed its init() call, but it must be prepared for them
87 * immediately afterwards.
88 * -# Search for and initialisation of devices: For each device init_device is
89 * called in the available drivers until a driver accepts the device (or all
90 * of the drivers reject it).
92 * @todo Call scan_bus for each device and initialise possible child devices
105 #include <cdi-osdep.h>
106 #include <cdi/lists.h>
126 * Beschreibt ein Gerät in Bezug auf den Bus, an dem es hängt. Diese
127 * Informationen enthalten in der Regel eine Busadresse und zusätzliche Daten
128 * wie Device/Vendor ID
132 * Describes a device in relation to its bus. This information usually contains
133 * a bus address and some additional data like device/vendor ID.
137 struct cdi_bus_data
{
138 cdi_device_type_t bus_type
;
143 * Beschreibt ein Gerät
152 * Name des Geräts (eindeutig unter den Geräten desselben Treibers)
155 * Name of the device (must be unique among the devices of the same driver)
162 * Treiber, der für das Gerät benutzt wird
165 * Driver used for the device
168 struct cdi_driver
* driver
;
172 * Busspezifische Daten zum Gerät
175 * Bus specific data for the device
178 struct cdi_bus_data
* bus_data
;
186 * Beschreibt einen CDI-Treiber
189 * Describes a CDI driver
193 cdi_device_type_t type
;
194 cdi_device_type_t bus
;
199 * Enthält alle Geräte (cdi_device), die den Treiber benutzen
202 * Contains all devices (cdi_device) which use this driver
209 * Versucht ein Gerät zu initialisieren. Die Funktion darf von der
210 * CDI-Bibliothek nur aufgerufen werden, wenn bus_data->type dem Typ des
211 * Treibers entspricht
213 * @return Ein per malloc() erzeugtes neues cdi_device, wenn der Treiber
214 * das Gerät akzeptiert. Wenn er das Gerät nicht unterstützt, gibt er
219 * Tries to initialise a device. The function may only be called by the CDI
220 * library if bus_data->type matches the type of the driver.
222 * @return A new cdi_device created by malloc() if the driver accepts the
223 * device. NULL if the device is not supported by this driver.
226 struct cdi_device
* (*init_device
)(struct cdi_bus_data
* bus_data
);
227 void (*remove_device
)(struct cdi_device
* device
);
230 int (*destroy
)(void);
235 * Treiber, die ihre eigene main-Funktion implemenieren, müssen diese Funktoin
236 * vor dem ersten Aufruf einer anderen CDI-Funktion aufrufen.
237 * Initialisiert interne Datenstruktur der Implementierung fuer das jeweilige
238 * Betriebssystem und startet anschliessend alle Treiber.
240 * Ein wiederholter Aufruf bleibt ohne Effekt. Es bleibt der Implementierung
241 * der CDI-Bibliothek überlassen, ob diese Funktion zurückkehrt.
245 * Drivers which implement their own main() function must call this function
246 * before they call any other CDI function. It initialises internal data
247 * structures of the CDI implementation and starts all drivers.
249 * This function should only be called once, additional calls will have no
250 * effect. Depending on the implementation, this function may or may not
258 * Initialisiert die Datenstrukturen für einen Treiber
259 * (erzeugt die devices-Liste)
263 * Initialises the data structures for a driver
266 void cdi_driver_init(struct cdi_driver
* driver
);
270 * Deinitialisiert die Datenstrukturen für einen Treiber
271 * (gibt die devices-Liste frei)
275 * Deinitialises the data structures for a driver
278 void cdi_driver_destroy(struct cdi_driver
* driver
);
282 * Registriert den Treiber fuer ein neues Geraet
284 * @param driver Zu registierender Treiber
288 * Registers a new driver with CDI
291 void cdi_driver_register(struct cdi_driver
* driver
);
295 * Informiert dass Betriebssystem, dass ein neues Geraet angeschlossen wurde.
297 * Der Zweck dieser Funktion ist es, Bustreibern zu ermöglichen, die Geräte
298 * auf ihrem Bus anderen Treibern zur Verfügung zu stellen, die über den
299 * PCI-Bus nicht erreichbar sind (z.B. einen USB-Massenspeicher). Sie erlaubt
300 * es Geräten auch, dem OS die Verfügbarkeit anderer Geräte auch außerhalb
301 * einer Controller-Schnittstelle mitzuteilen.
303 * Das Betriebssystem kann daraufhin den passenden Treiber laden (oder einen
304 * geladenen Treiber informieren), den es anhand der Informationen in @a device
305 * finden kann. CDI definiert nicht, welche Aktionen das OS auszuführen hat
306 * oder auf welche Weise mögliche Aktionen (wie das Laden eines Treibers)
309 * CDI-Implementierungen können diese Funktion auch intern benutzen, um
310 * während der Initialisierung die Geräte auf dem PCI-Bus bereitzustellen.
312 * @return 0 bei Erfolg, -1 im Fehlerfall
315 * Allows a driver to inform the operating system that a new device has become
318 * The rationale behind cdi_provide_device is to allow controller interfaces
319 * to provide devices on their bus which may not be available through the
320 * conventional PCI bus (for example, a USB mass storage device). This also
321 * allows devices to inform the OS of the presence of other devices outside
322 * of the context of a controller interface, where necessary.
324 * The operating system should determine which driver to load (or inform of
325 * the new device) based on the cdi_bus_data struct passed. How the operating
326 * system decides which driver to load/inform is not defined by CDI. An example
327 * would be a simple list generated from a script which parses each driver in
328 * the source tree, finds relevant cdi_bus_data structs, and adds them to a
329 * list which maps the structs to a string. The OS can then use that string to
330 * load a driver somehow.
332 * Whilst CDI could provide a pre-defined list of mappings for operating
333 * systems to use when implementing cdi_provide_device, it was decided that
334 * this would make the interface too rigid. Whilst this method requires a
335 * little more effort from the CDI implementor, it also allows operating
336 * systems to load non-CDI drivers (eg, from a native driver interface) as
337 * defined by the OS-specific mapping list. This would be impossible if CDI
338 * rigidly enforced a specific method.
340 * Operating systems may also choose to implement cdi_provide_device and then
341 * use it when iterating over the PCI bus in order to load drivers dynamically
342 * (effectively treating coldplug devices as hotplugged before boot).
344 * @return 0 on success or -1 if an error was encountered.
347 int cdi_provide_device(struct cdi_bus_data
* device
);