diff options
author | Nikita Danilov <ndanilov@marvell.com> | 2020-02-14 18:44:54 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-02-16 19:03:39 -0800 |
commit | b42726fcf76e9367e524392e0ead7e672cc0791c (patch) | |
tree | dfc31d08b459e89695870d85a730a8068cc036e3 /drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c | |
parent | f08a464c27ca0a4050333baa271504b27ce834b7 (diff) | |
download | linux-b42726fcf76e9367e524392e0ead7e672cc0791c.tar.gz linux-b42726fcf76e9367e524392e0ead7e672cc0791c.tar.bz2 linux-b42726fcf76e9367e524392e0ead7e672cc0791c.zip |
net: atlantic: better loopback mode handling
Add checks to not enable multiple loopback modes simultaneously,
It was also discovered that for dma loopback to function correctly
promisc mode should be enabled on device.
Fixes: ea4b4d7fc106 ("net: atlantic: loopback tests via private flags")
Signed-off-by: Nikita Danilov <ndanilov@marvell.com>
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Dmitry Bogdanov <dbogdanov@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c')
-rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c index a1f99bef4a68..7b55633d2cb9 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c @@ -722,6 +722,11 @@ static int aq_ethtool_set_priv_flags(struct net_device *ndev, u32 flags) if (flags & ~AQ_PRIV_FLAGS_MASK) return -EOPNOTSUPP; + if (hweight32((flags | priv_flags) & AQ_HW_LOOPBACK_MASK) > 1) { + netdev_info(ndev, "Can't enable more than one loopback simultaneously\n"); + return -EINVAL; + } + cfg->priv_flags = flags; if ((priv_flags ^ flags) & BIT(AQ_HW_LOOPBACK_DMA_NET)) { |