Mechanically convert sge(4) to IfAPI

Sponsored by:	Juniper Networks, Inc.
Differential Revision: https://reviews.freebsd.org/D37816
This commit is contained in:
Justin Hibbits 2022-08-17 16:14:43 -04:00
parent 5243641267
commit e948d066fa
2 changed files with 106 additions and 107 deletions

View File

@ -126,15 +126,15 @@ static void sge_rxeof(struct sge_softc *);
static void sge_txeof(struct sge_softc *); static void sge_txeof(struct sge_softc *);
static void sge_intr(void *); static void sge_intr(void *);
static void sge_tick(void *); static void sge_tick(void *);
static void sge_start(struct ifnet *); static void sge_start(if_t);
static void sge_start_locked(struct ifnet *); static void sge_start_locked(if_t);
static int sge_ioctl(struct ifnet *, u_long, caddr_t); static int sge_ioctl(if_t, u_long, caddr_t);
static void sge_init(void *); static void sge_init(void *);
static void sge_init_locked(struct sge_softc *); static void sge_init_locked(struct sge_softc *);
static void sge_stop(struct sge_softc *); static void sge_stop(struct sge_softc *);
static void sge_watchdog(struct sge_softc *); static void sge_watchdog(struct sge_softc *);
static int sge_ifmedia_upd(struct ifnet *); static int sge_ifmedia_upd(if_t);
static void sge_ifmedia_sts(struct ifnet *, struct ifmediareq *); static void sge_ifmedia_sts(if_t, struct ifmediareq *);
static int sge_get_mac_addr_apc(struct sge_softc *, uint8_t *); static int sge_get_mac_addr_apc(struct sge_softc *, uint8_t *);
static int sge_get_mac_addr_eeprom(struct sge_softc *, uint8_t *); static int sge_get_mac_addr_eeprom(struct sge_softc *, uint8_t *);
@ -379,14 +379,14 @@ sge_miibus_statchg(device_t dev)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct mii_data *mii; struct mii_data *mii;
struct ifnet *ifp; if_t ifp;
uint32_t ctl, speed; uint32_t ctl, speed;
sc = device_get_softc(dev); sc = device_get_softc(dev);
mii = device_get_softc(sc->sge_miibus); mii = device_get_softc(sc->sge_miibus);
ifp = sc->sge_ifp; ifp = sc->sge_ifp;
if (mii == NULL || ifp == NULL || if (mii == NULL || ifp == NULL ||
(ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) (if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
return; return;
speed = 0; speed = 0;
sc->sge_flags &= ~SGE_FLAG_LINK; sc->sge_flags &= ~SGE_FLAG_LINK;
@ -454,7 +454,7 @@ sge_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int count)
static void static void
sge_rxfilter(struct sge_softc *sc) sge_rxfilter(struct sge_softc *sc)
{ {
struct ifnet *ifp; if_t ifp;
uint32_t hashes[2]; uint32_t hashes[2];
uint16_t rxfilt; uint16_t rxfilt;
@ -464,10 +464,10 @@ sge_rxfilter(struct sge_softc *sc)
rxfilt = CSR_READ_2(sc, RxMacControl); rxfilt = CSR_READ_2(sc, RxMacControl);
rxfilt &= ~(AcceptBroadcast | AcceptAllPhys | AcceptMulticast); rxfilt &= ~(AcceptBroadcast | AcceptAllPhys | AcceptMulticast);
rxfilt |= AcceptMyPhys; rxfilt |= AcceptMyPhys;
if ((ifp->if_flags & IFF_BROADCAST) != 0) if ((if_getflags(ifp) & IFF_BROADCAST) != 0)
rxfilt |= AcceptBroadcast; rxfilt |= AcceptBroadcast;
if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) { if ((if_getflags(ifp) & (IFF_PROMISC | IFF_ALLMULTI)) != 0) {
if ((ifp->if_flags & IFF_PROMISC) != 0) if ((if_getflags(ifp) & IFF_PROMISC) != 0)
rxfilt |= AcceptAllPhys; rxfilt |= AcceptAllPhys;
rxfilt |= AcceptMulticast; rxfilt |= AcceptMulticast;
hashes[0] = 0xFFFFFFFF; hashes[0] = 0xFFFFFFFF;
@ -486,16 +486,16 @@ sge_rxfilter(struct sge_softc *sc)
static void static void
sge_setvlan(struct sge_softc *sc) sge_setvlan(struct sge_softc *sc)
{ {
struct ifnet *ifp; if_t ifp;
uint16_t rxfilt; uint16_t rxfilt;
SGE_LOCK_ASSERT(sc); SGE_LOCK_ASSERT(sc);
ifp = sc->sge_ifp; ifp = sc->sge_ifp;
if ((ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) == 0) if ((if_getcapabilities(ifp) & IFCAP_VLAN_HWTAGGING) == 0)
return; return;
rxfilt = CSR_READ_2(sc, RxMacControl); rxfilt = CSR_READ_2(sc, RxMacControl);
if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) if ((if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0)
rxfilt |= RXMAC_STRIP_VLAN; rxfilt |= RXMAC_STRIP_VLAN;
else else
rxfilt &= ~RXMAC_STRIP_VLAN; rxfilt &= ~RXMAC_STRIP_VLAN;
@ -554,7 +554,7 @@ static int
sge_attach(device_t dev) sge_attach(device_t dev)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct ifnet *ifp; if_t ifp;
uint8_t eaddr[ETHER_ADDR_LEN]; uint8_t eaddr[ETHER_ADDR_LEN];
int error = 0, rid; int error = 0, rid;
@ -610,18 +610,17 @@ sge_attach(device_t dev)
error = ENOSPC; error = ENOSPC;
goto fail; goto fail;
} }
ifp->if_softc = sc; if_setsoftc(ifp, sc);
if_initname(ifp, device_get_name(dev), device_get_unit(dev)); if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
ifp->if_ioctl = sge_ioctl; if_setioctlfn(ifp, sge_ioctl);
ifp->if_start = sge_start; if_setstartfn(ifp, sge_start);
ifp->if_init = sge_init; if_setinitfn(ifp, sge_init);
ifp->if_snd.ifq_drv_maxlen = SGE_TX_RING_CNT - 1; if_setsendqlen(ifp, SGE_TX_RING_CNT - 1);
IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); if_setsendqready(ifp);
IFQ_SET_READY(&ifp->if_snd); if_setcapabilities(ifp, IFCAP_TXCSUM | IFCAP_RXCSUM | IFCAP_TSO4);
ifp->if_capabilities = IFCAP_TXCSUM | IFCAP_RXCSUM | IFCAP_TSO4; if_sethwassist(ifp, SGE_CSUM_FEATURES | CSUM_TSO);
ifp->if_hwassist = SGE_CSUM_FEATURES | CSUM_TSO; if_setcapenable(ifp, if_getcapabilities(ifp));
ifp->if_capenable = ifp->if_capabilities;
/* /*
* Do MII setup. * Do MII setup.
*/ */
@ -638,11 +637,11 @@ sge_attach(device_t dev)
ether_ifattach(ifp, eaddr); ether_ifattach(ifp, eaddr);
/* VLAN setup. */ /* VLAN setup. */
ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM | if_setcapabilities(ifp, IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM |
IFCAP_VLAN_HWTSO | IFCAP_VLAN_MTU; IFCAP_VLAN_HWTSO | IFCAP_VLAN_MTU);
ifp->if_capenable = ifp->if_capabilities; if_setcapenable(ifp, if_getcapabilities(ifp));
/* Tell the upper layer(s) we support long frames. */ /* Tell the upper layer(s) we support long frames. */
ifp->if_hdrlen = sizeof(struct ether_vlan_header); if_setifheaderlen(ifp, sizeof(struct ether_vlan_header));
/* Hook interrupt last to avoid having to lock softc */ /* Hook interrupt last to avoid having to lock softc */
error = bus_setup_intr(dev, sc->sge_irq, INTR_TYPE_NET | INTR_MPSAFE, error = bus_setup_intr(dev, sc->sge_irq, INTR_TYPE_NET | INTR_MPSAFE,
@ -671,7 +670,7 @@ static int
sge_detach(device_t dev) sge_detach(device_t dev)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct ifnet *ifp; if_t ifp;
sc = device_get_softc(dev); sc = device_get_softc(dev);
ifp = sc->sge_ifp; ifp = sc->sge_ifp;
@ -722,12 +721,12 @@ static int
sge_suspend(device_t dev) sge_suspend(device_t dev)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct ifnet *ifp; if_t ifp;
sc = device_get_softc(dev); sc = device_get_softc(dev);
SGE_LOCK(sc); SGE_LOCK(sc);
ifp = sc->sge_ifp; ifp = sc->sge_ifp;
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
sge_stop(sc); sge_stop(sc);
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
return (0); return (0);
@ -737,12 +736,12 @@ static int
sge_resume(device_t dev) sge_resume(device_t dev)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct ifnet *ifp; if_t ifp;
sc = device_get_softc(dev); sc = device_get_softc(dev);
SGE_LOCK(sc); SGE_LOCK(sc);
ifp = sc->sge_ifp; ifp = sc->sge_ifp;
if ((ifp->if_flags & IFF_UP) != 0) if ((if_getflags(ifp) & IFF_UP) != 0)
sge_init_locked(sc); sge_init_locked(sc);
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
return (0); return (0);
@ -1140,7 +1139,7 @@ sge_discard_rxbuf(struct sge_softc *sc, int index)
static void static void
sge_rxeof(struct sge_softc *sc) sge_rxeof(struct sge_softc *sc)
{ {
struct ifnet *ifp; if_t ifp;
struct mbuf *m; struct mbuf *m;
struct sge_chain_data *cd; struct sge_chain_data *cd;
struct sge_desc *cur_rx; struct sge_desc *cur_rx;
@ -1157,7 +1156,7 @@ sge_rxeof(struct sge_softc *sc)
cons = cd->sge_rx_cons; cons = cd->sge_rx_cons;
for (prog = 0; prog < SGE_RX_RING_CNT; prog++, for (prog = 0; prog < SGE_RX_RING_CNT; prog++,
SGE_INC(cons, SGE_RX_RING_CNT)) { SGE_INC(cons, SGE_RX_RING_CNT)) {
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
break; break;
cur_rx = &sc->sge_ldata.sge_rx_ring[cons]; cur_rx = &sc->sge_ldata.sge_rx_ring[cons];
rxinfo = le32toh(cur_rx->sge_cmdsts); rxinfo = le32toh(cur_rx->sge_cmdsts);
@ -1181,7 +1180,7 @@ sge_rxeof(struct sge_softc *sc)
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1); if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
continue; continue;
} }
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) { if ((if_getcapenable(ifp) & IFCAP_RXCSUM) != 0) {
if ((rxinfo & RDC_IP_CSUM) != 0 && if ((rxinfo & RDC_IP_CSUM) != 0 &&
(rxinfo & RDC_IP_CSUM_OK) != 0) (rxinfo & RDC_IP_CSUM_OK) != 0)
m->m_pkthdr.csum_flags |= m->m_pkthdr.csum_flags |=
@ -1196,7 +1195,7 @@ sge_rxeof(struct sge_softc *sc)
} }
} }
/* Check for VLAN tagged frame. */ /* Check for VLAN tagged frame. */
if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 && if ((if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0 &&
(rxstat & RDS_VLAN) != 0) { (rxstat & RDS_VLAN) != 0) {
m->m_pkthdr.ether_vtag = rxinfo & RDC_VLAN_MASK; m->m_pkthdr.ether_vtag = rxinfo & RDC_VLAN_MASK;
m->m_flags |= M_VLANTAG; m->m_flags |= M_VLANTAG;
@ -1213,7 +1212,7 @@ sge_rxeof(struct sge_softc *sc)
m->m_pkthdr.rcvif = ifp; m->m_pkthdr.rcvif = ifp;
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
(*ifp->if_input)(ifp, m); if_input(ifp, m);
SGE_LOCK(sc); SGE_LOCK(sc);
} }
@ -1231,7 +1230,7 @@ sge_rxeof(struct sge_softc *sc)
static void static void
sge_txeof(struct sge_softc *sc) sge_txeof(struct sge_softc *sc)
{ {
struct ifnet *ifp; if_t ifp;
struct sge_list_data *ld; struct sge_list_data *ld;
struct sge_chain_data *cd; struct sge_chain_data *cd;
struct sge_txdesc *txd; struct sge_txdesc *txd;
@ -1290,7 +1289,7 @@ sge_txeof(struct sge_softc *sc)
KASSERT(cd->sge_tx_cnt >= 0, KASSERT(cd->sge_tx_cnt >= 0,
("%s: Active Tx desc counter was garbled\n", __func__)); ("%s: Active Tx desc counter was garbled\n", __func__));
txd->tx_ndesc = 0; txd->tx_ndesc = 0;
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
} }
cd->sge_tx_cons = cons; cd->sge_tx_cons = cons;
if (cd->sge_tx_cnt == 0) if (cd->sge_tx_cnt == 0)
@ -1302,7 +1301,7 @@ sge_tick(void *arg)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct mii_data *mii; struct mii_data *mii;
struct ifnet *ifp; if_t ifp;
sc = arg; sc = arg;
SGE_LOCK_ASSERT(sc); SGE_LOCK_ASSERT(sc);
@ -1313,7 +1312,7 @@ sge_tick(void *arg)
if ((sc->sge_flags & SGE_FLAG_LINK) == 0) { if ((sc->sge_flags & SGE_FLAG_LINK) == 0) {
sge_miibus_statchg(sc->sge_dev); sge_miibus_statchg(sc->sge_dev);
if ((sc->sge_flags & SGE_FLAG_LINK) != 0 && if ((sc->sge_flags & SGE_FLAG_LINK) != 0 &&
!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) !if_sendq_empty(ifp))
sge_start_locked(ifp); sge_start_locked(ifp);
} }
/* /*
@ -1330,7 +1329,7 @@ static void
sge_intr(void *arg) sge_intr(void *arg)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct ifnet *ifp; if_t ifp;
uint32_t status; uint32_t status;
sc = arg; sc = arg;
@ -1357,7 +1356,7 @@ sge_intr(void *arg)
* no other way at this time. * no other way at this time.
*/ */
for (;;) { for (;;) {
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
break; break;
if ((status & (INTR_RX_DONE | INTR_RX_IDLE)) != 0) { if ((status & (INTR_RX_DONE | INTR_RX_IDLE)) != 0) {
sge_rxeof(sc); sge_rxeof(sc);
@ -1374,10 +1373,10 @@ sge_intr(void *arg)
/* Acknowledge interrupts. */ /* Acknowledge interrupts. */
CSR_WRITE_4(sc, IntrStatus, status); CSR_WRITE_4(sc, IntrStatus, status);
} }
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
/* Re-enable interrupts */ /* Re-enable interrupts */
CSR_WRITE_4(sc, IntrMask, SGE_INTRS); CSR_WRITE_4(sc, IntrMask, SGE_INTRS);
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) if (!if_sendq_empty(ifp))
sge_start_locked(ifp); sge_start_locked(ifp);
} }
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
@ -1551,45 +1550,45 @@ sge_encap(struct sge_softc *sc, struct mbuf **m_head)
} }
static void static void
sge_start(struct ifnet *ifp) sge_start(if_t ifp)
{ {
struct sge_softc *sc; struct sge_softc *sc;
sc = ifp->if_softc; sc = if_getsoftc(ifp);
SGE_LOCK(sc); SGE_LOCK(sc);
sge_start_locked(ifp); sge_start_locked(ifp);
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
} }
static void static void
sge_start_locked(struct ifnet *ifp) sge_start_locked(if_t ifp)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct mbuf *m_head; struct mbuf *m_head;
int queued = 0; int queued = 0;
sc = ifp->if_softc; sc = if_getsoftc(ifp);
SGE_LOCK_ASSERT(sc); SGE_LOCK_ASSERT(sc);
if ((sc->sge_flags & SGE_FLAG_LINK) == 0 || if ((sc->sge_flags & SGE_FLAG_LINK) == 0 ||
(ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != (if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
IFF_DRV_RUNNING) IFF_DRV_RUNNING)
return; return;
for (queued = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd); ) { for (queued = 0; !if_sendq_empty(ifp); ) {
if (sc->sge_cdata.sge_tx_cnt > (SGE_TX_RING_CNT - if (sc->sge_cdata.sge_tx_cnt > (SGE_TX_RING_CNT -
SGE_MAXTXSEGS)) { SGE_MAXTXSEGS)) {
ifp->if_drv_flags |= IFF_DRV_OACTIVE; if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
break; break;
} }
IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); m_head = if_dequeue(ifp);
if (m_head == NULL) if (m_head == NULL)
break; break;
if (sge_encap(sc, &m_head)) { if (sge_encap(sc, &m_head)) {
if (m_head == NULL) if (m_head == NULL)
break; break;
IFQ_DRV_PREPEND(&ifp->if_snd, m_head); if_sendq_prepend(ifp, m_head);
ifp->if_drv_flags |= IFF_DRV_OACTIVE; if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
break; break;
} }
queued++; queued++;
@ -1623,7 +1622,7 @@ sge_init(void *arg)
static void static void
sge_init_locked(struct sge_softc *sc) sge_init_locked(struct sge_softc *sc)
{ {
struct ifnet *ifp; if_t ifp;
struct mii_data *mii; struct mii_data *mii;
uint16_t rxfilt; uint16_t rxfilt;
int i; int i;
@ -1631,7 +1630,7 @@ sge_init_locked(struct sge_softc *sc)
SGE_LOCK_ASSERT(sc); SGE_LOCK_ASSERT(sc);
ifp = sc->sge_ifp; ifp = sc->sge_ifp;
mii = device_get_softc(sc->sge_miibus); mii = device_get_softc(sc->sge_miibus);
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
return; return;
/* /*
* Cancel pending I/O and free all RX/TX buffers. * Cancel pending I/O and free all RX/TX buffers.
@ -1661,7 +1660,7 @@ sge_init_locked(struct sge_softc *sc)
SGE_RX_PAD_BYTES); SGE_RX_PAD_BYTES);
for (i = 0; i < ETHER_ADDR_LEN; i++) for (i = 0; i < ETHER_ADDR_LEN; i++)
CSR_WRITE_1(sc, RxMacAddr + i, IF_LLADDR(ifp)[i]); CSR_WRITE_1(sc, RxMacAddr + i, if_getlladdr(ifp)[i]);
/* Configure RX MAC. */ /* Configure RX MAC. */
rxfilt = RXMAC_STRIP_FCS | RXMAC_PAD_ENB | RXMAC_CSUM_ENB; rxfilt = RXMAC_STRIP_FCS | RXMAC_PAD_ENB | RXMAC_CSUM_ENB;
CSR_WRITE_2(sc, RxMacControl, rxfilt); CSR_WRITE_2(sc, RxMacControl, rxfilt);
@ -1697,8 +1696,8 @@ sge_init_locked(struct sge_softc *sc)
CSR_WRITE_4(sc, TX_CTL, 0x1a00 | TX_CTL_ENB); CSR_WRITE_4(sc, TX_CTL, 0x1a00 | TX_CTL_ENB);
CSR_WRITE_4(sc, RX_CTL, 0x1a00 | 0x000c | RX_CTL_POLL | RX_CTL_ENB); CSR_WRITE_4(sc, RX_CTL, 0x1a00 | 0x000c | RX_CTL_POLL | RX_CTL_ENB);
ifp->if_drv_flags |= IFF_DRV_RUNNING; if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0);
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
sc->sge_flags &= ~SGE_FLAG_LINK; sc->sge_flags &= ~SGE_FLAG_LINK;
mii_mediachg(mii); mii_mediachg(mii);
@ -1709,14 +1708,14 @@ sge_init_locked(struct sge_softc *sc)
* Set media options. * Set media options.
*/ */
static int static int
sge_ifmedia_upd(struct ifnet *ifp) sge_ifmedia_upd(if_t ifp)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct mii_data *mii; struct mii_data *mii;
struct mii_softc *miisc; struct mii_softc *miisc;
int error; int error;
sc = ifp->if_softc; sc = if_getsoftc(ifp);
SGE_LOCK(sc); SGE_LOCK(sc);
mii = device_get_softc(sc->sge_miibus); mii = device_get_softc(sc->sge_miibus);
LIST_FOREACH(miisc, &mii->mii_phys, mii_list) LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
@ -1731,15 +1730,15 @@ sge_ifmedia_upd(struct ifnet *ifp)
* Report current media status. * Report current media status.
*/ */
static void static void
sge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) sge_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct mii_data *mii; struct mii_data *mii;
sc = ifp->if_softc; sc = if_getsoftc(ifp);
SGE_LOCK(sc); SGE_LOCK(sc);
mii = device_get_softc(sc->sge_miibus); mii = device_get_softc(sc->sge_miibus);
if ((ifp->if_flags & IFF_UP) == 0) { if ((if_getflags(ifp) & IFF_UP) == 0) {
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
return; return;
} }
@ -1750,74 +1749,74 @@ sge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
} }
static int static int
sge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) sge_ioctl(if_t ifp, u_long command, caddr_t data)
{ {
struct sge_softc *sc; struct sge_softc *sc;
struct ifreq *ifr; struct ifreq *ifr;
struct mii_data *mii; struct mii_data *mii;
int error = 0, mask, reinit; int error = 0, mask, reinit;
sc = ifp->if_softc; sc = if_getsoftc(ifp);
ifr = (struct ifreq *)data; ifr = (struct ifreq *)data;
switch(command) { switch(command) {
case SIOCSIFFLAGS: case SIOCSIFFLAGS:
SGE_LOCK(sc); SGE_LOCK(sc);
if ((ifp->if_flags & IFF_UP) != 0) { if ((if_getflags(ifp) & IFF_UP) != 0) {
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 && if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0 &&
((ifp->if_flags ^ sc->sge_if_flags) & ((if_getflags(ifp) ^ sc->sge_if_flags) &
(IFF_PROMISC | IFF_ALLMULTI)) != 0) (IFF_PROMISC | IFF_ALLMULTI)) != 0)
sge_rxfilter(sc); sge_rxfilter(sc);
else else
sge_init_locked(sc); sge_init_locked(sc);
} else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) } else if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
sge_stop(sc); sge_stop(sc);
sc->sge_if_flags = ifp->if_flags; sc->sge_if_flags = if_getflags(ifp);
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
break; break;
case SIOCSIFCAP: case SIOCSIFCAP:
SGE_LOCK(sc); SGE_LOCK(sc);
reinit = 0; reinit = 0;
mask = ifr->ifr_reqcap ^ ifp->if_capenable; mask = ifr->ifr_reqcap ^ if_getcapenable(ifp);
if ((mask & IFCAP_TXCSUM) != 0 && if ((mask & IFCAP_TXCSUM) != 0 &&
(ifp->if_capabilities & IFCAP_TXCSUM) != 0) { (if_getcapabilities(ifp) & IFCAP_TXCSUM) != 0) {
ifp->if_capenable ^= IFCAP_TXCSUM; if_togglecapenable(ifp, IFCAP_TXCSUM);
if ((ifp->if_capenable & IFCAP_TXCSUM) != 0) if ((if_getcapenable(ifp) & IFCAP_TXCSUM) != 0)
ifp->if_hwassist |= SGE_CSUM_FEATURES; if_sethwassistbits(ifp, SGE_CSUM_FEATURES, 0);
else else
ifp->if_hwassist &= ~SGE_CSUM_FEATURES; if_sethwassistbits(ifp, 0, SGE_CSUM_FEATURES);
} }
if ((mask & IFCAP_RXCSUM) != 0 && if ((mask & IFCAP_RXCSUM) != 0 &&
(ifp->if_capabilities & IFCAP_RXCSUM) != 0) (if_getcapabilities(ifp) & IFCAP_RXCSUM) != 0)
ifp->if_capenable ^= IFCAP_RXCSUM; if_togglecapenable(ifp, IFCAP_RXCSUM);
if ((mask & IFCAP_VLAN_HWCSUM) != 0 && if ((mask & IFCAP_VLAN_HWCSUM) != 0 &&
(ifp->if_capabilities & IFCAP_VLAN_HWCSUM) != 0) (if_getcapabilities(ifp) & IFCAP_VLAN_HWCSUM) != 0)
ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; if_togglecapenable(ifp, IFCAP_VLAN_HWCSUM);
if ((mask & IFCAP_TSO4) != 0 && if ((mask & IFCAP_TSO4) != 0 &&
(ifp->if_capabilities & IFCAP_TSO4) != 0) { (if_getcapabilities(ifp) & IFCAP_TSO4) != 0) {
ifp->if_capenable ^= IFCAP_TSO4; if_togglecapenable(ifp, IFCAP_TSO4);
if ((ifp->if_capenable & IFCAP_TSO4) != 0) if ((if_getcapenable(ifp) & IFCAP_TSO4) != 0)
ifp->if_hwassist |= CSUM_TSO; if_sethwassistbits(ifp, CSUM_TSO, 0);
else else
ifp->if_hwassist &= ~CSUM_TSO; if_sethwassistbits(ifp, 0, CSUM_TSO);
} }
if ((mask & IFCAP_VLAN_HWTSO) != 0 && if ((mask & IFCAP_VLAN_HWTSO) != 0 &&
(ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) (if_getcapabilities(ifp) & IFCAP_VLAN_HWTSO) != 0)
ifp->if_capenable ^= IFCAP_VLAN_HWTSO; if_togglecapenable(ifp, IFCAP_VLAN_HWTSO);
if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && if ((mask & IFCAP_VLAN_HWTAGGING) != 0 &&
(ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) { (if_getcapabilities(ifp) & IFCAP_VLAN_HWTAGGING) != 0) {
/* /*
* Due to unknown reason, toggling VLAN hardware * Due to unknown reason, toggling VLAN hardware
* tagging require interface reinitialization. * tagging require interface reinitialization.
*/ */
ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; if_togglecapenable(ifp, IFCAP_VLAN_HWTAGGING);
if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) if ((if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) == 0)
ifp->if_capenable &= if_setcapenablebit(ifp, 0,
~(IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM); IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM);
reinit = 1; reinit = 1;
} }
if (reinit > 0 && (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { if (reinit > 0 && (if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
ifp->if_drv_flags &= ~IFF_DRV_RUNNING; if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
sge_init_locked(sc); sge_init_locked(sc);
} }
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
@ -1826,7 +1825,7 @@ sge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
case SIOCADDMULTI: case SIOCADDMULTI:
case SIOCDELMULTI: case SIOCDELMULTI:
SGE_LOCK(sc); SGE_LOCK(sc);
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
sge_rxfilter(sc); sge_rxfilter(sc);
SGE_UNLOCK(sc); SGE_UNLOCK(sc);
break; break;
@ -1846,7 +1845,7 @@ sge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
static void static void
sge_watchdog(struct sge_softc *sc) sge_watchdog(struct sge_softc *sc)
{ {
struct ifnet *ifp; if_t ifp;
SGE_LOCK_ASSERT(sc); SGE_LOCK_ASSERT(sc);
if (sc->sge_timer == 0 || --sc->sge_timer > 0) if (sc->sge_timer == 0 || --sc->sge_timer > 0)
@ -1858,16 +1857,16 @@ sge_watchdog(struct sge_softc *sc)
device_printf(sc->sge_dev, device_printf(sc->sge_dev,
"watchdog timeout (lost link)\n"); "watchdog timeout (lost link)\n");
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
ifp->if_drv_flags &= ~IFF_DRV_RUNNING; if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
sge_init_locked(sc); sge_init_locked(sc);
return; return;
} }
device_printf(sc->sge_dev, "watchdog timeout\n"); device_printf(sc->sge_dev, "watchdog timeout\n");
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
ifp->if_drv_flags &= ~IFF_DRV_RUNNING; if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
sge_init_locked(sc); sge_init_locked(sc);
if (!IFQ_DRV_IS_EMPTY(&sc->sge_ifp->if_snd)) if (!if_sendq_empty(sc->sge_ifp))
sge_start_locked(ifp); sge_start_locked(ifp);
} }
@ -1878,7 +1877,7 @@ sge_watchdog(struct sge_softc *sc)
static void static void
sge_stop(struct sge_softc *sc) sge_stop(struct sge_softc *sc)
{ {
struct ifnet *ifp; if_t ifp;
ifp = sc->sge_ifp; ifp = sc->sge_ifp;
@ -1886,7 +1885,7 @@ sge_stop(struct sge_softc *sc)
sc->sge_timer = 0; sc->sge_timer = 0;
callout_stop(&sc->sge_stat_ch); callout_stop(&sc->sge_stat_ch);
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); if_setdrvflagbits(ifp, 0, (IFF_DRV_RUNNING | IFF_DRV_OACTIVE));
CSR_WRITE_4(sc, IntrMask, 0); CSR_WRITE_4(sc, IntrMask, 0);
CSR_READ_4(sc, IntrMask); CSR_READ_4(sc, IntrMask);

View File

@ -338,7 +338,7 @@ struct sge_type {
}; };
struct sge_softc { struct sge_softc {
struct ifnet *sge_ifp; /* interface info */ if_t sge_ifp; /* interface info */
struct resource *sge_res; struct resource *sge_res;
int sge_res_id; int sge_res_id;
int sge_res_type; int sge_res_type;