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 | |
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')
-rw-r--r-- | sys/dev/cm/if_cm_isa.c | 5 | ||||
-rw-r--r-- | sys/dev/cm/smc90cx6.c | 29 | ||||
-rw-r--r-- | sys/dev/cm/smc90cx6var.h | 2 |
3 files changed, 21 insertions, 15 deletions
diff --git a/sys/dev/cm/if_cm_isa.c b/sys/dev/cm/if_cm_isa.c index 8f7732f..027d139 100644 --- a/sys/dev/cm/if_cm_isa.c +++ b/sys/dev/cm/if_cm_isa.c @@ -103,14 +103,15 @@ static int cm_isa_detach(device_t dev) { struct cm_softc *sc = device_get_softc(dev); - struct ifnet *ifp = &sc->sc_arccom.ac_if; + struct ifnet *ifp = sc->sc_ifp; int s; cm_stop(sc); ifp->if_flags &= ~IFF_RUNNING; s = splimp(); - arc_ifdetach(&sc->sc_arccom.ac_if); + arc_ifdetach(ifp); + if_free(ifp); splx(s); bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); 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; diff --git a/sys/dev/cm/smc90cx6var.h b/sys/dev/cm/smc90cx6var.h index 1703145..7130a8800 100644 --- a/sys/dev/cm/smc90cx6var.h +++ b/sys/dev/cm/smc90cx6var.h @@ -56,7 +56,7 @@ #include <sys/callout.h> struct cm_softc { - struct arccom sc_arccom; /* Common arcnet structures */ + struct ifnet *sc_ifp; /* Common arcnet structures */ int port_rid; /* resource id for port range */ struct resource *port_res; /* resource for port range */ |