1/* 2 * Copyright (c) 1997, 1998, 1999 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 * |
32 * $Id: if_ti.c,v 1.114 1999/07/05 19:20:31 wpaul Exp $ |
33 */ 34 35/* 36 * Alteon Networks Tigon PCI gigabit ethernet driver for FreeBSD. 37 * Manuals, sample driver and firmware source kits are available 38 * from http://www.alteon.com/support/openkits. 39 * 40 * Written by Bill Paul <wpaul@ctr.columbia.edu> --- 68 unchanged lines hidden (view full) --- 109#include <netinet/in.h> 110#include <netinet/ip.h> 111 112#include <vm/vm.h> /* for vtophys */ 113#include <vm/pmap.h> /* for vtophys */ 114#include <machine/clock.h> /* for DELAY */ 115#include <machine/bus_memio.h> 116#include <machine/bus.h> |
117#include <machine/resource.h> 118#include <sys/bus.h> 119#include <sys/rman.h> |
120 121#include <pci/pcireg.h> 122#include <pci/pcivar.h> 123 124#include <pci/if_tireg.h> 125#include <pci/ti_fw.h> 126#include <pci/ti_fw2.h> 127 128#ifdef M_HWCKSUM 129/*#define TI_CSUM_OFFLOAD*/ 130#endif 131 132#if !defined(lint) 133static const char rcsid[] = |
134 "$Id: if_ti.c,v 1.114 1999/07/05 19:20:31 wpaul Exp $"; |
135#endif 136 137/* 138 * Various supported device vendors/types and their names. 139 */ 140 141static struct ti_type ti_devs[] = { 142 { ALT_VENDORID, ALT_DEVICEID_ACENIC, 143 "Alteon AceNIC Gigabit Ethernet" }, 144 { TC_VENDORID, TC_DEVICEID_3C985, 145 "3Com 3c985-SX Gigabit Ethernet" }, 146 { NG_VENDORID, NG_DEVICEID_GA620, 147 "Netgear GA620 Gigabit Ethernet" }, 148 { SGI_VENDORID, SGI_DEVICEID_TIGON, 149 "Silicon Graphics Gigabit Ethernet" }, 150 { 0, 0, NULL } 151}; 152 |
153static int ti_probe __P((device_t)); 154static int ti_attach __P((device_t)); 155static int ti_detach __P((device_t)); |
156static void ti_txeof __P((struct ti_softc *)); 157static void ti_rxeof __P((struct ti_softc *)); 158 159static void ti_stats_update __P((struct ti_softc *)); 160static int ti_encap __P((struct ti_softc *, struct mbuf *, 161 u_int32_t *)); 162 163static void ti_intr __P((void *)); 164static void ti_start __P((struct ifnet *)); 165static int ti_ioctl __P((struct ifnet *, u_long, caddr_t)); 166static void ti_init __P((void *)); 167static void ti_init2 __P((struct ti_softc *)); 168static void ti_stop __P((struct ti_softc *)); 169static void ti_watchdog __P((struct ifnet *)); |
170static void ti_shutdown __P((device_t)); |
171static int ti_ifmedia_upd __P((struct ifnet *)); 172static void ti_ifmedia_sts __P((struct ifnet *, struct ifmediareq *)); 173 174static u_int32_t ti_eeprom_putbyte __P((struct ti_softc *, int)); 175static u_int8_t ti_eeprom_getbyte __P((struct ti_softc *, 176 int, u_int8_t *)); 177static int ti_read_eeprom __P((struct ti_softc *, caddr_t, int, int)); 178 --- 23 unchanged lines hidden (view full) --- 202static void ti_free_rx_ring_mini __P((struct ti_softc *)); 203static void ti_free_tx_ring __P((struct ti_softc *)); 204static int ti_init_tx_ring __P((struct ti_softc *)); 205 206static int ti_64bitslot_war __P((struct ti_softc *)); 207static int ti_chipinit __P((struct ti_softc *)); 208static int ti_gibinit __P((struct ti_softc *)); 209 |
210static device_method_t ti_methods[] = { 211 /* Device interface */ 212 DEVMETHOD(device_probe, ti_probe), 213 DEVMETHOD(device_attach, ti_attach), 214 DEVMETHOD(device_detach, ti_detach), 215 DEVMETHOD(device_shutdown, ti_shutdown), 216 { 0, 0 } 217}; 218 219static driver_t ti_driver = { 220 "ti", 221 ti_methods, 222 sizeof(struct ti_softc) 223}; 224 225static devclass_t ti_devclass; 226 227DRIVER_MODULE(ti, pci, ti_driver, ti_devclass, 0, 0); 228 |
229/* 230 * Send an instruction or address to the EEPROM, check for ACK. 231 */ 232static u_int32_t ti_eeprom_putbyte(sc, byte) 233 struct ti_softc *sc; 234 int byte; 235{ 236 register int i, ack = 0; --- 1275 unchanged lines hidden (view full) --- 1512 1513 return(0); 1514} 1515 1516/* 1517 * Probe for a Tigon chip. Check the PCI vendor and device IDs 1518 * against our list and return its name if we find a match. 1519 */ |
1520static int ti_probe(dev) 1521 device_t dev; |
1522{ 1523 struct ti_type *t; 1524 1525 t = ti_devs; 1526 1527 while(t->ti_name != NULL) { |
1528 if ((pci_get_vendor(dev) == t->ti_vid) && 1529 (pci_get_device(dev) == t->ti_did)) { 1530 device_set_desc(dev, t->ti_name); 1531 return(0); 1532 } |
1533 t++; 1534 } 1535 |
1536 return(ENXIO); |
1537} 1538 |
1539static int ti_attach(dev) 1540 device_t dev; |
1541{ |
1542 int s; 1543 u_int32_t command; 1544 struct ifnet *ifp; 1545 struct ti_softc *sc; |
1546 int unit, error = 0, rid; |
1547 1548 s = splimp(); 1549 |
1550 sc = device_get_softc(dev); 1551 unit = device_get_unit(dev); |
1552 bzero(sc, sizeof(struct ti_softc)); 1553 1554 /* 1555 * Map control/status registers. 1556 */ |
1557 command = pci_read_config(dev, PCI_COMMAND_STATUS_REG, 4); |
1558 command |= (PCIM_CMD_MEMEN|PCIM_CMD_BUSMASTEREN); |
1559 pci_write_config(dev, PCI_COMMAND_STATUS_REG, command, 4); 1560 command = pci_read_config(dev, PCI_COMMAND_STATUS_REG, 4); |
1561 1562 if (!(command & PCIM_CMD_MEMEN)) { 1563 printf("ti%d: failed to enable memory mapping!\n", unit); |
1564 error = ENXIO; |
1565 goto fail; 1566 } 1567 |
1568 rid = TI_PCI_LOMEM; 1569 sc->ti_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 1570 0, ~0, 1, RF_ACTIVE); 1571 1572 if (sc->ti_res == NULL) { |
1573 printf ("ti%d: couldn't map memory\n", unit); |
1574 error = ENXIO; |
1575 goto fail; 1576 } 1577 |
1578 /* Allocate interrupt */ 1579 rid = 0; 1580 sc->ti_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, 1581 RF_SHAREABLE | RF_ACTIVE); |
1582 |
1583 if (sc->ti_irq == NULL) { 1584 printf("ti%d: couldn't map interrupt\n", unit); 1585 error = ENXIO; |
1586 goto fail; 1587 } 1588 |
1589 error = bus_setup_intr(dev, sc->ti_irq, INTR_TYPE_NET, 1590 ti_intr, sc, &sc->ti_intrhand); 1591 1592 if (error) { 1593 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq); 1594 bus_release_resource(dev, SYS_RES_MEMORY, 1595 TI_PCI_LOMEM, sc->ti_res); 1596 printf("ti%d: couldn't set up irq\n", unit); |
1597 goto fail; 1598 } 1599 1600 sc->ti_unit = unit; 1601 1602 if (ti_chipinit(sc)) { 1603 printf("ti%d: chip initialization failed\n", sc->ti_unit); |
1604 bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand); 1605 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq); 1606 bus_release_resource(dev, SYS_RES_MEMORY, 1607 TI_PCI_LOMEM, sc->ti_res); 1608 error = ENXIO; |
1609 goto fail; 1610 } 1611 1612 /* Zero out the NIC's on-board SRAM. */ 1613 ti_mem(sc, 0x2000, 0x100000 - 0x2000, NULL); 1614 1615 /* Init again -- zeroing memory may have clobbered some registers. */ 1616 if (ti_chipinit(sc)) { 1617 printf("ti%d: chip initialization failed\n", sc->ti_unit); |
1618 bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand); 1619 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq); 1620 bus_release_resource(dev, SYS_RES_MEMORY, 1621 TI_PCI_LOMEM, sc->ti_res); 1622 error = ENXIO; |
1623 goto fail; 1624 } 1625 1626 /* 1627 * Get station address from the EEPROM. Note: the manual states 1628 * that the MAC address is at offset 0x8c, however the data is 1629 * stored as two longwords (since that's how it's loaded into 1630 * the NIC). This means the MAC address is actually preceeded 1631 * by two zero bytes. We need to skip over those. 1632 */ 1633 if (ti_read_eeprom(sc, (caddr_t)&sc->arpcom.ac_enaddr, 1634 TI_EE_MAC_OFFSET + 2, ETHER_ADDR_LEN)) { 1635 printf("ti%d: failed to read station address\n", unit); |
1636 bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand); 1637 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq); 1638 bus_release_resource(dev, SYS_RES_MEMORY, 1639 TI_PCI_LOMEM, sc->ti_res); 1640 error = ENXIO; |
1641 goto fail; 1642 } 1643 1644 /* 1645 * A Tigon chip was detected. Inform the world. 1646 */ 1647 printf("ti%d: Ethernet address: %6D\n", unit, 1648 sc->arpcom.ac_enaddr, ":"); 1649 1650 /* Allocate the general information block and ring buffers. */ |
1651 sc->ti_rdata = contigmalloc(sizeof(struct ti_ring_data), M_DEVBUF, |
1652 M_NOWAIT, 0x100000, 0xffffffff, PAGE_SIZE, 0); 1653 |
1654 if (sc->ti_rdata == NULL) { 1655 bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand); 1656 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq); 1657 bus_release_resource(dev, SYS_RES_MEMORY, 1658 TI_PCI_LOMEM, sc->ti_res); 1659 error = ENXIO; |
1660 printf("ti%d: no memory for list buffers!\n", sc->ti_unit); 1661 goto fail; 1662 } 1663 |
1664 bzero(sc->ti_rdata, sizeof(struct ti_ring_data)); 1665 1666 /* Try to allocate memory for jumbo buffers. */ 1667 if (ti_alloc_jumbo_mem(sc)) { 1668 printf("ti%d: jumbo buffer allocation failed\n", sc->ti_unit); |
1669 bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand); 1670 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq); 1671 bus_release_resource(dev, SYS_RES_MEMORY, 1672 TI_PCI_LOMEM, sc->ti_res); 1673 free(sc->ti_rdata, M_DEVBUF); 1674 error = ENXIO; |
1675 goto fail; 1676 } 1677 1678 /* Set default tuneable values. */ 1679 sc->ti_stat_ticks = 2 * TI_TICKS_PER_SEC; 1680 sc->ti_rx_coal_ticks = TI_TICKS_PER_SEC / 5000; 1681 sc->ti_tx_coal_ticks = TI_TICKS_PER_SEC / 500; 1682 sc->ti_rx_max_coal_bds = 64; --- 30 unchanged lines hidden (view full) --- 1713 */ 1714 if_attach(ifp); 1715 ether_ifattach(ifp); 1716 1717#if NBPF > 0 1718 bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header)); 1719#endif 1720 |
1721fail: 1722 splx(s); 1723 |
1724 return(error); |
1725} 1726 |
1727static int ti_detach(dev) 1728 device_t dev; 1729{ 1730 struct ti_softc *sc; 1731 struct ifnet *ifp; 1732 int s; 1733 1734 s = splimp(); 1735 1736 sc = device_get_softc(dev); 1737 ifp = &sc->arpcom.ac_if; 1738 1739 if_detach(ifp); 1740 ti_stop(sc); 1741 1742 bus_teardown_intr(dev, sc->ti_irq, sc->ti_intrhand); 1743 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ti_irq); 1744 bus_release_resource(dev, SYS_RES_MEMORY, TI_PCI_LOMEM, sc->ti_res); 1745 1746 free(sc->ti_cdata.ti_jumbo_buf, M_DEVBUF); 1747 free(sc->ti_rdata, M_DEVBUF); 1748 ifmedia_removeall(&sc->ifmedia); 1749 1750 splx(s); 1751 1752 return(0); 1753} 1754 |
1755/* 1756 * Frame reception handling. This is called if there's a frame 1757 * on the receive return list. 1758 * 1759 * Note: we have to be able to handle three possibilities here: 1760 * 1) the frame is from the mini receive ring (can only happen) 1761 * on Tigon 2 boards) 1762 * 2) the frame is from the jumbo recieve ring --- 722 unchanged lines hidden (view full) --- 2485 2486 return; 2487} 2488 2489/* 2490 * Stop all chip I/O so that the kernel's probe routines don't 2491 * get confused by errant DMAs when rebooting. 2492 */ |
2493static void ti_shutdown(dev) 2494 device_t dev; |
2495{ 2496 struct ti_softc *sc; 2497 |
2498 sc = device_get_softc(dev); |
2499 2500 ti_chipinit(sc); 2501 2502 return; 2503} |