if_lge.c (195049) | if_lge.c (199560) |
---|---|
1/*- 2 * Copyright (c) 2001 Wind River Systems 3 * Copyright (c) 1997, 1998, 1999, 2000, 2001 4 * Bill Paul <william.paul@windriver.com>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2001 Wind River Systems 3 * Copyright (c) 1997, 1998, 1999, 2000, 2001 4 * Bill Paul <william.paul@windriver.com>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <sys/cdefs.h> |
35__FBSDID("$FreeBSD: head/sys/dev/lge/if_lge.c 195049 2009-06-26 11:45:06Z rwatson $"); | 35__FBSDID("$FreeBSD: head/sys/dev/lge/if_lge.c 199560 2009-11-19 22:14:23Z jhb $"); |
36 37/* 38 * Level 1 LXT1001 gigabit ethernet driver for FreeBSD. Public 39 * documentation not available, but ask me nicely. 40 * 41 * The Level 1 chip is used on some D-Link, SMC and Addtron NICs. 42 * It's a 64-bit PCI part that supports TCP/IP checksum offload, 43 * VLAN tagging/insertion, GMII and TBI (1000baseX) ports. There --- 88 unchanged lines hidden (view full) --- 132static void lge_intr(void *); 133static void lge_tick(void *); 134static void lge_start(struct ifnet *); 135static void lge_start_locked(struct ifnet *); 136static int lge_ioctl(struct ifnet *, u_long, caddr_t); 137static void lge_init(void *); 138static void lge_init_locked(struct lge_softc *); 139static void lge_stop(struct lge_softc *); | 36 37/* 38 * Level 1 LXT1001 gigabit ethernet driver for FreeBSD. Public 39 * documentation not available, but ask me nicely. 40 * 41 * The Level 1 chip is used on some D-Link, SMC and Addtron NICs. 42 * It's a 64-bit PCI part that supports TCP/IP checksum offload, 43 * VLAN tagging/insertion, GMII and TBI (1000baseX) ports. There --- 88 unchanged lines hidden (view full) --- 132static void lge_intr(void *); 133static void lge_tick(void *); 134static void lge_start(struct ifnet *); 135static void lge_start_locked(struct ifnet *); 136static int lge_ioctl(struct ifnet *, u_long, caddr_t); 137static void lge_init(void *); 138static void lge_init_locked(struct lge_softc *); 139static void lge_stop(struct lge_softc *); |
140static void lge_watchdog(struct ifnet *); | 140static void lge_watchdog(struct lge_softc *); |
141static int lge_shutdown(device_t); 142static int lge_ifmedia_upd(struct ifnet *); 143static void lge_ifmedia_upd_locked(struct ifnet *); 144static void lge_ifmedia_sts(struct ifnet *, struct ifmediareq *); 145 146static void lge_eeprom_getword(struct lge_softc *, int, u_int16_t *); 147static void lge_read_eeprom(struct lge_softc *, caddr_t, int, int, int); 148 --- 390 unchanged lines hidden (view full) --- 539 goto fail; 540 } 541 ifp->if_softc = sc; 542 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 543 ifp->if_mtu = ETHERMTU; 544 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 545 ifp->if_ioctl = lge_ioctl; 546 ifp->if_start = lge_start; | 141static int lge_shutdown(device_t); 142static int lge_ifmedia_upd(struct ifnet *); 143static void lge_ifmedia_upd_locked(struct ifnet *); 144static void lge_ifmedia_sts(struct ifnet *, struct ifmediareq *); 145 146static void lge_eeprom_getword(struct lge_softc *, int, u_int16_t *); 147static void lge_read_eeprom(struct lge_softc *, caddr_t, int, int, int); 148 --- 390 unchanged lines hidden (view full) --- 539 goto fail; 540 } 541 ifp->if_softc = sc; 542 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 543 ifp->if_mtu = ETHERMTU; 544 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 545 ifp->if_ioctl = lge_ioctl; 546 ifp->if_start = lge_start; |
547 ifp->if_watchdog = lge_watchdog; | |
548 ifp->if_init = lge_init; 549 ifp->if_snd.ifq_maxlen = LGE_TX_LIST_CNT - 1; 550 ifp->if_capabilities = IFCAP_RXCSUM; 551 ifp->if_capenable = ifp->if_capabilities; 552 553 if (CSR_READ_4(sc, LGE_GMIIMODE) & LGE_GMIIMODE_PCSENH) 554 sc->lge_pcs = 1; 555 else --- 439 unchanged lines hidden (view full) --- 995{ 996 struct lge_tx_desc *cur_tx = NULL; 997 struct ifnet *ifp; 998 u_int32_t idx, txdone; 999 1000 ifp = sc->lge_ifp; 1001 1002 /* Clear the timeout timer. */ | 547 ifp->if_init = lge_init; 548 ifp->if_snd.ifq_maxlen = LGE_TX_LIST_CNT - 1; 549 ifp->if_capabilities = IFCAP_RXCSUM; 550 ifp->if_capenable = ifp->if_capabilities; 551 552 if (CSR_READ_4(sc, LGE_GMIIMODE) & LGE_GMIIMODE_PCSENH) 553 sc->lge_pcs = 1; 554 else --- 439 unchanged lines hidden (view full) --- 994{ 995 struct lge_tx_desc *cur_tx = NULL; 996 struct ifnet *ifp; 997 u_int32_t idx, txdone; 998 999 ifp = sc->lge_ifp; 1000 1001 /* Clear the timeout timer. */ |
1003 ifp->if_timer = 0; | 1002 sc->lge_timer = 0; |
1004 1005 /* 1006 * Go through our tx list and free mbufs for those 1007 * frames that have been transmitted. 1008 */ 1009 idx = sc->lge_cdata.lge_tx_cons; 1010 txdone = CSR_READ_1(sc, LGE_TXDMADONE_8BIT); 1011 --- 4 unchanged lines hidden (view full) --- 1016 if (cur_tx->lge_mbuf != NULL) { 1017 m_freem(cur_tx->lge_mbuf); 1018 cur_tx->lge_mbuf = NULL; 1019 } 1020 cur_tx->lge_ctl = 0; 1021 1022 txdone--; 1023 LGE_INC(idx, LGE_TX_LIST_CNT); | 1003 1004 /* 1005 * Go through our tx list and free mbufs for those 1006 * frames that have been transmitted. 1007 */ 1008 idx = sc->lge_cdata.lge_tx_cons; 1009 txdone = CSR_READ_1(sc, LGE_TXDMADONE_8BIT); 1010 --- 4 unchanged lines hidden (view full) --- 1015 if (cur_tx->lge_mbuf != NULL) { 1016 m_freem(cur_tx->lge_mbuf); 1017 cur_tx->lge_mbuf = NULL; 1018 } 1019 cur_tx->lge_ctl = 0; 1020 1021 txdone--; 1022 LGE_INC(idx, LGE_TX_LIST_CNT); |
1024 ifp->if_timer = 0; | 1023 sc->lge_timer = 0; |
1025 } 1026 1027 sc->lge_cdata.lge_tx_cons = idx; 1028 1029 if (cur_tx != NULL) 1030 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1031 1032 return; --- 26 unchanged lines hidden (view full) --- 1059 (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX|| 1060 IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)) 1061 device_printf(sc->lge_dev, "gigabit link up\n"); 1062 if (ifp->if_snd.ifq_head != NULL) 1063 lge_start_locked(ifp); 1064 } 1065 } 1066 | 1024 } 1025 1026 sc->lge_cdata.lge_tx_cons = idx; 1027 1028 if (cur_tx != NULL) 1029 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1030 1031 return; --- 26 unchanged lines hidden (view full) --- 1058 (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX|| 1059 IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T)) 1060 device_printf(sc->lge_dev, "gigabit link up\n"); 1061 if (ifp->if_snd.ifq_head != NULL) 1062 lge_start_locked(ifp); 1063 } 1064 } 1065 |
1066 if (sc->lge_timer != 0 && --sc->lge_timer == 0) 1067 lge_watchdog(sc); |
|
1067 callout_reset(&sc->lge_stat_callout, hz, lge_tick, sc); 1068 1069 return; 1070} 1071 1072static void 1073lge_intr(arg) 1074 void *arg; --- 156 unchanged lines hidden (view full) --- 1231 BPF_MTAP(ifp, m_head); 1232 } 1233 1234 sc->lge_cdata.lge_tx_prod = idx; 1235 1236 /* 1237 * Set a timeout in case the chip goes out to lunch. 1238 */ | 1068 callout_reset(&sc->lge_stat_callout, hz, lge_tick, sc); 1069 1070 return; 1071} 1072 1073static void 1074lge_intr(arg) 1075 void *arg; --- 156 unchanged lines hidden (view full) --- 1232 BPF_MTAP(ifp, m_head); 1233 } 1234 1235 sc->lge_cdata.lge_tx_prod = idx; 1236 1237 /* 1238 * Set a timeout in case the chip goes out to lunch. 1239 */ |
1239 ifp->if_timer = 5; | 1240 sc->lge_timer = 5; |
1240 1241 return; 1242} 1243 1244static void 1245lge_init(xsc) 1246 void *xsc; 1247{ --- 253 unchanged lines hidden (view full) --- 1501 error = ether_ioctl(ifp, command, data); 1502 break; 1503 } 1504 1505 return(error); 1506} 1507 1508static void | 1241 1242 return; 1243} 1244 1245static void 1246lge_init(xsc) 1247 void *xsc; 1248{ --- 253 unchanged lines hidden (view full) --- 1502 error = ether_ioctl(ifp, command, data); 1503 break; 1504 } 1505 1506 return(error); 1507} 1508 1509static void |
1509lge_watchdog(ifp) 1510 struct ifnet *ifp; 1511{ | 1510lge_watchdog(sc) |
1512 struct lge_softc *sc; | 1511 struct lge_softc *sc; |
1512{ 1513 struct ifnet *ifp; |
|
1513 | 1514 |
1514 sc = ifp->if_softc; | 1515 LGE_LOCK_ASSERT(sc); 1516 ifp = sc->lge_ifp; |
1515 | 1517 |
1516 LGE_LOCK(sc); | |
1517 ifp->if_oerrors++; 1518 if_printf(ifp, "watchdog timeout\n"); 1519 1520 lge_stop(sc); 1521 lge_reset(sc); 1522 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 1523 lge_init_locked(sc); 1524 1525 if (ifp->if_snd.ifq_head != NULL) 1526 lge_start_locked(ifp); | 1518 ifp->if_oerrors++; 1519 if_printf(ifp, "watchdog timeout\n"); 1520 1521 lge_stop(sc); 1522 lge_reset(sc); 1523 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 1524 lge_init_locked(sc); 1525 1526 if (ifp->if_snd.ifq_head != NULL) 1527 lge_start_locked(ifp); |
1527 LGE_UNLOCK(sc); 1528 1529 return; | |
1530} 1531 1532/* 1533 * Stop the adapter and free any mbufs allocated to the 1534 * RX and TX lists. 1535 */ 1536static void 1537lge_stop(sc) 1538 struct lge_softc *sc; 1539{ 1540 register int i; 1541 struct ifnet *ifp; 1542 1543 LGE_LOCK_ASSERT(sc); 1544 ifp = sc->lge_ifp; | 1528} 1529 1530/* 1531 * Stop the adapter and free any mbufs allocated to the 1532 * RX and TX lists. 1533 */ 1534static void 1535lge_stop(sc) 1536 struct lge_softc *sc; 1537{ 1538 register int i; 1539 struct ifnet *ifp; 1540 1541 LGE_LOCK_ASSERT(sc); 1542 ifp = sc->lge_ifp; |
1545 ifp->if_timer = 0; | 1543 sc->lge_timer = 0; |
1546 callout_stop(&sc->lge_stat_callout); 1547 CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_INTR_ENB); 1548 1549 /* Disable receiver and transmitter. */ 1550 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_ENB|LGE_MODE1_TX_ENB); 1551 sc->lge_link = 0; 1552 1553 /* --- 48 unchanged lines hidden --- | 1544 callout_stop(&sc->lge_stat_callout); 1545 CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_INTR_ENB); 1546 1547 /* Disable receiver and transmitter. */ 1548 CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_RX_ENB|LGE_MODE1_TX_ENB); 1549 sc->lge_link = 0; 1550 1551 /* --- 48 unchanged lines hidden --- |