aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom
diff options
context:
space:
mode:
authorMichael Chan <michael.chan@broadcom.com>2019-02-19 05:31:14 -0500
committerDavid S. Miller <davem@davemloft.net>2019-02-19 13:45:14 -0500
commit2a516444434ffa4419e67c5289d5f53272cb9674 (patch)
treed28c66c88b581b5fc62a31e4b37a890329cca5f4 /drivers/net/ethernet/broadcom
parentc6cc32a2133cb1eb5aa28ced1852aab2aeaf357a (diff)
bnxt_en: Propagate trusted VF attribute to firmware.
Newer firmware understands the concept of a trusted VF, so propagate the trusted VF attribute set by the PF admin. to the firmware. Also, check the firmware trusted setting when considering the VF MAC address change and reporting the trusted setting to the user. Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c4
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h2
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c58
3 files changed, 60 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 0f7a34a3b004..9700891a26b8 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -6683,6 +6683,10 @@ static int bnxt_hwrm_ver_get(struct bnxt *bp)
6683 VER_GET_RESP_DEV_CAPS_CFG_FLOW_HANDLE_64BIT_SUPPORTED) 6683 VER_GET_RESP_DEV_CAPS_CFG_FLOW_HANDLE_64BIT_SUPPORTED)
6684 bp->fw_cap |= BNXT_FW_CAP_OVS_64BIT_HANDLE; 6684 bp->fw_cap |= BNXT_FW_CAP_OVS_64BIT_HANDLE;
6685 6685
6686 if (dev_caps_cfg &
6687 VER_GET_RESP_DEV_CAPS_CFG_TRUSTED_VF_SUPPORTED)
6688 bp->fw_cap |= BNXT_FW_CAP_TRUSTED_VF;
6689
6686hwrm_ver_get_exit: 6690hwrm_ver_get_exit:
6687 mutex_unlock(&bp->hwrm_cmd_lock); 6691 mutex_unlock(&bp->hwrm_cmd_lock);
6688 return rc; 6692 return rc;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 17554d4be651..ecbe7d28a723 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -945,6 +945,7 @@ struct bnxt_vf_info {
945 * stored by PF. 945 * stored by PF.
946 */ 946 */
947 u16 vlan; 947 u16 vlan;
948 u16 func_qcfg_flags;
948 u32 flags; 949 u32 flags;
949#define BNXT_VF_QOS 0x1 950#define BNXT_VF_QOS 0x1
950#define BNXT_VF_SPOOFCHK 0x2 951#define BNXT_VF_SPOOFCHK 0x2
@@ -1478,6 +1479,7 @@ struct bnxt {
1478 #define BNXT_FW_CAP_IF_CHANGE 0x00000010 1479 #define BNXT_FW_CAP_IF_CHANGE 0x00000010
1479 #define BNXT_FW_CAP_KONG_MB_CHNL 0x00000080 1480 #define BNXT_FW_CAP_KONG_MB_CHNL 0x00000080
1480 #define BNXT_FW_CAP_OVS_64BIT_HANDLE 0x00000400 1481 #define BNXT_FW_CAP_OVS_64BIT_HANDLE 0x00000400
1482 #define BNXT_FW_CAP_TRUSTED_VF 0x00000800
1481 1483
1482#define BNXT_NEW_RM(bp) ((bp)->fw_cap & BNXT_FW_CAP_NEW_RM) 1484#define BNXT_NEW_RM(bp) ((bp)->fw_cap & BNXT_FW_CAP_NEW_RM)
1483 u32 hwrm_spec_code; 1485 u32 hwrm_spec_code;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
index d80f5c981d90..2b90a2bb1a1d 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
@@ -121,6 +121,54 @@ int bnxt_set_vf_spoofchk(struct net_device *dev, int vf_id, bool setting)
121 return rc; 121 return rc;
122} 122}
123 123
124static int bnxt_hwrm_func_qcfg_flags(struct bnxt *bp, struct bnxt_vf_info *vf)
125{
126 struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
127 struct hwrm_func_qcfg_input req = {0};
128 int rc;
129
130 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_QCFG, -1, -1);
131 req.fid = cpu_to_le16(vf->fw_fid);
132 mutex_lock(&bp->hwrm_cmd_lock);
133 rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
134 if (rc) {
135 mutex_unlock(&bp->hwrm_cmd_lock);
136 return -EIO;
137 }
138 vf->func_qcfg_flags = le16_to_cpu(resp->flags);
139 mutex_unlock(&bp->hwrm_cmd_lock);
140 return 0;
141}
142
143static bool bnxt_is_trusted_vf(struct bnxt *bp, struct bnxt_vf_info *vf)
144{
145 if (!(bp->fw_cap & BNXT_FW_CAP_TRUSTED_VF))
146 return !!(vf->flags & BNXT_VF_TRUST);
147
148 bnxt_hwrm_func_qcfg_flags(bp, vf);
149 return !!(vf->func_qcfg_flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF);
150}
151
152static int bnxt_hwrm_set_trusted_vf(struct bnxt *bp, struct bnxt_vf_info *vf)
153{
154 struct hwrm_func_cfg_input req = {0};
155 int rc;
156
157 if (!(bp->fw_cap & BNXT_FW_CAP_TRUSTED_VF))
158 return 0;
159
160 bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_CFG, -1, -1);
161 req.fid = cpu_to_le16(vf->fw_fid);
162 if (vf->flags & BNXT_VF_TRUST)
163 req.flags = cpu_to_le32(FUNC_CFG_REQ_FLAGS_TRUSTED_VF_ENABLE);
164 else
165 req.flags = cpu_to_le32(FUNC_CFG_REQ_FLAGS_TRUSTED_VF_DISABLE);
166 rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
167 if (rc)
168 return -EIO;
169 return 0;
170}
171
124int bnxt_set_vf_trust(struct net_device *dev, int vf_id, bool trusted) 172int bnxt_set_vf_trust(struct net_device *dev, int vf_id, bool trusted)
125{ 173{
126 struct bnxt *bp = netdev_priv(dev); 174 struct bnxt *bp = netdev_priv(dev);
@@ -135,6 +183,7 @@ int bnxt_set_vf_trust(struct net_device *dev, int vf_id, bool trusted)
135 else 183 else
136 vf->flags &= ~BNXT_VF_TRUST; 184 vf->flags &= ~BNXT_VF_TRUST;
137 185
186 bnxt_hwrm_set_trusted_vf(bp, vf);
138 return 0; 187 return 0;
139} 188}
140 189
@@ -164,7 +213,7 @@ int bnxt_get_vf_config(struct net_device *dev, int vf_id,
164 else 213 else
165 ivi->qos = 0; 214 ivi->qos = 0;
166 ivi->spoofchk = !!(vf->flags & BNXT_VF_SPOOFCHK); 215 ivi->spoofchk = !!(vf->flags & BNXT_VF_SPOOFCHK);
167 ivi->trusted = !!(vf->flags & BNXT_VF_TRUST); 216 ivi->trusted = bnxt_is_trusted_vf(bp, vf);
168 if (!(vf->flags & BNXT_VF_LINK_FORCED)) 217 if (!(vf->flags & BNXT_VF_LINK_FORCED))
169 ivi->linkstate = IFLA_VF_LINK_STATE_AUTO; 218 ivi->linkstate = IFLA_VF_LINK_STATE_AUTO;
170 else if (vf->flags & BNXT_VF_LINK_UP) 219 else if (vf->flags & BNXT_VF_LINK_UP)
@@ -935,9 +984,10 @@ static int bnxt_vf_configure_mac(struct bnxt *bp, struct bnxt_vf_info *vf)
935 * if the PF assigned MAC address is zero 984 * if the PF assigned MAC address is zero
936 */ 985 */
937 if (req->enables & cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_DFLT_MAC_ADDR)) { 986 if (req->enables & cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_DFLT_MAC_ADDR)) {
987 bool trust = bnxt_is_trusted_vf(bp, vf);
988
938 if (is_valid_ether_addr(req->dflt_mac_addr) && 989 if (is_valid_ether_addr(req->dflt_mac_addr) &&
939 ((vf->flags & BNXT_VF_TRUST) || 990 (trust || !is_valid_ether_addr(vf->mac_addr) ||
940 !is_valid_ether_addr(vf->mac_addr) ||
941 ether_addr_equal(req->dflt_mac_addr, vf->mac_addr))) { 991 ether_addr_equal(req->dflt_mac_addr, vf->mac_addr))) {
942 ether_addr_copy(vf->vf_mac_addr, req->dflt_mac_addr); 992 ether_addr_copy(vf->vf_mac_addr, req->dflt_mac_addr);
943 return bnxt_hwrm_exec_fwd_resp(bp, vf, msg_size); 993 return bnxt_hwrm_exec_fwd_resp(bp, vf, msg_size);
@@ -962,7 +1012,7 @@ static int bnxt_vf_validate_set_mac(struct bnxt *bp, struct bnxt_vf_info *vf)
962 * Otherwise, it must match the VF MAC address if firmware spec >= 1012 * Otherwise, it must match the VF MAC address if firmware spec >=
963 * 1.2.2 1013 * 1.2.2
964 */ 1014 */
965 if (vf->flags & BNXT_VF_TRUST) { 1015 if (bnxt_is_trusted_vf(bp, vf)) {
966 mac_ok = true; 1016 mac_ok = true;
967 } else if (is_valid_ether_addr(vf->mac_addr)) { 1017 } else if (is_valid_ether_addr(vf->mac_addr)) {
968 if (ether_addr_equal((const u8 *)req->l2_addr, vf->mac_addr)) 1018 if (ether_addr_equal((const u8 *)req->l2_addr, vf->mac_addr))