diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 21 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 10 |
4 files changed, 36 insertions, 5 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index 33c35d3b7420..5d47307121ab 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h | |||
@@ -317,6 +317,7 @@ struct i40e_pf { | |||
317 | #endif | 317 | #endif |
318 | #define I40E_FLAG_PORT_ID_VALID (u64)(1 << 28) | 318 | #define I40E_FLAG_PORT_ID_VALID (u64)(1 << 28) |
319 | #define I40E_FLAG_DCB_CAPABLE (u64)(1 << 29) | 319 | #define I40E_FLAG_DCB_CAPABLE (u64)(1 << 29) |
320 | #define I40E_FLAG_VEB_MODE_ENABLED BIT_ULL(40) | ||
320 | 321 | ||
321 | /* tracks features that get auto disabled by errors */ | 322 | /* tracks features that get auto disabled by errors */ |
322 | u64 auto_disable_flags; | 323 | u64 auto_disable_flags; |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c index 34170eabca7d..da0faf478af0 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c | |||
@@ -1021,6 +1021,15 @@ static ssize_t i40e_dbg_command_write(struct file *filp, | |||
1021 | goto command_write_done; | 1021 | goto command_write_done; |
1022 | } | 1022 | } |
1023 | 1023 | ||
1024 | /* By default we are in VEPA mode, if this is the first VF/VMDq | ||
1025 | * VSI to be added switch to VEB mode. | ||
1026 | */ | ||
1027 | if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) { | ||
1028 | pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; | ||
1029 | i40e_do_reset_safe(pf, | ||
1030 | BIT_ULL(__I40E_PF_RESET_REQUESTED)); | ||
1031 | } | ||
1032 | |||
1024 | vsi = i40e_vsi_setup(pf, I40E_VSI_VMDQ2, vsi_seid, 0); | 1033 | vsi = i40e_vsi_setup(pf, I40E_VSI_VMDQ2, vsi_seid, 0); |
1025 | if (vsi) | 1034 | if (vsi) |
1026 | dev_info(&pf->pdev->dev, "added VSI %d to relay %d\n", | 1035 | dev_info(&pf->pdev->dev, "added VSI %d to relay %d\n", |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index a54c14491e3b..853eb2f7e558 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -6097,6 +6097,10 @@ static int i40e_reconstitute_veb(struct i40e_veb *veb) | |||
6097 | if (ret) | 6097 | if (ret) |
6098 | goto end_reconstitute; | 6098 | goto end_reconstitute; |
6099 | 6099 | ||
6100 | if (pf->flags & I40E_FLAG_VEB_MODE_ENABLED) | ||
6101 | veb->bridge_mode = BRIDGE_MODE_VEB; | ||
6102 | else | ||
6103 | veb->bridge_mode = BRIDGE_MODE_VEPA; | ||
6100 | i40e_config_bridge_mode(veb); | 6104 | i40e_config_bridge_mode(veb); |
6101 | 6105 | ||
6102 | /* create the remaining VSIs attached to this VEB */ | 6106 | /* create the remaining VSIs attached to this VEB */ |
@@ -8031,7 +8035,12 @@ static int i40e_ndo_bridge_setlink(struct net_device *dev, | |||
8031 | } else if (mode != veb->bridge_mode) { | 8035 | } else if (mode != veb->bridge_mode) { |
8032 | /* Existing HW bridge but different mode needs reset */ | 8036 | /* Existing HW bridge but different mode needs reset */ |
8033 | veb->bridge_mode = mode; | 8037 | veb->bridge_mode = mode; |
8034 | i40e_do_reset(pf, (1 << __I40E_PF_RESET_REQUESTED)); | 8038 | /* TODO: If no VFs or VMDq VSIs, disallow VEB mode */ |
8039 | if (mode == BRIDGE_MODE_VEB) | ||
8040 | pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; | ||
8041 | else | ||
8042 | pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; | ||
8043 | i40e_do_reset(pf, BIT_ULL(__I40E_PF_RESET_REQUESTED)); | ||
8035 | break; | 8044 | break; |
8036 | } | 8045 | } |
8037 | } | 8046 | } |
@@ -8343,11 +8352,12 @@ static int i40e_add_vsi(struct i40e_vsi *vsi) | |||
8343 | ctxt.uplink_seid = vsi->uplink_seid; | 8352 | ctxt.uplink_seid = vsi->uplink_seid; |
8344 | ctxt.connection_type = I40E_AQ_VSI_CONN_TYPE_NORMAL; | 8353 | ctxt.connection_type = I40E_AQ_VSI_CONN_TYPE_NORMAL; |
8345 | ctxt.flags = I40E_AQ_VSI_TYPE_PF; | 8354 | ctxt.flags = I40E_AQ_VSI_TYPE_PF; |
8346 | if (i40e_is_vsi_uplink_mode_veb(vsi)) { | 8355 | if ((pf->flags & I40E_FLAG_VEB_MODE_ENABLED) && |
8356 | (i40e_is_vsi_uplink_mode_veb(vsi))) { | ||
8347 | ctxt.info.valid_sections |= | 8357 | ctxt.info.valid_sections |= |
8348 | cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID); | 8358 | cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID); |
8349 | ctxt.info.switch_id = | 8359 | ctxt.info.switch_id = |
8350 | cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB); | 8360 | cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB); |
8351 | } | 8361 | } |
8352 | i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true); | 8362 | i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true); |
8353 | break; | 8363 | break; |
@@ -8746,6 +8756,9 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type, | |||
8746 | __func__); | 8756 | __func__); |
8747 | return NULL; | 8757 | return NULL; |
8748 | } | 8758 | } |
8759 | /* We come up by default in VEPA mode */ | ||
8760 | veb->bridge_mode = BRIDGE_MODE_VEPA; | ||
8761 | pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; | ||
8749 | i40e_config_bridge_mode(veb); | 8762 | i40e_config_bridge_mode(veb); |
8750 | } | 8763 | } |
8751 | for (i = 0; i < I40E_MAX_VEB && !veb; i++) { | 8764 | for (i = 0; i < I40E_MAX_VEB && !veb; i++) { |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index 78d1c4ff565e..4e9376da0518 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | |||
@@ -1018,11 +1018,19 @@ int i40e_pci_sriov_configure(struct pci_dev *pdev, int num_vfs) | |||
1018 | { | 1018 | { |
1019 | struct i40e_pf *pf = pci_get_drvdata(pdev); | 1019 | struct i40e_pf *pf = pci_get_drvdata(pdev); |
1020 | 1020 | ||
1021 | if (num_vfs) | 1021 | if (num_vfs) { |
1022 | if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) { | ||
1023 | pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; | ||
1024 | i40e_do_reset_safe(pf, | ||
1025 | BIT_ULL(__I40E_PF_RESET_REQUESTED)); | ||
1026 | } | ||
1022 | return i40e_pci_sriov_enable(pdev, num_vfs); | 1027 | return i40e_pci_sriov_enable(pdev, num_vfs); |
1028 | } | ||
1023 | 1029 | ||
1024 | if (!pci_vfs_assigned(pf->pdev)) { | 1030 | if (!pci_vfs_assigned(pf->pdev)) { |
1025 | i40e_free_vfs(pf); | 1031 | i40e_free_vfs(pf); |
1032 | pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; | ||
1033 | i40e_do_reset_safe(pf, BIT_ULL(__I40E_PF_RESET_REQUESTED)); | ||
1026 | } else { | 1034 | } else { |
1027 | dev_warn(&pdev->dev, "Unable to free VFs because some are assigned to VMs.\n"); | 1035 | dev_warn(&pdev->dev, "Unable to free VFs because some are assigned to VMs.\n"); |
1028 | return -EINVAL; | 1036 | return -EINVAL; |