summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/beatnik/net/porting/rtemscompat1.h
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/powerpc/beatnik/net/porting/rtemscompat1.h')
-rw-r--r--bsps/powerpc/beatnik/net/porting/rtemscompat1.h219
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