diff options
author | Damien Bergamini <damien@cvs.openbsd.org> | 2006-02-16 17:35:52 +0000 |
---|---|---|
committer | Damien Bergamini <damien@cvs.openbsd.org> | 2006-02-16 17:35:52 +0000 |
commit | f58e8905010225058178f5ce055fcd580751dc18 (patch) | |
tree | d22b7fb3627df4841c042d464f33b24dbd0fdb53 | |
parent | ff18dafa045c6fa286018a40158122c68f840dbe (diff) |
- stop enabling/disabling interrupts in nfe_intr().
- store RX/TX settings in nfe_softc so we don't recompute them all the time.
- fix h/w VLAN tagging flags.
-rw-r--r-- | sys/dev/pci/if_nfe.c | 51 | ||||
-rw-r--r-- | sys/dev/pci/if_nfereg.h | 8 | ||||
-rw-r--r-- | sys/dev/pci/if_nfevar.h | 3 |
3 files changed, 20 insertions, 42 deletions
diff --git a/sys/dev/pci/if_nfe.c b/sys/dev/pci/if_nfe.c index 55abd4c0b8d..465b4acb4c4 100644 --- a/sys/dev/pci/if_nfe.c +++ b/sys/dev/pci/if_nfe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_nfe.c,v 1.40 2006/02/15 20:21:27 brad Exp $ */ +/* $OpenBSD: if_nfe.c,v 1.41 2006/02/16 17:35:51 damien Exp $ */ /*- * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr> @@ -258,7 +258,6 @@ nfe_attach(struct device *parent, struct device *self, void *aux) strlcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ); ifp->if_capabilities = IFCAP_VLAN_MTU; - #if NVLAN > 0 if (sc->sc_flags & NFE_HW_VLAN) ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; @@ -430,18 +429,10 @@ nfe_intr(void *arg) struct ifnet *ifp = &sc->sc_arpcom.ac_if; uint32_t r; - /* disable interrupts */ - NFE_WRITE(sc, NFE_IRQ_MASK, 0); - - r = NFE_READ(sc, NFE_IRQ_STATUS); + if ((r = NFE_READ(sc, NFE_IRQ_STATUS)) == 0) + return 0; /* not for us */ NFE_WRITE(sc, NFE_IRQ_STATUS, r); - if (r == 0) { - /* re-enable interrupts */ - NFE_WRITE(sc, NFE_IRQ_MASK, NFE_IRQ_WANTED); - return 0; - } - DPRINTFN(5, ("nfe_intr: interrupt register %x\n", r)); if (r & NFE_IRQ_LINK) { @@ -458,9 +449,6 @@ nfe_intr(void *arg) nfe_txeof(sc); } - /* re-enable interrupts */ - NFE_WRITE(sc, NFE_IRQ_MASK, NFE_IRQ_WANTED); - return 1; } @@ -992,7 +980,6 @@ nfe_start(struct ifnet *ifp) struct nfe_softc *sc = ifp->if_softc; int old = sc->txq.cur; struct mbuf *m0; - uint32_t txctl; for (;;) { IFQ_POLL(&ifp->if_snd, m0); @@ -1020,18 +1007,8 @@ nfe_start(struct ifnet *ifp) else nfe_txdesc32_rsync(sc, old, sc->txq.cur, BUS_DMASYNC_PREWRITE); - txctl = NFE_RXTX_KICKTX; - if (sc->sc_flags & NFE_40BIT_ADDR) - txctl |= NFE_RXTX_V3MAGIC; - else if (sc->sc_flags & NFE_JUMBO_SUP) - txctl |= NFE_RXTX_V2MAGIC; -#ifdef NFE_CSUM - if (sc->sc_flags & NFE_HW_CSUM) - txctl |= NFE_RXTX_RXCHECK; -#endif - /* kick Tx */ - NFE_WRITE(sc, NFE_RXTX_CTL, txctl); + NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl); /* * Set a timeout in case the chip goes out to lunch. @@ -1056,7 +1033,7 @@ int nfe_init(struct ifnet *ifp) { struct nfe_softc *sc = ifp->if_softc; - uint32_t tmp, rxtxctl; + uint32_t tmp; if (ifp->if_flags & IFF_RUNNING) return 0; @@ -1067,19 +1044,19 @@ nfe_init(struct ifnet *ifp) NFE_WRITE(sc, NFE_TX_UNK, 0); - rxtxctl = NFE_RXTX_BIT2; + sc->rxtxctl = NFE_RXTX_BIT2; if (sc->sc_flags & NFE_40BIT_ADDR) - rxtxctl |= NFE_RXTX_V3MAGIC; + sc->rxtxctl |= NFE_RXTX_V3MAGIC; else if (sc->sc_flags & NFE_JUMBO_SUP) - rxtxctl |= NFE_RXTX_V2MAGIC; + sc->rxtxctl |= NFE_RXTX_V2MAGIC; #ifdef NFE_CSUM if (sc->sc_flags & NFE_HW_CSUM) - rxtxctl |= NFE_RXTX_RXCHECK; + sc->rxtxctl |= NFE_RXTX_RXCSUM; #endif - NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | rxtxctl); + NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | sc->rxtxctl); DELAY(10); - NFE_WRITE(sc, NFE_RXTX_CTL, rxtxctl); + NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl); NFE_WRITE(sc, NFE_SETUP_R6, 0); @@ -1123,10 +1100,10 @@ nfe_init(struct ifnet *ifp) NFE_WRITE(sc, NFE_SETUP_R4, NFE_R4_MAGIC); NFE_WRITE(sc, NFE_WOL_CTL, NFE_WOL_MAGIC); - rxtxctl &= ~NFE_RXTX_BIT2; - NFE_WRITE(sc, NFE_RXTX_CTL, rxtxctl); + sc->rxtxctl &= ~NFE_RXTX_BIT2; + NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl); DELAY(10); - NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT1 | rxtxctl); + NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT1 | sc->rxtxctl); /* set Rx filter */ nfe_setmulti(sc); diff --git a/sys/dev/pci/if_nfereg.h b/sys/dev/pci/if_nfereg.h index 614aa8a4c12..34b2d7b3054 100644 --- a/sys/dev/pci/if_nfereg.h +++ b/sys/dev/pci/if_nfereg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_nfereg.h,v 1.12 2006/02/15 20:08:59 damien Exp $ */ +/* $OpenBSD: if_nfereg.h,v 1.13 2006/02/16 17:35:51 damien Exp $ */ /*- * Copyright (c) 2005 Jonathan Gray <jsg@openbsd.org> @@ -100,7 +100,7 @@ #define NFE_RXTX_RESET 0x0010 #define NFE_RXTX_VTAG_STRIP 0x0040 #define NFE_RXTX_VTAG_INSERT 0x0080 -#define NFE_RXTX_RXCHECK 0x0400 +#define NFE_RXTX_RXCSUM 0x0400 #define NFE_RXTX_V2MAGIC 0x2100 #define NFE_RXTX_V3MAGIC 0x2200 #define NFE_RXFILTER_MAGIC 0x007f0008 @@ -145,13 +145,13 @@ struct nfe_desc32 { struct nfe_desc64 { uint32_t physaddr[2]; uint32_t vtag; +#define NFE_RX_VTAG (1 << 16) +#define NFE_TX_VTAG (1 << 18) uint16_t length; uint16_t flags; #define NFE_RX_FIXME_V2 0x4300 -#define NFE_RX_VTAG (1 << 0) #define NFE_RX_VALID_V2 (1 << 13) #define NFE_TX_ERROR_V2 0x5c04 -#define NFE_TX_VTAG (1 << 2) #define NFE_TX_LASTFRAG_V2 (1 << 13) } __packed; diff --git a/sys/dev/pci/if_nfevar.h b/sys/dev/pci/if_nfevar.h index f7ae53cb54e..07e167bbf58 100644 --- a/sys/dev/pci/if_nfevar.h +++ b/sys/dev/pci/if_nfevar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_nfevar.h,v 1.9 2006/02/15 19:36:46 damien Exp $ */ +/* $OpenBSD: if_nfevar.h,v 1.10 2006/02/16 17:35:51 damien Exp $ */ /*- * Copyright (c) 2005 Jonathan Gray <jsg@openbsd.org> @@ -83,6 +83,7 @@ struct nfe_softc { #define NFE_HW_VLAN 0x08 #define NFE_USE_JUMBO 0x10 + uint32_t rxtxctl; uint8_t phyaddr; struct nfe_tx_ring txq; |