diff options
Diffstat (limited to 'freebsd/sys/dev/fxp/if_fxp.c')
-rw-r--r-- | freebsd/sys/dev/fxp/if_fxp.c | 456 |
1 files changed, 227 insertions, 229 deletions
diff --git a/freebsd/sys/dev/fxp/if_fxp.c b/freebsd/sys/dev/fxp/if_fxp.c index 806163a2..b3d4fa15 100644 --- a/freebsd/sys/dev/fxp/if_fxp.c +++ b/freebsd/sys/dev/fxp/if_fxp.c @@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include <sys/kernel.h> #include <sys/mbuf.h> #include <rtems/bsd/sys/lock.h> +#include <sys/malloc.h> #include <sys/module.h> #include <sys/mutex.h> #include <sys/rman.h> @@ -57,6 +58,7 @@ __FBSDID("$FreeBSD$"); #include <net/bpf.h> #include <net/ethernet.h> #include <net/if.h> +#include <net/if_var.h> #include <net/if_arp.h> #include <net/if_dl.h> #include <net/if_media.h> @@ -158,52 +160,52 @@ static const u_char fxp_cb_config_template[] = { * them. */ static const struct fxp_ident fxp_ident_table[] = { - { 0x1029, -1, 0, "Intel 82559 PCI/CardBus Pro/100" }, - { 0x1030, -1, 0, "Intel 82559 Pro/100 Ethernet" }, - { 0x1031, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VE Ethernet" }, - { 0x1032, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VE Ethernet" }, - { 0x1033, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" }, - { 0x1034, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" }, - { 0x1035, -1, 3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" }, - { 0x1036, -1, 3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" }, - { 0x1037, -1, 3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" }, - { 0x1038, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" }, - { 0x1039, -1, 4, "Intel 82801DB (ICH4) Pro/100 VE Ethernet" }, - { 0x103A, -1, 4, "Intel 82801DB (ICH4) Pro/100 Ethernet" }, - { 0x103B, -1, 4, "Intel 82801DB (ICH4) Pro/100 VM Ethernet" }, - { 0x103C, -1, 4, "Intel 82801DB (ICH4) Pro/100 Ethernet" }, - { 0x103D, -1, 4, "Intel 82801DB (ICH4) Pro/100 VE Ethernet" }, - { 0x103E, -1, 4, "Intel 82801DB (ICH4) Pro/100 VM Ethernet" }, - { 0x1050, -1, 5, "Intel 82801BA (D865) Pro/100 VE Ethernet" }, - { 0x1051, -1, 5, "Intel 82562ET (ICH5/ICH5R) Pro/100 VE Ethernet" }, - { 0x1059, -1, 0, "Intel 82551QM Pro/100 M Mobile Connection" }, - { 0x1064, -1, 6, "Intel 82562EZ (ICH6)" }, - { 0x1065, -1, 6, "Intel 82562ET/EZ/GT/GZ PRO/100 VE Ethernet" }, - { 0x1068, -1, 6, "Intel 82801FBM (ICH6-M) Pro/100 VE Ethernet" }, - { 0x1069, -1, 6, "Intel 82562EM/EX/GX Pro/100 Ethernet" }, - { 0x1091, -1, 7, "Intel 82562GX Pro/100 Ethernet" }, - { 0x1092, -1, 7, "Intel Pro/100 VE Network Connection" }, - { 0x1093, -1, 7, "Intel Pro/100 VM Network Connection" }, - { 0x1094, -1, 7, "Intel Pro/100 946GZ (ICH7) Network Connection" }, - { 0x1209, -1, 0, "Intel 82559ER Embedded 10/100 Ethernet" }, - { 0x1229, 0x01, 0, "Intel 82557 Pro/100 Ethernet" }, - { 0x1229, 0x02, 0, "Intel 82557 Pro/100 Ethernet" }, - { 0x1229, 0x03, 0, "Intel 82557 Pro/100 Ethernet" }, - { 0x1229, 0x04, 0, "Intel 82558 Pro/100 Ethernet" }, - { 0x1229, 0x05, 0, "Intel 82558 Pro/100 Ethernet" }, - { 0x1229, 0x06, 0, "Intel 82559 Pro/100 Ethernet" }, - { 0x1229, 0x07, 0, "Intel 82559 Pro/100 Ethernet" }, - { 0x1229, 0x08, 0, "Intel 82559 Pro/100 Ethernet" }, - { 0x1229, 0x09, 0, "Intel 82559ER Pro/100 Ethernet" }, - { 0x1229, 0x0c, 0, "Intel 82550 Pro/100 Ethernet" }, - { 0x1229, 0x0d, 0, "Intel 82550C Pro/100 Ethernet" }, - { 0x1229, 0x0e, 0, "Intel 82550 Pro/100 Ethernet" }, - { 0x1229, 0x0f, 0, "Intel 82551 Pro/100 Ethernet" }, - { 0x1229, 0x10, 0, "Intel 82551 Pro/100 Ethernet" }, - { 0x1229, -1, 0, "Intel 82557/8/9 Pro/100 Ethernet" }, - { 0x2449, -1, 2, "Intel 82801BA/CAM (ICH2/3) Pro/100 Ethernet" }, - { 0x27dc, -1, 7, "Intel 82801GB (ICH7) 10/100 Ethernet" }, - { 0, -1, 0, NULL }, + { 0x8086, 0x1029, -1, 0, "Intel 82559 PCI/CardBus Pro/100" }, + { 0x8086, 0x1030, -1, 0, "Intel 82559 Pro/100 Ethernet" }, + { 0x8086, 0x1031, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VE Ethernet" }, + { 0x8086, 0x1032, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VE Ethernet" }, + { 0x8086, 0x1033, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" }, + { 0x8086, 0x1034, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" }, + { 0x8086, 0x1035, -1, 3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" }, + { 0x8086, 0x1036, -1, 3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" }, + { 0x8086, 0x1037, -1, 3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" }, + { 0x8086, 0x1038, -1, 3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" }, + { 0x8086, 0x1039, -1, 4, "Intel 82801DB (ICH4) Pro/100 VE Ethernet" }, + { 0x8086, 0x103A, -1, 4, "Intel 82801DB (ICH4) Pro/100 Ethernet" }, + { 0x8086, 0x103B, -1, 4, "Intel 82801DB (ICH4) Pro/100 VM Ethernet" }, + { 0x8086, 0x103C, -1, 4, "Intel 82801DB (ICH4) Pro/100 Ethernet" }, + { 0x8086, 0x103D, -1, 4, "Intel 82801DB (ICH4) Pro/100 VE Ethernet" }, + { 0x8086, 0x103E, -1, 4, "Intel 82801DB (ICH4) Pro/100 VM Ethernet" }, + { 0x8086, 0x1050, -1, 5, "Intel 82801BA (D865) Pro/100 VE Ethernet" }, + { 0x8086, 0x1051, -1, 5, "Intel 82562ET (ICH5/ICH5R) Pro/100 VE Ethernet" }, + { 0x8086, 0x1059, -1, 0, "Intel 82551QM Pro/100 M Mobile Connection" }, + { 0x8086, 0x1064, -1, 6, "Intel 82562EZ (ICH6)" }, + { 0x8086, 0x1065, -1, 6, "Intel 82562ET/EZ/GT/GZ PRO/100 VE Ethernet" }, + { 0x8086, 0x1068, -1, 6, "Intel 82801FBM (ICH6-M) Pro/100 VE Ethernet" }, + { 0x8086, 0x1069, -1, 6, "Intel 82562EM/EX/GX Pro/100 Ethernet" }, + { 0x8086, 0x1091, -1, 7, "Intel 82562GX Pro/100 Ethernet" }, + { 0x8086, 0x1092, -1, 7, "Intel Pro/100 VE Network Connection" }, + { 0x8086, 0x1093, -1, 7, "Intel Pro/100 VM Network Connection" }, + { 0x8086, 0x1094, -1, 7, "Intel Pro/100 946GZ (ICH7) Network Connection" }, + { 0x8086, 0x1209, -1, 0, "Intel 82559ER Embedded 10/100 Ethernet" }, + { 0x8086, 0x1229, 0x01, 0, "Intel 82557 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x02, 0, "Intel 82557 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x03, 0, "Intel 82557 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x04, 0, "Intel 82558 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x05, 0, "Intel 82558 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x06, 0, "Intel 82559 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x07, 0, "Intel 82559 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x08, 0, "Intel 82559 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x09, 0, "Intel 82559ER Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x0c, 0, "Intel 82550 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x0d, 0, "Intel 82550C Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x0e, 0, "Intel 82550 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x0f, 0, "Intel 82551 Pro/100 Ethernet" }, + { 0x8086, 0x1229, 0x10, 0, "Intel 82551 Pro/100 Ethernet" }, + { 0x8086, 0x1229, -1, 0, "Intel 82557/8/9 Pro/100 Ethernet" }, + { 0x8086, 0x2449, -1, 2, "Intel 82801BA/CAM (ICH2/3) Pro/100 Ethernet" }, + { 0x8086, 0x27dc, -1, 7, "Intel 82801GB (ICH7) 10/100 Ethernet" }, + { 0, 0, -1, 0, NULL }, }; #ifdef FXP_IP_CSUM_WAR @@ -221,20 +223,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, @@ -255,11 +257,11 @@ static void fxp_read_eeprom(struct fxp_softc *sc, u_short *data, 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, @@ -375,18 +377,18 @@ fxp_dma_wait(struct fxp_softc *sc, volatile uint16_t *status, static const struct fxp_ident * fxp_find_ident(device_t dev) { - uint16_t devid; + uint16_t vendor; + uint16_t device; uint8_t revid; const struct fxp_ident *ident; - if (pci_get_vendor(dev) == FXP_VENDORID_INTEL) { - devid = pci_get_device(dev); - revid = pci_get_revid(dev); - for (ident = fxp_ident_table; ident->name != NULL; ident++) { - if (ident->devid == devid && - (ident->revid == revid || ident->revid == -1)) { - return (ident); - } + vendor = pci_get_vendor(dev); + device = pci_get_device(dev); + revid = pci_get_revid(dev); + for (ident = fxp_ident_table; ident->name != NULL; ident++) { + if (ident->vendor == vendor && ident->device == device && + (ident->revid == revid || ident->revid == -1)) { + return (ident); } } return (NULL); @@ -428,7 +430,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]; @@ -443,8 +445,8 @@ fxp_attach(device_t dev) ifmedia_init(&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; @@ -629,7 +631,7 @@ fxp_attach(device_t dev) /* For 82559 or later chips, Rx checksum offload is supported. */ if (sc->revision >= FXP_REV_82559_A0) { /* 82559ER does not support Rx checksum offloading. */ - if (sc->ident->devid != 0x1209) + if (sc->ident->device != 0x1209) sc->flags |= FXP_FLAG_82559_RXCSUM; } /* @@ -828,9 +830,10 @@ 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; @@ -838,34 +841,36 @@ fxp_attach(device_t dev) } 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_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 /* @@ -878,23 +883,22 @@ fxp_attach(device_t dev) * 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. @@ -1006,7 +1010,7 @@ fxp_detach(device_t dev) struct fxp_softc *sc = device_get_softc(dev); #ifdef DEVICE_POLLING - if (sc->ifp->if_capenable & IFCAP_POLLING) + if (if_getcapenable(sc->ifp) & IFCAP_POLLING) ether_poll_deregister(sc->ifp); #endif @@ -1062,7 +1066,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; @@ -1072,12 +1076,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); @@ -1098,7 +1102,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; @@ -1119,7 +1123,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; @@ -1261,7 +1265,7 @@ fxp_eeprom_putword(struct fxp_softc *sc, int offset, uint16_t data) * * 559's can have either 64-word or 256-word EEPROMs, the 558 * datasheet only talks about 64-word EEPROMs, and the 557 datasheet - * talks about the existance of 16 to 256 word EEPROMs. + * talks about the existence of 16 to 256 word EEPROMs. * * The only known sizes are 64 and 256, where the 256 version is used * by CardBus cards to store CIS information. @@ -1324,9 +1328,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); @@ -1339,15 +1343,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; @@ -1360,27 +1364,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); } /* @@ -1403,7 +1406,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; @@ -1673,14 +1676,14 @@ fxp_encap(struct fxp_softc *sc, struct mbuf **m_head) static poll_handler_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); } @@ -1714,7 +1717,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); @@ -1724,7 +1727,7 @@ fxp_intr(void *xsc) } #ifdef DEVICE_POLLING - if (ifp->if_capenable & IFCAP_POLLING) { + if (if_getcapenable(ifp) & IFCAP_POLLING) { FXP_UNLOCK(sc); return; } @@ -1745,7 +1748,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); @@ -1754,7 +1757,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; @@ -1773,7 +1776,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, @@ -1783,7 +1786,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; @@ -1861,7 +1864,7 @@ fxp_rxcsum(struct fxp_softc *sc, struct ifnet *ifp, struct mbuf *m, } 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; @@ -1903,7 +1906,7 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, /* * Try to start more packets transmitting. */ - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if (!if_sendq_empty(ifp)) fxp_start_body(ifp); /* @@ -1970,7 +1973,7 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, */ 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; } @@ -1985,12 +1988,12 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, } 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); @@ -2005,14 +2008,14 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, * 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_inc_counter(ifp, IFCOUNTER_IQDROPS, 1); fxp_discard_rfabuf(sc, rxp); } fxp_add_rfabuf(sc, rxp); @@ -2029,7 +2032,7 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack, 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; @@ -2070,10 +2073,12 @@ 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_inc_counter(ifp, IFCOUNTER_OPACKETS, le32toh(sp->tx_good)); + if_inc_counter(ifp, IFCOUNTER_COLLISIONS, + le32toh(sp->tx_total_collisions)); if (sp->rx_good) { - ifp->if_ipackets += le32toh(sp->rx_good); + if_inc_counter(ifp, IFCOUNTER_IPACKETS, + le32toh(sp->rx_good)); sc->rx_idle_secs = 0; } else if (sc->flags & FXP_FLAG_RXBUG) { /* @@ -2081,17 +2086,18 @@ fxp_update_stats(struct fxp_softc *sc) */ sc->rx_idle_secs++; } - ifp->if_ierrors += + if_inc_counter(ifp, IFCOUNTER_IERRORS, 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 + * If any transmit underruns occurred, bump up the transmit * threshold by another 512 bytes (64 * 8). */ if (sp->tx_underruns) { - ifp->if_oerrors += le32toh(sp->tx_underruns); + if_inc_counter(ifp, IFCOUNTER_OERRORS, + le32toh(sp->tx_underruns)); if (tx_threshold < 192) tx_threshold += 64; } @@ -2116,7 +2122,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); @@ -2137,15 +2143,15 @@ fxp_tick(void *xsc) * then assume the receiver has locked up and attempt to clear * the condition by reprogramming the multicast filter. This is * a work-around for a bug in the 82557 where the receiver locks - * up if it gets certain types of garbage in the syncronization + * up if it gets certain types of garbage in the synchronization * bits prior to the packet header. This bug is supposed to only * occur in 10Mbps mode, but has been seen to occur in 100Mbps * mode as well (perhaps due to a 10/100 speed transition). */ 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; @@ -2181,11 +2187,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; /* @@ -2236,6 +2242,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); @@ -2243,9 +2250,9 @@ fxp_watchdog(struct fxp_softc *sc) return; device_printf(sc->dev, "device timeout\n"); - sc->ifp->if_oerrors++; + if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); - sc->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING); fxp_init_body(sc, 1); } @@ -2271,7 +2278,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; @@ -2281,7 +2288,7 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) FXP_LOCK_ASSERT(sc, MA_OWNED); - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) return; /* @@ -2296,7 +2303,7 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) 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 @@ -2323,7 +2330,7 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) * 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); } @@ -2379,7 +2386,7 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) 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 */ @@ -2406,10 +2413,10 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) 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) { /* @@ -2488,7 +2495,7 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) 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. @@ -2550,8 +2557,7 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) 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. @@ -2561,7 +2567,7 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) * ... 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 */ @@ -2574,14 +2580,14 @@ fxp_init_body(struct fxp_softc *sc, int setmedia) } 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; @@ -2591,11 +2597,11 @@ fxp_serial_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) * 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; + struct mii_softc *miisc; mii = device_get_softc(sc->miibus); FXP_LOCK(sc); @@ -2610,9 +2616,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); @@ -2801,13 +2807,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; @@ -2823,14 +2829,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; @@ -2844,27 +2850,27 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data) * 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); @@ -2883,7 +2889,7 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data) 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) { @@ -2893,75 +2899,76 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data) 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); /* 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: @@ -2977,24 +2984,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); } |