sc92031: use net_device stats
Statistics structure is available for use in net_device structure. Compile tested only. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
10c6462090
commit
9c28eaea90
@ -311,7 +311,6 @@ struct sc92031_priv {
|
|||||||
|
|
||||||
/* for dev->get_stats */
|
/* for dev->get_stats */
|
||||||
long rx_value;
|
long rx_value;
|
||||||
struct net_device_stats stats;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* I don't know which registers can be safely read; however, I can guess
|
/* I don't know which registers can be safely read; however, I can guess
|
||||||
@ -421,7 +420,7 @@ static void _sc92031_tx_clear(struct net_device *dev)
|
|||||||
|
|
||||||
while (priv->tx_head - priv->tx_tail > 0) {
|
while (priv->tx_head - priv->tx_tail > 0) {
|
||||||
priv->tx_tail++;
|
priv->tx_tail++;
|
||||||
priv->stats.tx_dropped++;
|
dev->stats.tx_dropped++;
|
||||||
}
|
}
|
||||||
priv->tx_head = priv->tx_tail = 0;
|
priv->tx_head = priv->tx_tail = 0;
|
||||||
}
|
}
|
||||||
@ -676,27 +675,27 @@ static void _sc92031_tx_tasklet(struct net_device *dev)
|
|||||||
priv->tx_tail++;
|
priv->tx_tail++;
|
||||||
|
|
||||||
if (tx_status & TxStatOK) {
|
if (tx_status & TxStatOK) {
|
||||||
priv->stats.tx_bytes += tx_status & 0x1fff;
|
dev->stats.tx_bytes += tx_status & 0x1fff;
|
||||||
priv->stats.tx_packets++;
|
dev->stats.tx_packets++;
|
||||||
/* Note: TxCarrierLost is always asserted at 100mbps. */
|
/* Note: TxCarrierLost is always asserted at 100mbps. */
|
||||||
priv->stats.collisions += (tx_status >> 22) & 0xf;
|
dev->stats.collisions += (tx_status >> 22) & 0xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx_status & (TxOutOfWindow | TxAborted)) {
|
if (tx_status & (TxOutOfWindow | TxAborted)) {
|
||||||
priv->stats.tx_errors++;
|
dev->stats.tx_errors++;
|
||||||
|
|
||||||
if (tx_status & TxAborted)
|
if (tx_status & TxAborted)
|
||||||
priv->stats.tx_aborted_errors++;
|
dev->stats.tx_aborted_errors++;
|
||||||
|
|
||||||
if (tx_status & TxCarrierLost)
|
if (tx_status & TxCarrierLost)
|
||||||
priv->stats.tx_carrier_errors++;
|
dev->stats.tx_carrier_errors++;
|
||||||
|
|
||||||
if (tx_status & TxOutOfWindow)
|
if (tx_status & TxOutOfWindow)
|
||||||
priv->stats.tx_window_errors++;
|
dev->stats.tx_window_errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx_status & TxUnderrun)
|
if (tx_status & TxUnderrun)
|
||||||
priv->stats.tx_fifo_errors++;
|
dev->stats.tx_fifo_errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->tx_tail != old_tx_tail)
|
if (priv->tx_tail != old_tx_tail)
|
||||||
@ -704,27 +703,29 @@ static void _sc92031_tx_tasklet(struct net_device *dev)
|
|||||||
netif_wake_queue(dev);
|
netif_wake_queue(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _sc92031_rx_tasklet_error(u32 rx_status,
|
static void _sc92031_rx_tasklet_error(struct net_device *dev,
|
||||||
struct sc92031_priv *priv, unsigned rx_size)
|
u32 rx_status, unsigned rx_size)
|
||||||
{
|
{
|
||||||
if(rx_size > (MAX_ETH_FRAME_SIZE + 4) || rx_size < 16) {
|
if(rx_size > (MAX_ETH_FRAME_SIZE + 4) || rx_size < 16) {
|
||||||
priv->stats.rx_errors++;
|
dev->stats.rx_errors++;
|
||||||
priv->stats.rx_length_errors++;
|
dev->stats.rx_length_errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(rx_status & RxStatesOK)) {
|
if (!(rx_status & RxStatesOK)) {
|
||||||
priv->stats.rx_errors++;
|
dev->stats.rx_errors++;
|
||||||
|
|
||||||
if (rx_status & (RxHugeFrame | RxSmallFrame))
|
if (rx_status & (RxHugeFrame | RxSmallFrame))
|
||||||
priv->stats.rx_length_errors++;
|
dev->stats.rx_length_errors++;
|
||||||
|
|
||||||
if (rx_status & RxBadAlign)
|
if (rx_status & RxBadAlign)
|
||||||
priv->stats.rx_frame_errors++;
|
dev->stats.rx_frame_errors++;
|
||||||
|
|
||||||
if (!(rx_status & RxCRCOK))
|
if (!(rx_status & RxCRCOK))
|
||||||
priv->stats.rx_crc_errors++;
|
dev->stats.rx_crc_errors++;
|
||||||
} else
|
} else {
|
||||||
|
struct sc92031_priv *priv = netdev_priv(dev);
|
||||||
priv->rx_loss++;
|
priv->rx_loss++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _sc92031_rx_tasklet(struct net_device *dev)
|
static void _sc92031_rx_tasklet(struct net_device *dev)
|
||||||
@ -783,7 +784,7 @@ static void _sc92031_rx_tasklet(struct net_device *dev)
|
|||||||
|| rx_size > (MAX_ETH_FRAME_SIZE + 4)
|
|| rx_size > (MAX_ETH_FRAME_SIZE + 4)
|
||||||
|| rx_size < 16
|
|| rx_size < 16
|
||||||
|| !(rx_status & RxStatesOK))) {
|
|| !(rx_status & RxStatesOK))) {
|
||||||
_sc92031_rx_tasklet_error(rx_status, priv, rx_size);
|
_sc92031_rx_tasklet_error(dev, rx_status, rx_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -818,11 +819,11 @@ static void _sc92031_rx_tasklet(struct net_device *dev)
|
|||||||
dev->last_rx = jiffies;
|
dev->last_rx = jiffies;
|
||||||
netif_rx(skb);
|
netif_rx(skb);
|
||||||
|
|
||||||
priv->stats.rx_bytes += pkt_size;
|
dev->stats.rx_bytes += pkt_size;
|
||||||
priv->stats.rx_packets++;
|
dev->stats.rx_packets++;
|
||||||
|
|
||||||
if (rx_status & Rx_Multicast)
|
if (rx_status & Rx_Multicast)
|
||||||
priv->stats.multicast++;
|
dev->stats.multicast++;
|
||||||
|
|
||||||
next:
|
next:
|
||||||
rx_ring_offset = (rx_ring_offset + rx_size_align) % RX_BUF_LEN;
|
rx_ring_offset = (rx_ring_offset + rx_size_align) % RX_BUF_LEN;
|
||||||
@ -835,13 +836,11 @@ static void _sc92031_rx_tasklet(struct net_device *dev)
|
|||||||
|
|
||||||
static void _sc92031_link_tasklet(struct net_device *dev)
|
static void _sc92031_link_tasklet(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct sc92031_priv *priv = netdev_priv(dev);
|
|
||||||
|
|
||||||
if (_sc92031_check_media(dev))
|
if (_sc92031_check_media(dev))
|
||||||
netif_wake_queue(dev);
|
netif_wake_queue(dev);
|
||||||
else {
|
else {
|
||||||
netif_stop_queue(dev);
|
netif_stop_queue(dev);
|
||||||
priv->stats.tx_carrier_errors++;
|
dev->stats.tx_carrier_errors++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -866,11 +865,11 @@ static void sc92031_tasklet(unsigned long data)
|
|||||||
_sc92031_rx_tasklet(dev);
|
_sc92031_rx_tasklet(dev);
|
||||||
|
|
||||||
if (intr_status & RxOverflow)
|
if (intr_status & RxOverflow)
|
||||||
priv->stats.rx_errors++;
|
dev->stats.rx_errors++;
|
||||||
|
|
||||||
if (intr_status & TimeOut) {
|
if (intr_status & TimeOut) {
|
||||||
priv->stats.rx_errors++;
|
dev->stats.rx_errors++;
|
||||||
priv->stats.rx_length_errors++;
|
dev->stats.rx_length_errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intr_status & (LinkFail | LinkOK))
|
if (intr_status & (LinkFail | LinkOK))
|
||||||
@ -936,15 +935,14 @@ static struct net_device_stats *sc92031_get_stats(struct net_device *dev)
|
|||||||
|
|
||||||
if (temp == 0xffff) {
|
if (temp == 0xffff) {
|
||||||
priv->rx_value += temp;
|
priv->rx_value += temp;
|
||||||
priv->stats.rx_fifo_errors = priv->rx_value;
|
dev->stats.rx_fifo_errors = priv->rx_value;
|
||||||
} else {
|
} else
|
||||||
priv->stats.rx_fifo_errors = temp + priv->rx_value;
|
dev->stats.rx_fifo_errors = temp + priv->rx_value;
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_bh(&priv->lock);
|
spin_unlock_bh(&priv->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return &priv->stats;
|
return &dev->stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
@ -959,7 +957,7 @@ static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||||||
|
|
||||||
if (unlikely(skb->len > TX_BUF_SIZE)) {
|
if (unlikely(skb->len > TX_BUF_SIZE)) {
|
||||||
err = -EMSGSIZE;
|
err = -EMSGSIZE;
|
||||||
priv->stats.tx_dropped++;
|
dev->stats.tx_dropped++;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -967,7 +965,7 @@ static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||||||
|
|
||||||
if (unlikely(!netif_carrier_ok(dev))) {
|
if (unlikely(!netif_carrier_ok(dev))) {
|
||||||
err = -ENOLINK;
|
err = -ENOLINK;
|
||||||
priv->stats.tx_dropped++;
|
dev->stats.tx_dropped++;
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user