aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/gianfar.c85
1 files changed, 15 insertions, 70 deletions
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c
index 1be4a84dce0e..1f83988a6a64 100644
--- a/drivers/net/gianfar.c
+++ b/drivers/net/gianfar.c
@@ -10,6 +10,7 @@
10 * Maintainer: Kumar Gala 10 * Maintainer: Kumar Gala
11 * 11 *
12 * Copyright (c) 2002-2006 Freescale Semiconductor, Inc. 12 * Copyright (c) 2002-2006 Freescale Semiconductor, Inc.
13 * Copyright (c) 2007 MontaVista Software, Inc.
13 * 14 *
14 * This program is free software; you can redistribute it and/or modify it 15 * This program is free software; you can redistribute it and/or modify it
15 * under the terms of the GNU General Public License as published by the 16 * under the terms of the GNU General Public License as published by the
@@ -1612,71 +1613,17 @@ static irqreturn_t gfar_interrupt(int irq, void *dev_id)
1612 /* Save ievent for future reference */ 1613 /* Save ievent for future reference */
1613 u32 events = gfar_read(&priv->regs->ievent); 1614 u32 events = gfar_read(&priv->regs->ievent);
1614 1615
1615 /* Clear IEVENT */
1616 gfar_write(&priv->regs->ievent, events);
1617
1618 /* Check for reception */ 1616 /* Check for reception */
1619 if ((events & IEVENT_RXF0) || (events & IEVENT_RXB0)) 1617 if (events & IEVENT_RX_MASK)
1620 gfar_receive(irq, dev_id); 1618 gfar_receive(irq, dev_id);
1621 1619
1622 /* Check for transmit completion */ 1620 /* Check for transmit completion */
1623 if ((events & IEVENT_TXF) || (events & IEVENT_TXB)) 1621 if (events & IEVENT_TX_MASK)
1624 gfar_transmit(irq, dev_id); 1622 gfar_transmit(irq, dev_id);
1625 1623
1626 /* Update error statistics */ 1624 /* Check for errors */
1627 if (events & IEVENT_TXE) { 1625 if (events & IEVENT_ERR_MASK)
1628 priv->stats.tx_errors++; 1626 gfar_error(irq, dev_id);
1629
1630 if (events & IEVENT_LC)
1631 priv->stats.tx_window_errors++;
1632 if (events & IEVENT_CRL)
1633 priv->stats.tx_aborted_errors++;
1634 if (events & IEVENT_XFUN) {
1635 if (netif_msg_tx_err(priv))
1636 printk(KERN_WARNING "%s: tx underrun. dropped packet\n", dev->name);
1637 priv->stats.tx_dropped++;
1638 priv->extra_stats.tx_underrun++;
1639
1640 /* Reactivate the Tx Queues */
1641 gfar_write(&priv->regs->tstat, TSTAT_CLEAR_THALT);
1642 }
1643 }
1644 if (events & IEVENT_BSY) {
1645 priv->stats.rx_errors++;
1646 priv->extra_stats.rx_bsy++;
1647
1648 gfar_receive(irq, dev_id);
1649
1650#ifndef CONFIG_GFAR_NAPI
1651 /* Clear the halt bit in RSTAT */
1652 gfar_write(&priv->regs->rstat, RSTAT_CLEAR_RHALT);
1653#endif
1654
1655 if (netif_msg_rx_err(priv))
1656 printk(KERN_DEBUG "%s: busy error (rhalt: %x)\n",
1657 dev->name,
1658 gfar_read(&priv->regs->rstat));
1659 }
1660 if (events & IEVENT_BABR) {
1661 priv->stats.rx_errors++;
1662 priv->extra_stats.rx_babr++;
1663
1664 if (netif_msg_rx_err(priv))
1665 printk(KERN_DEBUG "%s: babbling error\n", dev->name);
1666 }
1667 if (events & IEVENT_EBERR) {
1668 priv->extra_stats.eberr++;
1669 if (netif_msg_rx_err(priv))
1670 printk(KERN_DEBUG "%s: EBERR\n", dev->name);
1671 }
1672 if ((events & IEVENT_RXC) && (netif_msg_rx_err(priv)))
1673 printk(KERN_DEBUG "%s: control frame\n", dev->name);
1674
1675 if (events & IEVENT_BABT) {
1676 priv->extra_stats.tx_babt++;
1677 if (netif_msg_rx_err(priv))
1678 printk(KERN_DEBUG "%s: babt error\n", dev->name);
1679 }
1680 1627
1681 return IRQ_HANDLED; 1628 return IRQ_HANDLED;
1682} 1629}
@@ -1938,7 +1885,7 @@ static irqreturn_t gfar_error(int irq, void *dev_id)
1938 /* Hmm... */ 1885 /* Hmm... */
1939 if (netif_msg_rx_err(priv) || netif_msg_tx_err(priv)) 1886 if (netif_msg_rx_err(priv) || netif_msg_tx_err(priv))
1940 printk(KERN_DEBUG "%s: error interrupt (ievent=0x%08x imask=0x%08x)\n", 1887 printk(KERN_DEBUG "%s: error interrupt (ievent=0x%08x imask=0x%08x)\n",
1941 dev->name, events, gfar_read(&priv->regs->imask)); 1888 dev->name, events, gfar_read(&priv->regs->imask));
1942 1889
1943 /* Update the error counters */ 1890 /* Update the error counters */
1944 if (events & IEVENT_TXE) { 1891 if (events & IEVENT_TXE) {
@@ -1950,8 +1897,8 @@ static irqreturn_t gfar_error(int irq, void *dev_id)
1950 priv->stats.tx_aborted_errors++; 1897 priv->stats.tx_aborted_errors++;
1951 if (events & IEVENT_XFUN) { 1898 if (events & IEVENT_XFUN) {
1952 if (netif_msg_tx_err(priv)) 1899 if (netif_msg_tx_err(priv))
1953 printk(KERN_DEBUG "%s: underrun. packet dropped.\n", 1900 printk(KERN_DEBUG "%s: TX FIFO underrun, "
1954 dev->name); 1901 "packet dropped.\n", dev->name);
1955 priv->stats.tx_dropped++; 1902 priv->stats.tx_dropped++;
1956 priv->extra_stats.tx_underrun++; 1903 priv->extra_stats.tx_underrun++;
1957 1904
@@ -1973,30 +1920,28 @@ static irqreturn_t gfar_error(int irq, void *dev_id)
1973#endif 1920#endif
1974 1921
1975 if (netif_msg_rx_err(priv)) 1922 if (netif_msg_rx_err(priv))
1976 printk(KERN_DEBUG "%s: busy error (rhalt: %x)\n", 1923 printk(KERN_DEBUG "%s: busy error (rstat: %x)\n",
1977 dev->name, 1924 dev->name, gfar_read(&priv->regs->rstat));
1978 gfar_read(&priv->regs->rstat));
1979 } 1925 }
1980 if (events & IEVENT_BABR) { 1926 if (events & IEVENT_BABR) {
1981 priv->stats.rx_errors++; 1927 priv->stats.rx_errors++;
1982 priv->extra_stats.rx_babr++; 1928 priv->extra_stats.rx_babr++;
1983 1929
1984 if (netif_msg_rx_err(priv)) 1930 if (netif_msg_rx_err(priv))
1985 printk(KERN_DEBUG "%s: babbling error\n", dev->name); 1931 printk(KERN_DEBUG "%s: babbling RX error\n", dev->name);
1986 } 1932 }
1987 if (events & IEVENT_EBERR) { 1933 if (events & IEVENT_EBERR) {
1988 priv->extra_stats.eberr++; 1934 priv->extra_stats.eberr++;
1989 if (netif_msg_rx_err(priv)) 1935 if (netif_msg_rx_err(priv))
1990 printk(KERN_DEBUG "%s: EBERR\n", dev->name); 1936 printk(KERN_DEBUG "%s: bus error\n", dev->name);
1991 } 1937 }
1992 if ((events & IEVENT_RXC) && netif_msg_rx_status(priv)) 1938 if ((events & IEVENT_RXC) && netif_msg_rx_status(priv))
1993 if (netif_msg_rx_status(priv)) 1939 printk(KERN_DEBUG "%s: control frame\n", dev->name);
1994 printk(KERN_DEBUG "%s: control frame\n", dev->name);
1995 1940
1996 if (events & IEVENT_BABT) { 1941 if (events & IEVENT_BABT) {
1997 priv->extra_stats.tx_babt++; 1942 priv->extra_stats.tx_babt++;
1998 if (netif_msg_tx_err(priv)) 1943 if (netif_msg_tx_err(priv))
1999 printk(KERN_DEBUG "%s: babt error\n", dev->name); 1944 printk(KERN_DEBUG "%s: babbling TX error\n", dev->name);
2000 } 1945 }
2001 return IRQ_HANDLED; 1946 return IRQ_HANDLED;
2002} 1947}