amd-xgbe: Verify forced speed matches the active speedset
authorLendacky, Thomas <Thomas.Lendacky@amd.com>
Wed, 17 Feb 2016 17:48:39 +0000 (11:48 -0600)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Feb 2016 20:22:19 +0000 (15:22 -0500)
When using ethtool to set the speed for the device, verify that the
specified speed is valid within the active speedset.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c

index 6040293db9c1694083ace197771a09245feea637..11d9f0c5b78bf819e59a1d71b385fbfaf7ed97bc 100644 (file)
@@ -6,7 +6,7 @@
  *
  * License 1: GPLv2
  *
- * Copyright (c) 2014 Advanced Micro Devices, Inc.
+ * Copyright (c) 2014-2016 Advanced Micro Devices, Inc.
  *
  * This file is free software; you may copy, redistribute and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -56,7 +56,7 @@
  *
  * License 2: Modified BSD
  *
- * Copyright (c) 2014 Advanced Micro Devices, Inc.
+ * Copyright (c) 2014-2016 Advanced Micro Devices, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -318,8 +318,20 @@ static int xgbe_set_settings(struct net_device *netdev,
        if (cmd->autoneg == AUTONEG_DISABLE) {
                switch (speed) {
                case SPEED_10000:
+                       break;
                case SPEED_2500:
+                       if (pdata->speed_set != XGBE_SPEEDSET_2500_10000) {
+                               netdev_err(netdev, "unsupported speed %u\n",
+                                          speed);
+                               return -EINVAL;
+                       }
+                       break;
                case SPEED_1000:
+                       if (pdata->speed_set != XGBE_SPEEDSET_1000_10000) {
+                               netdev_err(netdev, "unsupported speed %u\n",
+                                          speed);
+                               return -EINVAL;
+                       }
                        break;
                default:
                        netdev_err(netdev, "unsupported speed %u\n", speed);