5 int max_vario
= MAXVARIO
;
8 int max_name_str_cnt
= MAXNAMECNT
;
9 int max_ivendor
= MAXCARDS
;
14 cdb_isdn_vario
*varios
;
15 cdb_isdn_vendor
*vendors
;
24 int not_supported
= 0;
26 static struct _vendorshortnames_t _vendorshortnames
[] = {
27 {"AVM Computersysteme Vertriebs GmbH","AVM"},
28 {"High Soft Tech","HST"},
29 {"Cologne Chip AG","CC"},
30 {"Telekom AG","DTAG"},
33 {"U.S.Robotics","USR"},
34 {"SGS Thomson Microelectronics","SGST"},
35 {"Abocom/Magitek","Abocom"},
39 static int compare_vendor(cdb_isdn_vendor
*v1
, cdb_isdn_vendor
*v2
) {
40 return(strcasecmp(v1
->name
, v2
->name
));
43 static int compare_card(cdb_isdn_card
*c1
, cdb_isdn_card
*c2
) {
44 return(strcasecmp(c1
->name
, c2
->name
));
47 int compare_name(const int *c1
, const int *c2
) {
48 return(strcasecmp(cards
[*c1
].name
,
52 static int compare_type(cdb_isdn_vario
*v1
, cdb_isdn_vario
*v2
) {
53 int x
= v1
->typ
- v2
->typ
;
56 x
=v1
->subtyp
- v2
->subtyp
;
60 static int compare_id(const int *c1
, const int *c2
) {
61 int x
= cards
[*c1
].vendor
- cards
[*c2
].vendor
;
64 x
= cards
[*c1
].device
-
67 x
= cards
[*c1
].subvendor
-
70 x
= cards
[*c1
].subdevice
-
75 static char *add_name(const char *str
, int merge
) {
87 if (p
>= (name_str
+ max_name_str_cnt
))
93 p
= name_str
+ name_str_cnt
;
96 if ((p
+ l
) >= (name_str
+ max_name_str_cnt
))
103 static char stmp
[4096],sstmp
[4096];
105 static char *add_lname(int v
, const char *str
) {
106 sprintf(stmp
, "%s %s", vendors
[v
].shortname
, str
);
107 return(add_name(stmp
, 1));
110 static char *add_name_list(const char *str
, const char *list
) {
111 if (!list
|| !list
[0])
112 return(add_name(str
, 1));
113 sprintf(stmp
, "%s,%s", list
, str
);
114 return(add_name(stmp
, 1));
117 static char *add_sortedname_list(const char *str
, const char *list
, const char *fmt
) {
120 if (!list
|| !list
[0])
121 return(add_name(str
, 1));
122 strncpy(stmp
, list
, 4096);
123 sscanf(str
, fmt
, &v
);
125 t
= strtok(stmp
, ",");
130 p
+= sprintf(p
, fmt
, v
);
133 p
+= sprintf(p
, fmt
, i
);
135 t
= strtok(NULL
, ",");
138 p
+= sprintf(p
, fmt
, v
);
142 return(add_name(sstmp
, 1));
145 static int add_vendor(char *v
, int card
) {
148 for(i
=0;i
< ivendor_idx
; i
++) {
149 if (!strcmp(v
, vendors
[i
].name
)) {
154 if (ivendor_idx
< max_ivendor
) {
156 while (_vendorshortnames
[i
].lname
) {
157 if (!strcmp(v
, _vendorshortnames
[i
].lname
)) {
160 } else if (!strcmp(v
, _vendorshortnames
[i
].sname
)) {
167 if (!(vendors
[ivendor_idx
].name
= add_name(_vendorshortnames
[i
].lname
, 1)))
169 if (!(vendors
[ivendor_idx
].shortname
= add_name(_vendorshortnames
[i
].sname
, 1)))
173 if (!(vendors
[ivendor_idx
].name
= add_name(v
, 1)))
177 if (!(vendors
[ivendor_idx
].shortname
= add_name(p
, 1)))
180 vendors
[ivendor_idx
].shortname
= vendors
[ivendor_idx
].name
;
182 vendors
[ivendor_idx
].vnr
= ivendor_idx
;
183 vendors
[ivendor_idx
].refcnt
++;
185 return(ivendor_idx
-1);
190 static int new_vario(char *v
, int c
) {
193 if (vario_idx
>=max_vario
)
200 if (!(varios
[vario_idx
].name
= add_name(v
, 1)))
202 if (cards
[c
].vario
>0) {
203 varios
[vario_idx
-1].next_vario
= vario_idx
;
205 cards
[c
].vario
= vario_idx
;
206 varios
[vario_idx
].handle
= vario_idx
;
207 varios
[vario_idx
].card_ref
= c
;
208 cards
[c
].vario_cnt
++;
212 void del_vario(void) {
213 fprintf(stderr
, "del_vario: %d %s\n", vario_idx
, cards
[varios
[vario_idx
].card_ref
].name
);
214 cards
[varios
[vario_idx
].card_ref
].vario_cnt
--;
216 if (varios
[vario_idx
-1].next_vario
== vario_idx
) {
217 if (cards
[varios
[vario_idx
].card_ref
].vario_cnt
== 1)
218 cards
[varios
[vario_idx
].card_ref
].vario
= vario_idx
-1;
219 varios
[vario_idx
-1].next_vario
= 0;
220 } else if (cards
[varios
[vario_idx
].card_ref
].vario
== vario_idx
) {
221 cards
[varios
[vario_idx
].card_ref
].vario
= 0;
223 fprintf(stderr
, "del_vario:internal error\n");
227 memset(&varios
[vario_idx
], 0, sizeof(cdb_isdn_vario
));
231 int new_entry(void) {
234 fprintf(stderr
, "new_entry:not_supported %s\n", cards
[ce_idx
].name
);
235 if (cards
[ce_idx
].vario_cnt
< 1) {
236 vendors
[cards
[ce_idx
].vhandle
].refcnt
--;
237 memset(&cards
[ce_idx
], 0, sizeof(cdb_isdn_card
));
242 if (ce_idx
>= max_ce
)
244 cards
[ce_idx
].handle
= ce_idx
;
245 cards
[ce_idx
].vendor
= PCI_ANY_ID
;
246 cards
[ce_idx
].device
= PCI_ANY_ID
;
247 cards
[ce_idx
].subvendor
= PCI_ANY_ID
;
248 cards
[ce_idx
].subdevice
= PCI_ANY_ID
;
252 void add_current_item(int item
, char *val
) {
256 if ((item
!= vario
) && not_supported
)
260 i
= add_vendor(val
, ce_idx
);
262 fprintf(stderr
, "error in add_vendor %s\n", val
);
265 cards
[ce_idx
].vhandle
= i
;
268 cards
[ce_idx
].name
= add_name(val
, 1);
269 if (!cards
[ce_idx
].name
) {
270 fprintf(stderr
, "error in add_name %s\n", val
);
273 cards
[ce_idx
].lname
= add_lname(cards
[ce_idx
].vhandle
, val
);
274 if (!cards
[ce_idx
].lname
) {
275 fprintf(stderr
, "error in add_lname %s\n", val
);
280 i
= sscanf(val
,"%x", &cards
[ce_idx
].vendor
);
282 fprintf(stderr
, "error to hex %s\n", val
);
287 i
= sscanf(val
,"%x", &cards
[ce_idx
].device
);
289 fprintf(stderr
, "error to hex %s\n", val
);
294 i
= sscanf(val
,"%x", &cards
[ce_idx
].subvendor
);
296 fprintf(stderr
, "error to hex %s\n", val
);
301 i
= sscanf(val
,"%x", &cards
[ce_idx
].subdevice
);
303 fprintf(stderr
, "error to hex %s\n", val
);
308 cards
[ce_idx
].Class
= add_name(val
, 1);
309 if (!cards
[ce_idx
].name
) {
310 fprintf(stderr
, "error in add_name %s\n", val
);
315 cards
[ce_idx
].bus
= add_name(val
, 1);
316 if (!cards
[ce_idx
].name
) {
317 fprintf(stderr
, "error in add_name %s\n", val
);
322 if (new_vario(val
, ce_idx
)) {
323 fprintf(stderr
, "error in new_vario(%s, %d)\n", val
, ce_idx
);
328 if (!strcasecmp(val
, "no"))
329 varios
[vario_idx
].smp
= 0;
330 else if (!strcasecmp(val
, "yes"))
331 varios
[vario_idx
].smp
= 1;
335 fprintf(stderr
, "more as one drvid_cnt (%s) card (%s)\n", val
, cards
[ce_idx
].name
);
337 i
= sscanf(val
,"%x", &varios
[vario_idx
].drvid
);
339 fprintf(stderr
, "error to hex %s\n", val
);
346 if (drv_subtyp_cnt
) {
347 fprintf(stderr
, "more as one drv_subtyp (%s) card (%s)\n", val
, cards
[ce_idx
].name
);
349 i
= sscanf(val
,"%d", &varios
[vario_idx
].subtyp
);
351 fprintf(stderr
, "error to decimal %s\n", val
);
359 fprintf(stderr
, "more as one drv_typ (%s) card (%s)\n", val
, cards
[ce_idx
].name
);
361 i
= sscanf(val
,"%d", &varios
[vario_idx
].typ
);
363 fprintf(stderr
, "error to decimal %s\n", val
);
370 varios
[vario_idx
].interface
= add_name_list(val
, varios
[vario_idx
].interface
);
373 i
= sscanf(val
,"%d", &cards
[ce_idx
].line_cnt
);
375 fprintf(stderr
, "error to hex %s\n", val
);
380 varios
[vario_idx
].protocol
= add_name_list(val
, varios
[vario_idx
].protocol
);
383 varios
[vario_idx
].mod_name
= add_name(val
, 1);
386 varios
[vario_idx
].need_pkg
= add_name_list(val
, varios
[vario_idx
].need_pkg
);
390 fprintf(stderr
, "more as one supported entry (%s) vendor(%s) card(%s)\n", val
,
391 vendors
[cards
[ce_idx
].vhandle
].name
, cards
[ce_idx
].name
);
392 if (!strcasecmp(val
, "not")) {
399 varios
[vario_idx
].features
= add_name_list(val
, varios
[vario_idx
].features
);
402 old
= name_str
+ name_str_cnt
;
403 varios
[vario_idx
].info
= add_name(val
, 1);
404 if (old
== varios
[vario_idx
].info
)
405 fprintf(stderr
, "info(%s): %s\n", cards
[ce_idx
].name
, varios
[vario_idx
].info
);
410 varios
[vario_idx
].firmware
= add_name(val
, 1);
412 case short_description
:
413 old
= name_str
+ name_str_cnt
;
414 varios
[vario_idx
].description
= add_name(val
, 1);
415 if (old
== varios
[vario_idx
].description
)
416 fprintf(stderr
, "description(%s): %s\n", cards
[ce_idx
].name
, varios
[vario_idx
].description
);
419 varios
[vario_idx
].irq
= add_sortedname_list(val
, varios
[vario_idx
].irq
, "%d");
422 varios
[vario_idx
].io
= add_sortedname_list(val
, varios
[vario_idx
].io
, "0x%x");
425 varios
[vario_idx
].membase
= add_sortedname_list(val
, varios
[vario_idx
].membase
, "0x%x");
427 case alternative_name
:
430 i
= sscanf(val
,"%x", &cards
[ce_idx
].revision
);
432 fprintf(stderr
, "error to hex %s\n", val
);
435 if ((cards
[ce_idx
].subvendor
== PCI_ANY_ID
) &&
436 (cards
[ce_idx
].subdevice
== PCI_ANY_ID
))
437 cards
[ce_idx
].subvendor
= cards
[ce_idx
].revision
;
442 void SortVendors(void) {
445 qsort(vendors
, ivendor_idx
, sizeof(cdb_isdn_vendor
), (fcmp
)compare_vendor
);
446 /* readjust card data */
447 for (c
= 1; c
<= ce_idx
; c
++) {
448 for (v
= 0; v
< ivendor_idx
; v
++) {
449 if (cards
[c
].vhandle
== vendors
[v
].vnr
) {
450 cards
[c
].vhandle
= v
;
455 /* now adjust own handle */
456 for (v
= 0; v
< ivendor_idx
; v
++) {
461 void SortCards(void) {
464 qsort(&cards
[1], ce_idx
, sizeof(cdb_isdn_card
), (fcmp
)compare_card
);
465 /* readjust vario data */
466 for (v
= 1; v
<= vario_idx
; v
++) {
467 for (c
= 1; c
<= ce_idx
; c
++) {
468 if (cards
[c
].handle
== varios
[v
].card_ref
) {
469 varios
[v
].card_ref
= c
;
474 /* now adjust own handle */
475 for (c
= 0; c
<= ce_idx
; c
++) {
478 isdncard_id
= malloc(ce_idx
*sizeof(int));
480 fprintf(stderr
, "no mem for isdncard_id (%d entries)\n", ce_idx
);
483 for (c
= 0; c
< ce_idx
; c
++)
484 isdncard_id
[c
] = c
+ 1;
485 qsort(isdncard_id
, ce_idx
, sizeof(int), (fcmp
)compare_id
);
488 void SortVarios(void) {
491 qsort(&varios
[1], vario_idx
, sizeof(cdb_isdn_vario
), (fcmp
)compare_type
);
492 /* readjust vario data */
493 for (v
= 1; v
<= vario_idx
; v
++) {
494 if (varios
[v
].next_vario
) {
495 for (i
= 1; i
<= vario_idx
; i
++) {
496 if (varios
[i
].handle
== varios
[v
].next_vario
) {
497 varios
[v
].next_vario
= i
;
503 /* readjust card data */
504 for (c
= 1; c
<= ce_idx
; c
++) {
505 for (v
= 1; v
<= vario_idx
; v
++) {
506 if (varios
[v
].handle
== cards
[c
].vario
) {
512 /* now adjust own handle */
513 for (v
= 1; v
<= vario_idx
; v
++) {
514 varios
[v
].handle
= v
;