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

Commit 200eef20 authored by Dhananjay Phadke's avatar Dhananjay Phadke Committed by David S. Miller
Browse files

netxen: ethtool fixes



Resubmitting the patch.

This patch improves ethtool support for printing correct ring statistics,
segmentation offload status, etc.

Signed-off by: Dhananjay Phadke <dhananjay@netxen.com>

Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 1d3bb996
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -919,7 +919,7 @@ struct netxen_adapter {
	u16 link_duplex;
	u16 state;
	u16 link_autoneg;
	int rcsum;
	int rx_csum;
	int status;
	spinlock_t stats_lock;

+21 −6
Original line number Diff line number Diff line
@@ -516,17 +516,17 @@ netxen_nic_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring)
	ring->rx_jumbo_pending = 0;
	for (i = 0; i < MAX_RCV_CTX; ++i) {
		ring->rx_pending += adapter->recv_ctx[i].
		    rcv_desc[RCV_DESC_NORMAL_CTXID].rcv_pending;
		    rcv_desc[RCV_DESC_NORMAL_CTXID].max_rx_desc_count;
		ring->rx_jumbo_pending += adapter->recv_ctx[i].
		    rcv_desc[RCV_DESC_JUMBO_CTXID].rcv_pending;
		    rcv_desc[RCV_DESC_JUMBO_CTXID].max_rx_desc_count;
	}
	ring->tx_pending = adapter->max_tx_desc_count;

	ring->rx_max_pending = adapter->max_rx_desc_count;
	ring->tx_max_pending = adapter->max_tx_desc_count;
	ring->rx_jumbo_max_pending = adapter->max_jumbo_rx_desc_count;
	ring->rx_max_pending = MAX_RCV_DESCRIPTORS;
	ring->tx_max_pending = MAX_CMD_DESCRIPTORS_HOST;
	ring->rx_jumbo_max_pending = MAX_JUMBO_RCV_DESCRIPTORS;
	ring->rx_mini_max_pending = 0;
	ring->rx_mini_pending = 0;
	ring->rx_jumbo_pending = 0;
}

static void
@@ -731,6 +731,19 @@ netxen_nic_get_ethtool_stats(struct net_device *dev,
	}
}

static u32 netxen_nic_get_rx_csum(struct net_device *dev)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	return adapter->rx_csum;
}

static int netxen_nic_set_rx_csum(struct net_device *dev, u32 data)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	adapter->rx_csum = !!data;
	return 0;
}

struct ethtool_ops netxen_nic_ethtool_ops = {
	.get_settings = netxen_nic_get_settings,
	.set_settings = netxen_nic_set_settings,
@@ -751,4 +764,6 @@ struct ethtool_ops netxen_nic_ethtool_ops = {
	.get_strings = netxen_nic_get_strings,
	.get_ethtool_stats = netxen_nic_get_ethtool_stats,
	.get_sset_count = netxen_get_sset_count,
	.get_rx_csum = netxen_nic_get_rx_csum,
	.set_rx_csum = netxen_nic_set_rx_csum,
};
+5 −2
Original line number Diff line number Diff line
@@ -1118,10 +1118,13 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid,

	skb = (struct sk_buff *)buffer->skb;

	if (likely(netxen_get_sts_status(desc) == STATUS_CKSUM_OK)) {
	if (likely(adapter->rx_csum &&
				netxen_get_sts_status(desc) == STATUS_CKSUM_OK)) {
		adapter->stats.csummed++;
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	}
	} else
		skb->ip_summed = CHECKSUM_NONE;

	skb->dev = netdev;
	if (desc_ctx == RCV_DESC_LRO_CTXID) {
		/* True length was only available on the last pkt */
+1 −0
Original line number Diff line number Diff line
@@ -409,6 +409,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	/* This will be reset for mezz cards  */
	adapter->portnum = pci_func_id;
	adapter->status   &= ~NETXEN_NETDEV_STATUS;
	adapter->rx_csum = 1;

	netdev->open		   = netxen_nic_open;
	netdev->stop		   = netxen_nic_close;