Restore a sense of cleanly supporting multiple platforms. That is,

place the LOCKing macros within the areas within if_wxvar.h that
is set aside for them. Put any platform specific data also in those
areas.

For ease of maintenance purposes, merge in the OpenBSD version codebase here.
This commit is contained in:
mjacob 2000-12-06 00:52:28 +00:00
parent 0af5b7a4a7
commit bc44fbad3c
2 changed files with 95 additions and 36 deletions

View File

@ -1,3 +1,4 @@
/* $FreeBSD$ */
/*
* Copyright (c) 1999, Traakan Software
* All rights reserved.
@ -24,7 +25,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
@ -56,7 +56,7 @@
* Since the includes are a mess, they'll all be in if_wxvar.h
*/
#if defined(__NetBSD__)
#if defined(__NetBSD__) || defined(__OpenBSD__)
#include <dev/pci/if_wxvar.h>
#elif defined(__FreeBSD__)
#include <pci/if_wxvar.h>
@ -115,8 +115,8 @@ static void wx_dring_teardown __P((wx_softc_t *));
#define WX_MAXMTU ETHERMTU
#endif
#if defined(__NetBSD__)
#ifdef __BROKEN_INDIRECT_CONFIG
#if defined(__NetBSD__) || defined(__OpenBSD__)
#if defined(__BROKEN_INDIRECT_CONFIG) || defined(__OpenBSD__)
#define MATCHARG void *
#else
#define MATCHARG struct cfdata *
@ -161,6 +161,12 @@ struct cfattach wx_ca = {
sizeof (wx_softc_t), wx_match, wx_attach
};
#ifdef __OpenBSD__
struct cfdriver wx_cd = {
0, "wx", DV_IFNET
};
#endif
/*
* Check if a device is an 82452.
*/
@ -220,7 +226,12 @@ wx_attach(parent, self, aux)
return;
}
intrstr = pci_intr_string(pc, ih);
#if defined(__OpenBSD__)
sc->w.ih = pci_intr_establish(pc, ih, IPL_NET, wx_intr, sc,
self->dv_xname);
#else
sc->w.ih = pci_intr_establish(pc, ih, IPL_NET, wx_intr, sc);
#endif
if (sc->w.ih == NULL) {
printf("%s: couldn't establish interrupt", sc->wx_name);
if (intrstr != NULL)
@ -230,7 +241,7 @@ wx_attach(parent, self, aux)
}
printf("%s: interrupting at %s\n", sc->wx_name, intrstr);
sc->wx_idnrev = (PCI_PRODUCT(pa->pa_id) << 16) |
pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG) & 0xff;
(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG) & 0xff);
data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG);
data &= ~(PCI_CACHELINE_MASK << PCI_CACHELINE_SHIFT);
@ -244,7 +255,7 @@ wx_attach(parent, self, aux)
printf("%s: Ethernet address %s\n",
sc->wx_name, ether_sprintf(sc->wx_enaddr));
ifp = &sc->w.ethercom.ec_if;
ifp = &sc->wx_if;
bcopy(sc->wx_name, ifp->if_xname, IFNAMSIZ);
ifp->if_mtu = WX_MAXMTU;
ifp->if_softc = sc;
@ -256,8 +267,17 @@ wx_attach(parent, self, aux)
/*
* Attach the interface.
*/
if_attach(ifp);
#ifdef __OpenBSD__
ether_ifattach(ifp);
#else
ether_ifattach(ifp, sc->wx_enaddr);
#endif
#if NBPFILTER > 0
bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB,
sizeof (struct ether_header));
#endif
/*
* Add shutdown hook so that DMA is disabled prior to reboot. Not
* doing do could allow DMA to corrupt kernel memory during the
@ -308,7 +328,11 @@ wx_ether_ioctl(ifp, cmd, data)
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
#ifdef __OpenBSD__
arp_ifinit(&sc->w.arpcom, ifa);
#else
arp_ifinit(ifp, ifa);
#endif
break;
#endif
#ifdef NS
@ -365,7 +389,12 @@ wx_mc_setup(sc)
return (wx_init(sc));
}
#ifdef __OpenBSD__
ETHER_FIRST_MULTI(step, &sc->w.arpcom, enm);
#else
ETHER_FIRST_MULTI(step, &sc->w.ethercom, enm);
#endif
while (enm != NULL) {
if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0)
continue;
@ -567,7 +596,10 @@ wx_attach(device_t dev)
}
}
mtx_init(&sc->wx_mtx, device_get_nameunit(dev), MTX_DEF);
#ifdef SMPNG
mtx_init(&sc->wx_mtx, device_get_nameunit(dev), MTX_DEF);
#endif
WX_LOCK(sc);
/*
* get revision && id...
@ -1190,7 +1222,7 @@ wx_intr(arg)
wx_softc_t *sc = arg;
int claimed = 0;
WX_LOCK(sc);
WX_ILOCK(sc);
/*
* Read interrupt cause register. Reading it clears bits.
*/
@ -1211,7 +1243,7 @@ wx_intr(arg)
}
WX_ENABLE_INT(sc);
}
WX_UNLOCK(sc);
WX_IUNLK(sc);
return (claimed);
}
@ -1247,11 +1279,13 @@ wx_handle_link_intr(sc)
if (sc->wx_icr & WXISR_LSC) {
if (READ_CSR(sc, WXREG_DSR) & WXDSR_LU) {
printf("%s: gigabit link now up\n", sc->wx_name);
if (sc->wx_debug)
printf("%s: gigabit link up\n", sc->wx_name);
sc->linkup = 1;
sc->wx_dcr |= (WXDCR_SWDPIO0|WXDCR_SWDPIN0);
} else {
printf("%s: gigabit link now down\n", sc->wx_name);
if (sc->wx_debug)
printf("%s: gigabit link down\n", sc->wx_name);
sc->linkup = 0;
sc->wx_dcr &= ~(WXDCR_SWDPIO0|WXDCR_SWDPIN0);
}
@ -1437,17 +1471,12 @@ wx_handle_rxint(sc)
mb->m_len -= WX_CRC_LENGTH;
eh = mtod(m0, struct ether_header *);
if ((ifp->if_flags & IFF_PROMISC) &&
(bcmp(eh->ether_dhost, sc->wx_enaddr, ETHER_ADDR_LEN) &&
(eh->ether_dhost[0] & 1) == 0)) {
m_freem(m0);
if (sc->rpending) {
m_freem(sc->rpending);
sc->rpending = NULL;
}
} else {
pending[npkts++] = m0;
}
/*
* No need to check for promiscous mode since
* the decision to keep or drop the packet is
* handled by ether_input()
*/
pending[npkts++] = m0;
m0 = NULL;
tlen = 0;
}
@ -1463,17 +1492,15 @@ wx_handle_rxint(sc)
for (idx = 0; idx < npkts; idx++) {
mb = pending[idx];
#ifndef __FreeBSD__
if (ifp->if_bpf) {
bpf_mtap(WX_BPFTAP_ARG(ifp), mb);
}
#endif
ifp->if_ipackets++;
if (sc->wx_debug) {
printf("%s: RECV packet length %d\n",
sc->wx_name, mb->m_pkthdr.len);
}
#ifdef __FreeBSD__
#if defined(__FreeBSD__) || defined(__OpenBSD__)
eh = mtod(mb, struct ether_header *);
m_adj(mb, sizeof (struct ether_header));
ether_input(ifp, eh, mb);
@ -1542,12 +1569,16 @@ wx_gc(sc)
td = &sc->tdescriptors[cidx];
if (td->status & TXSTS_EC) {
printf("%s: excess collisions\n", sc->wx_name);
if (sc->wx_debug)
printf("%s: excess collisions\n",
sc->wx_name);
ifp->if_collisions++;
ifp->if_oerrors++;
}
if (td->status & TXSTS_LC) {
printf("%s: lost carrier\n", sc->wx_name);
if (sc->wx_debug)
printf("%s: lost carrier\n",
sc->wx_name);
ifp->if_oerrors++;
}
tmp = &sc->tbase[cidx];
@ -1593,7 +1624,7 @@ wx_watchdog(arg)
/*
* Schedule another timeout one second from now.
*/
TIMEOUT(sc, wx_watchdog, sc, hz);
VTIMEOUT(sc, wx_watchdog, sc, hz);
}
/*
@ -1913,7 +1944,6 @@ wx_init(xsc)
WRITE_CSR(sc, WXREG_RDT1, 0);
if (ifp->if_mtu > ETHERMTU) {
printf("%s: enabling for jumbo packets\n", sc->wx_name);
bflags = WXRCTL_EN | WXRCTL_LPE | WXRCTL_2KRBUF;
} else {
bflags = WXRCTL_EN | WXRCTL_2KRBUF;
@ -2008,13 +2038,13 @@ wx_ioctl(ifp, command, data)
WX_LOCK(sc);
switch (command) {
case SIOCSIFADDR:
#if !defined(__NetBSD__)
#if !defined(__NetBSD__) && !defined(__OpenBSD__)
case SIOCGIFADDR:
#endif
error = ether_ioctl(ifp, command, data);
break;
#ifdef SIOCGIFMTU
#ifdef SIOCSIFMTU
case SIOCSIFMTU:
if (ifr->ifr_mtu > WX_MAXMTU || ifr->ifr_mtu < ETHERMIN) {
error = EINVAL;

View File

@ -1,3 +1,4 @@
/* $FreeBSD$ */
/*
* Copyright (c) 1999, Traakan Software
* All rights reserved.
@ -24,7 +25,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
@ -102,6 +102,7 @@ struct wxmdvar {
bus_space_handle_t sh; /* bus space handle */
struct ifmedia ifm;
struct wx_softc * next;
int spl;
};
#define wx_dev w.dev
#define wx_enaddr w.enaddr
@ -121,6 +122,10 @@ struct wxmdvar {
#define VTIMEOUT(sc, func, arg, time) timeout(func, arg, time)
#define UNTIMEOUT(f, arg, sc) untimeout(f, arg)
#define INLINE inline
#define WX_LOCK(_sc) _sc->w.spl = splimp()
#define WX_UNLOCK(_sc) splx(_sc->w.spl)
#define WX_ILOCK(_sc)
#define WX_IUNLK(_sc)
#define vm_offset_t vaddr_t
#ifndef IFM_1000_SX
@ -130,6 +135,11 @@ struct wxmdvar {
#define WRITE_CSR _write_csr
#elif defined(__FreeBSD__)
/*
* Enable for FreeBSD 5.0 SMP code
*/
/* #define SMPNG 1 */
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/mbuf.h>
@ -178,6 +188,11 @@ struct wxmdvar {
bus_space_handle_t sh; /* bus space handle */
struct ifmedia ifm;
struct wx_softc * next;
#ifdef SMPNG
struct mtx wxmtx;
#else
int spl;
#endif
};
#define wx_dev w.dev
#define wx_enaddr w.arpcom.ac_enaddr
@ -187,6 +202,7 @@ struct wxmdvar {
#define wx_if w.arpcom.ac_if
#define wx_name w.name
#define wx_mtx w.wxmtx
#define IOCTL_CMD_TYPE u_long
#define WXMALLOC(len) malloc(len, M_DEVBUF, M_NOWAIT)
@ -197,6 +213,18 @@ struct wxmdvar {
#define TIMEOUT(sc, func, arg, time) (sc)->w.sch = timeout(func, arg, time)
#define UNTIMEOUT(f, arg, sc) untimeout(f, arg, (sc)->w.sch)
#define INLINE __inline
#ifdef SMPNG
#define WX_LOCK(_sc) mtx_enter(&(_sc)->wx_mtx, MTX_DEF)
#define WX_UNLOCK(_sc) mtx_exit(&(_sc)->wx_mtx, MTX_DEF)
#define WX_ILOCK(_sc) mtx_enter(&(_sc)->wx_mtx, MTX_DEF)
#define WX_IUNLK(_sc) mtx_exit(&(_sc)->wx_mtx, MTX_DEF)
#else
#define WX_LOCK(_sc) _sc->w.spl = splimp()
#define WX_UNLOCK(_sc) splx(_sc->w.spl)
#define WX_ILOCK(_sc)
#define WX_IUNLK(_sc)
#endif
#define READ_CSR(sc, reg) \
bus_space_read_4((sc)->w.st, (sc)->w.sh, (reg))
@ -260,6 +288,7 @@ struct wxmdvar {
bus_space_handle_t sh; /* bus space handle */
struct ifmedia ifm;
struct wx_softc * next;
int spl;
};
#define wx_dev w.dev
#define wx_enaddr w.arpcom.ac_enaddr
@ -279,6 +308,10 @@ struct wxmdvar {
#define VTIMEOUT(sc, func, arg, time) timeout(func, arg, time)
#define UNTIMEOUT(f, arg, sc) untimeout(f, arg)
#define INLINE inline
#define WX_LOCK(_sc) _sc->w.spl = splimp()
#define WX_UNLOCK(_sc) splx(_sc->w.spl)
#define WX_ILOCK(_sc)
#define WX_IUNLK(_sc)
#define vm_offset_t vaddr_t
#define READ_CSR _read_csr
@ -375,12 +408,8 @@ typedef struct wx_softc {
wxtd_t *tdescriptors; /* transmit descriptor ring */
u_int16_t tnxtfree; /* next free index (circular) */
u_int16_t tactive; /* # active */
struct mtx wx_mtx;
} wx_softc_t;
#define WX_LOCK(_sc) mtx_enter(&(_sc)->wx_mtx, MTX_DEF)
#define WX_UNLOCK(_sc) mtx_exit(&(_sc)->wx_mtx, MTX_DEF)
/*
* We offset the the receive frame header by two bytes so that the actual
* payload is 32 bit aligned. On platforms that require strict structure