Merge tag 'kvm-ppc-next-5.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/paulu...
[linux-2.6-microblaze.git] / net / ethtool / ioctl.c
index 593fa66..b5df90c 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/phy.h>
 #include <linux/bitops.h>
 #include <linux/uaccess.h>
-#include <linux/vermagic.h>
 #include <linux/vmalloc.h>
 #include <linux/sfp.h>
 #include <linux/slab.h>
 #include <linux/sched/signal.h>
 #include <linux/net.h>
 #include <net/devlink.h>
-#include <net/xdp_sock.h>
+#include <net/xdp_sock_drv.h>
 #include <net/flow_offload.h>
 #include <linux/ethtool_netlink.h>
-
+#include <generated/utsrelease.h>
 #include "common.h"
 
 /*
@@ -553,6 +552,8 @@ static int ethtool_get_link_ksettings(struct net_device *dev,
        link_ksettings.base.cmd = ETHTOOL_GLINKSETTINGS;
        link_ksettings.base.link_mode_masks_nwords
                = __ETHTOOL_LINK_MODE_MASK_NU32;
+       link_ksettings.base.master_slave_cfg = MASTER_SLAVE_CFG_UNSUPPORTED;
+       link_ksettings.base.master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
 
        return store_link_ksettings_for_user(useraddr, &link_ksettings);
 }
@@ -590,6 +591,10 @@ static int ethtool_set_link_ksettings(struct net_device *dev,
            != link_ksettings.base.link_mode_masks_nwords)
                return -EINVAL;
 
+       if (link_ksettings.base.master_slave_cfg ||
+           link_ksettings.base.master_slave_state)
+               return -EINVAL;
+
        err = dev->ethtool_ops->set_link_ksettings(dev, &link_ksettings);
        if (err >= 0) {
                ethtool_notify(dev, ETHTOOL_MSG_LINKINFO_NTF, NULL);
@@ -1505,11 +1510,14 @@ static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev,
                                                   void __user *useraddr)
 {
        struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
+       int ret;
 
        if (!dev->ethtool_ops->get_coalesce)
                return -EOPNOTSUPP;
 
-       dev->ethtool_ops->get_coalesce(dev, &coalesce);
+       ret = dev->ethtool_ops->get_coalesce(dev, &coalesce);
+       if (ret)
+               return ret;
 
        if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
                return -EFAULT;
@@ -1664,6 +1672,12 @@ static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
 
        dev->ethtool_ops->get_channels(dev, &curr);
 
+       if (channels.rx_count == curr.rx_count &&
+           channels.tx_count == curr.tx_count &&
+           channels.combined_count == curr.combined_count &&
+           channels.other_count == curr.other_count)
+               return 0;
+
        /* ensure new counts are within the maximums */
        if (channels.rx_count > curr.max_rx ||
            channels.tx_count > curr.max_tx ||
@@ -1671,6 +1685,11 @@ static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
            channels.other_count > curr.max_other)
                return -EINVAL;
 
+       /* ensure there is at least one RX and one TX channel */
+       if (!channels.combined_count &&
+           (!channels.rx_count || !channels.tx_count))
+               return -EINVAL;
+
        /* ensure the new Rx count fits within the configured Rx flow
         * indirection table settings */
        if (netif_is_rxfh_configured(dev) &&