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

Commit cbd52281 authored by Anton Blanchard's avatar Anton Blanchard Committed by David S. Miller
Browse files

ibmveth: Fix endian issues with rx_no_buffer statistic



Hidden away in the last 8 bytes of the buffer_list page is a solitary
statistic. It needs to be byte swapped or else ethtool -S will
produce numbers that terrify the user.

Since we do this in multiple places, create a helper function with a
comment explaining what is going on.

Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c10e4caf
Loading
Loading
Loading
Loading
+14 −4
Original line number Original line Diff line number Diff line
@@ -292,6 +292,18 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter,
	atomic_add(buffers_added, &(pool->available));
	atomic_add(buffers_added, &(pool->available));
}
}


/*
 * The final 8 bytes of the buffer list is a counter of frames dropped
 * because there was not a buffer in the buffer list capable of holding
 * the frame.
 */
static void ibmveth_update_rx_no_buffer(struct ibmveth_adapter *adapter)
{
	__be64 *p = adapter->buffer_list_addr + 4096 - 8;

	adapter->rx_no_buffer = be64_to_cpup(p);
}

/* replenish routine */
/* replenish routine */
static void ibmveth_replenish_task(struct ibmveth_adapter *adapter)
static void ibmveth_replenish_task(struct ibmveth_adapter *adapter)
{
{
@@ -307,8 +319,7 @@ static void ibmveth_replenish_task(struct ibmveth_adapter *adapter)
			ibmveth_replenish_buffer_pool(adapter, pool);
			ibmveth_replenish_buffer_pool(adapter, pool);
	}
	}


	adapter->rx_no_buffer = *(u64 *)(((char*)adapter->buffer_list_addr) +
	ibmveth_update_rx_no_buffer(adapter);
						4096 - 8);
}
}


/* empty and free ana buffer pool - also used to do cleanup in error paths */
/* empty and free ana buffer pool - also used to do cleanup in error paths */
@@ -698,8 +709,7 @@ static int ibmveth_close(struct net_device *netdev)


	free_irq(netdev->irq, netdev);
	free_irq(netdev->irq, netdev);


	adapter->rx_no_buffer = *(u64 *)(((char *)adapter->buffer_list_addr) +
	ibmveth_update_rx_no_buffer(adapter);
						4096 - 8);


	ibmveth_cleanup(adapter);
	ibmveth_cleanup(adapter);