diff options
-rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_main.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qede/qede_ethtool.c | 14 | ||||
-rw-r--r-- | include/linux/qed/qed_if.h | 10 |
3 files changed, 26 insertions, 4 deletions
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index 1e9f321f1ac4..d189871e8e23 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c | |||
@@ -915,6 +915,11 @@ static u32 qed_sb_release(struct qed_dev *cdev, | |||
915 | return rc; | 915 | return rc; |
916 | } | 916 | } |
917 | 917 | ||
918 | static bool qed_can_link_change(struct qed_dev *cdev) | ||
919 | { | ||
920 | return true; | ||
921 | } | ||
922 | |||
918 | static int qed_set_link(struct qed_dev *cdev, | 923 | static int qed_set_link(struct qed_dev *cdev, |
919 | struct qed_link_params *params) | 924 | struct qed_link_params *params) |
920 | { | 925 | { |
@@ -1177,6 +1182,7 @@ const struct qed_common_ops qed_common_ops_pass = { | |||
1177 | .sb_release = &qed_sb_release, | 1182 | .sb_release = &qed_sb_release, |
1178 | .simd_handler_config = &qed_simd_handler_config, | 1183 | .simd_handler_config = &qed_simd_handler_config, |
1179 | .simd_handler_clean = &qed_simd_handler_clean, | 1184 | .simd_handler_clean = &qed_simd_handler_clean, |
1185 | .can_link_change = &qed_can_link_change, | ||
1180 | .set_link = &qed_set_link, | 1186 | .set_link = &qed_set_link, |
1181 | .get_link = &qed_get_current_link, | 1187 | .get_link = &qed_get_current_link, |
1182 | .drain = &qed_drain, | 1188 | .drain = &qed_drain, |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c index 2ac98d44c1e1..f1dd25ac5552 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c +++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c | |||
@@ -239,9 +239,9 @@ static int qede_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
239 | struct qed_link_params params; | 239 | struct qed_link_params params; |
240 | u32 speed; | 240 | u32 speed; |
241 | 241 | ||
242 | if (!edev->dev_info.common.is_mf_default) { | 242 | if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) { |
243 | DP_INFO(edev, | 243 | DP_INFO(edev, |
244 | "Link parameters can not be changed in non-default mode\n"); | 244 | "Link settings are not allowed to be changed\n"); |
245 | return -EOPNOTSUPP; | 245 | return -EOPNOTSUPP; |
246 | } | 246 | } |
247 | 247 | ||
@@ -350,6 +350,12 @@ static int qede_nway_reset(struct net_device *dev) | |||
350 | struct qed_link_output current_link; | 350 | struct qed_link_output current_link; |
351 | struct qed_link_params link_params; | 351 | struct qed_link_params link_params; |
352 | 352 | ||
353 | if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) { | ||
354 | DP_INFO(edev, | ||
355 | "Link settings are not allowed to be changed\n"); | ||
356 | return -EOPNOTSUPP; | ||
357 | } | ||
358 | |||
353 | if (!netif_running(dev)) | 359 | if (!netif_running(dev)) |
354 | return 0; | 360 | return 0; |
355 | 361 | ||
@@ -450,9 +456,9 @@ static int qede_set_pauseparam(struct net_device *dev, | |||
450 | struct qed_link_params params; | 456 | struct qed_link_params params; |
451 | struct qed_link_output current_link; | 457 | struct qed_link_output current_link; |
452 | 458 | ||
453 | if (!edev->dev_info.common.is_mf_default) { | 459 | if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) { |
454 | DP_INFO(edev, | 460 | DP_INFO(edev, |
455 | "Pause parameters can not be updated in non-default mode\n"); | 461 | "Pause settings are not allowed to be changed\n"); |
456 | return -EOPNOTSUPP; | 462 | return -EOPNOTSUPP; |
457 | } | 463 | } |
458 | 464 | ||
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h index 82a7fe011068..e5de42b62976 100644 --- a/include/linux/qed/qed_if.h +++ b/include/linux/qed/qed_if.h | |||
@@ -211,6 +211,16 @@ struct qed_common_ops { | |||
211 | 211 | ||
212 | void (*simd_handler_clean)(struct qed_dev *cdev, | 212 | void (*simd_handler_clean)(struct qed_dev *cdev, |
213 | int index); | 213 | int index); |
214 | |||
215 | /** | ||
216 | * @brief can_link_change - can the instance change the link or not | ||
217 | * | ||
218 | * @param cdev | ||
219 | * | ||
220 | * @return true if link-change is allowed, false otherwise. | ||
221 | */ | ||
222 | bool (*can_link_change)(struct qed_dev *cdev); | ||
223 | |||
214 | /** | 224 | /** |
215 | * @brief set_link - set links according to params | 225 | * @brief set_link - set links according to params |
216 | * | 226 | * |