#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 #include /* Copyright: Till Straumann , 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