8 #define debprintf(a...)
9 // #define debprintf(a...) fprintf(stderr, ## a)
13 #include "cdb/isdn_cdb.h"
14 #include "cdb/cdb_hwdb.h"
16 static int CDBISDN_vendor_cnt
;
17 static int CDBISDN_card_cnt
;
18 static int CDBISDN_vario_cnt
;
19 static int CDBISDN_name_size
;
20 static char *CDBISDN_names
;
22 static cdb_isdn_vendor
*cdb_isdnvendor_info
;
23 static cdb_isdn_card
*cdb_isdncard_info
;
24 static int *cdb_isdncard_idsorted
;
25 static cdb_isdn_vario
*cdb_isdnvario_info
;
26 static int cdb_dbversion
;
27 static char cdb_date
[32];
29 static char line
[1024];
31 static int CDBISDN_readhwdb
;
38 int rectyp
, l
, cnt
= 0, icnt
= 0;
40 cdb
= fopen(CDBISDN_HWDB_FILE
, "rb");
42 debprintf("open failure %s\n", CDBISDN_HWDB_FILE
);
46 s
= fgets(line
, 1024, cdb
);
49 if (!s
[0] || s
[0] == '!' || s
[0] == '#' || s
[0] == '\n')
52 debprintf("got wrong line %s\n", s
);
55 sscanf(s
, "$%d", &rectyp
);
57 case IWHREC_TYPE_VERSION
:
58 sscanf(s
+ 4, "%d", &cdb_dbversion
);
60 case IWHREC_TYPE_DATE
:
67 strncpy(cdb_date
, s
+ 4, l
);
70 case IWHREC_TYPE_NAME_SIZE
:
71 sscanf(s
+ 4, "%d", &CDBISDN_name_size
);
72 CDBISDN_names
= calloc(CDBISDN_name_size
+ 1, 1);
74 debprintf("fail to allocate %d bytes for CDBISDN_names\n", CDBISDN_name_size
);
81 case IWHREC_TYPE_NAME_DATA
:
86 if (icnt
> CDBISDN_name_size
) {
87 debprintf("name_size overflow %d/%d\n", icnt
, CDBISDN_name_size
);
95 case IWHREC_TYPE_NAME_COUNT
:
96 sscanf(s
+ 4, "%d", &l
);
100 case IWHREC_TYPE_VENDOR_COUNT
:
101 sscanf(s
+ 4, "%d", &CDBISDN_vendor_cnt
);
102 cdb_isdnvendor_info
= calloc(CDBISDN_vendor_cnt
, sizeof(cdb_isdn_vendor
));
103 if (!cdb_isdnvendor_info
) {
104 debprintf("fail to allocate %d vendor structs\n", CDBISDN_vendor_cnt
);
109 case IWHREC_TYPE_VENDOR_RECORD
:
110 if (cnt
>= CDBISDN_vendor_cnt
) {
111 debprintf("vendor overflow %d/%d\n", cnt
, CDBISDN_vendor_cnt
);
114 l
= sscanf(s
+ 4, "%p %p %d %d",
115 &cdb_isdnvendor_info
[cnt
].name
,
116 &cdb_isdnvendor_info
[cnt
].shortname
,
117 &cdb_isdnvendor_info
[cnt
].vnr
,
118 &cdb_isdnvendor_info
[cnt
].refcnt
);
120 debprintf("error reading vendor record %s\n", s
);
123 cdb_isdnvendor_info
[cnt
].name
= CDBISDN_names
+ (u_long
)cdb_isdnvendor_info
[cnt
].name
;
124 cdb_isdnvendor_info
[cnt
].shortname
= CDBISDN_names
+ (u_long
)cdb_isdnvendor_info
[cnt
].shortname
;
127 case IWHREC_TYPE_CARD_COUNT
:
128 sscanf(s
+ 4, "%d", &CDBISDN_card_cnt
);
129 cdb_isdncard_info
= calloc(CDBISDN_card_cnt
+ 1, sizeof(cdb_isdn_card
));
130 cdb_isdncard_idsorted
= calloc(CDBISDN_card_cnt
, sizeof(int));
131 if (!cdb_isdncard_info
|| !cdb_isdncard_idsorted
) {
132 debprintf("fail to allocate %d vendor structs\n", CDBISDN_card_cnt
);
138 case IWHREC_TYPE_CARD_RECORD
:
139 if (cnt
> CDBISDN_card_cnt
) {
140 debprintf("card overflow %d/%d\n", cnt
, CDBISDN_card_cnt
);
143 l
= sscanf(s
+ 4, "%d %d %p %p %p %p %d %d %d %d %d %d %d %d %d",
144 &cdb_isdncard_info
[cnt
].handle
, /* internal identifier idx in database */
145 &cdb_isdncard_info
[cnt
].vhandle
, /* internal identifier to vendor database */
146 &cdb_isdncard_info
[cnt
].name
, /* cardname */
147 &cdb_isdncard_info
[cnt
].lname
, /* vendor short name + cardname */
148 &cdb_isdncard_info
[cnt
].Class
, /* CLASS of the card */
149 &cdb_isdncard_info
[cnt
].bus
, /* bus type */
150 &cdb_isdncard_info
[cnt
].revision
, /* revision used with USB */
151 &cdb_isdncard_info
[cnt
].vendor
, /* Vendor ID for ISAPNP and PCI cards */
152 &cdb_isdncard_info
[cnt
].device
, /* Device ID for ISAPNP and PCI cards */
153 &cdb_isdncard_info
[cnt
].subvendor
, /* Subvendor ID for PCI cards */
154 &cdb_isdncard_info
[cnt
].subdevice
, /* Subdevice ID for PCI cards */
155 &cdb_isdncard_info
[cnt
].features
, /* feature flags */
156 &cdb_isdncard_info
[cnt
].line_cnt
, /* count of ISDN ports */
157 &cdb_isdncard_info
[cnt
].vario_cnt
, /* count of driver varios */
158 &cdb_isdncard_info
[cnt
].vario
); /* referenz to driver vario record */
160 debprintf("error reading card record %s\n", s
);
163 cdb_isdncard_info
[cnt
].name
= CDBISDN_names
+ (u_long
)cdb_isdncard_info
[cnt
].name
;
164 cdb_isdncard_info
[cnt
].lname
= CDBISDN_names
+ (u_long
)cdb_isdncard_info
[cnt
].lname
;
165 cdb_isdncard_info
[cnt
].Class
= CDBISDN_names
+ (u_long
)cdb_isdncard_info
[cnt
].Class
;
166 cdb_isdncard_info
[cnt
].bus
= CDBISDN_names
+ (u_long
)cdb_isdncard_info
[cnt
].bus
;
169 case IWHREC_TYPE_CARD_IDSORTED
:
170 if (icnt
>= CDBISDN_card_cnt
) {
171 debprintf("card overflow %d/%d\n", icnt
, CDBISDN_card_cnt
);
174 sscanf(s
+ 4, "%d", &cdb_isdncard_idsorted
[icnt
]);
177 case IWHREC_TYPE_VARIO_COUNT
:
178 sscanf(s
+ 4, "%d", &CDBISDN_vario_cnt
);
179 cdb_isdnvario_info
= calloc(CDBISDN_vario_cnt
+1, sizeof(cdb_isdn_vario
));
180 if (!cdb_isdnvario_info
) {
181 debprintf("fail to allocate %d vario structs\n", CDBISDN_vario_cnt
);
186 case IWHREC_TYPE_VARIO_RECORD
:
187 if (cnt
> CDBISDN_vario_cnt
) {
188 debprintf("vario overflow %d/%d\n", cnt
, CDBISDN_vario_cnt
);
191 l
= sscanf(s
+ 4, "%d %d %d %d %d %d %p %p %p %p %p %p %p %p %p %p %p %p %p %p %d %p",
192 &cdb_isdnvario_info
[cnt
].handle
, /* idx in database */
193 &cdb_isdnvario_info
[cnt
].next_vario
, /* link to alternate vario */
194 &cdb_isdnvario_info
[cnt
].drvid
, /* unique id of the driver vario */
195 &cdb_isdnvario_info
[cnt
].typ
, /* Type to identify the driver */
196 &cdb_isdnvario_info
[cnt
].subtyp
, /* Subtype of the driver type */
197 &cdb_isdnvario_info
[cnt
].smp
, /* SMP supported ? */
198 &cdb_isdnvario_info
[cnt
].mod_name
, /* name of the driver module */
199 &cdb_isdnvario_info
[cnt
].para_str
, /* optional parameter string */
200 &cdb_isdnvario_info
[cnt
].mod_preload
, /* optional modules to preload */
201 &cdb_isdnvario_info
[cnt
].cfg_prog
, /* optional cfg prog */
202 &cdb_isdnvario_info
[cnt
].firmware
, /* optional firmware to load */
203 &cdb_isdnvario_info
[cnt
].description
, /* optional description */
204 &cdb_isdnvario_info
[cnt
].need_pkg
, /* list of packages needed for function */
205 &cdb_isdnvario_info
[cnt
].info
, /* optional additional info */
206 &cdb_isdnvario_info
[cnt
].protocol
, /* supported D-channel protocols */
207 &cdb_isdnvario_info
[cnt
].interface
, /* supported API interfaces */
208 &cdb_isdnvario_info
[cnt
].io
, /* possible IO ports with legacy ISA cards */
209 &cdb_isdnvario_info
[cnt
].irq
, /* possible interrupts with legacy ISA cards */
210 &cdb_isdnvario_info
[cnt
].membase
, /* possible membase with legacy ISA cards */
211 &cdb_isdnvario_info
[cnt
].features
, /* optional features*/
212 &cdb_isdnvario_info
[cnt
].card_ref
, /* reference to a card */
213 &cdb_isdnvario_info
[cnt
].name
); /* driver name */
215 debprintf("error reading vario record %s\n", s
);
218 cdb_isdnvario_info
[cnt
].mod_name
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].mod_name
;
219 cdb_isdnvario_info
[cnt
].para_str
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].para_str
;
220 cdb_isdnvario_info
[cnt
].mod_preload
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].mod_preload
;
221 cdb_isdnvario_info
[cnt
].cfg_prog
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].cfg_prog
;
222 cdb_isdnvario_info
[cnt
].firmware
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].firmware
;
223 cdb_isdnvario_info
[cnt
].description
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].description
;
224 cdb_isdnvario_info
[cnt
].need_pkg
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].need_pkg
;
225 cdb_isdnvario_info
[cnt
].info
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].info
;
226 cdb_isdnvario_info
[cnt
].protocol
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].protocol
;
227 cdb_isdnvario_info
[cnt
].interface
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].interface
;
228 cdb_isdnvario_info
[cnt
].io
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].io
;
229 cdb_isdnvario_info
[cnt
].irq
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].irq
;
230 cdb_isdnvario_info
[cnt
].membase
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].membase
;
231 cdb_isdnvario_info
[cnt
].features
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].features
;
232 cdb_isdnvario_info
[cnt
].name
= CDBISDN_names
+ (u_long
)cdb_isdnvario_info
[cnt
].name
;
236 debprintf("got wrong RecType %d\n", rectyp
);
241 if (CDBISDN_name_size
== 0 ||
242 CDBISDN_vendor_cnt
== 0 ||
243 CDBISDN_card_cnt
== 0 ||
244 CDBISDN_vario_cnt
== 0)
246 debprintf("successfull reading %s\n", CDBISDN_HWDB_FILE
);
247 CDBISDN_readhwdb
= 1;
252 debprintf("error reading %s\n", CDBISDN_HWDB_FILE
);
253 CDBISDN_vendor_cnt
= (sizeof(cdb_isdnvendor_info_init
) / sizeof(cdb_isdn_vendor
));
254 CDBISDN_card_cnt
= ((sizeof(cdb_isdncard_info_init
) / sizeof(cdb_isdn_card
)) -1);
255 CDBISDN_vario_cnt
= ((sizeof(cdb_isdnvario_info_init
) / sizeof(cdb_isdn_vario
))-1);
256 cdb_isdnvendor_info
= cdb_isdnvendor_info_init
;
257 cdb_isdncard_info
= cdb_isdncard_info_init
;
258 cdb_isdncard_idsorted
= cdb_isdncard_idsorted_init
;
259 cdb_isdnvario_info
= cdb_isdnvario_info_init
;
260 cdb_dbversion
= CDBISDN_DBVERSION
;
261 strncpy(cdb_date
, CDBISDN_DATE
, 31);
262 CDBISDN_readhwdb
= 1;
266 typedef int (*fcmp
) (const void *, const void *);
268 static int compare_type(cdb_isdn_vario
*v1
, cdb_isdn_vario
*v2
) {
269 int x
= v1
->typ
- v2
->typ
;
272 x
=v1
->subtyp
- v2
->subtyp
;
276 static int compare_id(const int *c1
, const int *c2
) {
277 int x
= cdb_isdncard_info
[*c1
].vendor
- cdb_isdncard_info
[*c2
].vendor
;
280 x
=cdb_isdncard_info
[*c1
].device
- cdb_isdncard_info
[*c2
].device
;
282 x
=cdb_isdncard_info
[*c1
].subvendor
- cdb_isdncard_info
[*c2
].subvendor
;
284 x
=cdb_isdncard_info
[*c1
].subdevice
- cdb_isdncard_info
[*c2
].subdevice
;
290 cdb_isdn_vendor
*hd_cdbisdn_get_vendor(int handle
)
292 if (!CDBISDN_readhwdb
)
296 if ((unsigned)handle
>= CDBISDN_vendor_cnt
)
298 return(&cdb_isdnvendor_info
[handle
]);
301 cdb_isdn_card
*hd_cdbisdn_get_card(int handle
)
303 if (!CDBISDN_readhwdb
)
307 if ((unsigned) handle
>CDBISDN_card_cnt
)
309 return(&cdb_isdncard_info
[handle
]);
312 cdb_isdn_vario
*hd_cdbisdn_get_vario_from_type(int typ
, int subtyp
)
314 cdb_isdn_vario key
, *ret
;
316 if (!CDBISDN_readhwdb
)
317 CDBISDN_readhwdb
= init_cdbisdn();
320 if (!(ret
=bsearch(&key
, &cdb_isdnvario_info
[1], CDBISDN_vario_cnt
, sizeof(cdb_isdn_vario
), (fcmp
)compare_type
))) {
321 debprintf("ret NULL\n");
327 cdb_isdn_card
*hd_cdbisdn_get_card_from_type(int typ
, int subtyp
)
331 if (!CDBISDN_readhwdb
)
333 civ
= hd_cdbisdn_get_vario_from_type(typ
, subtyp
);
335 if (civ
->card_ref
> 0)
336 return(&cdb_isdncard_info
[civ
->card_ref
]);
341 cdb_isdn_card
*hd_cdbisdn_get_card_from_id(int vendor
, int device
, int subvendor
, int subdevice
)
345 if (!CDBISDN_readhwdb
)
348 cdb_isdncard_info
[key
].vendor
= vendor
;
349 cdb_isdncard_info
[key
].device
= device
;
350 cdb_isdncard_info
[key
].subvendor
= subvendor
;
351 cdb_isdncard_info
[key
].subdevice
= subdevice
;
352 if (!(ret
=bsearch(&key
, cdb_isdncard_idsorted
, CDBISDN_card_cnt
, sizeof(int), (fcmp
)compare_id
))) {
353 debprintf("bs1 ret NULL\n");
355 cdb_isdncard_info
[key
].subvendor
= PCI_ANY_ID
;
356 cdb_isdncard_info
[key
].subdevice
= PCI_ANY_ID
;
357 if (!(ret
=bsearch(&key
, cdb_isdncard_idsorted
, CDBISDN_card_cnt
, sizeof(int), (fcmp
)compare_id
))) {
358 debprintf("bs2 ret NULL\n");
362 debprintf("ret idx %d\n", *ret
);
365 if ((unsigned) *ret
> CDBISDN_card_cnt
)
367 return(&cdb_isdncard_info
[*ret
]);
370 cdb_isdn_vario
*hd_cdbisdn_get_vario(int handle
)
372 if (!CDBISDN_readhwdb
)
376 if ((unsigned) handle
> CDBISDN_vario_cnt
)
378 return(&cdb_isdnvario_info
[handle
]);
381 int hd_cdbisdn_get_version(void)
383 if (!CDBISDN_readhwdb
)
385 return(CDBISDN_VERSION
);
388 int hd_cdbisdn_get_db_version(void)
390 if (!CDBISDN_readhwdb
)
392 return(cdb_dbversion
);
395 char *hd_cdbisdn_get_db_date(void)
397 if (!CDBISDN_readhwdb
)