Deleted Added
full compact
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 ---