Templates to help porting freebsd networking drivers to rtems (focus on i386 and powerpc) using a 'quick and dirty' approach. This is not an elegant piece of software -- be warned. /* Copyright: Till Straumann , 2005; * License: see LICENSE file. */ Usage: A obtain the freebsd driver source. It usually is made up of a if_XXX.c -- core driver if_XXXreg.h -- core header if_XXXvar.h -- some have it, some don't if_XXX_.c -- glue to integrate the core driver with different environments (such as pccard, pci, ...). There are several of these. Note that you might have to get an older version as some structures and interfaces may have undergone significant changes since the bsd/networking version that was ported to rtems. B Copy the Makefile and rtemscompat_defs.h templates to the driver source dir and edit them. C Edit if_XXXreg.h and comment all unneeded fields from the 'softc' structure declaration with #ifndef __rtems__ #endif In particular, the bushandle field (as defined in rtemscompat_defs.h) above, see comments in the template) must be re-declared: #ifndef __rtems__ bus_space_handle_t XXX_bhandle; #else unsigned XXX_bhandle; unsigned char irq_no; unsigned char b,d,f; /* PCI tuple; needed for PCI only */ rtems_id tid; /* driver task id */ #endif Later, the compilation attempts will help identifying fields that need to be removed. I like the #ifdef __rtems__ construct as it minimizes changes to the source thus making merging updated driver versions easier. D Edit if_XXX.c; at the very top, include the lines #ifdef __rtems__ #include #endif use the #ifndef __rtems__ #endif construct to comment unneeded / unsupported inclusion of headers and code pieces. - inclusion of net/if_media.h must usually be mapped to libchip/if_media.h comment all vm, machine, bus, mii etc. related headers. - replace inclusion of if_XXXreg.h by #include "if_XXXreg.h" #include - work through the if_XXX.c and if_XXXreg.h files commenting stuff until if_XXX.c compiles. This might involve hacking the helper headers. - pay attention to endian issues; things may need to be fixed! - at the top where the freebsd 'methods' and the like are commented, add a definition of the driver methods for RTEMS: #ifdef __rtems__ net_drv_tbl_t METHODS = { n_probe : XXX_probe, n_attach : XXX_attach, n_detach : XXX_detach, /* optional; */ n_intr : XXX_intr, /* freebsd ISR; executed from daemon under RTEMS */ }; #endif - make sure all the if_xxx methods are set; in particular, set sc->if_output = ether_output; - on input: you can use DO_ETHER_INPUT_SKIPPING_ETHER_HEADER() macro -- if you don't MAKE SURE THE RECEIVING INTERFACE IS SET in the mbuf packet header!!! E create 'rtems__setup()' to probe for devices and set the softc struct's base address, interrupt line and bus/dev/fun triple (PCI only). For PCI devices, a generic setup routine already comes with porting/if_xxx_rtems.c -> nothing needs to be written!