diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2016-11-01 10:50:01 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-11-01 12:17:16 -0400 |
commit | b9b84fc07dbc6ac74d85f1b1a401b41c403fecb1 (patch) | |
tree | e938511fe8a1bbf73eed926c1f96cac7d0da86fc | |
parent | 42fb18fd5852dba9c43ac008558e4bc8062bda57 (diff) | |
download | linux-stable-b9b84fc07dbc6ac74d85f1b1a401b41c403fecb1.tar.gz linux-stable-b9b84fc07dbc6ac74d85f1b1a401b41c403fecb1.tar.bz2 linux-stable-b9b84fc07dbc6ac74d85f1b1a401b41c403fecb1.zip |
net: mv643xx_eth: ensure coalesce settings survive read-modify-write
The coalesce settings behave badly when changing just one value:
... # ethtool -c eth0
rx-usecs: 249
... # ethtool -C eth0 tx-usecs 250
... # ethtool -c eth0
rx-usecs: 248
This occurs due to rounding errors when calculating the microseconds
value - the divisons round down. This causes (eg) the rx-usecs to
decrease by one every time the tx-usecs value is set as per the above.
Fix this by making the divison round-to-nearest.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/marvell/mv643xx_eth.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c index bf5cc55ba24c..5b12022adf1f 100644 --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c @@ -1381,6 +1381,7 @@ static unsigned int get_rx_coal(struct mv643xx_eth_private *mp) temp = (val & 0x003fff00) >> 8; temp *= 64000000; + temp += mp->t_clk / 2; do_div(temp, mp->t_clk); return (unsigned int)temp; @@ -1417,6 +1418,7 @@ static unsigned int get_tx_coal(struct mv643xx_eth_private *mp) temp = (rdlp(mp, TX_FIFO_URGENT_THRESHOLD) & 0x3fff0) >> 4; temp *= 64000000; + temp += mp->t_clk / 2; do_div(temp, mp->t_clk); return (unsigned int)temp; |