[NET] drivers/net: statistics cleanup #1 -- save memory and shrink code
We now have struct net_device_stats embedded in struct net_device, and the default ->get_stats() hook does the obvious thing for us. Run through drivers/net/* and remove the driver-local storage of statistics, and driver-local ->get_stats() hook where applicable. This was just the low-hanging fruit in drivers/net; plenty more drivers remain to be updated. [ Resolved conflicts with napi_struct changes and fix sunqe build regression... -DaveM ] Signed-off-by: Jeff Garzik <jeff@garzik.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
ff8ac60948
commit
09f75cd7bf
@@ -183,13 +183,6 @@ struct smc_local {
|
||||
struct sk_buff *pending_tx_skb;
|
||||
struct tasklet_struct tx_task;
|
||||
|
||||
/*
|
||||
* these are things that the kernel wants me to keep, so users
|
||||
* can find out semi-useless statistics of how well the card is
|
||||
* performing
|
||||
*/
|
||||
struct net_device_stats stats;
|
||||
|
||||
/* version/revision of the SMC91x chip */
|
||||
int version;
|
||||
|
||||
@@ -332,8 +325,8 @@ static void smc_reset(struct net_device *dev)
|
||||
/* free any pending tx skb */
|
||||
if (pending_skb) {
|
||||
dev_kfree_skb(pending_skb);
|
||||
lp->stats.tx_errors++;
|
||||
lp->stats.tx_aborted_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
dev->stats.tx_aborted_errors++;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -512,13 +505,13 @@ static inline void smc_rcv(struct net_device *dev)
|
||||
}
|
||||
SMC_WAIT_MMU_BUSY();
|
||||
SMC_SET_MMU_CMD(MC_RELEASE);
|
||||
lp->stats.rx_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
if (status & RS_ALGNERR)
|
||||
lp->stats.rx_frame_errors++;
|
||||
dev->stats.rx_frame_errors++;
|
||||
if (status & (RS_TOOSHORT | RS_TOOLONG))
|
||||
lp->stats.rx_length_errors++;
|
||||
dev->stats.rx_length_errors++;
|
||||
if (status & RS_BADCRC)
|
||||
lp->stats.rx_crc_errors++;
|
||||
dev->stats.rx_crc_errors++;
|
||||
} else {
|
||||
struct sk_buff *skb;
|
||||
unsigned char *data;
|
||||
@@ -526,7 +519,7 @@ static inline void smc_rcv(struct net_device *dev)
|
||||
|
||||
/* set multicast stats */
|
||||
if (status & RS_MULTICAST)
|
||||
lp->stats.multicast++;
|
||||
dev->stats.multicast++;
|
||||
|
||||
/*
|
||||
* Actual payload is packet_len - 6 (or 5 if odd byte).
|
||||
@@ -542,7 +535,7 @@ static inline void smc_rcv(struct net_device *dev)
|
||||
dev->name);
|
||||
SMC_WAIT_MMU_BUSY();
|
||||
SMC_SET_MMU_CMD(MC_RELEASE);
|
||||
lp->stats.rx_dropped++;
|
||||
dev->stats.rx_dropped++;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -570,8 +563,8 @@ static inline void smc_rcv(struct net_device *dev)
|
||||
dev->last_rx = jiffies;
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
netif_rx(skb);
|
||||
lp->stats.rx_packets++;
|
||||
lp->stats.rx_bytes += data_len;
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += data_len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -644,8 +637,8 @@ static void smc_hardware_send_pkt(unsigned long data)
|
||||
packet_no = SMC_GET_AR();
|
||||
if (unlikely(packet_no & AR_FAILED)) {
|
||||
printk("%s: Memory allocation failed.\n", dev->name);
|
||||
lp->stats.tx_errors++;
|
||||
lp->stats.tx_fifo_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
smc_special_unlock(&lp->lock);
|
||||
goto done;
|
||||
}
|
||||
@@ -688,8 +681,8 @@ static void smc_hardware_send_pkt(unsigned long data)
|
||||
smc_special_unlock(&lp->lock);
|
||||
|
||||
dev->trans_start = jiffies;
|
||||
lp->stats.tx_packets++;
|
||||
lp->stats.tx_bytes += len;
|
||||
dev->stats.tx_packets++;
|
||||
dev->stats.tx_bytes += len;
|
||||
|
||||
SMC_ENABLE_INT(IM_TX_INT | IM_TX_EMPTY_INT);
|
||||
|
||||
@@ -729,8 +722,8 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
numPages = ((skb->len & ~1) + (6 - 1)) >> 8;
|
||||
if (unlikely(numPages > 7)) {
|
||||
printk("%s: Far too big packet error.\n", dev->name);
|
||||
lp->stats.tx_errors++;
|
||||
lp->stats.tx_dropped++;
|
||||
dev->stats.tx_errors++;
|
||||
dev->stats.tx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
@@ -803,17 +796,17 @@ static void smc_tx(struct net_device *dev)
|
||||
dev->name, tx_status, packet_no);
|
||||
|
||||
if (!(tx_status & ES_TX_SUC))
|
||||
lp->stats.tx_errors++;
|
||||
dev->stats.tx_errors++;
|
||||
|
||||
if (tx_status & ES_LOSTCARR)
|
||||
lp->stats.tx_carrier_errors++;
|
||||
dev->stats.tx_carrier_errors++;
|
||||
|
||||
if (tx_status & (ES_LATCOL | ES_16COL)) {
|
||||
PRINTK("%s: %s occurred on last xmit\n", dev->name,
|
||||
(tx_status & ES_LATCOL) ?
|
||||
"late collision" : "too many collisions");
|
||||
lp->stats.tx_window_errors++;
|
||||
if (!(lp->stats.tx_window_errors & 63) && net_ratelimit()) {
|
||||
dev->stats.tx_window_errors++;
|
||||
if (!(dev->stats.tx_window_errors & 63) && net_ratelimit()) {
|
||||
printk(KERN_INFO "%s: unexpectedly large number of "
|
||||
"bad collisions. Please check duplex "
|
||||
"setting.\n", dev->name);
|
||||
@@ -1347,19 +1340,19 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id)
|
||||
SMC_SELECT_BANK(2);
|
||||
|
||||
/* single collisions */
|
||||
lp->stats.collisions += card_stats & 0xF;
|
||||
dev->stats.collisions += card_stats & 0xF;
|
||||
card_stats >>= 4;
|
||||
|
||||
/* multiple collisions */
|
||||
lp->stats.collisions += card_stats & 0xF;
|
||||
dev->stats.collisions += card_stats & 0xF;
|
||||
} else if (status & IM_RX_OVRN_INT) {
|
||||
DBG(1, "%s: RX overrun (EPH_ST 0x%04x)\n", dev->name,
|
||||
({ int eph_st; SMC_SELECT_BANK(0);
|
||||
eph_st = SMC_GET_EPH_STATUS();
|
||||
SMC_SELECT_BANK(2); eph_st; }) );
|
||||
SMC_ACK_INT(IM_RX_OVRN_INT);
|
||||
lp->stats.rx_errors++;
|
||||
lp->stats.rx_fifo_errors++;
|
||||
dev->stats.rx_errors++;
|
||||
dev->stats.rx_fifo_errors++;
|
||||
} else if (status & IM_EPH_INT) {
|
||||
smc_eph_interrupt(dev);
|
||||
} else if (status & IM_MDINT) {
|
||||
@@ -1627,19 +1620,6 @@ static int smc_close(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the current statistics.
|
||||
* This may be called with the card open or closed.
|
||||
*/
|
||||
static struct net_device_stats *smc_query_statistics(struct net_device *dev)
|
||||
{
|
||||
struct smc_local *lp = netdev_priv(dev);
|
||||
|
||||
DBG(2, "%s: %s\n", dev->name, __FUNCTION__);
|
||||
|
||||
return &lp->stats;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ethtool support
|
||||
*/
|
||||
@@ -1965,7 +1945,6 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
|
||||
dev->hard_start_xmit = smc_hard_start_xmit;
|
||||
dev->tx_timeout = smc_timeout;
|
||||
dev->watchdog_timeo = msecs_to_jiffies(watchdog);
|
||||
dev->get_stats = smc_query_statistics;
|
||||
dev->set_multicast_list = smc_set_multicast_list;
|
||||
dev->ethtool_ops = &smc_ethtool_ops;
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
|
Reference in New Issue
Block a user