aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/davinci_emac.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/davinci_emac.c')
-rw-r--r--drivers/net/davinci_emac.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
index 65a2d0ba64e2..db6380379478 100644
--- a/drivers/net/davinci_emac.c
+++ b/drivers/net/davinci_emac.c
@@ -333,6 +333,9 @@ static const char emac_version_string[] = "TI DaVinci EMAC Linux v6.1";
333#define EMAC_DM646X_MAC_EOI_C0_RXEN (0x01) 333#define EMAC_DM646X_MAC_EOI_C0_RXEN (0x01)
334#define EMAC_DM646X_MAC_EOI_C0_TXEN (0x02) 334#define EMAC_DM646X_MAC_EOI_C0_TXEN (0x02)
335 335
336/* EMAC Stats Clear Mask */
337#define EMAC_STATS_CLR_MASK (0xFFFFFFFF)
338
336/** net_buf_obj: EMAC network bufferdata structure 339/** net_buf_obj: EMAC network bufferdata structure
337 * 340 *
338 * EMAC network buffer data structure 341 * EMAC network buffer data structure
@@ -2137,9 +2140,6 @@ static int emac_poll(struct napi_struct *napi, int budget)
2137 u32 status = 0; 2140 u32 status = 0;
2138 u32 num_pkts = 0; 2141 u32 num_pkts = 0;
2139 2142
2140 if (!netif_running(ndev))
2141 return 0;
2142
2143 /* Check interrupt vectors and call packet processing */ 2143 /* Check interrupt vectors and call packet processing */
2144 status = emac_read(EMAC_MACINVECTOR); 2144 status = emac_read(EMAC_MACINVECTOR);
2145 2145
@@ -2218,7 +2218,7 @@ void emac_poll_controller(struct net_device *ndev)
2218 struct emac_priv *priv = netdev_priv(ndev); 2218 struct emac_priv *priv = netdev_priv(ndev);
2219 2219
2220 emac_int_disable(priv); 2220 emac_int_disable(priv);
2221 emac_irq(ndev->irq, priv); 2221 emac_irq(ndev->irq, ndev);
2222 emac_int_enable(priv); 2222 emac_int_enable(priv);
2223} 2223}
2224#endif 2224#endif
@@ -2548,40 +2548,49 @@ static int emac_dev_stop(struct net_device *ndev)
2548static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev) 2548static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev)
2549{ 2549{
2550 struct emac_priv *priv = netdev_priv(ndev); 2550 struct emac_priv *priv = netdev_priv(ndev);
2551 u32 mac_control;
2552 u32 stats_clear_mask;
2551 2553
2552 /* update emac hardware stats and reset the registers*/ 2554 /* update emac hardware stats and reset the registers*/
2553 2555
2556 mac_control = emac_read(EMAC_MACCONTROL);
2557
2558 if (mac_control & EMAC_MACCONTROL_GMIIEN)
2559 stats_clear_mask = EMAC_STATS_CLR_MASK;
2560 else
2561 stats_clear_mask = 0;
2562
2554 priv->net_dev_stats.multicast += emac_read(EMAC_RXMCASTFRAMES); 2563 priv->net_dev_stats.multicast += emac_read(EMAC_RXMCASTFRAMES);
2555 emac_write(EMAC_RXMCASTFRAMES, EMAC_ALL_MULTI_REG_VALUE); 2564 emac_write(EMAC_RXMCASTFRAMES, stats_clear_mask);
2556 2565
2557 priv->net_dev_stats.collisions += (emac_read(EMAC_TXCOLLISION) + 2566 priv->net_dev_stats.collisions += (emac_read(EMAC_TXCOLLISION) +
2558 emac_read(EMAC_TXSINGLECOLL) + 2567 emac_read(EMAC_TXSINGLECOLL) +
2559 emac_read(EMAC_TXMULTICOLL)); 2568 emac_read(EMAC_TXMULTICOLL));
2560 emac_write(EMAC_TXCOLLISION, EMAC_ALL_MULTI_REG_VALUE); 2569 emac_write(EMAC_TXCOLLISION, stats_clear_mask);
2561 emac_write(EMAC_TXSINGLECOLL, EMAC_ALL_MULTI_REG_VALUE); 2570 emac_write(EMAC_TXSINGLECOLL, stats_clear_mask);
2562 emac_write(EMAC_TXMULTICOLL, EMAC_ALL_MULTI_REG_VALUE); 2571 emac_write(EMAC_TXMULTICOLL, stats_clear_mask);
2563 2572
2564 priv->net_dev_stats.rx_length_errors += (emac_read(EMAC_RXOVERSIZED) + 2573 priv->net_dev_stats.rx_length_errors += (emac_read(EMAC_RXOVERSIZED) +
2565 emac_read(EMAC_RXJABBER) + 2574 emac_read(EMAC_RXJABBER) +
2566 emac_read(EMAC_RXUNDERSIZED)); 2575 emac_read(EMAC_RXUNDERSIZED));
2567 emac_write(EMAC_RXOVERSIZED, EMAC_ALL_MULTI_REG_VALUE); 2576 emac_write(EMAC_RXOVERSIZED, stats_clear_mask);
2568 emac_write(EMAC_RXJABBER, EMAC_ALL_MULTI_REG_VALUE); 2577 emac_write(EMAC_RXJABBER, stats_clear_mask);
2569 emac_write(EMAC_RXUNDERSIZED, EMAC_ALL_MULTI_REG_VALUE); 2578 emac_write(EMAC_RXUNDERSIZED, stats_clear_mask);
2570 2579
2571 priv->net_dev_stats.rx_over_errors += (emac_read(EMAC_RXSOFOVERRUNS) + 2580 priv->net_dev_stats.rx_over_errors += (emac_read(EMAC_RXSOFOVERRUNS) +
2572 emac_read(EMAC_RXMOFOVERRUNS)); 2581 emac_read(EMAC_RXMOFOVERRUNS));
2573 emac_write(EMAC_RXSOFOVERRUNS, EMAC_ALL_MULTI_REG_VALUE); 2582 emac_write(EMAC_RXSOFOVERRUNS, stats_clear_mask);
2574 emac_write(EMAC_RXMOFOVERRUNS, EMAC_ALL_MULTI_REG_VALUE); 2583 emac_write(EMAC_RXMOFOVERRUNS, stats_clear_mask);
2575 2584
2576 priv->net_dev_stats.rx_fifo_errors += emac_read(EMAC_RXDMAOVERRUNS); 2585 priv->net_dev_stats.rx_fifo_errors += emac_read(EMAC_RXDMAOVERRUNS);
2577 emac_write(EMAC_RXDMAOVERRUNS, EMAC_ALL_MULTI_REG_VALUE); 2586 emac_write(EMAC_RXDMAOVERRUNS, stats_clear_mask);
2578 2587
2579 priv->net_dev_stats.tx_carrier_errors += 2588 priv->net_dev_stats.tx_carrier_errors +=
2580 emac_read(EMAC_TXCARRIERSENSE); 2589 emac_read(EMAC_TXCARRIERSENSE);
2581 emac_write(EMAC_TXCARRIERSENSE, EMAC_ALL_MULTI_REG_VALUE); 2590 emac_write(EMAC_TXCARRIERSENSE, stats_clear_mask);
2582 2591
2583 priv->net_dev_stats.tx_fifo_errors = emac_read(EMAC_TXUNDERRUN); 2592 priv->net_dev_stats.tx_fifo_errors = emac_read(EMAC_TXUNDERRUN);
2584 emac_write(EMAC_TXUNDERRUN, EMAC_ALL_MULTI_REG_VALUE); 2593 emac_write(EMAC_TXUNDERRUN, stats_clear_mask);
2585 2594
2586 return &priv->net_dev_stats; 2595 return &priv->net_dev_stats;
2587} 2596}