Messages in this thread Patch in this message |  | | Subject | Re: [PATCH] modutils: ieee1394 device_id extraction | From | Kristian Hogsberg <> | Date | 16 Sep 2001 12:18:53 +0200 |
| |
Keith Owens <kaos@ocs.com.au> writes:
> On 15 Sep 2001 18:02:10 +0200, > Kristian Hogsberg <hogsberg@users.sf.net> wrote: > >I've been adding hotplug support to the ieee1394 subsystem, and the > >ieee1394 stack in cvs now calls the usermode helper just like usb, pci > >and the rest of them. Next step is to extend depmod so it extracts > >the device id tables from the 1394 device drivers, which is exactly > >what the patch below does. > > > >Keith, would you apply this to modutils? > > Patch looks OK, expect that sometimes you use hpsb and sometimes > ieee1394 as a prefix for variable names. Can they all be iee1394, > including the device table? Use MODULE_DEVICE_TABLE(ieee1394,name) > instead of MODULE_DEVICE_TABLE(hpsb, name).
Ok, the patch below changes this. Within the drivers, though, hpsb (High Performance Serial Bus) is used, but I believe ieee1394 is more widely recognized.
Kristian
diff -ur modutils-2.4.8/depmod/depmod.c modutils-2.4.8-ieee1394/depmod/depmod.c --- modutils-2.4.8/depmod/depmod.c Wed Aug 22 07:13:56 2001 +++ modutils-2.4.8-ieee1394/depmod/depmod.c Sun Sep 16 11:38:03 2001 @@ -182,6 +182,26 @@ ElfW(Addr) pattern; }; +/* Device tables for ieee1394 devices. + * Added sep. 15, 2001, Kristian Hogsberg <hogsberg@users.sf.net>. + * See linux/drivers/ieee1394/ieee1394_hotplug.h + */ + +#ifndef u32 +#define u32 u_int32_t +#endif + +unsigned int ieee1394_device_id_ver; + +struct ieee1394_device_id { + u32 match_flags; + u32 vendor_id; + u32 model_id; + u32 specifier_id; + u32 version; + void *driver_data; +}; + typedef struct MODULE { char *name; int resolved; @@ -201,6 +221,8 @@ int n_usb_device; struct parport_device_id *parport_device; int n_parport_device; + struct ieee1394_device_id *ieee1394_device; + int n_ieee1394_device; } MODULE; typedef enum SYM_STATUS { @@ -646,6 +668,41 @@ } /* + * Extract any ieee1394_device_table from the module. + * Note: assumes same machine and arch for depmod and module. + */ +static void extract_ieee1394_device_id(struct obj_file *f, void *image, unsigned long m_size, MODULE *mod) +{ + struct ieee1394_device_id ieee1394_device, *latest; + ElfW(Addr) ref_ieee1394, ref_ref_ieee1394; + unsigned tgt_long ieee1394_device_size; + ref_ieee1394 = obj_symbol_final_value(f, obj_find_symbol(f, "__module_ieee1394_device_size")); + if (!in_range(f, m_size, ref_ieee1394, sizeof(ieee1394_device_size))) + return; + memcpy(&ieee1394_device_size, (char *)image + ref_ieee1394 - f->baseaddr, sizeof(ieee1394_device_size)); + ref_ref_ieee1394 = obj_symbol_final_value(f, obj_find_symbol(f, "__module_ieee1394_device_table")); + if (!in_range(f, m_size, ref_ref_ieee1394, sizeof(ref_ieee1394))) + return; + memcpy(&ref_ieee1394, (char *)image + ref_ref_ieee1394 - f->baseaddr, sizeof(ref_ieee1394)); + extract_version(f, image, m_size, "ieee1394_device", &ieee1394_device_id_ver, 1, 1); + if (ieee1394_device_size != sizeof(ieee1394_device)) { + error("Unexpected value (%" tgt_long_fmt "d) in '%s' for ieee1394_device_size%s", + ieee1394_device_size, f->filename, has_kernel_changed); + exit(-1); + } + while (in_range(f, m_size, ref_ieee1394, ieee1394_device_size)) { + memset(&ieee1394_device, 0, sizeof(ieee1394_device)); + memcpy(&ieee1394_device, (char *)image + ref_ieee1394 - f->baseaddr, ieee1394_device_size); + ref_ieee1394 += ieee1394_device_size; + if (ieee1394_device.match_flags == 0) + break; + mod->ieee1394_device = xrealloc(mod->ieee1394_device, ++(mod->n_ieee1394_device)*sizeof(*(mod->ieee1394_device))); + latest = mod->ieee1394_device + mod->n_ieee1394_device-1; + *latest = ieee1394_device; + } +} + +/* * Read the symbols in an object and register them in the symbol table. * Return -1 if there is an error. */ @@ -827,6 +884,7 @@ extract_isapnp_card_id(f, image, m_size, mod); extract_usb_device_id(f, image, m_size, mod); extract_parport_device_id(f, image, m_size, mod); + extract_ieee1394_device_id(f, image, m_size, mod); free(image); obj_free(f); @@ -1025,6 +1083,7 @@ FILE *isapnpmap = stdout; FILE *usbmap = stdout; FILE *parportmap = stdout; + FILE *ieee1394map = stdout; MODULE **tbdep; MODULE *ptmod; int i; @@ -1038,6 +1097,7 @@ isapnpmap = gen_file_open(gen_file+GEN_ISAPNPMAPFILE); usbmap = gen_file_open(gen_file+GEN_USBMAPFILE); parportmap = gen_file_open(gen_file+GEN_PARPORTMAPFILE); + ieee1394map = gen_file_open(gen_file+GEN_IEEE1394MAPFILE); } skipchars = strlen(base_dir); @@ -1216,6 +1276,27 @@ } } + ptmod = modules; + fprintf(ieee1394map, "# ieee1394 module "); + /* Requires all users to be on kernel 2.4.0 or later */ + fprintf(ieee1394map, "match_flags "); + fprintf(ieee1394map, "vendor_id model_id specifier_id version\n"); + for (i = 0; i < n_modules; i++, ptmod++) { + int j; + struct ieee1394_device_id *ieee1394_device = ptmod->ieee1394_device; + if (!ptmod->n_ieee1394_device) + continue; + for (j = 0; j < ptmod->n_ieee1394_device; j++, ieee1394_device++) { + fprintf(ieee1394map, "%-20s 0x%08x 0x%06x 0x%06x 0x%06x 0x%06x\n", + shortname(ptmod->name), + ieee1394_device->match_flags, + ieee1394_device->vendor_id, + ieee1394_device->model_id, + ieee1394_device->specifier_id, + ieee1394_device->version); + } + } + if (generic_string != stdout) fclose(generic_string); if (pcimap != stdout) @@ -1225,6 +1306,8 @@ if (usbmap != stdout) fclose(usbmap); if (parportmap != stdout) + fclose(parportmap); + if (ieee1394map != stdout) fclose(parportmap); /* Close depfile last, it's timestamp is critical */ if (dep != stdout) Only in modutils-2.4.8-ieee1394/depmod: depmod.c.orig Only in modutils-2.4.8-ieee1394/depmod: depmod.c~ diff -ur modutils-2.4.8/include/config.h modutils-2.4.8-ieee1394/include/config.h --- modutils-2.4.8/include/config.h Fri Jan 5 02:45:19 2001 +++ modutils-2.4.8-ieee1394/include/config.h Sat Sep 15 16:52:52 2001 @@ -92,6 +92,7 @@ GEN_ISAPNPMAPFILE, GEN_USBMAPFILE, GEN_PARPORTMAPFILE, + GEN_IEEE1394MAPFILE, GEN_DEPFILE, }; diff -ur modutils-2.4.8/util/alias.h modutils-2.4.8-ieee1394/util/alias.h --- modutils-2.4.8/util/alias.h Thu Aug 16 14:12:26 2001 +++ modutils-2.4.8-ieee1394/util/alias.h Sat Sep 15 16:52:52 2001 @@ -247,6 +247,7 @@ "modules.isapnpmap", "modules.usbmap", "modules.parportmap", + "modules.ieee1394map", "System.map", ".config", "build", /* symlink to source tree */ Only in modutils-2.4.8-ieee1394/util: alias.h.orig diff -ur modutils-2.4.8/util/config.c modutils-2.4.8-ieee1394/util/config.c --- modutils-2.4.8/util/config.c Sun Mar 25 13:13:48 2001 +++ modutils-2.4.8-ieee1394/util/config.c Sat Sep 15 16:52:52 2001 @@ -116,6 +116,7 @@ {"isapnpmap", NULL, 0}, {"usbmap", NULL, 0}, {"parportmap", NULL, 0}, + {"ieee1394map", NULL, 0}, {"dep", NULL, 0}, };
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |