diff -ru module-init-tools-0.9.15-pre3/depmod.c module-init-tools-0.9.15-pre3-pnp/depmod.c --- module-init-tools-0.9.15-pre3/depmod.c 2003-09-15 03:44:02.000000000 +0200 +++ module-init-tools-0.9.15-pre3-pnp/depmod.c 2003-11-17 14:43:09.000000000 +0100 @@ -594,6 +594,7 @@ { "modules.usbmap", output_usb_table }, { "modules.ccwmap", output_ccw_table }, { "modules.ieee1394map", output_ieee1394_table }, + { "modules.isapnpmap", output_isapnp_table }, { "modules.alias", output_aliases }, { "modules.symbols", output_symbols }, }; diff -ru module-init-tools-0.9.15-pre3/depmod.h module-init-tools-0.9.15-pre3-pnp/depmod.h --- module-init-tools-0.9.15-pre3/depmod.h 2003-08-15 16:21:02.000000000 +0200 +++ module-init-tools-0.9.15-pre3-pnp/depmod.h 2003-11-14 14:46:30.000000000 +0100 @@ -40,6 +40,10 @@ void *ieee1394_table; unsigned int ccw_size; void *ccw_table; + unsigned int pnp_size; + void *pnp_table; + unsigned int pnp_card_size; + void *pnp_card_table; /* File contents and length. */ void *data; diff -ru module-init-tools-0.9.15-pre3/moduleops_core.c module-init-tools-0.9.15-pre3-pnp/moduleops_core.c --- module-init-tools-0.9.15-pre3/moduleops_core.c 2003-10-01 01:17:42.000000000 +0200 +++ module-init-tools-0.9.15-pre3-pnp/moduleops_core.c 2003-11-14 14:46:24.000000000 +0100 @@ -179,6 +179,14 @@ module->ieee1394_size = PERBIT(IEEE1394_DEVICE_SIZE); module->ieee1394_table = PERBIT(deref_sym)(module->data, "__mod_ieee1394_device_table"); + + module->pnp_size = PERBIT(PNP_DEVICE_SIZE); + module->pnp_table = PERBIT(deref_sym)(module->data, + "__mod_pnp_device_table"); + + module->pnp_card_size = PERBIT(PNP_CARD_DEVICE_SIZE); + module->pnp_card_table = PERBIT(deref_sym)(module->data, + "__mod_pnp_card_device_table"); } struct module_ops PERBIT(mod_ops) = { diff -ru module-init-tools-0.9.15-pre3/tables.c module-init-tools-0.9.15-pre3-pnp/tables.c --- module-init-tools-0.9.15-pre3/tables.c 2003-08-19 12:07:46.000000000 +0200 +++ module-init-tools-0.9.15-pre3-pnp/tables.c 2003-11-17 15:03:44.000000000 +0100 @@ -1,5 +1,6 @@ #include #include +#include #include "depmod.h" #include "tables.h" @@ -158,3 +159,60 @@ output_ccw_entry(e, shortname, out); } } + +#define ISAPNP_VENDOR(a,b,c) (((((a)-'A'+1)&0x3f)<<2)|\ + ((((b)-'A'+1)&0x18)>>3)|((((b)-'A'+1)&7)<<13)|\ + ((((c)-'A'+1)&0x1f)<<8)) +#define ISAPNP_DEVICE(x) ((((x)&0xf000)>>8)|\ + (((x)&0x0f00)>>8)|\ + (((x)&0x00f0)<<8)|\ + (((x)&0x000f)<<8)) + +static void put_isapnp_id(FILE *out, const char *id) +{ + unsigned short vendor, device; + + vendor = ISAPNP_VENDOR(id[0], id[1], id[2]); + device = (unsigned short)strtol(&id[3], NULL, 16); + device = ISAPNP_DEVICE(device); + fprintf(out, " 0x%04x 0x%04x ", vendor, device); +} + +void output_isapnp_table(struct module *modules, FILE *out) +{ + struct module *i; + + fprintf(out, "# isapnp module "); + fprintf(out, "cardvendor carddevice driver_data vendor function ...\n"); + + for (i = modules; i; i = i->next) { + char shortname[strlen(i->pathname) + 1]; + + if (i->pnp_table) { + struct pnp_device_id *id; + make_shortname(shortname, i->pathname); + for (id = i->pnp_table; id->id[0]; id++) { + fprintf(out, "%-20s", shortname); + fprintf(out, " 0xffff 0xffff "); + fprintf(out, " 0x00000000 "); /* driver_data */ + put_isapnp_id(out, id->id); + fprintf(out, "\n"); + } + } else if (i->pnp_card_table) { + struct pnp_card_device_id *id; + make_shortname(shortname, i->pathname); + for (id = i->pnp_card_table; id->id[0]; id++) { + int idx; + fprintf(out, "%-20s", shortname); + put_isapnp_id(out, id->id); + fprintf(out, " 0x00000000 "); /* driver_data */ + for (idx = 0; idx < 8; idx++) { + if (! id->devid[idx][0]) + break; + put_isapnp_id(out, id->devid[idx]); + } + fprintf(out, "\n"); + } + } + } +} diff -ru module-init-tools-0.9.15-pre3/tables.h module-init-tools-0.9.15-pre3-pnp/tables.h --- module-init-tools-0.9.15-pre3/tables.h 2003-05-02 08:28:01.000000000 +0200 +++ module-init-tools-0.9.15-pre3-pnp/tables.h 2003-11-17 15:04:23.000000000 +0100 @@ -55,11 +55,27 @@ #define CCW_DEVICE_SIZE32 (3 * 2 + 2 * 1 + 4) #define CCW_DEVICE_SIZE64 (3 * 2 + 2 * 1 + 8) +struct pnp_device_id { + char id[8]; + unsigned long driver_data; +}; +#define PNP_DEVICE_SIZE32 (8 + sizeof(long)) +#define PNP_DEVICE_SIZE64 (8 + sizeof(long)) + +struct pnp_card_device_id { + char id[8]; + unsigned long driver_data; + char devid[8][8]; +}; +#define PNP_CARD_DEVICE_SIZE32 (8 + sizeof(long) + 8 * 8) +#define PNP_CARD_DEVICE_SIZE64 (8 + sizeof(long) + 8 * 8) + /* Functions provided by tables.c */ struct module; void output_usb_table(struct module *modules, FILE *out); void output_ieee1394_table(struct module *modules, FILE *out); void output_pci_table(struct module *modules, FILE *out); void output_ccw_table(struct module *modules, FILE *out); +void output_isapnp_table(struct module *modules, FILE *out); #endif /* MODINITTOOLS_TABLES_H */