summaryrefslogtreecommitdiffstats
path: root/sys/dev/cm/smc90cx6.c
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2005-06-10 16:49:24 +0000
committerbrooks <brooks@FreeBSD.org>2005-06-10 16:49:24 +0000
commit567ba9b00a248431e7c1147c4e079fd7a11b9ecf (patch)
treef65b6d7834b40dfcd48534829a0a1e9529ab87ee /sys/dev/cm/smc90cx6.c
parent3eaa67c3ad947d85be5350e0e184cd6ee5b93a52 (diff)
downloadFreeBSD-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.c29
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;
OpenPOWER on IntegriCloud