diff options
Diffstat (limited to 'bsps/powerpc/beatnik/net/porting/rtemscompat1.h')
-rw-r--r-- | bsps/powerpc/beatnik/net/porting/rtemscompat1.h | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/bsps/powerpc/beatnik/net/porting/rtemscompat1.h b/bsps/powerpc/beatnik/net/porting/rtemscompat1.h new file mode 100644 index 0000000000..cee16522cc --- /dev/null +++ b/bsps/powerpc/beatnik/net/porting/rtemscompat1.h @@ -0,0 +1,219 @@ +#ifndef RTEMS_COMPAT1_BSD_NET_H +#define RTEMS_COMPAT1_BSD_NET_H + +/* BSD -> RTEMS conversion wrappers; stuff that must be defined + * after most BSD headers are included. + */ + +#include <netinet/in.h> +#include <netinet/if_ether.h> + +/* Copyright: Till Straumann <strauman@slac.stanford.edu>, 2005; + * License: see LICENSE file. + */ + +typedef struct device { + struct NET_SOFTC d_softc; /* MUST BE FIRST FIELD */ + char *d_name; + char *d_desc; + int d_unit; + int flags; + /* pointer to ifconfig only valid during excution of + * the n_attach/n_detach methods (see below) + */ + struct rtems_bsdnet_ifconfig *d_ifconfig; +} netdev_t; + +#define THEDEVS NET_EMBEMB(the_,NETDRIVER_PREFIX,_devs) +#define NETDEV_DECL netdev_t THEDEVS[NETDRIVER_SLOTS] + +extern NETDEV_DECL; + +typedef struct _net_drv_tbl { + int (*n_probe)(device_t); + int (*n_attach)(device_t); + int (*n_detach)(device_t); + void (*n_intr)(void *); +} net_drv_tbl_t; + +static inline netdev_t * +net_dev_get(struct rtems_bsdnet_ifconfig *config) +{ + int unitNo; + char *unitName; + + unitNo = rtems_bsdnet_parse_driver_name(config, &unitName); + if ( unitNo < 0 ) + return 0; + + if ( unitNo <=0 || unitNo > NETDRIVER_SLOTS ) { + device_printf(dev, "Bad "NETDRIVER" unit number.\n"); + return 0; + } + + if ( THEDEVS[unitNo-1].d_unit && THEDEVS[unitNo-1].d_unit != unitNo ) { + device_printf(dev, "Unit # mismatch !!??\n"); + return 0; + } + + THEDEVS[unitNo-1].d_unit = unitNo; + THEDEVS[unitNo-1].d_name = unitName; + THEDEVS[unitNo-1].d_ifconfig = config; + + return &THEDEVS[unitNo - 1]; +} + +/* kludge; that's why softc needs to be first */ +static inline netdev_t * +softc_get_device(struct NET_SOFTC *sc) +{ + return (netdev_t *)sc; +} + +static inline struct NET_SOFTC * +device_get_softc(netdev_t *dev) +{ return &dev->d_softc; } + +static inline int +device_get_unit(netdev_t *dev) +{ return dev->d_unit; } + +static inline char * +device_get_name(netdev_t *dev) +{ return dev->d_name; } + +static inline void +if_initname(struct ifnet *ifp, char *name, int unit) +{ + ifp->if_name = name; + ifp->if_unit = unit; +} + +static inline void +device_set_desc(netdev_t *dev, char *str) +{ + dev->d_desc = str; +} + +static inline void +device_set_desc_copy(netdev_t *dev, char *str) +{ + dev->d_desc = strdup(str); +} + + +static inline int +device_is_attached(netdev_t *dev) +{ + return dev->d_softc.arpcom.ac_if.if_addrlist && dev->d_softc.arpcom.ac_if.if_init; +} + +#ifdef NETDRIVER_PCI +#include NETDRIVER_PCI +#include "pcireg.h" + +static inline unsigned +pci_read_config(device_t dev, unsigned addr, unsigned width) +{ +rtemscompat_32_t d; +unsigned short s; +unsigned char b; +struct NET_SOFTC *sc = device_get_softc(dev); + switch (width) { + case 1: pci_read_config_byte(sc->b, sc->d, sc->f, addr, &b); + return b; + case 2: pci_read_config_word(sc->b, sc->d, sc->f, addr, &s); + return s; + case 4: pci_read_config_dword(sc->b, sc->d, sc->f, addr, &d); + return d; + default: + break; + } + return 0xdeadbeef; +} + +static inline void +pci_write_config(device_t dev, unsigned addr, unsigned width, unsigned val) +{ +struct NET_SOFTC *sc = device_get_softc(dev); + switch (width) { + case 1: pci_write_config_byte(sc->b, sc->d, sc->f, addr, val); + return ; + case 2: pci_write_config_word(sc->b, sc->d, sc->f, addr, val); + return ; + case 4: pci_write_config_dword(sc->b, sc->d, sc->f, addr, val); + return ; + default: + break; + } +} + + +static inline unsigned short +pci_get_vendor(device_t dev) +{ + return pci_read_config(dev, PCIR_VENDOR, 2); +} + +static inline unsigned short +pci_get_device(device_t dev) +{ + return pci_read_config(dev, PCIR_DEVICE, 2); +} + +static inline unsigned short +pci_get_subvendor(device_t dev) +{ + return pci_read_config(dev, PCIR_SUBVEND_0, 2); +} + +static inline unsigned short +pci_get_subdevice(device_t dev) +{ + return pci_read_config(dev, PCIR_SUBDEV_0, 2); +} + + +static inline void +pci_enable_busmaster(device_t dev) +{ + pci_write_config( + dev, + PCIR_COMMAND, + 2, + pci_read_config(dev, PCIR_COMMAND, 2) + | PCIM_CMD_BUSMASTEREN); +} + +#define mtx_init(a,b,c,d) do {} while(0) +#define mtx_initialized(ma) (1) +#define mtx_destroy(ma) do {} while(0) +#define mtx_lock(a) do {} while(0) +#define mtx_unlock(a) do {} while(0) +#define mtx_assert(a,b) do {} while(0) + +#define callout_handle_init(x) do {} while (0) +#define untimeout(a...) do {} while (0) + +#if !ISMINVERSION(4,6,99) +#define pci_bus_count BusCountPCI +#endif + +#endif + +/* Ugly hack to allow unloading/reloading the driver core. + * Needed because rtems' bsdnet release doesn't implement + * if_detach(). Therefore, we bring the interface down but + * keep the device record alive... + */ +static inline void +__ether_ifdetach(struct ifnet *ifp) +{ + ifp->if_flags = 0; + ifp->if_ioctl = 0; + ifp->if_start = 0; + ifp->if_watchdog = 0; + ifp->if_init = 0; +} + +#endif |