Use the chip MIB statistics to implement the packet and byte counts.
Signed-off-by: Stephen Hemminger <shemminger@xxxxxxxx>
--- skge-2.6.11/drivers/net/skge.c.orig 2005-03-02 17:25:25.000000000 -0800
+++ skge-2.6.11/drivers/net/skge.c 2005-03-02 17:29:30.000000000 -0800
@@ -361,6 +361,31 @@
yukon_get_stats(skge, data);
}
+/* Use hardware MIB variables for critical path statistics and
+ * transmit feedback not reported at interrupt.
+ * Other errors are accounted for in interrupt handler.
+ */
+static struct net_device_stats *skge_get_stats(struct net_device *dev)
+{
+ struct skge_port *skge = netdev_priv(dev);
+ u64 data[ARRAY_SIZE(skge_stats)];
+
+ if (skge->hw->chip_id == CHIP_ID_GENESIS)
+ genesis_get_stats(skge, data);
+ else
+ yukon_get_stats(skge, data);
+
+ skge->net_stats.tx_bytes = data[0];
+ skge->net_stats.rx_bytes = data[1];
+ skge->net_stats.tx_packets = data[2] + data[4] + data[6];
+ skge->net_stats.rx_packets = data[3] + data[5] + data[7];
+ skge->net_stats.multicast = data[5] + data[7];
+ skge->net_stats.collisions = data[10];
+ skge->net_stats.tx_aborted_errors = data[12];
+
+ return &skge->net_stats;
+}
+
static void skge_get_strings(struct net_device *dev, u32 stringset, u8 *data)
{
int i;
@@ -2336,9 +2361,6 @@
netif_stop_queue(dev);
}
- skge->net_stats.tx_packets++;
- skge->net_stats.tx_bytes += skb->len;
-
dev->trans_start = jiffies;
spin_unlock_irqrestore(&skge->tx_lock, flags);
@@ -2572,8 +2594,6 @@
}
dev->last_rx = jiffies;
- skge->net_stats.rx_packets++;
- skge->net_stats.rx_bytes += skb->len;
netif_receive_skb(skb);
++work_done;
@@ -2825,15 +2845,6 @@
}
#endif
-/* TODO: use MIB counters instead?? */
-static struct net_device_stats *skge_get_stats(struct net_device *dev)
-{
- struct skge_port *skge = netdev_priv(dev);
-
- return &skge->net_stats;
-}
-
-
static int skge_set_mac_address(struct net_device *dev, void *p)
{
struct skge_port *skge = netdev_priv(dev);
|