Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c28eaea authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Jeff Garzik
Browse files

sc92031: use net_device stats



Statistics structure is available for use in net_device structure.
Compile tested only.

Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 10c64620
Loading
Loading
Loading
Loading
+34 −36
Original line number Original line Diff line number Diff line
@@ -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,28 +703,30 @@ 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;
	}
	}