In a couple of drivers I did the following:
struct amcc593xreg{
[...]
u_int intcsr;
[...]
};
struct pcivic_softc{
[...]
bus_chipset_tag_t sc_bc;
[...]
bus_mem_handle_t amccbase;
[...]
};
#define ofs(what, elem) ((int)&(((what *)0)->elem))
#define readamcc(sc, reg) (bus_mem_read_4(sc->sc_bc, sc->amccbase, \
ofs(struct amcc593xreg, reg)))
[...]
intcsr = readamcc(sc, intcsr);
Is this good because it keeps the namespace clean, or
is it bad because it combines the complexity of
bus_space_xxx() with the non-portability of structs?
Other ideas how to accomplish the clean namespace
(and some consistency checks).
best regards
Matthias Drochner