aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuval Mintz <Yuval.Mintz@qlogic.com>2016-04-22 01:41:03 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-25 15:59:16 -0400
commitfe7cd2bfdac4d8739bc8665eef040e668e6b428f (patch)
tree70871cf996964bb9d544bf5adb554cc7c0968108
parentf3e72109f04c36ee45e62c0e6e1323179287c3e4 (diff)
qed*: Conditions for changing link
There's some inconsistency in current logic determining whether the link settings of a given interface can be changed; I.e., in all modes other than the so-called `deault' mode the interfaces are forbidden from changing the configuration - but even this rule is not applied to all user APIs that may change the configuration. Instead, let the core-module [qed] decide whether an interface can change the configuration by supporting a new API function. We also revise the current rule, allowing all interfaces to change their configurations while laying the infrastructure for future modes where an interface would be blocked from making such a configuration. Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_main.c6
-rw-r--r--drivers/net/ethernet/qlogic/qede/qede_ethtool.c14
-rw-r--r--include/linux/qed/qed_if.h10
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
918static bool qed_can_link_change(struct qed_dev *cdev)
919{
920 return true;
921}
922
918static int qed_set_link(struct qed_dev *cdev, 923static 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 *