Home | History | Annotate | Line # | Download | only in pci
      1 /*	$NetBSD: if_rge.c,v 1.38 2025/10/26 17:10:46 pgoyette Exp $	*/
      2 /*	$OpenBSD: if_rge.c,v 1.9 2020/12/12 11:48:53 jan Exp $	*/
      3 
      4 /*
      5  * Copyright (c) 2019, 2020 Kevin Lo <kevlo (at) openbsd.org>
      6  *
      7  * Permission to use, copy, modify, and distribute this software for any
      8  * purpose with or without fee is hereby granted, provided that the above
      9  * copyright notice and this permission notice appear in all copies.
     10  *
     11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18  */
     19 
     20 #include <sys/cdefs.h>
     21 __KERNEL_RCSID(0, "$NetBSD: if_rge.c,v 1.38 2025/10/26 17:10:46 pgoyette Exp $");
     22 
     23 #if defined(_KERNEL_OPT)
     24 #include "opt_net_mpsafe.h"
     25 #endif
     26 
     27 #include <sys/types.h>
     28 
     29 #include <sys/param.h>
     30 #include <sys/systm.h>
     31 #include <sys/sockio.h>
     32 #include <sys/mbuf.h>
     33 #include <sys/kernel.h>
     34 #include <sys/socket.h>
     35 #include <sys/device.h>
     36 #include <sys/endian.h>
     37 #include <sys/callout.h>
     38 #include <sys/workqueue.h>
     39 #include <sys/module.h>
     40 
     41 #include <net/if.h>
     42 
     43 #include <net/if_dl.h>
     44 #include <net/if_ether.h>
     45 
     46 #include <net/if_media.h>
     47 
     48 #include <netinet/in.h>
     49 #include <net/if_ether.h>
     50 
     51 #include <net/bpf.h>
     52 
     53 #include <sys/bus.h>
     54 #include <machine/intr.h>
     55 
     56 #include <dev/mii/mii.h>
     57 
     58 #include <dev/pci/pcivar.h>
     59 #include <dev/pci/pcireg.h>
     60 #include <dev/pci/pcidevs.h>
     61 
     62 #include <dev/pci/if_rgereg.h>
     63 
     64 /* interrupt type counts */
     65 
     66 int counts[PCI_INTR_TYPE_SIZE] = {
     67 	[PCI_INTR_TYPE_INTX] = 1,
     68 	[PCI_INTR_TYPE_MSI] = 1,
     69 	[PCI_INTR_TYPE_MSIX] = 1,
     70  };
     71 	int max_type = PCI_INTR_TYPE_MSIX;
     72 
     73 #ifdef __NetBSD__
     74 #define letoh32 	htole32
     75 #define nitems(x) 	__arraycount(x)
     76 
     77 static struct mbuf *
     78 MCLGETL(struct rge_softc *sc __unused, int how,
     79     u_int size)
     80 {
     81 	struct mbuf *m;
     82 
     83 	MGETHDR(m, how, MT_DATA);
     84 	if (m == NULL)
     85 		return NULL;
     86 
     87 	MEXTMALLOC(m, size, how);
     88 	if ((m->m_flags & M_EXT) == 0) {
     89 		m_freem(m);
     90 		return NULL;
     91 	}
     92 	return m;
     93 }
     94 
     95 #ifdef NET_MPSAFE
     96 #define 	RGE_MPSAFE	1
     97 #define 	CALLOUT_FLAGS	CALLOUT_MPSAFE
     98 #else
     99 #define 	CALLOUT_FLAGS	0
    100 #endif
    101 #endif
    102 
    103 #ifdef RGE_DEBUG
    104 #define DPRINTF(x)	do { if (rge_debug > 0) printf x; } while (0)
    105 int rge_debug = 0;
    106 #else
    107 #define DPRINTF(x)
    108 #endif
    109 
    110 static int		rge_match(device_t, cfdata_t, void *);
    111 static void		rge_attach(device_t, device_t, void *);
    112 static int		rge_detach(device_t, int);
    113 
    114 int		rge_intr(void *);
    115 int		rge_encap(struct rge_softc *, struct mbuf *, int);
    116 int		rge_ioctl(struct ifnet *, u_long, void *);
    117 void		rge_start(struct ifnet *);
    118 void		rge_watchdog(struct ifnet *);
    119 int		rge_init(struct ifnet *);
    120 void		rge_stop(struct ifnet *, int);
    121 int		rge_ifmedia_upd(struct ifnet *);
    122 void		rge_ifmedia_sts(struct ifnet *, struct ifmediareq *);
    123 static int	rge_allocmem(struct rge_softc *);
    124 static int	rge_deallocmem(struct rge_softc *);
    125 int		rge_newbuf(struct rge_softc *, int);
    126 static int	rge_rx_list_init(struct rge_softc *);
    127 static void	rge_rx_list_fini(struct rge_softc *);
    128 static void	rge_tx_list_init(struct rge_softc *);
    129 static void	rge_tx_list_fini(struct rge_softc *);
    130 int		rge_rxeof(struct rge_softc *);
    131 int		rge_txeof(struct rge_softc *);
    132 void		rge_reset(struct rge_softc *);
    133 void		rge_iff(struct rge_softc *);
    134 void		rge_set_phy_power(struct rge_softc *, int);
    135 void		rge_phy_config(struct rge_softc *);
    136 void		rge_phy_config_mac_cfg2_8126(struct rge_softc *);
    137 void		rge_phy_config_mac_cfg2(struct rge_softc *);
    138 void		rge_phy_config_mac_cfg3(struct rge_softc *);
    139 void		rge_phy_config_mac_cfg4(struct rge_softc *);
    140 void		rge_phy_config_mac_cfg5(struct rge_softc *);
    141 void		rge_phy_config_mcu(struct rge_softc *, uint16_t);
    142 void		rge_set_macaddr(struct rge_softc *, const uint8_t *);
    143 void		rge_get_macaddr(struct rge_softc *, uint8_t *);
    144 void		rge_hw_init(struct rge_softc *);
    145 void		rge_disable_phy_ocp_pwrsave(struct rge_softc *);
    146 void		rge_patch_phy_mcu(struct rge_softc *, int);
    147 void		rge_add_media_types(struct rge_softc *);
    148 void		rge_config_imtype(struct rge_softc *, int);
    149 void		rge_disable_hw_im(struct rge_softc *);
    150 void		rge_disable_sim_im(struct rge_softc *);
    151 void		rge_setup_sim_im(struct rge_softc *);
    152 void		rge_setup_intr(struct rge_softc *, int);
    153 void		rge_exit_oob(struct rge_softc *);
    154 void		rge_write_csi(struct rge_softc *, uint32_t, uint32_t);
    155 uint32_t	rge_read_csi(struct rge_softc *, uint32_t);
    156 void		rge_write_mac_ocp(struct rge_softc *, uint16_t, uint16_t);
    157 uint16_t	rge_read_mac_ocp(struct rge_softc *, uint16_t);
    158 void		rge_write_ephy(struct rge_softc *, uint16_t, uint16_t);
    159 uint16_t	rge_read_ephy(struct rge_softc *, uint16_t);
    160 void		rge_write_phy(struct rge_softc *, uint16_t, uint16_t, uint16_t);
    161 uint16_t	rge_read_phy(struct rge_softc *, uint16_t, uint16_t);
    162 void		rge_write_phy_ocp(struct rge_softc *, uint16_t, uint16_t);
    163 uint16_t	rge_read_phy_ocp(struct rge_softc *, uint16_t);
    164 int		rge_get_link_status(struct rge_softc *);
    165 void		rge_txstart(void *);
    166 void		rge_tick(void *);
    167 void		rge_link_state(struct rge_softc *);
    168 
    169 static const struct {
    170 	uint16_t reg;
    171 	uint16_t val;
    172 }  rtl8125_mac_cfg2_mcu[] = {
    173 	RTL8125_MAC_CFG2_MCU
    174 }, rtl8125_mac_cfg3_mcu[] = {
    175 	RTL8125_MAC_CFG3_MCU
    176 }, rtl8125_mac_cfg4_mcu[] = {
    177 	RTL8125_MAC_CFG4_MCU
    178 }, rtl8125_mac_cfg5_mcu[] = {
    179 	RTL8125_MAC_CFG5_MCU
    180 }, rtl8126_mac_cfg2_mcu[] = {
    181 	RTL8126_MAC_CFG2_MCU
    182 };
    183 
    184 CFATTACH_DECL_NEW(rge, sizeof(struct rge_softc), rge_match, rge_attach,
    185 		rge_detach, NULL);
    186 
    187 static const struct device_compatible_entry compat_data[] = {
    188 	{ .id = PCI_ID_CODE(PCI_VENDOR_REALTEK, PCI_PRODUCT_REALTEK_E3000) },
    189 	{ .id = PCI_ID_CODE(PCI_VENDOR_REALTEK, PCI_PRODUCT_REALTEK_RT8125) },
    190 	{ .id = PCI_ID_CODE(PCI_VENDOR_REALTEK, PCI_PRODUCT_REALTEK_RT8126) },
    191 
    192 	PCI_COMPAT_EOL
    193 };
    194 
    195 static int
    196 rge_match(device_t parent, cfdata_t match, void *aux)
    197 {
    198 	struct pci_attach_args *pa =aux;
    199 
    200 	return pci_compatible_match(pa, compat_data);
    201 }
    202 
    203 void
    204 rge_attach(device_t parent, device_t self, void *aux)
    205 {
    206 	struct rge_softc *sc = device_private(self);
    207 	struct pci_attach_args *pa = aux;
    208 	pci_chipset_tag_t pc = pa->pa_pc;
    209 	char intrbuf[PCI_INTRSTR_LEN];
    210 	const char *intrstr = NULL;
    211 	struct ifnet *ifp;
    212 	pcireg_t reg;
    213 	uint32_t hwrev;
    214 	uint8_t eaddr[ETHER_ADDR_LEN];
    215 	int offset;
    216 	pcireg_t command;
    217 	const char *revstr;
    218 
    219 	pci_set_powerstate(pa->pa_pc, pa->pa_tag, PCI_PMCSR_STATE_D0);
    220 
    221 	sc->sc_dev = self;
    222 
    223 	pci_aprint_devinfo(pa, "Ethernet controller");
    224 
    225 	/*
    226 	 * Map control/status registers.
    227 	 */
    228 	if (pci_mapreg_map(pa, RGE_PCI_BAR2, PCI_MAPREG_TYPE_MEM |
    229 	    PCI_MAPREG_MEM_TYPE_64BIT, 0, &sc->rge_btag, &sc->rge_bhandle,
    230 	    NULL, &sc->rge_bsize)) {
    231 		if (pci_mapreg_map(pa, RGE_PCI_BAR1, PCI_MAPREG_TYPE_MEM |
    232 		    PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->rge_btag,
    233 		    &sc->rge_bhandle, NULL, &sc->rge_bsize)) {
    234 			if (pci_mapreg_map(pa, RGE_PCI_BAR0, PCI_MAPREG_TYPE_IO,
    235 			    0, &sc->rge_btag, &sc->rge_bhandle, NULL,
    236 			    &sc->rge_bsize)) {
    237 				aprint_error(": can't map mem or i/o space\n");
    238 				return;
    239 			}
    240 		}
    241 	}
    242 
    243 	/*
    244 	 * Allocate interrupt.
    245 	 */
    246 	if (pci_intr_alloc(pa, &sc->sc_intrs, NULL, 0) != 0) {
    247 		aprint_error(": couldn't map interrupt\n");
    248 		return;
    249 	}
    250 	switch (pci_intr_type(pc, sc->sc_intrs[0])) {
    251 	case PCI_INTR_TYPE_MSIX:
    252 	case PCI_INTR_TYPE_MSI:
    253 		sc->rge_flags |= RGE_FLAG_MSI;
    254 		break;
    255 	default:
    256 		break;
    257 	}
    258 	intrstr = pci_intr_string(pc, sc->sc_intrs[0],
    259 	    intrbuf, sizeof(intrbuf));
    260 	sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0],
    261 	    IPL_NET, rge_intr, sc, device_xname(sc->sc_dev));
    262 
    263 	if (sc->sc_ihs[0] == NULL) {
    264 		aprint_error_dev(sc->sc_dev, ": couldn't establish interrupt");
    265 		if (intrstr != NULL)
    266 			aprint_error(" at %s\n", intrstr);
    267 		aprint_error("\n");
    268 		return;
    269 	}
    270 	aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
    271 
    272 	if (pci_dma64_available(pa))
    273 		sc->sc_dmat = pa->pa_dmat64;
    274 	else
    275 		sc->sc_dmat = pa->pa_dmat;
    276 
    277 	sc->sc_pc = pa->pa_pc;
    278 	sc->sc_tag = pa->pa_tag;
    279 
    280 	/* Determine hardware revision */
    281 	hwrev = RGE_READ_4(sc, RGE_TXCFG) & RGE_TXCFG_HWREV;
    282 	switch (hwrev) {
    283 	case 0x60800000:
    284 		sc->rge_type = MAC_CFG2;
    285 		revstr = "Z1";
    286 		break;
    287 	case 0x60900000:
    288 		sc->rge_type = MAC_CFG3;
    289 		revstr = "Z2";
    290 		break;
    291 	case 0x64000000:
    292 		sc->rge_type = MAC_CFG4;
    293 		revstr = "A";
    294 		break;
    295 	case 0x64100000:
    296 		sc->rge_type = MAC_CFG5;
    297 		revstr = "B";
    298 		break;
    299 #if 0
    300 	case 0x64800000:
    301 		sc->rge_type = MAC_CFG1_8126;
    302 		revstr = "A";
    303 		break;
    304 #endif
    305 	case 0x64900000:
    306 		sc->rge_type = MAC_CFG2_8126;
    307 		revstr = "A";
    308 		break;
    309 #if 0
    310 	case 0x64a00000:
    311 		sc->rge_type = MAC_CFG3_8126;
    312 		revstr = "A";
    313 		break;
    314 #endif
    315 	default:
    316 		aprint_error(": unknown version 0x%08x\n", hwrev);
    317 		return;
    318 	}
    319 
    320 	aprint_normal_dev(sc->sc_dev, "HW rev. %s\n", revstr);
    321 	rge_config_imtype(sc, RGE_IMTYPE_SIM);
    322 
    323 	/*
    324 	 * PCI Express check.
    325 	 */
    326 	if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_PCIEXPRESS,
    327 	    &offset, NULL)) {
    328 		/* Disable PCIe ASPM and ECPM. */
    329 		reg = pci_conf_read(pa->pa_pc, pa->pa_tag,
    330 		    offset + PCIE_LCSR);
    331 		reg &= ~(PCIE_LCSR_ASPM_L0S | PCIE_LCSR_ASPM_L1 |
    332 		    PCIE_LCSR_ENCLKPM);
    333 		pci_conf_write(pa->pa_pc, pa->pa_tag, offset + PCIE_LCSR,
    334 		    reg);
    335 	}
    336 
    337 	rge_exit_oob(sc);
    338 	rge_hw_init(sc);
    339 
    340 	rge_get_macaddr(sc, eaddr);
    341 	aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
    342 	    ether_sprintf(eaddr));
    343 
    344 	memcpy(sc->sc_enaddr, eaddr, ETHER_ADDR_LEN);
    345 
    346 	rge_set_phy_power(sc, 1);
    347 	rge_phy_config(sc);
    348 
    349 	if (rge_allocmem(sc))
    350 		return;
    351 
    352 	ifp = &sc->sc_ec.ec_if;
    353 	ifp->if_softc = sc;
    354 	strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
    355 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    356 #ifdef RGE_MPSAFE
    357 	ifp->if_extflags = IFEF_MPSAFE;
    358 #endif
    359 	ifp->if_ioctl = rge_ioctl;
    360 	ifp->if_stop = rge_stop;
    361 	ifp->if_start = rge_start;
    362 	ifp->if_init = rge_init;
    363 	ifp->if_watchdog = rge_watchdog;
    364 	IFQ_SET_MAXLEN(&ifp->if_snd, RGE_TX_LIST_CNT - 1);
    365 
    366 #if notyet
    367 	ifp->if_capabilities = IFCAP_CSUM_IPv4_Rx |
    368 	    IFCAP_CSUM_IPv4_Tx |IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv4_Tx|
    369 	    IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv4_Tx;
    370 #endif
    371 
    372 	sc->sc_ec.ec_capabilities |= ETHERCAP_VLAN_MTU;
    373 	sc->sc_ec.ec_capabilities |= ETHERCAP_VLAN_HWTAGGING;
    374 
    375 	callout_init(&sc->sc_timeout, CALLOUT_FLAGS);
    376 	callout_setfunc(&sc->sc_timeout, rge_tick, sc);
    377 
    378 	command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
    379 	command |= PCI_COMMAND_MASTER_ENABLE;
    380 	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command);
    381 
    382 	/* Initialize ifmedia structures. */
    383 	sc->sc_ec.ec_ifmedia = &sc->sc_media;
    384 	ifmedia_init(&sc->sc_media, IFM_IMASK, rge_ifmedia_upd,
    385 	    rge_ifmedia_sts);
    386 	rge_add_media_types(sc);
    387 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL);
    388 	ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO);
    389 	sc->sc_media.ifm_media = sc->sc_media.ifm_cur->ifm_media;
    390 
    391 	if_attach(ifp);
    392 	if_deferred_start_init(ifp, NULL);
    393 	ether_ifattach(ifp, eaddr);
    394 
    395 	if (pmf_device_register(self, NULL, NULL))
    396 		pmf_class_network_register(self, ifp);
    397 	else
    398 		aprint_error_dev(self, "couldn't establish power handler\n");
    399 }
    400 
    401 static int
    402 rge_detach(device_t self, int flags)
    403 {
    404 	struct rge_softc *sc = device_private(self);
    405 	struct ifnet *ifp = &sc->sc_ec.ec_if;
    406 	pci_chipset_tag_t pc = sc->sc_pc;
    407 
    408 	rge_stop(ifp, 1);
    409 
    410 	pmf_device_deregister(self);
    411 
    412 	ether_ifdetach(ifp);
    413 
    414 	if_detach(ifp);
    415 
    416 	ifmedia_fini(&sc->sc_media);
    417 
    418 	if (sc->sc_ihs[0] != NULL) {
    419 		pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[0]);
    420 		sc->sc_ihs[0] = NULL;
    421 	}
    422 
    423 	pci_intr_release(pc, sc->sc_intrs, 1);
    424 
    425 	rge_deallocmem(sc);
    426 
    427         return 0;
    428 }
    429 
    430 int
    431 rge_intr(void *arg)
    432 {
    433 	struct rge_softc *sc = arg;
    434 	struct ifnet *ifp = &sc->sc_ec.ec_if;
    435 	uint32_t status;
    436 	int claimed = 0, rx, tx;
    437 
    438 	if (!(ifp->if_flags & IFF_RUNNING))
    439 		return (0);
    440 
    441 	/* Disable interrupts. */
    442 	RGE_WRITE_4(sc, RGE_IMR, 0);
    443 
    444 	if (!(sc->rge_flags & RGE_FLAG_MSI)) {
    445 		if ((RGE_READ_4(sc, RGE_ISR) & sc->rge_intrs) == 0)
    446 			return (0);
    447 	}
    448 
    449 	status = RGE_READ_4(sc, RGE_ISR);
    450 	if (status)
    451 		RGE_WRITE_4(sc, RGE_ISR, status);
    452 
    453 	if (status & RGE_ISR_PCS_TIMEOUT)
    454 		claimed = 1;
    455 
    456 	rx = tx = 0;
    457 	if (status & sc->rge_intrs) {
    458 		if (status &
    459 		    (sc->rge_rx_ack | RGE_ISR_RX_ERR | RGE_ISR_RX_FIFO_OFLOW)) {
    460 			rx |= rge_rxeof(sc);
    461 			claimed = 1;
    462 		}
    463 
    464 		if (status & (sc->rge_tx_ack | RGE_ISR_TX_ERR)) {
    465 			tx |= rge_txeof(sc);
    466 			claimed = 1;
    467 		}
    468 
    469 		if (status & RGE_ISR_SYSTEM_ERR) {
    470 			KERNEL_LOCK(1, NULL);
    471 			rge_init(ifp);
    472 			KERNEL_UNLOCK_ONE(NULL);
    473 			claimed = 1;
    474 		}
    475 	}
    476 
    477 	if (sc->rge_timerintr) {
    478 		if ((tx | rx) == 0) {
    479 			/*
    480 			 * Nothing needs to be processed, fallback
    481 			 * to use TX/RX interrupts.
    482 			 */
    483 			rge_setup_intr(sc, RGE_IMTYPE_NONE);
    484 
    485 			/*
    486 			 * Recollect, mainly to avoid the possible
    487 			 * race introduced by changing interrupt
    488 			 * masks.
    489 			 */
    490 			rge_rxeof(sc);
    491 			rge_txeof(sc);
    492 		} else
    493 			RGE_WRITE_4(sc, RGE_TIMERCNT, 1);
    494 	} else if (tx | rx) {
    495 		/*
    496 		 * Assume that using simulated interrupt moderation
    497 		 * (hardware timer based) could reduce the interrupt
    498 		 * rate.
    499 		 */
    500 		rge_setup_intr(sc, RGE_IMTYPE_SIM);
    501 	}
    502 
    503 	RGE_WRITE_4(sc, RGE_IMR, sc->rge_intrs);
    504 
    505 	return (claimed);
    506 }
    507 
    508 int
    509 rge_encap(struct rge_softc *sc, struct mbuf *m, int idx)
    510 {
    511 	struct rge_tx_desc *d = NULL;
    512 	struct rge_txq *txq;
    513 	bus_dmamap_t txmap;
    514 	uint32_t cmdsts, cflags = 0;
    515 	int cur, error, i, last, nsegs;
    516 
    517 #if notyet
    518 	/*
    519 	 * Set RGE_TDEXTSTS_IPCSUM if any checksum offloading is requested.
    520 	 * Otherwise, RGE_TDEXTSTS_TCPCSUM / RGE_TDEXTSTS_UDPCSUM does not
    521 	 * take affect.
    522 	 */
    523 	if ((m->m_pkthdr.csum_flags &
    524 	    (M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4)) != 0) {
    525 		cflags |= RGE_TDEXTSTS_IPCSUM;
    526 		if (m->m_pkthdr.csum_flags & M_TCP_CSUM_OUT)
    527 			cflags |= RGE_TDEXTSTS_TCPCSUM;
    528 		if (m->m_pkthdr.csum_flags & M_UDP_CSUM_OUT)
    529 			cflags |= RGE_TDEXTSTS_UDPCSUM;
    530 	}
    531 #endif
    532 
    533 	txq = &sc->rge_ldata.rge_txq[idx];
    534 	txmap = txq->txq_dmamap;
    535 
    536 	error = bus_dmamap_load_mbuf(sc->sc_dmat, txmap, m, BUS_DMA_NOWAIT);
    537 	switch (error) {
    538 	case 0:
    539 		break;
    540 	case EFBIG: /* mbuf chain is too fragmented */
    541 		if (m_defrag(m, M_DONTWAIT) == 0 &&
    542 		    bus_dmamap_load_mbuf(sc->sc_dmat, txmap, m,
    543 		    BUS_DMA_NOWAIT) == 0)
    544 			break;
    545 
    546 		/* FALLTHROUGH */
    547 	default:
    548 		return (0);
    549 	}
    550 
    551 	bus_dmamap_sync(sc->sc_dmat, txmap, 0, txmap->dm_mapsize,
    552 	    BUS_DMASYNC_PREWRITE);
    553 
    554 	nsegs = txmap->dm_nsegs;
    555 
    556 	/* Set up hardware VLAN tagging. */
    557 	if (vlan_has_tag(m))
    558 		cflags |= bswap16(vlan_get_tag(m)) | RGE_TDEXTSTS_VTAG;
    559 
    560 	last = cur = idx;
    561 	cmdsts = RGE_TDCMDSTS_SOF;
    562 
    563 	for (i = 0; i < txmap->dm_nsegs; i++) {
    564 		d = &sc->rge_ldata.rge_tx_list[cur];
    565 
    566 		d->rge_extsts = htole32(cflags);
    567 		d->rge_addrlo = htole32(RGE_ADDR_LO(txmap->dm_segs[i].ds_addr));
    568 		d->rge_addrhi = htole32(RGE_ADDR_HI(txmap->dm_segs[i].ds_addr));
    569 
    570 		cmdsts |= txmap->dm_segs[i].ds_len;
    571 
    572 		if (cur == RGE_TX_LIST_CNT - 1)
    573 			cmdsts |= RGE_TDCMDSTS_EOR;
    574 
    575 		d->rge_cmdsts = htole32(cmdsts);
    576 
    577 		last = cur;
    578 		cmdsts = RGE_TDCMDSTS_OWN;
    579 		cur = RGE_NEXT_TX_DESC(cur);
    580 	}
    581 
    582 	/* Set EOF on the last descriptor. */
    583 	d->rge_cmdsts |= htole32(RGE_TDCMDSTS_EOF);
    584 
    585 	/* Transfer ownership of packet to the chip. */
    586 	d = &sc->rge_ldata.rge_tx_list[idx];
    587 
    588 	d->rge_cmdsts |= htole32(RGE_TDCMDSTS_OWN);
    589 
    590 	bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map,
    591 	    cur * sizeof(struct rge_tx_desc), sizeof(struct rge_tx_desc),
    592 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
    593 
    594 	/* Update info of TX queue and descriptors. */
    595 	txq->txq_mbuf = m;
    596 	txq->txq_descidx = last;
    597 
    598 	return (nsegs);
    599 }
    600 
    601 int
    602 rge_ioctl(struct ifnet *ifp, u_long cmd, void *data)
    603 {
    604 	struct rge_softc *sc = ifp->if_softc;
    605 	//struct ifreq *ifr = (struct ifreq *)data;
    606 	int s, error = 0;
    607 
    608 	s = splnet();
    609 
    610 	switch (cmd) {
    611 	case SIOCSIFFLAGS:
    612 		if ((error = ifioctl_common(ifp, cmd, data)) != 0)
    613 			break;
    614 		/* XXX set an ifflags callback and let ether_ioctl
    615 		 * handle all of this.
    616 		 */
    617 		if (ifp->if_flags & IFF_UP) {
    618 			if (ifp->if_flags & IFF_RUNNING)
    619 				error = ENETRESET;
    620 			else
    621 				rge_init(ifp);
    622 		} else {
    623 			if (ifp->if_flags & IFF_RUNNING)
    624 				rge_stop(ifp, 1);
    625 		}
    626 		break;
    627 	default:
    628 		error = ether_ioctl(ifp, cmd, data);
    629 	}
    630 
    631 	if (error == ENETRESET) {
    632 		if (ifp->if_flags & IFF_RUNNING)
    633 			rge_iff(sc);
    634 		error = 0;
    635 	}
    636 
    637 	splx(s);
    638 	return (error);
    639 }
    640 
    641 void
    642 rge_start(struct ifnet *ifp)
    643 {
    644 	struct rge_softc *sc = ifp->if_softc;
    645 	struct mbuf *m;
    646 	int free, idx, used;
    647 	int queued = 0;
    648 
    649 #define LINK_STATE_IS_UP(_s)    \
    650 	((_s) >= LINK_STATE_UP || (_s) == LINK_STATE_UNKNOWN)
    651 
    652 	if (!LINK_STATE_IS_UP(ifp->if_link_state)) {
    653 		IFQ_PURGE(&ifp->if_snd);
    654 		return;
    655 	}
    656 
    657 	/* Calculate free space. */
    658 	idx = sc->rge_ldata.rge_txq_prodidx;
    659 	free = sc->rge_ldata.rge_txq_considx;
    660 	if (free <= idx)
    661 		free += RGE_TX_LIST_CNT;
    662 	free -= idx;
    663 
    664 	for (;;) {
    665 		if (RGE_TX_NSEGS >= free + 2) {
    666 			SET(ifp->if_flags, IFF_OACTIVE);
    667 			break;
    668 		}
    669 
    670 		IFQ_DEQUEUE(&ifp->if_snd, m);
    671 		if (m == NULL)
    672 			break;
    673 
    674 		used = rge_encap(sc, m, idx);
    675 		if (used == 0) {
    676 			m_freem(m);
    677 			continue;
    678 		}
    679 
    680 		KASSERT(used <= free);
    681 		free -= used;
    682 
    683 		bpf_mtap(ifp, m, BPF_D_OUT);
    684 
    685 		idx += used;
    686 		if (idx >= RGE_TX_LIST_CNT)
    687 			idx -= RGE_TX_LIST_CNT;
    688 
    689 		queued++;
    690 	}
    691 
    692 	if (queued == 0)
    693 		return;
    694 
    695 	/* Set a timeout in case the chip goes out to lunch. */
    696 	ifp->if_timer = 5;
    697 
    698 	sc->rge_ldata.rge_txq_prodidx = idx;
    699 	rge_txstart(sc);
    700 }
    701 
    702 void
    703 rge_watchdog(struct ifnet *ifp)
    704 {
    705 	struct rge_softc *sc = ifp->if_softc;
    706 
    707 	device_printf(sc->sc_dev, "watchdog timeout\n");
    708 	if_statinc(ifp, if_oerrors);
    709 
    710 	rge_init(ifp);
    711 }
    712 
    713 int
    714 rge_init(struct ifnet *ifp)
    715 {
    716 	struct rge_softc *sc = ifp->if_softc;
    717 	uint32_t val;
    718 	unsigned i;
    719 
    720 	rge_stop(ifp, 0);
    721 
    722 	/* Set MAC address. */
    723 	rge_set_macaddr(sc, CLLADDR(ifp->if_sadl));
    724 
    725 	/* Set Maximum frame size. */
    726 	RGE_WRITE_2(sc, RGE_RXMAXSIZE, RGE_JUMBO_FRAMELEN);
    727 
    728 	/* Initialize RX descriptors list. */
    729 	int error = rge_rx_list_init(sc);
    730 	if (error != 0) {
    731 		device_printf(sc->sc_dev,
    732 		    "init failed: no memory for RX buffers\n");
    733 		rge_stop(ifp, 1);
    734 		return error;
    735 	}
    736 
    737 	/* Initialize TX descriptors. */
    738 	rge_tx_list_init(sc);
    739 
    740 	/* Load the addresses of the RX and TX lists into the chip. */
    741 	RGE_WRITE_4(sc, RGE_RXDESC_ADDR_LO,
    742 	    RGE_ADDR_LO(sc->rge_ldata.rge_rx_list_map->dm_segs[0].ds_addr));
    743 	RGE_WRITE_4(sc, RGE_RXDESC_ADDR_HI,
    744 	    RGE_ADDR_HI(sc->rge_ldata.rge_rx_list_map->dm_segs[0].ds_addr));
    745 	RGE_WRITE_4(sc, RGE_TXDESC_ADDR_LO,
    746 	    RGE_ADDR_LO(sc->rge_ldata.rge_tx_list_map->dm_segs[0].ds_addr));
    747 	RGE_WRITE_4(sc, RGE_TXDESC_ADDR_HI,
    748 	    RGE_ADDR_HI(sc->rge_ldata.rge_tx_list_map->dm_segs[0].ds_addr));
    749 
    750 	RGE_SETBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG);
    751 
    752 	RGE_CLRBIT_1(sc, 0xf1, 0x80);
    753 	if (sc->rge_type == MAC_CFG2_8126)
    754 		RGE_CLRBIT_1(sc, RGE_INT_CFG0, 0x08);
    755 	else
    756 		RGE_CLRBIT_1(sc, RGE_CFG2, RGE_CFG2_CLKREQ_EN);
    757 	RGE_CLRBIT_1(sc, RGE_CFG5, RGE_CFG5_PME_STS);
    758 	if (sc->rge_type != MAC_CFG2_8126)
    759 		RGE_CLRBIT_1(sc, RGE_CFG3, RGE_CFG3_RDY_TO_L23);
    760 
    761 	/* Clear interrupt moderation timer. */
    762 	for (i = 0; i < 64; i++)
    763 		RGE_WRITE_4(sc, RGE_INTMITI(i), 0);
    764 
    765 	/* Set the initial RX and TX configurations. */
    766 	if (sc->rge_type == MAC_CFG2_8126)
    767 		RGE_WRITE_4(sc, RGE_RXCFG, RGE_RXCFG_CONFIG_8126);
    768 	else
    769 		RGE_WRITE_4(sc, RGE_RXCFG, RGE_RXCFG_CONFIG);
    770 	RGE_WRITE_4(sc, RGE_TXCFG, RGE_TXCFG_CONFIG);
    771 
    772 	val = rge_read_csi(sc, 0x70c) & ~0xff000000;
    773 	rge_write_csi(sc, 0x70c, val | 0x27000000);
    774 
    775 	/* Enable hardware optimization function. */
    776 	val = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x78) & ~0x00007000;
    777 	pci_conf_write(sc->sc_pc, sc->sc_tag, 0x78, val | 0x00005000);
    778 
    779 	if (sc->rge_type == MAC_CFG2_8126) {
    780 		/* Disable L1 timeout. */
    781 		val = rge_read_csi(sc, 0x890) & ~0x00000001;
    782 		rge_write_csi(sc, 0x890, val);
    783 	} else
    784 		RGE_WRITE_2(sc, 0x0382, 0x221b);
    785 	RGE_WRITE_1(sc, 0x4500, 0);
    786 	RGE_WRITE_2(sc, 0x4800, 0);
    787 	RGE_CLRBIT_1(sc, RGE_CFG1, RGE_CFG1_SPEED_DOWN);
    788 
    789 	rge_write_mac_ocp(sc, 0xc140, 0xffff);
    790 	rge_write_mac_ocp(sc, 0xc142, 0xffff);
    791 
    792 	val = rge_read_mac_ocp(sc, 0xd3e2) & ~0x0fff;
    793 	rge_write_mac_ocp(sc, 0xd3e2, val | 0x03a9);
    794 
    795 	RGE_MAC_CLRBIT(sc, 0xd3e4, 0x00ff);
    796 	RGE_MAC_SETBIT(sc, 0xe860, 0x0080);
    797 	RGE_MAC_SETBIT(sc, 0xeb58, 0x0001);
    798 
    799 	if (sc->rge_type == MAC_CFG2_8126)
    800 		RGE_CLRBIT_1(sc, 0xd8, 0x02);
    801 
    802 	val = rge_read_mac_ocp(sc, 0xe614) & ~0x0700;
    803 	if (sc->rge_type == MAC_CFG2 || sc->rge_type == MAC_CFG3 ||
    804 	    sc->rge_type == MAC_CFG2_8126)
    805 		rge_write_mac_ocp(sc, 0xe614, val | 0x0400);
    806 	else
    807 		rge_write_mac_ocp(sc, 0xe614, val | 0x0200);
    808 
    809 	RGE_MAC_CLRBIT(sc, 0xe63e, 0x0c00);
    810 
    811 	if (sc->rge_type == MAC_CFG2 || sc->rge_type == MAC_CFG3 ||
    812 	    sc->rge_type == MAC_CFG2_8126) {
    813 		val = rge_read_mac_ocp(sc, 0xe63e) & ~0x0030;
    814 		rge_write_mac_ocp(sc, 0xe63e, val | 0x0020);
    815 	} else
    816 		RGE_MAC_CLRBIT(sc, 0xe63e, 0x0030);
    817 
    818 	RGE_MAC_SETBIT(sc, 0xc0b4, 0x000c);
    819 
    820 	val = rge_read_mac_ocp(sc, 0xeb6a) & ~0x00ff;
    821 	rge_write_mac_ocp(sc, 0xeb6a, val | 0x0033);
    822 
    823 	val = rge_read_mac_ocp(sc, 0xeb50) & ~0x03e0;
    824 	rge_write_mac_ocp(sc, 0xeb50, val | 0x0040);
    825 
    826 	val = rge_read_mac_ocp(sc, 0xe056) & ~0x00f0;
    827 	rge_write_mac_ocp(sc, 0xe056, val | 0x0030);
    828 
    829 	RGE_WRITE_1(sc, RGE_TDFNR, 0x10);
    830 
    831 	RGE_SETBIT_1(sc, RGE_DLLPR, RGE_DLLPR_TX_10M_PS_EN);
    832 
    833 	RGE_MAC_CLRBIT(sc, 0xe040, 0x1000);
    834 
    835 	val = rge_read_mac_ocp(sc, 0xea1c) & ~0x0003;
    836 	rge_write_mac_ocp(sc, 0xea1c, val | 0x0001);
    837 
    838 	val = rge_read_mac_ocp(sc, 0xe0c0) & ~0x4f0f;
    839 	rge_write_mac_ocp(sc, 0xe0c0, val | 0x4403);
    840 
    841 	RGE_MAC_SETBIT(sc, 0xe052, 0x0068);
    842 	RGE_MAC_CLRBIT(sc, 0xe052, 0x0080);
    843 
    844 	val = rge_read_mac_ocp(sc, 0xc0ac) & ~0x0080;
    845 	rge_write_mac_ocp(sc, 0xc0ac, val | 0x1f00);
    846 
    847 	val = rge_read_mac_ocp(sc, 0xd430) & ~0x0fff;
    848 	rge_write_mac_ocp(sc, 0xd430, val | 0x047f);
    849 
    850 	val = rge_read_mac_ocp(sc, 0xe84c) & ~0x0040;
    851 	if (sc->rge_type == MAC_CFG2 || sc->rge_type == MAC_CFG3)
    852 		rge_write_mac_ocp(sc, 0xe84c, 0x00c0);
    853 	else
    854 		rge_write_mac_ocp(sc, 0xe84c, 0x0080);
    855 
    856 	RGE_SETBIT_1(sc, RGE_DLLPR, RGE_DLLPR_PFM_EN);
    857 
    858 	if (sc->rge_type == MAC_CFG2 || sc->rge_type == MAC_CFG3)
    859 		RGE_SETBIT_1(sc, RGE_MCUCMD, 0x01);
    860 
    861 	/* Disable EEE plus. */
    862 	RGE_MAC_CLRBIT(sc, 0xe080, 0x0002);
    863 
    864 	if (sc->rge_type == MAC_CFG2_8126)
    865 		RGE_MAC_CLRBIT(sc, 0xea1c, 0x0304);
    866 	else
    867 		RGE_MAC_CLRBIT(sc, 0xea1c, 0x0004);
    868 
    869 	RGE_MAC_SETBIT(sc, 0xeb54, 0x0001);
    870 	DELAY(1);
    871 	RGE_MAC_CLRBIT(sc, 0xeb54, 0x0001);
    872 
    873 	RGE_CLRBIT_4(sc, 0x1880, 0x0030);
    874 
    875 	rge_write_mac_ocp(sc, 0xe098, 0xc302);
    876 
    877 	if ((sc->sc_ec.ec_capenable & ETHERCAP_VLAN_HWTAGGING) != 0)
    878 		RGE_SETBIT_4(sc, RGE_RXCFG, RGE_RXCFG_VLANSTRIP);
    879 	else
    880 		RGE_CLRBIT_4(sc, RGE_RXCFG, RGE_RXCFG_VLANSTRIP);
    881 
    882 	RGE_SETBIT_2(sc, RGE_CPLUSCMD, RGE_CPLUSCMD_RXCSUM);
    883 
    884 	for (i = 0; i < 10; i++) {
    885 		if (!(rge_read_mac_ocp(sc, 0xe00e) & 0x2000))
    886 			break;
    887 		DELAY(1000);
    888 	}
    889 
    890 	/* Disable RXDV gate. */
    891 	RGE_CLRBIT_1(sc, RGE_PPSW, 0x08);
    892 	DELAY(2000);
    893 
    894 	rge_ifmedia_upd(ifp);
    895 
    896 	/* Enable transmit and receive. */
    897 	RGE_WRITE_1(sc, RGE_CMD, RGE_CMD_TXENB | RGE_CMD_RXENB);
    898 
    899 	/* Program promiscuous mode and multicast filters. */
    900 	rge_iff(sc);
    901 
    902 	if (sc->rge_type == MAC_CFG2_8126)
    903 		RGE_CLRBIT_1(sc, RGE_INT_CFG0, 0x08);
    904 	else
    905 		RGE_CLRBIT_1(sc, RGE_CFG2, RGE_CFG2_CLKREQ_EN);
    906 	RGE_CLRBIT_1(sc, RGE_CFG5, RGE_CFG5_PME_STS);
    907 
    908 	RGE_CLRBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG);
    909 
    910 	/* Enable interrupts. */
    911 	rge_setup_intr(sc, RGE_IMTYPE_SIM);
    912 
    913 	ifp->if_flags |= IFF_RUNNING;
    914 	CLR(ifp->if_flags, IFF_OACTIVE);
    915 
    916 	callout_schedule(&sc->sc_timeout, 1);
    917 
    918 	return (0);
    919 }
    920 
    921 /*
    922  * Stop the adapter and free any mbufs allocated to the RX and TX lists.
    923  */
    924 void
    925 rge_stop(struct ifnet *ifp, int disable)
    926 {
    927 	struct rge_softc *sc = ifp->if_softc;
    928 
    929 	callout_halt(&sc->sc_timeout, NULL);
    930 
    931 	ifp->if_timer = 0;
    932 	ifp->if_flags &= ~IFF_RUNNING;
    933 	sc->rge_timerintr = 0;
    934 
    935 	RGE_CLRBIT_4(sc, RGE_RXCFG, RGE_RXCFG_ALLPHYS | RGE_RXCFG_INDIV |
    936 	    RGE_RXCFG_MULTI | RGE_RXCFG_BROAD | RGE_RXCFG_RUNT |
    937 	    RGE_RXCFG_ERRPKT);
    938 
    939 	RGE_WRITE_4(sc, RGE_IMR, 0);
    940 
    941 	/* Config interrupt type for RTL8126. */
    942 	if (sc->rge_type == MAC_CFG2_8126)
    943 		RGE_CLRBIT_1(sc, RGE_INT_CFG0, RGE_INT_CFG0_EN);
    944 
    945 	/* Clear timer interrupts. */
    946 	RGE_WRITE_4(sc, RGE_TIMERINT0, 0);
    947 	RGE_WRITE_4(sc, RGE_TIMERINT1, 0);
    948 	RGE_WRITE_4(sc, RGE_TIMERINT2, 0);
    949 	RGE_WRITE_4(sc, RGE_TIMERINT3, 0);
    950 
    951 	rge_reset(sc);
    952 
    953 //	intr_barrier(sc->sc_ih);
    954 //	ifq_barrier(&ifp->if_snd);
    955 /*	ifq_clr_oactive(&ifp->if_snd); Sevan - OpenBSD queue API */
    956 
    957 	if (sc->rge_head != NULL) {
    958 		m_freem(sc->rge_head);
    959 		sc->rge_head = sc->rge_tail = NULL;
    960 	}
    961 
    962 	rge_tx_list_fini(sc);
    963 	rge_rx_list_fini(sc);
    964 }
    965 
    966 /*
    967  * Set media options.
    968  */
    969 int
    970 rge_ifmedia_upd(struct ifnet *ifp)
    971 {
    972 	struct rge_softc *sc = ifp->if_softc;
    973 	struct ifmedia *ifm = &sc->sc_media;
    974 	int anar, gig, val;
    975 
    976 	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
    977 		return (EINVAL);
    978 
    979 	/* Disable Gigabit Lite. */
    980 	RGE_PHY_CLRBIT(sc, 0xa428, 0x0200);
    981 	RGE_PHY_CLRBIT(sc, 0xa5ea, 0x0001);
    982 	if (sc->rge_type == MAC_CFG2_8126)
    983 		RGE_PHY_CLRBIT(sc, 0xa5ea, 0x0002);
    984 
    985 	val = rge_read_phy_ocp(sc, 0xa5d4);
    986 	val &= ~RGE_ADV_2500TFDX;
    987 	if (sc->rge_type == MAC_CFG2_8126)
    988 		val &= ~RGE_ADV_5000TFDX;
    989 
    990 	anar = ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10;
    991 	gig = GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX;
    992 
    993 	switch (IFM_SUBTYPE(ifm->ifm_media)) {
    994 	case IFM_AUTO:
    995 		val |= (sc->rge_type != MAC_CFG2_8126) ?
    996 		    RGE_ADV_2500TFDX : (RGE_ADV_2500TFDX | RGE_ADV_5000TFDX);
    997 		break;
    998 	case IFM_5000_T:
    999 		val |= RGE_ADV_5000TFDX;
   1000 		ifp->if_baudrate = IF_Gbps(5);
   1001 		break;
   1002 	case IFM_2500_T:
   1003 		val |= RGE_ADV_2500TFDX;
   1004 		ifp->if_baudrate = IF_Mbps(2500);
   1005 		break;
   1006 	case IFM_1000_T:
   1007 		ifp->if_baudrate = IF_Gbps(1);
   1008 		break;
   1009 	case IFM_100_TX:
   1010 		gig = rge_read_phy(sc, 0, MII_100T2CR) &
   1011 		    ~(GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX);
   1012 		anar = ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) ?
   1013 		    ANAR_TX | ANAR_TX_FD | ANAR_10_FD | ANAR_10 :
   1014 		    ANAR_TX | ANAR_10_FD | ANAR_10;
   1015 		ifp->if_baudrate = IF_Mbps(100);
   1016 		break;
   1017 	case IFM_10_T:
   1018 		gig = rge_read_phy(sc, 0, MII_100T2CR) &
   1019 		    ~(GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX);
   1020 		anar = ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) ?
   1021 		    ANAR_10_FD | ANAR_10 : ANAR_10;
   1022 		ifp->if_baudrate = IF_Mbps(10);
   1023 		break;
   1024 	default:
   1025 		device_printf(sc->sc_dev,
   1026 		    "unsupported media type\n");
   1027 		return (EINVAL);
   1028 	}
   1029 
   1030 	rge_write_phy(sc, 0, MII_ANAR, anar | ANAR_PAUSE_ASYM | ANAR_FC);
   1031 	rge_write_phy(sc, 0, MII_100T2CR, gig);
   1032 	rge_write_phy_ocp(sc, 0xa5d4, val);
   1033 	rge_write_phy(sc, 0, MII_BMCR, BMCR_RESET | BMCR_AUTOEN |
   1034 	    BMCR_STARTNEG);
   1035 
   1036 	return (0);
   1037 }
   1038 
   1039 /*
   1040  * Report current media status.
   1041  */
   1042 void
   1043 rge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
   1044 {
   1045 	struct rge_softc *sc = ifp->if_softc;
   1046 	uint16_t status = 0;
   1047 
   1048 	ifmr->ifm_status = IFM_AVALID;
   1049 	ifmr->ifm_active = IFM_ETHER;
   1050 
   1051 	if (rge_get_link_status(sc)) {
   1052 		ifmr->ifm_status |= IFM_ACTIVE;
   1053 
   1054 		status = RGE_READ_2(sc, RGE_PHYSTAT);
   1055 		if ((status & RGE_PHYSTAT_FDX) ||
   1056 		    (status & (RGE_PHYSTAT_2500MBPS | RGE_PHYSTAT_5000MBPS)))
   1057 			ifmr->ifm_active |= IFM_FDX;
   1058 		else
   1059 			ifmr->ifm_active |= IFM_HDX;
   1060 
   1061 		if (status & RGE_PHYSTAT_10MBPS)
   1062 			ifmr->ifm_active |= IFM_10_T;
   1063 		else if (status & RGE_PHYSTAT_100MBPS)
   1064 			ifmr->ifm_active |= IFM_100_TX;
   1065 		else if (status & RGE_PHYSTAT_1000MBPS)
   1066 			ifmr->ifm_active |= IFM_1000_T;
   1067 		else if (status & RGE_PHYSTAT_2500MBPS)
   1068 			ifmr->ifm_active |= IFM_2500_T;
   1069 		else if (status & RGE_PHYSTAT_5000MBPS)
   1070 			ifmr->ifm_active |= IFM_5000_T;
   1071 	}
   1072 }
   1073 
   1074 /*
   1075  * Allocate memory for RX/TX rings.
   1076  *
   1077  * XXX There is no tear-down for this if it any part fails, so everything
   1078  * remains allocated.
   1079  */
   1080 static int
   1081 rge_allocmem(struct rge_softc *sc)
   1082 {
   1083 	int error, i;
   1084 
   1085 	/* Allocate DMA'able memory for the TX ring. */
   1086 	error = bus_dmamap_create(sc->sc_dmat, RGE_TX_LIST_SZ, 1,
   1087 	    RGE_TX_LIST_SZ, 0, BUS_DMA_NOWAIT, &sc->rge_ldata.rge_tx_list_map);
   1088 	if (error) {
   1089 		aprint_error_dev(sc->sc_dev, "can't create TX list map\n");
   1090 		return (error);
   1091 	}
   1092 	error = bus_dmamem_alloc(sc->sc_dmat, RGE_TX_LIST_SZ, RGE_ALIGN, 0,
   1093 	    &sc->rge_ldata.rge_tx_listseg, 1, &sc->rge_ldata.rge_tx_listnseg,
   1094 	    BUS_DMA_NOWAIT);
   1095 	if (error) {
   1096 		aprint_error_dev(sc->sc_dev, "can't alloc TX list\n");
   1097 		return (error);
   1098 	}
   1099 
   1100 	/* Load the map for the TX ring. */
   1101 	error = bus_dmamem_map(sc->sc_dmat, &sc->rge_ldata.rge_tx_listseg,
   1102 	    sc->rge_ldata.rge_tx_listnseg, RGE_TX_LIST_SZ,
   1103 	    (void **) &sc->rge_ldata.rge_tx_list,
   1104 	    BUS_DMA_NOWAIT | BUS_DMA_COHERENT);
   1105 	if (error) {
   1106 		aprint_error_dev(sc->sc_dev, "can't map TX dma buffers\n");
   1107 		bus_dmamem_free(sc->sc_dmat, &sc->rge_ldata.rge_tx_listseg,
   1108 		    sc->rge_ldata.rge_tx_listnseg);
   1109 		return (error);
   1110 	}
   1111 	memset(sc->rge_ldata.rge_tx_list, 0, RGE_TX_LIST_SZ);
   1112 	error = bus_dmamap_load(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map,
   1113 	    sc->rge_ldata.rge_tx_list, RGE_TX_LIST_SZ, NULL, BUS_DMA_NOWAIT);
   1114 	if (error) {
   1115 		aprint_error_dev(sc->sc_dev, "can't load TX dma map\n");
   1116 		bus_dmamap_destroy(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map);
   1117 		bus_dmamem_unmap(sc->sc_dmat,
   1118 		    sc->rge_ldata.rge_tx_list, RGE_TX_LIST_SZ);
   1119 		bus_dmamem_free(sc->sc_dmat, &sc->rge_ldata.rge_tx_listseg,
   1120 		    sc->rge_ldata.rge_tx_listnseg);
   1121 		return (error);
   1122 	}
   1123 
   1124 	/* Create DMA maps for TX buffers. */
   1125 	for (i = 0; i < RGE_TX_LIST_CNT; i++) {
   1126 		error = bus_dmamap_create(sc->sc_dmat, RGE_JUMBO_FRAMELEN,
   1127 		    RGE_TX_NSEGS, RGE_JUMBO_FRAMELEN, 0, 0,
   1128 		    &sc->rge_ldata.rge_txq[i].txq_dmamap);
   1129 		if (error) {
   1130 			aprint_error_dev(sc->sc_dev, "can't create DMA map for TX\n");
   1131 			return (error);
   1132 		}
   1133 	}
   1134 
   1135 	/* Allocate DMA'able memory for the RX ring. */
   1136 	error = bus_dmamap_create(sc->sc_dmat, RGE_RX_LIST_SZ, 1,
   1137 	    RGE_RX_LIST_SZ, 0, 0, &sc->rge_ldata.rge_rx_list_map);
   1138 	if (error) {
   1139 		aprint_error_dev(sc->sc_dev, "can't create RX list map\n");
   1140 		return (error);
   1141 	}
   1142 	error = bus_dmamem_alloc(sc->sc_dmat, RGE_RX_LIST_SZ, RGE_ALIGN, 0,
   1143 	    &sc->rge_ldata.rge_rx_listseg, 1, &sc->rge_ldata.rge_rx_listnseg,
   1144 	    BUS_DMA_NOWAIT);
   1145 	if (error) {
   1146 		aprint_error_dev(sc->sc_dev, "can't alloc RX list\n");
   1147 		return (error);
   1148 	}
   1149 
   1150 	/* Load the map for the RX ring. */
   1151 	error = bus_dmamem_map(sc->sc_dmat, &sc->rge_ldata.rge_rx_listseg,
   1152 	    sc->rge_ldata.rge_rx_listnseg, RGE_RX_LIST_SZ,
   1153 	    (void **) &sc->rge_ldata.rge_rx_list,
   1154 	    BUS_DMA_NOWAIT | BUS_DMA_COHERENT);
   1155 	if (error) {
   1156 		aprint_error_dev(sc->sc_dev, "can't map RX dma buffers\n");
   1157 		bus_dmamem_free(sc->sc_dmat, &sc->rge_ldata.rge_rx_listseg,
   1158 		    sc->rge_ldata.rge_rx_listnseg);
   1159 		return (error);
   1160 	}
   1161 	memset(sc->rge_ldata.rge_rx_list, 0, RGE_RX_LIST_SZ);
   1162 	error = bus_dmamap_load(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map,
   1163 	    sc->rge_ldata.rge_rx_list, RGE_RX_LIST_SZ, NULL, BUS_DMA_NOWAIT);
   1164 	if (error) {
   1165 		aprint_error_dev(sc->sc_dev, "can't load RX dma map\n");
   1166 		bus_dmamap_destroy(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map);
   1167 		bus_dmamem_unmap(sc->sc_dmat,
   1168 		    sc->rge_ldata.rge_rx_list, RGE_RX_LIST_SZ);
   1169 		bus_dmamem_free(sc->sc_dmat, &sc->rge_ldata.rge_rx_listseg,
   1170 		    sc->rge_ldata.rge_rx_listnseg);
   1171 		return (error);
   1172 	}
   1173 
   1174 	/*
   1175 	 * Create DMA maps for RX buffers.  Use BUS_DMA_ALLOCNOW to avoid any
   1176 	 * potential failure in bus_dmamap_load_mbuf() in the RX path.
   1177 	 */
   1178 	for (i = 0; i < RGE_RX_LIST_CNT; i++) {
   1179 		error = bus_dmamap_create(sc->sc_dmat, RGE_JUMBO_FRAMELEN, 1,
   1180 		    RGE_JUMBO_FRAMELEN, 0, BUS_DMA_ALLOCNOW,
   1181 		    &sc->rge_ldata.rge_rxq[i].rxq_dmamap);
   1182 		if (error) {
   1183 			aprint_error_dev(sc->sc_dev, "can't create DMA map for RX\n");
   1184 			return (error);
   1185 		}
   1186 	}
   1187 
   1188 	return (error);
   1189 }
   1190 
   1191 /*
   1192  * release memory allocated to RX/TX rings
   1193  */
   1194 static int
   1195 rge_deallocmem(struct rge_softc *sc)
   1196 {
   1197 	int i;
   1198 
   1199 	/* Destroy DMA maps for RX buffers */
   1200 	for (i = 0; i < RGE_RX_LIST_CNT; i++)
   1201 		bus_dmamap_destroy(sc->sc_dmat,
   1202 		    sc->rge_ldata.rge_rxq[i].rxq_dmamap);
   1203 
   1204 	/* Unload the map for the RX ring */
   1205 	bus_dmamap_unload(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map);
   1206 	bus_dmamem_unmap(sc->sc_dmat,
   1207 	    sc->rge_ldata.rge_rx_list, RGE_RX_LIST_SZ);
   1208 
   1209 	/* Deallocate DMA'able memory for the RX ring. */
   1210 	bus_dmamem_free(sc->sc_dmat, &sc->rge_ldata.rge_rx_listseg,
   1211 	    sc->rge_ldata.rge_rx_listnseg);
   1212 	bus_dmamap_destroy(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map);
   1213 
   1214 	/* Destroy DMA maps for TX buffers. */
   1215 	for (i = 0; i < RGE_TX_LIST_CNT; i++)
   1216 		bus_dmamap_destroy(sc->sc_dmat,
   1217 		    sc->rge_ldata.rge_txq[i].txq_dmamap);
   1218 
   1219 	/* Unload the map for the TX ring */
   1220 	bus_dmamap_unload(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map);
   1221 	bus_dmamem_unmap(sc->sc_dmat,
   1222 	    sc->rge_ldata.rge_tx_list, RGE_TX_LIST_SZ);
   1223 
   1224 	/* Deallocate DMA'able memory for the TX ring. */
   1225 	bus_dmamem_free(sc->sc_dmat, &sc->rge_ldata.rge_tx_listseg,
   1226 	    sc->rge_ldata.rge_tx_listnseg);
   1227 	bus_dmamap_destroy(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map);
   1228 
   1229 	return 0;
   1230 }
   1231 
   1232 /*
   1233  * Set an RX descriptor and sync it.
   1234  */
   1235 static void
   1236 rge_load_rxbuf(struct rge_softc *sc, int idx)
   1237 {
   1238 	struct rge_rx_desc *r = &sc->rge_ldata.rge_rx_list[idx];
   1239 	struct rge_rxq *rxq = &sc->rge_ldata.rge_rxq[idx];
   1240 	bus_dmamap_t rxmap = rxq->rxq_dmamap;
   1241 	uint32_t cmdsts;
   1242 
   1243 	cmdsts = rxmap->dm_segs[0].ds_len | RGE_RDCMDSTS_OWN;
   1244 	if (idx == RGE_RX_LIST_CNT - 1)
   1245 		cmdsts |= RGE_RDCMDSTS_EOR;
   1246 
   1247 	r->hi_qword0.rge_addr = htole64(rxmap->dm_segs[0].ds_addr);
   1248 	r->hi_qword1.rx_qword4.rge_extsts = 0;
   1249 	r->hi_qword1.rx_qword4.rge_cmdsts = htole32(cmdsts);
   1250 
   1251 	bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map,
   1252 	    idx * sizeof(struct rge_rx_desc), sizeof(struct rge_rx_desc),
   1253 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
   1254 }
   1255 
   1256 /*
   1257  * Initialize the RX descriptor and attach an mbuf cluster.
   1258  */
   1259 int
   1260 rge_newbuf(struct rge_softc *sc, int idx)
   1261 {
   1262 	struct mbuf *m;
   1263 	struct rge_rxq *rxq;
   1264 	bus_dmamap_t rxmap;
   1265 	int error __diagused;
   1266 
   1267 	m = MCLGETL(NULL, M_DONTWAIT, RGE_JUMBO_FRAMELEN);
   1268 	if (m == NULL)
   1269 		return (ENOBUFS);
   1270 	MCLAIM(m, &sc->sc_ec.ec_rx_mowner);
   1271 
   1272 	m->m_len = m->m_pkthdr.len = RGE_JUMBO_FRAMELEN;
   1273 
   1274 	rxq = &sc->rge_ldata.rge_rxq[idx];
   1275 	rxmap = rxq->rxq_dmamap;
   1276 
   1277 	if (rxq->rxq_mbuf != NULL)
   1278 		bus_dmamap_unload(sc->sc_dmat, rxq->rxq_dmamap);
   1279 
   1280 	/* This map was created with BUS_DMA_ALLOCNOW so should never fail. */
   1281 	error = bus_dmamap_load_mbuf(sc->sc_dmat, rxmap, m, BUS_DMA_NOWAIT);
   1282 	KASSERTMSG(error == 0, "error=%d", error);
   1283 
   1284 	bus_dmamap_sync(sc->sc_dmat, rxmap, 0, rxmap->dm_mapsize,
   1285 	    BUS_DMASYNC_PREREAD);
   1286 
   1287 	/* Map the segments into RX descriptors. */
   1288 
   1289 	rxq->rxq_mbuf = m;
   1290 	rge_load_rxbuf(sc, idx);
   1291 
   1292 	return 0;
   1293 }
   1294 
   1295 static int
   1296 rge_rx_list_init(struct rge_softc *sc)
   1297 {
   1298 	unsigned i;
   1299 
   1300 	memset(sc->rge_ldata.rge_rx_list, 0, RGE_RX_LIST_SZ);
   1301 
   1302 	for (i = 0; i < RGE_RX_LIST_CNT; i++) {
   1303 		sc->rge_ldata.rge_rxq[i].rxq_mbuf = NULL;
   1304 		if (rge_newbuf(sc, i) != 0) {
   1305 			rge_rx_list_fini(sc);
   1306 			return (ENOBUFS);
   1307 		}
   1308 	}
   1309 
   1310 	sc->rge_ldata.rge_rxq_prodidx = sc->rge_ldata.rge_rxq_considx = 0;
   1311 	sc->rge_head = sc->rge_tail = NULL;
   1312 
   1313 	return (0);
   1314 }
   1315 
   1316 static void
   1317 rge_rx_list_fini(struct rge_softc *sc)
   1318 {
   1319 	unsigned i;
   1320 
   1321 	/* Free the RX list buffers. */
   1322 	for (i = 0; i < RGE_RX_LIST_CNT; i++) {
   1323 		if (sc->rge_ldata.rge_rxq[i].rxq_mbuf != NULL) {
   1324 			bus_dmamap_unload(sc->sc_dmat,
   1325 			    sc->rge_ldata.rge_rxq[i].rxq_dmamap);
   1326 			m_freem(sc->rge_ldata.rge_rxq[i].rxq_mbuf);
   1327 			sc->rge_ldata.rge_rxq[i].rxq_mbuf = NULL;
   1328 		}
   1329 	}
   1330 }
   1331 
   1332 static void
   1333 rge_tx_list_init(struct rge_softc *sc)
   1334 {
   1335 	unsigned i;
   1336 
   1337 	memset(sc->rge_ldata.rge_tx_list, 0, RGE_TX_LIST_SZ);
   1338 
   1339 	for (i = 0; i < RGE_TX_LIST_CNT; i++)
   1340 		sc->rge_ldata.rge_txq[i].txq_mbuf = NULL;
   1341 
   1342 	bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map, 0,
   1343 	    sc->rge_ldata.rge_tx_list_map->dm_mapsize,
   1344 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
   1345 
   1346 	sc->rge_ldata.rge_txq_prodidx = sc->rge_ldata.rge_txq_considx = 0;
   1347 }
   1348 
   1349 static void
   1350 rge_tx_list_fini(struct rge_softc *sc)
   1351 {
   1352 	unsigned i;
   1353 
   1354 	/* Free the TX list buffers. */
   1355 	for (i = 0; i < RGE_TX_LIST_CNT; i++) {
   1356 		if (sc->rge_ldata.rge_txq[i].txq_mbuf != NULL) {
   1357 			bus_dmamap_unload(sc->sc_dmat,
   1358 			    sc->rge_ldata.rge_txq[i].txq_dmamap);
   1359 			m_freem(sc->rge_ldata.rge_txq[i].txq_mbuf);
   1360 			sc->rge_ldata.rge_txq[i].txq_mbuf = NULL;
   1361 		}
   1362 	}
   1363 }
   1364 
   1365 int
   1366 rge_rxeof(struct rge_softc *sc)
   1367 {
   1368 	struct mbuf *m;
   1369 	struct ifnet *ifp = &sc->sc_ec.ec_if;
   1370 	struct rge_rx_desc *cur_rx;
   1371 	struct rge_rxq *rxq;
   1372 	uint32_t rxstat, extsts;
   1373 	int i, total_len, rx = 0;
   1374 
   1375 	for (i = sc->rge_ldata.rge_rxq_considx; ; i = RGE_NEXT_RX_DESC(i)) {
   1376 		/* Invalidate the descriptor memory. */
   1377 		bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map,
   1378 		    i * sizeof(struct rge_rx_desc), sizeof(struct rge_rx_desc),
   1379 		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   1380 
   1381 		cur_rx = &sc->rge_ldata.rge_rx_list[i];
   1382 
   1383 		if (RGE_OWN(cur_rx))
   1384 			break;
   1385 
   1386 		rxstat = letoh32(cur_rx->hi_qword1.rx_qword4.rge_cmdsts);
   1387 		extsts = letoh32(cur_rx->hi_qword1.rx_qword4.rge_extsts);
   1388 
   1389 		total_len = RGE_RXBYTES(cur_rx);
   1390 		rxq = &sc->rge_ldata.rge_rxq[i];
   1391 		m = rxq->rxq_mbuf;
   1392 		rx = 1;
   1393 
   1394 		/* Invalidate the RX mbuf. */
   1395 		bus_dmamap_sync(sc->sc_dmat, rxq->rxq_dmamap, 0,
   1396 		    rxq->rxq_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
   1397 
   1398 		if ((rxstat & (RGE_RDCMDSTS_SOF | RGE_RDCMDSTS_EOF)) !=
   1399 		    (RGE_RDCMDSTS_SOF | RGE_RDCMDSTS_EOF)) {
   1400 			if_statinc(ifp, if_ierrors);
   1401 			rge_load_rxbuf(sc, i);
   1402 			continue;
   1403 		}
   1404 
   1405 		if (rxstat & RGE_RDCMDSTS_RXERRSUM) {
   1406 			if_statinc(ifp, if_ierrors);
   1407 			/*
   1408 			 * If this is part of a multi-fragment packet,
   1409 			 * discard all the pieces.
   1410 			 */
   1411 			if (sc->rge_head != NULL) {
   1412 				m_freem(sc->rge_head);
   1413 				sc->rge_head = sc->rge_tail = NULL;
   1414 			}
   1415 			rge_load_rxbuf(sc, i);
   1416 			continue;
   1417 		}
   1418 
   1419 		/*
   1420 		 * If allocating a replacement mbuf fails,
   1421 		 * reload the current one.
   1422 		 */
   1423 		if (rge_newbuf(sc, i) != 0) {
   1424 			if_statinc(ifp, if_iqdrops);
   1425 			if (sc->rge_head != NULL) {
   1426 				m_freem(sc->rge_head);
   1427 				sc->rge_head = sc->rge_tail = NULL;
   1428 			}
   1429 			rge_load_rxbuf(sc, i);
   1430 			continue;
   1431 		}
   1432 
   1433 		m_set_rcvif(m, ifp);
   1434 		if (sc->rge_head != NULL) {
   1435 			m->m_len = total_len;
   1436 			/*
   1437 			 * Special case: if there's 4 bytes or less
   1438 			 * in this buffer, the mbuf can be discarded:
   1439 			 * the last 4 bytes is the CRC, which we don't
   1440 			 * care about anyway.
   1441 			 */
   1442 			if (m->m_len <= ETHER_CRC_LEN) {
   1443 				sc->rge_tail->m_len -=
   1444 				    (ETHER_CRC_LEN - m->m_len);
   1445 				m_freem(m);
   1446 			} else {
   1447 				m->m_len -= ETHER_CRC_LEN;
   1448 				m->m_flags &= ~M_PKTHDR;
   1449 				sc->rge_tail->m_next = m;
   1450 			}
   1451 			m = sc->rge_head;
   1452 			sc->rge_head = sc->rge_tail = NULL;
   1453 			m->m_pkthdr.len = total_len - ETHER_CRC_LEN;
   1454 		} else
   1455 	#if 0
   1456 			m->m_pkthdr.len = m->m_len =
   1457 			    (total_len - ETHER_CRC_LEN);
   1458 	#else
   1459 		{
   1460 			m->m_pkthdr.len = m->m_len = total_len;
   1461 			m->m_flags |= M_HASFCS;
   1462 		}
   1463 	#endif
   1464 
   1465 #if notyet
   1466 		/* Check IP header checksum. */
   1467 		if (!(extsts & RGE_RDEXTSTS_IPCSUMERR) &&
   1468 		    (extsts & RGE_RDEXTSTS_IPV4))
   1469 			m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
   1470 
   1471 		/* Check TCP/UDP checksum. */
   1472 		if ((extsts & (RGE_RDEXTSTS_IPV4 | RGE_RDEXTSTS_IPV6)) &&
   1473 		    (((extsts & RGE_RDEXTSTS_TCPPKT) &&
   1474 		    !(extsts & RGE_RDEXTSTS_TCPCSUMERR)) ||
   1475 		    ((extsts & RGE_RDEXTSTS_UDPPKT) &&
   1476 		    !(extsts & RGE_RDEXTSTS_UDPCSUMERR))))
   1477 			m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK |
   1478 			    M_UDP_CSUM_IN_OK;
   1479 #endif
   1480 
   1481 		if (extsts & RGE_RDEXTSTS_VTAG) {
   1482 			vlan_set_tag(m,
   1483 			    bswap16(extsts & RGE_RDEXTSTS_VLAN_MASK));
   1484 		}
   1485 
   1486 		if_percpuq_enqueue(ifp->if_percpuq, m);
   1487 	}
   1488 
   1489 	sc->rge_ldata.rge_rxq_considx = i;
   1490 
   1491 	return (rx);
   1492 }
   1493 
   1494 int
   1495 rge_txeof(struct rge_softc *sc)
   1496 {
   1497 	struct ifnet *ifp = &sc->sc_ec.ec_if;
   1498 	struct rge_txq *txq;
   1499 	uint32_t txstat;
   1500 	int cons, idx, prod;
   1501 	int free = 0;
   1502 
   1503 	prod = sc->rge_ldata.rge_txq_prodidx;
   1504 	cons = sc->rge_ldata.rge_txq_considx;
   1505 
   1506 	while (prod != cons) {
   1507 		txq = &sc->rge_ldata.rge_txq[cons];
   1508 		idx = txq->txq_descidx;
   1509 
   1510 		bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map,
   1511 		    idx * sizeof(struct rge_tx_desc),
   1512 		    sizeof(struct rge_tx_desc),
   1513 		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   1514 
   1515 		txstat = letoh32(sc->rge_ldata.rge_tx_list[idx].rge_cmdsts);
   1516 
   1517 		if (txstat & RGE_TDCMDSTS_OWN) {
   1518 			free = 2;
   1519 			break;
   1520 		}
   1521 
   1522 		bus_dmamap_sync(sc->sc_dmat, txq->txq_dmamap, 0,
   1523 		    txq->txq_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   1524 		bus_dmamap_unload(sc->sc_dmat, txq->txq_dmamap);
   1525 		m_freem(txq->txq_mbuf);
   1526 		txq->txq_mbuf = NULL;
   1527 
   1528 		net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
   1529 		if (txstat & (RGE_TDCMDSTS_EXCESSCOLL | RGE_TDCMDSTS_COLL))
   1530 			if_statinc_ref(ifp, nsr, if_collisions);
   1531 		if (txstat & RGE_TDCMDSTS_TXERR)
   1532 			if_statinc_ref(ifp, nsr, if_oerrors);
   1533 		else
   1534 			if_statinc_ref(ifp, nsr, if_opackets);
   1535 		IF_STAT_PUTREF(ifp);
   1536 
   1537 		bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_tx_list_map,
   1538 		    idx * sizeof(struct rge_tx_desc),
   1539 		    sizeof(struct rge_tx_desc),
   1540 		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
   1541 
   1542 		cons = RGE_NEXT_TX_DESC(idx);
   1543 		free = 1;
   1544 	}
   1545 
   1546 	if (free == 0)
   1547 		return (0);
   1548 
   1549 	sc->rge_ldata.rge_txq_considx = cons;
   1550 
   1551 	if (free == 2)
   1552 		rge_txstart(sc);
   1553 
   1554 	CLR(ifp->if_flags, IFF_OACTIVE);
   1555 	ifp->if_timer = 0;
   1556 	if_schedule_deferred_start(ifp);
   1557 
   1558 	return (1);
   1559 }
   1560 
   1561 void
   1562 rge_reset(struct rge_softc *sc)
   1563 {
   1564 	int i;
   1565 
   1566 	/* Enable RXDV gate. */
   1567 	RGE_SETBIT_1(sc, RGE_PPSW, 0x08);
   1568 	DELAY(2000);
   1569 
   1570 	for (i = 0; i < 3000; i++) {
   1571 		DELAY(50);
   1572 		if ((RGE_READ_1(sc, RGE_MCUCMD) & (RGE_MCUCMD_RXFIFO_EMPTY |
   1573 		    RGE_MCUCMD_TXFIFO_EMPTY)) == (RGE_MCUCMD_RXFIFO_EMPTY |
   1574 		    RGE_MCUCMD_TXFIFO_EMPTY))
   1575 			break;
   1576 	}
   1577 	if (sc->rge_type == MAC_CFG4 || sc->rge_type == MAC_CFG5) {
   1578 		for (i = 0; i < 3000; i++) {
   1579 			DELAY(50);
   1580 			if ((RGE_READ_2(sc, RGE_IM) & 0x0103) == 0x0103)
   1581 				break;
   1582 		}
   1583 	}
   1584 
   1585 	DELAY(2000);
   1586 
   1587 	/* Soft reset. */
   1588 	RGE_WRITE_1(sc, RGE_CMD, RGE_CMD_RESET);
   1589 
   1590 	for (i = 0; i < RGE_TIMEOUT; i++) {
   1591 		DELAY(100);
   1592 		if (!(RGE_READ_1(sc, RGE_CMD) & RGE_CMD_RESET))
   1593 			break;
   1594 	}
   1595 	if (i == RGE_TIMEOUT)
   1596 		device_printf(sc->sc_dev, "reset never completed!\n");
   1597 }
   1598 
   1599 void
   1600 rge_iff(struct rge_softc *sc)
   1601 {
   1602 	struct ifnet *ifp = &sc->sc_ec.ec_if;
   1603 	struct ethercom *ec = &sc->sc_ec;
   1604 	struct ether_multi *enm;
   1605 	struct ether_multistep step;
   1606 	uint32_t hashes[2];
   1607 	uint32_t rxfilt;
   1608 	int h = 0;
   1609 
   1610 	rxfilt = RGE_READ_4(sc, RGE_RXCFG);
   1611 	rxfilt &= ~(RGE_RXCFG_ALLPHYS | RGE_RXCFG_MULTI);
   1612 	ifp->if_flags &= ~IFF_ALLMULTI;
   1613 
   1614 	/*
   1615 	 * Always accept frames destined to our station address.
   1616 	 * Always accept broadcast frames.
   1617 	 */
   1618 	rxfilt |= RGE_RXCFG_INDIV | RGE_RXCFG_BROAD;
   1619 
   1620 	if (ifp->if_flags & IFF_PROMISC) {
   1621  allmulti:
   1622 		ifp->if_flags |= IFF_ALLMULTI;
   1623 		rxfilt |= RGE_RXCFG_MULTI;
   1624 		if (ifp->if_flags & IFF_PROMISC)
   1625 			rxfilt |= RGE_RXCFG_ALLPHYS;
   1626 		hashes[0] = hashes[1] = 0xffffffff;
   1627 	} else {
   1628 		rxfilt |= RGE_RXCFG_MULTI;
   1629 		/* Program new filter. */
   1630 		memset(hashes, 0, sizeof(hashes));
   1631 
   1632 		ETHER_LOCK(ec);
   1633 		ETHER_FIRST_MULTI(step, ec, enm);
   1634 		while (enm != NULL) {
   1635 			if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
   1636 			    ETHER_ADDR_LEN) != 0) {
   1637 			    	ETHER_UNLOCK(ec);
   1638 				goto allmulti;
   1639 			}
   1640 			h = ether_crc32_be(enm->enm_addrlo,
   1641 			    ETHER_ADDR_LEN) >> 26;
   1642 
   1643 			if (h < 32)
   1644 				hashes[0] |= (1U << h);
   1645 			else
   1646 				hashes[1] |= (1U << (h - 32));
   1647 
   1648 			ETHER_NEXT_MULTI(step, enm);
   1649 		}
   1650 		ETHER_UNLOCK(ec);
   1651 	}
   1652 
   1653 	RGE_WRITE_4(sc, RGE_RXCFG, rxfilt);
   1654 	RGE_WRITE_4(sc, RGE_MAR0, bswap32(hashes[1]));
   1655 	RGE_WRITE_4(sc, RGE_MAR4, bswap32(hashes[0]));
   1656 }
   1657 
   1658 void
   1659 rge_set_phy_power(struct rge_softc *sc, int on)
   1660 {
   1661 	int i;
   1662 
   1663 	if (on) {
   1664 		RGE_SETBIT_1(sc, RGE_PMCH, 0xc0);
   1665 
   1666 		rge_write_phy(sc, 0, MII_BMCR, BMCR_AUTOEN);
   1667 
   1668 		for (i = 0; i < RGE_TIMEOUT; i++) {
   1669 			if ((rge_read_phy_ocp(sc, 0xa420) & 0x0007) == 3)
   1670 				break;
   1671 			DELAY(1000);
   1672 		}
   1673 	} else {
   1674 		rge_write_phy(sc, 0, MII_BMCR, BMCR_AUTOEN | BMCR_PDOWN);
   1675 		RGE_CLRBIT_1(sc, RGE_PMCH, 0x80);
   1676 		RGE_CLRBIT_1(sc, RGE_PPSW, 0x40);
   1677 	}
   1678 }
   1679 
   1680 void
   1681 rge_phy_config(struct rge_softc *sc)
   1682 {
   1683 	/* Read microcode version. */
   1684 	rge_write_phy_ocp(sc, 0xa436, 0x801e);
   1685 	sc->rge_mcodever = rge_read_phy_ocp(sc, 0xa438);
   1686 
   1687 	switch (sc->rge_type) {
   1688 	case MAC_CFG2_8126:
   1689 		rge_phy_config_mac_cfg2_8126(sc);
   1690 		break;
   1691 	case MAC_CFG2:
   1692 		rge_phy_config_mac_cfg2(sc);
   1693 		break;
   1694 	case MAC_CFG3:
   1695 		rge_phy_config_mac_cfg3(sc);
   1696 		break;
   1697 	case MAC_CFG4:
   1698 		rge_phy_config_mac_cfg4(sc);
   1699 		break;
   1700 	case MAC_CFG5:
   1701 		rge_phy_config_mac_cfg5(sc);
   1702 		break;
   1703 	default:
   1704 		break;	/* Can't happen. */
   1705 	}
   1706 
   1707 	rge_write_phy(sc, 0x0a5b, 0x12,
   1708 	    rge_read_phy(sc, 0x0a5b, 0x12) & ~0x8000);
   1709 
   1710 	/* Disable EEE. */
   1711 	RGE_MAC_CLRBIT(sc, 0xe040, 0x0003);
   1712 	if (sc->rge_type == MAC_CFG2 || sc->rge_type == MAC_CFG3) {
   1713 		RGE_MAC_CLRBIT(sc, 0xeb62, 0x0006);
   1714 		RGE_PHY_CLRBIT(sc, 0xa432, 0x0010);
   1715 	}
   1716 	RGE_PHY_CLRBIT(sc, 0xa5d0, 0x0006);
   1717 	RGE_PHY_CLRBIT(sc, 0xa6d4, 0x0001);
   1718 	if (sc->rge_type == MAC_CFG2_8126)
   1719 		RGE_PHY_CLRBIT(sc, 0xa6d4, 0x0002);
   1720 	RGE_PHY_CLRBIT(sc, 0xa6d8, 0x0010);
   1721 	RGE_PHY_CLRBIT(sc, 0xa428, 0x0080);
   1722 	RGE_PHY_CLRBIT(sc, 0xa4a2, 0x0200);
   1723 
   1724 	/* Disable advanced EEE. */
   1725 	if (sc->rge_type != MAC_CFG2_8126)
   1726 		rge_patch_phy_mcu(sc, 1);
   1727 	RGE_MAC_CLRBIT(sc, 0xe052, 0x0001);
   1728 	RGE_PHY_CLRBIT(sc, 0xa442, 0x3000);
   1729 	RGE_PHY_CLRBIT(sc, 0xa430, 0x8000);
   1730 	if (sc->rge_type != MAC_CFG2_8126)
   1731 		rge_patch_phy_mcu(sc, 0);
   1732 }
   1733 
   1734 void
   1735 rge_phy_config_mac_cfg2_8126(struct rge_softc *sc)
   1736 {
   1737 	uint16_t val;
   1738 	int i;
   1739 	static const uint16_t mac_cfg2_a438_value[] =
   1740 	    { 0x0044, 0x00a8, 0x00d6, 0x00ec, 0x00f6, 0x00fc, 0x00fe,
   1741 	      0x00fe, 0x00bc, 0x0058, 0x002a, 0x003f, 0x3f02, 0x023c,
   1742 	      0x3b0a, 0x1c00, 0x0000, 0x0000, 0x0000, 0x0000 };
   1743 
   1744 	static const uint16_t mac_cfg2_b87e_value[] =
   1745 	    { 0x03ed, 0x03ff, 0x0009, 0x03fe, 0x000b, 0x0021, 0x03f7,
   1746 	      0x03b8, 0x03e0, 0x0049, 0x0049, 0x03e0, 0x03b8, 0x03f7,
   1747 	      0x0021, 0x000b, 0x03fe, 0x0009, 0x03ff, 0x03ed, 0x000e,
   1748 	      0x03fe, 0x03ed, 0x0006, 0x001a, 0x03f1, 0x03d8, 0x0023,
   1749 	      0x0054, 0x0322, 0x00dd, 0x03ab, 0x03dc, 0x0027, 0x000e,
   1750 	      0x03e5, 0x03f9, 0x0012, 0x0001, 0x03f1 };
   1751 
   1752 	rge_phy_config_mcu(sc, RGE_MAC_CFG2_8126_MCODE_VER);
   1753 
   1754 	RGE_PHY_SETBIT(sc, 0xa442, 0x0800);
   1755 	rge_write_phy_ocp(sc, 0xa436, 0x80bf);
   1756 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1757 	rge_write_phy_ocp(sc, 0xa438, val | 0xed00);
   1758 	rge_write_phy_ocp(sc, 0xa436, 0x80cd);
   1759 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1760 	rge_write_phy_ocp(sc, 0xa438, val | 0x1000);
   1761 	rge_write_phy_ocp(sc, 0xa436, 0x80d1);
   1762 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1763 	rge_write_phy_ocp(sc, 0xa438, val | 0xc800);
   1764 	rge_write_phy_ocp(sc, 0xa436, 0x80d4);
   1765 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1766 	rge_write_phy_ocp(sc, 0xa438, val | 0xc800);
   1767 	rge_write_phy_ocp(sc, 0xa436, 0x80e1);
   1768 	rge_write_phy_ocp(sc, 0xa438, 0x10cc);
   1769 	rge_write_phy_ocp(sc, 0xa436, 0x80e5);
   1770 	rge_write_phy_ocp(sc, 0xa438, 0x4f0c);
   1771 	rge_write_phy_ocp(sc, 0xa436, 0x8387);
   1772 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1773 	rge_write_phy_ocp(sc, 0xa438, val | 0x4700);
   1774 	val = rge_read_phy_ocp(sc, 0xa80c) & ~0x00c0;
   1775 	rge_write_phy_ocp(sc, 0xa80c, val | 0x0080);
   1776 	RGE_PHY_CLRBIT(sc, 0xac90, 0x0010);
   1777 	RGE_PHY_CLRBIT(sc, 0xad2c, 0x8000);
   1778 	rge_write_phy_ocp(sc, 0xb87c, 0x8321);
   1779 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1780 	rge_write_phy_ocp(sc, 0xb87e, val | 0x1100);
   1781 	RGE_PHY_SETBIT(sc, 0xacf8, 0x000c);
   1782 	rge_write_phy_ocp(sc, 0xa436, 0x8183);
   1783 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1784 	rge_write_phy_ocp(sc, 0xa438, val | 0x5900);
   1785 	RGE_PHY_SETBIT(sc, 0xad94, 0x0020);
   1786 	RGE_PHY_CLRBIT(sc, 0xa654, 0x0800);
   1787 	RGE_PHY_SETBIT(sc, 0xb648, 0x4000);
   1788 	rge_write_phy_ocp(sc, 0xb87c, 0x839e);
   1789 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1790 	rge_write_phy_ocp(sc, 0xb87e, val | 0x2f00);
   1791 	rge_write_phy_ocp(sc, 0xb87c, 0x83f2);
   1792 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1793 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0800);
   1794 	RGE_PHY_SETBIT(sc, 0xada0, 0x0002);
   1795 	rge_write_phy_ocp(sc, 0xb87c, 0x80f3);
   1796 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1797 	rge_write_phy_ocp(sc, 0xb87e, val | 0x9900);
   1798 	rge_write_phy_ocp(sc, 0xb87c, 0x8126);
   1799 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1800 	rge_write_phy_ocp(sc, 0xb87e, val | 0xc100);
   1801 	rge_write_phy_ocp(sc, 0xb87c, 0x893a);
   1802 	rge_write_phy_ocp(sc, 0xb87e, 0x8080);
   1803 	rge_write_phy_ocp(sc, 0xb87c, 0x8647);
   1804 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1805 	rge_write_phy_ocp(sc, 0xb87e, val | 0xe600);
   1806 	rge_write_phy_ocp(sc, 0xb87c, 0x862c);
   1807 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1808 	rge_write_phy_ocp(sc, 0xb87e, val | 0x1200);
   1809 	rge_write_phy_ocp(sc, 0xb87c, 0x864a);
   1810 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1811 	rge_write_phy_ocp(sc, 0xb87e, val | 0xe600);
   1812 	rge_write_phy_ocp(sc, 0xb87c, 0x80a0);
   1813 	rge_write_phy_ocp(sc, 0xb87e, 0xbcbc);
   1814 	rge_write_phy_ocp(sc, 0xb87c, 0x805e);
   1815 	rge_write_phy_ocp(sc, 0xb87e, 0xbcbc);
   1816 	rge_write_phy_ocp(sc, 0xb87c, 0x8056);
   1817 	rge_write_phy_ocp(sc, 0xb87e, 0x3077);
   1818 	rge_write_phy_ocp(sc, 0xb87c, 0x8058);
   1819 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1820 	rge_write_phy_ocp(sc, 0xb87e, val | 0x5a00);
   1821 	rge_write_phy_ocp(sc, 0xb87c, 0x8098);
   1822 	rge_write_phy_ocp(sc, 0xb87e, 0x3077);
   1823 	rge_write_phy_ocp(sc, 0xb87c, 0x809a);
   1824 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1825 	rge_write_phy_ocp(sc, 0xb87e, val | 0x5a00);
   1826 	rge_write_phy_ocp(sc, 0xb87c, 0x8052);
   1827 	rge_write_phy_ocp(sc, 0xb87e, 0x3733);
   1828 	rge_write_phy_ocp(sc, 0xb87c, 0x8094);
   1829 	rge_write_phy_ocp(sc, 0xb87e, 0x3733);
   1830 	rge_write_phy_ocp(sc, 0xb87c, 0x807f);
   1831 	rge_write_phy_ocp(sc, 0xb87e, 0x7c75);
   1832 	rge_write_phy_ocp(sc, 0xb87c, 0x803d);
   1833 	rge_write_phy_ocp(sc, 0xb87e, 0x7c75);
   1834 	rge_write_phy_ocp(sc, 0xb87c, 0x8036);
   1835 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1836 	rge_write_phy_ocp(sc, 0xb87e, val | 0x3000);
   1837 	rge_write_phy_ocp(sc, 0xb87c, 0x8078);
   1838 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1839 	rge_write_phy_ocp(sc, 0xb87e, val | 0x3000);
   1840 	rge_write_phy_ocp(sc, 0xb87c, 0x8031);
   1841 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1842 	rge_write_phy_ocp(sc, 0xb87e, val | 0x3300);
   1843 	rge_write_phy_ocp(sc, 0xb87c, 0x8073);
   1844 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1845 	rge_write_phy_ocp(sc, 0xb87e, val | 0x3300);
   1846 	val = rge_read_phy_ocp(sc, 0xae06) & ~0xfc00;
   1847 	rge_write_phy_ocp(sc, 0xae06, val | 0x7c00);
   1848 	rge_write_phy_ocp(sc, 0xb87c, 0x89D1);
   1849 	rge_write_phy_ocp(sc, 0xb87e, 0x0004);
   1850 	rge_write_phy_ocp(sc, 0xa436, 0x8fbd);
   1851 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1852 	rge_write_phy_ocp(sc, 0xa438, val | 0x0a00);
   1853 	rge_write_phy_ocp(sc, 0xa436, 0x8fbe);
   1854 	rge_write_phy_ocp(sc, 0xa438, 0x0d09);
   1855 	rge_write_phy_ocp(sc, 0xb87c, 0x89cd);
   1856 	rge_write_phy_ocp(sc, 0xb87e, 0x0f0f);
   1857 	rge_write_phy_ocp(sc, 0xb87c, 0x89cf);
   1858 	rge_write_phy_ocp(sc, 0xb87e, 0x0f0f);
   1859 	rge_write_phy_ocp(sc, 0xb87c, 0x83a4);
   1860 	rge_write_phy_ocp(sc, 0xb87e, 0x6600);
   1861 	rge_write_phy_ocp(sc, 0xb87c, 0x83a6);
   1862 	rge_write_phy_ocp(sc, 0xb87e, 0x6601);
   1863 	rge_write_phy_ocp(sc, 0xb87c, 0x83c0);
   1864 	rge_write_phy_ocp(sc, 0xb87e, 0x6600);
   1865 	rge_write_phy_ocp(sc, 0xb87c, 0x83c2);
   1866 	rge_write_phy_ocp(sc, 0xb87e, 0x6601);
   1867 	rge_write_phy_ocp(sc, 0xb87c, 0x8414);
   1868 	rge_write_phy_ocp(sc, 0xb87e, 0x6600);
   1869 	rge_write_phy_ocp(sc, 0xb87c, 0x8416);
   1870 	rge_write_phy_ocp(sc, 0xb87e, 0x6601);
   1871 	rge_write_phy_ocp(sc, 0xb87c, 0x83f8);
   1872 	rge_write_phy_ocp(sc, 0xb87e, 0x6600);
   1873 	rge_write_phy_ocp(sc, 0xb87c, 0x83fa);
   1874 	rge_write_phy_ocp(sc, 0xb87e, 0x6601);
   1875 
   1876 	rge_patch_phy_mcu(sc, 1);
   1877 	val = rge_read_phy_ocp(sc, 0xbd96) & ~0x1f00;
   1878 	rge_write_phy_ocp(sc, 0xbd96, val | 0x1000);
   1879 	val = rge_read_phy_ocp(sc, 0xbf1c) & ~0x0007;
   1880 	rge_write_phy_ocp(sc, 0xbf1c, val | 0x0007);
   1881 	RGE_PHY_CLRBIT(sc, 0xbfbe, 0x8000);
   1882 	val = rge_read_phy_ocp(sc, 0xbf40) & ~0x0380;
   1883 	rge_write_phy_ocp(sc, 0xbf40, val | 0x0280);
   1884 	val = rge_read_phy_ocp(sc, 0xbf90) & ~0x0080;
   1885 	rge_write_phy_ocp(sc, 0xbf90, val | 0x0060);
   1886 	val = rge_read_phy_ocp(sc, 0xbf90) & ~0x0010;
   1887 	rge_write_phy_ocp(sc, 0xbf90, val | 0x000c);
   1888 	rge_patch_phy_mcu(sc, 0);
   1889 
   1890 	rge_write_phy_ocp(sc, 0xa436, 0x843b);
   1891 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1892 	rge_write_phy_ocp(sc, 0xa438, val | 0x2000);
   1893 	rge_write_phy_ocp(sc, 0xa436, 0x843d);
   1894 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   1895 	rge_write_phy_ocp(sc, 0xa438, val | 0x2000);
   1896 	RGE_PHY_CLRBIT(sc, 0xb516, 0x007f);
   1897 	RGE_PHY_CLRBIT(sc, 0xbf80, 0x0030);
   1898 
   1899 	rge_write_phy_ocp(sc, 0xa436, 0x8188);
   1900 	for (i = 0; i < 11; i++)
   1901 		rge_write_phy_ocp(sc, 0xa438, mac_cfg2_a438_value[i]);
   1902 
   1903 	rge_write_phy_ocp(sc, 0xb87c, 0x8015);
   1904 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1905 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0800);
   1906 	rge_write_phy_ocp(sc, 0xb87c, 0x8ffd);
   1907 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1908 	rge_write_phy_ocp(sc, 0xb87e, val | 0);
   1909 	rge_write_phy_ocp(sc, 0xb87c, 0x8fff);
   1910 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1911 	rge_write_phy_ocp(sc, 0xb87e, val | 0x7f00);
   1912 	rge_write_phy_ocp(sc, 0xb87c, 0x8ffb);
   1913 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1914 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0100);
   1915 	rge_write_phy_ocp(sc, 0xb87c, 0x8fe9);
   1916 	rge_write_phy_ocp(sc, 0xb87e, 0x0002);
   1917 	rge_write_phy_ocp(sc, 0xb87c, 0x8fef);
   1918 	rge_write_phy_ocp(sc, 0xb87e, 0x00a5);
   1919 	rge_write_phy_ocp(sc, 0xb87c, 0x8ff1);
   1920 	rge_write_phy_ocp(sc, 0xb87e, 0x0106);
   1921 	rge_write_phy_ocp(sc, 0xb87c, 0x8fe1);
   1922 	rge_write_phy_ocp(sc, 0xb87e, 0x0102);
   1923 	rge_write_phy_ocp(sc, 0xb87c, 0x8fe3);
   1924 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1925 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0400);
   1926 	RGE_PHY_SETBIT(sc, 0xa654, 0x0800);
   1927 	RGE_PHY_CLRBIT(sc, 0xa654, 0x0003);
   1928 	rge_write_phy_ocp(sc, 0xac3a, 0x5851);
   1929 	val = rge_read_phy_ocp(sc, 0xac3c) & ~0xd000;
   1930 	rge_write_phy_ocp(sc, 0xac3c, val | 0x2000);
   1931 	val = rge_read_phy_ocp(sc, 0xac42) & ~0x0200;
   1932 	rge_write_phy_ocp(sc, 0xac42, val | 0x01c0);
   1933 	RGE_PHY_CLRBIT(sc, 0xac3e, 0xe000);
   1934 	RGE_PHY_CLRBIT(sc, 0xac42, 0x0038);
   1935 	val = rge_read_phy_ocp(sc, 0xac42) & ~0x0002;
   1936 	rge_write_phy_ocp(sc, 0xac42, val | 0x0005);
   1937 	rge_write_phy_ocp(sc, 0xac1a, 0x00db);
   1938 	rge_write_phy_ocp(sc, 0xade4, 0x01b5);
   1939 	RGE_PHY_CLRBIT(sc, 0xad9c, 0x0c00);
   1940 	rge_write_phy_ocp(sc, 0xb87c, 0x814b);
   1941 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1942 	rge_write_phy_ocp(sc, 0xb87e, val | 0x1100);
   1943 	rge_write_phy_ocp(sc, 0xb87c, 0x814d);
   1944 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1945 	rge_write_phy_ocp(sc, 0xb87e, val | 0x1100);
   1946 	rge_write_phy_ocp(sc, 0xb87c, 0x814f);
   1947 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1948 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0b00);
   1949 	rge_write_phy_ocp(sc, 0xb87c, 0x8142);
   1950 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1951 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0100);
   1952 	rge_write_phy_ocp(sc, 0xb87c, 0x8144);
   1953 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1954 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0100);
   1955 	rge_write_phy_ocp(sc, 0xb87c, 0x8150);
   1956 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1957 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0100);
   1958 	rge_write_phy_ocp(sc, 0xb87c, 0x8118);
   1959 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1960 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0700);
   1961 	rge_write_phy_ocp(sc, 0xb87c, 0x811a);
   1962 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1963 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0700);
   1964 	rge_write_phy_ocp(sc, 0xb87c, 0x811c);
   1965 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1966 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0500);
   1967 	rge_write_phy_ocp(sc, 0xb87c, 0x810f);
   1968 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1969 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0100);
   1970 	rge_write_phy_ocp(sc, 0xb87c, 0x8111);
   1971 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1972 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0100);
   1973 	rge_write_phy_ocp(sc, 0xb87c, 0x811d);
   1974 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1975 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0100);
   1976 	RGE_PHY_SETBIT(sc, 0xac36, 0x1000);
   1977 	RGE_PHY_CLRBIT(sc, 0xad1c, 0x0100);
   1978 	val = rge_read_phy_ocp(sc, 0xade8) & ~0xffc0;
   1979 	rge_write_phy_ocp(sc, 0xade8, val | 0x1400);
   1980 	rge_write_phy_ocp(sc, 0xb87c, 0x864b);
   1981 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1982 	rge_write_phy_ocp(sc, 0xb87e, val | 0x9d00);
   1983 
   1984 	rge_write_phy_ocp(sc, 0xa436, 0x8f97);
   1985 	for (; i < nitems(mac_cfg2_a438_value); i++)
   1986 		rge_write_phy_ocp(sc, 0xa438, mac_cfg2_a438_value[i]);
   1987 
   1988 	RGE_PHY_SETBIT(sc, 0xad9c, 0x0020);
   1989 	rge_write_phy_ocp(sc, 0xb87c, 0x8122);
   1990 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1991 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0c00);
   1992 
   1993 	rge_write_phy_ocp(sc, 0xb87c, 0x82c8);
   1994 	for (i = 0; i < 20; i++)
   1995 		rge_write_phy_ocp(sc, 0xb87e, mac_cfg2_b87e_value[i]);
   1996 
   1997 	rge_write_phy_ocp(sc, 0xb87c, 0x80ef);
   1998 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   1999 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0c00);
   2000 
   2001 	rge_write_phy_ocp(sc, 0xb87c, 0x82a0);
   2002 	for (; i < nitems(mac_cfg2_b87e_value); i++)
   2003 		rge_write_phy_ocp(sc, 0xb87e, mac_cfg2_b87e_value[i]);
   2004 
   2005 	rge_write_phy_ocp(sc, 0xa436, 0x8018);
   2006 	RGE_PHY_SETBIT(sc, 0xa438, 0x2000);
   2007 	rge_write_phy_ocp(sc, 0xb87c, 0x8fe4);
   2008 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   2009 	rge_write_phy_ocp(sc, 0xb87e, val | 0);
   2010 	val = rge_read_phy_ocp(sc, 0xb54c) & ~0xffc0;
   2011 	rge_write_phy_ocp(sc, 0xb54c, val | 0x3700);
   2012 }
   2013 
   2014 void
   2015 rge_phy_config_mac_cfg2(struct rge_softc *sc)
   2016 {
   2017 	uint16_t val;
   2018 	int i;
   2019 
   2020 	for (i = 0; i < nitems(rtl8125_mac_cfg2_ephy); i++)
   2021 		rge_write_ephy(sc, rtl8125_mac_cfg2_ephy[i].reg,
   2022 		    rtl8125_mac_cfg2_ephy[i].val);
   2023 
   2024 	rge_phy_config_mcu(sc, RGE_MAC_CFG2_MCODE_VER);
   2025 
   2026 	val = rge_read_phy_ocp(sc, 0xad40) & ~0x03ff;
   2027 	rge_write_phy_ocp(sc, 0xad40, val | 0x0084);
   2028 	RGE_PHY_SETBIT(sc, 0xad4e, 0x0010);
   2029 	val = rge_read_phy_ocp(sc, 0xad16) & ~0x03ff;
   2030 	rge_write_phy_ocp(sc, 0xad16, val | 0x0006);
   2031 	val = rge_read_phy_ocp(sc, 0xad32) & ~0x03ff;
   2032 	rge_write_phy_ocp(sc, 0xad32, val | 0x0006);
   2033 	RGE_PHY_CLRBIT(sc, 0xac08, 0x1100);
   2034 	val = rge_read_phy_ocp(sc, 0xac8a) & ~0xf000;
   2035 	rge_write_phy_ocp(sc, 0xac8a, val | 0x7000);
   2036 	RGE_PHY_SETBIT(sc, 0xad18, 0x0400);
   2037 	RGE_PHY_SETBIT(sc, 0xad1a, 0x03ff);
   2038 	RGE_PHY_SETBIT(sc, 0xad1c, 0x03ff);
   2039 
   2040 	rge_write_phy_ocp(sc, 0xa436, 0x80ea);
   2041 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2042 	rge_write_phy_ocp(sc, 0xa438, val | 0xc400);
   2043 	rge_write_phy_ocp(sc, 0xa436, 0x80eb);
   2044 	val = rge_read_phy_ocp(sc, 0xa438) & ~0x0700;
   2045 	rge_write_phy_ocp(sc, 0xa438, val | 0x0300);
   2046 	rge_write_phy_ocp(sc, 0xa436, 0x80f8);
   2047 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2048 	rge_write_phy_ocp(sc, 0xa438, val | 0x1c00);
   2049 	rge_write_phy_ocp(sc, 0xa436, 0x80f1);
   2050 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2051 	rge_write_phy_ocp(sc, 0xa438, val | 0x3000);
   2052 	rge_write_phy_ocp(sc, 0xa436, 0x80fe);
   2053 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2054 	rge_write_phy_ocp(sc, 0xa438, val | 0xa500);
   2055 	rge_write_phy_ocp(sc, 0xa436, 0x8102);
   2056 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2057 	rge_write_phy_ocp(sc, 0xa438, val | 0x5000);
   2058 	rge_write_phy_ocp(sc, 0xa436, 0x8105);
   2059 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2060 	rge_write_phy_ocp(sc, 0xa438, val | 0x3300);
   2061 	rge_write_phy_ocp(sc, 0xa436, 0x8100);
   2062 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2063 	rge_write_phy_ocp(sc, 0xa438, val | 0x7000);
   2064 	rge_write_phy_ocp(sc, 0xa436, 0x8104);
   2065 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2066 	rge_write_phy_ocp(sc, 0xa438, val | 0xf000);
   2067 	rge_write_phy_ocp(sc, 0xa436, 0x8106);
   2068 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2069 	rge_write_phy_ocp(sc, 0xa438, val | 0x6500);
   2070 	rge_write_phy_ocp(sc, 0xa436, 0x80dc);
   2071 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2072 	rge_write_phy_ocp(sc, 0xa438, val | 0xed00);
   2073 	rge_write_phy_ocp(sc, 0xa436, 0x80df);
   2074 	RGE_PHY_SETBIT(sc, 0xa438, 0x0100);
   2075 	rge_write_phy_ocp(sc, 0xa436, 0x80e1);
   2076 	RGE_PHY_CLRBIT(sc, 0xa438, 0x0100);
   2077 	val = rge_read_phy_ocp(sc, 0xbf06) & ~0x003f;
   2078 	rge_write_phy_ocp(sc, 0xbf06, val | 0x0038);
   2079 	rge_write_phy_ocp(sc, 0xa436, 0x819f);
   2080 	rge_write_phy_ocp(sc, 0xa438, 0xd0b6);
   2081 	rge_write_phy_ocp(sc, 0xbc34, 0x5555);
   2082 	val = rge_read_phy_ocp(sc, 0xbf0a) & ~0x0e00;
   2083 	rge_write_phy_ocp(sc, 0xbf0a, val | 0x0a00);
   2084 	RGE_PHY_CLRBIT(sc, 0xa5c0, 0x0400);
   2085 	RGE_PHY_SETBIT(sc, 0xa442, 0x0800);
   2086 }
   2087 
   2088 void
   2089 rge_phy_config_mac_cfg3(struct rge_softc *sc)
   2090 {
   2091 	struct ifnet *ifp = &sc->sc_ec.ec_if;
   2092 	uint16_t val;
   2093 	int i;
   2094 	static const uint16_t mac_cfg3_a438_value[] =
   2095 	    { 0x0043, 0x00a7, 0x00d6, 0x00ec, 0x00f6, 0x00fb, 0x00fd, 0x00ff,
   2096 	      0x00bb, 0x0058, 0x0029, 0x0013, 0x0009, 0x0004, 0x0002 };
   2097 
   2098 	static const uint16_t mac_cfg3_b88e_value[] =
   2099 	    { 0xc091, 0x6e12, 0xc092, 0x1214, 0xc094, 0x1516, 0xc096, 0x171b,
   2100 	      0xc098, 0x1b1c, 0xc09a, 0x1f1f, 0xc09c, 0x2021, 0xc09e, 0x2224,
   2101 	      0xc0a0, 0x2424, 0xc0a2, 0x2424, 0xc0a4, 0x2424, 0xc018, 0x0af2,
   2102 	      0xc01a, 0x0d4a, 0xc01c, 0x0f26, 0xc01e, 0x118d, 0xc020, 0x14f3,
   2103 	      0xc022, 0x175a, 0xc024, 0x19c0, 0xc026, 0x1c26, 0xc089, 0x6050,
   2104 	      0xc08a, 0x5f6e, 0xc08c, 0x6e6e, 0xc08e, 0x6e6e, 0xc090, 0x6e12 };
   2105 
   2106 	for (i = 0; i < nitems(rtl8125_mac_cfg3_ephy); i++)
   2107 		rge_write_ephy(sc, rtl8125_mac_cfg3_ephy[i].reg,
   2108 		    rtl8125_mac_cfg3_ephy[i].val);
   2109 
   2110 	val = rge_read_ephy(sc, 0x002a) & ~0x7000;
   2111 	rge_write_ephy(sc, 0x002a, val | 0x3000);
   2112 	RGE_EPHY_CLRBIT(sc, 0x0019, 0x0040);
   2113 	RGE_EPHY_SETBIT(sc, 0x001b, 0x0e00);
   2114 	RGE_EPHY_CLRBIT(sc, 0x001b, 0x7000);
   2115 	rge_write_ephy(sc, 0x0002, 0x6042);
   2116 	rge_write_ephy(sc, 0x0006, 0x0014);
   2117 	val = rge_read_ephy(sc, 0x006a) & ~0x7000;
   2118 	rge_write_ephy(sc, 0x006a, val | 0x3000);
   2119 	RGE_EPHY_CLRBIT(sc, 0x0059, 0x0040);
   2120 	RGE_EPHY_SETBIT(sc, 0x005b, 0x0e00);
   2121 	RGE_EPHY_CLRBIT(sc, 0x005b, 0x7000);
   2122 	rge_write_ephy(sc, 0x0042, 0x6042);
   2123 	rge_write_ephy(sc, 0x0046, 0x0014);
   2124 
   2125 	rge_phy_config_mcu(sc, RGE_MAC_CFG3_MCODE_VER);
   2126 
   2127 	RGE_PHY_SETBIT(sc, 0xad4e, 0x0010);
   2128 	val = rge_read_phy_ocp(sc, 0xad16) & ~0x03ff;
   2129 	rge_write_phy_ocp(sc, 0xad16, val | 0x03ff);
   2130 	val = rge_read_phy_ocp(sc, 0xad32) & ~0x003f;
   2131 	rge_write_phy_ocp(sc, 0xad32, val | 0x0006);
   2132 	RGE_PHY_CLRBIT(sc, 0xac08, 0x1000);
   2133 	RGE_PHY_CLRBIT(sc, 0xac08, 0x0100);
   2134 	val = rge_read_phy_ocp(sc, 0xacc0) & ~0x0003;
   2135 	rge_write_phy_ocp(sc, 0xacc0, val | 0x0002);
   2136 	val = rge_read_phy_ocp(sc, 0xad40) & ~0x00e0;
   2137 	rge_write_phy_ocp(sc, 0xad40, val | 0x0040);
   2138 	val = rge_read_phy_ocp(sc, 0xad40) & ~0x0007;
   2139 	rge_write_phy_ocp(sc, 0xad40, val | 0x0004);
   2140 	RGE_PHY_CLRBIT(sc, 0xac14, 0x0080);
   2141 	RGE_PHY_CLRBIT(sc, 0xac80, 0x0300);
   2142 	val = rge_read_phy_ocp(sc, 0xac5e) & ~0x0007;
   2143 	rge_write_phy_ocp(sc, 0xac5e, val | 0x0002);
   2144 	rge_write_phy_ocp(sc, 0xad4c, 0x00a8);
   2145 	rge_write_phy_ocp(sc, 0xac5c, 0x01ff);
   2146 	val = rge_read_phy_ocp(sc, 0xac8a) & ~0x00f0;
   2147 	rge_write_phy_ocp(sc, 0xac8a, val | 0x0030);
   2148 	rge_write_phy_ocp(sc, 0xb87c, 0x8157);
   2149 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   2150 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0500);
   2151 	rge_write_phy_ocp(sc, 0xb87c, 0x8159);
   2152 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   2153 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0700);
   2154 	RGE_WRITE_2(sc, RGE_EEE_TXIDLE_TIMER, ifp->if_mtu + ETHER_HDR_LEN +
   2155 	    32);
   2156 	rge_write_phy_ocp(sc, 0xb87c, 0x80a2);
   2157 	rge_write_phy_ocp(sc, 0xb87e, 0x0153);
   2158 	rge_write_phy_ocp(sc, 0xb87c, 0x809c);
   2159 	rge_write_phy_ocp(sc, 0xb87e, 0x0153);
   2160 
   2161 	rge_write_phy_ocp(sc, 0xa436, 0x81b3);
   2162 	for (i = 0; i < nitems(mac_cfg3_a438_value); i++)
   2163 		rge_write_phy_ocp(sc, 0xa438, mac_cfg3_a438_value[i]);
   2164 	for (i = 0; i < 26; i++)
   2165 		rge_write_phy_ocp(sc, 0xa438, 0);
   2166 	rge_write_phy_ocp(sc, 0xa436, 0x8257);
   2167 	rge_write_phy_ocp(sc, 0xa438, 0x020f);
   2168 	rge_write_phy_ocp(sc, 0xa436, 0x80ea);
   2169 	rge_write_phy_ocp(sc, 0xa438, 0x7843);
   2170 
   2171 	rge_patch_phy_mcu(sc, 1);
   2172 	RGE_PHY_CLRBIT(sc, 0xb896, 0x0001);
   2173 	RGE_PHY_CLRBIT(sc, 0xb892, 0xff00);
   2174 	for (i = 0; i < nitems(mac_cfg3_b88e_value); i += 2) {
   2175 		rge_write_phy_ocp(sc, 0xb88e, mac_cfg3_b88e_value[i]);
   2176 		rge_write_phy_ocp(sc, 0xb890, mac_cfg3_b88e_value[i + 1]);
   2177 	}
   2178 	RGE_PHY_SETBIT(sc, 0xb896, 0x0001);
   2179 	rge_patch_phy_mcu(sc, 0);
   2180 
   2181 	RGE_PHY_SETBIT(sc, 0xd068, 0x2000);
   2182 	rge_write_phy_ocp(sc, 0xa436, 0x81a2);
   2183 	RGE_PHY_SETBIT(sc, 0xa438, 0x0100);
   2184 	val = rge_read_phy_ocp(sc, 0xb54c) & ~0xff00;
   2185 	rge_write_phy_ocp(sc, 0xb54c, val | 0xdb00);
   2186 	RGE_PHY_CLRBIT(sc, 0xa454, 0x0001);
   2187 	RGE_PHY_SETBIT(sc, 0xa5d4, 0x0020);
   2188 	RGE_PHY_CLRBIT(sc, 0xad4e, 0x0010);
   2189 	RGE_PHY_CLRBIT(sc, 0xa86a, 0x0001);
   2190 	RGE_PHY_SETBIT(sc, 0xa442, 0x0800);
   2191 }
   2192 
   2193 void
   2194 rge_phy_config_mac_cfg4(struct rge_softc *sc)
   2195 {
   2196 	struct ifnet *ifp = &sc->sc_ec.ec_if;
   2197 	uint16_t val;
   2198 	int i;
   2199 	static const uint16_t mac_cfg4_b87c_value[] =
   2200 	    { 0x8013, 0x0700, 0x8fb9, 0x2801, 0x8fba, 0x0100, 0x8fbc, 0x1900,
   2201 	      0x8fbe, 0xe100, 0x8fc0, 0x0800, 0x8fc2, 0xe500, 0x8fc4, 0x0f00,
   2202 	      0x8fc6, 0xf100, 0x8fc8, 0x0400, 0x8fca, 0xf300, 0x8fcc, 0xfd00,
   2203 	      0x8fce, 0xff00, 0x8fd0, 0xfb00, 0x8fd2, 0x0100, 0x8fd4, 0xf400,
   2204 	      0x8fd6, 0xff00, 0x8fd8, 0xf600, 0x813d, 0x390e, 0x814f, 0x790e,
   2205 	      0x80b0, 0x0f31 };
   2206 
   2207 	for (i = 0; i < nitems(rtl8125_mac_cfg4_ephy); i++)
   2208 		rge_write_ephy(sc, rtl8125_mac_cfg4_ephy[i].reg,
   2209 		    rtl8125_mac_cfg4_ephy[i].val);
   2210 
   2211 	rge_write_phy_ocp(sc, 0xbf86, 0x9000);
   2212 	RGE_PHY_SETBIT(sc, 0xc402, 0x0400);
   2213 	RGE_PHY_CLRBIT(sc, 0xc402, 0x0400);
   2214 	rge_write_phy_ocp(sc, 0xbd86, 0x1010);
   2215 	rge_write_phy_ocp(sc, 0xbd88, 0x1010);
   2216 	val = rge_read_phy_ocp(sc, 0xbd4e) & ~0x0c00;
   2217 	rge_write_phy_ocp(sc, 0xbd4e, val | 0x0800);
   2218 	val = rge_read_phy_ocp(sc, 0xbf46) & ~0x0f00;
   2219 	rge_write_phy_ocp(sc, 0xbf46, val | 0x0700);
   2220 
   2221 	rge_phy_config_mcu(sc, RGE_MAC_CFG4_MCODE_VER);
   2222 
   2223 	RGE_PHY_SETBIT(sc, 0xa442, 0x0800);
   2224 	RGE_PHY_SETBIT(sc, 0xbc08, 0x000c);
   2225 	rge_write_phy_ocp(sc, 0xa436, 0x8fff);
   2226 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2227 	rge_write_phy_ocp(sc, 0xa438, val | 0x0400);
   2228 	for (i = 0; i < 6; i++) {
   2229 		rge_write_phy_ocp(sc, 0xb87c, 0x8560 + i * 2);
   2230 		if (i < 3)
   2231 			rge_write_phy_ocp(sc, 0xb87e, 0x19cc);
   2232 		else
   2233 			rge_write_phy_ocp(sc, 0xb87e, 0x147d);
   2234 	}
   2235 	rge_write_phy_ocp(sc, 0xb87c, 0x8ffe);
   2236 	rge_write_phy_ocp(sc, 0xb87e, 0x0907);
   2237 	val = rge_read_phy_ocp(sc, 0xacda) & ~0xff00;
   2238 	rge_write_phy_ocp(sc, 0xacda, val | 0xff00);
   2239 	val = rge_read_phy_ocp(sc, 0xacde) & ~0xf000;
   2240 	rge_write_phy_ocp(sc, 0xacde, val | 0xf000);
   2241 	rge_write_phy_ocp(sc, 0xb87c, 0x80d6);
   2242 	rge_write_phy_ocp(sc, 0xb87e, 0x2801);
   2243 	rge_write_phy_ocp(sc, 0xb87c, 0x80F2);
   2244 	rge_write_phy_ocp(sc, 0xb87e, 0x2801);
   2245 	rge_write_phy_ocp(sc, 0xb87c, 0x80f4);
   2246 	rge_write_phy_ocp(sc, 0xb87e, 0x6077);
   2247 	rge_write_phy_ocp(sc, 0xb506, 0x01e7);
   2248 	rge_write_phy_ocp(sc, 0xac8c, 0x0ffc);
   2249 	rge_write_phy_ocp(sc, 0xac46, 0xb7b4);
   2250 	rge_write_phy_ocp(sc, 0xac50, 0x0fbc);
   2251 	rge_write_phy_ocp(sc, 0xac3c, 0x9240);
   2252 	rge_write_phy_ocp(sc, 0xac4E, 0x0db4);
   2253 	rge_write_phy_ocp(sc, 0xacc6, 0x0707);
   2254 	rge_write_phy_ocp(sc, 0xacc8, 0xa0d3);
   2255 	rge_write_phy_ocp(sc, 0xad08, 0x0007);
   2256 	for (i = 0; i < nitems(mac_cfg4_b87c_value); i += 2) {
   2257 		rge_write_phy_ocp(sc, 0xb87c, mac_cfg4_b87c_value[i]);
   2258 		rge_write_phy_ocp(sc, 0xb87e, mac_cfg4_b87c_value[i + 1]);
   2259 	}
   2260 	RGE_PHY_SETBIT(sc, 0xbf4c, 0x0002);
   2261 	RGE_PHY_SETBIT(sc, 0xbcca, 0x0300);
   2262 	rge_write_phy_ocp(sc, 0xb87c, 0x8141);
   2263 	rge_write_phy_ocp(sc, 0xb87e, 0x320e);
   2264 	rge_write_phy_ocp(sc, 0xb87c, 0x8153);
   2265 	rge_write_phy_ocp(sc, 0xb87e, 0x720e);
   2266 	RGE_PHY_CLRBIT(sc, 0xa432, 0x0040);
   2267 	rge_write_phy_ocp(sc, 0xb87c, 0x8529);
   2268 	rge_write_phy_ocp(sc, 0xb87e, 0x050e);
   2269 	RGE_WRITE_2(sc, RGE_EEE_TXIDLE_TIMER, ifp->if_mtu + ETHER_HDR_LEN +
   2270 	    32);
   2271 	rge_write_phy_ocp(sc, 0xa436, 0x816c);
   2272 	rge_write_phy_ocp(sc, 0xa438, 0xc4a0);
   2273 	rge_write_phy_ocp(sc, 0xa436, 0x8170);
   2274 	rge_write_phy_ocp(sc, 0xa438, 0xc4a0);
   2275 	rge_write_phy_ocp(sc, 0xa436, 0x8174);
   2276 	rge_write_phy_ocp(sc, 0xa438, 0x04a0);
   2277 	rge_write_phy_ocp(sc, 0xa436, 0x8178);
   2278 	rge_write_phy_ocp(sc, 0xa438, 0x04a0);
   2279 	rge_write_phy_ocp(sc, 0xa436, 0x817c);
   2280 	rge_write_phy_ocp(sc, 0xa438, 0x0719);
   2281 	rge_write_phy_ocp(sc, 0xa436, 0x8ff4);
   2282 	rge_write_phy_ocp(sc, 0xa438, 0x0400);
   2283 	rge_write_phy_ocp(sc, 0xa436, 0x8ff1);
   2284 	rge_write_phy_ocp(sc, 0xa438, 0x0404);
   2285 	rge_write_phy_ocp(sc, 0xbf4a, 0x001b);
   2286 	for (i = 0; i < 6; i++) {
   2287 		rge_write_phy_ocp(sc, 0xb87c, 0x8033 + i * 4);
   2288 		if (i == 2)
   2289 			rge_write_phy_ocp(sc, 0xb87e, 0xfc32);
   2290 		else
   2291 			rge_write_phy_ocp(sc, 0xb87e, 0x7c13);
   2292 	}
   2293 	rge_write_phy_ocp(sc, 0xb87c, 0x8145);
   2294 	rge_write_phy_ocp(sc, 0xb87e, 0x370e);
   2295 	rge_write_phy_ocp(sc, 0xb87c, 0x8157);
   2296 	rge_write_phy_ocp(sc, 0xb87e, 0x770e);
   2297 	rge_write_phy_ocp(sc, 0xb87c, 0x8169);
   2298 	rge_write_phy_ocp(sc, 0xb87e, 0x0d0a);
   2299 	rge_write_phy_ocp(sc, 0xb87c, 0x817b);
   2300 	rge_write_phy_ocp(sc, 0xb87e, 0x1d0a);
   2301 	rge_write_phy_ocp(sc, 0xa436, 0x8217);
   2302 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2303 	rge_write_phy_ocp(sc, 0xa438, val | 0x5000);
   2304 	rge_write_phy_ocp(sc, 0xa436, 0x821a);
   2305 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2306 	rge_write_phy_ocp(sc, 0xa438, val | 0x5000);
   2307 	rge_write_phy_ocp(sc, 0xa436, 0x80da);
   2308 	rge_write_phy_ocp(sc, 0xa438, 0x0403);
   2309 	rge_write_phy_ocp(sc, 0xa436, 0x80dc);
   2310 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2311 	rge_write_phy_ocp(sc, 0xa438, val | 0x1000);
   2312 	rge_write_phy_ocp(sc, 0xa436, 0x80b3);
   2313 	rge_write_phy_ocp(sc, 0xa438, 0x0384);
   2314 	rge_write_phy_ocp(sc, 0xa436, 0x80b7);
   2315 	rge_write_phy_ocp(sc, 0xa438, 0x2007);
   2316 	rge_write_phy_ocp(sc, 0xa436, 0x80ba);
   2317 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2318 	rge_write_phy_ocp(sc, 0xa438, val | 0x6c00);
   2319 	rge_write_phy_ocp(sc, 0xa436, 0x80b5);
   2320 	rge_write_phy_ocp(sc, 0xa438, 0xf009);
   2321 	rge_write_phy_ocp(sc, 0xa436, 0x80bd);
   2322 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2323 	rge_write_phy_ocp(sc, 0xa438, val | 0x9f00);
   2324 	rge_write_phy_ocp(sc, 0xa436, 0x80c7);
   2325 	rge_write_phy_ocp(sc, 0xa438, 0xf083);
   2326 	rge_write_phy_ocp(sc, 0xa436, 0x80dd);
   2327 	rge_write_phy_ocp(sc, 0xa438, 0x03f0);
   2328 	rge_write_phy_ocp(sc, 0xa436, 0x80df);
   2329 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2330 	rge_write_phy_ocp(sc, 0xa438, val | 0x1000);
   2331 	rge_write_phy_ocp(sc, 0xa436, 0x80cb);
   2332 	rge_write_phy_ocp(sc, 0xa438, 0x2007);
   2333 	rge_write_phy_ocp(sc, 0xa436, 0x80ce);
   2334 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2335 	rge_write_phy_ocp(sc, 0xa438, val | 0x6c00);
   2336 	rge_write_phy_ocp(sc, 0xa436, 0x80c9);
   2337 	rge_write_phy_ocp(sc, 0xa438, 0x8009);
   2338 	rge_write_phy_ocp(sc, 0xa436, 0x80d1);
   2339 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2340 	rge_write_phy_ocp(sc, 0xa438, val | 0x8000);
   2341 	rge_write_phy_ocp(sc, 0xa436, 0x80a3);
   2342 	rge_write_phy_ocp(sc, 0xa438, 0x200a);
   2343 	rge_write_phy_ocp(sc, 0xa436, 0x80a5);
   2344 	rge_write_phy_ocp(sc, 0xa438, 0xf0ad);
   2345 	rge_write_phy_ocp(sc, 0xa436, 0x809f);
   2346 	rge_write_phy_ocp(sc, 0xa438, 0x6073);
   2347 	rge_write_phy_ocp(sc, 0xa436, 0x80a1);
   2348 	rge_write_phy_ocp(sc, 0xa438, 0x000b);
   2349 	rge_write_phy_ocp(sc, 0xa436, 0x80a9);
   2350 	val = rge_read_phy_ocp(sc, 0xa438) & ~0xff00;
   2351 	rge_write_phy_ocp(sc, 0xa438, val | 0xc000);
   2352 	rge_patch_phy_mcu(sc, 1);
   2353 	RGE_PHY_CLRBIT(sc, 0xb896, 0x0001);
   2354 	RGE_PHY_CLRBIT(sc, 0xb892, 0xff00);
   2355 	rge_write_phy_ocp(sc, 0xb88e, 0xc23e);
   2356 	rge_write_phy_ocp(sc, 0xb890, 0x0000);
   2357 	rge_write_phy_ocp(sc, 0xb88e, 0xc240);
   2358 	rge_write_phy_ocp(sc, 0xb890, 0x0103);
   2359 	rge_write_phy_ocp(sc, 0xb88e, 0xc242);
   2360 	rge_write_phy_ocp(sc, 0xb890, 0x0507);
   2361 	rge_write_phy_ocp(sc, 0xb88e, 0xc244);
   2362 	rge_write_phy_ocp(sc, 0xb890, 0x090b);
   2363 	rge_write_phy_ocp(sc, 0xb88e, 0xc246);
   2364 	rge_write_phy_ocp(sc, 0xb890, 0x0c0e);
   2365 	rge_write_phy_ocp(sc, 0xb88e, 0xc248);
   2366 	rge_write_phy_ocp(sc, 0xb890, 0x1012);
   2367 	rge_write_phy_ocp(sc, 0xb88e, 0xc24a);
   2368 	rge_write_phy_ocp(sc, 0xb890, 0x1416);
   2369 	RGE_PHY_SETBIT(sc, 0xb896, 0x0001);
   2370 	rge_patch_phy_mcu(sc, 0);
   2371 	RGE_PHY_SETBIT(sc, 0xa86a, 0x0001);
   2372 	RGE_PHY_SETBIT(sc, 0xa6f0, 0x0001);
   2373 	rge_write_phy_ocp(sc, 0xbfa0, 0xd70d);
   2374 	rge_write_phy_ocp(sc, 0xbfa2, 0x4100);
   2375 	rge_write_phy_ocp(sc, 0xbfa4, 0xe868);
   2376 	rge_write_phy_ocp(sc, 0xbfa6, 0xdc59);
   2377 	rge_write_phy_ocp(sc, 0xb54c, 0x3c18);
   2378 	RGE_PHY_CLRBIT(sc, 0xbfa4, 0x0020);
   2379 	rge_write_phy_ocp(sc, 0xa436, 0x817d);
   2380 	RGE_PHY_SETBIT(sc, 0xa438, 0x1000);
   2381 }
   2382 
   2383 void
   2384 rge_phy_config_mac_cfg5(struct rge_softc *sc)
   2385 {
   2386 	struct ifnet *ifp = &sc->sc_ec.ec_if;
   2387 	uint16_t val;
   2388 	int i;
   2389 
   2390 	for (i = 0; i < nitems(rtl8125_mac_cfg5_ephy); i++)
   2391 		rge_write_ephy(sc, rtl8125_mac_cfg5_ephy[i].reg,
   2392 		    rtl8125_mac_cfg5_ephy[i].val);
   2393 
   2394 	val = rge_read_ephy(sc, 0x0022) & ~0x0030;
   2395 	rge_write_ephy(sc, 0x0022, val | 0x0020);
   2396 	val = rge_read_ephy(sc, 0x0062) & ~0x0030;
   2397 	rge_write_ephy(sc, 0x0062, val | 0x0020);
   2398 
   2399 	rge_phy_config_mcu(sc, RGE_MAC_CFG5_MCODE_VER);
   2400 
   2401 	RGE_PHY_SETBIT(sc, 0xa442, 0x0800);
   2402 	val = rge_read_phy_ocp(sc, 0xac46) & ~0x00f0;
   2403 	rge_write_phy_ocp(sc, 0xac46, val | 0x0090);
   2404 	val = rge_read_phy_ocp(sc, 0xad30) & ~0x0003;
   2405 	rge_write_phy_ocp(sc, 0xad30, val | 0x0001);
   2406 	RGE_WRITE_2(sc, RGE_EEE_TXIDLE_TIMER, ifp->if_mtu + ETHER_HDR_LEN +
   2407 	    32);
   2408 	rge_write_phy_ocp(sc, 0xb87c, 0x80f5);
   2409 	rge_write_phy_ocp(sc, 0xb87e, 0x760e);
   2410 	rge_write_phy_ocp(sc, 0xb87c, 0x8107);
   2411 	rge_write_phy_ocp(sc, 0xb87e, 0x360e);
   2412 	rge_write_phy_ocp(sc, 0xb87c, 0x8551);
   2413 	val = rge_read_phy_ocp(sc, 0xb87e) & ~0xff00;
   2414 	rge_write_phy_ocp(sc, 0xb87e, val | 0x0800);
   2415 	val = rge_read_phy_ocp(sc, 0xbf00) & ~0xe000;
   2416 	rge_write_phy_ocp(sc, 0xbf00, val | 0xa000);
   2417 	val = rge_read_phy_ocp(sc, 0xbf46) & ~0x0f00;
   2418 	rge_write_phy_ocp(sc, 0xbf46, val | 0x0300);
   2419 	for (i = 0; i < 10; i++) {
   2420 		rge_write_phy_ocp(sc, 0xa436, 0x8044 + i * 6);
   2421 		rge_write_phy_ocp(sc, 0xa438, 0x2417);
   2422 	}
   2423 	RGE_PHY_SETBIT(sc, 0xa4ca, 0x0040);
   2424 	val = rge_read_phy_ocp(sc, 0xbf84) & ~0xe000;
   2425 	rge_write_phy_ocp(sc, 0xbf84, val | 0xa000);
   2426 }
   2427 
   2428 void
   2429 rge_phy_config_mcu(struct rge_softc *sc, uint16_t mcode_version)
   2430 {
   2431 	if (sc->rge_mcodever != mcode_version) {
   2432 		int i;
   2433 
   2434 		rge_patch_phy_mcu(sc, 1);
   2435 
   2436 		if (sc->rge_type == MAC_CFG2 || sc->rge_type == MAC_CFG3) {
   2437 			rge_write_phy_ocp(sc, 0xa436, 0x8024);
   2438 			if (sc->rge_type == MAC_CFG2)
   2439 				rge_write_phy_ocp(sc, 0xa438, 0x8600);
   2440 			else
   2441 				rge_write_phy_ocp(sc, 0xa438, 0x8601);
   2442 			rge_write_phy_ocp(sc, 0xa436, 0xb82e);
   2443 			rge_write_phy_ocp(sc, 0xa438, 0x0001);
   2444 
   2445 			RGE_PHY_SETBIT(sc, 0xb820, 0x0080);
   2446 		}
   2447 
   2448 		if (sc->rge_type == MAC_CFG2) {
   2449 			for (i = 0; i < nitems(rtl8125_mac_cfg2_mcu); i++) {
   2450 				rge_write_phy_ocp(sc,
   2451 				    rtl8125_mac_cfg2_mcu[i].reg,
   2452 				    rtl8125_mac_cfg2_mcu[i].val);
   2453 			}
   2454 		} else if (sc->rge_type == MAC_CFG3) {
   2455 			for (i = 0; i < nitems(rtl8125_mac_cfg3_mcu); i++) {
   2456 				rge_write_phy_ocp(sc,
   2457 				    rtl8125_mac_cfg3_mcu[i].reg,
   2458 				    rtl8125_mac_cfg3_mcu[i].val);
   2459 			}
   2460 		} else if (sc->rge_type == MAC_CFG4) {
   2461 			for (i = 0; i < nitems(rtl8125_mac_cfg4_mcu); i++) {
   2462 				rge_write_phy_ocp(sc,
   2463 				    rtl8125_mac_cfg4_mcu[i].reg,
   2464 				    rtl8125_mac_cfg4_mcu[i].val);
   2465 			}
   2466 		} else if (sc->rge_type == MAC_CFG5) {
   2467 			for (i = 0; i < nitems(rtl8125_mac_cfg5_mcu); i++) {
   2468 				rge_write_phy_ocp(sc,
   2469 				    rtl8125_mac_cfg5_mcu[i].reg,
   2470 				    rtl8125_mac_cfg5_mcu[i].val);
   2471 			}
   2472 		} else if (sc->rge_type == MAC_CFG2_8126) {
   2473 			for (i = 0; i < nitems(rtl8126_mac_cfg2_mcu); i++) {
   2474 				rge_write_phy_ocp(sc,
   2475 				    rtl8126_mac_cfg2_mcu[i].reg,
   2476 				    rtl8126_mac_cfg2_mcu[i].val);
   2477 			}
   2478 		}
   2479 
   2480 		if (sc->rge_type == MAC_CFG2 || sc->rge_type == MAC_CFG3) {
   2481 			RGE_PHY_CLRBIT(sc, 0xb820, 0x0080);
   2482 
   2483 			rge_write_phy_ocp(sc, 0xa436, 0);
   2484 			rge_write_phy_ocp(sc, 0xa438, 0);
   2485 			RGE_PHY_CLRBIT(sc, 0xb82e, 0x0001);
   2486 			rge_write_phy_ocp(sc, 0xa436, 0x8024);
   2487 			rge_write_phy_ocp(sc, 0xa438, 0);
   2488 		}
   2489 
   2490 		rge_patch_phy_mcu(sc, 0);
   2491 
   2492 		/* Write microcode version. */
   2493 		rge_write_phy_ocp(sc, 0xa436, 0x801e);
   2494 		rge_write_phy_ocp(sc, 0xa438, mcode_version);
   2495 	}
   2496 }
   2497 
   2498 void
   2499 rge_set_macaddr(struct rge_softc *sc, const uint8_t *addr)
   2500 {
   2501 	RGE_SETBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG);
   2502 	RGE_WRITE_4(sc, RGE_MAC0,
   2503 	    (uint32_t)addr[3] << 24 | addr[2] << 16 | addr[1] << 8 | addr[0]);
   2504 	RGE_WRITE_4(sc, RGE_MAC4,
   2505 	    addr[5] <<  8 | addr[4]);
   2506 	RGE_CLRBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG);
   2507 }
   2508 
   2509 void
   2510 rge_get_macaddr(struct rge_softc *sc, uint8_t *addr)
   2511 {
   2512 	int i;
   2513 
   2514 	for (i = 0; i < ETHER_ADDR_LEN; i++)
   2515 		addr[i] = RGE_READ_1(sc, RGE_ADDR0 + i);
   2516 }
   2517 
   2518 void
   2519 rge_hw_init(struct rge_softc *sc)
   2520 {
   2521 	int i;
   2522 
   2523 	RGE_SETBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG);
   2524 	RGE_CLRBIT_1(sc, RGE_CFG5, RGE_CFG5_PME_STS);
   2525 	if (sc->rge_type == MAC_CFG2_8126)
   2526 		RGE_CLRBIT_1(sc, RGE_INT_CFG0, 0x08);
   2527 	else
   2528 		RGE_CLRBIT_1(sc, RGE_CFG2, RGE_CFG2_CLKREQ_EN);
   2529 	RGE_CLRBIT_1(sc, RGE_EECMD, RGE_EECMD_WRITECFG);
   2530 	RGE_CLRBIT_1(sc, 0xf1, 0x80);
   2531 
   2532 	/* Disable UPS. */
   2533 	RGE_MAC_CLRBIT(sc, 0xd40a, 0x0010);
   2534 
   2535 	/* Configure MAC MCU. */
   2536 	rge_write_mac_ocp(sc, 0xfc38, 0);
   2537 
   2538 	for (i = 0xfc28; i < 0xfc38; i += 2)
   2539 		rge_write_mac_ocp(sc, i, 0);
   2540 
   2541 	DELAY(3000);
   2542 	rge_write_mac_ocp(sc, 0xfc26, 0);
   2543 
   2544 	if (sc->rge_type == MAC_CFG3) {
   2545 		for (i = 0; i < nitems(rtl8125_mac_bps); i++) {
   2546 			rge_write_mac_ocp(sc, rtl8125_mac_bps[i].reg,
   2547 			    rtl8125_mac_bps[i].val);
   2548 		}
   2549 	} else if (sc->rge_type == MAC_CFG5) {
   2550 		for (i = 0; i < nitems(rtl8125b_mac_bps); i++) {
   2551 			rge_write_mac_ocp(sc, rtl8125b_mac_bps[i].reg,
   2552 			    rtl8125b_mac_bps[i].val);
   2553 		}
   2554 	}
   2555 
   2556 	/* Disable PHY power saving. */
   2557 	if (sc->rge_type != MAC_CFG2_8126)
   2558 		rge_disable_phy_ocp_pwrsave(sc);
   2559 
   2560 	/* Set PCIe uncorrectable error status. */
   2561 	rge_write_csi(sc, 0x108,
   2562 	    rge_read_csi(sc, 0x108) | 0x00100000);
   2563 }
   2564 
   2565 void
   2566 rge_disable_phy_ocp_pwrsave(struct rge_softc *sc)
   2567 {
   2568 	if (rge_read_phy_ocp(sc, 0xc416) != 0x0500) {
   2569 		rge_patch_phy_mcu(sc, 1);
   2570 		rge_write_phy_ocp(sc, 0xc416, 0);
   2571 		rge_write_phy_ocp(sc, 0xc416, 0x0500);
   2572 		rge_patch_phy_mcu(sc, 0);
   2573 	}
   2574 }
   2575 
   2576 void
   2577 rge_patch_phy_mcu(struct rge_softc *sc, int set)
   2578 {
   2579 	int i;
   2580 
   2581 	if (set)
   2582 		RGE_PHY_SETBIT(sc, 0xb820, 0x0010);
   2583 	else
   2584 		RGE_PHY_CLRBIT(sc, 0xb820, 0x0010);
   2585 
   2586 	for (i = 0; i < 1000; i++) {
   2587 		if ((rge_read_phy_ocp(sc, 0xb800) & 0x0040) == 0x0040)
   2588 			break;
   2589 		DELAY(100);
   2590 	}
   2591 	if (i == 1000) {
   2592 		DPRINTF(("timeout waiting to patch phy mcu\n"));
   2593 		return;
   2594 	}
   2595 }
   2596 
   2597 void
   2598 rge_add_media_types(struct rge_softc *sc)
   2599 {
   2600 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_10_T, 0, NULL);
   2601 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_10_T | IFM_FDX, 0, NULL);
   2602 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_100_TX, 0, NULL);
   2603 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_100_TX | IFM_FDX, 0, NULL);
   2604 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_1000_T, 0, NULL);
   2605 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
   2606 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_2500_T, 0, NULL);
   2607 	ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_2500_T | IFM_FDX, 0, NULL);
   2608 
   2609 	if (sc->rge_type == MAC_CFG2_8126) {
   2610 		ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_5000_T, 0, NULL);
   2611 		ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_5000_T | IFM_FDX,
   2612 		    0, NULL);
   2613 	}
   2614 }
   2615 
   2616 void
   2617 rge_config_imtype(struct rge_softc *sc, int imtype)
   2618 {
   2619 	switch (imtype) {
   2620 	case RGE_IMTYPE_NONE:
   2621 		sc->rge_intrs = RGE_INTRS;
   2622 		sc->rge_rx_ack = RGE_ISR_RX_OK | RGE_ISR_RX_DESC_UNAVAIL |
   2623 		    RGE_ISR_RX_FIFO_OFLOW;
   2624 		sc->rge_tx_ack = RGE_ISR_TX_OK;
   2625 		break;
   2626 	case RGE_IMTYPE_SIM:
   2627 		sc->rge_intrs = RGE_INTRS_TIMER;
   2628 		sc->rge_rx_ack = RGE_ISR_PCS_TIMEOUT;
   2629 		sc->rge_tx_ack = RGE_ISR_PCS_TIMEOUT;
   2630 		break;
   2631 	default:
   2632 		panic("%s: unknown imtype %d", device_xname(sc->sc_dev), imtype);
   2633 	}
   2634 }
   2635 
   2636 void
   2637 rge_disable_hw_im(struct rge_softc *sc)
   2638 {
   2639 	RGE_WRITE_2(sc, RGE_IM, 0);
   2640 }
   2641 
   2642 void
   2643 rge_disable_sim_im(struct rge_softc *sc)
   2644 {
   2645 	RGE_WRITE_4(sc, RGE_TIMERINT0, 0);
   2646 	sc->rge_timerintr = 0;
   2647 }
   2648 
   2649 void
   2650 rge_setup_sim_im(struct rge_softc *sc)
   2651 {
   2652 	RGE_WRITE_4(sc, RGE_TIMERINT0, 0x2600);
   2653 	RGE_WRITE_4(sc, RGE_TIMERCNT, 1);
   2654 	sc->rge_timerintr = 1;
   2655 }
   2656 
   2657 void
   2658 rge_setup_intr(struct rge_softc *sc, int imtype)
   2659 {
   2660 	rge_config_imtype(sc, imtype);
   2661 
   2662 	/* Enable interrupts. */
   2663 	RGE_WRITE_4(sc, RGE_IMR, sc->rge_intrs);
   2664 
   2665 	switch (imtype) {
   2666 	case RGE_IMTYPE_NONE:
   2667 		rge_disable_sim_im(sc);
   2668 		rge_disable_hw_im(sc);
   2669 		break;
   2670 	case RGE_IMTYPE_SIM:
   2671 		rge_disable_hw_im(sc);
   2672 		rge_setup_sim_im(sc);
   2673 		break;
   2674 	default:
   2675 		panic("%s: unknown imtype %d", device_xname(sc->sc_dev), imtype);
   2676 	}
   2677 }
   2678 
   2679 void
   2680 rge_exit_oob(struct rge_softc *sc)
   2681 {
   2682 	int i;
   2683 
   2684 	RGE_CLRBIT_4(sc, RGE_RXCFG, RGE_RXCFG_ALLPHYS | RGE_RXCFG_INDIV |
   2685 	    RGE_RXCFG_MULTI | RGE_RXCFG_BROAD | RGE_RXCFG_RUNT |
   2686 	    RGE_RXCFG_ERRPKT);
   2687 
   2688 	/* Disable RealWoW. */
   2689 	rge_write_mac_ocp(sc, 0xc0bc, 0x00ff);
   2690 
   2691 	rge_reset(sc);
   2692 
   2693 	/* Disable OOB. */
   2694 	RGE_CLRBIT_1(sc, RGE_MCUCMD, RGE_MCUCMD_IS_OOB);
   2695 
   2696 	RGE_MAC_CLRBIT(sc, 0xe8de, 0x4000);
   2697 
   2698 	for (i = 0; i < 10; i++) {
   2699 		DELAY(100);
   2700 		if (RGE_READ_2(sc, RGE_TWICMD) & 0x0200)
   2701 			break;
   2702 	}
   2703 
   2704 	rge_write_mac_ocp(sc, 0xc0aa, 0x07d0);
   2705 	rge_write_mac_ocp(sc, 0xc0a6, 0x01b5);
   2706 	rge_write_mac_ocp(sc, 0xc01e, 0x5555);
   2707 
   2708 	for (i = 0; i < 10; i++) {
   2709 		DELAY(100);
   2710 		if (RGE_READ_2(sc, RGE_TWICMD) & 0x0200)
   2711 			break;
   2712 	}
   2713 
   2714 	if (rge_read_mac_ocp(sc, 0xd42c) & 0x0100) {
   2715 		printf("%s: rge_exit_oob(): rtl8125_is_ups_resume!!\n",
   2716 		    device_xname(sc->sc_dev));
   2717 		for (i = 0; i < RGE_TIMEOUT; i++) {
   2718 			if ((rge_read_phy_ocp(sc, 0xa420) & 0x0007) == 2)
   2719 				break;
   2720 			DELAY(1000);
   2721 		}
   2722 		RGE_MAC_CLRBIT(sc, 0xd408, 0x0100);
   2723 		if (sc->rge_type == MAC_CFG4 || sc->rge_type == MAC_CFG5)
   2724 			RGE_PHY_CLRBIT(sc, 0xa466, 0x0001);
   2725 		RGE_PHY_CLRBIT(sc, 0xa468, 0x000a);
   2726 	}
   2727 }
   2728 
   2729 void
   2730 rge_write_csi(struct rge_softc *sc, uint32_t reg, uint32_t val)
   2731 {
   2732 	int i;
   2733 
   2734 	RGE_WRITE_4(sc, RGE_CSIDR, val);
   2735 	RGE_WRITE_4(sc, RGE_CSIAR, (reg & RGE_CSIAR_ADDR_MASK) |
   2736 	    (RGE_CSIAR_BYTE_EN << RGE_CSIAR_BYTE_EN_SHIFT) | RGE_CSIAR_BUSY);
   2737 
   2738 	for (i = 0; i < 10; i++) {
   2739 		 DELAY(100);
   2740 		 if (!(RGE_READ_4(sc, RGE_CSIAR) & RGE_CSIAR_BUSY))
   2741 			break;
   2742 	}
   2743 
   2744 	DELAY(20);
   2745 }
   2746 
   2747 uint32_t
   2748 rge_read_csi(struct rge_softc *sc, uint32_t reg)
   2749 {
   2750 	int i;
   2751 
   2752 	RGE_WRITE_4(sc, RGE_CSIAR, (reg & RGE_CSIAR_ADDR_MASK) |
   2753 	    (RGE_CSIAR_BYTE_EN << RGE_CSIAR_BYTE_EN_SHIFT));
   2754 
   2755 	for (i = 0; i < 10; i++) {
   2756 		 DELAY(100);
   2757 		 if (RGE_READ_4(sc, RGE_CSIAR) & RGE_CSIAR_BUSY)
   2758 			break;
   2759 	}
   2760 
   2761 	DELAY(20);
   2762 
   2763 	return (RGE_READ_4(sc, RGE_CSIDR));
   2764 }
   2765 
   2766 void
   2767 rge_write_mac_ocp(struct rge_softc *sc, uint16_t reg, uint16_t val)
   2768 {
   2769 	uint32_t tmp;
   2770 
   2771 	tmp = (reg >> 1) << RGE_MACOCP_ADDR_SHIFT;
   2772 	tmp += val;
   2773 	tmp |= RGE_MACOCP_BUSY;
   2774 	RGE_WRITE_4(sc, RGE_MACOCP, tmp);
   2775 }
   2776 
   2777 uint16_t
   2778 rge_read_mac_ocp(struct rge_softc *sc, uint16_t reg)
   2779 {
   2780 	uint32_t val;
   2781 
   2782 	val = (reg >> 1) << RGE_MACOCP_ADDR_SHIFT;
   2783 	RGE_WRITE_4(sc, RGE_MACOCP, val);
   2784 
   2785 	return (RGE_READ_4(sc, RGE_MACOCP) & RGE_MACOCP_DATA_MASK);
   2786 }
   2787 
   2788 void
   2789 rge_write_ephy(struct rge_softc *sc, uint16_t reg, uint16_t val)
   2790 {
   2791 	uint32_t tmp;
   2792 	int i;
   2793 
   2794 	tmp = (reg & RGE_EPHYAR_ADDR_MASK) << RGE_EPHYAR_ADDR_SHIFT;
   2795 	tmp |= RGE_EPHYAR_BUSY | (val & RGE_EPHYAR_DATA_MASK);
   2796 	RGE_WRITE_4(sc, RGE_EPHYAR, tmp);
   2797 
   2798 	for (i = 0; i < 10; i++) {
   2799 		DELAY(100);
   2800 		if (!(RGE_READ_4(sc, RGE_EPHYAR) & RGE_EPHYAR_BUSY))
   2801 			break;
   2802 	}
   2803 
   2804 	DELAY(20);
   2805 }
   2806 
   2807 uint16_t
   2808 rge_read_ephy(struct rge_softc *sc, uint16_t reg)
   2809 {
   2810 	uint32_t val;
   2811 	int i;
   2812 
   2813 	val = (reg & RGE_EPHYAR_ADDR_MASK) << RGE_EPHYAR_ADDR_SHIFT;
   2814 	RGE_WRITE_4(sc, RGE_EPHYAR, val);
   2815 
   2816 	for (i = 0; i < 10; i++) {
   2817 		DELAY(100);
   2818 		val = RGE_READ_4(sc, RGE_EPHYAR);
   2819 		if (val & RGE_EPHYAR_BUSY)
   2820 			break;
   2821 	}
   2822 
   2823 	DELAY(20);
   2824 
   2825 	return (val & RGE_EPHYAR_DATA_MASK);
   2826 }
   2827 
   2828 void
   2829 rge_write_phy(struct rge_softc *sc, uint16_t addr, uint16_t reg, uint16_t val)
   2830 {
   2831 	uint16_t off, phyaddr;
   2832 
   2833 	phyaddr = addr ? addr : RGE_PHYBASE + (reg / 8);
   2834 	phyaddr <<= 4;
   2835 
   2836 	off = addr ? reg : 0x10 + (reg % 8);
   2837 
   2838 	phyaddr += (off - 16) << 1;
   2839 
   2840 	rge_write_phy_ocp(sc, phyaddr, val);
   2841 }
   2842 
   2843 uint16_t
   2844 rge_read_phy(struct rge_softc *sc, uint16_t addr, uint16_t reg)
   2845 {
   2846 	uint16_t off, phyaddr;
   2847 
   2848 	phyaddr = addr ? addr : RGE_PHYBASE + (reg / 8);
   2849 	phyaddr <<= 4;
   2850 
   2851 	off = addr ? reg : 0x10 + (reg % 8);
   2852 
   2853 	phyaddr += (off - 16) << 1;
   2854 
   2855 	return (rge_read_phy_ocp(sc, phyaddr));
   2856 }
   2857 
   2858 void
   2859 rge_write_phy_ocp(struct rge_softc *sc, uint16_t reg, uint16_t val)
   2860 {
   2861 	uint32_t tmp;
   2862 	int i;
   2863 
   2864 	tmp = (reg >> 1) << RGE_PHYOCP_ADDR_SHIFT;
   2865 	tmp |= RGE_PHYOCP_BUSY | val;
   2866 	RGE_WRITE_4(sc, RGE_PHYOCP, tmp);
   2867 
   2868 	for (i = 0; i < RGE_TIMEOUT; i++) {
   2869 		DELAY(1);
   2870 		if (!(RGE_READ_4(sc, RGE_PHYOCP) & RGE_PHYOCP_BUSY))
   2871 			break;
   2872 	}
   2873 }
   2874 
   2875 uint16_t
   2876 rge_read_phy_ocp(struct rge_softc *sc, uint16_t reg)
   2877 {
   2878 	uint32_t val;
   2879 	int i;
   2880 
   2881 	val = (reg >> 1) << RGE_PHYOCP_ADDR_SHIFT;
   2882 	RGE_WRITE_4(sc, RGE_PHYOCP, val);
   2883 
   2884 	for (i = 0; i < RGE_TIMEOUT; i++) {
   2885 		DELAY(1);
   2886 		val = RGE_READ_4(sc, RGE_PHYOCP);
   2887 		if (val & RGE_PHYOCP_BUSY)
   2888 			break;
   2889 	}
   2890 
   2891 	return (val & RGE_PHYOCP_DATA_MASK);
   2892 }
   2893 
   2894 int
   2895 rge_get_link_status(struct rge_softc *sc)
   2896 {
   2897 	return ((RGE_READ_2(sc, RGE_PHYSTAT) & RGE_PHYSTAT_LINK) ? 1 : 0);
   2898 }
   2899 
   2900 void
   2901 rge_txstart(void *arg)
   2902 {
   2903 	struct rge_softc *sc = arg;
   2904 
   2905 	RGE_WRITE_2(sc, RGE_TXSTART, RGE_TXSTART_START);
   2906 }
   2907 
   2908 void
   2909 rge_tick(void *arg)
   2910 {
   2911 	struct rge_softc *sc = arg;
   2912 	int s;
   2913 
   2914 	s = splnet();
   2915 	rge_link_state(sc);
   2916 	splx(s);
   2917 
   2918 	callout_schedule(&sc->sc_timeout, hz);
   2919 }
   2920 
   2921 void
   2922 rge_link_state(struct rge_softc *sc)
   2923 {
   2924 	struct ifnet *ifp = &sc->sc_ec.ec_if;
   2925 	int link = LINK_STATE_DOWN;
   2926 
   2927 	if (rge_get_link_status(sc))
   2928 		link = LINK_STATE_UP;
   2929 
   2930 	if (ifp->if_link_state != link) { /* XXX not safe to access */
   2931 		if_link_state_change(ifp, link);
   2932 	}
   2933 }
   2934 
   2935 /* Module interface */
   2936 
   2937 MODULE(MODULE_CLASS_DRIVER, if_rge, "pci");
   2938 
   2939 #ifdef _MODULE
   2940 #include "ioconf.c"
   2941 #endif
   2942 
   2943 static int
   2944 if_rge_modcmd(modcmd_t cmd, void *opaque)
   2945 {
   2946 	int error = 0;
   2947 
   2948 	switch (cmd) {
   2949 	case MODULE_CMD_INIT:
   2950 #ifdef _MODULE
   2951 		error = config_init_component(cfdriver_ioconf_rge,
   2952 		    cfattach_ioconf_rge, cfdata_ioconf_rge);
   2953 #endif
   2954 		return error;
   2955 	case MODULE_CMD_FINI:
   2956 #ifdef _MODULE
   2957 		error = config_fini_component(cfdriver_ioconf_rge,
   2958 		    cfattach_ioconf_rge, cfdata_ioconf_rge);
   2959 #endif
   2960 		return error;
   2961 	default:
   2962 		return ENOTTY;
   2963 	}
   2964 }
   2965