diff options
Diffstat (limited to 'drivers/net/davinci_emac.c')
-rw-r--r-- | drivers/net/davinci_emac.c | 41 |
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) | |||
2548 | static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev) | 2548 | static 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 | } |