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