ether3: Use net_device_stats from struct net_device
struct net_device has its own struct net_device_stats member, so use this one instead of a private copy in the ether1_priv struct. As the new ndo_get_stats function would just return dev->stats we can omit it. This patch also removes an incorrect memset of the stats on open. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
25aec76a3b
Коммит
bb2537f1e7
|
@ -81,7 +81,6 @@ static int ether3_open (struct net_device *dev);
|
||||||
static int ether3_sendpacket (struct sk_buff *skb, struct net_device *dev);
|
static int ether3_sendpacket (struct sk_buff *skb, struct net_device *dev);
|
||||||
static irqreturn_t ether3_interrupt (int irq, void *dev_id);
|
static irqreturn_t ether3_interrupt (int irq, void *dev_id);
|
||||||
static int ether3_close (struct net_device *dev);
|
static int ether3_close (struct net_device *dev);
|
||||||
static struct net_device_stats *ether3_getstats (struct net_device *dev);
|
|
||||||
static void ether3_setmulticastlist (struct net_device *dev);
|
static void ether3_setmulticastlist (struct net_device *dev);
|
||||||
static void ether3_timeout(struct net_device *dev);
|
static void ether3_timeout(struct net_device *dev);
|
||||||
|
|
||||||
|
@ -323,8 +322,6 @@ ether3_init_for_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(&priv(dev)->stats, 0, sizeof(struct net_device_stats));
|
|
||||||
|
|
||||||
/* Reset the chip */
|
/* Reset the chip */
|
||||||
ether3_outw(CFG2_RESET, REG_CONFIG2);
|
ether3_outw(CFG2_RESET, REG_CONFIG2);
|
||||||
udelay(4);
|
udelay(4);
|
||||||
|
@ -441,15 +438,6 @@ ether3_close(struct net_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the current statistics. This may be called with the card open or
|
|
||||||
* closed.
|
|
||||||
*/
|
|
||||||
static struct net_device_stats *ether3_getstats(struct net_device *dev)
|
|
||||||
{
|
|
||||||
return &priv(dev)->stats;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set or clear promiscuous/multicast mode filter for this adaptor.
|
* Set or clear promiscuous/multicast mode filter for this adaptor.
|
||||||
*
|
*
|
||||||
|
@ -490,7 +478,7 @@ static void ether3_timeout(struct net_device *dev)
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
priv(dev)->regs.config2 |= CFG2_CTRLO;
|
priv(dev)->regs.config2 |= CFG2_CTRLO;
|
||||||
priv(dev)->stats.tx_errors += 1;
|
dev->stats.tx_errors += 1;
|
||||||
ether3_outw(priv(dev)->regs.config2, REG_CONFIG2);
|
ether3_outw(priv(dev)->regs.config2, REG_CONFIG2);
|
||||||
priv(dev)->tx_head = priv(dev)->tx_tail = 0;
|
priv(dev)->tx_head = priv(dev)->tx_tail = 0;
|
||||||
|
|
||||||
|
@ -509,7 +497,7 @@ ether3_sendpacket(struct sk_buff *skb, struct net_device *dev)
|
||||||
|
|
||||||
if (priv(dev)->broken) {
|
if (priv(dev)->broken) {
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
priv(dev)->stats.tx_dropped ++;
|
dev->stats.tx_dropped++;
|
||||||
netif_start_queue(dev);
|
netif_start_queue(dev);
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
@ -673,7 +661,7 @@ if (next_ptr < RX_START || next_ptr >= RX_END) {
|
||||||
} else
|
} else
|
||||||
goto dropping;
|
goto dropping;
|
||||||
} else {
|
} else {
|
||||||
struct net_device_stats *stats = &priv(dev)->stats;
|
struct net_device_stats *stats = &dev->stats;
|
||||||
ether3_outw(next_ptr >> 8, REG_RECVEND);
|
ether3_outw(next_ptr >> 8, REG_RECVEND);
|
||||||
if (status & RXSTAT_OVERSIZE) stats->rx_over_errors ++;
|
if (status & RXSTAT_OVERSIZE) stats->rx_over_errors ++;
|
||||||
if (status & RXSTAT_CRCERROR) stats->rx_crc_errors ++;
|
if (status & RXSTAT_CRCERROR) stats->rx_crc_errors ++;
|
||||||
|
@ -685,14 +673,14 @@ if (next_ptr < RX_START || next_ptr >= RX_END) {
|
||||||
while (-- maxcnt);
|
while (-- maxcnt);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
priv(dev)->stats.rx_packets += received;
|
dev->stats.rx_packets += received;
|
||||||
priv(dev)->rx_head = next_ptr;
|
priv(dev)->rx_head = next_ptr;
|
||||||
/*
|
/*
|
||||||
* If rx went off line, then that means that the buffer may be full. We
|
* If rx went off line, then that means that the buffer may be full. We
|
||||||
* have dropped at least one packet.
|
* have dropped at least one packet.
|
||||||
*/
|
*/
|
||||||
if (!(ether3_inw(REG_STATUS) & STAT_RXON)) {
|
if (!(ether3_inw(REG_STATUS) & STAT_RXON)) {
|
||||||
priv(dev)->stats.rx_dropped ++;
|
dev->stats.rx_dropped++;
|
||||||
ether3_outw(next_ptr, REG_RECVPTR);
|
ether3_outw(next_ptr, REG_RECVPTR);
|
||||||
ether3_outw(priv(dev)->regs.command | CMD_RXON, REG_COMMAND);
|
ether3_outw(priv(dev)->regs.command | CMD_RXON, REG_COMMAND);
|
||||||
}
|
}
|
||||||
|
@ -710,7 +698,7 @@ dropping:{
|
||||||
last_warned = jiffies;
|
last_warned = jiffies;
|
||||||
printk("%s: memory squeeze, dropping packet.\n", dev->name);
|
printk("%s: memory squeeze, dropping packet.\n", dev->name);
|
||||||
}
|
}
|
||||||
priv(dev)->stats.rx_dropped ++;
|
dev->stats.rx_dropped++;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -743,13 +731,13 @@ static void ether3_tx(struct net_device *dev)
|
||||||
* Update errors
|
* Update errors
|
||||||
*/
|
*/
|
||||||
if (!(status & (TXSTAT_BABBLED | TXSTAT_16COLLISIONS)))
|
if (!(status & (TXSTAT_BABBLED | TXSTAT_16COLLISIONS)))
|
||||||
priv(dev)->stats.tx_packets++;
|
dev->stats.tx_packets++;
|
||||||
else {
|
else {
|
||||||
priv(dev)->stats.tx_errors ++;
|
dev->stats.tx_errors++;
|
||||||
if (status & TXSTAT_16COLLISIONS)
|
if (status & TXSTAT_16COLLISIONS)
|
||||||
priv(dev)->stats.collisions += 16;
|
dev->stats.collisions += 16;
|
||||||
if (status & TXSTAT_BABBLED)
|
if (status & TXSTAT_BABBLED)
|
||||||
priv(dev)->stats.tx_fifo_errors ++;
|
dev->stats.tx_fifo_errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tx_tail = (tx_tail + 1) & 15;
|
tx_tail = (tx_tail + 1) & 15;
|
||||||
|
@ -773,7 +761,6 @@ static const struct net_device_ops ether3_netdev_ops = {
|
||||||
.ndo_open = ether3_open,
|
.ndo_open = ether3_open,
|
||||||
.ndo_stop = ether3_close,
|
.ndo_stop = ether3_close,
|
||||||
.ndo_start_xmit = ether3_sendpacket,
|
.ndo_start_xmit = ether3_sendpacket,
|
||||||
.ndo_get_stats = ether3_getstats,
|
|
||||||
.ndo_set_multicast_list = ether3_setmulticastlist,
|
.ndo_set_multicast_list = ether3_setmulticastlist,
|
||||||
.ndo_tx_timeout = ether3_timeout,
|
.ndo_tx_timeout = ether3_timeout,
|
||||||
.ndo_validate_addr = eth_validate_addr,
|
.ndo_validate_addr = eth_validate_addr,
|
||||||
|
|
|
@ -164,7 +164,6 @@ struct dev_priv {
|
||||||
unsigned char tx_head; /* buffer nr to insert next packet */
|
unsigned char tx_head; /* buffer nr to insert next packet */
|
||||||
unsigned char tx_tail; /* buffer nr of transmitting packet */
|
unsigned char tx_tail; /* buffer nr of transmitting packet */
|
||||||
unsigned int rx_head; /* address to fetch next packet from */
|
unsigned int rx_head; /* address to fetch next packet from */
|
||||||
struct net_device_stats stats;
|
|
||||||
struct timer_list timer;
|
struct timer_list timer;
|
||||||
int broken; /* 0 = ok, 1 = something went wrong */
|
int broken; /* 0 = ok, 1 = something went wrong */
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче