/* * ddi.c Implement the Device Driver Interface (DDI) routines. * Currently, this is only used by the NET layer of LINUX, * but it eventually might move to an upper directory of * the system. * * Version: @(#)ddi.c 1.0.5 04/22/93 * * Author: Fred N. van Kempen, */ #include #include #include #include #include #include #include #include #include #include #undef DDI_DEBUG #ifdef DDI_DEBUG # define PRINTK(x) printk x #else # define PRINTK(x) /**/ #endif extern struct ddi_device devices[]; /* device driver map */ extern struct ddi_proto protocols[]; /* network protocols */ /* * This function gets called with an ASCII string representing the * ID of some DDI driver. We loop through the DDI Devices table * and return the address of the control block that has a matching * "name" field. It is used by upper-level layers that want to * dynamically bind some UNIX-domain "/dev/XXXX" file name to a * DDI device driver. The "iflink(8)" program is an example of * this behaviour. */ struct ddi_device * ddi_map(const char *id) { register struct ddi_device *dev; PRINTK (("DDI: MAP: looking for \"%s\": ", id)); dev = devices; while (dev->title != NULL) { if (strncmp(dev->name, id, DDI_MAXNAME) == 0) { PRINTK (("OK at 0x%X\n", dev)); return(dev); } dev++; } PRINTK (("NOT FOUND\n")); return(NULL); } /* * This is the function that is called by a kernel routine during * system startup. Its purpose is to walk trough the "devices" * table (defined above), and to call all moduled defined in it. */ void ddi_init(void) { struct ddi_proto *pro; struct ddi_device *dev; PRINTK (("DDI: Starting up!\n")); /* First off, kick all configured protocols. */ pro = protocols; while (pro->name != NULL) { (*pro->init)(pro); pro++; } /* Done. Now kick all configured device drivers. */ dev = devices; while (dev->title != NULL) { (*dev->init)(dev); dev++; } /* We're all done... */ }