| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: if_de.c,v 1.159 2019/04/24 08:54:35 msaitoh Exp $ */ | | 1 | /* $NetBSD: if_de.c,v 1.160 2019/05/21 09:58:15 msaitoh Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com) | | 4 | * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com) |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * Redistribution and use in source and binary forms, with or without | | 7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | | 8 | * modification, are permitted provided that the following conditions |
9 | * are met: | | 9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright | | 10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. | | 11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. The name of the author may not be used to endorse or promote products | | 12 | * 2. The name of the author may not be used to endorse or promote products |
13 | * derived from this software without specific prior written permission | | 13 | * derived from this software without specific prior written permission |
14 | * | | 14 | * |
| @@ -27,27 +27,27 @@ | | | @@ -27,27 +27,27 @@ |
27 | * | | 27 | * |
28 | */ | | 28 | */ |
29 | | | 29 | |
30 | /* | | 30 | /* |
31 | * DEC 21040 PCI Ethernet Controller | | 31 | * DEC 21040 PCI Ethernet Controller |
32 | * | | 32 | * |
33 | * Written by Matt Thomas | | 33 | * Written by Matt Thomas |
34 | * BPF support code stolen directly from if_ec.c | | 34 | * BPF support code stolen directly from if_ec.c |
35 | * | | 35 | * |
36 | * This driver supports the DEC DE435 or any other PCI | | 36 | * This driver supports the DEC DE435 or any other PCI |
37 | * board which support 21040, 21041, or 21140 (mostly). | | 37 | * board which support 21040, 21041, or 21140 (mostly). |
38 | */ | | 38 | */ |
39 | #include <sys/cdefs.h> | | 39 | #include <sys/cdefs.h> |
40 | __KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.159 2019/04/24 08:54:35 msaitoh Exp $"); | | 40 | __KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.160 2019/05/21 09:58:15 msaitoh Exp $"); |
41 | | | 41 | |
42 | #define TULIP_HDR_DATA | | 42 | #define TULIP_HDR_DATA |
43 | | | 43 | |
44 | #ifdef __NetBSD__ | | 44 | #ifdef __NetBSD__ |
45 | #include "opt_inet.h" | | 45 | #include "opt_inet.h" |
46 | #endif | | 46 | #endif |
47 | | | 47 | |
48 | #include <sys/param.h> | | 48 | #include <sys/param.h> |
49 | #include <sys/systm.h> | | 49 | #include <sys/systm.h> |
50 | #include <sys/callout.h> | | 50 | #include <sys/callout.h> |
51 | #include <sys/mbuf.h> | | 51 | #include <sys/mbuf.h> |
52 | #include <sys/protosw.h> | | 52 | #include <sys/protosw.h> |
53 | #include <sys/socket.h> | | 53 | #include <sys/socket.h> |
| @@ -176,31 +176,29 @@ static ifnet_ret_t tulip_ifstart_one(str | | | @@ -176,31 +176,29 @@ static ifnet_ret_t tulip_ifstart_one(str |
176 | static ifnet_ret_t tulip_ifstart(struct ifnet *ifp); | | 176 | static ifnet_ret_t tulip_ifstart(struct ifnet *ifp); |
177 | static struct mbuf *tulip_txput(tulip_softc_t * const sc, struct mbuf *m); | | 177 | static struct mbuf *tulip_txput(tulip_softc_t * const sc, struct mbuf *m); |
178 | static void tulip_txput_setup(tulip_softc_t * const sc); | | 178 | static void tulip_txput_setup(tulip_softc_t * const sc); |
179 | static void tulip_rx_intr(tulip_softc_t * const sc); | | 179 | static void tulip_rx_intr(tulip_softc_t * const sc); |
180 | static void tulip_addr_filter(tulip_softc_t * const sc); | | 180 | static void tulip_addr_filter(tulip_softc_t * const sc); |
181 | static unsigned tulip_mii_readreg(tulip_softc_t * const sc, unsigned devaddr, | | 181 | static unsigned tulip_mii_readreg(tulip_softc_t * const sc, unsigned devaddr, |
182 | unsigned regno); | | 182 | unsigned regno); |
183 | static void tulip_mii_writereg(tulip_softc_t * const sc, unsigned devaddr, | | 183 | static void tulip_mii_writereg(tulip_softc_t * const sc, unsigned devaddr, |
184 | unsigned regno, unsigned data); | | 184 | unsigned regno, unsigned data); |
185 | static int tulip_mii_map_abilities(tulip_softc_t * const sc, | | 185 | static int tulip_mii_map_abilities(tulip_softc_t * const sc, |
186 | unsigned abilities); | | 186 | unsigned abilities); |
187 | static tulip_media_t tulip_mii_phy_readspecific(tulip_softc_t * const sc); | | 187 | static tulip_media_t tulip_mii_phy_readspecific(tulip_softc_t * const sc); |
188 | static int tulip_srom_decode(tulip_softc_t * const sc); | | 188 | static int tulip_srom_decode(tulip_softc_t * const sc); |
189 | #if defined(IFM_ETHER) | | | |
190 | static int tulip_ifmedia_change(struct ifnet * const ifp); | | 189 | static int tulip_ifmedia_change(struct ifnet * const ifp); |
191 | static void tulip_ifmedia_status(struct ifnet * const ifp, | | 190 | static void tulip_ifmedia_status(struct ifnet * const ifp, |
192 | struct ifmediareq *req); | | 191 | struct ifmediareq *req); |
193 | #endif | | | |
194 | /* static void tulip_21140_map_media(tulip_softc_t *sc); */ | | 192 | /* static void tulip_21140_map_media(tulip_softc_t *sc); */ |
195 | | | 193 | |
196 | | | 194 | |
197 | static bus_dmamap_t | | 195 | static bus_dmamap_t |
198 | tulip_alloc_rxmap(tulip_softc_t *sc) | | 196 | tulip_alloc_rxmap(tulip_softc_t *sc) |
199 | { | | 197 | { |
200 | return (sc->tulip_free_rxmaps[--sc->tulip_num_free_rxmaps]); | | 198 | return (sc->tulip_free_rxmaps[--sc->tulip_num_free_rxmaps]); |
201 | } | | 199 | } |
202 | | | 200 | |
203 | static void | | 201 | static void |
204 | tulip_free_rxmap(tulip_softc_t *sc, bus_dmamap_t map) | | 202 | tulip_free_rxmap(tulip_softc_t *sc, bus_dmamap_t map) |
205 | { | | 203 | { |
206 | sc->tulip_free_rxmaps[sc->tulip_num_free_rxmaps++] = map; | | 204 | sc->tulip_free_rxmaps[sc->tulip_num_free_rxmaps++] = map; |
| @@ -1479,26 +1477,27 @@ tulip_mii_map_abilities(tulip_softc_t * | | | @@ -1479,26 +1477,27 @@ tulip_mii_map_abilities(tulip_softc_t * |
1479 | static void | | 1477 | static void |
1480 | tulip_mii_autonegotiate(tulip_softc_t * const sc, const unsigned phyaddr) | | 1478 | tulip_mii_autonegotiate(tulip_softc_t * const sc, const unsigned phyaddr) |
1481 | { | | 1479 | { |
1482 | switch (sc->tulip_probe_state) { | | 1480 | switch (sc->tulip_probe_state) { |
1483 | case TULIP_PROBE_MEDIATEST: | | 1481 | case TULIP_PROBE_MEDIATEST: |
1484 | case TULIP_PROBE_INACTIVE: | | 1482 | case TULIP_PROBE_INACTIVE: |
1485 | sc->tulip_flags |= TULIP_DIDNWAY; | | 1483 | sc->tulip_flags |= TULIP_DIDNWAY; |
1486 | tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, PHYCTL_RESET); | | 1484 | tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, PHYCTL_RESET); |
1487 | sc->tulip_probe_timeout = 3000; | | 1485 | sc->tulip_probe_timeout = 3000; |
1488 | sc->tulip_intrmask |= TULIP_STS_ABNRMLINTR|TULIP_STS_NORMALINTR; | | 1486 | sc->tulip_intrmask |= TULIP_STS_ABNRMLINTR|TULIP_STS_NORMALINTR; |
1489 | sc->tulip_probe_state = TULIP_PROBE_PHYRESET; | | 1487 | sc->tulip_probe_state = TULIP_PROBE_PHYRESET; |
1490 | /* FALL THROUGH */ | | 1488 | /* FALL THROUGH */ |
1491 | case TULIP_PROBE_PHYRESET: | | 1489 | case TULIP_PROBE_PHYRESET: |
| | | 1490 | { |
1492 | uint32_t status; | | 1491 | uint32_t status; |
1493 | uint32_t data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL); | | 1492 | uint32_t data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL); |
1494 | if (data & PHYCTL_RESET) { | | 1493 | if (data & PHYCTL_RESET) { |
1495 | if (sc->tulip_probe_timeout > 0) { | | 1494 | if (sc->tulip_probe_timeout > 0) { |
1496 | tulip_timeout(sc); | | 1495 | tulip_timeout(sc); |
1497 | return; | | 1496 | return; |
1498 | } | | 1497 | } |
1499 | printf(TULIP_PRINTF_FMT | | 1498 | printf(TULIP_PRINTF_FMT |
1500 | "(phy%d): error: reset of PHY never completed!\n", | | 1499 | "(phy%d): error: reset of PHY never completed!\n", |
1501 | TULIP_PRINTF_ARGS, phyaddr); | | 1500 | TULIP_PRINTF_ARGS, phyaddr); |
1502 | sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE; | | 1501 | sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE; |
1503 | sc->tulip_probe_state = TULIP_PROBE_FAILED; | | 1502 | sc->tulip_probe_state = TULIP_PROBE_FAILED; |
1504 | sc->tulip_if.if_flags &= ~(IFF_UP|IFF_RUNNING); | | 1503 | sc->tulip_if.if_flags &= ~(IFF_UP|IFF_RUNNING); |
| @@ -1525,28 +1524,30 @@ tulip_mii_autonegotiate(tulip_softc_t * | | | @@ -1525,28 +1524,30 @@ tulip_mii_autonegotiate(tulip_softc_t * |
1525 | loudprintf(TULIP_PRINTF_FMT "(phy%d): oops: " | | 1524 | loudprintf(TULIP_PRINTF_FMT "(phy%d): oops: " |
1526 | "enable autonegotiation failed: 0x%04x\n", | | 1525 | "enable autonegotiation failed: 0x%04x\n", |
1527 | TULIP_PRINTF_ARGS, phyaddr, data); | | 1526 | TULIP_PRINTF_ARGS, phyaddr, data); |
1528 | else | | 1527 | else |
1529 | loudprintf(TULIP_PRINTF_FMT "(phy%d): " | | 1528 | loudprintf(TULIP_PRINTF_FMT "(phy%d): " |
1530 | "autonegotiation restarted: 0x%04x (ad=0x%04x)\n", | | 1529 | "autonegotiation restarted: 0x%04x (ad=0x%04x)\n", |
1531 | TULIP_PRINTF_ARGS, phyaddr, data, | | 1530 | TULIP_PRINTF_ARGS, phyaddr, data, |
1532 | tulip_mii_readreg(sc, phyaddr, | | 1531 | tulip_mii_readreg(sc, phyaddr, |
1533 | PHYREG_AUTONEG_ADVERTISEMENT)); | | 1532 | PHYREG_AUTONEG_ADVERTISEMENT)); |
1534 | sc->tulip_dbg.dbg_nway_starts++; | | 1533 | sc->tulip_dbg.dbg_nway_starts++; |
1535 | #endif | | 1534 | #endif |
1536 | sc->tulip_probe_state = TULIP_PROBE_PHYAUTONEG; | | 1535 | sc->tulip_probe_state = TULIP_PROBE_PHYAUTONEG; |
1537 | sc->tulip_probe_timeout = 3000; | | 1536 | sc->tulip_probe_timeout = 3000; |
1538 | /* FALL THROUGH */ | | 1537 | } |
| | | 1538 | /* FALLTHROUGH */ |
1539 | case TULIP_PROBE_PHYAUTONEG: | | 1539 | case TULIP_PROBE_PHYAUTONEG: |
| | | 1540 | { |
1540 | uint32_t status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS) | | 1541 | uint32_t status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS) |
1541 | | tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); | | 1542 | | tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); |
1542 | uint32_t data; | | 1543 | uint32_t data; |
1543 | if ((status & PHYSTS_AUTONEG_DONE) == 0) { | | 1544 | if ((status & PHYSTS_AUTONEG_DONE) == 0) { |
1544 | if (sc->tulip_probe_timeout > 0) { | | 1545 | if (sc->tulip_probe_timeout > 0) { |
1545 | tulip_timeout(sc); | | 1546 | tulip_timeout(sc); |
1546 | return; | | 1547 | return; |
1547 | } | | 1548 | } |
1548 | #if defined(TULIP_DEBUG) | | 1549 | #if defined(TULIP_DEBUG) |
1549 | loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation" | | 1550 | loudprintf(TULIP_PRINTF_FMT "(phy%d): autonegotiation" |
1550 | " timeout: sts=0x%04x, ctl=0x%04x\n", | | 1551 | " timeout: sts=0x%04x, ctl=0x%04x\n", |
1551 | TULIP_PRINTF_ARGS, phyaddr, status, | | 1552 | TULIP_PRINTF_ARGS, phyaddr, status, |
1552 | tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL)); | | 1553 | tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL)); |
| @@ -1556,26 +1557,27 @@ tulip_mii_autonegotiate(tulip_softc_t * | | | @@ -1556,26 +1557,27 @@ tulip_mii_autonegotiate(tulip_softc_t * |
1556 | return; | | 1557 | return; |
1557 | } | | 1558 | } |
1558 | data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES) | | 1559 | data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES) |
1559 | | tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES); | | 1560 | | tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES); |
1560 | #if defined(TULIP_DEBUG) | | 1561 | #if defined(TULIP_DEBUG) |
1561 | loudprintf(TULIP_PRINTF_FMT "(phy%d): " | | 1562 | loudprintf(TULIP_PRINTF_FMT "(phy%d): " |
1562 | "autonegotiation complete: 0x%04x (sts=0x%04x)\n", | | 1563 | "autonegotiation complete: 0x%04x (sts=0x%04x)\n", |
1563 | TULIP_PRINTF_ARGS, phyaddr, data, status); | | 1564 | TULIP_PRINTF_ARGS, phyaddr, data, status); |
1564 | #endif | | 1565 | #endif |
1565 | data = (data << 6) & status; | | 1566 | data = (data << 6) & status; |
1566 | if (!tulip_mii_map_abilities(sc, data)) | | 1567 | if (!tulip_mii_map_abilities(sc, data)) |
1567 | sc->tulip_flags &= ~TULIP_DIDNWAY; | | 1568 | sc->tulip_flags &= ~TULIP_DIDNWAY; |
1568 | return; | | 1569 | return; |
| | | 1570 | } |
1569 | default: | | 1571 | default: |
1570 | #if defined(DIAGNOSTIC) | | 1572 | #if defined(DIAGNOSTIC) |
1571 | panic("tulip_media_poll: botch at line %d", __LINE__); | | 1573 | panic("tulip_media_poll: botch at line %d", __LINE__); |
1572 | #endif | | 1574 | #endif |
1573 | break; | | 1575 | break; |
1574 | } | | 1576 | } |
1575 | #if defined(TULIP_DEBUG) | | 1577 | #if defined(TULIP_DEBUG) |
1576 | loudprintf(TULIP_PRINTF_FMT | | 1578 | loudprintf(TULIP_PRINTF_FMT |
1577 | "(phy%d): autonegotiation failure: state = %d\n", | | 1579 | "(phy%d): autonegotiation failure: state = %d\n", |
1578 | TULIP_PRINTF_ARGS, phyaddr, sc->tulip_probe_state); | | 1580 | TULIP_PRINTF_ARGS, phyaddr, sc->tulip_probe_state); |
1579 | sc->tulip_dbg.dbg_nway_failures++; | | 1581 | sc->tulip_dbg.dbg_nway_failures++; |
1580 | #endif | | 1582 | #endif |
1581 | } | | 1583 | } |
| @@ -2477,27 +2479,27 @@ tulip_identify_compex_nic(tulip_softc_t | | | @@ -2477,27 +2479,27 @@ tulip_identify_compex_nic(tulip_softc_t |
2477 | root_unit--) { | | 2479 | root_unit--) { |
2478 | root_sc = TULIP_UNIT_TO_SOFTC(root_unit); | | 2480 | root_sc = TULIP_UNIT_TO_SOFTC(root_unit); |
2479 | if (root_sc == NULL | | 2481 | if (root_sc == NULL |
2480 | || !(root_sc->tulip_features & TULIP_HAVE_SLAVEDINTR)) | | 2482 | || !(root_sc->tulip_features & TULIP_HAVE_SLAVEDINTR)) |
2481 | break; | | 2483 | break; |
2482 | root_sc = NULL; | | 2484 | root_sc = NULL; |
2483 | } | | 2485 | } |
2484 | if (root_sc != NULL | | 2486 | if (root_sc != NULL |
2485 | && root_sc->tulip_chipid == sc->tulip_chipid | | 2487 | && root_sc->tulip_chipid == sc->tulip_chipid |
2486 | && root_sc->tulip_pci_busno == sc->tulip_pci_busno) { | | 2488 | && root_sc->tulip_pci_busno == sc->tulip_pci_busno) { |
2487 | sc->tulip_features |= TULIP_HAVE_SLAVEDINTR; | | 2489 | sc->tulip_features |= TULIP_HAVE_SLAVEDINTR; |
2488 | sc->tulip_slaves = root_sc->tulip_slaves; | | 2490 | sc->tulip_slaves = root_sc->tulip_slaves; |
2489 | root_sc->tulip_slaves = sc; | | 2491 | root_sc->tulip_slaves = sc; |
2490 | } else if(sc->tulip_features & TULIP_HAVE_SLAVEDINTR) { | | 2492 | } else if (sc->tulip_features & TULIP_HAVE_SLAVEDINTR) { |
2491 | printf("\nCannot find master device for de%d interrupts", | | 2493 | printf("\nCannot find master device for de%d interrupts", |
2492 | tulip_unit(sc)); | | 2494 | tulip_unit(sc)); |
2493 | } | | 2495 | } |
2494 | } else | | 2496 | } else |
2495 | strlcat(sc->tulip_boardid, "unknown ", | | 2497 | strlcat(sc->tulip_boardid, "unknown ", |
2496 | sizeof(sc->tulip_boardid)); | | 2498 | sizeof(sc->tulip_boardid)); |
2497 | /* sc->tulip_boardsw = &tulip_21140_eb_boardsw; */ | | 2499 | /* sc->tulip_boardsw = &tulip_21140_eb_boardsw; */ |
2498 | return; | | 2500 | return; |
2499 | } | | 2501 | } |
2500 | | | 2502 | |
2501 | static int | | 2503 | static int |
2502 | tulip_srom_decode(tulip_softc_t * const sc) | | 2504 | tulip_srom_decode(tulip_softc_t * const sc) |
2503 | { | | 2505 | { |
| @@ -2613,27 +2615,27 @@ tulip_srom_decode(tulip_softc_t * const | | | @@ -2613,27 +2615,27 @@ tulip_srom_decode(tulip_softc_t * const |
2613 | sc->tulip_gpinit = *dp++; | | 2615 | sc->tulip_gpinit = *dp++; |
2614 | blocks = *dp++; | | 2616 | blocks = *dp++; |
2615 | for (idx2 = 0; idx2 < blocks; idx2++) { | | 2617 | for (idx2 = 0; idx2 < blocks; idx2++) { |
2616 | const uint8_t *ep; | | 2618 | const uint8_t *ep; |
2617 | if ((*dp & 0x80) == 0) { | | 2619 | if ((*dp & 0x80) == 0) { |
2618 | length = 4; | | 2620 | length = 4; |
2619 | type = 0; | | 2621 | type = 0; |
2620 | } else { | | 2622 | } else { |
2621 | length = (*dp++ & 0x7f) - 1; | | 2623 | length = (*dp++ & 0x7f) - 1; |
2622 | type = *dp++ & 0x3f; | | 2624 | type = *dp++ & 0x3f; |
2623 | } | | 2625 | } |
2624 | ep = dp + length; | | 2626 | ep = dp + length; |
2625 | switch (type & 0x3f) { | | 2627 | switch (type & 0x3f) { |
2626 | case 0: /* 21140[A] GPR block */ | | 2628 | case 0: { /* 21140[A] GPR block */ |
2627 | tulip_media_t media; | | 2629 | tulip_media_t media; |
2628 | srom_media = (tulip_srom_media_t)(dp[0] & 0x3f); | | 2630 | srom_media = (tulip_srom_media_t)(dp[0] & 0x3f); |
2629 | for (idx3 = 0; tulip_srom_mediums[idx3].sm_type != TULIP_MEDIA_UNKNOWN; idx3++) { | | 2631 | for (idx3 = 0; tulip_srom_mediums[idx3].sm_type != TULIP_MEDIA_UNKNOWN; idx3++) { |
2630 | if (tulip_srom_mediums[idx3].sm_srom_type == srom_media) | | 2632 | if (tulip_srom_mediums[idx3].sm_srom_type == srom_media) |
2631 | break; | | 2633 | break; |
2632 | } | | 2634 | } |
2633 | media = tulip_srom_mediums[idx3].sm_type; | | 2635 | media = tulip_srom_mediums[idx3].sm_type; |
2634 | if (media == TULIP_MEDIA_UNKNOWN) | | 2636 | if (media == TULIP_MEDIA_UNKNOWN) |
2635 | break; | | 2637 | break; |
2636 | mi->mi_type = TULIP_MEDIAINFO_GPR; | | 2638 | mi->mi_type = TULIP_MEDIAINFO_GPR; |
2637 | sc->tulip_mediums[media] = mi; | | 2639 | sc->tulip_mediums[media] = mi; |
2638 | mi->mi_gpdata = dp[1]; | | 2640 | mi->mi_gpdata = dp[1]; |
2639 | if (media > gp_media && !TULIP_IS_MEDIA_FD(media)) { | | 2641 | if (media > gp_media && !TULIP_IS_MEDIA_FD(media)) { |
| @@ -2643,27 +2645,28 @@ tulip_srom_decode(tulip_softc_t * const | | | @@ -2643,27 +2645,28 @@ tulip_srom_decode(tulip_softc_t * const |
2643 | data = dp[2] + dp[3] * 256; | | 2645 | data = dp[2] + dp[3] * 256; |
2644 | mi->mi_cmdmode = TULIP_SROM_2114X_CMDBITS(data); | | 2646 | mi->mi_cmdmode = TULIP_SROM_2114X_CMDBITS(data); |
2645 | if (data & TULIP_SROM_2114X_NOINDICATOR) { | | 2647 | if (data & TULIP_SROM_2114X_NOINDICATOR) { |
2646 | mi->mi_actmask = 0; | | 2648 | mi->mi_actmask = 0; |
2647 | } else { | | 2649 | } else { |
2648 | #if 0 | | 2650 | #if 0 |
2649 | mi->mi_default = (data & TULIP_SROM_2114X_DEFAULT) != 0; | | 2651 | mi->mi_default = (data & TULIP_SROM_2114X_DEFAULT) != 0; |
2650 | #endif | | 2652 | #endif |
2651 | mi->mi_actmask = TULIP_SROM_2114X_BITPOS(data); | | 2653 | mi->mi_actmask = TULIP_SROM_2114X_BITPOS(data); |
2652 | mi->mi_actdata = (data & TULIP_SROM_2114X_POLARITY) ? 0 : mi->mi_actmask; | | 2654 | mi->mi_actdata = (data & TULIP_SROM_2114X_POLARITY) ? 0 : mi->mi_actmask; |
2653 | } | | 2655 | } |
2654 | mi++; | | 2656 | mi++; |
2655 | break; | | 2657 | break; |
2656 | case 1: /* 21140[A] MII block */ | | 2658 | } |
| | | 2659 | case 1: { /* 21140[A] MII block */ |
2657 | const unsigned phyno = *dp++; | | 2660 | const unsigned phyno = *dp++; |
2658 | mi->mi_type = TULIP_MEDIAINFO_MII; | | 2661 | mi->mi_type = TULIP_MEDIAINFO_MII; |
2659 | mi->mi_gpr_length = *dp++; | | 2662 | mi->mi_gpr_length = *dp++; |
2660 | mi->mi_gpr_offset = dp - sc->tulip_rombuf; | | 2663 | mi->mi_gpr_offset = dp - sc->tulip_rombuf; |
2661 | dp += mi->mi_gpr_length; | | 2664 | dp += mi->mi_gpr_length; |
2662 | mi->mi_reset_length = *dp++; | | 2665 | mi->mi_reset_length = *dp++; |
2663 | mi->mi_reset_offset = dp - sc->tulip_rombuf; | | 2666 | mi->mi_reset_offset = dp - sc->tulip_rombuf; |
2664 | dp += mi->mi_reset_length; | | 2667 | dp += mi->mi_reset_length; |
2665 | | | 2668 | |
2666 | /* | | 2669 | /* |
2667 | * Before we probe for a PHY, use the GPR | | 2670 | * Before we probe for a PHY, use the GPR |
2668 | * information to select it. If we don't, it | | 2671 | * information to select it. If we don't, it |
2669 | * may be inaccessible. | | 2672 | * may be inaccessible. |
| @@ -2701,27 +2704,28 @@ tulip_srom_decode(tulip_softc_t * const | | | @@ -2701,27 +2704,28 @@ tulip_srom_decode(tulip_softc_t * const |
2701 | mi->mi_capabilities = dp[0] + dp[1] * 256; dp += 2; | | 2704 | mi->mi_capabilities = dp[0] + dp[1] * 256; dp += 2; |
2702 | mi->mi_advertisement = dp[0] + dp[1] * 256; dp += 2; | | 2705 | mi->mi_advertisement = dp[0] + dp[1] * 256; dp += 2; |
2703 | mi->mi_full_duplex = dp[0] + dp[1] * 256; dp += 2; | | 2706 | mi->mi_full_duplex = dp[0] + dp[1] * 256; dp += 2; |
2704 | mi->mi_tx_threshold = dp[0] + dp[1] * 256; dp += 2; | | 2707 | mi->mi_tx_threshold = dp[0] + dp[1] * 256; dp += 2; |
2705 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD); | | 2708 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD); |
2706 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX); | | 2709 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX); |
2707 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4); | | 2710 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4); |
2708 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD); | | 2711 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD); |
2709 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET); | | 2712 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET); |
2710 | mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) | | | 2713 | mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) | |
2711 | tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH); | | 2714 | tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH); |
2712 | mi++; | | 2715 | mi++; |
2713 | break; | | 2716 | break; |
2714 | case 2: /* 2114[23] SIA block */ | | 2717 | } |
| | | 2718 | case 2: { /* 2114[23] SIA block */ |
2715 | tulip_media_t media; | | 2719 | tulip_media_t media; |
2716 | srom_media = (tulip_srom_media_t)(dp[0] & 0x3f); | | 2720 | srom_media = (tulip_srom_media_t)(dp[0] & 0x3f); |
2717 | for (idx3 = 0; tulip_srom_mediums[idx3].sm_type != TULIP_MEDIA_UNKNOWN; idx3++) { | | 2721 | for (idx3 = 0; tulip_srom_mediums[idx3].sm_type != TULIP_MEDIA_UNKNOWN; idx3++) { |
2718 | if (tulip_srom_mediums[idx3].sm_srom_type == srom_media) | | 2722 | if (tulip_srom_mediums[idx3].sm_srom_type == srom_media) |
2719 | break; | | 2723 | break; |
2720 | } | | 2724 | } |
2721 | media = tulip_srom_mediums[idx3].sm_type; | | 2725 | media = tulip_srom_mediums[idx3].sm_type; |
2722 | if (media == TULIP_MEDIA_UNKNOWN) | | 2726 | if (media == TULIP_MEDIA_UNKNOWN) |
2723 | break; | | 2727 | break; |
2724 | mi->mi_type = TULIP_MEDIAINFO_SIA; | | 2728 | mi->mi_type = TULIP_MEDIAINFO_SIA; |
2725 | sc->tulip_mediums[media] = mi; | | 2729 | sc->tulip_mediums[media] = mi; |
2726 | if (dp[0] & 0x40) { | | 2730 | if (dp[0] & 0x40) { |
2727 | mi->mi_sia_connectivity = dp[1] + dp[2] * 256; | | 2731 | mi->mi_sia_connectivity = dp[1] + dp[2] * 256; |
| @@ -2743,27 +2747,28 @@ tulip_srom_decode(tulip_softc_t * const | | | @@ -2743,27 +2747,28 @@ tulip_srom_decode(tulip_softc_t * const |
2743 | case TULIP_MEDIA_10BASET_FD: | | 2747 | case TULIP_MEDIA_10BASET_FD: |
2744 | TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, 10BASET_FD); | | 2748 | TULIP_MEDIAINFO_SIA_INIT(sc, mi, 21142, 10BASET_FD); |
2745 | sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL; | | 2749 | sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL; |
2746 | break; | | 2750 | break; |
2747 | default: | | 2751 | default: |
2748 | goto bad_media; | | 2752 | goto bad_media; |
2749 | } | | 2753 | } |
2750 | } | | 2754 | } |
2751 | mi->mi_sia_gp_control = (dp[1] + dp[2] * 256) << 16; | | 2755 | mi->mi_sia_gp_control = (dp[1] + dp[2] * 256) << 16; |
2752 | mi->mi_sia_gp_data = (dp[3] + dp[4] * 256) << 16; | | 2756 | mi->mi_sia_gp_data = (dp[3] + dp[4] * 256) << 16; |
2753 | mi++; | | 2757 | mi++; |
2754 | bad_media: | | 2758 | bad_media: |
2755 | break; | | 2759 | break; |
2756 | case 3: /* 2114[23] MII PHY block */ | | 2760 | } |
| | | 2761 | case 3: { /* 2114[23] MII PHY block */ |
2757 | const unsigned phyno = *dp++; | | 2762 | const unsigned phyno = *dp++; |
2758 | const uint8_t *dp0; | | 2763 | const uint8_t *dp0; |
2759 | mi->mi_type = TULIP_MEDIAINFO_MII; | | 2764 | mi->mi_type = TULIP_MEDIAINFO_MII; |
2760 | mi->mi_gpr_length = *dp++; | | 2765 | mi->mi_gpr_length = *dp++; |
2761 | mi->mi_gpr_offset = dp - sc->tulip_rombuf; | | 2766 | mi->mi_gpr_offset = dp - sc->tulip_rombuf; |
2762 | dp += 2 * mi->mi_gpr_length; | | 2767 | dp += 2 * mi->mi_gpr_length; |
2763 | mi->mi_reset_length = *dp++; | | 2768 | mi->mi_reset_length = *dp++; |
2764 | mi->mi_reset_offset = dp - sc->tulip_rombuf; | | 2769 | mi->mi_reset_offset = dp - sc->tulip_rombuf; |
2765 | dp += 2 * mi->mi_reset_length; | | 2770 | dp += 2 * mi->mi_reset_length; |
2766 | | | 2771 | |
2767 | dp0 = &sc->tulip_rombuf[mi->mi_reset_offset]; | | 2772 | dp0 = &sc->tulip_rombuf[mi->mi_reset_offset]; |
2768 | for (idx3 = 0; idx3 < mi->mi_reset_length; idx3++, dp0 += 2) { | | 2773 | for (idx3 = 0; idx3 < mi->mi_reset_length; idx3++, dp0 += 2) { |
2769 | DELAY(10); | | 2774 | DELAY(10); |
| @@ -2797,63 +2802,66 @@ tulip_srom_decode(tulip_softc_t * const | | | @@ -2797,63 +2802,66 @@ tulip_srom_decode(tulip_softc_t * const |
2797 | mi->mi_advertisement = dp[0] + dp[1] * 256; dp += 2; | | 2802 | mi->mi_advertisement = dp[0] + dp[1] * 256; dp += 2; |
2798 | mi->mi_full_duplex = dp[0] + dp[1] * 256; dp += 2; | | 2803 | mi->mi_full_duplex = dp[0] + dp[1] * 256; dp += 2; |
2799 | mi->mi_tx_threshold = dp[0] + dp[1] * 256; dp += 2; | | 2804 | mi->mi_tx_threshold = dp[0] + dp[1] * 256; dp += 2; |
2800 | mi->mi_mii_interrupt = dp[0] + dp[1] * 256; dp += 2; | | 2805 | mi->mi_mii_interrupt = dp[0] + dp[1] * 256; dp += 2; |
2801 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD); | | 2806 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX_FD); |
2802 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX); | | 2807 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASETX); |
2803 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4); | | 2808 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 100BASET4); |
2804 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD); | | 2809 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET_FD); |
2805 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET); | | 2810 | TULIP_MEDIAINFO_ADD_CAPABILITY(sc, mi, 10BASET); |
2806 | mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) | | | 2811 | mi->mi_phyid = (tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDLOW) << 16) | |
2807 | tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH); | | 2812 | tulip_mii_readreg(sc, mi->mi_phyaddr, PHYREG_IDHIGH); |
2808 | mi++; | | 2813 | mi++; |
2809 | break; | | 2814 | break; |
2810 | case 4: /* 21143 SYM block */ | | 2815 | } |
| | | 2816 | case 4: { /* 21143 SYM block */ |
2811 | tulip_media_t media; | | 2817 | tulip_media_t media; |
2812 | srom_media = (tulip_srom_media_t) dp[0]; | | 2818 | srom_media = (tulip_srom_media_t) dp[0]; |
2813 | for (idx3 = 0; tulip_srom_mediums[idx3].sm_type != TULIP_MEDIA_UNKNOWN; idx3++) { | | 2819 | for (idx3 = 0; tulip_srom_mediums[idx3].sm_type != TULIP_MEDIA_UNKNOWN; idx3++) { |
2814 | if (tulip_srom_mediums[idx3].sm_srom_type == srom_media) | | 2820 | if (tulip_srom_mediums[idx3].sm_srom_type == srom_media) |
2815 | break; | | 2821 | break; |
2816 | } | | 2822 | } |
2817 | media = tulip_srom_mediums[idx3].sm_type; | | 2823 | media = tulip_srom_mediums[idx3].sm_type; |
2818 | if (media == TULIP_MEDIA_UNKNOWN) | | 2824 | if (media == TULIP_MEDIA_UNKNOWN) |
2819 | break; | | 2825 | break; |
2820 | mi->mi_type = TULIP_MEDIAINFO_SYM; | | 2826 | mi->mi_type = TULIP_MEDIAINFO_SYM; |
2821 | sc->tulip_mediums[media] = mi; | | 2827 | sc->tulip_mediums[media] = mi; |
2822 | mi->mi_gpcontrol = (dp[1] + dp[2] * 256) << 16; | | 2828 | mi->mi_gpcontrol = (dp[1] + dp[2] * 256) << 16; |
2823 | mi->mi_gpdata = (dp[3] + dp[4] * 256) << 16; | | 2829 | mi->mi_gpdata = (dp[3] + dp[4] * 256) << 16; |
2824 | data = dp[5] + dp[6] * 256; | | 2830 | data = dp[5] + dp[6] * 256; |
2825 | mi->mi_cmdmode = TULIP_SROM_2114X_CMDBITS(data); | | 2831 | mi->mi_cmdmode = TULIP_SROM_2114X_CMDBITS(data); |
2826 | if (data & TULIP_SROM_2114X_NOINDICATOR) | | 2832 | if (data & TULIP_SROM_2114X_NOINDICATOR) |
2827 | mi->mi_actmask = 0; | | 2833 | mi->mi_actmask = 0; |
2828 | else { | | 2834 | else { |
2829 | mi->mi_default = (data & TULIP_SROM_2114X_DEFAULT) != 0; | | 2835 | mi->mi_default = (data & TULIP_SROM_2114X_DEFAULT) != 0; |
2830 | mi->mi_actmask = TULIP_SROM_2114X_BITPOS(data); | | 2836 | mi->mi_actmask = TULIP_SROM_2114X_BITPOS(data); |
2831 | mi->mi_actdata = (data & TULIP_SROM_2114X_POLARITY) ? 0 : mi->mi_actmask; | | 2837 | mi->mi_actdata = (data & TULIP_SROM_2114X_POLARITY) ? 0 : mi->mi_actmask; |
2832 | } | | 2838 | } |
2833 | if (TULIP_IS_MEDIA_TP(media)) | | 2839 | if (TULIP_IS_MEDIA_TP(media)) |
2834 | sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL; | | 2840 | sc->tulip_intrmask |= TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL; |
2835 | mi++; | | 2841 | mi++; |
2836 | break; | | 2842 | break; |
| | | 2843 | } |
2837 | #if 0 | | 2844 | #if 0 |
2838 | case 5: /* 21143 Reset block */ | | 2845 | case 5: /* 21143 Reset block */ |
2839 | mi->mi_type = TULIP_MEDIAINFO_RESET; | | 2846 | mi->mi_type = TULIP_MEDIAINFO_RESET; |
2840 | mi->mi_reset_length = *dp++; | | 2847 | mi->mi_reset_length = *dp++; |
2841 | mi->mi_reset_offset = dp - sc->tulip_rombuf; | | 2848 | mi->mi_reset_offset = dp - sc->tulip_rombuf; |
2842 | dp += 2 * mi->mi_reset_length; | | 2849 | dp += 2 * mi->mi_reset_length; |
2843 | mi++; | | 2850 | mi++; |
2844 | break; | | 2851 | break; |
2845 | #endif | | 2852 | #endif |
2846 | default: | | 2853 | default: |
| | | 2854 | break; |
2847 | } | | 2855 | } |
2848 | dp = ep; | | 2856 | dp = ep; |
2849 | } | | 2857 | } |
2850 | } | | 2858 | } |
2851 | return mi - sc->tulip_mediainfo; | | 2859 | return mi - sc->tulip_mediainfo; |
2852 | } | | 2860 | } |
2853 | | | 2861 | |
2854 | static const struct { | | 2862 | static const struct { |
2855 | void (*vendor_identify_nic)(tulip_softc_t * const sc); | | 2863 | void (*vendor_identify_nic)(tulip_softc_t * const sc); |
2856 | unsigned char vendor_oui[3]; | | 2864 | unsigned char vendor_oui[3]; |
2857 | } tulip_vendors[] = { | | 2865 | } tulip_vendors[] = { |
2858 | { tulip_identify_dec_nic, { 0x08, 0x00, 0x2B } }, | | 2866 | { tulip_identify_dec_nic, { 0x08, 0x00, 0x2B } }, |
2859 | { tulip_identify_dec_nic, { 0x00, 0x00, 0xF8 } }, | | 2867 | { tulip_identify_dec_nic, { 0x00, 0x00, 0xF8 } }, |
| @@ -3082,27 +3090,26 @@ check_oui: | | | @@ -3082,27 +3090,26 @@ check_oui: |
3082 | */ | | 3090 | */ |
3083 | for (idx = 0; tulip_vendors[idx].vendor_identify_nic != NULL; idx++) { | | 3091 | for (idx = 0; tulip_vendors[idx].vendor_identify_nic != NULL; idx++) { |
3084 | if (memcmp((void *) sc->tulip_enaddr, | | 3092 | if (memcmp((void *) sc->tulip_enaddr, |
3085 | tulip_vendors[idx].vendor_oui, 3) == 0) { | | 3093 | tulip_vendors[idx].vendor_oui, 3) == 0) { |
3086 | (*tulip_vendors[idx].vendor_identify_nic)(sc); | | 3094 | (*tulip_vendors[idx].vendor_identify_nic)(sc); |
3087 | break; | | 3095 | break; |
3088 | } | | 3096 | } |
3089 | } | | 3097 | } |
3090 | | | 3098 | |
3091 | sc->tulip_features |= TULIP_HAVE_OKROM; | | 3099 | sc->tulip_features |= TULIP_HAVE_OKROM; |
3092 | return 0; | | 3100 | return 0; |
3093 | } | | 3101 | } |
3094 | | | 3102 | |
3095 | #if defined(IFM_ETHER) | | | |
3096 | static void | | 3103 | static void |
3097 | tulip_ifmedia_add(tulip_softc_t * const sc) | | 3104 | tulip_ifmedia_add(tulip_softc_t * const sc) |
3098 | { | | 3105 | { |
3099 | tulip_media_t media; | | 3106 | tulip_media_t media; |
3100 | int medias = 0; | | 3107 | int medias = 0; |
3101 | | | 3108 | |
3102 | for (media = TULIP_MEDIA_UNKNOWN; media < TULIP_MEDIA_MAX; media++) { | | 3109 | for (media = TULIP_MEDIA_UNKNOWN; media < TULIP_MEDIA_MAX; media++) { |
3103 | if (sc->tulip_mediums[media] != NULL) { | | 3110 | if (sc->tulip_mediums[media] != NULL) { |
3104 | ifmedia_add(&sc->tulip_ifmedia, tulip_media_to_ifmedia[media], | | 3111 | ifmedia_add(&sc->tulip_ifmedia, tulip_media_to_ifmedia[media], |
3105 | 0, 0); | | 3112 | 0, 0); |
3106 | medias++; | | 3113 | medias++; |
3107 | } | | 3114 | } |
3108 | } | | 3115 | } |
| @@ -3163,27 +3170,26 @@ tulip_ifmedia_status(struct ifnet * cons | | | @@ -3163,27 +3170,26 @@ tulip_ifmedia_status(struct ifnet * cons |
3163 | req->ifm_status = sc->tulip_mii.mii_media_status; | | 3170 | req->ifm_status = sc->tulip_mii.mii_media_status; |
3164 | return; | | 3171 | return; |
3165 | } | | 3172 | } |
3166 | #endif | | 3173 | #endif |
3167 | if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) | | 3174 | if (sc->tulip_media == TULIP_MEDIA_UNKNOWN) |
3168 | return; | | 3175 | return; |
3169 | | | 3176 | |
3170 | req->ifm_status = IFM_AVALID; | | 3177 | req->ifm_status = IFM_AVALID; |
3171 | if (sc->tulip_flags & TULIP_LINKUP) | | 3178 | if (sc->tulip_flags & TULIP_LINKUP) |
3172 | req->ifm_status |= IFM_ACTIVE; | | 3179 | req->ifm_status |= IFM_ACTIVE; |
3173 | | | 3180 | |
3174 | req->ifm_active = tulip_media_to_ifmedia[sc->tulip_media]; | | 3181 | req->ifm_active = tulip_media_to_ifmedia[sc->tulip_media]; |
3175 | } | | 3182 | } |
3176 | #endif | | | |
3177 | | | 3183 | |
3178 | static void | | 3184 | static void |
3179 | tulip_addr_filter(tulip_softc_t * const sc) | | 3185 | tulip_addr_filter(tulip_softc_t * const sc) |
3180 | { | | 3186 | { |
3181 | struct ether_multistep step; | | 3187 | struct ether_multistep step; |
3182 | struct ether_multi *enm; | | 3188 | struct ether_multi *enm; |
3183 | | | 3189 | |
3184 | sc->tulip_flags &= ~(TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY|TULIP_ALLMULTI); | | 3190 | sc->tulip_flags &= ~(TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY|TULIP_ALLMULTI); |
3185 | sc->tulip_flags |= TULIP_WANTSETUP|TULIP_WANTTXSTART; | | 3191 | sc->tulip_flags |= TULIP_WANTSETUP|TULIP_WANTTXSTART; |
3186 | sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN; | | 3192 | sc->tulip_cmdmode &= ~TULIP_CMD_RXRUN; |
3187 | sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED; | | 3193 | sc->tulip_intrmask &= ~TULIP_STS_RXSTOPPED; |
3188 | #if defined(IFF_ALLMULTI) | | 3194 | #if defined(IFF_ALLMULTI) |
3189 | sc->tulip_if.if_flags &= ~IFF_ALLMULTI; | | 3195 | sc->tulip_if.if_flags &= ~IFF_ALLMULTI; |
| @@ -4757,53 +4763,26 @@ tulip_ifioctl(struct ifnet *ifp, unsigne | | | @@ -4757,53 +4763,26 @@ tulip_ifioctl(struct ifnet *ifp, unsigne |
4757 | switch (ifa->ifa_addr->sa_family) { | | 4763 | switch (ifa->ifa_addr->sa_family) { |
4758 | #ifdef INET | | 4764 | #ifdef INET |
4759 | case AF_INET: | | 4765 | case AF_INET: |
4760 | TULIP_ARP_IFINIT(sc, ifa); | | 4766 | TULIP_ARP_IFINIT(sc, ifa); |
4761 | break; | | 4767 | break; |
4762 | #endif /* INET */ | | 4768 | #endif /* INET */ |
4763 | default: | | 4769 | default: |
4764 | break; | | 4770 | break; |
4765 | } | | 4771 | } |
4766 | break; | | 4772 | break; |
4767 | case SIOCSIFFLAGS: | | 4773 | case SIOCSIFFLAGS: |
4768 | if ((error = ifioctl_common(ifp, cmd, data)) != 0) | | 4774 | if ((error = ifioctl_common(ifp, cmd, data)) != 0) |
4769 | break; | | 4775 | break; |
4770 | #if !defined(IFM_ETHER) | | | |
4771 | int flags = 0; | | | |
4772 | if (ifp->if_flags & IFF_LINK0) flags |= 1; | | | |
4773 | if (ifp->if_flags & IFF_LINK1) flags |= 2; | | | |
4774 | if (ifp->if_flags & IFF_LINK2) flags |= 4; | | | |
4775 | if (flags == 7) { | | | |
4776 | ifp->if_flags &= ~(IFF_LINK0|IFF_LINK1|IFF_LINK2); | | | |
4777 | sc->tulip_media = TULIP_MEDIA_UNKNOWN; | | | |
4778 | sc->tulip_probe_state = TULIP_PROBE_INACTIVE; | | | |
4779 | sc->tulip_flags &= ~(TULIP_WANTRXACT|TULIP_LINKUP|TULIP_NOAUTOSENSE); | | | |
4780 | tulip_reset(sc); | | | |
4781 | } else if (flags) { | | | |
4782 | tulip_media_t media; | | | |
4783 | for (media = TULIP_MEDIA_UNKNOWN; media < TULIP_MEDIA_MAX; media++) { | | | |
4784 | if (sc->tulip_mediums[media] != NULL && --flags == 0) { | | | |
4785 | sc->tulip_flags |= TULIP_NOAUTOSENSE; | | | |
4786 | if (sc->tulip_media != media || (sc->tulip_flags & TULIP_DIDNWAY)) { | | | |
4787 | sc->tulip_flags &= ~TULIP_DIDNWAY; | | | |
4788 | tulip_linkup(sc, media); | | | |
4789 | } | | | |
4790 | break; | | | |
4791 | } | | | |
4792 | } | | | |
4793 | if (flags) | | | |
4794 | printf(TULIP_PRINTF_FMT ": ignored invalid media request\n", TULIP_PRINTF_ARGS); | | | |
4795 | } | | | |
4796 | #endif | | | |
4797 | tulip_init(sc); | | 4776 | tulip_init(sc); |
4798 | break; | | 4777 | break; |
4799 | case SIOCSIFMEDIA: | | 4778 | case SIOCSIFMEDIA: |
4800 | case SIOCGIFMEDIA: | | 4779 | case SIOCGIFMEDIA: |
4801 | error = ifmedia_ioctl(ifp, ifr, &sc->tulip_ifmedia, cmd); | | 4780 | error = ifmedia_ioctl(ifp, ifr, &sc->tulip_ifmedia, cmd); |
4802 | break; | | 4781 | break; |
4803 | | | 4782 | |
4804 | case SIOCADDMULTI: | | 4783 | case SIOCADDMULTI: |
4805 | case SIOCDELMULTI: | | 4784 | case SIOCDELMULTI: |
4806 | /* | | 4785 | /* |
4807 | * Update multicast listeners | | 4786 | * Update multicast listeners |
4808 | */ | | 4787 | */ |
4809 | if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { | | 4788 | if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { |
| @@ -5052,52 +5031,30 @@ tulip_attach(tulip_softc_t * const sc) | | | @@ -5052,52 +5031,30 @@ tulip_attach(tulip_softc_t * const sc) |
5052 | TULIP_EADDR_ARGS(sc->tulip_enaddr)); | | 5031 | TULIP_EADDR_ARGS(sc->tulip_enaddr)); |
5053 | #endif | | 5032 | #endif |
5054 | | | 5033 | |
5055 | #if defined(__alpha__) | | 5034 | #if defined(__alpha__) |
5056 | /* | | 5035 | /* |
5057 | * In case the SRM console told us about a bogus media, | | 5036 | * In case the SRM console told us about a bogus media, |
5058 | * we need to check to be safe. | | 5037 | * we need to check to be safe. |
5059 | */ | | 5038 | */ |
5060 | if (sc->tulip_mediums[sc->tulip_media] == NULL) | | 5039 | if (sc->tulip_mediums[sc->tulip_media] == NULL) |
5061 | sc->tulip_media = TULIP_MEDIA_UNKNOWN; | | 5040 | sc->tulip_media = TULIP_MEDIA_UNKNOWN; |
5062 | #endif | | 5041 | #endif |
5063 | | | 5042 | |
5064 | (*sc->tulip_boardsw->bd_media_probe)(sc); | | 5043 | (*sc->tulip_boardsw->bd_media_probe)(sc); |
5065 | #if defined(IFM_ETHER) | | | |
5066 | ifmedia_init(&sc->tulip_ifmedia, 0, | | 5044 | ifmedia_init(&sc->tulip_ifmedia, 0, |
5067 | tulip_ifmedia_change, | | 5045 | tulip_ifmedia_change, tulip_ifmedia_status); |
5068 | tulip_ifmedia_status); | | | |
5069 | #else | | | |
5070 | { | | | |
5071 | tulip_media_t media; | | | |
5072 | int cnt; | | | |
5073 | printf(TULIP_PRINTF_FMT ": media:", TULIP_PRINTF_ARGS); | | | |
5074 | for (media = TULIP_MEDIA_UNKNOWN, cnt = 1; cnt < 7 && media < TULIP_MEDIA_MAX; media++) { | | | |
5075 | if (sc->tulip_mediums[media] != NULL) { | | | |
5076 | printf(" %d=\"%s\"", cnt, tulip_mediums[media]); | | | |
5077 | cnt++; | | | |
5078 | } | | | |
5079 | } | | | |
5080 | if (cnt == 1) { | | | |
5081 | sc->tulip_features |= TULIP_HAVE_NOMEDIA; | | | |
5082 | printf(" none\n"); | | | |
5083 | } else | | | |
5084 | printf("\n"); | | | |
5085 | } | | | |
5086 | #endif | | | |
5087 | sc->tulip_flags &= ~TULIP_DEVICEPROBE; | | 5046 | sc->tulip_flags &= ~TULIP_DEVICEPROBE; |
5088 | #if defined(IFM_ETHER) | | | |
5089 | tulip_ifmedia_add(sc); | | 5047 | tulip_ifmedia_add(sc); |
5090 | #endif | | | |
5091 | | | 5048 | |
5092 | tulip_reset(sc); | | 5049 | tulip_reset(sc); |
5093 | | | 5050 | |
5094 | #if defined(__bsdi__) && _BSDI_VERSION >= 199510 | | 5051 | #if defined(__bsdi__) && _BSDI_VERSION >= 199510 |
5095 | sc->tulip_pf = printf; | | 5052 | sc->tulip_pf = printf; |
5096 | TULIP_ETHER_IFATTACH(sc); | | 5053 | TULIP_ETHER_IFATTACH(sc); |
5097 | #else | | 5054 | #else |
5098 | if_attach(ifp); | | 5055 | if_attach(ifp); |
5099 | if_deferred_start_init(ifp, NULL); | | 5056 | if_deferred_start_init(ifp, NULL); |
5100 | #if defined(__NetBSD__) || (defined(__FreeBSD__) && BSD >= 199506) | | 5057 | #if defined(__NetBSD__) || (defined(__FreeBSD__) && BSD >= 199506) |
5101 | TULIP_ETHER_IFATTACH(sc); | | 5058 | TULIP_ETHER_IFATTACH(sc); |
5102 | #endif | | 5059 | #endif |
5103 | #endif /* __bsdi__ */ | | 5060 | #endif /* __bsdi__ */ |