aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2016-04-11 04:11:13 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-11 14:58:45 -0400
commit84c33dd342ad596a271a61da0119bf34e80bb1c5 (patch)
treec3ab2aa2830cf5e9475eec3b249c8e477f1adb87 /drivers/net/ethernet
parent33f7d55f07ab964055d73d38774346f8d4821f00 (diff)
bnxt_en: Call firmware to approve VF MAC address change.
Some hypervisors (e.g. ESX) require the VF MAC address to be forwarded to the PF for approval. In Linux PF, the call is not forwarded and the firmware will simply check and approve the MAC address if the PF has not previously administered a valid MAC address for this VF. Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c7
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c30
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h1
3 files changed, 34 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index e874a564f40b..c83a5a1862d0 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -5696,10 +5696,9 @@ static int bnxt_change_mac_addr(struct net_device *dev, void *p)
5696 if (!is_valid_ether_addr(addr->sa_data)) 5696 if (!is_valid_ether_addr(addr->sa_data))
5697 return -EADDRNOTAVAIL; 5697 return -EADDRNOTAVAIL;
5698 5698
5699#ifdef CONFIG_BNXT_SRIOV 5699 rc = bnxt_approve_mac(bp, addr->sa_data);
5700 if (BNXT_VF(bp) && is_valid_ether_addr(bp->vf.mac_addr)) 5700 if (rc)
5701 return -EADDRNOTAVAIL; 5701 return rc;
5702#endif
5703 5702
5704 if (ether_addr_equal(addr->sa_data, dev->dev_addr)) 5703 if (ether_addr_equal(addr->sa_data, dev->dev_addr))
5705 return 0; 5704 return 0;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
index 8457850b0bdd..363884dd9e8a 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
@@ -865,6 +865,31 @@ update_vf_mac_exit:
865 mutex_unlock(&bp->hwrm_cmd_lock); 865 mutex_unlock(&bp->hwrm_cmd_lock);
866} 866}
867 867
868int bnxt_approve_mac(struct bnxt *bp, u8 *mac)
869{
870 struct hwrm_func_vf_cfg_input req = {0};
871 int rc = 0;
872
873 if (!BNXT_VF(bp))
874 return 0;
875
876 if (bp->hwrm_spec_code < 0x10202) {
877 if (is_valid_ether_addr(bp->vf.mac_addr))
878 rc = -EADDRNOTAVAIL;
879 goto mac_done;
880 }
881 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_VF_CFG, -1, -1);
882 req.enables = cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_DFLT_MAC_ADDR);
883 memcpy(req.dflt_mac_addr, mac, ETH_ALEN);
884 rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
885mac_done:
886 if (rc) {
887 rc = -EADDRNOTAVAIL;
888 netdev_warn(bp->dev, "VF MAC address %pM not approved by the PF\n",
889 mac);
890 }
891 return rc;
892}
868#else 893#else
869 894
870void bnxt_sriov_disable(struct bnxt *bp) 895void bnxt_sriov_disable(struct bnxt *bp)
@@ -879,4 +904,9 @@ void bnxt_hwrm_exec_fwd_req(struct bnxt *bp)
879void bnxt_update_vf_mac(struct bnxt *bp) 904void bnxt_update_vf_mac(struct bnxt *bp)
880{ 905{
881} 906}
907
908int bnxt_approve_mac(struct bnxt *bp, u8 *mac)
909{
910 return 0;
911}
882#endif 912#endif
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h
index 3f08354a247e..0392670ab49c 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h
@@ -20,4 +20,5 @@ int bnxt_sriov_configure(struct pci_dev *pdev, int num_vfs);
20void bnxt_sriov_disable(struct bnxt *); 20void bnxt_sriov_disable(struct bnxt *);
21void bnxt_hwrm_exec_fwd_req(struct bnxt *); 21void bnxt_hwrm_exec_fwd_req(struct bnxt *);
22void bnxt_update_vf_mac(struct bnxt *); 22void bnxt_update_vf_mac(struct bnxt *);
23int bnxt_approve_mac(struct bnxt *, u8 *);
23#endif 24#endif