mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-06 14:45:14 +00:00
i40evf: Change a VF mac without reloading the VF driver
Add possibility to change a VF mac address from host side without reloading the VF driver on the guest side. Without this patch it is not possible to change the VF mac because executing i40evf_virtchnl_completion function with VIRTCHNL_OP_GET_VF_RESOURCES opcode resets the VF mac address to previous value. Signed-off-by: Paweł Jabłoński <pawel.jablonski@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
6dba41cd02
commit
ae1e29f671
2 changed files with 14 additions and 5 deletions
|
@ -2458,7 +2458,7 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf,
|
||||||
!is_multicast_ether_addr(addr) && vf->pf_set_mac &&
|
!is_multicast_ether_addr(addr) && vf->pf_set_mac &&
|
||||||
!ether_addr_equal(addr, vf->default_lan_addr.addr)) {
|
!ether_addr_equal(addr, vf->default_lan_addr.addr)) {
|
||||||
dev_err(&pf->pdev->dev,
|
dev_err(&pf->pdev->dev,
|
||||||
"VF attempting to override administratively set MAC address, reload the VF driver to resume normal operation\n");
|
"VF attempting to override administratively set MAC address, bring down and up the VF interface to resume normal operation\n");
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3873,9 +3873,11 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
|
||||||
mac, vf_id);
|
mac, vf_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Force the VF driver stop so it has to reload with new MAC address */
|
/* Force the VF interface down so it has to bring up with new MAC
|
||||||
|
* address
|
||||||
|
*/
|
||||||
i40e_vc_disable_vf(vf);
|
i40e_vc_disable_vf(vf);
|
||||||
dev_info(&pf->pdev->dev, "Reload the VF driver to make this change effective.\n");
|
dev_info(&pf->pdev->dev, "Bring down and up the VF interface to make this change effective.\n");
|
||||||
|
|
||||||
error_param:
|
error_param:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1330,8 +1330,15 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
|
||||||
sizeof(struct virtchnl_vsi_resource);
|
sizeof(struct virtchnl_vsi_resource);
|
||||||
memcpy(adapter->vf_res, msg, min(msglen, len));
|
memcpy(adapter->vf_res, msg, min(msglen, len));
|
||||||
i40e_vf_parse_hw_config(&adapter->hw, adapter->vf_res);
|
i40e_vf_parse_hw_config(&adapter->hw, adapter->vf_res);
|
||||||
/* restore current mac address */
|
if (is_zero_ether_addr(adapter->hw.mac.addr)) {
|
||||||
ether_addr_copy(adapter->hw.mac.addr, netdev->dev_addr);
|
/* restore current mac address */
|
||||||
|
ether_addr_copy(adapter->hw.mac.addr, netdev->dev_addr);
|
||||||
|
} else {
|
||||||
|
/* refresh current mac address if changed */
|
||||||
|
ether_addr_copy(netdev->dev_addr, adapter->hw.mac.addr);
|
||||||
|
ether_addr_copy(netdev->perm_addr,
|
||||||
|
adapter->hw.mac.addr);
|
||||||
|
}
|
||||||
i40evf_process_config(adapter);
|
i40evf_process_config(adapter);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue