Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Jun 2014 18:45:36 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r266977 - head/sys/dev/fxp
Message-ID:  <201406021845.s52IjaR8062480@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Mon Jun  2 18:45:36 2014
New Revision: 266977
URL: http://svnweb.freebsd.org/changeset/base/266977

Log:
  Convert fxp(4) to use the driver API.
  
  Submitted by:	Anuranjan Shukla <anshukla@juniper.net>
  Obtained from:	Juniper Networks, Inc.

Modified:
  head/sys/dev/fxp/if_fxp.c
  head/sys/dev/fxp/if_fxpvar.h

Modified: head/sys/dev/fxp/if_fxp.c
==============================================================================
--- head/sys/dev/fxp/if_fxp.c	Mon Jun  2 18:30:57 2014	(r266976)
+++ head/sys/dev/fxp/if_fxp.c	Mon Jun  2 18:45:36 2014	(r266977)
@@ -220,20 +220,20 @@ static int		fxp_resume(device_t dev);
 
 static const struct fxp_ident *fxp_find_ident(device_t dev);
 static void		fxp_intr(void *xsc);
-static void		fxp_rxcsum(struct fxp_softc *sc, struct ifnet *ifp,
+static void		fxp_rxcsum(struct fxp_softc *sc, if_t ifp,
 			    struct mbuf *m, uint16_t status, int pos);
-static int		fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp,
+static int		fxp_intr_body(struct fxp_softc *sc, if_t ifp,
 			    uint8_t statack, int count);
 static void 		fxp_init(void *xsc);
 static void 		fxp_init_body(struct fxp_softc *sc, int);
 static void 		fxp_tick(void *xsc);
-static void 		fxp_start(struct ifnet *ifp);
-static void 		fxp_start_body(struct ifnet *ifp);
+static void 		fxp_start(if_t ifp);
+static void 		fxp_start_body(if_t ifp);
 static int		fxp_encap(struct fxp_softc *sc, struct mbuf **m_head);
 static void		fxp_txeof(struct fxp_softc *sc);
 static void		fxp_stop(struct fxp_softc *sc);
 static void 		fxp_release(struct fxp_softc *sc);
-static int		fxp_ioctl(struct ifnet *ifp, u_long command,
+static int		fxp_ioctl(if_t ifp, u_long command,
 			    caddr_t data);
 static void 		fxp_watchdog(struct fxp_softc *sc);
 static void		fxp_add_rfabuf(struct fxp_softc *sc,
@@ -254,11 +254,11 @@ static void		fxp_read_eeprom(struct fxp_
 			    int offset, int words);
 static void		fxp_write_eeprom(struct fxp_softc *sc, u_short *data,
 			    int offset, int words);
-static int		fxp_ifmedia_upd(struct ifnet *ifp);
-static void		fxp_ifmedia_sts(struct ifnet *ifp,
+static int		fxp_ifmedia_upd(if_t ifp);
+static void		fxp_ifmedia_sts(if_t ifp,
 			    struct ifmediareq *ifmr);
-static int		fxp_serial_ifmedia_upd(struct ifnet *ifp);
-static void		fxp_serial_ifmedia_sts(struct ifnet *ifp,
+static int		fxp_serial_ifmedia_upd(if_t ifp);
+static void		fxp_serial_ifmedia_sts(if_t ifp,
 			    struct ifmediareq *ifmr);
 static int		fxp_miibus_readreg(device_t dev, int phy, int reg);
 static int		fxp_miibus_writereg(device_t dev, int phy, int reg,
@@ -427,7 +427,7 @@ fxp_attach(device_t dev)
 	struct fxp_cb_tx *tcbp;
 	struct fxp_tx *txp;
 	struct fxp_rx *rxp;
-	struct ifnet *ifp;
+	if_t ifp;
 	uint32_t val;
 	uint16_t data;
 	u_char eaddr[ETHER_ADDR_LEN];
@@ -439,11 +439,11 @@ fxp_attach(device_t dev)
 	mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
 	    MTX_DEF);
 	callout_init_mtx(&sc->stat_ch, &sc->sc_mtx, 0);
-	ifmedia_init(&sc->sc_media, 0, fxp_serial_ifmedia_upd,
+	ifmedia_init_drv(&sc->sc_media, 0, fxp_serial_ifmedia_upd,
 	    fxp_serial_ifmedia_sts);
 
-	ifp = sc->ifp = if_alloc(IFT_ETHER);
-	if (ifp == NULL) {
+	ifp = sc->ifp = if_gethandle(IFT_ETHER);
+	if (ifp == (void *)NULL) {
 		device_printf(dev, "can not if_alloc()\n");
 		error = ENOSPC;
 		goto fail;
@@ -827,73 +827,75 @@ fxp_attach(device_t dev)
 		flags = MIIF_NOISOLATE;
 		if (sc->revision >= FXP_REV_82558_A4)
 			flags |= MIIF_DOPAUSE;
-		error = mii_attach(dev, &sc->miibus, ifp, fxp_ifmedia_upd,
-		    fxp_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY,
-		    MII_OFFSET_ANY, flags);
+		error = mii_attach(dev, &sc->miibus, ifp,
+		    (ifm_change_cb_t)fxp_ifmedia_upd,
+		    (ifm_stat_cb_t)fxp_ifmedia_sts, BMSR_DEFCAPMASK,
+		    MII_PHY_ANY, MII_OFFSET_ANY, flags);
 		if (error != 0) {
 			device_printf(dev, "attaching PHYs failed\n");
 			goto fail;
 		}
 	}
 
-	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
-	ifp->if_init = fxp_init;
-	ifp->if_softc = sc;
-	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
-	ifp->if_ioctl = fxp_ioctl;
-	ifp->if_start = fxp_start;
+	if_initname_drv(ifp, device_get_name(dev), device_get_unit(dev));
+	if_setdev(ifp, dev);
+	if_setinitfn(ifp, fxp_init);
+	if_setsoftc(ifp, sc);
+	if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
+	if_setioctlfn(ifp, fxp_ioctl);
+	if_setstartfn(ifp, fxp_start);
 
-	ifp->if_capabilities = ifp->if_capenable = 0;
+	if_setcapabilities(ifp, 0);
+	if_setcapenable(ifp, 0);
 
 	/* Enable checksum offload/TSO for 82550 or better chips */
 	if (sc->flags & FXP_FLAG_EXT_RFA) {
-		ifp->if_hwassist = FXP_CSUM_FEATURES | CSUM_TSO;
-		ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO4;
-		ifp->if_capenable |= IFCAP_HWCSUM | IFCAP_TSO4;
+		if_sethwassist(ifp, FXP_CSUM_FEATURES | CSUM_TSO);
+		if_setcapabilitiesbit(ifp, IFCAP_HWCSUM | IFCAP_TSO4, 0);
+		if_setcapenablebit(ifp, IFCAP_HWCSUM | IFCAP_TSO4, 0);
 	}
 
 	if (sc->flags & FXP_FLAG_82559_RXCSUM) {
-		ifp->if_capabilities |= IFCAP_RXCSUM;
-		ifp->if_capenable |= IFCAP_RXCSUM;
+		if_setcapabilitiesbit(ifp, IFCAP_RXCSUM, 0);
+		if_setcapenablebit(ifp, IFCAP_RXCSUM, 0);
 	}
 
 	if (sc->flags & FXP_FLAG_WOLCAP) {
-		ifp->if_capabilities |= IFCAP_WOL_MAGIC;
-		ifp->if_capenable |= IFCAP_WOL_MAGIC;
+		if_setcapabilitiesbit(ifp, IFCAP_WOL_MAGIC, 0);
+		if_setcapenablebit(ifp, IFCAP_WOL_MAGIC, 0);
 	}
 
 #ifdef DEVICE_POLLING
 	/* Inform the world we support polling. */
-	ifp->if_capabilities |= IFCAP_POLLING;
+	if_setcapabilitiesbit(ifp, IFCAP_POLLING, 0);
 #endif
 
 	/*
 	 * Attach the interface.
 	 */
-	ether_ifattach(ifp, eaddr);
+	ether_ifattach_drv(ifp, eaddr);
 
 	/*
 	 * Tell the upper layer(s) we support long frames.
 	 * Must appear after the call to ether_ifattach() because
 	 * ether_ifattach() sets ifi_hdrlen to the default value.
 	 */
-	ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
-	ifp->if_capabilities |= IFCAP_VLAN_MTU;
-	ifp->if_capenable |= IFCAP_VLAN_MTU; /* the hw bits already set */
+	if_setifheaderlen(ifp, sizeof(struct ether_vlan_header));
+	if_setcapabilitiesbit(ifp, IFCAP_VLAN_MTU, 0);
+	if_setcapenablebit(ifp, IFCAP_VLAN_MTU, 0);
 	if ((sc->flags & FXP_FLAG_EXT_RFA) != 0) {
-		ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING |
-		    IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO;
-		ifp->if_capenable |= IFCAP_VLAN_HWTAGGING |
-		    IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO;
+		if_setcapabilitiesbit(ifp, IFCAP_VLAN_HWTAGGING |
+		    IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO, 0);
+		if_setcapenablebit(ifp, IFCAP_VLAN_HWTAGGING |
+		    IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO, 0);
 	}
 
 	/*
 	 * Let the system queue as many packets as we have available
 	 * TX descriptors.
 	 */
-	IFQ_SET_MAXLEN(&ifp->if_snd, FXP_NTXCB - 1);
-	ifp->if_snd.ifq_drv_maxlen = FXP_NTXCB - 1;
-	IFQ_SET_READY(&ifp->if_snd);
+	if_setsendqlen(ifp, FXP_NTXCB - 1);
+	if_setsendqready(ifp);
 
 	/*
 	 * Hook our interrupt after all initialization is complete.
@@ -902,7 +904,7 @@ fxp_attach(device_t dev)
 			       NULL, fxp_intr, sc, &sc->ih);
 	if (error) {
 		device_printf(dev, "could not setup irq\n");
-		ether_ifdetach(sc->ifp);
+		ether_ifdetach_drv(sc->ifp);
 		goto fail;
 	}
 
@@ -991,7 +993,7 @@ fxp_release(struct fxp_softc *sc)
 	if (sc->mcs_tag)
 		bus_dma_tag_destroy(sc->mcs_tag);
 	if (sc->ifp)
-		if_free(sc->ifp);
+		if_free_drv(sc->ifp);
 
 	mtx_destroy(&sc->sc_mtx);
 }
@@ -1005,8 +1007,8 @@ fxp_detach(device_t dev)
 	struct fxp_softc *sc = device_get_softc(dev);
 
 #ifdef DEVICE_POLLING
-	if (sc->ifp->if_capenable & IFCAP_POLLING)
-		ether_poll_deregister(sc->ifp);
+	if (if_getcapenable(sc->ifp) & IFCAP_POLLING)
+		ether_poll_deregister_drv(sc->ifp);
 #endif
 
 	FXP_LOCK(sc);
@@ -1021,7 +1023,7 @@ fxp_detach(device_t dev)
 	/*
 	 * Close down routes etc.
 	 */
-	ether_ifdetach(sc->ifp);
+	ether_ifdetach_drv(sc->ifp);
 
 	/*
 	 * Unhook interrupt before dropping lock. This is to prevent
@@ -1061,7 +1063,7 @@ static int
 fxp_suspend(device_t dev)
 {
 	struct fxp_softc *sc = device_get_softc(dev);
-	struct ifnet *ifp;
+	if_t ifp;
 	int pmc;
 	uint16_t pmstat;
 
@@ -1071,12 +1073,12 @@ fxp_suspend(device_t dev)
 	if (pci_find_cap(sc->dev, PCIY_PMG, &pmc) == 0) {
 		pmstat = pci_read_config(sc->dev, pmc + PCIR_POWER_STATUS, 2);
 		pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE);
-		if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0) {
+		if ((if_getcapenable(ifp) & IFCAP_WOL_MAGIC) != 0) {
 			/* Request PME. */
 			pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
 			sc->flags |= FXP_FLAG_WOL;
 			/* Reconfigure hardware to accept magic frames. */
-			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+			if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 			fxp_init_body(sc, 0);
 		}
 		pci_write_config(sc->dev, pmc + PCIR_POWER_STATUS, pmstat, 2);
@@ -1097,7 +1099,7 @@ static int
 fxp_resume(device_t dev)
 {
 	struct fxp_softc *sc = device_get_softc(dev);
-	struct ifnet *ifp = sc->ifp;
+	if_t ifp = sc->ifp;
 	int pmc;
 	uint16_t pmstat;
 
@@ -1118,7 +1120,7 @@ fxp_resume(device_t dev)
 	DELAY(10);
 
 	/* reinitialize interface if necessary */
-	if (ifp->if_flags & IFF_UP)
+	if (if_getflags(ifp) & IFF_UP)
 		fxp_init_body(sc, 1);
 
 	sc->suspended = 0;
@@ -1323,9 +1325,9 @@ fxp_load_eeprom(struct fxp_softc *sc)
  * Grab the softc lock and call the real fxp_start_body() routine
  */
 static void
-fxp_start(struct ifnet *ifp)
+fxp_start(if_t ifp)
 {
-	struct fxp_softc *sc = ifp->if_softc;
+	struct fxp_softc *sc = if_getsoftc(ifp);
 
 	FXP_LOCK(sc);
 	fxp_start_body(ifp);
@@ -1338,15 +1340,15 @@ fxp_start(struct ifnet *ifp)
  * internal entry point only.
  */
 static void
-fxp_start_body(struct ifnet *ifp)
+fxp_start_body(if_t ifp)
 {
-	struct fxp_softc *sc = ifp->if_softc;
+	struct fxp_softc *sc = if_getsoftc(ifp);
 	struct mbuf *mb_head;
 	int txqueued;
 
 	FXP_LOCK_ASSERT(sc, MA_OWNED);
 
-	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
 	    IFF_DRV_RUNNING)
 		return;
 
@@ -1359,27 +1361,26 @@ fxp_start_body(struct ifnet *ifp)
 	 *       a NOP command when needed.
 	 */
 	txqueued = 0;
-	while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd) &&
-	    sc->tx_queued < FXP_NTXCB - 1) {
+	while (!if_sendq_empty(ifp) && sc->tx_queued < FXP_NTXCB - 1) {
 
 		/*
 		 * Grab a packet to transmit.
 		 */
-		IFQ_DRV_DEQUEUE(&ifp->if_snd, mb_head);
+		mb_head = if_dequeue(ifp);
 		if (mb_head == NULL)
 			break;
 
 		if (fxp_encap(sc, &mb_head)) {
 			if (mb_head == NULL)
 				break;
-			IFQ_DRV_PREPEND(&ifp->if_snd, mb_head);
-			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+			if_sendq_prepend(ifp, mb_head);
+			if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
 		}
 		txqueued++;
 		/*
 		 * Pass packet to bpf if there is a listener.
 		 */
-		BPF_MTAP(ifp, mb_head);
+		if_bpfmtap(ifp, mb_head);
 	}
 
 	/*
@@ -1402,7 +1403,7 @@ fxp_start_body(struct ifnet *ifp)
 static int
 fxp_encap(struct fxp_softc *sc, struct mbuf **m_head)
 {
-	struct ifnet *ifp;
+	if_t ifp;
 	struct mbuf *m;
 	struct fxp_tx *txp;
 	struct fxp_cb_tx *cbp;
@@ -1669,17 +1670,17 @@ fxp_encap(struct fxp_softc *sc, struct m
 }
 
 #ifdef DEVICE_POLLING
-static poll_handler_t fxp_poll;
+static poll_handler_drv_t fxp_poll;
 
 static int
-fxp_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+fxp_poll(if_t ifp, enum poll_cmd cmd, int count)
 {
-	struct fxp_softc *sc = ifp->if_softc;
+	struct fxp_softc *sc = if_getsoftc(ifp);
 	uint8_t statack;
 	int rx_npkts = 0;
 
 	FXP_LOCK(sc);
-	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+	if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING)) {
 		FXP_UNLOCK(sc);
 		return (rx_npkts);
 	}
@@ -1713,7 +1714,7 @@ static void
 fxp_intr(void *xsc)
 {
 	struct fxp_softc *sc = xsc;
-	struct ifnet *ifp = sc->ifp;
+	if_t ifp = sc->ifp;
 	uint8_t statack;
 
 	FXP_LOCK(sc);
@@ -1723,7 +1724,7 @@ fxp_intr(void *xsc)
 	}
 
 #ifdef DEVICE_POLLING
-	if (ifp->if_capenable & IFCAP_POLLING) {
+	if (if_getcapenable(ifp) & IFCAP_POLLING) {
 		FXP_UNLOCK(sc);
 		return;
 	}
@@ -1744,7 +1745,7 @@ fxp_intr(void *xsc)
 		 * First ACK all the interrupts in this pass.
 		 */
 		CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack);
-		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+		if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
 			fxp_intr_body(sc, ifp, statack, -1);
 	}
 	FXP_UNLOCK(sc);
@@ -1753,7 +1754,7 @@ fxp_intr(void *xsc)
 static void
 fxp_txeof(struct fxp_softc *sc)
 {
-	struct ifnet *ifp;
+	if_t ifp;
 	struct fxp_tx *txp;
 
 	ifp = sc->ifp;
@@ -1772,7 +1773,7 @@ fxp_txeof(struct fxp_softc *sc)
 			txp->tx_cb->tbd[0].tb_addr = 0;
 		}
 		sc->tx_queued--;
-		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+		if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
 	}
 	sc->fxp_desc.tx_first = txp;
 	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map,
@@ -1782,7 +1783,7 @@ fxp_txeof(struct fxp_softc *sc)
 }
 
 static void
-fxp_rxcsum(struct fxp_softc *sc, struct ifnet *ifp, struct mbuf *m,
+fxp_rxcsum(struct fxp_softc *sc, if_t ifp, struct mbuf *m,
     uint16_t status, int pos)
 {
 	struct ether_header *eh;
@@ -1860,7 +1861,7 @@ fxp_rxcsum(struct fxp_softc *sc, struct 
 }
 
 static int
-fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack,
+fxp_intr_body(struct fxp_softc *sc, if_t ifp, uint8_t statack,
     int count)
 {
 	struct mbuf *m;
@@ -1902,7 +1903,7 @@ fxp_intr_body(struct fxp_softc *sc, stru
 	/*
 	 * Try to start more packets transmitting.
 	 */
-	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+	if (!if_sendq_empty(ifp))
 		fxp_start_body(ifp);
 
 	/*
@@ -1969,7 +1970,7 @@ fxp_intr_body(struct fxp_softc *sc, stru
 			 */
 			total_len = le16toh(rfa->actual_size) & 0x3fff;
 			if ((sc->flags & FXP_FLAG_82559_RXCSUM) != 0 &&
-			    (ifp->if_capenable & IFCAP_RXCSUM) != 0) {
+			    (if_getcapenable(ifp) & IFCAP_RXCSUM) != 0) {
 				/* Adjust for appended checksum bytes. */
 				total_len -= 2;
 			}
@@ -1984,12 +1985,12 @@ fxp_intr_body(struct fxp_softc *sc, stru
 			}
 
 			m->m_pkthdr.len = m->m_len = total_len;
-			m->m_pkthdr.rcvif = ifp;
+			if_setrcvif(m, ifp);
 
                         /* Do IP checksum checking. */
-			if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
+			if ((if_getcapenable(ifp) & IFCAP_RXCSUM) != 0)
 				fxp_rxcsum(sc, ifp, m, status, total_len);
-			if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
+			if ((if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0 &&
 			    (status & FXP_RFA_STATUS_VLAN) != 0) {
 				m->m_pkthdr.ether_vtag =
 				    ntohs(rfa->rfax_vlan_id);
@@ -2004,14 +2005,14 @@ fxp_intr_body(struct fxp_softc *sc, stru
 			 * calling if_input() on each one.
 			 */
 			FXP_UNLOCK(sc);
-			(*ifp->if_input)(ifp, m);
+			if_input(ifp, m);
 			FXP_LOCK(sc);
 			rx_npkts++;
-			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+			if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
 				return (rx_npkts);
 		} else {
 			/* Reuse RFA and loaded DMA map. */
-			ifp->if_iqdrops++;
+			if_inciqdrops(ifp, 1);
 			fxp_discard_rfabuf(sc, rxp);
 		}
 		fxp_add_rfabuf(sc, rxp);
@@ -2028,7 +2029,7 @@ fxp_intr_body(struct fxp_softc *sc, stru
 static void
 fxp_update_stats(struct fxp_softc *sc)
 {
-	struct ifnet *ifp = sc->ifp;
+	if_t ifp = sc->ifp;
 	struct fxp_stats *sp = sc->fxp_stats;
 	struct fxp_hwstats *hsp;
 	uint32_t *status;
@@ -2069,10 +2070,10 @@ fxp_update_stats(struct fxp_softc *sc)
 		hsp->tx_tco += le16toh(sp->tx_tco);
 		hsp->rx_tco += le16toh(sp->rx_tco);
 
-		ifp->if_opackets += le32toh(sp->tx_good);
-		ifp->if_collisions += le32toh(sp->tx_total_collisions);
+		if_incopackets(ifp, le32toh(sp->tx_good));
+		if_inccollisions(ifp, le32toh(sp->tx_total_collisions));
 		if (sp->rx_good) {
-			ifp->if_ipackets += le32toh(sp->rx_good);
+			if_incipackets(ifp, le32toh(sp->rx_good));
 			sc->rx_idle_secs = 0;
 		} else if (sc->flags & FXP_FLAG_RXBUG) {
 			/*
@@ -2080,17 +2081,17 @@ fxp_update_stats(struct fxp_softc *sc)
 			 */
 			sc->rx_idle_secs++;
 		}
-		ifp->if_ierrors +=
+		if_incierrors(ifp,
 		    le32toh(sp->rx_crc_errors) +
 		    le32toh(sp->rx_alignment_errors) +
 		    le32toh(sp->rx_rnr_errors) +
-		    le32toh(sp->rx_overrun_errors);
+		    le32toh(sp->rx_overrun_errors));
 		/*
 		 * If any transmit underruns occured, bump up the transmit
 		 * threshold by another 512 bytes (64 * 8).
 		 */
 		if (sp->tx_underruns) {
-			ifp->if_oerrors += le32toh(sp->tx_underruns);
+			if_incoerrors(ifp, le32toh(sp->tx_underruns));
 			if (tx_threshold < 192)
 				tx_threshold += 64;
 		}
@@ -2115,7 +2116,7 @@ static void
 fxp_tick(void *xsc)
 {
 	struct fxp_softc *sc = xsc;
-	struct ifnet *ifp = sc->ifp;
+	if_t ifp = sc->ifp;
 
 	FXP_LOCK_ASSERT(sc, MA_OWNED);
 
@@ -2143,8 +2144,8 @@ fxp_tick(void *xsc)
 	 */
 	if (sc->rx_idle_secs > FXP_MAX_RX_IDLE) {
 		sc->rx_idle_secs = 0;
-		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
-			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+		if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
+			if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 			fxp_init_body(sc, 1);
 		}
 		return;
@@ -2180,11 +2181,11 @@ fxp_tick(void *xsc)
 static void
 fxp_stop(struct fxp_softc *sc)
 {
-	struct ifnet *ifp = sc->ifp;
+	if_t ifp = sc->ifp;
 	struct fxp_tx *txp;
 	int i;
 
-	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+	if_setdrvflagbits(ifp, 0, (IFF_DRV_RUNNING | IFF_DRV_OACTIVE));
 	sc->watchdog_timer = 0;
 
 	/*
@@ -2235,6 +2236,7 @@ fxp_stop(struct fxp_softc *sc)
 static void
 fxp_watchdog(struct fxp_softc *sc)
 {
+	if_t ifp = sc->ifp;
 
 	FXP_LOCK_ASSERT(sc, MA_OWNED);
 
@@ -2242,9 +2244,9 @@ fxp_watchdog(struct fxp_softc *sc)
 		return;
 
 	device_printf(sc->dev, "device timeout\n");
-	sc->ifp->if_oerrors++;
+	if_incoerrors(ifp, 1);
 
-	sc->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+	if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 	fxp_init_body(sc, 1);
 }
 
@@ -2270,7 +2272,7 @@ fxp_init(void *xsc)
 static void
 fxp_init_body(struct fxp_softc *sc, int setmedia)
 {
-	struct ifnet *ifp = sc->ifp;
+	if_t ifp = sc->ifp;
 	struct mii_data *mii;
 	struct fxp_cb_config *cbp;
 	struct fxp_cb_ias *cb_ias;
@@ -2280,7 +2282,7 @@ fxp_init_body(struct fxp_softc *sc, int 
 
 	FXP_LOCK_ASSERT(sc, MA_OWNED);
 
-	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+	if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
 		return;
 
 	/*
@@ -2295,7 +2297,7 @@ fxp_init_body(struct fxp_softc *sc, int 
 	CSR_WRITE_4(sc, FXP_CSR_PORT, FXP_PORT_SOFTWARE_RESET);
 	DELAY(50);
 
-	prm = (ifp->if_flags & IFF_PROMISC) ? 1 : 0;
+	prm = (if_getflags(ifp) & IFF_PROMISC) ? 1 : 0;
 
 	/*
 	 * Initialize base of CBL and RFA memory. Loading with zero
@@ -2322,7 +2324,7 @@ fxp_init_body(struct fxp_softc *sc, int 
 	 * For ICH based controllers do not load microcode.
 	 */
 	if (sc->ident->ich == 0) {
-		if (ifp->if_flags & IFF_LINK0 &&
+		if (if_getflags(ifp) & IFF_LINK0 &&
 		    (sc->flags & FXP_FLAG_UCODE) == 0)
 			fxp_load_ucode(sc);
 	}
@@ -2378,7 +2380,7 @@ fxp_init_body(struct fxp_softc *sc, int 
 	cbp->mediatype =	sc->flags & FXP_FLAG_SERIAL_MEDIA ? 0 : 1;
 	cbp->csma_dis =		0;	/* (don't) disable link */
 	cbp->tcp_udp_cksum =	((sc->flags & FXP_FLAG_82559_RXCSUM) != 0 &&
-	    (ifp->if_capenable & IFCAP_RXCSUM) != 0) ? 1 : 0;
+	    (if_getcapenable(ifp) & IFCAP_RXCSUM) != 0) ? 1 : 0;
 	cbp->vlan_tco =		0;	/* (don't) enable vlan wakeup */
 	cbp->link_wake_en =	0;	/* (don't) assert PME# on link change */
 	cbp->arp_wake_en =	0;	/* (don't) assert PME# on arp */
@@ -2405,10 +2407,10 @@ fxp_init_body(struct fxp_softc *sc, int 
 	cbp->force_fdx =	0;	/* (don't) force full duplex */
 	cbp->fdx_pin_en =	1;	/* (enable) FDX# pin */
 	cbp->multi_ia =		0;	/* (don't) accept multiple IAs */
-	cbp->mc_all =		ifp->if_flags & IFF_ALLMULTI ? 1 : prm;
+	cbp->mc_all =		if_getflags(ifp) & IFF_ALLMULTI ? 1 : prm;
 	cbp->gamla_rx =		sc->flags & FXP_FLAG_EXT_RFA ? 1 : 0;
 	cbp->vlan_strip_en =	((sc->flags & FXP_FLAG_EXT_RFA) != 0 &&
-	    (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) ? 1 : 0;
+	    (if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0) ? 1 : 0;
 
 	if (sc->revision == FXP_REV_82557) {
 		/*
@@ -2487,7 +2489,7 @@ fxp_init_body(struct fxp_softc *sc, int 
 	cb_ias->cb_status = 0;
 	cb_ias->cb_command = htole16(FXP_CB_COMMAND_IAS | FXP_CB_COMMAND_EL);
 	cb_ias->link_addr = 0xffffffff;
-	bcopy(IF_LLADDR(sc->ifp), cb_ias->macaddr, ETHER_ADDR_LEN);
+	bcopy(if_getlladdr(sc->ifp), cb_ias->macaddr, ETHER_ADDR_LEN);
 
 	/*
 	 * Start the IAS (Individual Address Setup) command/DMA.
@@ -2549,8 +2551,7 @@ fxp_init_body(struct fxp_softc *sc, int 
 	if (sc->miibus != NULL && setmedia != 0)
 		mii_mediachg(device_get_softc(sc->miibus));
 
-	ifp->if_drv_flags |= IFF_DRV_RUNNING;
-	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+	if_setdrvflagbits(ifp, IFF_DRV_RUNNING, IFF_DRV_OACTIVE);
 
 	/*
 	 * Enable interrupts.
@@ -2560,7 +2561,7 @@ fxp_init_body(struct fxp_softc *sc, int 
 	 * ... but only do that if we are not polling. And because (presumably)
 	 * the default is interrupts on, we need to disable them explicitly!
 	 */
-	if (ifp->if_capenable & IFCAP_POLLING )
+	if (if_getcapenable(ifp) & IFCAP_POLLING )
 		CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE);
 	else
 #endif /* DEVICE_POLLING */
@@ -2573,14 +2574,14 @@ fxp_init_body(struct fxp_softc *sc, int 
 }
 
 static int
-fxp_serial_ifmedia_upd(struct ifnet *ifp)
+fxp_serial_ifmedia_upd(if_t ifp)
 {
 
 	return (0);
 }
 
 static void
-fxp_serial_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
+fxp_serial_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr)
 {
 
 	ifmr->ifm_active = IFM_ETHER|IFM_MANUAL;
@@ -2590,9 +2591,9 @@ fxp_serial_ifmedia_sts(struct ifnet *ifp
  * Change media according to request.
  */
 static int
-fxp_ifmedia_upd(struct ifnet *ifp)
+fxp_ifmedia_upd(if_t ifp)
 {
-	struct fxp_softc *sc = ifp->if_softc;
+	struct fxp_softc *sc = if_getsoftc(ifp);
 	struct mii_data *mii;
 	struct mii_softc	*miisc;
 
@@ -2609,9 +2610,9 @@ fxp_ifmedia_upd(struct ifnet *ifp)
  * Notify the world which media we're using.
  */
 static void
-fxp_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
+fxp_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr)
 {
-	struct fxp_softc *sc = ifp->if_softc;
+	struct fxp_softc *sc = if_getsoftc(ifp);
 	struct mii_data *mii;
 
 	mii = device_get_softc(sc->miibus);
@@ -2800,13 +2801,13 @@ fxp_miibus_statchg(device_t dev)
 {
 	struct fxp_softc *sc;
 	struct mii_data *mii;
-	struct ifnet *ifp;
+	if_t ifp;
 
 	sc = device_get_softc(dev);
 	mii = device_get_softc(sc->miibus);
 	ifp = sc->ifp;
-	if (mii == NULL || ifp == NULL ||
-	    (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 ||
+	if (mii == NULL || ifp == (void *)NULL ||
+	    (if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0 ||
 	    (mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) !=
 	    (IFM_AVALID | IFM_ACTIVE))
 		return;
@@ -2822,14 +2823,14 @@ fxp_miibus_statchg(device_t dev)
 	 */
 	if (sc->revision == FXP_REV_82557)
 		return;
-	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+	if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 	fxp_init_body(sc, 0);
 }
 
 static int
-fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
+fxp_ioctl(if_t ifp, u_long command, caddr_t data)
 {
-	struct fxp_softc *sc = ifp->if_softc;
+	struct fxp_softc *sc = if_getsoftc(ifp);
 	struct ifreq *ifr = (struct ifreq *)data;
 	struct mii_data *mii;
 	int flag, mask, error = 0, reinit;
@@ -2843,27 +2844,27 @@ fxp_ioctl(struct ifnet *ifp, u_long comm
 		 * XXX If it's up then re-initialize it. This is so flags
 		 * such as IFF_PROMISC are handled.
 		 */
-		if (ifp->if_flags & IFF_UP) {
-			if (((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) &&
-			    ((ifp->if_flags ^ sc->if_flags) &
+		if (if_getflags(ifp) & IFF_UP) {
+			if (((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) &&
+			    ((if_getflags(ifp) ^ sc->if_flags) &
 			    (IFF_PROMISC | IFF_ALLMULTI | IFF_LINK0)) != 0) {
-				ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+				if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 				fxp_init_body(sc, 0);
-			} else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+			} else if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
 				fxp_init_body(sc, 1);
 		} else {
-			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+			if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
 				fxp_stop(sc);
 		}
-		sc->if_flags = ifp->if_flags;
+		sc->if_flags = if_getflags(ifp);
 		FXP_UNLOCK(sc);
 		break;
 
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 		FXP_LOCK(sc);
-		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
-			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+		if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
+			if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 			fxp_init_body(sc, 0);
 		}
 		FXP_UNLOCK(sc);
@@ -2873,98 +2874,99 @@ fxp_ioctl(struct ifnet *ifp, u_long comm
 	case SIOCGIFMEDIA:
 		if (sc->miibus != NULL) {
 			mii = device_get_softc(sc->miibus);
-                        error = ifmedia_ioctl(ifp, ifr,
+                        error = ifmedia_ioctl_drv(ifp, ifr,
                             &mii->mii_media, command);
 		} else {
-                        error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, command);
+                        error = ifmedia_ioctl_drv(ifp, ifr, &sc->sc_media, command);
 		}
 		break;
 
 	case SIOCSIFCAP:
 		reinit = 0;
-		mask = ifp->if_capenable ^ ifr->ifr_reqcap;
+		mask = if_getcapenable(ifp) ^ ifr->ifr_reqcap;
 #ifdef DEVICE_POLLING
 		if (mask & IFCAP_POLLING) {
 			if (ifr->ifr_reqcap & IFCAP_POLLING) {
-				error = ether_poll_register(fxp_poll, ifp);
+				error = ether_poll_register_drv(fxp_poll, ifp);
 				if (error)
 					return(error);
 				FXP_LOCK(sc);
 				CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL,
 				    FXP_SCB_INTR_DISABLE);
-				ifp->if_capenable |= IFCAP_POLLING;
+				if_setcapenablebit(ifp, IFCAP_POLLING, 0);
 				FXP_UNLOCK(sc);
 			} else {
-				error = ether_poll_deregister(ifp);
+				error = ether_poll_deregister_drv(ifp);
 				/* Enable interrupts in any case */
 				FXP_LOCK(sc);
 				CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, 0);
-				ifp->if_capenable &= ~IFCAP_POLLING;
+				if_setcapenablebit(ifp, 0, IFCAP_POLLING);
 				FXP_UNLOCK(sc);
 			}
 		}
 #endif
 		FXP_LOCK(sc);
 		if ((mask & IFCAP_TXCSUM) != 0 &&
-		    (ifp->if_capabilities & IFCAP_TXCSUM) != 0) {
-			ifp->if_capenable ^= IFCAP_TXCSUM;
-			if ((ifp->if_capenable & IFCAP_TXCSUM) != 0)
-				ifp->if_hwassist |= FXP_CSUM_FEATURES;
+		    (if_getcapabilities(ifp) & IFCAP_TXCSUM) != 0) {
+			if_togglecapenable(ifp, IFCAP_TXCSUM);
+			if ((if_getcapenable(ifp) & IFCAP_TXCSUM) != 0)
+				if_sethwassistbits(ifp, FXP_CSUM_FEATURES, 0);
 			else
-				ifp->if_hwassist &= ~FXP_CSUM_FEATURES;
+				if_sethwassistbits(ifp, 0, FXP_CSUM_FEATURES);
 		}
 		if ((mask & IFCAP_RXCSUM) != 0 &&
-		    (ifp->if_capabilities & IFCAP_RXCSUM) != 0) {
-			ifp->if_capenable ^= IFCAP_RXCSUM;
+		    (if_getcapabilities(ifp) & IFCAP_RXCSUM) != 0) {
+			if_togglecapenable(ifp, IFCAP_RXCSUM);
 			if ((sc->flags & FXP_FLAG_82559_RXCSUM) != 0)
 				reinit++;
 		}
 		if ((mask & IFCAP_TSO4) != 0 &&
-		    (ifp->if_capabilities & IFCAP_TSO4) != 0) {
-			ifp->if_capenable ^= IFCAP_TSO4;
-			if ((ifp->if_capenable & IFCAP_TSO4) != 0)
-				ifp->if_hwassist |= CSUM_TSO;
+		    (if_getcapabilities(ifp) & IFCAP_TSO4) != 0) {
+			if_togglecapenable(ifp, IFCAP_TSO4);
+			if ((if_getcapenable(ifp) & IFCAP_TSO4) != 0)
+				if_sethwassistbits(ifp, CSUM_TSO, 0);
 			else
-				ifp->if_hwassist &= ~CSUM_TSO;
+				if_sethwassistbits(ifp, 0, CSUM_TSO);
 		}
 		if ((mask & IFCAP_WOL_MAGIC) != 0 &&
-		    (ifp->if_capabilities & IFCAP_WOL_MAGIC) != 0)
-			ifp->if_capenable ^= IFCAP_WOL_MAGIC;
+		    (if_getcapabilities(ifp) & IFCAP_WOL_MAGIC) != 0)
+			if_togglecapenable(ifp, IFCAP_WOL_MAGIC);
 		if ((mask & IFCAP_VLAN_MTU) != 0 &&
-		    (ifp->if_capabilities & IFCAP_VLAN_MTU) != 0) {
-			ifp->if_capenable ^= IFCAP_VLAN_MTU;
+		    (if_getcapabilities(ifp) & IFCAP_VLAN_MTU) != 0) {
+			if_togglecapenable(ifp, IFCAP_VLAN_MTU);
 			if (sc->revision != FXP_REV_82557)
 				flag = FXP_FLAG_LONG_PKT_EN;
 			else /* a hack to get long frames on the old chip */
 				flag = FXP_FLAG_SAVE_BAD;
 			sc->flags ^= flag;
-			if (ifp->if_flags & IFF_UP)
+			if (if_getflags(ifp) & IFF_UP)
 				reinit++;
 		}
 		if ((mask & IFCAP_VLAN_HWCSUM) != 0 &&
-		    (ifp->if_capabilities & IFCAP_VLAN_HWCSUM) != 0)
-			ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
+		    (if_getcapabilities(ifp) & IFCAP_VLAN_HWCSUM) != 0)
+			if_togglecapenable(ifp, IFCAP_VLAN_HWCSUM);
 		if ((mask & IFCAP_VLAN_HWTSO) != 0 &&
-		    (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0)
-			ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
+		    (if_getcapabilities(ifp) & IFCAP_VLAN_HWTSO) != 0)
+			if_togglecapenable(ifp, IFCAP_VLAN_HWTSO);
 		if ((mask & IFCAP_VLAN_HWTAGGING) != 0 &&
-		    (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) {
-			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
-			if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0)
-				ifp->if_capenable &=
-				    ~(IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM);
+		    (if_getcapabilities(ifp) & IFCAP_VLAN_HWTAGGING) != 0) {
+			if_togglecapenable(ifp, IFCAP_VLAN_HWTAGGING);
+			if ((if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) == 0)
+				if_setcapenablebit(ifp, 0, IFCAP_VLAN_HWTSO |
+				    IFCAP_VLAN_HWCSUM);
 			reinit++;
 		}
-		if (reinit > 0 && (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
-			ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+		if (reinit > 0 &&
+		    (if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
+			if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 			fxp_init_body(sc, 0);
 		}
 		FXP_UNLOCK(sc);
-		VLAN_CAPABILITIES(ifp);
+		if_vlancap(ifp);
 		break;
 
 	default:
-		error = ether_ioctl(ifp, command, data);
+		error = ether_ioctl_drv(ifp, command, data);
 	}
 	return (error);
 }
@@ -2976,24 +2978,15 @@ static int
 fxp_mc_addrs(struct fxp_softc *sc)
 {
 	struct fxp_cb_mcs *mcsp = sc->mcsp;
-	struct ifnet *ifp = sc->ifp;
-	struct ifmultiaddr *ifma;
-	int nmcasts;
+	if_t ifp = sc->ifp;
+	int nmcasts = 0;
 
-	nmcasts = 0;
-	if ((ifp->if_flags & IFF_ALLMULTI) == 0) {
+	if ((if_getflags(ifp) & IFF_ALLMULTI) == 0) {
 		if_maddr_rlock(ifp);
-		TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-			if (ifma->ifma_addr->sa_family != AF_LINK)
-				continue;
-			if (nmcasts >= MAXMCADDR) {
-				ifp->if_flags |= IFF_ALLMULTI;
-				nmcasts = 0;
-				break;
-			}
-			bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
-			    &sc->mcsp->mc_addr[nmcasts][0], ETHER_ADDR_LEN);
-			nmcasts++;
+		if_setupmultiaddr(ifp, mcsp->mc_addr, &nmcasts, MAXMCADDR);
+		if (nmcasts >= MAXMCADDR) {
+			if_setflagbits(ifp, IFF_ALLMULTI, 0);
+			nmcasts = 0;
 		}
 		if_maddr_runlock(ifp);
 	}

Modified: head/sys/dev/fxp/if_fxpvar.h
==============================================================================
--- head/sys/dev/fxp/if_fxpvar.h	Mon Jun  2 18:30:57 2014	(r266976)
+++ head/sys/dev/fxp/if_fxpvar.h	Mon Jun  2 18:45:36 2014	(r266977)
@@ -178,7 +178,7 @@ struct fxp_hwstats {
  *	 for functional grouping.
  */
 struct fxp_softc {
-	struct ifnet *ifp;		/* per-interface network data */
+	void *ifp;			/* per-interface network data */
 	struct resource	*fxp_res[2];	/* I/O and IRQ resources */
 	struct resource_spec *fxp_spec;	/* the resource spec we used */
 	void *ih;			/* interrupt handler cookie */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406021845.s52IjaR8062480>