Commit 6cf96dd4 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller

r8169: improve rtl_get_coalesce

Use FIELD_GET() macro to make the code better readable. In addition
change the logic to round the time limit up, not down. Reason is that
a time limit <1us would be rounded to 0 currently, what would be
interpreted as "no time limit set".
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2815b305
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/bitfield.h>
#include <linux/prefetch.h> #include <linux/prefetch.h>
#include <linux/ipv6.h> #include <linux/ipv6.h>
#include <net/ip6_checksum.h> #include <net/ip6_checksum.h>
...@@ -229,6 +230,11 @@ enum rtl_registers { ...@@ -229,6 +230,11 @@ enum rtl_registers {
CPlusCmd = 0xe0, CPlusCmd = 0xe0,
IntrMitigate = 0xe2, IntrMitigate = 0xe2,
#define RTL_COALESCE_TX_USECS GENMASK(15, 12)
#define RTL_COALESCE_TX_FRAMES GENMASK(11, 8)
#define RTL_COALESCE_RX_USECS GENMASK(7, 4)
#define RTL_COALESCE_RX_FRAMES GENMASK(3, 0)
#define RTL_COALESCE_MASK 0x0f #define RTL_COALESCE_MASK 0x0f
#define RTL_COALESCE_SHIFT 4 #define RTL_COALESCE_SHIFT 4
#define RTL_COALESCE_T_MAX (RTL_COALESCE_MASK) #define RTL_COALESCE_T_MAX (RTL_COALESCE_MASK)
...@@ -1815,16 +1821,8 @@ static int rtl_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) ...@@ -1815,16 +1821,8 @@ static int rtl_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
{ {
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
const struct rtl_coalesce_info *ci; const struct rtl_coalesce_info *ci;
struct { u32 scale, c_us, c_fr;
u32 *max_frames; u16 intrmit;
u32 *usecs;
} coal_settings [] = {
{ &ec->rx_max_coalesced_frames, &ec->rx_coalesce_usecs },
{ &ec->tx_max_coalesced_frames, &ec->tx_coalesce_usecs }
}, *p = coal_settings;
u32 scale;
int i;
u16 w;
if (rtl_is_8125(tp)) if (rtl_is_8125(tp))
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -1838,24 +1836,20 @@ static int rtl_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) ...@@ -1838,24 +1836,20 @@ static int rtl_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
scale = ci->scale_nsecs[tp->cp_cmd & INTT_MASK]; scale = ci->scale_nsecs[tp->cp_cmd & INTT_MASK];
/* read IntrMitigate and adjust according to scale */ intrmit = RTL_R16(tp, IntrMitigate);
for (w = RTL_R16(tp, IntrMitigate); w; w >>= RTL_COALESCE_SHIFT, p++) {
*p->max_frames = (w & RTL_COALESCE_MASK) << 2;
w >>= RTL_COALESCE_SHIFT;
*p->usecs = w & RTL_COALESCE_MASK;
}
for (i = 0; i < 2; i++) { c_us = FIELD_GET(RTL_COALESCE_TX_USECS, intrmit);
p = coal_settings + i; ec->tx_coalesce_usecs = DIV_ROUND_UP(c_us * scale, 1000);
*p->usecs = (*p->usecs * scale) / 1000;
/* c_fr = FIELD_GET(RTL_COALESCE_TX_FRAMES, intrmit);
* ethtool_coalesce says it is illegal to set both usecs and /* ethtool_coalesce states usecs and max_frames must not both be 0 */
* max_frames to 0. ec->tx_max_coalesced_frames = (c_us || c_fr) ? c_fr * 4 : 1;
*/
if (!*p->usecs && !*p->max_frames) c_us = FIELD_GET(RTL_COALESCE_RX_USECS, intrmit);
*p->max_frames = 1; ec->rx_coalesce_usecs = DIV_ROUND_UP(c_us * scale, 1000);
}
c_fr = FIELD_GET(RTL_COALESCE_RX_FRAMES, intrmit);
ec->rx_max_coalesced_frames = (c_us || c_fr) ? c_fr * 4 : 1;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment