- smbios parsing improved
[opensuse:hwinfo.git] / src / hd / hd.h
1 #ifndef _HD_H
2 #define _HD_H
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8
9 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10  *
11  *                      libhd data structures
12  *
13  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
14  */
15
16 #define HD_VERSION      8
17
18 /*
19  * debug flags
20  */
21 #define HD_DEB_SHOW_LOG         (1 <<  0)
22 #define HD_DEB_PROGRESS         (1 <<  1)
23 #define HD_DEB_CREATION         (1 <<  2)
24 #define HD_DEB_DRIVER_INFO      (1 <<  3)
25 #define HD_DEB_PCI              (1 <<  4)
26 #define HD_DEB_ISAPNP           (1 <<  5)
27 #define HD_DEB_CDROM            (1 <<  6)
28 #define HD_DEB_NET              (1 <<  7)
29 #define HD_DEB_FLOPPY           (1 <<  8)
30 #define HD_DEB_MISC             (1 <<  9)
31 #define HD_DEB_SERIAL           (1 << 10)
32 #define HD_DEB_MONITOR          (1 << 11)
33 #define HD_DEB_CPU              (1 << 12)
34 #define HD_DEB_BIOS             (1 << 13)
35 #define HD_DEB_MOUSE            (1 << 14)
36 #define HD_DEB_IDE              (1 << 15)
37 #define HD_DEB_SCSI             (1 << 16)
38 #define HD_DEB_USB              (1 << 17)
39 #define HD_DEB_ADB              (1 << 18)
40 #define HD_DEB_MODEM            (1 << 19)
41 #define HD_DEB_PARALLEL         (1 << 20)
42 #define HD_DEB_ISA              (1 << 21)
43 #define HD_DEB_BOOT             (1 << 22)
44 #define HD_DEB_HDDB             (1 << 23)
45
46 #include <stdio.h>
47 #include <inttypes.h>
48 #include <termios.h>
49
50 /*
51  * libhd's directory
52  */
53 #define HARDWARE_DIR            "/var/lib/hardware"
54 #define HARDWARE_UNIQUE_KEYS    HARDWARE_DIR "/unique-keys"
55
56 /**
57  * \defgroup idmacros Id macros
58  * Macros to handle device and vendor ids.
59  *
60  * Example: to check if an id is a pci id and get its value,
61  * do something like this:
62  * \code
63  * if(ID_TAG(hd->dev) == TAG_PCI) {
64  *   pci_id = ID_VALUE(hd->dev)
65  * }
66  * \endcode
67  *@{
68  */
69
70 #define TAG_PCI         1       /**< PCI ids. */
71 #define TAG_EISA        2       /**< EISA ids (monitors, ISA-PnP, modems, mice etc). */
72 #define TAG_USB         3       /**< USB ids. */
73 #define TAG_SPECIAL     4       /**< Internally used ids. */
74 #define TAG_PCMCIA      5       /**< PCMCIA ids. */
75
76 /**
77  * Get the real id value.
78  */
79 #define ID_VALUE(id)            ((id) & 0xffff)
80
81 /**
82  * Get the tag value.
83  */
84 #define ID_TAG(id)              (((id) >> 16) & 0xf)
85
86 /**
87  * Combine tag and id value.
88  */
89 #define MAKE_ID(tag, id_val)    ((tag << 16) | (id_val))
90
91 /*@}*/
92
93 /*
94  * flags to control the probing.
95  */
96 typedef enum probe_feature {
97   pr_memory = 1, pr_pci, pr_pci_range, pr_pci_ext, pr_isapnp, pr_cdrom,
98   pr_cdrom_info, pr_net, pr_floppy, pr_misc, pr_misc_serial, pr_misc_par,
99   pr_misc_floppy, pr_serial, pr_cpu, pr_bios, pr_monitor, pr_mouse, pr_ide,
100   pr_scsi, pr_scsi_geo, pr_scsi_cache, pr_usb, pr_usb_mods, pr_adb,
101   pr_modem, pr_modem_usb, pr_parallel, pr_parallel_lp, pr_parallel_zip,
102   pr_isa, pr_isa_isdn, pr_dac960, pr_smart, pr_isdn, pr_kbd, pr_prom,
103   pr_sbus, pr_int, pr_braille, pr_braille_alva, pr_braille_fhp,
104   pr_braille_ht, pr_ignx11, pr_sys, pr_dasd, pr_i2o, pr_cciss, pr_bios_vbe,
105   pr_isapnp_old, pr_isapnp_new, pr_isapnp_mod, pr_braille_baum, pr_manual,
106   pr_fb, pr_bios_vbe2, pr_veth, pr_partition, pr_disk, pr_ataraid, pr_pppoe,
107   pr_scan, pr_partition_add, pr_pcmcia, pr_fork, pr_parallel_imm, pr_s390,
108   /* pr_bios_32, */ pr_cpuemu,
109   pr_max, pr_lxrc, pr_default, pr_all           /* pr_all must be last */
110 } hd_probe_feature_t;
111
112 /*
113  * list types for hd_list()
114  *
115  * if you want to modify this: cf. manual.c::hw_items[]
116  *
117  * Note: hw_tv _must_ be < hw_display!
118  */
119 typedef enum hw_item {
120   hw_sys = 1, hw_cpu, hw_keyboard, hw_braille, hw_mouse, hw_joystick,
121   hw_printer, hw_scanner, hw_chipcard, hw_monitor, hw_tv, hw_display,
122   hw_framebuffer, hw_camera, hw_sound, hw_storage_ctrl, hw_network_ctrl,
123   hw_isdn, hw_modem, hw_network, hw_disk, hw_partition, hw_cdrom, hw_floppy,
124   hw_manual, hw_usb_ctrl, hw_usb, hw_bios, hw_pci, hw_isapnp, hw_bridge,
125   hw_hub, hw_scsi, hw_ide, hw_memory, hw_dvb, hw_pcmcia, hw_pcmcia_ctrl,
126   hw_ieee1394, hw_ieee1394_ctrl, hw_hotplug, hw_hotplug_ctrl, hw_zip, hw_pppoe,
127   hw_wlan,      /* append new entries here */
128   hw_unknown, hw_all                                    /* hw_all must be last */
129 } hd_hw_item_t;
130
131 /*
132  * device base classes and bus types
133  *
134  */
135
136 /* base class values (superset of PCI classes) */
137 typedef enum base_classes {
138   /* these *must* match standard PCI class numbers */
139   bc_none, bc_storage, bc_network, bc_display, bc_multimedia,
140   bc_memory, bc_bridge, bc_comm, bc_system, bc_input, bc_docking,
141   bc_processor, bc_serial, bc_wireless, bc_i2o, bc_other = 0xff,
142
143   // add our own classes here (starting at 0x100 as PCI values are 8 bit)
144   bc_monitor = 0x100, bc_internal, bc_modem, bc_isdn, bc_ps2, bc_mouse,
145   bc_storage_device, bc_network_interface, bc_keyboard, bc_printer,
146   bc_hub, bc_braille, bc_scanner, bc_joystick, bc_chipcard, bc_camera,
147   bc_framebuffer, bc_dvb, bc_tv, bc_partition
148 } hd_base_classes_t;
149
150 /* subclass values of bc_monitor */
151 typedef enum sc_monitor {
152   sc_mon_other, sc_mon_crt, sc_mon_lcd
153 } hd_sc_monitor_t;
154
155 /* subclass values of bc_storage */
156 typedef enum sc_storage {
157   sc_sto_scsi, sc_sto_ide, sc_sto_floppy, sc_sto_ipi, sc_sto_raid,
158   sc_sto_other = 0x80
159 } hd_sc_storage_t;
160
161 /* subclass values of bc_display */
162 typedef enum sc_display {
163   sc_dis_vga, sc_dis_xga, sc_dis_other = 0x80
164 } hd_sc_display_t;
165
166 /* subclass values of bc_framebuffer */
167 typedef enum sc_framebuffer {
168   sc_fb_vesa = 1
169 } hd_sc_framebuffer_t;
170
171 /* subclass values of bc_bridge */
172 typedef enum sc_bridge { 
173   sc_bridge_host, sc_bridge_isa, sc_bridge_eisa, sc_bridge_mc,
174   sc_bridge_pci, sc_bridge_pcmcia, sc_bridge_nubus, sc_bridge_cardbus,
175   sc_bridge_other = 0x80
176 } hd_sc_bridge_t;
177
178 /* subclass values of bc_comm */
179 typedef enum sc_comm { 
180   sc_com_ser, sc_com_par, sc_com_multi, sc_com_modem, sc_com_other = 0x80
181 } hd_sc_comm_t;
182
183 /* subclass values of bc_system */
184 typedef enum sc_system {
185   sc_sys_pic, sc_sys_dma, sc_sys_timer, sc_sys_rtc, sc_sys_other = 0x80
186 } hd_sc_system_t;
187
188 /* subclass values of bc_input */
189 typedef enum sc_input {
190   sc_inp_keyb, sc_inp_digit, sc_inp_mouse, sc_inp_other = 0x80
191 } hd_sc_input_t;
192
193 /* subclass values of bc_serial */
194 typedef enum sc_serial {
195   sc_ser_fire, sc_ser_access, sc_ser_ssa, sc_ser_usb, sc_ser_fiber,
196   sc_ser_smbus, sc_ser_other = 0x80
197 } hd_sc_serial_t;
198
199 /* internal sub class values (bc_internal) */
200 typedef enum sc_internal {
201   sc_int_none, sc_int_isapnp_if, sc_int_main_mem, sc_int_cpu, sc_int_fpu,
202   sc_int_bios, sc_int_prom, sc_int_sys
203 } hd_sc_internal_t;
204
205 /* subclass values of bc_mouse */
206 typedef enum sc_mouse {
207   sc_mou_ps2, sc_mou_ser, sc_mou_bus, sc_mou_usb, sc_mou_sun,
208   sc_mou_other = 0x80
209 } hd_sc_mouse_t;
210
211 /* subclass values of bc_storage_device */
212 typedef enum sc_std {
213   sc_sdev_disk, sc_sdev_tape, sc_sdev_cdrom, sc_sdev_floppy, sc_sdev_scanner,
214   sc_sdev_dasd, sc_sdev_other = 0x80
215 } hd_sc_std_t;
216
217 /* subclass values of bc_network_interface */
218 typedef enum sc_net_if {
219   sc_nif_loopback, sc_nif_ethernet, sc_nif_tokenring, sc_nif_fddi,
220   sc_nif_ctc, sc_nif_iucv, sc_nif_hsi, sc_nif_qeth,
221   sc_nif_escon, sc_nif_myrinet, sc_nif_wlan, sc_nif_other = 0x80, sc_nif_sit
222 } hd_sc_net_if_t;
223
224 /* subclass values of bc_multimedia */
225 typedef enum sc_multimedia {
226   sc_multi_video, sc_multi_audio, sc_multi_other
227 } hd_sc_multimedia_t;
228
229 /* subclass values of bc_keyboard */
230 typedef enum sc_keyboard {
231   sc_keyboard_kbd, sc_keyboard_console
232 } hd_sc_keyboard_t;
233
234 /* subclass values of bc_hub */
235 typedef enum sc_hub {
236   sc_hub_other, sc_hub_usb
237 } hd_sc_hub_t;
238
239 /* subclass values of bc_camera */
240 typedef enum sc_camera {
241   sc_camera_webcam, sc_camera_digital
242 } hd_sc_camera_t;
243
244 /* subclass values of bc_modem */
245 typedef enum sc_modem {
246   sc_mod_at, sc_mod_win1, sc_mod_win2, sc_mod_win3
247 } hd_sc_modem_t;
248
249 /* prog_if's of sc_ser_usb */
250 typedef enum pif_usb_e {
251   pif_usb_uhci = 0, pif_usb_ohci = 0x10, pif_usb_ehci = 0x20,
252   pif_usb_other = 0x80, pif_usb_device = 0xfe
253 } hd_pif_usb_t;
254
255 /* CD-ROM  prog_if values */
256 typedef enum pif_cdrom {
257   pif_cdrom, pif_cdr, pif_cdrw, pif_dvd, pif_dvdr, pif_dvdram
258 } hd_pif_cdrom_t ;
259
260 /* bus type values similar to PCI bridge subclasses */
261 typedef enum bus_types {
262   bus_none, bus_isa, bus_eisa, bus_mc, bus_pci, bus_pcmcia, bus_nubus,
263   bus_cardbus, bus_other,
264
265   /* outside the range of the PCI values */
266   bus_ps2 = 0x80, bus_serial, bus_parallel, bus_floppy, bus_scsi, bus_ide, bus_usb,
267   bus_adb, bus_raid, bus_sbus, bus_i2o, bus_vio
268 } hd_bus_types_t;
269
270 /**
271  * Hardware status.
272  * The status is stored in /var/lib/hardware/unique-keys/ and used
273  * to detect if the hardware is new and has to be configured by some
274  * hardware %config tool.
275  */
276 typedef struct {
277   /**
278    * Status fields are invalid.
279    */
280   unsigned invalid:1;
281   /**
282    * Hardware should be reconfigured.
283    * Either \ref hd_status_t::status_yes or \ref hd_status_t::status_no.
284    * A hardware must be reconfigured if it is in state
285    * \ref hd_status_t::available == \ref hd_status_t::status_no and
286    * \ref hd_status_t::needed == \ref hd_status_t::status_yes.
287    * In other words, if a hardware that was
288    * needed to run the system is gone.
289    */
290   unsigned reconfig:3;
291
292   /**
293    * Hardware %config status.
294    * Set to \ref hd_status_t::status_yes if the hardware has been configured, otherwise
295    * \ref hd_status_t::status_no.
296    */
297   unsigned configured:3;
298
299   /**
300    * Hardware availability.
301    * Set to \ref hd_status_t::status_yes if the hardware has been detected or
302    * \ref hd_status_t::status_no if the hardware has not been found. You can set
303    * it to \ref hd_status_t::status_unknown to indicate that this hardware cannot
304    * be automatically detected (say, ISA cards).
305    * \note You can simulate all kinds of hardware on your system by
306    * creating entries in /var/lib/hardware/unique-keys/ that have
307    * \ref hd_status_t::available set to \ref hd_status_t::status_unknown.
308    */
309   unsigned available:3;
310
311   /**
312    * Hardware is needed.
313    * Set to \ref hd_status_t::status_yes if this hardware is really necessary to run
314    * your computer. The effect will be that some hardware %config dialog
315    * is run if the hardware item is not found.
316    * Typical examples are graphics cards and mice.
317    */
318   unsigned needed:3;
319
320   /**
321    * (Internal) original value of \ref available;
322    * This is used to keep track of the original value of the \ref hd_status_t::available
323    * state as it was stored in /var/lib/hardware/unique-keys/. (\ref hd_status_t::available
324    * is automatically updated during the detection process.)
325    */
326   unsigned available_orig:3;
327
328   /**
329    * Hardware is active.
330    */
331   unsigned active:3;
332 } hd_status_t;
333
334 /* hardware config status values */
335 typedef enum {
336   status_no = 1, status_yes, status_unknown, status_new
337 } hd_status_value_t;
338
339 /**
340  * Various types of hotplug devices.
341  */
342 typedef enum {
343   hp_none,      /**< Not a hotpluggable %device. */
344   hp_pcmcia,    /**< PCMCIA %device. */
345   hp_cardbus,   /**< Cardbus %device. */
346   hp_pci,       /**< PCI hotplug %device. */
347   hp_usb,       /**< USB %device. */
348   hp_ieee1394   /**< IEEE 1394 (FireWire) %device */
349 } hd_hotplug_t;
350
351
352 /**
353  * Holds id/name pairs.
354  * Used for bus, class, vendor, %device and such.
355  */
356 typedef struct {
357   unsigned id;          /**< Numeric id. */
358   char *name;           /**< Name (if any) that corresponds to \ref hd_id_t::id. */
359 } hd_id_t;
360
361 /**
362  * String list type.
363  * Used whenever we create a list of strings (e.g. file read).
364  */
365 typedef struct s_str_list_t {
366   struct s_str_list_t *next;    /**< Link to next member. */
367   char *str;                    /**< Some string data. */
368 } str_list_t;
369
370
371 /*
372  * for memory areas
373  */
374 typedef struct {
375   unsigned start, size;         /* base address & size */
376   unsigned char *data;          /* actual data */
377 } memory_range_t;
378
379
380 /*
381  * smp info according to Intel smp spec (ia32)
382  */
383 typedef struct {
384   unsigned ok:1;                /* data are valid */
385   unsigned rev;                 /* MP spec revision */
386   unsigned mpfp;                /* MP Floating Pointer struct */
387   unsigned mpconfig_ok:1;       /* MP config table valid */
388   unsigned mpconfig;            /* MP config table */
389   unsigned mpconfig_size;       /* dto, size */
390   unsigned char feature[5];     /* MP feature info */
391   char oem_id[9];               /* oem id */
392   char prod_id[13];             /* product id */
393   unsigned cpus, cpus_en;       /* number of cpus & ennabled cpus */
394 } smp_info_t;
395
396
397 /*
398  * vesa bios extensions info
399  */
400 typedef struct vbe_mode_info_s {
401   unsigned number;              /* mode number */
402   unsigned attributes;          /* mode attributes */
403   unsigned width, height;       /* mode size */
404   unsigned bytes_p_line;        /* line length */
405   unsigned pixel_size;          /* bits per pixel */
406   unsigned fb_start;            /* frame buffer start address (if any) */
407   unsigned win_A_start;         /* window A start address */
408   unsigned win_A_attr;          /* window A attributes */
409   unsigned win_B_start;         /* window B start address */
410   unsigned win_B_attr;          /* window B attributes */
411   unsigned win_size;            /* window size in bytes */
412   unsigned win_gran;            /* window granularity in bytes */
413   unsigned pixel_clock;         /* maximum pixel clock */
414 } vbe_mode_info_t;
415
416
417 typedef struct {
418   unsigned ok:1;                /* data are valid */
419   unsigned version;             /* vbe version */
420   unsigned oem_version;         /* oem version info */
421   unsigned memory;              /* in bytes */
422   unsigned fb_start;            /* != 0 if framebuffer is supported */
423   char *oem_name;               /* oem name */
424   char *vendor_name;            /* vendor name */
425   char *product_name;           /* product name */
426   char *product_revision;       /* product revision */
427   unsigned modes;               /* number of supported video modes */
428   vbe_mode_info_t *mode;        /* video mode list */
429   unsigned current_mode;        /* current video mode */
430   unsigned char ddc[0x80];      /* ddc monitor info */
431 } vbe_info_t;
432
433
434 /*
435  * Compaq Controller Order EV (CQHORD) definition
436  */
437 typedef struct {
438     unsigned id;
439     unsigned char slot;
440     unsigned char bus;
441     unsigned char devfn;
442     unsigned char misc;
443 } cpq_ctlorder_t; 
444
445
446 typedef struct {
447   unsigned ok:1;                /* data are valid */
448   unsigned entry;               /* entry point */
449   unsigned compaq:1;            /* is compaq system */
450   cpq_ctlorder_t cpq_ctrl[32];  /* 32 == MAX_CONTROLLERS */
451 } bios32_info_t;
452
453
454 /*
455  * smbios entries
456  */
457 typedef enum {
458   sm_biosinfo, sm_sysinfo, sm_boardinfo, sm_chassis,
459   sm_processor, sm_memctrl, sm_memmodule, sm_cache,
460   sm_connect, sm_slot, sm_onboard, sm_oem,
461   sm_config, sm_lang, sm_group, sm_eventlog,
462   sm_memarray, sm_memdevice, sm_memerror, sm_memarraymap,
463   sm_memdevicemap, sm_mouse, sm_battery, sm_reset,
464   sm_secure, sm_power, sm_voltage, sm_cool,
465   sm_temperature, sm_current, sm_outofband, sm_bis,
466   sm_boot, sm_memerror64, sm_mandev, sm_mandevcomp,
467   sm_mdtd, sm_inactive = 126, sm_end = 127
468 } hd_smbios_type_t;
469
470 typedef struct {
471   union u_hd_smbios_t *next;
472   hd_smbios_type_t type;        /* BIOS info type */
473   int data_len;                 /* formatted section length */
474   unsigned char *data;          /* formatted section */
475   str_list_t *strings;          /* strings taken from the unformed section */
476   int handle;                   /* handle, unique 16 bit number */
477 } smbios_any_t;
478
479 /* BIOS related information */
480 typedef struct {
481   union u_hd_smbios_t *next;
482   hd_smbios_type_t type;
483   int data_len;
484   unsigned char *data;
485   str_list_t *strings;
486   int handle;
487   char *vendor;                 /* BIOS vendor name */
488   char *version;                /* BIOS version (free form!) */
489   char *date;                   /* BIOS date mm/dd/yyyy (old: yy) */
490   uint64_t features;            /* BIOS characteristics (bitmask) */
491   unsigned xfeatures;           /* BIOS characteristics extension (bitmask) */
492   str_list_t *feature_str;      /* the above two, interpreted */
493   unsigned start;               /* BIOS start address */
494   unsigned rom_size;            /* BIOS ROM size (in bytes) */
495 } smbios_biosinfo_t;
496
497 /* overall system related information */
498 typedef struct {
499   union u_hd_smbios_t *next;
500   hd_smbios_type_t type;
501   int data_len;
502   unsigned char *data;
503   str_list_t *strings;
504   int handle;
505   char *manuf;                  /* manufacturer */
506   char *product;                /* product name */
507   char *version;                /* version */
508   char *serial;                 /* serial number */
509   unsigned char uuid[16];       /* universal unique id; all 0x00: undef, all 0xff: undef but settable */
510   hd_id_t wake_up;              /* wake-up type */
511 } smbios_sysinfo_t;
512
513 /* motherboard related information */
514 typedef struct {
515   union u_hd_smbios_t *next;
516   hd_smbios_type_t type;
517   int data_len;
518   unsigned char *data;
519   str_list_t *strings;
520   int handle;
521   char *manuf;
522   char *product;
523   char *version;
524   char *serial;
525 } smbios_boardinfo_t;
526
527 typedef struct {
528   union u_hd_smbios_t *next;
529   hd_smbios_type_t type;
530   int data_len;
531   unsigned char *data;
532   str_list_t *strings;
533   int handle;
534   char *manuf;
535   unsigned ch_type;
536 } smbios_chassis_t;
537
538 typedef struct {
539   union u_hd_smbios_t *next;
540   hd_smbios_type_t type;
541   int data_len;
542   unsigned char *data;
543   str_list_t *strings;
544   int handle;
545   char *socket;
546   char *manuf;
547   char *version;
548   unsigned voltage;             /* in 0.1 V */
549   unsigned ext_clock;           /* MHz */
550   unsigned max_speed;           /* MHz */
551   unsigned current_speed;       /* MHz */
552   unsigned status;
553   unsigned upgrade;
554 } smbios_processor_t;
555
556 typedef struct {
557   union u_hd_smbios_t *next;
558   hd_smbios_type_t type;
559   int data_len;
560   unsigned char *data;
561   str_list_t *strings;
562   int handle;
563   char *descr[8];
564   unsigned dtype[8];
565 } smbios_onboard_t;
566
567 typedef struct {
568   union u_hd_smbios_t *next;
569   hd_smbios_type_t type;
570   int data_len;
571   unsigned char *data;
572   str_list_t *strings;
573   int handle;
574   char *current;
575 } smbios_lang_t;
576
577 typedef struct {
578   union u_hd_smbios_t *next;
579   hd_smbios_type_t type;
580   int data_len;
581   unsigned char *data;
582   str_list_t *strings;
583   int handle;
584   unsigned ecc;
585   unsigned max_size;            /* kB */
586 } smbios_memarray_t;
587
588 typedef struct {
589   union u_hd_smbios_t *next;
590   hd_smbios_type_t type;
591   int data_len;
592   unsigned char *data;
593   str_list_t *strings;
594   int handle;
595   char *location;
596   char *bank;
597   unsigned width;
598   unsigned eccbits;
599   unsigned size;                /* kB */
600   unsigned form;
601   unsigned type1;
602   unsigned type2;
603   unsigned speed;
604 } smbios_memdevice_t;
605
606 typedef struct {
607   union u_hd_smbios_t *next;
608   hd_smbios_type_t type;
609   int data_len;
610   unsigned char *data;
611   str_list_t *strings;
612   int handle;
613   unsigned mtype;
614   unsigned interface;
615   unsigned buttons;
616 } smbios_mouse_t;
617
618 typedef union u_hd_smbios_t {
619   union u_hd_smbios_t *next;  
620   smbios_any_t any;
621   smbios_biosinfo_t biosinfo;
622   smbios_sysinfo_t sysinfo;
623   smbios_boardinfo_t boardinfo;
624   smbios_chassis_t chassis;
625   smbios_processor_t processor;
626   smbios_lang_t lang;
627   smbios_memarray_t memarray;
628   smbios_memdevice_t memdevice;
629   smbios_mouse_t mouse;
630   smbios_onboard_t onboard;
631 } hd_smbios_t;
632
633
634 /*
635  * structure holding the (raw) PCI data
636  */
637 typedef struct s_pci_t {
638   struct s_pci_t *next;                         /* linked list */
639   unsigned data_len;                            /* the actual length of the data field */
640   unsigned data_ext_len;                        /* max. accessed config byte; see code */
641   unsigned char data[256];                      /* the PCI data */
642   char *log;                                    /* log messages */
643   unsigned flags,                               /* various info, see enum pci_flags */
644            cmd,                                 /* PCI_COMMAND */
645            hdr_type,                            /* PCI_HEADER_TYPE */
646            secondary_bus;                       /* > 0 for PCI & CB bridges */
647   unsigned bus,                                 /* PCI bus #, *nothing* to do with hw_t.bus */
648            slot, func;                          /* slot & function */
649   unsigned base_class, sub_class, prog_if;      /* PCI device classes */
650   unsigned dev, vend, sub_dev, sub_vend, rev;   /* vendor & device ids */
651   unsigned irq;                                 /* used irq, if any */
652   uint64_t base_addr[6];                        /* I/O or memory base */
653   uint64_t base_len[6];                         /* I/O or memory ranges */
654   uint64_t rom_base_addr;                       /* memory base for card ROM */
655   uint64_t rom_base_len;                        /* memory range for card ROM */
656 } pci_t;
657
658 /*
659  * pci related flags cf. (pci_t).flags
660  */
661 typedef enum pci_flags {
662   pci_flag_ok, pci_flag_pm, pci_flag_agp
663 } hd_pci_flags_t;
664
665
666 /*
667  * raw USB data
668  */
669 typedef struct usb_s {
670   struct usb_s *next;
671   unsigned hd_idx;
672   unsigned hd_base_idx;
673   /* see Linux USB docs */
674   str_list_t *c, *d, *e, *i, *p, *s, *t;
675   struct usb_s *cloned;
676   int bus, dev_nr, lev, parent, port, count, conns, used_conns, ifdescr;
677   unsigned speed;
678   unsigned vendor, device, rev;
679   char *manufact, *product, *serial;
680   char *driver;
681   memory_range_t raw_descr;
682   int d_cls, d_sub, d_prot;
683   int i_alt, i_cls, i_sub, i_prot;
684   unsigned country;
685 } usb_t;
686
687 /*
688  *structures to hold the (raw) ISA-PnP data
689  */
690 typedef struct {
691   int len;
692   int type;
693   unsigned char *data;
694 } isapnp_res_t;
695
696 typedef struct {
697   int csn;
698   int log_devs;
699   unsigned char *serial;
700   unsigned char *card_regs;
701   unsigned char (*ldev_regs)[0xd0];
702   int res_len;
703   unsigned broken:1;            /* mark a broken card */
704   isapnp_res_t *res;
705 } isapnp_card_t;
706
707 typedef struct {
708   int read_port;
709   int cards;
710   isapnp_card_t *card;
711 } isapnp_t;
712
713 typedef struct {
714   isapnp_card_t *card;
715   int dev;
716   unsigned flags;                               /* cf. enum isapnp_flags */
717   unsigned ref:1;                               /* internally used flag */
718 } isapnp_dev_t;
719
720 /*
721  * ISA-PnP related flags; cf. (isapnp_dev_t).flags
722  */
723 typedef enum isapnp_flags {
724   isapnp_flag_act
725 } hd_isapnp_flags_t;
726
727
728 /*
729  * raw SCSI data
730  */
731 typedef struct scsi_s {
732   struct scsi_s *next;
733   unsigned deleted:1;
734   unsigned generic:1;
735   unsigned fake:1;
736   char *dev_name;
737   char *guessed_dev_name;
738   int generic_dev;
739   unsigned host, channel, id, lun;
740   char *vendor, *model, *rev, *type_str, *serial;
741   int type;
742   unsigned inode_low;
743   char *proc_dir, *driver;
744   unsigned unique;
745   char *info;
746   unsigned lgeo_c, lgeo_h, lgeo_s;
747   unsigned pgeo_c, pgeo_h, pgeo_s;
748   uint64_t size;
749   unsigned sec_size;
750   unsigned cache;
751   str_list_t *host_info;
752   char *usb_guid;
753   unsigned pci_info;
754   unsigned pci_bus;
755   unsigned pci_slot;
756   unsigned pci_func;
757 } scsi_t;
758
759
760 /*
761  * PROM tree on PPC
762  */
763 typedef struct devtree_s {
764   struct devtree_s *next;
765   struct devtree_s *parent;
766   unsigned idx;
767   char *path, *filename;
768   unsigned pci:1;
769   char *name, *model, *device_type, *compatible;
770   int class_code;                       /* class : sub_class : prog-if */
771   int vendor_id, device_id, subvendor_id, subdevice_id;
772   int revision_id, interrupt;
773   unsigned char *edid;                  /* 128 bytes */
774 } devtree_t;
775
776 /*
777  * Device/CU model numbers for S/390
778  */
779 typedef struct ccw_s {
780   unsigned char cu_model;
781   unsigned char dev_model;
782 } ccw_t;
783
784 /*
785  * special CDROM entry
786  */
787 typedef struct cdrom_info_s {
788   struct cdrom_info_s *next;
789   char *name;
790   unsigned speed;
791   unsigned cdr:1, cdrw:1, dvd:1, dvdr:1, dvdram:1;
792   unsigned cdrom:1;             /* cdrom in drive */
793   struct {
794     unsigned ok:1;
795     char *volume, *publisher, *preparer, *application, *creation_date;
796   } iso9660;
797   struct {
798     unsigned ok:1;
799     unsigned platform;
800     char *id_string;
801     unsigned bootable:1;
802     unsigned media_type;        /* boot emulation type */
803     unsigned load_address;
804     unsigned load_count;        /* sectors to load */
805     unsigned start;             /* start sector */
806     unsigned catalog;           /* boot catalog start */
807     struct {
808       unsigned c, h, s;
809       unsigned size;
810     } geo;
811     char *label;
812   } el_torito;
813
814 } cdrom_info_t;
815
816 // note: obsolete, will be removed
817 typedef struct {
818   unsigned char block0[512];
819 } floppy_info_t;
820
821 /*
822  * bios data (ix86)
823  */
824 typedef struct {
825   unsigned apm_supported:1;
826   unsigned apm_enabled:1;
827   unsigned apm_ver, apm_subver;
828   unsigned apm_bios_flags;
829
830   unsigned vbe_ver;
831   unsigned vbe_video_mem;
832
833   unsigned ser_port0, ser_port1, ser_port2, ser_port3;
834   unsigned par_port0, par_port1, par_port2;
835
836   /* The id is still in big endian format! */
837   unsigned is_pnp_bios:1;
838   unsigned pnp_id;
839   unsigned lba_support:1;
840
841   unsigned low_mem_size;
842   smp_info_t smp;
843   vbe_info_t vbe;
844
845   unsigned smbios_ver;
846
847   struct {
848     unsigned width;
849     unsigned height;
850     char *vendor;
851     char *name;
852   } lcd;
853
854   struct {
855     char *vendor;
856     char *type;
857     unsigned bus;
858     unsigned compat_vend;
859     unsigned compat_dev;
860   } mouse;
861
862   struct {
863     unsigned ok:1;
864     unsigned scroll_lock:1;
865     unsigned num_lock:1;
866     unsigned caps_lock:1;
867   } led;
868
869   bios32_info_t bios32;
870
871 } bios_info_t;
872
873
874 /*
875  * prom data (ppc, sparc)
876  */
877 typedef struct {
878   unsigned has_color:1;
879   unsigned color;
880 } prom_info_t;
881
882
883 /*
884  * general system data
885  */
886 typedef struct {
887   char *system_type;
888   char *generation;
889   char *vendor;
890   char *model;
891   char *serial;
892   char *lang;
893 } sys_info_t;
894
895
896 /*
897  * monitor (DDC) data
898  */
899 typedef struct {
900   unsigned manu_year;
901   unsigned min_vsync, max_vsync;        /* vsync range */
902   unsigned min_hsync, max_hsync;        /* hsync range */
903   char *vendor;
904   char *name;
905   char *serial;
906 } monitor_info_t;
907
908
909 typedef enum cpu_arch {
910   arch_unknown = 0,
911   arch_intel,
912   arch_alpha,
913   arch_sparc, arch_sparc64,
914   arch_ppc, arch_ppc64,
915   arch_68k,
916   arch_ia64,
917   arch_s390, arch_s390x,
918   arch_arm,
919   arch_mips,
920   arch_x86_64
921 } hd_cpu_arch_t;
922
923 // ###### drop boot_arch at all?
924 typedef enum boot_arch {
925   boot_unknown = 0,
926   boot_lilo, boot_milo, boot_aboot, boot_silo, boot_ppc, boot_elilo, boot_s390,
927   boot_mips, boot_grub
928 } hd_boot_arch_t;
929
930 /* special cpu entry */
931 typedef struct {
932   enum cpu_arch architecture;
933   unsigned family;              /* axp: cpu variation */
934   unsigned model;               /* axp: cpu revision */
935   unsigned stepping;
936   unsigned cache;
937   unsigned clock;
938   unsigned units;               /* >1 "hyperthreading" */
939   char *vend_name;              /* axp: system type */
940   char *model_name;             /* axp: cpu model */
941   char *platform;               /* x86: NULL */
942   str_list_t *features;         /* x86: flags */
943 } cpu_info_t;
944
945
946 /*
947  * database info
948  */
949 typedef struct {
950   unsigned data_len, data_max;
951   unsigned *data;
952   unsigned names_len, names_max;
953   char *names;
954 } hddb_data_t;
955
956 typedef uint32_t hddb_entry_mask_t;
957
958 typedef struct hddb_list_s {   
959   hddb_entry_mask_t key_mask;
960   hddb_entry_mask_t value_mask;
961   unsigned key;
962   unsigned value;
963 } hddb_list_t;
964
965 typedef struct {
966   unsigned list_len, list_max;
967   hddb_list_t *list;
968   unsigned ids_len, ids_max;
969   unsigned *ids;
970   unsigned strings_len, strings_max;
971   char *strings;
972 } hddb2_data_t;
973
974 /*
975  * pci module info
976  */
977 typedef struct {
978   char *module;
979   unsigned vendor;
980   unsigned device;
981   unsigned subvendor;
982   unsigned subdevice;
983   unsigned pciclass;
984   unsigned classmask;
985 } hddb_pci_t;
986
987
988 /*
989  * resource types
990  */
991 typedef enum resource_types {
992   res_any, res_phys_mem, res_mem, res_io, res_irq, res_dma, res_monitor,
993   res_size, res_disk_geo, res_cache, res_baud, res_init_strings, res_pppd_option,
994   res_framebuffer
995 } hd_resource_types_t;
996
997
998 /*
999  * size units (cf. (res_size_t).unit)
1000  */
1001 typedef enum size_units {
1002   size_unit_cm, size_unit_cinch, size_unit_byte, size_unit_sectors,
1003   size_unit_kbyte, size_unit_mbyte, size_unit_gbyte
1004 } hd_size_units_t;
1005
1006 /*
1007  * access types for I/O and memory resources
1008  */
1009 typedef enum access_flags {
1010   acc_unknown, acc_ro, acc_wo, acc_rw           /* unknown, read only, write only, read/write */
1011 } hd_access_flags_t;
1012
1013 typedef enum yes_no_flag {
1014   flag_unknown, flag_no, flag_yes               /* unknown, no, yes */
1015 } hd_yes_no_flag_t;
1016
1017
1018 /*
1019  * definitions for the various resource types
1020  */
1021 typedef struct {
1022   union u_hd_res_t *next;
1023   enum resource_types type;
1024 } res_any_t;
1025
1026 typedef struct {
1027   union u_hd_res_t *next;
1028   enum resource_types type;
1029   uint64_t base, range;
1030   unsigned
1031     enabled:1,                          /* 0: disabled, 1 enabled */
1032     access:2,                           /* enum access_flags */
1033     prefetch:2;                         /* enum yes_no_flag */
1034 } res_mem_t;
1035
1036 typedef struct {
1037   union u_hd_res_t *next;
1038   enum resource_types type;
1039   uint64_t range;
1040 } res_phys_mem_t;
1041
1042 typedef struct {
1043   union u_hd_res_t *next;
1044   enum resource_types type;
1045   uint64_t base, range;
1046   unsigned
1047     enabled:1,                          /* 0: disabled, 1 enabled */
1048     access:2;                           /* enum access_flags */
1049 } res_io_t;
1050
1051 typedef struct {
1052   union u_hd_res_t *next;
1053   enum resource_types type;
1054   unsigned base;
1055   unsigned triggered;                   /* # of interrupts */
1056   unsigned enabled:1;                   /* 0: disabled, 1 enabled */
1057 } res_irq_t;
1058
1059 typedef struct {
1060   union u_hd_res_t *next;
1061   enum resource_types type;
1062   unsigned base;
1063   unsigned enabled:1;                   /* 0: disabled, 1 enabled */
1064 } res_dma_t;
1065
1066 typedef struct {
1067   union u_hd_res_t *next;
1068   enum resource_types type;
1069   enum size_units unit;
1070   uint64_t val1, val2;                  /* to allow for 2D values */
1071 } res_size_t;
1072
1073 typedef struct {
1074   union u_hd_res_t *next;
1075   enum resource_types type;
1076   unsigned speed;
1077   unsigned bits, stopbits;
1078   char parity;                          /* n, e, o, s, m */
1079   char handshake;                       /* -, h, s */
1080 } res_baud_t;
1081
1082 typedef struct {
1083   union u_hd_res_t *next;
1084   enum resource_types type;
1085   unsigned size;                        /* in kbyte */
1086 } res_cache_t;
1087
1088 typedef struct {
1089   union u_hd_res_t *next;
1090   enum resource_types type;
1091   unsigned cyls, heads, sectors;
1092   unsigned logical:1;                   /* logical/physical geometry */
1093 } res_disk_geo_t;
1094
1095 typedef struct {
1096   union u_hd_res_t *next;
1097   enum resource_types type;
1098   unsigned width, height;               /* in pixel */
1099   unsigned vfreq;                       /* in Hz */
1100   unsigned interlaced:1;                /* 0/1 */
1101 } res_monitor_t;
1102
1103 typedef struct {
1104   union u_hd_res_t *next;
1105   enum resource_types type;
1106   char *init1;
1107   char *init2;
1108 } res_init_strings_t;
1109
1110 typedef struct {
1111   union u_hd_res_t *next;
1112   enum resource_types type;
1113   char *option;
1114 } res_pppd_option_t;
1115
1116 typedef struct {
1117   union u_hd_res_t *next;
1118   enum resource_types type;
1119   unsigned width, height;               /* in pixel */
1120   unsigned bytes_p_line;                /* line length in bytes (do not confuse with 'width') */
1121   unsigned colorbits;                   /* 4, 8, 15, 16, 24, 32 */
1122   unsigned mode;                        /* mode number for kernel */
1123 } res_framebuffer_t;
1124
1125 typedef union u_hd_res_t {
1126   union u_hd_res_t *next;  
1127   res_any_t any;
1128   res_io_t io;
1129   res_mem_t mem;
1130   res_phys_mem_t phys_mem;
1131   res_irq_t irq;
1132   res_dma_t dma;
1133   res_size_t size;
1134   res_cache_t cache;
1135   res_baud_t baud;
1136   res_disk_geo_t disk_geo;
1137   res_monitor_t monitor;
1138   res_init_strings_t init_strings;
1139   res_pppd_option_t pppd_option;
1140   res_framebuffer_t framebuffer;
1141 } hd_res_t;
1142
1143
1144 /*
1145  * data gathered by the misc module; basically resources from /proc
1146  */
1147 typedef struct {
1148   uint64_t addr, size;
1149   char *dev;
1150   unsigned tag;
1151 } misc_io_t;
1152
1153 typedef struct {
1154   unsigned channel;
1155   char *dev;
1156   unsigned tag;
1157 } misc_dma_t;
1158
1159 typedef struct {
1160   unsigned irq, events;
1161   int devs;
1162   char **dev;
1163   unsigned tag;
1164 } misc_irq_t;
1165
1166 typedef struct {
1167   unsigned io_len, dma_len, irq_len;
1168   misc_io_t *io;
1169   misc_dma_t *dma;
1170   misc_irq_t *irq;
1171   str_list_t *proc_io, *proc_dma, *proc_irq;
1172 } misc_t;
1173
1174 typedef struct s_serial_t {
1175   struct s_serial_t *next;
1176   char *name;
1177   char *device;
1178   unsigned line, port, irq, baud;
1179 } serial_t;
1180
1181 typedef struct s_ser_device_t {
1182   struct s_ser_device_t *next;
1183   unsigned hd_idx;
1184   char *dev_name;
1185   str_list_t *at_resp;
1186   int fd;
1187   struct termios tio;
1188   unsigned max_baud, cur_baud;
1189   unsigned is_mouse:1;
1190   unsigned is_modem:1;
1191   unsigned do_io:1;
1192   unsigned char buf[0x1000];
1193   int buf_len;
1194   int garbage, non_pnp, pnp;
1195   unsigned char pnp_id[8];
1196   char *serial, *class_name, *dev_id, *user_name, *vend, *init_string1, *init_string2, *pppd_option;
1197   unsigned pnp_rev;
1198   unsigned bits;
1199 } ser_device_t;
1200
1201 /*
1202  * Notes on isdn_parm_t:
1203  *   - def_value is only relevant of alt_values != 0
1204  *   - def_value should be a value out of alt_value[]
1205  *   - see libihw docu for the meaning of name,type,flags,def_value
1206  */
1207 typedef struct isdn_parm_s {
1208   struct isdn_parm_s *next;
1209   char *name;                           /* parameter name */
1210   unsigned valid:1;                     /* 1: entry is valid, 0: some inconsistencies */
1211   unsigned conflict:1;                  /* 1: ressource conflict (eg. no free irq) */
1212   uint64_t value;                       /* value of the parameter */
1213   unsigned type;                        /* CDBISDN type (P_...) */
1214   unsigned flags;                       /* CDBISDN flags (P_...) */
1215   unsigned def_value;                   /* default value */
1216   int alt_values;                       /* length of alt_value[] */
1217   unsigned *alt_value;                  /* possible values */
1218 } isdn_parm_t;
1219
1220 /* device driver info types */
1221 typedef enum driver_info_type {
1222   di_any, di_display, di_module, di_mouse, di_x11, di_isdn, di_kbd
1223 } hd_driver_info_t;
1224
1225 /* unspecific info */
1226 typedef struct {
1227   union driver_info_u *next;
1228   enum driver_info_type type;           /* driver info type */
1229   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1230 } driver_info_any_t;
1231
1232 /* display (monitor) info */
1233 typedef struct {
1234   union driver_info_u *next;
1235   enum driver_info_type type;           /* driver info type */
1236   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1237   unsigned width, height;               /* max. useful display geometry */
1238   unsigned min_vsync, max_vsync;        /* vsync range */
1239   unsigned min_hsync, max_hsync;        /* hsync range */
1240   unsigned bandwidth;                   /* max. pixel clock */
1241 } driver_info_display_t;
1242
1243 /* module info */
1244 typedef struct {
1245   union driver_info_u *next;
1246   enum driver_info_type type;           /* driver info type */
1247   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1248   unsigned active:1;                    /* if module is currently active */
1249   unsigned modprobe:1;                  /* modprobe or insmod  */
1250   str_list_t *names;                    /* (ordered) list of module names */
1251   str_list_t *mod_args;                 /* list of module args (corresponds to the module name list) */
1252   char *conf;                           /* conf.modules entry, if any (e.g. for sb.o) */
1253 } driver_info_module_t;
1254
1255 /* mouse protocol info */
1256 typedef struct {
1257   union driver_info_u *next;
1258   enum driver_info_type type;           /* driver info type */
1259   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1260   char *xf86;                           /* the XF86 protocol name */
1261   char *gpm;                            /* dto, gpm */
1262   int buttons;                          /* number of buttons, -1 --> unknown */
1263   int wheels;                           /* dto, wheels */
1264 } driver_info_mouse_t;
1265
1266 /* X11 server info */
1267 typedef struct {
1268   union driver_info_u *next;
1269   enum driver_info_type type;           /* driver info type */
1270   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1271   char *server;                         /* the server/module name */
1272   char *xf86_ver;                       /* XFree86 version (3 or 4) */
1273   unsigned x3d:1;                       /* has 3D support */
1274   struct {
1275     unsigned all:5;                     /* the next 5 entries combined */
1276     unsigned c8:1, c15:1, c16:1, c24:1, c32:1;
1277   } colors;                             /* supported color depths */
1278   unsigned dacspeed;                    /* max. ramdac clock */
1279   str_list_t *extensions;               /* additional X extensions to load ('Module' section) */
1280   str_list_t *options;                  /* special server options */
1281   str_list_t *raw;                      /* extra info to add to XF86Config */
1282   char *script;                         /* 3d script to run */
1283 } driver_info_x11_t;
1284
1285 /* isdn info */
1286 typedef struct {
1287   union driver_info_u *next;
1288   enum driver_info_type type;           /* driver info type */
1289   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1290   int i4l_type, i4l_subtype;            /* I4L types */
1291   char *i4l_name;                       /* I4L card name */
1292   isdn_parm_t *params;                  /* isdn parameters */
1293 } driver_info_isdn_t;
1294
1295 /* keyboard info */
1296 typedef struct {
1297   union driver_info_u *next;
1298   enum driver_info_type type;           /* driver info type */
1299   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1300   char *XkbRules;                       /* XF86Config entries */
1301   char *XkbModel;
1302   char *XkbLayout;
1303   char *keymap;                         /* console keymap */
1304 } driver_info_kbd_t;
1305
1306 /*
1307  * holds device driver info
1308  */
1309 typedef union driver_info_u {
1310   union driver_info_u *next;
1311   driver_info_any_t any;
1312   driver_info_module_t module;
1313   driver_info_mouse_t mouse;
1314   driver_info_x11_t x11;
1315   driver_info_display_t display;
1316   driver_info_isdn_t isdn;
1317   driver_info_kbd_t kbd;
1318 } driver_info_t;
1319
1320
1321 /*
1322  * Some hardware doesn't fit into the hd_t scheme or there is info we
1323  * gathered during the scan process but that no-one really cares about. Such
1324  * stuff is stored in hd_detail_t.
1325  */
1326 typedef enum hd_detail_type {
1327   hd_detail_pci, hd_detail_usb, hd_detail_isapnp, hd_detail_cdrom,
1328   hd_detail_floppy, hd_detail_bios, hd_detail_cpu, hd_detail_prom,
1329   hd_detail_monitor, hd_detail_sys, hd_detail_scsi, hd_detail_devtree,
1330   hd_detail_ccw
1331 } hd_detail_type_t;
1332
1333 typedef struct {
1334   enum hd_detail_type type;
1335   pci_t *data;
1336 } hd_detail_pci_t;
1337
1338 typedef struct {
1339   enum hd_detail_type type;
1340   usb_t *data;
1341 } hd_detail_usb_t;
1342
1343 typedef struct {
1344   enum hd_detail_type type;
1345   isapnp_dev_t *data;
1346 } hd_detail_isapnp_t;
1347
1348 typedef struct {
1349   enum hd_detail_type type;
1350   cdrom_info_t *data;
1351 } hd_detail_cdrom_t;
1352
1353 typedef struct {
1354   enum hd_detail_type type;
1355   floppy_info_t *data;
1356 } hd_detail_floppy_t;
1357
1358 typedef struct {
1359   enum hd_detail_type type;
1360   bios_info_t *data;
1361 } hd_detail_bios_t;
1362
1363 typedef struct {
1364   enum hd_detail_type type;
1365   cpu_info_t *data;
1366 } hd_detail_cpu_t;
1367
1368 typedef struct {
1369   enum hd_detail_type type;
1370   prom_info_t *data;
1371 } hd_detail_prom_t;
1372
1373 typedef struct {
1374   enum hd_detail_type type;
1375   monitor_info_t *data;
1376 } hd_detail_monitor_t;
1377
1378 typedef struct {
1379   enum hd_detail_type type;
1380   sys_info_t *data;
1381 } hd_detail_sys_t;
1382
1383 typedef struct {
1384   enum hd_detail_type type;
1385   scsi_t *data;
1386 } hd_detail_scsi_t;
1387
1388 typedef struct {
1389   enum hd_detail_type type;
1390   devtree_t *data;
1391 } hd_detail_devtree_t;
1392
1393 typedef struct {
1394   enum hd_detail_type type;
1395   ccw_t *data;
1396 } hd_detail_ccw_t;
1397
1398 typedef union {
1399   enum hd_detail_type type;
1400   hd_detail_pci_t pci;
1401   hd_detail_usb_t usb;
1402   hd_detail_isapnp_t isapnp;
1403   hd_detail_cdrom_t cdrom;
1404   hd_detail_floppy_t floppy;
1405   hd_detail_bios_t bios;
1406   hd_detail_cpu_t cpu;
1407   hd_detail_prom_t prom;
1408   hd_detail_monitor_t monitor;
1409   hd_detail_sys_t sys;
1410   hd_detail_scsi_t scsi;
1411   hd_detail_devtree_t devtree;
1412   hd_detail_ccw_t ccw;
1413 } hd_detail_t;
1414
1415
1416 /* info about manually configured hardware (in /var/lib/hardware/) */
1417 typedef struct hd_manual_s {
1418   struct hd_manual_s *next;
1419
1420   char *unique_id;
1421   char *parent_id;
1422   char *child_ids;
1423   unsigned hw_class;
1424   char *model;
1425
1426   hd_status_t status;
1427   char *config_string;
1428
1429   /* More or less free-form key, value pairs.
1430    * key should not contain '=', however.
1431    */
1432   str_list_t *key;
1433   str_list_t *value;
1434 } hd_manual_t;
1435
1436
1437 /**
1438  * Individual hardware item.
1439  * Every hardware component gets an \ref hd_t entry. A list of all hardware
1440  * items is in \ref hd_data_t::hd.
1441  */
1442 typedef struct s_hd_t {
1443   struct s_hd_t *next;          /**< Link to next hardware item. */
1444   /**
1445    * Unique index, starting at 1.
1446    * Use \ref hd_get_device_by_idx() to look up an hardware entry by index. And don't
1447    * free the result!
1448    */
1449   unsigned idx;
1450
1451   /**
1452    * Hardware appears to be broken in some way.
1453    * This was used to indicate broken framebuffer support of some graphics cards.
1454    * Currently unused.
1455    */
1456   unsigned broken:1;
1457
1458   /**
1459    * Bus type (id and name).
1460    */ 
1461   hd_id_t bus;
1462
1463   /**
1464    * Slot and bus number.
1465    * Bits 0-7: slot number, 8-31 bus number.
1466    */
1467   unsigned slot;
1468
1469   /**
1470    * (PCI) function.
1471    */
1472   unsigned func;
1473
1474   /**
1475    * Base class (id and name).
1476    */
1477   hd_id_t base_class;
1478
1479   /**
1480    * Sub class (id and name).
1481    */
1482   hd_id_t sub_class;
1483
1484   /**
1485    * (PCI) programming interface (id and name).
1486    */
1487   hd_id_t prog_if;
1488
1489   /**
1490    * Vendor id and name.
1491    * Id is actually a combination of some tag to differentiate the
1492    * various id types and the real id. Use the \ref ID_VALUE macro to
1493    * get e.g. the real PCI id value for a PCI %device.
1494    */
1495   hd_id_t vendor;
1496
1497   /**
1498    * Device id and name.
1499    * Id is actually a combination of some tag to differentiate the
1500    * various id types and the real id. Use the \ref ID_VALUE macro to
1501    * get e.g. the real PCI id value for a PCI %device.
1502    * \note If you're looking or something printable, you might want to use \ref hd_t::model
1503    * instead.
1504    */
1505   hd_id_t device;
1506
1507   /**
1508    * Subvendor id and name.
1509    * Id is actually a combination of some tag to differentiate the
1510    * various id types and the real id. Use the \ref ID_VALUE macro to
1511    * get e.g. the real PCI id value for a PCI %device.
1512    */
1513   hd_id_t sub_vendor;
1514
1515   /**
1516    * Subdevice id and name.
1517    * Id is actually a combination of some tag to differentiate the
1518    * various id types and the real id. Use the \ref ID_VALUE macro to
1519    * get e.g. the real PCI id value for a PCI %device.
1520    */
1521   hd_id_t sub_device;
1522
1523   /**
1524    * Revision id or string.
1525    * If revision is numerical (e.g. PCI) \ref hd_id_t::id is used.
1526    * If revision is some char data (e.g. disk drives) it is stored in \ref hd_id_t::name.
1527    */
1528   hd_id_t revision;
1529
1530   /**
1531    * Serial id.
1532    */
1533   char *serial;
1534
1535   /**
1536    * Vendor id and name of some compatible hardware.
1537    * Used mainly for ISA-PnP devices.
1538    */
1539   hd_id_t compat_vendor;
1540
1541   /**
1542    * Device id and name of some compatible hardware.
1543    * Used mainly for ISA-PnP devices.
1544    */
1545   hd_id_t compat_device;
1546
1547   /**
1548    * Hardware class.
1549    * Not to confuse with \ref base_class!
1550    */
1551   hd_hw_item_t hw_class;
1552
1553   /**
1554    * Hardware class list.
1555    * A device may belong to more than one hardware class.
1556    */
1557   unsigned char hw_class_list[(hw_all + 7) / 8];        /**< (Internal) bitmask of hw classes. */
1558
1559   /**
1560    * Model name.
1561    * This is a combination of vendor and %device names. Some heuristics is used
1562    * to make it more presentable. Use this instead of \ref hd_t::vendor and
1563    * \ref hd_t::device.
1564    */
1565   char *model;
1566
1567   /**
1568    * Device this hardware is attached to.
1569    * Link to some 'parent' %device. Use \ref hd_get_device_by_idx() to get
1570    * the corresponding hardware entry.
1571    */
1572   unsigned attached_to;
1573
1574   /**
1575    * Special %device file.
1576    * Device file name to acces this hardware. Normally something below /dev.
1577    * For network interfaces this is the interface name.
1578    */
1579   char *unix_dev_name;
1580
1581   /**
1582    * Special %device file.
1583    * Device file name to acces this hardware. Most hardware only has one
1584    * %device name stored in \ref hd_t::unix_dev_name. But in some cases
1585    * there's an alternative name.
1586    */
1587   char *unix_dev_name2;
1588
1589   /**
1590    * BIOS/PROM id.
1591    * Where appropriate, this is a special BIOS/PROM id (e.g. "0x80" for
1592    * the first harddisk on Intel-PCs).
1593    * CHPID for s390.
1594    */
1595   char *rom_id;
1596
1597   /**
1598    * Unique id for this hardware.
1599    * A unique string identifying this hardware. The string consists
1600    * of two parts separated by a dot ("."). The part before the dot
1601    * describes the location (where the hardware is attached in the system).
1602    * The part after the dot identifies the hardware itself. The string
1603    * must not contain slashes ("/") because we're going to create files
1604    * with this id as name. Apart from this there are no restrictions on
1605    * the form of this string.
1606    */
1607   char *unique_id;
1608
1609   /**
1610    * (Internal) Probing module that created this entry.
1611    */
1612   unsigned module;
1613
1614   /**
1615    * (Internal) Source code line where this entry was created.
1616    */
1617   unsigned line;
1618
1619   /**
1620    * (Internal) Counter, used in combination with \ref hd_t::module and \ref hd_t::line.
1621    */
1622   unsigned count;
1623
1624   /**
1625    * Device resources.
1626    */
1627   hd_res_t *res;
1628
1629   /**
1630    * Special info associated with this hardware.
1631    * \note This is going to change!
1632    */
1633   hd_detail_t *detail;
1634
1635   /**
1636    * (Internal) Unspecific text info.
1637    * It is used to track IDE interfaces and assign them to the correct
1638    * IDE controllers.
1639    */
1640   str_list_t *extra_info;
1641
1642   /**
1643    * Hardware status (if available).
1644    * The status is stored in files below /var/lib/hardware/unique-keys/. Every
1645    * hardware item gets a file there with its unique id as file name.
1646    */
1647   hd_status_t status;
1648
1649   /**
1650    * Some %config info.
1651    * Every hardware item may get some string assigned. This string is stored
1652    * in files below /var/lib/hardware/unique-keys/. There is no meaning
1653    * associated with this string.
1654    */
1655   char *config_string;
1656
1657   /**
1658    * Hotplug controller for this %device.
1659    * It indicates what kind of hotplug %device (if any) this is.
1660    */
1661   hd_hotplug_t hotplug;
1662
1663    /**
1664     * Slot the hotplug device is connected to (e.g. PCMCIA socket).
1665     * \note \ref hotplug_slot counts 1-based (0: no information available).
1666     */
1667   unsigned hotplug_slot;
1668
1669   struct is_s {
1670     unsigned agp:1;             /* AGP device */
1671     unsigned isapnp:1;          /* ISA-PnP device */
1672     unsigned notready:1;        /* block devices: no medium, other: device not configured */
1673     unsigned manual:1;          /* undetectable, manually configured hardware */
1674     unsigned softraiddisk:1;    /* disk belongs to some soft raid array */
1675     unsigned zip:1;             /* zip floppy */
1676     unsigned cdr:1;             /* CD-R */
1677     unsigned cdrw:1;            /* CD-RW */
1678     unsigned dvd:1;             /* DVD */
1679     unsigned dvdr:1;            /* DVD-R */
1680     unsigned dvdram:1;          /* DVD-RAM */
1681     unsigned pppoe:1;           /* PPPOE modem connected */
1682     unsigned wlan:1;            /* WLAN card */
1683   } is;
1684
1685   struct tag_s {                /* this struct is for internal purposes only */
1686     unsigned remove:1;          /* schedule for removal */
1687     unsigned freeit:1;          /* for internal memory management */
1688     unsigned fixed:1;           /* fixed, do no longer modify this entry */
1689     unsigned ser_skip:1;        /* if serial line, don't scan for devices */
1690     unsigned ser_device:2;      /* if != 0: info about attached serial device; see serial.c */
1691   } tag;
1692
1693   /**
1694    * (Internal) First 512 bytes of block devices.
1695    * To check accessibility of block devices we read the first block. The data
1696    * is used to identify the boot %device.
1697    */
1698   unsigned char *block0;
1699
1700   /**
1701    * Currently active driver.
1702    */
1703   char *driver;
1704
1705   /**
1706    * Old \ref unique_id for compatibility.
1707    * The calculation of unique ids has changed in libhd v3.17. Basically
1708    * we no longer use the vendor/%device names if there are vendor/%device
1709    * ids. (Otherwise a simple %device name database update would change the id,
1710    * which is really not what you want.)
1711    */
1712   char *old_unique_id;
1713
1714   /**
1715    * \ref unique_id of parent (\ref attached_to).
1716    * \note Please do not use it for now.
1717    * 
1718    */
1719   char *parent_id;
1720
1721   /**
1722    * \ref unique_ids of children (\ref parent_id).
1723    * \note Please do not use it for now.
1724    * 
1725    */
1726   str_list_t *child_ids;
1727
1728   /**
1729    * (Internal) location independent \ref unique_id part.
1730    * The speed up some internal searches, we store it here separately.
1731    */
1732   char *unique_id1;
1733
1734   /**
1735    * USB Global Unique Identifier.
1736    * Available for USB devices. This may even be set if \ref hd_t::bus is not
1737    * \ref bus_usb (e.g. USB storage devices will have \ref hd_t::bus set to
1738    * \ref bus_scsi due to SCSI emulation).
1739    */
1740   char *usb_guid;
1741
1742   driver_info_t *driver_info;   /* device driver info */
1743
1744   str_list_t *requires;         /* packages/programs required for this hardware */
1745
1746   /*
1747    * These are used internally for memory management.
1748    * Do not even _think_ of modifying these!
1749    */
1750   unsigned ref_cnt;             /**< (Internal) memory reference count. */
1751   struct s_hd_t *ref;           /**< (Internal) if set, this is only a reference. */
1752 } hd_t;
1753
1754
1755 /**
1756  * Holds all data accumulated during hardware probing.
1757  */
1758 typedef struct {
1759   /**
1760    * Current hardware list.
1761    * The list of all currently probed hardware. This is not identical with
1762    * the result of \ref hd_list(). (But a superset of it.)
1763    */
1764   hd_t *hd;
1765
1766   /**
1767    * A progress indicator.
1768    * If this callback function is not NULL, it is called at various points and can
1769    * be used to give some user feedback what we are actually doing.
1770    * If the debug flag HD_DEB_PROGRESS is set, progress messages are logged.
1771    * \param pos Indicates where we are.
1772    * \param msg Indicates what we are going to do.
1773    */
1774   void (*progress)(char *pos, char *msg);
1775   
1776   /** Log messages.
1777    * All messages logged during hardware probing accumulate here.
1778    */
1779   char *log;
1780
1781   /** Debug flags.
1782    * Although there exist some debug flag defines this scheme is currently
1783    * not followed consistently. It is guaranteed however that -1 will give
1784    * the most log messages and 0 the least.
1785    */
1786   unsigned debug;
1787
1788   /**
1789    * Special flags.
1790    * Influence hardware probing in some strange ways with these. You normally
1791    * do not want to use them.
1792    */
1793   struct flag_struct {
1794     unsigned internal:1;        /**< \ref hd_scan() has been called internally. */
1795     unsigned dformat:2;         /**< Alternative output format. */
1796     unsigned no_parport:1;      /**< Don't do parport probing: parport modules (used to) crash pmacs. */
1797     unsigned iseries:1;         /**< Set if we are on an iSeries machine. */
1798     unsigned list_all:1;        /**< Return even devices with status 'not available'. */
1799     unsigned fast:1;            /**< Don't check tricky hardware. */
1800     unsigned list_md:1;         /**< Report md & lvm devices from /proc/partitions */
1801     unsigned nofork:1;          /**< don't run potentially hanging code in a subprocess */
1802     unsigned forked:1;          /**< we're running in a subprocess */
1803     unsigned cpuemu:1;          /**< use CPU emulation to run BIOS code (i386 only) */
1804   } flags;
1805
1806
1807   /*
1808    * The following entries should *not* be accessed outside of libhd!
1809    */
1810
1811   unsigned char probe[(pr_all + 7) / 8];        /**< (Internal) bitmask of probing features. */
1812   unsigned char probe_set[(pr_all + 7) / 8];    /**< (Iternal) bitmask of probing features that will always be set. */
1813   unsigned char probe_clr[(pr_all + 7) / 8];    /**< (Internal) bitmask of probing features that will always be reset. */
1814   unsigned last_idx;            /**< (Internal) index of the last hd entry generated */
1815   unsigned module;              /**< (Internal) the current probing module we are in */
1816   enum boot_arch boot;          /**< (Internal) boot method */
1817   hd_t *old_hd;                 /**< (Internal) old (outdated) entries (if you scan more than once) */
1818   pci_t *pci;                   /**< (Internal) raw PCI data */
1819   isapnp_t *isapnp;             /**< (Internal) raw ISA-PnP data */
1820   cdrom_info_t *cdrom;          /**< (Internal) CDROM devs from PROC_CDROM_INFO */
1821   str_list_t *net;              /**< (Internal) list of network interfaces */
1822   str_list_t *floppy;           /**< (Internal) contents of PROC_NVRAM, used by the floppy module */
1823   misc_t *misc;                 /**< (Internal) data gathered in the misc module */
1824   serial_t *serial;             /**< (Internal) /proc's serial info */
1825   scsi_t *scsi;                 /**< (Internal) raw SCSI data */
1826   ser_device_t *ser_mouse;      /**< (Internal) info about serial mice */
1827   ser_device_t *ser_modem;      /**< (Internal) info about serial modems */
1828   str_list_t *cpu;              /**< (Internal) /proc/cpuinfo */
1829   str_list_t *klog;             /**< (Internal) kernel log */
1830   str_list_t *proc_usb;         /**< (Internal) /proc/bus/usb info */
1831   usb_t *usb;                   /**< (Internal) usb info */
1832   hddb_pci_t *hddb_pci;         /**< (Internal) pci module info */
1833   hddb2_data_t *hddb2[2];       /**< (Internal) hardware database */
1834   str_list_t *kmods;            /**< (Internal) list of active kernel modules */
1835   uint64_t used_irqs;           /**< (Internal) irq usage */
1836   uint64_t assigned_irqs;       /**< (Internal) irqs automatically assigned by libhd (for driver info) */
1837   memory_range_t bios_rom;      /**< (Internal) BIOS 0xc0000 - 0xfffff */
1838   memory_range_t bios_ram;      /**< (Internal) BIOS 0x00400 - 0x004ff */
1839   memory_range_t bios_ebda;     /**< (Internal) EBDA */
1840   unsigned display;             /**< (Internal) hd_idx of the active (vga) display */
1841   unsigned color_code;          /**< (Internal) color, if any */
1842   char *cmd_line;               /**< (Internal) kernel command line */
1843   str_list_t *xtra_hd;          /**< (Internal) fake hd entries (for testing) */
1844   devtree_t *devtree;           /**< (Internal) prom device tree on ppc */
1845   unsigned kernel_version;      /**< (Internal) kernel version */
1846   int in_vmware;                /**< (Internal) running in vmware */
1847   hd_manual_t *manual;          /**< (Internal) hardware config info */
1848   str_list_t *disks;            /**< (Internal) disks according to /proc/partitions */
1849   str_list_t *partitions;       /**< (Internal) dto, partitions */
1850   hd_smbios_t *smbios;          /**< (Internal) smbios data */
1851   struct {
1852     unsigned ok:1;
1853     unsigned size;
1854     unsigned used;
1855     void *data;
1856     int id;
1857     int updated;
1858   } shm;                        /**< (Internal) our shm segment */
1859   unsigned pci_config_type;     /**< (Internal) PCI config type (1 or 2), 0: unknown */
1860 } hd_data_t;
1861
1862
1863 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1864  *
1865  *                      libhd interface functions
1866  *
1867  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1868  */
1869
1870 /* implemented in hd.c */
1871
1872 /* the actual hardware scan */
1873 void hd_scan(hd_data_t *hd_data);
1874
1875 //! Free all data.
1876 hd_data_t *hd_free_hd_data(hd_data_t *hd_data);
1877
1878 //! Free hardware items returned by e.g. \ref hd_list().
1879 hd_t *hd_free_hd_list(hd_t *hd);
1880
1881 void hd_set_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
1882 void hd_clear_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
1883 int hd_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
1884 void hd_set_probe_feature_hw(hd_data_t *hd_data, hd_hw_item_t item);
1885
1886 enum probe_feature hd_probe_feature_by_name(char *name);
1887 char *hd_probe_feature_by_value(enum probe_feature feature);
1888
1889 int hd_module_is_active(hd_data_t *hd_data, char *mod);
1890
1891 hd_t *hd_base_class_list(hd_data_t *hd_data, unsigned base_class);
1892 hd_t *hd_sub_class_list(hd_data_t *hd_data, unsigned base_class, unsigned sub_class);
1893 hd_t *hd_bus_list(hd_data_t *hd_data, unsigned bus);
1894 hd_t *hd_list(hd_data_t *hd_data, hd_hw_item_t item, int rescan, hd_t *hd_old);
1895 hd_t *hd_list_with_status(hd_data_t *hd_data, hd_hw_item_t item, hd_status_t status);
1896 hd_t *hd_list2(hd_data_t *hd_data, hd_hw_item_t *items, int rescan);
1897 hd_t *hd_list_with_status2(hd_data_t *hd_data, hd_hw_item_t *items, hd_status_t status);
1898
1899 int hd_has_special_eide(hd_data_t *hd_data);
1900 int hd_has_pcmcia(hd_data_t *hd_data);
1901 int hd_apm_enabled(hd_data_t *hd_data);
1902 int hd_usb_support(hd_data_t *hd_data);
1903 int hd_smp_support(hd_data_t *hd_data);
1904 int hd_mac_color(hd_data_t *hd_data);
1905 int hd_color(hd_data_t *hd_data);
1906 unsigned hd_display_adapter(hd_data_t *hd_data);
1907 unsigned hd_boot_disk(hd_data_t *hd_data, int *matches);
1908 enum cpu_arch hd_cpu_arch(hd_data_t *hd_data);
1909 enum boot_arch hd_boot_arch(hd_data_t *hd_data);
1910
1911 hd_t *hd_get_device_by_idx(hd_data_t *hd_data, unsigned idx);
1912
1913 void hd_set_hw_class(hd_t *hd, hd_hw_item_t hw_class);
1914 int hd_is_hw_class(hd_t *hd, hd_hw_item_t hw_class);
1915
1916 /* implemented in hddb.c */
1917
1918 str_list_t *get_hddb_packages(hd_data_t *hd_data);
1919
1920 void hddb_dump_raw(hddb2_data_t *hddb, FILE *f);
1921 void hddb_dump(hddb2_data_t *hddb, FILE *f);
1922
1923 /* implemented in hdp.c */
1924
1925 void hd_dump_entry(hd_data_t *hd_data, hd_t *hd, FILE *f);
1926
1927
1928 /* implemented in cdrom.c */
1929
1930 cdrom_info_t *hd_read_cdrom_info(hd_data_t *hd_data, hd_t *hd);
1931
1932 /* implemented in manual.c */
1933 hd_manual_t *hd_manual_read_entry(hd_data_t *hd_data, const char *id);
1934 int hd_manual_write_entry(hd_data_t *hd_data, hd_manual_t *entry);
1935 hd_manual_t *hd_free_manual(hd_manual_t *manual);
1936 hd_t *hd_read_config(hd_data_t *hd_data, const char *id);
1937 int hd_write_config(hd_data_t *hd_data, hd_t *hd);
1938 char *hd_hw_item_name(hd_hw_item_t item);
1939 char *hd_status_value_name(hd_status_value_t status);
1940 int hd_change_status(const char *id, hd_status_t status, const char *config_string);
1941
1942
1943 /*
1944  * - - - - - CDB ISDN interface - - - - -
1945  */
1946
1947
1948 /* (C) 2003 kkeil@suse.de */
1949
1950 #define CDBISDN_VERSION 0x0100
1951
1952 #ifndef PCI_ANY_ID
1953 #define PCI_ANY_ID      0xffff
1954 #endif
1955
1956 #define CDBISDN_P_NONE  0x0
1957 #define CDBISDN_P_IRQ   0x1
1958 #define CDBISDN_P_MEM   0x2
1959 #define CDBISDN_P_IO    0x3
1960
1961 /* vendor info */
1962 typedef struct {
1963         char    *name;
1964         char    *shortname;
1965         int     vnr;
1966         int     refcnt;
1967 } cdb_isdn_vendor;
1968
1969 typedef struct  {
1970         int     handle;         /* internal identifier idx in database */
1971         int     vhandle;        /* internal identifier to vendor database */
1972         const char *name;       /* cardname */
1973         const char *lname;      /* vendor short name + cardname */
1974         const char *Class;      /* CLASS of the card */
1975         const char *bus;        /* bus type */
1976         int     revision;       /* revision used with USB */
1977         int     vendor;         /* Vendor ID for ISAPNP and PCI cards */
1978         int     device;         /* Device ID for ISAPNP and PCI cards */
1979         int     subvendor;      /* Subvendor ID for PCI cards */
1980                                 /* A value of 0xffff is ANY_ID */
1981         int     subdevice;      /* Subdevice ID for PCI cards */
1982                                 /* A value of 0xffff is ANY_ID */
1983         unsigned int features;  /* feature flags */
1984         int     line_cnt;       /* count of ISDN ports */
1985         int     vario_cnt;      /* count of driver varios */
1986         int     vario;          /* referenz to driver vario record */
1987 } cdb_isdn_card;
1988
1989 typedef struct  {
1990         int     handle;         /* idx in database */   
1991         int     next_vario;     /* link to alternate vario */
1992         int     drvid;          /* unique id of the driver vario */
1993         int     typ;            /* Type to identify the driver */
1994         int     subtyp;         /* Subtype of the driver type */
1995         int     smp;            /* SMP supported ? */
1996         const char *mod_name;   /* name of the driver module */
1997         const char *para_str;   /* optional parameter string */
1998         const char *mod_preload;/* optional modules to preload */
1999         const char *cfg_prog;   /* optional cfg prog */
2000         const char *firmware;   /* optional firmware to load */
2001         const char *description;/* optional description */
2002         const char *need_pkg;   /* list of packages needed for function */
2003         const char *info;       /* optional additional info */
2004         const char *protocol;   /* supported D-channel protocols */
2005         const char *interface;  /* supported API interfaces */
2006         const char *io;         /* possible IO ports with legacy ISA cards */
2007         const char *irq;        /* possible interrupts with legacy ISA cards */
2008         const char *membase;    /* possible membase with legacy ISA cards */
2009         const char *features;   /* optional features*/
2010         int card_ref;           /* reference to a card */
2011         const char *name;       /* driver name */
2012 } cdb_isdn_vario;
2013
2014
2015 extern cdb_isdn_vendor  *hd_cdbisdn_get_vendor(int);
2016 extern cdb_isdn_card    *hd_cdbisdn_get_card(int);
2017 extern cdb_isdn_vario   *hd_cdbisdn_get_vario_from_type(int, int);
2018 extern cdb_isdn_card    *hd_cdbisdn_get_card_from_type(int, int);
2019 extern cdb_isdn_card    *hd_cdbisdn_get_card_from_id(int, int, int, int);
2020 extern cdb_isdn_vario   *hd_cdbisdn_get_vario(int);
2021 extern int              hd_cdbisdn_get_version(void);
2022 extern int              hd_cdbisdn_get_db_version(void);
2023 extern char             *hd_cdbisdn_get_db_date(void);
2024
2025 /* CDB ISDN interface end */
2026
2027 #ifdef __cplusplus
2028 }
2029 #endif
2030
2031 #endif  /* _HD_H */