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;