Skip to content

Commit 0b2fda8

Browse files
committed
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
Jeff Kirsher says: ==================== Intel Wired LAN Driver Updates 2014-06-24 This series contains updates to i40e and i40evf. Greg provides a patch to stop the VF device after setting its MAC address. This is due to if the host VMM administrator has changed the VF device's MAC address then the i40e driver needs to halt the VF device so that the administrator will be forced to reload the VF driver so that the VF driver will start using the newly assigned MAC address. Shannon provides several patches for i40e, first makes prep_for_test() a void function since the return value was being ignored for the most part by all its callers. Adds a log warning when the firmware's API minor/major number is not what we expect to assist the user by informing them they may need to update their NVM or SW. Cleans up a stray print message so that it is similar to other print messages. Ensures to set the WoL flag when setting LAA and allow the user to set LAA again. So do not short-circuit the LAA assignment when the driver thinks it has already been done as it is possible that the user might want to force the address setting again. Provides a couple more LAA fixes to ensure the LAA gets restored after resets. Neerav provides a patch for i40e to add a PF reset when a malicious driver event for the PF occurs. As per the specification when the PF driver receives a malicious driver event the queue that caused the event is already stopped and it is expected that the function that owns the queue will reset the queue, but in some cases it may not be possible to determine the queue, so it is suggested to reset the whole function. Carolyn fixes ethtool coalesce settings to allow 0 as a disable value and adds message to user about invalid values. Jesse removes a reserved type which was not removed from the code. Catherine provides a patch to add the ability to enable/disable link from set_link)restart_an() which will make it easy to toggle link without calling set_phy_config() when no other link settings need to change. Anjali provides a patch to ensure we do a PF reset on Tx hang and that way we avoid any Malicious Driver Detect (MDD) events because of a Tx queue disable failure. v2: - fixed the un-needed return in patch 2 based on feedback from Sergei Shtylyov - added punctuation to print statements and code comment based on feedback from Sergei Shtylyov ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents a69f5ed + 25941f9 commit 0b2fda8

File tree

11 files changed

+128
-49
lines changed

11 files changed

+128
-49
lines changed

drivers/net/ethernet/intel/i40e/i40e.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ struct i40e_mac_filter {
362362
bool is_vf; /* filter belongs to a VF */
363363
bool is_netdev; /* filter belongs to a netdev */
364364
bool changed; /* filter needs to be sync'd to the HW */
365+
bool is_laa; /* filter is a Locally Administered Address */
365366
};
366367

367368
struct i40e_veb {
@@ -617,6 +618,7 @@ static inline void i40e_dbg_init(void) {}
617618
static inline void i40e_dbg_exit(void) {}
618619
#endif /* CONFIG_DEBUG_FS*/
619620
void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector);
621+
void i40e_irq_dynamic_disable(struct i40e_vsi *vsi, int vector);
620622
void i40e_irq_dynamic_disable_icr0(struct i40e_pf *pf);
621623
void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf);
622624
int i40e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);

drivers/net/ethernet/intel/i40e/i40e_common.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,12 +971,14 @@ i40e_status i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
971971
/**
972972
* i40e_aq_set_link_restart_an
973973
* @hw: pointer to the hw struct
974+
* @enable_link: if true: enable link, if false: disable link
974975
* @cmd_details: pointer to command details structure or NULL
975976
*
976977
* Sets up the link and restarts the Auto-Negotiation over the link.
977978
**/
978979
i40e_status i40e_aq_set_link_restart_an(struct i40e_hw *hw,
979-
struct i40e_asq_cmd_details *cmd_details)
980+
bool enable_link,
981+
struct i40e_asq_cmd_details *cmd_details)
980982
{
981983
struct i40e_aq_desc desc;
982984
struct i40e_aqc_set_link_restart_an *cmd =
@@ -987,6 +989,10 @@ i40e_status i40e_aq_set_link_restart_an(struct i40e_hw *hw,
987989
i40e_aqc_opc_set_link_restart_an);
988990

989991
cmd->command = I40E_AQ_PHY_RESTART_AN;
992+
if (enable_link)
993+
cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
994+
else
995+
cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
990996

991997
status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
992998

drivers/net/ethernet/intel/i40e/i40e_ethtool.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,9 +1027,10 @@ static int i40e_nway_reset(struct net_device *netdev)
10271027
struct i40e_netdev_priv *np = netdev_priv(netdev);
10281028
struct i40e_pf *pf = np->vsi->back;
10291029
struct i40e_hw *hw = &pf->hw;
1030+
bool link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
10301031
i40e_status ret = 0;
10311032

1032-
ret = i40e_aq_set_link_restart_an(hw, NULL);
1033+
ret = i40e_aq_set_link_restart_an(hw, link_up, NULL);
10331034
if (ret) {
10341035
netdev_info(netdev, "link restart failed, aq_err=%d\n",
10351036
pf->hw.aq.asq_last_status);
@@ -1105,17 +1106,36 @@ static int i40e_set_coalesce(struct net_device *netdev,
11051106
if (ec->tx_max_coalesced_frames_irq || ec->rx_max_coalesced_frames_irq)
11061107
vsi->work_limit = ec->tx_max_coalesced_frames_irq;
11071108

1109+
vector = vsi->base_vector;
11081110
if ((ec->rx_coalesce_usecs >= (I40E_MIN_ITR << 1)) &&
1109-
(ec->rx_coalesce_usecs <= (I40E_MAX_ITR << 1)))
1111+
(ec->rx_coalesce_usecs <= (I40E_MAX_ITR << 1))) {
11101112
vsi->rx_itr_setting = ec->rx_coalesce_usecs;
1111-
else
1113+
} else if (ec->rx_coalesce_usecs == 0) {
1114+
vsi->rx_itr_setting = ec->rx_coalesce_usecs;
1115+
i40e_irq_dynamic_disable(vsi, vector);
1116+
if (ec->use_adaptive_rx_coalesce)
1117+
netif_info(pf, drv, netdev,
1118+
"Rx-secs=0, need to disable adaptive-Rx for a complete disable\n");
1119+
} else {
1120+
netif_info(pf, drv, netdev,
1121+
"Invalid value, Rx-usecs range is 0, 8-8160\n");
11121122
return -EINVAL;
1123+
}
11131124

11141125
if ((ec->tx_coalesce_usecs >= (I40E_MIN_ITR << 1)) &&
1115-
(ec->tx_coalesce_usecs <= (I40E_MAX_ITR << 1)))
1126+
(ec->tx_coalesce_usecs <= (I40E_MAX_ITR << 1))) {
11161127
vsi->tx_itr_setting = ec->tx_coalesce_usecs;
1117-
else
1128+
} else if (ec->tx_coalesce_usecs == 0) {
1129+
vsi->tx_itr_setting = ec->tx_coalesce_usecs;
1130+
i40e_irq_dynamic_disable(vsi, vector);
1131+
if (ec->use_adaptive_tx_coalesce)
1132+
netif_info(pf, drv, netdev,
1133+
"Tx-secs=0, need to disable adaptive-Tx for a complete disable\n");
1134+
} else {
1135+
netif_info(pf, drv, netdev,
1136+
"Invalid value, Tx-usecs range is 0, 8-8160\n");
11181137
return -EINVAL;
1138+
}
11191139

11201140
if (ec->use_adaptive_rx_coalesce)
11211141
vsi->rx_itr_setting |= I40E_ITR_DYNAMIC;
@@ -1127,7 +1147,6 @@ static int i40e_set_coalesce(struct net_device *netdev,
11271147
else
11281148
vsi->tx_itr_setting &= ~I40E_ITR_DYNAMIC;
11291149

1130-
vector = vsi->base_vector;
11311150
for (i = 0; i < vsi->num_q_vectors; i++, vector++) {
11321151
q_vector = vsi->q_vectors[i];
11331152
q_vector->rx.itr = ITR_TO_REG(vsi->rx_itr_setting);

drivers/net/ethernet/intel/i40e/i40e_main.c

Lines changed: 89 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ static const char i40e_driver_string[] =
3939

4040
#define DRV_VERSION_MAJOR 0
4141
#define DRV_VERSION_MINOR 4
42-
#define DRV_VERSION_BUILD 13
42+
#define DRV_VERSION_BUILD 17
4343
#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \
4444
__stringify(DRV_VERSION_MINOR) "." \
4545
__stringify(DRV_VERSION_BUILD) DRV_KERN
@@ -278,7 +278,7 @@ static void i40e_tx_timeout(struct net_device *netdev)
278278
pf->tx_timeout_count++;
279279

280280
if (time_after(jiffies, (pf->tx_timeout_last_recovery + HZ*20)))
281-
pf->tx_timeout_recovery_level = 0;
281+
pf->tx_timeout_recovery_level = 1;
282282
pf->tx_timeout_last_recovery = jiffies;
283283
netdev_info(netdev, "tx_timeout recovery level %d\n",
284284
pf->tx_timeout_recovery_level);
@@ -1327,40 +1327,42 @@ static int i40e_set_mac(struct net_device *netdev, void *p)
13271327

13281328
netdev_info(netdev, "set mac address=%pM\n", addr->sa_data);
13291329

1330-
if (ether_addr_equal(netdev->dev_addr, addr->sa_data))
1331-
return 0;
1332-
13331330
if (test_bit(__I40E_DOWN, &vsi->back->state) ||
13341331
test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state))
13351332
return -EADDRNOTAVAIL;
13361333

13371334
if (vsi->type == I40E_VSI_MAIN) {
13381335
i40e_status ret;
13391336
ret = i40e_aq_mac_address_write(&vsi->back->hw,
1340-
I40E_AQC_WRITE_TYPE_LAA_ONLY,
1337+
I40E_AQC_WRITE_TYPE_LAA_WOL,
13411338
addr->sa_data, NULL);
13421339
if (ret) {
13431340
netdev_info(netdev,
13441341
"Addr change for Main VSI failed: %d\n",
13451342
ret);
13461343
return -EADDRNOTAVAIL;
13471344
}
1348-
1349-
ether_addr_copy(vsi->back->hw.mac.addr, addr->sa_data);
13501345
}
13511346

1352-
/* In order to be sure to not drop any packets, add the new address
1353-
* then delete the old one.
1354-
*/
1355-
f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY, false, false);
1356-
if (!f)
1357-
return -ENOMEM;
1347+
f = i40e_find_mac(vsi, addr->sa_data, false, true);
1348+
if (!f) {
1349+
/* In order to be sure to not drop any packets, add the
1350+
* new address first then delete the old one.
1351+
*/
1352+
f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY,
1353+
false, false);
1354+
if (!f)
1355+
return -ENOMEM;
13581356

1359-
i40e_sync_vsi_filters(vsi);
1360-
i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, false, false);
1361-
i40e_sync_vsi_filters(vsi);
1357+
i40e_sync_vsi_filters(vsi);
1358+
i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY,
1359+
false, false);
1360+
i40e_sync_vsi_filters(vsi);
1361+
}
13621362

1363-
ether_addr_copy(netdev->dev_addr, addr->sa_data);
1363+
f->is_laa = true;
1364+
if (!ether_addr_equal(netdev->dev_addr, addr->sa_data))
1365+
ether_addr_copy(netdev->dev_addr, addr->sa_data);
13641366

13651367
return 0;
13661368
}
@@ -2767,6 +2769,22 @@ void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector)
27672769
/* skip the flush */
27682770
}
27692771

2772+
/**
2773+
* i40e_irq_dynamic_disable - Disable default interrupt generation settings
2774+
* @vsi: pointer to a vsi
2775+
* @vector: enable a particular Hw Interrupt vector
2776+
**/
2777+
void i40e_irq_dynamic_disable(struct i40e_vsi *vsi, int vector)
2778+
{
2779+
struct i40e_pf *pf = vsi->back;
2780+
struct i40e_hw *hw = &pf->hw;
2781+
u32 val;
2782+
2783+
val = I40E_ITR_NONE << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
2784+
wr32(hw, I40E_PFINT_DYN_CTLN(vector - 1), val);
2785+
i40e_flush(hw);
2786+
}
2787+
27702788
/**
27712789
* i40e_msix_clean_rings - MSIX mode Interrupt Handler
27722790
* @irq: interrupt number
@@ -5611,15 +5629,15 @@ static void i40e_fdir_teardown(struct i40e_pf *pf)
56115629
*
56125630
* Close up the VFs and other things in prep for pf Reset.
56135631
**/
5614-
static int i40e_prep_for_reset(struct i40e_pf *pf)
5632+
static void i40e_prep_for_reset(struct i40e_pf *pf)
56155633
{
56165634
struct i40e_hw *hw = &pf->hw;
56175635
i40e_status ret = 0;
56185636
u32 v;
56195637

56205638
clear_bit(__I40E_RESET_INTR_RECEIVED, &pf->state);
56215639
if (test_and_set_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state))
5622-
return 0;
5640+
return;
56235641

56245642
dev_dbg(&pf->pdev->dev, "Tearing down internal switch for reset\n");
56255643

@@ -5636,13 +5654,10 @@ static int i40e_prep_for_reset(struct i40e_pf *pf)
56365654
/* call shutdown HMC */
56375655
if (hw->hmc.hmc_obj) {
56385656
ret = i40e_shutdown_lan_hmc(hw);
5639-
if (ret) {
5657+
if (ret)
56405658
dev_warn(&pf->pdev->dev,
56415659
"shutdown_lan_hmc failed: %d\n", ret);
5642-
clear_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state);
5643-
}
56445660
}
5645-
return ret;
56465661
}
56475662

56485663
/**
@@ -5778,7 +5793,7 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)
57785793
}
57795794

57805795
if (pf->vsi[pf->lan_vsi]->uplink_seid == pf->mac_seid) {
5781-
dev_info(&pf->pdev->dev, "attempting to rebuild PF VSI\n");
5796+
dev_dbg(&pf->pdev->dev, "attempting to rebuild PF VSI\n");
57825797
/* no VEB, so rebuild only the Main VSI */
57835798
ret = i40e_add_vsi(pf->vsi[pf->lan_vsi]);
57845799
if (ret) {
@@ -5816,11 +5831,8 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)
58165831
**/
58175832
static void i40e_handle_reset_warning(struct i40e_pf *pf)
58185833
{
5819-
i40e_status ret;
5820-
5821-
ret = i40e_prep_for_reset(pf);
5822-
if (!ret)
5823-
i40e_reset_and_rebuild(pf, false);
5834+
i40e_prep_for_reset(pf);
5835+
i40e_reset_and_rebuild(pf, false);
58245836
}
58255837

58265838
/**
@@ -5833,6 +5845,7 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf)
58335845
{
58345846
struct i40e_hw *hw = &pf->hw;
58355847
bool mdd_detected = false;
5848+
bool pf_mdd_detected = false;
58365849
struct i40e_vf *vf;
58375850
u32 reg;
58385851
int i;
@@ -5872,6 +5885,30 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf)
58725885
mdd_detected = true;
58735886
}
58745887

5888+
if (mdd_detected) {
5889+
reg = rd32(hw, I40E_PF_MDET_TX);
5890+
if (reg & I40E_PF_MDET_TX_VALID_MASK) {
5891+
wr32(hw, I40E_PF_MDET_TX, 0xFFFF);
5892+
dev_info(&pf->pdev->dev,
5893+
"MDD TX event is for this function 0x%08x, requesting PF reset.\n",
5894+
reg);
5895+
pf_mdd_detected = true;
5896+
}
5897+
reg = rd32(hw, I40E_PF_MDET_RX);
5898+
if (reg & I40E_PF_MDET_RX_VALID_MASK) {
5899+
wr32(hw, I40E_PF_MDET_RX, 0xFFFF);
5900+
dev_info(&pf->pdev->dev,
5901+
"MDD RX event is for this function 0x%08x, requesting PF reset.\n",
5902+
reg);
5903+
pf_mdd_detected = true;
5904+
}
5905+
/* Queue belongs to the PF, initiate a reset */
5906+
if (pf_mdd_detected) {
5907+
set_bit(__I40E_PF_RESET_REQUESTED, &pf->state);
5908+
i40e_service_event_schedule(pf);
5909+
}
5910+
}
5911+
58755912
/* see if one of the VFs needs its hand slapped */
58765913
for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) {
58775914
vf = &(pf->vf[i]);
@@ -6789,6 +6826,8 @@ static int i40e_sw_init(struct i40e_pf *pf)
67896826
pf->irq_pile->num_entries = pf->hw.func_caps.num_msix_vectors;
67906827
pf->irq_pile->search_hint = 0;
67916828

6829+
pf->tx_timeout_recovery_level = 1;
6830+
67926831
mutex_init(&pf->switch_mutex);
67936832

67946833
sw_init_done:
@@ -7342,6 +7381,12 @@ static int i40e_add_vsi(struct i40e_vsi *vsi)
73427381
list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) {
73437382
f->changed = true;
73447383
f_count++;
7384+
7385+
if (f->is_laa && vsi->type == I40E_VSI_MAIN) {
7386+
i40e_aq_mac_address_write(&vsi->back->hw,
7387+
I40E_AQC_WRITE_TYPE_LAA_WOL,
7388+
f->macaddr, NULL);
7389+
}
73457390
}
73467391
if (f_count) {
73477392
vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED;
@@ -8614,6 +8659,20 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
86148659
goto err_pf_reset;
86158660
}
86168661

8662+
if (hw->aq.api_min_ver > I40E_FW_API_VERSION_MINOR)
8663+
dev_info(&pdev->dev,
8664+
"Note: FW API version %02x.%02x newer than expected %02x.%02x, recommend driver update.\n",
8665+
hw->aq.api_maj_ver, hw->aq.api_min_ver,
8666+
I40E_FW_API_VERSION_MAJOR, I40E_FW_API_VERSION_MINOR);
8667+
8668+
if (hw->aq.api_maj_ver < I40E_FW_API_VERSION_MAJOR ||
8669+
hw->aq.api_min_ver < (I40E_FW_API_VERSION_MINOR-1))
8670+
dev_info(&pdev->dev,
8671+
"Note: FW API version %02x.%02x older than expected %02x.%02x, recommend nvm update.\n",
8672+
hw->aq.api_maj_ver, hw->aq.api_min_ver,
8673+
I40E_FW_API_VERSION_MAJOR, I40E_FW_API_VERSION_MINOR);
8674+
8675+
86178676
i40e_verify_eeprom(pf);
86188677

86198678
/* Rev 0 hardware was never productized */
@@ -8841,7 +8900,6 @@ static void i40e_remove(struct pci_dev *pdev)
88418900
{
88428901
struct i40e_pf *pf = pci_get_drvdata(pdev);
88438902
i40e_status ret_code;
8844-
u32 reg;
88458903
int i;
88468904

88478905
i40e_dbg_pf_exit(pf);
@@ -8919,11 +8977,6 @@ static void i40e_remove(struct pci_dev *pdev)
89198977
kfree(pf->irq_pile);
89208978
kfree(pf->vsi);
89218979

8922-
/* force a PF reset to clean anything leftover */
8923-
reg = rd32(&pf->hw, I40E_PFGEN_CTRL);
8924-
wr32(&pf->hw, I40E_PFGEN_CTRL, (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
8925-
i40e_flush(&pf->hw);
8926-
89278980
iounmap(pf->hw.hw_addr);
89288981
kfree(pf);
89298982
pci_release_selected_regions(pdev,

drivers/net/ethernet/intel/i40e/i40e_prototype.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ i40e_status i40e_aq_set_default_vsi(struct i40e_hw *hw, u16 vsi_id,
7777
i40e_status i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
7878
struct i40e_asq_cmd_details *cmd_details);
7979
i40e_status i40e_aq_set_link_restart_an(struct i40e_hw *hw,
80-
struct i40e_asq_cmd_details *cmd_details);
80+
bool enable_link,
81+
struct i40e_asq_cmd_details *cmd_details);
8182
i40e_status i40e_aq_get_link_info(struct i40e_hw *hw,
8283
bool enable_lse, struct i40e_link_status *link,
8384
struct i40e_asq_cmd_details *cmd_details);

drivers/net/ethernet/intel/i40e/i40e_txrx.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ enum i40e_dyn_idx_t {
7575
((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER) | \
7676
((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4) | \
7777
((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) | \
78-
((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN) | \
7978
((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) | \
8079
((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP) | \
8180
((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER) | \

drivers/net/ethernet/intel/i40e/i40e_type.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,6 @@ enum i40e_filter_pctype {
878878
I40E_FILTER_PCTYPE_FRAG_IPV4 = 36,
879879
/* Note: Values 37-40 are reserved for future use */
880880
I40E_FILTER_PCTYPE_NONF_IPV6_UDP = 41,
881-
I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN = 42,
882881
I40E_FILTER_PCTYPE_NONF_IPV6_TCP = 43,
883882
I40E_FILTER_PCTYPE_NONF_IPV6_SCTP = 44,
884883
I40E_FILTER_PCTYPE_NONF_IPV6_OTHER = 45,

drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,6 +2077,8 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
20772077
}
20782078
ether_addr_copy(vf->default_lan_addr.addr, mac);
20792079
vf->pf_set_mac = true;
2080+
/* Force the VF driver stop so it has to reload with new MAC address */
2081+
i40e_vc_disable_vf(pf, vf);
20802082
dev_info(&pf->pdev->dev, "Reload the VF driver to make this change effective.\n");
20812083
ret = 0;
20822084

0 commit comments

Comments
 (0)