diff options
author | brooks <brooks@FreeBSD.org> | 2005-06-10 16:49:24 +0000 |
---|---|---|
committer | brooks <brooks@FreeBSD.org> | 2005-06-10 16:49:24 +0000 |
commit | 567ba9b00a248431e7c1147c4e079fd7a11b9ecf (patch) | |
tree | f65b6d7834b40dfcd48534829a0a1e9529ab87ee /sys/dev/cm/smc90cx6.c | |
parent | 3eaa67c3ad947d85be5350e0e184cd6ee5b93a52 (diff) | |
download | FreeBSD-src-567ba9b00a248431e7c1147c4e079fd7a11b9ecf.zip FreeBSD-src-567ba9b00a248431e7c1147c4e079fd7a11b9ecf.tar.gz |
Stop embedding struct ifnet at the top of driver softcs. Instead the
struct ifnet or the layer 2 common structure it was embedded in have
been replaced with a struct ifnet pointer to be filled by a call to the
new function, if_alloc(). The layer 2 common structure is also allocated
via if_alloc() based on the interface type. It is hung off the new
struct ifnet member, if_l2com.
This change removes the size of these structures from the kernel ABI and
will allow us to better manage them as interfaces come and go.
Other changes of note:
- Struct arpcom is no longer referenced in normal interface code.
Instead the Ethernet address is accessed via the IFP2ENADDR() macro.
To enforce this ac_enaddr has been renamed to _ac_enaddr.
- The second argument to ether_ifattach is now always the mac address
from driver private storage rather than sometimes being ac_enaddr.
Reviewed by: sobomax, sam
Diffstat (limited to 'sys/dev/cm/smc90cx6.c')
-rw-r--r-- | sys/dev/cm/smc90cx6.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/sys/dev/cm/smc90cx6.c b/sys/dev/cm/smc90cx6.c index 4bfed97..b2316b0 100644 --- a/sys/dev/cm/smc90cx6.c +++ b/sys/dev/cm/smc90cx6.c @@ -277,10 +277,15 @@ cm_attach(dev) device_t dev; { struct cm_softc *sc = device_get_softc(dev); - struct ifnet *ifp = &sc->sc_arccom.ac_if; + struct ifnet *ifp; int s; u_int8_t linkaddress; + ifp = sc->sc_ifp = if_alloc(IFT_ARCNET); + if (ifp == NULL) { + return (ENOSPC); + } + s = splhigh(); /* @@ -353,7 +358,7 @@ cm_init(xsc) struct ifnet *ifp; int s; - ifp = &sc->sc_arccom.ac_if; + ifp = sc->sc_ifp; if ((ifp->if_flags & IFF_RUNNING) == 0) { s = splimp(); @@ -377,7 +382,7 @@ cm_reset(sc) struct ifnet *ifp; int linkaddress; - ifp = &sc->sc_arccom.ac_if; + ifp = sc->sc_ifp; #ifdef CM_DEBUG if_printf(ifp, "reset\n"); @@ -456,7 +461,7 @@ cm_stop(sc) GETREG(CMRESET); /* Stop watchdog timer */ - sc->sc_arccom.ac_if.if_timer = 0; + sc->sc_ifp->if_timer = 0; } /* @@ -589,7 +594,7 @@ cm_start(ifp) PUTREG(CMCMD, CM_TX(buffer)); PUTREG(CMSTAT, sc->sc_intmask); - sc->sc_arccom.ac_if.if_timer = ARCTIMEOUT; + ifp->if_timer = ARCTIMEOUT; } splx(s); m_freem(m); @@ -619,7 +624,7 @@ cm_srint(vsc) struct arc_header *ah; struct ifnet *ifp; - ifp = &sc->sc_arccom.ac_if; + ifp = sc->sc_ifp; s = splimp(); buffer = sc->sc_rx_act ^ 1; @@ -733,7 +738,7 @@ cm_tint(sc, isr) int clknow; #endif - ifp = &(sc->sc_arccom.ac_if); + ifp = sc->sc_ifp; buffer = sc->sc_tx_act; /* @@ -744,7 +749,7 @@ cm_tint(sc, isr) */ if (isr & CM_TMA || sc->sc_broadcast[buffer]) - sc->sc_arccom.ac_if.if_opackets++; + ifp->if_opackets++; #ifdef CMRETRANSMIT else if (ifp->if_flags & IFF_LINK2 && ifp->if_timer > 0 && --sc->sc_retransmits[buffer] > 0) { @@ -814,7 +819,7 @@ cmintr(arg) void *arg; { struct cm_softc *sc = arg; - struct ifnet *ifp = &sc->sc_arccom.ac_if; + struct ifnet *ifp = sc->sc_ifp; u_char isr, maskedisr; int buffer; @@ -835,7 +840,7 @@ cmintr(arg) /* * XXX We should never see this. Don't bother to store * the address. - * sc->sc_arccom.ac_anaddr = GETMEM(CMMACOFF); + * sc->sc_ifp->if_l2com->ac_anaddr = GETMEM(CMMACOFF); */ PUTREG(CMCMD, CM_CLR(CLR_POR)); log(LOG_WARNING, @@ -849,7 +854,7 @@ cmintr(arg) * PUTREG(CMCMD, CM_CONF(CONF_LONG)); */ PUTREG(CMCMD, CM_CLR(CLR_RECONFIG)); - sc->sc_arccom.ac_if.if_collisions++; + ifp->if_collisions++; /* * If less than 2 seconds per reconfig: @@ -952,7 +957,7 @@ cm_reconwatch(arg) void *arg; { struct cm_softc *sc = arg; - struct ifnet *ifp = &sc->sc_arccom.ac_if; + struct ifnet *ifp = sc->sc_ifp; if (sc->sc_reconcount >= ARC_EXCESSIVE_RECONS) { sc->sc_reconcount = 0; |