Home | History | Annotate | Line # | Download | only in pci
if_nfe.c revision 1.4.6.2
      1  1.4.6.2     yamt /*	$NetBSD: if_nfe.c,v 1.4.6.2 2006/12/10 07:17:44 yamt Exp $	*/
      2      1.1      chs /*	$OpenBSD: if_nfe.c,v 1.52 2006/03/02 09:04:00 jsg Exp $	*/
      3      1.1      chs 
      4      1.1      chs /*-
      5      1.1      chs  * Copyright (c) 2006 Damien Bergamini <damien.bergamini (at) free.fr>
      6      1.1      chs  * Copyright (c) 2005, 2006 Jonathan Gray <jsg (at) openbsd.org>
      7      1.1      chs  *
      8      1.1      chs  * Permission to use, copy, modify, and distribute this software for any
      9      1.1      chs  * purpose with or without fee is hereby granted, provided that the above
     10      1.1      chs  * copyright notice and this permission notice appear in all copies.
     11      1.1      chs  *
     12      1.1      chs  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     13      1.1      chs  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     14      1.1      chs  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     15      1.1      chs  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     16      1.1      chs  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     17      1.1      chs  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     18      1.1      chs  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     19      1.1      chs  */
     20      1.1      chs 
     21      1.1      chs /* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */
     22      1.1      chs 
     23      1.1      chs #include <sys/cdefs.h>
     24  1.4.6.2     yamt __KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.4.6.2 2006/12/10 07:17:44 yamt Exp $");
     25      1.1      chs 
     26      1.1      chs #include "opt_inet.h"
     27      1.1      chs #include "bpfilter.h"
     28      1.1      chs #include "vlan.h"
     29      1.1      chs 
     30      1.1      chs #include <sys/param.h>
     31      1.1      chs #include <sys/endian.h>
     32      1.1      chs #include <sys/systm.h>
     33      1.1      chs #include <sys/types.h>
     34      1.1      chs #include <sys/sockio.h>
     35      1.1      chs #include <sys/mbuf.h>
     36      1.1      chs #include <sys/queue.h>
     37      1.1      chs #include <sys/malloc.h>
     38      1.1      chs #include <sys/kernel.h>
     39      1.1      chs #include <sys/device.h>
     40      1.1      chs #include <sys/socket.h>
     41      1.1      chs 
     42      1.1      chs #include <machine/bus.h>
     43      1.1      chs 
     44      1.1      chs #include <net/if.h>
     45      1.1      chs #include <net/if_dl.h>
     46      1.1      chs #include <net/if_media.h>
     47      1.1      chs #include <net/if_ether.h>
     48      1.1      chs #include <net/if_arp.h>
     49      1.1      chs 
     50      1.1      chs #ifdef INET
     51      1.1      chs #include <netinet/in.h>
     52      1.1      chs #include <netinet/in_systm.h>
     53      1.1      chs #include <netinet/in_var.h>
     54      1.1      chs #include <netinet/ip.h>
     55      1.1      chs #include <netinet/if_inarp.h>
     56      1.1      chs #endif
     57      1.1      chs 
     58      1.1      chs #if NVLAN > 0
     59      1.1      chs #include <net/if_types.h>
     60      1.1      chs #endif
     61      1.1      chs 
     62      1.1      chs #if NBPFILTER > 0
     63      1.1      chs #include <net/bpf.h>
     64      1.1      chs #endif
     65      1.1      chs 
     66      1.1      chs #include <dev/mii/mii.h>
     67      1.1      chs #include <dev/mii/miivar.h>
     68      1.1      chs 
     69      1.1      chs #include <dev/pci/pcireg.h>
     70      1.1      chs #include <dev/pci/pcivar.h>
     71      1.1      chs #include <dev/pci/pcidevs.h>
     72      1.1      chs 
     73      1.1      chs #include <dev/pci/if_nfereg.h>
     74      1.1      chs #include <dev/pci/if_nfevar.h>
     75      1.1      chs 
     76      1.1      chs int	nfe_match(struct device *, struct cfdata *, void *);
     77      1.1      chs void	nfe_attach(struct device *, struct device *, void *);
     78      1.1      chs void	nfe_power(int, void *);
     79      1.1      chs void	nfe_miibus_statchg(struct device *);
     80      1.1      chs int	nfe_miibus_readreg(struct device *, int, int);
     81      1.1      chs void	nfe_miibus_writereg(struct device *, int, int, int);
     82      1.1      chs int	nfe_intr(void *);
     83      1.1      chs int	nfe_ioctl(struct ifnet *, u_long, caddr_t);
     84      1.1      chs void	nfe_txdesc32_sync(struct nfe_softc *, struct nfe_desc32 *, int);
     85      1.1      chs void	nfe_txdesc64_sync(struct nfe_softc *, struct nfe_desc64 *, int);
     86      1.1      chs void	nfe_txdesc32_rsync(struct nfe_softc *, int, int, int);
     87      1.1      chs void	nfe_txdesc64_rsync(struct nfe_softc *, int, int, int);
     88      1.1      chs void	nfe_rxdesc32_sync(struct nfe_softc *, struct nfe_desc32 *, int);
     89      1.1      chs void	nfe_rxdesc64_sync(struct nfe_softc *, struct nfe_desc64 *, int);
     90      1.1      chs void	nfe_rxeof(struct nfe_softc *);
     91      1.1      chs void	nfe_txeof(struct nfe_softc *);
     92      1.1      chs int	nfe_encap(struct nfe_softc *, struct mbuf *);
     93      1.1      chs void	nfe_start(struct ifnet *);
     94      1.1      chs void	nfe_watchdog(struct ifnet *);
     95      1.1      chs int	nfe_init(struct ifnet *);
     96      1.1      chs void	nfe_stop(struct ifnet *, int);
     97      1.1      chs struct	nfe_jbuf *nfe_jalloc(struct nfe_softc *);
     98      1.1      chs void	nfe_jfree(struct mbuf *, caddr_t, size_t, void *);
     99      1.1      chs int	nfe_jpool_alloc(struct nfe_softc *);
    100      1.1      chs void	nfe_jpool_free(struct nfe_softc *);
    101      1.1      chs int	nfe_alloc_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
    102      1.1      chs void	nfe_reset_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
    103      1.1      chs void	nfe_free_rx_ring(struct nfe_softc *, struct nfe_rx_ring *);
    104      1.1      chs int	nfe_alloc_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
    105      1.1      chs void	nfe_reset_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
    106      1.1      chs void	nfe_free_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
    107      1.1      chs int	nfe_ifmedia_upd(struct ifnet *);
    108      1.1      chs void	nfe_ifmedia_sts(struct ifnet *, struct ifmediareq *);
    109      1.1      chs void	nfe_setmulti(struct nfe_softc *);
    110      1.1      chs void	nfe_get_macaddr(struct nfe_softc *, uint8_t *);
    111      1.1      chs void	nfe_set_macaddr(struct nfe_softc *, const uint8_t *);
    112      1.1      chs void	nfe_tick(void *);
    113      1.1      chs 
    114      1.1      chs CFATTACH_DECL(nfe, sizeof(struct nfe_softc), nfe_match, nfe_attach, NULL, NULL);
    115      1.1      chs 
    116      1.1      chs /*#define NFE_NO_JUMBO*/
    117      1.1      chs 
    118      1.1      chs #ifdef NFE_DEBUG
    119      1.1      chs int nfedebug = 0;
    120      1.1      chs #define DPRINTF(x)	do { if (nfedebug) printf x; } while (0)
    121      1.1      chs #define DPRINTFN(n,x)	do { if (nfedebug >= (n)) printf x; } while (0)
    122      1.1      chs #else
    123      1.1      chs #define DPRINTF(x)
    124      1.1      chs #define DPRINTFN(n,x)
    125      1.1      chs #endif
    126      1.1      chs 
    127      1.1      chs /* deal with naming differences */
    128      1.1      chs 
    129      1.1      chs #define	PCI_PRODUCT_NVIDIA_NFORCE3_LAN2 \
    130      1.1      chs 	PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN1
    131      1.1      chs #define	PCI_PRODUCT_NVIDIA_NFORCE3_LAN3 \
    132      1.1      chs 	PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN2
    133      1.1      chs #define	PCI_PRODUCT_NVIDIA_NFORCE3_LAN5 \
    134      1.1      chs 	PCI_PRODUCT_NVIDIA_NFORCE3_250_LAN
    135      1.1      chs 
    136      1.1      chs #define	PCI_PRODUCT_NVIDIA_CK804_LAN1 \
    137      1.1      chs 	PCI_PRODUCT_NVIDIA_NFORCE4_LAN1
    138      1.1      chs #define	PCI_PRODUCT_NVIDIA_CK804_LAN2 \
    139      1.1      chs 	PCI_PRODUCT_NVIDIA_NFORCE4_LAN2
    140      1.1      chs 
    141      1.1      chs #define	PCI_PRODUCT_NVIDIA_MCP51_LAN1 \
    142      1.1      chs 	PCI_PRODUCT_NVIDIA_NFORCE430_LAN1
    143      1.1      chs #define	PCI_PRODUCT_NVIDIA_MCP51_LAN2 \
    144      1.1      chs 	PCI_PRODUCT_NVIDIA_NFORCE430_LAN2
    145      1.1      chs 
    146      1.1      chs #ifdef	_LP64
    147      1.1      chs #define	__LP64__ 1
    148      1.1      chs #endif
    149      1.1      chs 
    150      1.1      chs const struct nfe_product {
    151      1.1      chs 	pci_vendor_id_t		vendor;
    152      1.1      chs 	pci_product_id_t	product;
    153      1.1      chs } nfe_devices[] = {
    154      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE_LAN },
    155      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE2_LAN },
    156      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN1 },
    157      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN2 },
    158      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN3 },
    159      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN4 },
    160      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN5 },
    161      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_CK804_LAN1 },
    162      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_CK804_LAN2 },
    163      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP04_LAN1 },
    164      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP04_LAN2 },
    165      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP51_LAN1 },
    166      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP51_LAN2 },
    167      1.1      chs 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP55_LAN1 },
    168      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP55_LAN2 },
    169      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN1 },
    170      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN2 },
    171      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN3 },
    172      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN4 },
    173      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN1 },
    174      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN2 },
    175      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN3 },
    176      1.4  xtraeme 	{ PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN4 }
    177      1.1      chs };
    178      1.1      chs 
    179      1.1      chs int
    180  1.4.6.2     yamt nfe_match(struct device *dev, struct cfdata *match, void *aux)
    181      1.1      chs {
    182      1.1      chs 	struct pci_attach_args *pa = aux;
    183      1.1      chs 	const struct nfe_product *np;
    184      1.1      chs 	int i;
    185      1.1      chs 
    186      1.1      chs 	for (i = 0; i < sizeof(nfe_devices) / sizeof(nfe_devices[0]); i++) {
    187      1.1      chs 		np = &nfe_devices[i];
    188      1.1      chs 		if (PCI_VENDOR(pa->pa_id) == np->vendor &&
    189      1.1      chs 		    PCI_PRODUCT(pa->pa_id) == np->product)
    190      1.1      chs 			return 1;
    191      1.1      chs 	}
    192      1.1      chs 	return 0;
    193      1.1      chs }
    194      1.1      chs 
    195      1.1      chs void
    196  1.4.6.2     yamt nfe_attach(struct device *parent, struct device *self, void *aux)
    197      1.1      chs {
    198      1.1      chs 	struct nfe_softc *sc = (struct nfe_softc *)self;
    199      1.1      chs 	struct pci_attach_args *pa = aux;
    200      1.1      chs 	pci_chipset_tag_t pc = pa->pa_pc;
    201      1.1      chs 	pci_intr_handle_t ih;
    202      1.1      chs 	const char *intrstr;
    203      1.1      chs 	struct ifnet *ifp;
    204      1.1      chs 	bus_size_t memsize;
    205      1.1      chs 	pcireg_t memtype;
    206      1.1      chs 
    207      1.1      chs 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, NFE_PCI_BA);
    208      1.1      chs 	switch (memtype) {
    209      1.1      chs 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
    210      1.1      chs 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
    211      1.1      chs 		if (pci_mapreg_map(pa, NFE_PCI_BA, memtype, 0, &sc->sc_memt,
    212      1.1      chs 		    &sc->sc_memh, NULL, &memsize) == 0)
    213      1.1      chs 			break;
    214      1.1      chs 		/* FALLTHROUGH */
    215      1.1      chs 	default:
    216      1.1      chs 		printf(": could not map mem space\n");
    217      1.1      chs 		return;
    218      1.1      chs 	}
    219      1.1      chs 
    220      1.1      chs 	if (pci_intr_map(pa, &ih) != 0) {
    221      1.1      chs 		printf(": could not map interrupt\n");
    222      1.1      chs 		return;
    223      1.1      chs 	}
    224      1.1      chs 
    225      1.1      chs 	intrstr = pci_intr_string(pc, ih);
    226      1.1      chs 	sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, nfe_intr, sc);
    227      1.1      chs 	if (sc->sc_ih == NULL) {
    228      1.1      chs 		printf(": could not establish interrupt");
    229      1.1      chs 		if (intrstr != NULL)
    230      1.1      chs 			printf(" at %s", intrstr);
    231      1.1      chs 		printf("\n");
    232      1.1      chs 		return;
    233      1.1      chs 	}
    234      1.1      chs 	printf(": %s", intrstr);
    235      1.1      chs 
    236      1.1      chs 	sc->sc_dmat = pa->pa_dmat;
    237      1.1      chs 
    238      1.1      chs 	nfe_get_macaddr(sc, sc->sc_enaddr);
    239      1.1      chs 	printf(", address %s\n", ether_sprintf(sc->sc_enaddr));
    240      1.1      chs 
    241      1.1      chs 	sc->sc_flags = 0;
    242      1.1      chs 
    243      1.1      chs 	switch (PCI_PRODUCT(pa->pa_id)) {
    244      1.1      chs 	case PCI_PRODUCT_NVIDIA_NFORCE3_LAN2:
    245      1.1      chs 	case PCI_PRODUCT_NVIDIA_NFORCE3_LAN3:
    246      1.1      chs 	case PCI_PRODUCT_NVIDIA_NFORCE3_LAN4:
    247      1.1      chs 	case PCI_PRODUCT_NVIDIA_NFORCE3_LAN5:
    248      1.1      chs 		sc->sc_flags |= NFE_JUMBO_SUP | NFE_HW_CSUM;
    249      1.1      chs 		break;
    250      1.1      chs 	case PCI_PRODUCT_NVIDIA_MCP51_LAN1:
    251      1.1      chs 	case PCI_PRODUCT_NVIDIA_MCP51_LAN2:
    252      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP61_LAN1:
    253      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP61_LAN2:
    254      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP61_LAN3:
    255      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP61_LAN4:
    256      1.1      chs 		sc->sc_flags |= NFE_40BIT_ADDR;
    257      1.1      chs 		break;
    258      1.1      chs 	case PCI_PRODUCT_NVIDIA_CK804_LAN1:
    259      1.1      chs 	case PCI_PRODUCT_NVIDIA_CK804_LAN2:
    260      1.1      chs 	case PCI_PRODUCT_NVIDIA_MCP04_LAN1:
    261      1.1      chs 	case PCI_PRODUCT_NVIDIA_MCP04_LAN2:
    262      1.1      chs 		sc->sc_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM;
    263      1.1      chs 		break;
    264      1.1      chs 	case PCI_PRODUCT_NVIDIA_MCP55_LAN1:
    265      1.1      chs 	case PCI_PRODUCT_NVIDIA_MCP55_LAN2:
    266      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP65_LAN1:
    267      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP65_LAN2:
    268      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP65_LAN3:
    269      1.4  xtraeme 	case PCI_PRODUCT_NVIDIA_MCP65_LAN4:
    270      1.1      chs 		sc->sc_flags |= NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM |
    271      1.1      chs 		    NFE_HW_VLAN;
    272      1.1      chs 		break;
    273      1.1      chs 	}
    274      1.1      chs 
    275      1.1      chs #ifndef NFE_NO_JUMBO
    276      1.1      chs 	/* enable jumbo frames for adapters that support it */
    277      1.1      chs 	if (sc->sc_flags & NFE_JUMBO_SUP)
    278      1.1      chs 		sc->sc_flags |= NFE_USE_JUMBO;
    279      1.1      chs #endif
    280      1.1      chs 
    281      1.1      chs 	/*
    282      1.1      chs 	 * Allocate Tx and Rx rings.
    283      1.1      chs 	 */
    284      1.1      chs 	if (nfe_alloc_tx_ring(sc, &sc->txq) != 0) {
    285      1.1      chs 		printf("%s: could not allocate Tx ring\n",
    286      1.1      chs 		    sc->sc_dev.dv_xname);
    287      1.1      chs 		return;
    288      1.1      chs 	}
    289      1.1      chs 
    290      1.1      chs 	if (nfe_alloc_rx_ring(sc, &sc->rxq) != 0) {
    291      1.1      chs 		printf("%s: could not allocate Rx ring\n",
    292      1.1      chs 		    sc->sc_dev.dv_xname);
    293      1.1      chs 		nfe_free_tx_ring(sc, &sc->txq);
    294      1.1      chs 		return;
    295      1.1      chs 	}
    296      1.1      chs 
    297      1.1      chs 	ifp = &sc->sc_ethercom.ec_if;
    298      1.1      chs 	ifp->if_softc = sc;
    299      1.1      chs 	ifp->if_mtu = ETHERMTU;
    300      1.1      chs 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    301      1.1      chs 	ifp->if_ioctl = nfe_ioctl;
    302      1.1      chs 	ifp->if_start = nfe_start;
    303      1.1      chs 	ifp->if_watchdog = nfe_watchdog;
    304      1.1      chs 	ifp->if_init = nfe_init;
    305      1.1      chs 	ifp->if_baudrate = IF_Gbps(1);
    306      1.1      chs 	IFQ_SET_MAXLEN(&ifp->if_snd, NFE_IFQ_MAXLEN);
    307      1.1      chs 	IFQ_SET_READY(&ifp->if_snd);
    308      1.1      chs 	strlcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
    309      1.1      chs 
    310      1.1      chs #if NVLAN > 0
    311      1.1      chs 	if (sc->sc_flags & NFE_HW_VLAN)
    312      1.1      chs 		sc->sc_ethercom.ec_capabilities |=
    313      1.1      chs 			ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_MTU;
    314      1.1      chs #endif
    315      1.1      chs #ifdef NFE_CSUM
    316      1.1      chs 	if (sc->sc_flags & NFE_HW_CSUM) {
    317      1.1      chs 		ifp->if_capabilities |= IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 |
    318      1.1      chs 		    IFCAP_CSUM_UDPv4;
    319      1.1      chs 	}
    320      1.1      chs #endif
    321      1.1      chs 
    322      1.1      chs 	sc->sc_mii.mii_ifp = ifp;
    323      1.1      chs 	sc->sc_mii.mii_readreg = nfe_miibus_readreg;
    324      1.1      chs 	sc->sc_mii.mii_writereg = nfe_miibus_writereg;
    325      1.1      chs 	sc->sc_mii.mii_statchg = nfe_miibus_statchg;
    326      1.1      chs 
    327      1.1      chs 	ifmedia_init(&sc->sc_mii.mii_media, 0, nfe_ifmedia_upd,
    328      1.1      chs 	    nfe_ifmedia_sts);
    329      1.1      chs 	mii_attach(self, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
    330      1.1      chs 	    MII_OFFSET_ANY, 0);
    331      1.1      chs 	if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
    332      1.1      chs 		printf("%s: no PHY found!\n", sc->sc_dev.dv_xname);
    333      1.1      chs 		ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_MANUAL,
    334      1.1      chs 		    0, NULL);
    335      1.1      chs 		ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_MANUAL);
    336      1.1      chs 	} else
    337      1.1      chs 		ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
    338      1.1      chs 
    339      1.1      chs 	if_attach(ifp);
    340      1.1      chs 	ether_ifattach(ifp, sc->sc_enaddr);
    341      1.1      chs 
    342      1.1      chs 	callout_init(&sc->sc_tick_ch);
    343      1.1      chs 	callout_setfunc(&sc->sc_tick_ch, nfe_tick, sc);
    344      1.1      chs 
    345  1.4.6.1     yamt 	sc->sc_powerhook = powerhook_establish(sc->sc_dev.dv_xname,
    346  1.4.6.1     yamt 	    nfe_power, sc);
    347      1.1      chs }
    348      1.1      chs 
    349      1.1      chs void
    350      1.1      chs nfe_power(int why, void *arg)
    351      1.1      chs {
    352      1.1      chs 	struct nfe_softc *sc = arg;
    353      1.1      chs 	struct ifnet *ifp;
    354      1.1      chs 
    355      1.1      chs 	if (why == PWR_RESUME) {
    356      1.1      chs 		ifp = &sc->sc_ethercom.ec_if;
    357      1.1      chs 		if (ifp->if_flags & IFF_UP) {
    358      1.1      chs 			ifp->if_flags &= ~IFF_RUNNING;
    359      1.1      chs 			nfe_init(ifp);
    360      1.1      chs 			if (ifp->if_flags & IFF_RUNNING)
    361      1.1      chs 				nfe_start(ifp);
    362      1.1      chs 		}
    363      1.1      chs 	}
    364      1.1      chs }
    365      1.1      chs 
    366      1.1      chs void
    367      1.1      chs nfe_miibus_statchg(struct device *dev)
    368      1.1      chs {
    369      1.1      chs 	struct nfe_softc *sc = (struct nfe_softc *)dev;
    370      1.1      chs 	struct mii_data *mii = &sc->sc_mii;
    371      1.1      chs 	uint32_t phy, seed, misc = NFE_MISC1_MAGIC, link = NFE_MEDIA_SET;
    372      1.1      chs 
    373      1.1      chs 	phy = NFE_READ(sc, NFE_PHY_IFACE);
    374      1.1      chs 	phy &= ~(NFE_PHY_HDX | NFE_PHY_100TX | NFE_PHY_1000T);
    375      1.1      chs 
    376      1.1      chs 	seed = NFE_READ(sc, NFE_RNDSEED);
    377      1.1      chs 	seed &= ~NFE_SEED_MASK;
    378      1.1      chs 
    379      1.1      chs 	if ((mii->mii_media_active & IFM_GMASK) == IFM_HDX) {
    380      1.1      chs 		phy  |= NFE_PHY_HDX;	/* half-duplex */
    381      1.1      chs 		misc |= NFE_MISC1_HDX;
    382      1.1      chs 	}
    383      1.1      chs 
    384      1.1      chs 	switch (IFM_SUBTYPE(mii->mii_media_active)) {
    385      1.1      chs 	case IFM_1000_T:	/* full-duplex only */
    386      1.1      chs 		link |= NFE_MEDIA_1000T;
    387      1.1      chs 		seed |= NFE_SEED_1000T;
    388      1.1      chs 		phy  |= NFE_PHY_1000T;
    389      1.1      chs 		break;
    390      1.1      chs 	case IFM_100_TX:
    391      1.1      chs 		link |= NFE_MEDIA_100TX;
    392      1.1      chs 		seed |= NFE_SEED_100TX;
    393      1.1      chs 		phy  |= NFE_PHY_100TX;
    394      1.1      chs 		break;
    395      1.1      chs 	case IFM_10_T:
    396      1.1      chs 		link |= NFE_MEDIA_10T;
    397      1.1      chs 		seed |= NFE_SEED_10T;
    398      1.1      chs 		break;
    399      1.1      chs 	}
    400      1.1      chs 
    401      1.1      chs 	NFE_WRITE(sc, NFE_RNDSEED, seed);	/* XXX: gigabit NICs only? */
    402      1.1      chs 
    403      1.1      chs 	NFE_WRITE(sc, NFE_PHY_IFACE, phy);
    404      1.1      chs 	NFE_WRITE(sc, NFE_MISC1, misc);
    405      1.1      chs 	NFE_WRITE(sc, NFE_LINKSPEED, link);
    406      1.1      chs }
    407      1.1      chs 
    408      1.1      chs int
    409      1.1      chs nfe_miibus_readreg(struct device *dev, int phy, int reg)
    410      1.1      chs {
    411      1.1      chs 	struct nfe_softc *sc = (struct nfe_softc *)dev;
    412      1.1      chs 	uint32_t val;
    413      1.1      chs 	int ntries;
    414      1.1      chs 
    415      1.1      chs 	NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
    416      1.1      chs 
    417      1.1      chs 	if (NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY) {
    418      1.1      chs 		NFE_WRITE(sc, NFE_PHY_CTL, NFE_PHY_BUSY);
    419      1.1      chs 		DELAY(100);
    420      1.1      chs 	}
    421      1.1      chs 
    422      1.1      chs 	NFE_WRITE(sc, NFE_PHY_CTL, (phy << NFE_PHYADD_SHIFT) | reg);
    423      1.1      chs 
    424      1.1      chs 	for (ntries = 0; ntries < 1000; ntries++) {
    425      1.1      chs 		DELAY(100);
    426      1.1      chs 		if (!(NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY))
    427      1.1      chs 			break;
    428      1.1      chs 	}
    429      1.1      chs 	if (ntries == 1000) {
    430      1.1      chs 		DPRINTFN(2, ("%s: timeout waiting for PHY\n",
    431      1.1      chs 		    sc->sc_dev.dv_xname));
    432      1.1      chs 		return 0;
    433      1.1      chs 	}
    434      1.1      chs 
    435      1.1      chs 	if (NFE_READ(sc, NFE_PHY_STATUS) & NFE_PHY_ERROR) {
    436      1.1      chs 		DPRINTFN(2, ("%s: could not read PHY\n",
    437      1.1      chs 		    sc->sc_dev.dv_xname));
    438      1.1      chs 		return 0;
    439      1.1      chs 	}
    440      1.1      chs 
    441      1.1      chs 	val = NFE_READ(sc, NFE_PHY_DATA);
    442      1.1      chs 	if (val != 0xffffffff && val != 0)
    443      1.1      chs 		sc->mii_phyaddr = phy;
    444      1.1      chs 
    445      1.1      chs 	DPRINTFN(2, ("%s: mii read phy %d reg 0x%x ret 0x%x\n",
    446      1.1      chs 	    sc->sc_dev.dv_xname, phy, reg, val));
    447      1.1      chs 
    448      1.1      chs 	return val;
    449      1.1      chs }
    450      1.1      chs 
    451      1.1      chs void
    452      1.1      chs nfe_miibus_writereg(struct device *dev, int phy, int reg, int val)
    453      1.1      chs {
    454      1.1      chs 	struct nfe_softc *sc = (struct nfe_softc *)dev;
    455      1.1      chs 	uint32_t ctl;
    456      1.1      chs 	int ntries;
    457      1.1      chs 
    458      1.1      chs 	NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
    459      1.1      chs 
    460      1.1      chs 	if (NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY) {
    461      1.1      chs 		NFE_WRITE(sc, NFE_PHY_CTL, NFE_PHY_BUSY);
    462      1.1      chs 		DELAY(100);
    463      1.1      chs 	}
    464      1.1      chs 
    465      1.1      chs 	NFE_WRITE(sc, NFE_PHY_DATA, val);
    466      1.1      chs 	ctl = NFE_PHY_WRITE | (phy << NFE_PHYADD_SHIFT) | reg;
    467      1.1      chs 	NFE_WRITE(sc, NFE_PHY_CTL, ctl);
    468      1.1      chs 
    469      1.1      chs 	for (ntries = 0; ntries < 1000; ntries++) {
    470      1.1      chs 		DELAY(100);
    471      1.1      chs 		if (!(NFE_READ(sc, NFE_PHY_CTL) & NFE_PHY_BUSY))
    472      1.1      chs 			break;
    473      1.1      chs 	}
    474      1.1      chs #ifdef NFE_DEBUG
    475      1.1      chs 	if (nfedebug >= 2 && ntries == 1000)
    476      1.1      chs 		printf("could not write to PHY\n");
    477      1.1      chs #endif
    478      1.1      chs }
    479      1.1      chs 
    480      1.1      chs int
    481      1.1      chs nfe_intr(void *arg)
    482      1.1      chs {
    483      1.1      chs 	struct nfe_softc *sc = arg;
    484      1.1      chs 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    485      1.1      chs 	uint32_t r;
    486      1.1      chs 
    487      1.1      chs 	if ((r = NFE_READ(sc, NFE_IRQ_STATUS)) == 0)
    488      1.1      chs 		return 0;	/* not for us */
    489      1.1      chs 	NFE_WRITE(sc, NFE_IRQ_STATUS, r);
    490      1.1      chs 
    491      1.1      chs 	DPRINTFN(5, ("nfe_intr: interrupt register %x\n", r));
    492      1.1      chs 
    493      1.1      chs 	if (r & NFE_IRQ_LINK) {
    494      1.1      chs 		NFE_READ(sc, NFE_PHY_STATUS);
    495      1.1      chs 		NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
    496      1.1      chs 		DPRINTF(("%s: link state changed\n", sc->sc_dev.dv_xname));
    497      1.1      chs 	}
    498      1.1      chs 
    499      1.1      chs 	if (ifp->if_flags & IFF_RUNNING) {
    500      1.1      chs 		/* check Rx ring */
    501      1.1      chs 		nfe_rxeof(sc);
    502      1.1      chs 
    503      1.1      chs 		/* check Tx ring */
    504      1.1      chs 		nfe_txeof(sc);
    505      1.1      chs 	}
    506      1.1      chs 
    507      1.1      chs 	return 1;
    508      1.1      chs }
    509      1.1      chs 
    510      1.1      chs int
    511      1.1      chs nfe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
    512      1.1      chs {
    513      1.1      chs 	struct nfe_softc *sc = ifp->if_softc;
    514      1.1      chs 	struct ifreq *ifr = (struct ifreq *)data;
    515      1.1      chs 	struct ifaddr *ifa = (struct ifaddr *)data;
    516      1.1      chs 	int s, error = 0;
    517      1.1      chs 
    518      1.1      chs 	s = splnet();
    519      1.1      chs 
    520      1.1      chs 	switch (cmd) {
    521      1.1      chs 	case SIOCSIFADDR:
    522      1.1      chs 		ifp->if_flags |= IFF_UP;
    523      1.1      chs 		nfe_init(ifp);
    524      1.1      chs 		switch (ifa->ifa_addr->sa_family) {
    525      1.1      chs #ifdef INET
    526      1.1      chs 		case AF_INET:
    527      1.1      chs 			arp_ifinit(ifp, ifa);
    528      1.1      chs 			break;
    529      1.1      chs #endif
    530      1.1      chs 		default:
    531      1.1      chs 			break;
    532      1.1      chs 		}
    533      1.1      chs 		break;
    534      1.1      chs 	case SIOCSIFMTU:
    535      1.1      chs 		if (ifr->ifr_mtu < ETHERMIN ||
    536      1.1      chs 		    ((sc->sc_flags & NFE_USE_JUMBO) &&
    537      1.1      chs 		    ifr->ifr_mtu > ETHERMTU_JUMBO) ||
    538      1.1      chs 		    (!(sc->sc_flags & NFE_USE_JUMBO) &&
    539      1.1      chs 		    ifr->ifr_mtu > ETHERMTU))
    540      1.1      chs 			error = EINVAL;
    541      1.1      chs 		else if (ifp->if_mtu != ifr->ifr_mtu)
    542      1.1      chs 			ifp->if_mtu = ifr->ifr_mtu;
    543      1.1      chs 		break;
    544      1.1      chs 	case SIOCSIFFLAGS:
    545      1.1      chs 		if (ifp->if_flags & IFF_UP) {
    546      1.1      chs 			/*
    547      1.1      chs 			 * If only the PROMISC or ALLMULTI flag changes, then
    548      1.1      chs 			 * don't do a full re-init of the chip, just update
    549      1.1      chs 			 * the Rx filter.
    550      1.1      chs 			 */
    551      1.1      chs 			if ((ifp->if_flags & IFF_RUNNING) &&
    552      1.1      chs 			    ((ifp->if_flags ^ sc->sc_if_flags) &
    553      1.1      chs 			     (IFF_ALLMULTI | IFF_PROMISC)) != 0)
    554      1.1      chs 				nfe_setmulti(sc);
    555      1.1      chs 			else
    556      1.1      chs 				nfe_init(ifp);
    557      1.1      chs 		} else {
    558      1.1      chs 			if (ifp->if_flags & IFF_RUNNING)
    559      1.1      chs 				nfe_stop(ifp, 1);
    560      1.1      chs 		}
    561      1.1      chs 		sc->sc_if_flags = ifp->if_flags;
    562      1.1      chs 		break;
    563      1.1      chs 	case SIOCADDMULTI:
    564      1.1      chs 	case SIOCDELMULTI:
    565      1.1      chs 		error = (cmd == SIOCADDMULTI) ?
    566      1.1      chs 		    ether_addmulti(ifr, &sc->sc_ethercom) :
    567      1.1      chs 		    ether_delmulti(ifr, &sc->sc_ethercom);
    568      1.1      chs 
    569      1.1      chs 		if (error == ENETRESET) {
    570      1.1      chs 			if (ifp->if_flags & IFF_RUNNING)
    571      1.1      chs 				nfe_setmulti(sc);
    572      1.1      chs 			error = 0;
    573      1.1      chs 		}
    574      1.1      chs 		break;
    575      1.1      chs 	case SIOCSIFMEDIA:
    576      1.1      chs 	case SIOCGIFMEDIA:
    577      1.1      chs 		error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
    578      1.1      chs 		break;
    579      1.1      chs 	default:
    580      1.1      chs 		error = ether_ioctl(ifp, cmd, data);
    581      1.1      chs 		if (error == ENETRESET) {
    582      1.1      chs 			if (ifp->if_flags & IFF_RUNNING)
    583      1.1      chs 				nfe_setmulti(sc);
    584      1.1      chs 			error = 0;
    585      1.1      chs 		}
    586      1.1      chs 		break;
    587      1.1      chs 
    588      1.1      chs 	}
    589      1.1      chs 
    590      1.1      chs 	splx(s);
    591      1.1      chs 
    592      1.1      chs 	return error;
    593      1.1      chs }
    594      1.1      chs 
    595      1.1      chs void
    596      1.1      chs nfe_txdesc32_sync(struct nfe_softc *sc, struct nfe_desc32 *desc32, int ops)
    597      1.1      chs {
    598      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->txq.map,
    599      1.1      chs 	    (caddr_t)desc32 - (caddr_t)sc->txq.desc32,
    600      1.1      chs 	    sizeof (struct nfe_desc32), ops);
    601      1.1      chs }
    602      1.1      chs 
    603      1.1      chs void
    604      1.1      chs nfe_txdesc64_sync(struct nfe_softc *sc, struct nfe_desc64 *desc64, int ops)
    605      1.1      chs {
    606      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->txq.map,
    607      1.1      chs 	    (caddr_t)desc64 - (caddr_t)sc->txq.desc64,
    608      1.1      chs 	    sizeof (struct nfe_desc64), ops);
    609      1.1      chs }
    610      1.1      chs 
    611      1.1      chs void
    612      1.1      chs nfe_txdesc32_rsync(struct nfe_softc *sc, int start, int end, int ops)
    613      1.1      chs {
    614      1.1      chs 	if (end > start) {
    615      1.1      chs 		bus_dmamap_sync(sc->sc_dmat, sc->txq.map,
    616      1.1      chs 		    (caddr_t)&sc->txq.desc32[start] - (caddr_t)sc->txq.desc32,
    617      1.1      chs 		    (caddr_t)&sc->txq.desc32[end] -
    618      1.1      chs 		    (caddr_t)&sc->txq.desc32[start], ops);
    619      1.1      chs 		return;
    620      1.1      chs 	}
    621      1.1      chs 	/* sync from 'start' to end of ring */
    622      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->txq.map,
    623      1.1      chs 	    (caddr_t)&sc->txq.desc32[start] - (caddr_t)sc->txq.desc32,
    624      1.1      chs 	    (caddr_t)&sc->txq.desc32[NFE_TX_RING_COUNT] -
    625      1.1      chs 	    (caddr_t)&sc->txq.desc32[start], ops);
    626      1.1      chs 
    627      1.1      chs 	/* sync from start of ring to 'end' */
    628      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->txq.map, 0,
    629      1.1      chs 	    (caddr_t)&sc->txq.desc32[end] - (caddr_t)sc->txq.desc32, ops);
    630      1.1      chs }
    631      1.1      chs 
    632      1.1      chs void
    633      1.1      chs nfe_txdesc64_rsync(struct nfe_softc *sc, int start, int end, int ops)
    634      1.1      chs {
    635      1.1      chs 	if (end > start) {
    636      1.1      chs 		bus_dmamap_sync(sc->sc_dmat, sc->txq.map,
    637      1.1      chs 		    (caddr_t)&sc->txq.desc64[start] - (caddr_t)sc->txq.desc64,
    638      1.1      chs 		    (caddr_t)&sc->txq.desc64[end] -
    639      1.1      chs 		    (caddr_t)&sc->txq.desc64[start], ops);
    640      1.1      chs 		return;
    641      1.1      chs 	}
    642      1.1      chs 	/* sync from 'start' to end of ring */
    643      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->txq.map,
    644      1.1      chs 	    (caddr_t)&sc->txq.desc64[start] - (caddr_t)sc->txq.desc64,
    645      1.1      chs 	    (caddr_t)&sc->txq.desc64[NFE_TX_RING_COUNT] -
    646      1.1      chs 	    (caddr_t)&sc->txq.desc64[start], ops);
    647      1.1      chs 
    648      1.1      chs 	/* sync from start of ring to 'end' */
    649      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->txq.map, 0,
    650      1.1      chs 	    (caddr_t)&sc->txq.desc64[end] - (caddr_t)sc->txq.desc64, ops);
    651      1.1      chs }
    652      1.1      chs 
    653      1.1      chs void
    654      1.1      chs nfe_rxdesc32_sync(struct nfe_softc *sc, struct nfe_desc32 *desc32, int ops)
    655      1.1      chs {
    656      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->rxq.map,
    657      1.1      chs 	    (caddr_t)desc32 - (caddr_t)sc->rxq.desc32,
    658      1.1      chs 	    sizeof (struct nfe_desc32), ops);
    659      1.1      chs }
    660      1.1      chs 
    661      1.1      chs void
    662      1.1      chs nfe_rxdesc64_sync(struct nfe_softc *sc, struct nfe_desc64 *desc64, int ops)
    663      1.1      chs {
    664      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, sc->rxq.map,
    665      1.1      chs 	    (caddr_t)desc64 - (caddr_t)sc->rxq.desc64,
    666      1.1      chs 	    sizeof (struct nfe_desc64), ops);
    667      1.1      chs }
    668      1.1      chs 
    669      1.1      chs void
    670      1.1      chs nfe_rxeof(struct nfe_softc *sc)
    671      1.1      chs {
    672      1.1      chs 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    673      1.1      chs 	struct nfe_desc32 *desc32;
    674      1.1      chs 	struct nfe_desc64 *desc64;
    675      1.1      chs 	struct nfe_rx_data *data;
    676      1.1      chs 	struct nfe_jbuf *jbuf;
    677      1.1      chs 	struct mbuf *m, *mnew;
    678      1.1      chs 	bus_addr_t physaddr;
    679      1.1      chs 	uint16_t flags;
    680      1.1      chs 	int error, len;
    681      1.1      chs 
    682      1.1      chs 	desc32 = NULL;
    683      1.1      chs 	desc64 = NULL;
    684      1.1      chs 	for (;;) {
    685      1.1      chs 		data = &sc->rxq.data[sc->rxq.cur];
    686      1.1      chs 
    687      1.1      chs 		if (sc->sc_flags & NFE_40BIT_ADDR) {
    688      1.1      chs 			desc64 = &sc->rxq.desc64[sc->rxq.cur];
    689      1.1      chs 			nfe_rxdesc64_sync(sc, desc64, BUS_DMASYNC_POSTREAD);
    690      1.1      chs 
    691      1.1      chs 			flags = le16toh(desc64->flags);
    692      1.1      chs 			len = le16toh(desc64->length) & 0x3fff;
    693      1.1      chs 		} else {
    694      1.1      chs 			desc32 = &sc->rxq.desc32[sc->rxq.cur];
    695      1.1      chs 			nfe_rxdesc32_sync(sc, desc32, BUS_DMASYNC_POSTREAD);
    696      1.1      chs 
    697      1.1      chs 			flags = le16toh(desc32->flags);
    698      1.1      chs 			len = le16toh(desc32->length) & 0x3fff;
    699      1.1      chs 		}
    700      1.1      chs 
    701      1.1      chs 		if (flags & NFE_RX_READY)
    702      1.1      chs 			break;
    703      1.1      chs 
    704      1.1      chs 		if ((sc->sc_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
    705      1.1      chs 			if (!(flags & NFE_RX_VALID_V1))
    706      1.1      chs 				goto skip;
    707      1.1      chs 
    708      1.1      chs 			if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
    709      1.1      chs 				flags &= ~NFE_RX_ERROR;
    710      1.1      chs 				len--;	/* fix buffer length */
    711      1.1      chs 			}
    712      1.1      chs 		} else {
    713      1.1      chs 			if (!(flags & NFE_RX_VALID_V2))
    714      1.1      chs 				goto skip;
    715      1.1      chs 
    716      1.1      chs 			if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
    717      1.1      chs 				flags &= ~NFE_RX_ERROR;
    718      1.1      chs 				len--;	/* fix buffer length */
    719      1.1      chs 			}
    720      1.1      chs 		}
    721      1.1      chs 
    722      1.1      chs 		if (flags & NFE_RX_ERROR) {
    723      1.1      chs 			ifp->if_ierrors++;
    724      1.1      chs 			goto skip;
    725      1.1      chs 		}
    726      1.1      chs 
    727      1.1      chs 		/*
    728      1.1      chs 		 * Try to allocate a new mbuf for this ring element and load
    729      1.1      chs 		 * it before processing the current mbuf. If the ring element
    730      1.1      chs 		 * cannot be loaded, drop the received packet and reuse the
    731      1.1      chs 		 * old mbuf. In the unlikely case that the old mbuf can't be
    732      1.1      chs 		 * reloaded either, explicitly panic.
    733      1.1      chs 		 */
    734      1.1      chs 		MGETHDR(mnew, M_DONTWAIT, MT_DATA);
    735      1.1      chs 		if (mnew == NULL) {
    736      1.1      chs 			ifp->if_ierrors++;
    737      1.1      chs 			goto skip;
    738      1.1      chs 		}
    739      1.1      chs 
    740      1.1      chs 		if (sc->sc_flags & NFE_USE_JUMBO) {
    741      1.1      chs 			if ((jbuf = nfe_jalloc(sc)) == NULL) {
    742      1.1      chs 				m_freem(mnew);
    743      1.1      chs 				ifp->if_ierrors++;
    744      1.1      chs 				goto skip;
    745      1.1      chs 			}
    746      1.1      chs 			MEXTADD(mnew, jbuf->buf, NFE_JBYTES, 0, nfe_jfree, sc);
    747      1.1      chs 
    748      1.1      chs 			bus_dmamap_sync(sc->sc_dmat, sc->rxq.jmap,
    749      1.1      chs 			    mtod(data->m, caddr_t) - sc->rxq.jpool, NFE_JBYTES,
    750      1.1      chs 			    BUS_DMASYNC_POSTREAD);
    751      1.1      chs 
    752      1.1      chs 			physaddr = jbuf->physaddr;
    753      1.1      chs 		} else {
    754      1.1      chs 			MCLGET(mnew, M_DONTWAIT);
    755      1.1      chs 			if (!(mnew->m_flags & M_EXT)) {
    756      1.1      chs 				m_freem(mnew);
    757      1.1      chs 				ifp->if_ierrors++;
    758      1.1      chs 				goto skip;
    759      1.1      chs 			}
    760      1.1      chs 
    761      1.1      chs 			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
    762      1.1      chs 			    data->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
    763      1.1      chs 			bus_dmamap_unload(sc->sc_dmat, data->map);
    764      1.1      chs 
    765      1.1      chs 			error = bus_dmamap_load(sc->sc_dmat, data->map,
    766      1.1      chs 			    mtod(mnew, void *), MCLBYTES, NULL,
    767      1.1      chs 			    BUS_DMA_READ | BUS_DMA_NOWAIT);
    768      1.1      chs 			if (error != 0) {
    769      1.1      chs 				m_freem(mnew);
    770      1.1      chs 
    771      1.1      chs 				/* try to reload the old mbuf */
    772      1.1      chs 				error = bus_dmamap_load(sc->sc_dmat, data->map,
    773      1.1      chs 				    mtod(data->m, void *), MCLBYTES, NULL,
    774      1.1      chs 				    BUS_DMA_READ | BUS_DMA_NOWAIT);
    775      1.1      chs 				if (error != 0) {
    776      1.1      chs 					/* very unlikely that it will fail.. */
    777      1.1      chs 					panic("%s: could not load old rx mbuf",
    778      1.1      chs 					    sc->sc_dev.dv_xname);
    779      1.1      chs 				}
    780      1.1      chs 				ifp->if_ierrors++;
    781      1.1      chs 				goto skip;
    782      1.1      chs 			}
    783      1.1      chs 			physaddr = data->map->dm_segs[0].ds_addr;
    784      1.1      chs 		}
    785      1.1      chs 
    786      1.1      chs 		/*
    787      1.1      chs 		 * New mbuf successfully loaded, update Rx ring and continue
    788      1.1      chs 		 * processing.
    789      1.1      chs 		 */
    790      1.1      chs 		m = data->m;
    791      1.1      chs 		data->m = mnew;
    792      1.1      chs 
    793      1.1      chs 		/* finalize mbuf */
    794      1.1      chs 		m->m_pkthdr.len = m->m_len = len;
    795      1.1      chs 		m->m_pkthdr.rcvif = ifp;
    796      1.1      chs 
    797      1.1      chs #ifdef notyet
    798      1.1      chs 		if (sc->sc_flags & NFE_HW_CSUM) {
    799      1.1      chs 			if (flags & NFE_RX_IP_CSUMOK)
    800      1.1      chs 				m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
    801      1.1      chs 			if (flags & NFE_RX_UDP_CSUMOK)
    802      1.1      chs 				m->m_pkthdr.csum_flags |= M_UDP_CSUM_IN_OK;
    803      1.1      chs 			if (flags & NFE_RX_TCP_CSUMOK)
    804      1.1      chs 				m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK;
    805      1.1      chs 		}
    806      1.1      chs #elif defined(NFE_CSUM)
    807      1.1      chs 		if ((sc->sc_flags & NFE_HW_CSUM) && (flags & NFE_RX_CSUMOK))
    808      1.1      chs 			m->m_pkthdr.csum_flags = M_IPV4_CSUM_IN_OK;
    809      1.1      chs #endif
    810      1.1      chs 
    811      1.1      chs #if NBPFILTER > 0
    812      1.1      chs 		if (ifp->if_bpf)
    813      1.1      chs 			bpf_mtap(ifp->if_bpf, m);
    814      1.1      chs #endif
    815      1.1      chs 		ifp->if_ipackets++;
    816      1.1      chs 		(*ifp->if_input)(ifp, m);
    817      1.1      chs 
    818      1.1      chs 		/* update mapping address in h/w descriptor */
    819      1.1      chs 		if (sc->sc_flags & NFE_40BIT_ADDR) {
    820      1.1      chs #if defined(__LP64__)
    821      1.1      chs 			desc64->physaddr[0] = htole32(physaddr >> 32);
    822      1.1      chs #endif
    823      1.1      chs 			desc64->physaddr[1] = htole32(physaddr & 0xffffffff);
    824      1.1      chs 		} else {
    825      1.1      chs 			desc32->physaddr = htole32(physaddr);
    826      1.1      chs 		}
    827      1.1      chs 
    828      1.1      chs skip:		if (sc->sc_flags & NFE_40BIT_ADDR) {
    829      1.1      chs 			desc64->length = htole16(sc->rxq.bufsz);
    830      1.1      chs 			desc64->flags = htole16(NFE_RX_READY);
    831      1.1      chs 
    832      1.1      chs 			nfe_rxdesc64_sync(sc, desc64, BUS_DMASYNC_PREWRITE);
    833      1.1      chs 		} else {
    834      1.1      chs 			desc32->length = htole16(sc->rxq.bufsz);
    835      1.1      chs 			desc32->flags = htole16(NFE_RX_READY);
    836      1.1      chs 
    837      1.1      chs 			nfe_rxdesc32_sync(sc, desc32, BUS_DMASYNC_PREWRITE);
    838      1.1      chs 		}
    839      1.1      chs 
    840      1.1      chs 		sc->rxq.cur = (sc->rxq.cur + 1) % NFE_RX_RING_COUNT;
    841      1.1      chs 	}
    842      1.1      chs }
    843      1.1      chs 
    844      1.1      chs void
    845      1.1      chs nfe_txeof(struct nfe_softc *sc)
    846      1.1      chs {
    847      1.1      chs 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
    848      1.1      chs 	struct nfe_desc32 *desc32;
    849      1.1      chs 	struct nfe_desc64 *desc64;
    850      1.1      chs 	struct nfe_tx_data *data = NULL;
    851      1.1      chs 	uint16_t flags;
    852      1.1      chs 
    853      1.1      chs 	while (sc->txq.next != sc->txq.cur) {
    854      1.1      chs 		if (sc->sc_flags & NFE_40BIT_ADDR) {
    855      1.1      chs 			desc64 = &sc->txq.desc64[sc->txq.next];
    856      1.1      chs 			nfe_txdesc64_sync(sc, desc64, BUS_DMASYNC_POSTREAD);
    857      1.1      chs 
    858      1.1      chs 			flags = le16toh(desc64->flags);
    859      1.1      chs 		} else {
    860      1.1      chs 			desc32 = &sc->txq.desc32[sc->txq.next];
    861      1.1      chs 			nfe_txdesc32_sync(sc, desc32, BUS_DMASYNC_POSTREAD);
    862      1.1      chs 
    863      1.1      chs 			flags = le16toh(desc32->flags);
    864      1.1      chs 		}
    865      1.1      chs 
    866      1.1      chs 		if (flags & NFE_TX_VALID)
    867      1.1      chs 			break;
    868      1.1      chs 
    869      1.1      chs 		data = &sc->txq.data[sc->txq.next];
    870      1.1      chs 
    871      1.1      chs 		if ((sc->sc_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
    872      1.3      chs 			if (!(flags & NFE_TX_LASTFRAG_V1) && data->m == NULL)
    873      1.1      chs 				goto skip;
    874      1.1      chs 
    875      1.1      chs 			if ((flags & NFE_TX_ERROR_V1) != 0) {
    876      1.1      chs 				printf("%s: tx v1 error 0x%04x\n",
    877      1.1      chs 				    sc->sc_dev.dv_xname, flags);
    878      1.1      chs 				ifp->if_oerrors++;
    879      1.1      chs 			} else
    880      1.1      chs 				ifp->if_opackets++;
    881      1.1      chs 		} else {
    882      1.3      chs 			if (!(flags & NFE_TX_LASTFRAG_V2) && data->m == NULL)
    883      1.1      chs 				goto skip;
    884      1.1      chs 
    885      1.1      chs 			if ((flags & NFE_TX_ERROR_V2) != 0) {
    886      1.1      chs 				printf("%s: tx v2 error 0x%04x\n",
    887      1.1      chs 				    sc->sc_dev.dv_xname, flags);
    888      1.1      chs 				ifp->if_oerrors++;
    889      1.1      chs 			} else
    890      1.1      chs 				ifp->if_opackets++;
    891      1.1      chs 		}
    892      1.1      chs 
    893      1.1      chs 		if (data->m == NULL) {	/* should not get there */
    894      1.1      chs 			printf("%s: last fragment bit w/o associated mbuf!\n",
    895      1.1      chs 			    sc->sc_dev.dv_xname);
    896      1.1      chs 			goto skip;
    897      1.1      chs 		}
    898      1.1      chs 
    899      1.1      chs 		/* last fragment of the mbuf chain transmitted */
    900      1.1      chs 		bus_dmamap_sync(sc->sc_dmat, data->active, 0,
    901      1.1      chs 		    data->active->dm_mapsize, BUS_DMASYNC_POSTWRITE);
    902      1.1      chs 		bus_dmamap_unload(sc->sc_dmat, data->active);
    903      1.1      chs 		m_freem(data->m);
    904      1.1      chs 		data->m = NULL;
    905      1.1      chs 
    906      1.1      chs 		ifp->if_timer = 0;
    907      1.1      chs 
    908      1.1      chs skip:		sc->txq.queued--;
    909      1.1      chs 		sc->txq.next = (sc->txq.next + 1) % NFE_TX_RING_COUNT;
    910      1.1      chs 	}
    911      1.1      chs 
    912      1.1      chs 	if (data != NULL) {	/* at least one slot freed */
    913      1.1      chs 		ifp->if_flags &= ~IFF_OACTIVE;
    914      1.1      chs 		nfe_start(ifp);
    915      1.1      chs 	}
    916      1.1      chs }
    917      1.1      chs 
    918      1.1      chs int
    919      1.1      chs nfe_encap(struct nfe_softc *sc, struct mbuf *m0)
    920      1.1      chs {
    921      1.1      chs 	struct nfe_desc32 *desc32;
    922      1.1      chs 	struct nfe_desc64 *desc64;
    923      1.1      chs 	struct nfe_tx_data *data;
    924      1.1      chs 	bus_dmamap_t map;
    925      1.1      chs 	uint16_t flags = NFE_TX_VALID;
    926      1.1      chs #if NVLAN > 0
    927      1.1      chs 	struct m_tag *mtag;
    928      1.1      chs 	uint32_t vtag = 0;
    929      1.1      chs #endif
    930      1.1      chs 	int error, i;
    931      1.1      chs 
    932      1.1      chs 	desc32 = NULL;
    933      1.1      chs 	desc64 = NULL;
    934      1.1      chs 	data = NULL;
    935      1.1      chs 	map = sc->txq.data[sc->txq.cur].map;
    936      1.1      chs 
    937      1.1      chs 	error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m0, BUS_DMA_NOWAIT);
    938      1.1      chs 	if (error != 0) {
    939      1.1      chs 		printf("%s: could not map mbuf (error %d)\n",
    940      1.1      chs 		    sc->sc_dev.dv_xname, error);
    941      1.1      chs 		return error;
    942      1.1      chs 	}
    943      1.1      chs 
    944      1.1      chs 	if (sc->txq.queued + map->dm_nsegs >= NFE_TX_RING_COUNT - 1) {
    945      1.1      chs 		bus_dmamap_unload(sc->sc_dmat, map);
    946      1.1      chs 		return ENOBUFS;
    947      1.1      chs 	}
    948      1.1      chs 
    949      1.1      chs #if NVLAN > 0
    950      1.1      chs 	/* setup h/w VLAN tagging */
    951      1.1      chs 	if (sc->sc_ethercom.ec_nvlans) {
    952      1.1      chs 		mtag = m_tag_find(m0, PACKET_TAG_VLAN, NULL);
    953      1.1      chs 		vtag = NFE_TX_VTAG | VLAN_TAG_VALUE(mtag);
    954      1.1      chs 	}
    955      1.1      chs #endif
    956      1.1      chs #ifdef NFE_CSUM
    957      1.1      chs 	if (m0->m_pkthdr.csum_flags & M_IPV4_CSUM_OUT)
    958      1.1      chs 		flags |= NFE_TX_IP_CSUM;
    959      1.1      chs 	if (m0->m_pkthdr.csum_flags & (M_TCPV4_CSUM_OUT | M_UDPV4_CSUM_OUT))
    960      1.1      chs 		flags |= NFE_TX_TCP_CSUM;
    961      1.1      chs #endif
    962      1.1      chs 
    963      1.1      chs 	for (i = 0; i < map->dm_nsegs; i++) {
    964      1.1      chs 		data = &sc->txq.data[sc->txq.cur];
    965      1.1      chs 
    966      1.1      chs 		if (sc->sc_flags & NFE_40BIT_ADDR) {
    967      1.1      chs 			desc64 = &sc->txq.desc64[sc->txq.cur];
    968      1.1      chs #if defined(__LP64__)
    969      1.1      chs 			desc64->physaddr[0] =
    970      1.1      chs 			    htole32(map->dm_segs[i].ds_addr >> 32);
    971      1.1      chs #endif
    972      1.1      chs 			desc64->physaddr[1] =
    973      1.1      chs 			    htole32(map->dm_segs[i].ds_addr & 0xffffffff);
    974      1.1      chs 			desc64->length = htole16(map->dm_segs[i].ds_len - 1);
    975      1.1      chs 			desc64->flags = htole16(flags);
    976      1.1      chs #if NVLAN > 0
    977      1.1      chs 			desc64->vtag = htole32(vtag);
    978      1.1      chs #endif
    979      1.1      chs 		} else {
    980      1.1      chs 			desc32 = &sc->txq.desc32[sc->txq.cur];
    981      1.1      chs 
    982      1.1      chs 			desc32->physaddr = htole32(map->dm_segs[i].ds_addr);
    983      1.1      chs 			desc32->length = htole16(map->dm_segs[i].ds_len - 1);
    984      1.1      chs 			desc32->flags = htole16(flags);
    985      1.1      chs 		}
    986      1.1      chs 
    987      1.1      chs 		/* csum flags and vtag belong to the first fragment only */
    988      1.1      chs 		if (map->dm_nsegs > 1) {
    989      1.1      chs 			flags &= ~(NFE_TX_IP_CSUM | NFE_TX_TCP_CSUM);
    990      1.1      chs #if NVLAN > 0
    991      1.1      chs 			vtag = 0;
    992      1.1      chs #endif
    993      1.1      chs 		}
    994      1.1      chs 
    995      1.1      chs 		sc->txq.queued++;
    996      1.1      chs 		sc->txq.cur = (sc->txq.cur + 1) % NFE_TX_RING_COUNT;
    997      1.1      chs 	}
    998      1.1      chs 
    999      1.1      chs 	/* the whole mbuf chain has been DMA mapped, fix last descriptor */
   1000      1.1      chs 	if (sc->sc_flags & NFE_40BIT_ADDR) {
   1001      1.1      chs 		flags |= NFE_TX_LASTFRAG_V2;
   1002      1.1      chs 		desc64->flags = htole16(flags);
   1003      1.1      chs 	} else {
   1004      1.1      chs 		if (sc->sc_flags & NFE_JUMBO_SUP)
   1005      1.1      chs 			flags |= NFE_TX_LASTFRAG_V2;
   1006      1.1      chs 		else
   1007      1.1      chs 			flags |= NFE_TX_LASTFRAG_V1;
   1008      1.1      chs 		desc32->flags = htole16(flags);
   1009      1.1      chs 	}
   1010      1.1      chs 
   1011      1.1      chs 	data->m = m0;
   1012      1.1      chs 	data->active = map;
   1013      1.1      chs 
   1014      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize,
   1015      1.1      chs 	    BUS_DMASYNC_PREWRITE);
   1016      1.1      chs 
   1017      1.1      chs 	return 0;
   1018      1.1      chs }
   1019      1.1      chs 
   1020      1.1      chs void
   1021      1.1      chs nfe_start(struct ifnet *ifp)
   1022      1.1      chs {
   1023      1.1      chs 	struct nfe_softc *sc = ifp->if_softc;
   1024      1.1      chs 	int old = sc->txq.cur;
   1025      1.1      chs 	struct mbuf *m0;
   1026      1.1      chs 
   1027      1.1      chs 	for (;;) {
   1028      1.1      chs 		IFQ_POLL(&ifp->if_snd, m0);
   1029      1.1      chs 		if (m0 == NULL)
   1030      1.1      chs 			break;
   1031      1.1      chs 
   1032      1.1      chs 		if (nfe_encap(sc, m0) != 0) {
   1033      1.1      chs 			ifp->if_flags |= IFF_OACTIVE;
   1034      1.1      chs 			break;
   1035      1.1      chs 		}
   1036      1.1      chs 
   1037      1.1      chs 		/* packet put in h/w queue, remove from s/w queue */
   1038      1.1      chs 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   1039      1.1      chs 
   1040      1.1      chs #if NBPFILTER > 0
   1041      1.1      chs 		if (ifp->if_bpf != NULL)
   1042      1.1      chs 			bpf_mtap(ifp->if_bpf, m0);
   1043      1.1      chs #endif
   1044      1.1      chs 	}
   1045      1.1      chs 	if (sc->txq.cur == old)	/* nothing sent */
   1046      1.1      chs 		return;
   1047      1.1      chs 
   1048      1.1      chs 	if (sc->sc_flags & NFE_40BIT_ADDR)
   1049      1.1      chs 		nfe_txdesc64_rsync(sc, old, sc->txq.cur, BUS_DMASYNC_PREWRITE);
   1050      1.1      chs 	else
   1051      1.1      chs 		nfe_txdesc32_rsync(sc, old, sc->txq.cur, BUS_DMASYNC_PREWRITE);
   1052      1.1      chs 
   1053      1.1      chs 	/* kick Tx */
   1054      1.1      chs 	NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl);
   1055      1.1      chs 
   1056      1.1      chs 	/*
   1057      1.1      chs 	 * Set a timeout in case the chip goes out to lunch.
   1058      1.1      chs 	 */
   1059      1.1      chs 	ifp->if_timer = 5;
   1060      1.1      chs }
   1061      1.1      chs 
   1062      1.1      chs void
   1063      1.1      chs nfe_watchdog(struct ifnet *ifp)
   1064      1.1      chs {
   1065      1.1      chs 	struct nfe_softc *sc = ifp->if_softc;
   1066      1.1      chs 
   1067      1.1      chs 	printf("%s: watchdog timeout\n", sc->sc_dev.dv_xname);
   1068      1.1      chs 
   1069      1.1      chs 	ifp->if_flags &= ~IFF_RUNNING;
   1070      1.1      chs 	nfe_init(ifp);
   1071      1.1      chs 
   1072      1.1      chs 	ifp->if_oerrors++;
   1073      1.1      chs }
   1074      1.1      chs 
   1075      1.1      chs int
   1076      1.1      chs nfe_init(struct ifnet *ifp)
   1077      1.1      chs {
   1078      1.1      chs 	struct nfe_softc *sc = ifp->if_softc;
   1079      1.1      chs 	uint32_t tmp;
   1080      1.1      chs 
   1081      1.1      chs 	if (ifp->if_flags & IFF_RUNNING)
   1082      1.1      chs 		return 0;
   1083      1.1      chs 
   1084      1.1      chs 	nfe_stop(ifp, 0);
   1085      1.1      chs 
   1086      1.1      chs 	NFE_WRITE(sc, NFE_TX_UNK, 0);
   1087      1.1      chs 	NFE_WRITE(sc, NFE_STATUS, 0);
   1088      1.1      chs 
   1089      1.1      chs 	sc->rxtxctl = NFE_RXTX_BIT2;
   1090      1.1      chs 	if (sc->sc_flags & NFE_40BIT_ADDR)
   1091      1.1      chs 		sc->rxtxctl |= NFE_RXTX_V3MAGIC;
   1092      1.1      chs 	else if (sc->sc_flags & NFE_JUMBO_SUP)
   1093      1.1      chs 		sc->rxtxctl |= NFE_RXTX_V2MAGIC;
   1094      1.1      chs #ifdef NFE_CSUM
   1095      1.1      chs 	if (sc->sc_flags & NFE_HW_CSUM)
   1096      1.1      chs 		sc->rxtxctl |= NFE_RXTX_RXCSUM;
   1097      1.1      chs #endif
   1098      1.1      chs #if NVLAN > 0
   1099      1.1      chs 	/*
   1100      1.1      chs 	 * Although the adapter is capable of stripping VLAN tags from received
   1101      1.1      chs 	 * frames (NFE_RXTX_VTAG_STRIP), we do not enable this functionality on
   1102      1.1      chs 	 * purpose.  This will be done in software by our network stack.
   1103      1.1      chs 	 */
   1104      1.1      chs 	if (sc->sc_flags & NFE_HW_VLAN)
   1105      1.1      chs 		sc->rxtxctl |= NFE_RXTX_VTAG_INSERT;
   1106      1.1      chs #endif
   1107      1.1      chs 	NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | sc->rxtxctl);
   1108      1.1      chs 	DELAY(10);
   1109      1.1      chs 	NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl);
   1110      1.1      chs 
   1111      1.1      chs #if NVLAN
   1112      1.1      chs 	if (sc->sc_flags & NFE_HW_VLAN)
   1113      1.1      chs 		NFE_WRITE(sc, NFE_VTAG_CTL, NFE_VTAG_ENABLE);
   1114      1.1      chs #endif
   1115      1.1      chs 
   1116      1.1      chs 	NFE_WRITE(sc, NFE_SETUP_R6, 0);
   1117      1.1      chs 
   1118      1.1      chs 	/* set MAC address */
   1119      1.1      chs 	nfe_set_macaddr(sc, sc->sc_enaddr);
   1120      1.1      chs 
   1121      1.1      chs 	/* tell MAC where rings are in memory */
   1122      1.1      chs #ifdef __LP64__
   1123      1.1      chs 	NFE_WRITE(sc, NFE_RX_RING_ADDR_HI, sc->rxq.physaddr >> 32);
   1124      1.1      chs #endif
   1125      1.1      chs 	NFE_WRITE(sc, NFE_RX_RING_ADDR_LO, sc->rxq.physaddr & 0xffffffff);
   1126      1.1      chs #ifdef __LP64__
   1127      1.1      chs 	NFE_WRITE(sc, NFE_TX_RING_ADDR_HI, sc->txq.physaddr >> 32);
   1128      1.1      chs #endif
   1129      1.1      chs 	NFE_WRITE(sc, NFE_TX_RING_ADDR_LO, sc->txq.physaddr & 0xffffffff);
   1130      1.1      chs 
   1131      1.1      chs 	NFE_WRITE(sc, NFE_RING_SIZE,
   1132      1.1      chs 	    (NFE_RX_RING_COUNT - 1) << 16 |
   1133      1.1      chs 	    (NFE_TX_RING_COUNT - 1));
   1134      1.1      chs 
   1135      1.1      chs 	NFE_WRITE(sc, NFE_RXBUFSZ, sc->rxq.bufsz);
   1136      1.1      chs 
   1137      1.1      chs 	/* force MAC to wakeup */
   1138      1.1      chs 	tmp = NFE_READ(sc, NFE_PWR_STATE);
   1139      1.1      chs 	NFE_WRITE(sc, NFE_PWR_STATE, tmp | NFE_PWR_WAKEUP);
   1140      1.1      chs 	DELAY(10);
   1141      1.1      chs 	tmp = NFE_READ(sc, NFE_PWR_STATE);
   1142      1.1      chs 	NFE_WRITE(sc, NFE_PWR_STATE, tmp | NFE_PWR_VALID);
   1143      1.1      chs 
   1144      1.1      chs #if 1
   1145      1.1      chs 	/* configure interrupts coalescing/mitigation */
   1146      1.1      chs 	NFE_WRITE(sc, NFE_IMTIMER, NFE_IM_DEFAULT);
   1147      1.1      chs #else
   1148      1.1      chs 	/* no interrupt mitigation: one interrupt per packet */
   1149      1.1      chs 	NFE_WRITE(sc, NFE_IMTIMER, 970);
   1150      1.1      chs #endif
   1151      1.1      chs 
   1152      1.1      chs 	NFE_WRITE(sc, NFE_SETUP_R1, NFE_R1_MAGIC);
   1153      1.1      chs 	NFE_WRITE(sc, NFE_SETUP_R2, NFE_R2_MAGIC);
   1154      1.1      chs 	NFE_WRITE(sc, NFE_SETUP_R6, NFE_R6_MAGIC);
   1155      1.1      chs 
   1156      1.1      chs 	/* update MAC knowledge of PHY; generates a NFE_IRQ_LINK interrupt */
   1157      1.1      chs 	NFE_WRITE(sc, NFE_STATUS, sc->mii_phyaddr << 24 | NFE_STATUS_MAGIC);
   1158      1.1      chs 
   1159      1.1      chs 	NFE_WRITE(sc, NFE_SETUP_R4, NFE_R4_MAGIC);
   1160      1.1      chs 	NFE_WRITE(sc, NFE_WOL_CTL, NFE_WOL_MAGIC);
   1161      1.1      chs 
   1162      1.1      chs 	sc->rxtxctl &= ~NFE_RXTX_BIT2;
   1163      1.1      chs 	NFE_WRITE(sc, NFE_RXTX_CTL, sc->rxtxctl);
   1164      1.1      chs 	DELAY(10);
   1165      1.1      chs 	NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT1 | sc->rxtxctl);
   1166      1.1      chs 
   1167      1.1      chs 	/* set Rx filter */
   1168      1.1      chs 	nfe_setmulti(sc);
   1169      1.1      chs 
   1170      1.1      chs 	nfe_ifmedia_upd(ifp);
   1171      1.1      chs 
   1172      1.1      chs 	/* enable Rx */
   1173      1.1      chs 	NFE_WRITE(sc, NFE_RX_CTL, NFE_RX_START);
   1174      1.1      chs 
   1175      1.1      chs 	/* enable Tx */
   1176      1.1      chs 	NFE_WRITE(sc, NFE_TX_CTL, NFE_TX_START);
   1177      1.1      chs 
   1178      1.1      chs 	NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
   1179      1.1      chs 
   1180      1.1      chs 	/* enable interrupts */
   1181      1.1      chs 	NFE_WRITE(sc, NFE_IRQ_MASK, NFE_IRQ_WANTED);
   1182      1.1      chs 
   1183      1.1      chs 	callout_schedule(&sc->sc_tick_ch, hz);
   1184      1.1      chs 
   1185      1.1      chs 	ifp->if_flags |= IFF_RUNNING;
   1186      1.1      chs 	ifp->if_flags &= ~IFF_OACTIVE;
   1187      1.1      chs 
   1188      1.1      chs 	return 0;
   1189      1.1      chs }
   1190      1.1      chs 
   1191      1.1      chs void
   1192  1.4.6.2     yamt nfe_stop(struct ifnet *ifp, int disable)
   1193      1.1      chs {
   1194      1.1      chs 	struct nfe_softc *sc = ifp->if_softc;
   1195      1.1      chs 
   1196      1.1      chs 	callout_stop(&sc->sc_tick_ch);
   1197      1.1      chs 
   1198      1.1      chs 	ifp->if_timer = 0;
   1199      1.1      chs 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   1200      1.1      chs 
   1201      1.1      chs 	mii_down(&sc->sc_mii);
   1202      1.1      chs 
   1203      1.1      chs 	/* abort Tx */
   1204      1.1      chs 	NFE_WRITE(sc, NFE_TX_CTL, 0);
   1205      1.1      chs 
   1206      1.1      chs 	/* disable Rx */
   1207      1.1      chs 	NFE_WRITE(sc, NFE_RX_CTL, 0);
   1208      1.1      chs 
   1209      1.1      chs 	/* disable interrupts */
   1210      1.1      chs 	NFE_WRITE(sc, NFE_IRQ_MASK, 0);
   1211      1.1      chs 
   1212      1.1      chs 	/* reset Tx and Rx rings */
   1213      1.1      chs 	nfe_reset_tx_ring(sc, &sc->txq);
   1214      1.1      chs 	nfe_reset_rx_ring(sc, &sc->rxq);
   1215      1.1      chs }
   1216      1.1      chs 
   1217      1.1      chs int
   1218      1.1      chs nfe_alloc_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
   1219      1.1      chs {
   1220      1.1      chs 	struct nfe_desc32 *desc32;
   1221      1.1      chs 	struct nfe_desc64 *desc64;
   1222      1.1      chs 	struct nfe_rx_data *data;
   1223      1.1      chs 	struct nfe_jbuf *jbuf;
   1224      1.1      chs 	void **desc;
   1225      1.1      chs 	bus_addr_t physaddr;
   1226      1.1      chs 	int i, nsegs, error, descsize;
   1227      1.1      chs 
   1228      1.1      chs 	if (sc->sc_flags & NFE_40BIT_ADDR) {
   1229      1.1      chs 		desc = (void **)&ring->desc64;
   1230      1.1      chs 		descsize = sizeof (struct nfe_desc64);
   1231      1.1      chs 	} else {
   1232      1.1      chs 		desc = (void **)&ring->desc32;
   1233      1.1      chs 		descsize = sizeof (struct nfe_desc32);
   1234      1.1      chs 	}
   1235      1.1      chs 
   1236      1.1      chs 	ring->cur = ring->next = 0;
   1237      1.1      chs 	ring->bufsz = MCLBYTES;
   1238      1.1      chs 
   1239      1.1      chs 	error = bus_dmamap_create(sc->sc_dmat, NFE_RX_RING_COUNT * descsize, 1,
   1240      1.1      chs 	    NFE_RX_RING_COUNT * descsize, 0, BUS_DMA_NOWAIT, &ring->map);
   1241      1.1      chs 	if (error != 0) {
   1242      1.1      chs 		printf("%s: could not create desc DMA map\n",
   1243      1.1      chs 		    sc->sc_dev.dv_xname);
   1244      1.1      chs 		goto fail;
   1245      1.1      chs 	}
   1246      1.1      chs 
   1247      1.1      chs 	error = bus_dmamem_alloc(sc->sc_dmat, NFE_RX_RING_COUNT * descsize,
   1248      1.1      chs 	    PAGE_SIZE, 0, &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT);
   1249      1.1      chs 	if (error != 0) {
   1250      1.1      chs 		printf("%s: could not allocate DMA memory\n",
   1251      1.1      chs 		    sc->sc_dev.dv_xname);
   1252      1.1      chs 		goto fail;
   1253      1.1      chs 	}
   1254      1.1      chs 
   1255      1.1      chs 	error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs,
   1256      1.1      chs 	    NFE_RX_RING_COUNT * descsize, (caddr_t *)desc, BUS_DMA_NOWAIT);
   1257      1.1      chs 	if (error != 0) {
   1258      1.1      chs 		printf("%s: could not map desc DMA memory\n",
   1259      1.1      chs 		    sc->sc_dev.dv_xname);
   1260      1.1      chs 		goto fail;
   1261      1.1      chs 	}
   1262      1.1      chs 
   1263      1.1      chs 	error = bus_dmamap_load(sc->sc_dmat, ring->map, *desc,
   1264      1.1      chs 	    NFE_RX_RING_COUNT * descsize, NULL, BUS_DMA_NOWAIT);
   1265      1.1      chs 	if (error != 0) {
   1266      1.1      chs 		printf("%s: could not load desc DMA map\n",
   1267      1.1      chs 		    sc->sc_dev.dv_xname);
   1268      1.1      chs 		goto fail;
   1269      1.1      chs 	}
   1270      1.1      chs 
   1271      1.1      chs 	bzero(*desc, NFE_RX_RING_COUNT * descsize);
   1272      1.1      chs 	ring->physaddr = ring->map->dm_segs[0].ds_addr;
   1273      1.1      chs 
   1274      1.1      chs 	if (sc->sc_flags & NFE_USE_JUMBO) {
   1275      1.1      chs 		ring->bufsz = NFE_JBYTES;
   1276      1.1      chs 		if ((error = nfe_jpool_alloc(sc)) != 0) {
   1277      1.1      chs 			printf("%s: could not allocate jumbo frames\n",
   1278      1.1      chs 			    sc->sc_dev.dv_xname);
   1279      1.1      chs 			goto fail;
   1280      1.1      chs 		}
   1281      1.1      chs 	}
   1282      1.1      chs 
   1283      1.1      chs 	/*
   1284      1.1      chs 	 * Pre-allocate Rx buffers and populate Rx ring.
   1285      1.1      chs 	 */
   1286      1.1      chs 	for (i = 0; i < NFE_RX_RING_COUNT; i++) {
   1287      1.1      chs 		data = &sc->rxq.data[i];
   1288      1.1      chs 
   1289      1.1      chs 		MGETHDR(data->m, M_DONTWAIT, MT_DATA);
   1290      1.1      chs 		if (data->m == NULL) {
   1291      1.1      chs 			printf("%s: could not allocate rx mbuf\n",
   1292      1.1      chs 			    sc->sc_dev.dv_xname);
   1293      1.1      chs 			error = ENOMEM;
   1294      1.1      chs 			goto fail;
   1295      1.1      chs 		}
   1296      1.1      chs 
   1297      1.1      chs 		if (sc->sc_flags & NFE_USE_JUMBO) {
   1298      1.1      chs 			if ((jbuf = nfe_jalloc(sc)) == NULL) {
   1299      1.1      chs 				printf("%s: could not allocate jumbo buffer\n",
   1300      1.1      chs 				    sc->sc_dev.dv_xname);
   1301      1.1      chs 				goto fail;
   1302      1.1      chs 			}
   1303      1.1      chs 			MEXTADD(data->m, jbuf->buf, NFE_JBYTES, 0, nfe_jfree,
   1304      1.1      chs 			    sc);
   1305      1.1      chs 
   1306      1.1      chs 			physaddr = jbuf->physaddr;
   1307      1.1      chs 		} else {
   1308      1.1      chs 			error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
   1309      1.1      chs 			    MCLBYTES, 0, BUS_DMA_NOWAIT, &data->map);
   1310      1.1      chs 			if (error != 0) {
   1311      1.1      chs 				printf("%s: could not create DMA map\n",
   1312      1.1      chs 				    sc->sc_dev.dv_xname);
   1313      1.1      chs 				goto fail;
   1314      1.1      chs 			}
   1315      1.1      chs 			MCLGET(data->m, M_DONTWAIT);
   1316      1.1      chs 			if (!(data->m->m_flags & M_EXT)) {
   1317      1.1      chs 				printf("%s: could not allocate mbuf cluster\n",
   1318      1.1      chs 				    sc->sc_dev.dv_xname);
   1319      1.1      chs 				error = ENOMEM;
   1320      1.1      chs 				goto fail;
   1321      1.1      chs 			}
   1322      1.1      chs 
   1323      1.1      chs 			error = bus_dmamap_load(sc->sc_dmat, data->map,
   1324      1.1      chs 			    mtod(data->m, void *), MCLBYTES, NULL,
   1325      1.1      chs 			    BUS_DMA_READ | BUS_DMA_NOWAIT);
   1326      1.1      chs 			if (error != 0) {
   1327      1.1      chs 				printf("%s: could not load rx buf DMA map",
   1328      1.1      chs 				    sc->sc_dev.dv_xname);
   1329      1.1      chs 				goto fail;
   1330      1.1      chs 			}
   1331      1.1      chs 			physaddr = data->map->dm_segs[0].ds_addr;
   1332      1.1      chs 		}
   1333      1.1      chs 
   1334      1.1      chs 		if (sc->sc_flags & NFE_40BIT_ADDR) {
   1335      1.1      chs 			desc64 = &sc->rxq.desc64[i];
   1336      1.1      chs #if defined(__LP64__)
   1337      1.1      chs 			desc64->physaddr[0] = htole32(physaddr >> 32);
   1338      1.1      chs #endif
   1339      1.1      chs 			desc64->physaddr[1] = htole32(physaddr & 0xffffffff);
   1340      1.1      chs 			desc64->length = htole16(sc->rxq.bufsz);
   1341      1.1      chs 			desc64->flags = htole16(NFE_RX_READY);
   1342      1.1      chs 		} else {
   1343      1.1      chs 			desc32 = &sc->rxq.desc32[i];
   1344      1.1      chs 			desc32->physaddr = htole32(physaddr);
   1345      1.1      chs 			desc32->length = htole16(sc->rxq.bufsz);
   1346      1.1      chs 			desc32->flags = htole16(NFE_RX_READY);
   1347      1.1      chs 		}
   1348      1.1      chs 	}
   1349      1.1      chs 
   1350      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize,
   1351      1.1      chs 	    BUS_DMASYNC_PREWRITE);
   1352      1.1      chs 
   1353      1.1      chs 	return 0;
   1354      1.1      chs 
   1355      1.1      chs fail:	nfe_free_rx_ring(sc, ring);
   1356      1.1      chs 	return error;
   1357      1.1      chs }
   1358      1.1      chs 
   1359      1.1      chs void
   1360      1.1      chs nfe_reset_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
   1361      1.1      chs {
   1362      1.1      chs 	int i;
   1363      1.1      chs 
   1364      1.1      chs 	for (i = 0; i < NFE_RX_RING_COUNT; i++) {
   1365      1.1      chs 		if (sc->sc_flags & NFE_40BIT_ADDR) {
   1366      1.1      chs 			ring->desc64[i].length = htole16(ring->bufsz);
   1367      1.1      chs 			ring->desc64[i].flags = htole16(NFE_RX_READY);
   1368      1.1      chs 		} else {
   1369      1.1      chs 			ring->desc32[i].length = htole16(ring->bufsz);
   1370      1.1      chs 			ring->desc32[i].flags = htole16(NFE_RX_READY);
   1371      1.1      chs 		}
   1372      1.1      chs 	}
   1373      1.1      chs 
   1374      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize,
   1375      1.1      chs 	    BUS_DMASYNC_PREWRITE);
   1376      1.1      chs 
   1377      1.1      chs 	ring->cur = ring->next = 0;
   1378      1.1      chs }
   1379      1.1      chs 
   1380      1.1      chs void
   1381      1.1      chs nfe_free_rx_ring(struct nfe_softc *sc, struct nfe_rx_ring *ring)
   1382      1.1      chs {
   1383      1.1      chs 	struct nfe_rx_data *data;
   1384      1.1      chs 	void *desc;
   1385      1.1      chs 	int i, descsize;
   1386      1.1      chs 
   1387      1.1      chs 	if (sc->sc_flags & NFE_40BIT_ADDR) {
   1388      1.1      chs 		desc = ring->desc64;
   1389      1.1      chs 		descsize = sizeof (struct nfe_desc64);
   1390      1.1      chs 	} else {
   1391      1.1      chs 		desc = ring->desc32;
   1392      1.1      chs 		descsize = sizeof (struct nfe_desc32);
   1393      1.1      chs 	}
   1394      1.1      chs 
   1395      1.1      chs 	if (desc != NULL) {
   1396      1.1      chs 		bus_dmamap_sync(sc->sc_dmat, ring->map, 0,
   1397      1.1      chs 		    ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1398      1.1      chs 		bus_dmamap_unload(sc->sc_dmat, ring->map);
   1399      1.1      chs 		bus_dmamem_unmap(sc->sc_dmat, (caddr_t)desc,
   1400      1.1      chs 		    NFE_RX_RING_COUNT * descsize);
   1401      1.1      chs 		bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
   1402      1.1      chs 	}
   1403      1.1      chs 
   1404      1.1      chs 	for (i = 0; i < NFE_RX_RING_COUNT; i++) {
   1405      1.1      chs 		data = &ring->data[i];
   1406      1.1      chs 
   1407      1.1      chs 		if (data->map != NULL) {
   1408      1.1      chs 			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
   1409      1.1      chs 			    data->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
   1410      1.1      chs 			bus_dmamap_unload(sc->sc_dmat, data->map);
   1411      1.1      chs 			bus_dmamap_destroy(sc->sc_dmat, data->map);
   1412      1.1      chs 		}
   1413      1.1      chs 		if (data->m != NULL)
   1414      1.1      chs 			m_freem(data->m);
   1415      1.1      chs 	}
   1416      1.1      chs }
   1417      1.1      chs 
   1418      1.1      chs struct nfe_jbuf *
   1419      1.1      chs nfe_jalloc(struct nfe_softc *sc)
   1420      1.1      chs {
   1421      1.1      chs 	struct nfe_jbuf *jbuf;
   1422      1.1      chs 
   1423      1.1      chs 	jbuf = SLIST_FIRST(&sc->rxq.jfreelist);
   1424      1.1      chs 	if (jbuf == NULL)
   1425      1.1      chs 		return NULL;
   1426      1.1      chs 	SLIST_REMOVE_HEAD(&sc->rxq.jfreelist, jnext);
   1427      1.1      chs 	return jbuf;
   1428      1.1      chs }
   1429      1.1      chs 
   1430      1.1      chs /*
   1431      1.1      chs  * This is called automatically by the network stack when the mbuf is freed.
   1432      1.1      chs  * Caution must be taken that the NIC might be reset by the time the mbuf is
   1433      1.1      chs  * freed.
   1434      1.1      chs  */
   1435      1.1      chs void
   1436  1.4.6.2     yamt nfe_jfree(struct mbuf *m, caddr_t buf, size_t size, void *arg)
   1437      1.1      chs {
   1438      1.1      chs 	struct nfe_softc *sc = arg;
   1439      1.1      chs 	struct nfe_jbuf *jbuf;
   1440      1.1      chs 	int i;
   1441      1.1      chs 
   1442      1.1      chs 	/* find the jbuf from the base pointer */
   1443      1.1      chs 	i = (buf - sc->rxq.jpool) / NFE_JBYTES;
   1444      1.1      chs 	if (i < 0 || i >= NFE_JPOOL_COUNT) {
   1445      1.1      chs 		printf("%s: request to free a buffer (%p) not managed by us\n",
   1446      1.1      chs 		    sc->sc_dev.dv_xname, buf);
   1447      1.1      chs 		return;
   1448      1.1      chs 	}
   1449      1.1      chs 	jbuf = &sc->rxq.jbuf[i];
   1450      1.1      chs 
   1451      1.1      chs 	/* ..and put it back in the free list */
   1452      1.1      chs 	SLIST_INSERT_HEAD(&sc->rxq.jfreelist, jbuf, jnext);
   1453      1.2      chs 
   1454      1.2      chs         if (m != NULL)
   1455      1.2      chs                 pool_cache_put(&mbpool_cache, m);
   1456      1.1      chs }
   1457      1.1      chs 
   1458      1.1      chs int
   1459      1.1      chs nfe_jpool_alloc(struct nfe_softc *sc)
   1460      1.1      chs {
   1461      1.1      chs 	struct nfe_rx_ring *ring = &sc->rxq;
   1462      1.1      chs 	struct nfe_jbuf *jbuf;
   1463      1.1      chs 	bus_addr_t physaddr;
   1464      1.1      chs 	caddr_t buf;
   1465      1.1      chs 	int i, nsegs, error;
   1466      1.1      chs 
   1467      1.1      chs 	/*
   1468      1.1      chs 	 * Allocate a big chunk of DMA'able memory.
   1469      1.1      chs 	 */
   1470      1.1      chs 	error = bus_dmamap_create(sc->sc_dmat, NFE_JPOOL_SIZE, 1,
   1471      1.1      chs 	    NFE_JPOOL_SIZE, 0, BUS_DMA_NOWAIT, &ring->jmap);
   1472      1.1      chs 	if (error != 0) {
   1473      1.1      chs 		printf("%s: could not create jumbo DMA map\n",
   1474      1.1      chs 		    sc->sc_dev.dv_xname);
   1475      1.1      chs 		goto fail;
   1476      1.1      chs 	}
   1477      1.1      chs 
   1478      1.1      chs 	error = bus_dmamem_alloc(sc->sc_dmat, NFE_JPOOL_SIZE, PAGE_SIZE, 0,
   1479      1.1      chs 	    &ring->jseg, 1, &nsegs, BUS_DMA_NOWAIT);
   1480      1.1      chs 	if (error != 0) {
   1481      1.1      chs 		printf("%s could not allocate jumbo DMA memory\n",
   1482      1.1      chs 		    sc->sc_dev.dv_xname);
   1483      1.1      chs 		goto fail;
   1484      1.1      chs 	}
   1485      1.1      chs 
   1486      1.1      chs 	error = bus_dmamem_map(sc->sc_dmat, &ring->jseg, nsegs, NFE_JPOOL_SIZE,
   1487      1.1      chs 	    &ring->jpool, BUS_DMA_NOWAIT);
   1488      1.1      chs 	if (error != 0) {
   1489      1.1      chs 		printf("%s: could not map jumbo DMA memory\n",
   1490      1.1      chs 		    sc->sc_dev.dv_xname);
   1491      1.1      chs 		goto fail;
   1492      1.1      chs 	}
   1493      1.1      chs 
   1494      1.1      chs 	error = bus_dmamap_load(sc->sc_dmat, ring->jmap, ring->jpool,
   1495      1.1      chs 	    NFE_JPOOL_SIZE, NULL, BUS_DMA_READ | BUS_DMA_NOWAIT);
   1496      1.1      chs 	if (error != 0) {
   1497      1.1      chs 		printf("%s: could not load jumbo DMA map\n",
   1498      1.1      chs 		    sc->sc_dev.dv_xname);
   1499      1.1      chs 		goto fail;
   1500      1.1      chs 	}
   1501      1.1      chs 
   1502      1.1      chs 	/* ..and split it into 9KB chunks */
   1503      1.1      chs 	SLIST_INIT(&ring->jfreelist);
   1504      1.1      chs 
   1505      1.1      chs 	buf = ring->jpool;
   1506      1.1      chs 	physaddr = ring->jmap->dm_segs[0].ds_addr;
   1507      1.1      chs 	for (i = 0; i < NFE_JPOOL_COUNT; i++) {
   1508      1.1      chs 		jbuf = &ring->jbuf[i];
   1509      1.1      chs 
   1510      1.1      chs 		jbuf->buf = buf;
   1511      1.1      chs 		jbuf->physaddr = physaddr;
   1512      1.1      chs 
   1513      1.1      chs 		SLIST_INSERT_HEAD(&ring->jfreelist, jbuf, jnext);
   1514      1.1      chs 
   1515      1.1      chs 		buf += NFE_JBYTES;
   1516      1.1      chs 		physaddr += NFE_JBYTES;
   1517      1.1      chs 	}
   1518      1.1      chs 
   1519      1.1      chs 	return 0;
   1520      1.1      chs 
   1521      1.1      chs fail:	nfe_jpool_free(sc);
   1522      1.1      chs 	return error;
   1523      1.1      chs }
   1524      1.1      chs 
   1525      1.1      chs void
   1526      1.1      chs nfe_jpool_free(struct nfe_softc *sc)
   1527      1.1      chs {
   1528      1.1      chs 	struct nfe_rx_ring *ring = &sc->rxq;
   1529      1.1      chs 
   1530      1.1      chs 	if (ring->jmap != NULL) {
   1531      1.1      chs 		bus_dmamap_sync(sc->sc_dmat, ring->jmap, 0,
   1532      1.1      chs 		    ring->jmap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1533      1.1      chs 		bus_dmamap_unload(sc->sc_dmat, ring->jmap);
   1534      1.1      chs 		bus_dmamap_destroy(sc->sc_dmat, ring->jmap);
   1535      1.1      chs 	}
   1536      1.1      chs 	if (ring->jpool != NULL) {
   1537      1.1      chs 		bus_dmamem_unmap(sc->sc_dmat, ring->jpool, NFE_JPOOL_SIZE);
   1538      1.1      chs 		bus_dmamem_free(sc->sc_dmat, &ring->jseg, 1);
   1539      1.1      chs 	}
   1540      1.1      chs }
   1541      1.1      chs 
   1542      1.1      chs int
   1543      1.1      chs nfe_alloc_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
   1544      1.1      chs {
   1545      1.1      chs 	int i, nsegs, error;
   1546      1.1      chs 	void **desc;
   1547      1.1      chs 	int descsize;
   1548      1.1      chs 
   1549      1.1      chs 	if (sc->sc_flags & NFE_40BIT_ADDR) {
   1550      1.1      chs 		desc = (void **)&ring->desc64;
   1551      1.1      chs 		descsize = sizeof (struct nfe_desc64);
   1552      1.1      chs 	} else {
   1553      1.1      chs 		desc = (void **)&ring->desc32;
   1554      1.1      chs 		descsize = sizeof (struct nfe_desc32);
   1555      1.1      chs 	}
   1556      1.1      chs 
   1557      1.1      chs 	ring->queued = 0;
   1558      1.1      chs 	ring->cur = ring->next = 0;
   1559      1.1      chs 
   1560      1.1      chs 	error = bus_dmamap_create(sc->sc_dmat, NFE_TX_RING_COUNT * descsize, 1,
   1561      1.1      chs 	    NFE_TX_RING_COUNT * descsize, 0, BUS_DMA_NOWAIT, &ring->map);
   1562      1.1      chs 
   1563      1.1      chs 	if (error != 0) {
   1564      1.1      chs 		printf("%s: could not create desc DMA map\n",
   1565      1.1      chs 		    sc->sc_dev.dv_xname);
   1566      1.1      chs 		goto fail;
   1567      1.1      chs 	}
   1568      1.1      chs 
   1569      1.1      chs 	error = bus_dmamem_alloc(sc->sc_dmat, NFE_TX_RING_COUNT * descsize,
   1570      1.1      chs 	    PAGE_SIZE, 0, &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT);
   1571      1.1      chs 	if (error != 0) {
   1572      1.1      chs 		printf("%s: could not allocate DMA memory\n",
   1573      1.1      chs 		    sc->sc_dev.dv_xname);
   1574      1.1      chs 		goto fail;
   1575      1.1      chs 	}
   1576      1.1      chs 
   1577      1.1      chs 	error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs,
   1578      1.1      chs 	    NFE_TX_RING_COUNT * descsize, (caddr_t *)desc, BUS_DMA_NOWAIT);
   1579      1.1      chs 	if (error != 0) {
   1580      1.1      chs 		printf("%s: could not map desc DMA memory\n",
   1581      1.1      chs 		    sc->sc_dev.dv_xname);
   1582      1.1      chs 		goto fail;
   1583      1.1      chs 	}
   1584      1.1      chs 
   1585      1.1      chs 	error = bus_dmamap_load(sc->sc_dmat, ring->map, *desc,
   1586      1.1      chs 	    NFE_TX_RING_COUNT * descsize, NULL, BUS_DMA_NOWAIT);
   1587      1.1      chs 	if (error != 0) {
   1588      1.1      chs 		printf("%s: could not load desc DMA map\n",
   1589      1.1      chs 		    sc->sc_dev.dv_xname);
   1590      1.1      chs 		goto fail;
   1591      1.1      chs 	}
   1592      1.1      chs 
   1593      1.1      chs 	bzero(*desc, NFE_TX_RING_COUNT * descsize);
   1594      1.1      chs 	ring->physaddr = ring->map->dm_segs[0].ds_addr;
   1595      1.1      chs 
   1596      1.1      chs 	for (i = 0; i < NFE_TX_RING_COUNT; i++) {
   1597      1.1      chs 		error = bus_dmamap_create(sc->sc_dmat, NFE_JBYTES,
   1598      1.1      chs 		    NFE_MAX_SCATTER, NFE_JBYTES, 0, BUS_DMA_NOWAIT,
   1599      1.1      chs 		    &ring->data[i].map);
   1600      1.1      chs 		if (error != 0) {
   1601      1.1      chs 			printf("%s: could not create DMA map\n",
   1602      1.1      chs 			    sc->sc_dev.dv_xname);
   1603      1.1      chs 			goto fail;
   1604      1.1      chs 		}
   1605      1.1      chs 	}
   1606      1.1      chs 
   1607      1.1      chs 	return 0;
   1608      1.1      chs 
   1609      1.1      chs fail:	nfe_free_tx_ring(sc, ring);
   1610      1.1      chs 	return error;
   1611      1.1      chs }
   1612      1.1      chs 
   1613      1.1      chs void
   1614      1.1      chs nfe_reset_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
   1615      1.1      chs {
   1616      1.1      chs 	struct nfe_tx_data *data;
   1617      1.1      chs 	int i;
   1618      1.1      chs 
   1619      1.1      chs 	for (i = 0; i < NFE_TX_RING_COUNT; i++) {
   1620      1.1      chs 		if (sc->sc_flags & NFE_40BIT_ADDR)
   1621      1.1      chs 			ring->desc64[i].flags = 0;
   1622      1.1      chs 		else
   1623      1.1      chs 			ring->desc32[i].flags = 0;
   1624      1.1      chs 
   1625      1.1      chs 		data = &ring->data[i];
   1626      1.1      chs 
   1627      1.1      chs 		if (data->m != NULL) {
   1628      1.1      chs 			bus_dmamap_sync(sc->sc_dmat, data->active, 0,
   1629      1.1      chs 			    data->active->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1630      1.1      chs 			bus_dmamap_unload(sc->sc_dmat, data->active);
   1631      1.1      chs 			m_freem(data->m);
   1632      1.1      chs 			data->m = NULL;
   1633      1.1      chs 		}
   1634      1.1      chs 	}
   1635      1.1      chs 
   1636      1.1      chs 	bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize,
   1637      1.1      chs 	    BUS_DMASYNC_PREWRITE);
   1638      1.1      chs 
   1639      1.1      chs 	ring->queued = 0;
   1640      1.1      chs 	ring->cur = ring->next = 0;
   1641      1.1      chs }
   1642      1.1      chs 
   1643      1.1      chs void
   1644      1.1      chs nfe_free_tx_ring(struct nfe_softc *sc, struct nfe_tx_ring *ring)
   1645      1.1      chs {
   1646      1.1      chs 	struct nfe_tx_data *data;
   1647      1.1      chs 	void *desc;
   1648      1.1      chs 	int i, descsize;
   1649      1.1      chs 
   1650      1.1      chs 	if (sc->sc_flags & NFE_40BIT_ADDR) {
   1651      1.1      chs 		desc = ring->desc64;
   1652      1.1      chs 		descsize = sizeof (struct nfe_desc64);
   1653      1.1      chs 	} else {
   1654      1.1      chs 		desc = ring->desc32;
   1655      1.1      chs 		descsize = sizeof (struct nfe_desc32);
   1656      1.1      chs 	}
   1657      1.1      chs 
   1658      1.1      chs 	if (desc != NULL) {
   1659      1.1      chs 		bus_dmamap_sync(sc->sc_dmat, ring->map, 0,
   1660      1.1      chs 		    ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1661      1.1      chs 		bus_dmamap_unload(sc->sc_dmat, ring->map);
   1662      1.1      chs 		bus_dmamem_unmap(sc->sc_dmat, (caddr_t)desc,
   1663      1.1      chs 		    NFE_TX_RING_COUNT * descsize);
   1664      1.1      chs 		bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
   1665      1.1      chs 	}
   1666      1.1      chs 
   1667      1.1      chs 	for (i = 0; i < NFE_TX_RING_COUNT; i++) {
   1668      1.1      chs 		data = &ring->data[i];
   1669      1.1      chs 
   1670      1.1      chs 		if (data->m != NULL) {
   1671      1.1      chs 			bus_dmamap_sync(sc->sc_dmat, data->active, 0,
   1672      1.1      chs 			    data->active->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1673      1.1      chs 			bus_dmamap_unload(sc->sc_dmat, data->active);
   1674      1.1      chs 			m_freem(data->m);
   1675      1.1      chs 		}
   1676      1.1      chs 	}
   1677      1.1      chs 
   1678      1.1      chs 	/* ..and now actually destroy the DMA mappings */
   1679      1.1      chs 	for (i = 0; i < NFE_TX_RING_COUNT; i++) {
   1680      1.1      chs 		data = &ring->data[i];
   1681      1.1      chs 		if (data->map == NULL)
   1682      1.1      chs 			continue;
   1683      1.1      chs 		bus_dmamap_destroy(sc->sc_dmat, data->map);
   1684      1.1      chs 	}
   1685      1.1      chs }
   1686      1.1      chs 
   1687      1.1      chs int
   1688      1.1      chs nfe_ifmedia_upd(struct ifnet *ifp)
   1689      1.1      chs {
   1690      1.1      chs 	struct nfe_softc *sc = ifp->if_softc;
   1691      1.1      chs 	struct mii_data *mii = &sc->sc_mii;
   1692      1.1      chs 	struct mii_softc *miisc;
   1693      1.1      chs 
   1694      1.1      chs 	if (mii->mii_instance != 0) {
   1695      1.1      chs 		LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
   1696      1.1      chs 			mii_phy_reset(miisc);
   1697      1.1      chs 	}
   1698      1.1      chs 	return mii_mediachg(mii);
   1699      1.1      chs }
   1700      1.1      chs 
   1701      1.1      chs void
   1702      1.1      chs nfe_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
   1703      1.1      chs {
   1704      1.1      chs 	struct nfe_softc *sc = ifp->if_softc;
   1705      1.1      chs 	struct mii_data *mii = &sc->sc_mii;
   1706      1.1      chs 
   1707      1.1      chs 	mii_pollstat(mii);
   1708      1.1      chs 	ifmr->ifm_status = mii->mii_media_status;
   1709      1.1      chs 	ifmr->ifm_active = mii->mii_media_active;
   1710      1.1      chs }
   1711      1.1      chs 
   1712      1.1      chs void
   1713      1.1      chs nfe_setmulti(struct nfe_softc *sc)
   1714      1.1      chs {
   1715      1.1      chs 	struct ethercom *ec = &sc->sc_ethercom;
   1716      1.1      chs 	struct ifnet *ifp = &ec->ec_if;
   1717      1.1      chs 	struct ether_multi *enm;
   1718      1.1      chs 	struct ether_multistep step;
   1719      1.1      chs 	uint8_t addr[ETHER_ADDR_LEN], mask[ETHER_ADDR_LEN];
   1720      1.1      chs 	uint32_t filter = NFE_RXFILTER_MAGIC;
   1721      1.1      chs 	int i;
   1722      1.1      chs 
   1723      1.1      chs 	if ((ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
   1724      1.1      chs 		bzero(addr, ETHER_ADDR_LEN);
   1725      1.1      chs 		bzero(mask, ETHER_ADDR_LEN);
   1726      1.1      chs 		goto done;
   1727      1.1      chs 	}
   1728      1.1      chs 
   1729      1.1      chs 	bcopy(etherbroadcastaddr, addr, ETHER_ADDR_LEN);
   1730      1.1      chs 	bcopy(etherbroadcastaddr, mask, ETHER_ADDR_LEN);
   1731      1.1      chs 
   1732      1.1      chs 	ETHER_FIRST_MULTI(step, ec, enm);
   1733      1.1      chs 	while (enm != NULL) {
   1734      1.1      chs 		if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
   1735      1.1      chs 			ifp->if_flags |= IFF_ALLMULTI;
   1736      1.1      chs 			bzero(addr, ETHER_ADDR_LEN);
   1737      1.1      chs 			bzero(mask, ETHER_ADDR_LEN);
   1738      1.1      chs 			goto done;
   1739      1.1      chs 		}
   1740      1.1      chs 		for (i = 0; i < ETHER_ADDR_LEN; i++) {
   1741      1.1      chs 			addr[i] &=  enm->enm_addrlo[i];
   1742      1.1      chs 			mask[i] &= ~enm->enm_addrlo[i];
   1743      1.1      chs 		}
   1744      1.1      chs 		ETHER_NEXT_MULTI(step, enm);
   1745      1.1      chs 	}
   1746      1.1      chs 	for (i = 0; i < ETHER_ADDR_LEN; i++)
   1747      1.1      chs 		mask[i] |= addr[i];
   1748      1.1      chs 
   1749      1.1      chs done:
   1750      1.1      chs 	addr[0] |= 0x01;	/* make sure multicast bit is set */
   1751      1.1      chs 
   1752      1.1      chs 	NFE_WRITE(sc, NFE_MULTIADDR_HI,
   1753      1.1      chs 	    addr[3] << 24 | addr[2] << 16 | addr[1] << 8 | addr[0]);
   1754      1.1      chs 	NFE_WRITE(sc, NFE_MULTIADDR_LO,
   1755      1.1      chs 	    addr[5] <<  8 | addr[4]);
   1756      1.1      chs 	NFE_WRITE(sc, NFE_MULTIMASK_HI,
   1757      1.1      chs 	    mask[3] << 24 | mask[2] << 16 | mask[1] << 8 | mask[0]);
   1758      1.1      chs 	NFE_WRITE(sc, NFE_MULTIMASK_LO,
   1759      1.1      chs 	    mask[5] <<  8 | mask[4]);
   1760      1.1      chs 
   1761      1.1      chs 	filter |= (ifp->if_flags & IFF_PROMISC) ? NFE_PROMISC : NFE_U2M;
   1762      1.1      chs 	NFE_WRITE(sc, NFE_RXFILTER, filter);
   1763      1.1      chs }
   1764      1.1      chs 
   1765      1.1      chs void
   1766      1.1      chs nfe_get_macaddr(struct nfe_softc *sc, uint8_t *addr)
   1767      1.1      chs {
   1768      1.1      chs 	uint32_t tmp;
   1769      1.1      chs 
   1770      1.1      chs 	tmp = NFE_READ(sc, NFE_MACADDR_LO);
   1771      1.1      chs 	addr[0] = (tmp >> 8) & 0xff;
   1772      1.1      chs 	addr[1] = (tmp & 0xff);
   1773      1.1      chs 
   1774      1.1      chs 	tmp = NFE_READ(sc, NFE_MACADDR_HI);
   1775      1.1      chs 	addr[2] = (tmp >> 24) & 0xff;
   1776      1.1      chs 	addr[3] = (tmp >> 16) & 0xff;
   1777      1.1      chs 	addr[4] = (tmp >>  8) & 0xff;
   1778      1.1      chs 	addr[5] = (tmp & 0xff);
   1779      1.1      chs }
   1780      1.1      chs 
   1781      1.1      chs void
   1782      1.1      chs nfe_set_macaddr(struct nfe_softc *sc, const uint8_t *addr)
   1783      1.1      chs {
   1784      1.1      chs 	NFE_WRITE(sc, NFE_MACADDR_LO,
   1785      1.1      chs 	    addr[5] <<  8 | addr[4]);
   1786      1.1      chs 	NFE_WRITE(sc, NFE_MACADDR_HI,
   1787      1.1      chs 	    addr[3] << 24 | addr[2] << 16 | addr[1] << 8 | addr[0]);
   1788      1.1      chs }
   1789      1.1      chs 
   1790      1.1      chs void
   1791      1.1      chs nfe_tick(void *arg)
   1792      1.1      chs {
   1793      1.1      chs 	struct nfe_softc *sc = arg;
   1794      1.1      chs 	int s;
   1795      1.1      chs 
   1796      1.1      chs 	s = splnet();
   1797      1.1      chs 	mii_tick(&sc->sc_mii);
   1798      1.1      chs 	splx(s);
   1799      1.1      chs 
   1800      1.1      chs 	callout_schedule(&sc->sc_tick_ch, hz);
   1801      1.1      chs }
   1802