|
@@ -1468,6 +1468,7 @@ static int be_get_vf_config(struct net_device *netdev, int vf,
|
|
|
vi->qos = vf_cfg->vlan_tag >> VLAN_PRIO_SHIFT;
|
|
|
memcpy(&vi->mac, vf_cfg->mac_addr, ETH_ALEN);
|
|
|
vi->linkstate = adapter->vf_cfg[vf].plink_tracking;
|
|
|
+ vi->spoofchk = adapter->vf_cfg[vf].spoofchk;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1480,7 +1481,7 @@ static int be_set_vf_tvt(struct be_adapter *adapter, int vf, u16 vlan)
|
|
|
int status;
|
|
|
|
|
|
/* Enable Transparent VLAN Tagging */
|
|
|
- status = be_cmd_set_hsw_config(adapter, vlan, vf + 1, vf_if_id, 0);
|
|
|
+ status = be_cmd_set_hsw_config(adapter, vlan, vf + 1, vf_if_id, 0, 0);
|
|
|
if (status)
|
|
|
return status;
|
|
|
|
|
@@ -1509,7 +1510,7 @@ static int be_clear_vf_tvt(struct be_adapter *adapter, int vf)
|
|
|
|
|
|
/* Reset Transparent VLAN Tagging. */
|
|
|
status = be_cmd_set_hsw_config(adapter, BE_RESET_VLAN_TAG_ID, vf + 1,
|
|
|
- vf_cfg->if_handle, 0);
|
|
|
+ vf_cfg->if_handle, 0, 0);
|
|
|
if (status)
|
|
|
return status;
|
|
|
|
|
@@ -1644,6 +1645,39 @@ static int be_set_vf_link_state(struct net_device *netdev, int vf,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int be_set_vf_spoofchk(struct net_device *netdev, int vf, bool enable)
|
|
|
+{
|
|
|
+ struct be_adapter *adapter = netdev_priv(netdev);
|
|
|
+ struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf];
|
|
|
+ u8 spoofchk;
|
|
|
+ int status;
|
|
|
+
|
|
|
+ if (!sriov_enabled(adapter))
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
+ if (vf >= adapter->num_vfs)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (BEx_chip(adapter))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ if (enable == vf_cfg->spoofchk)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ spoofchk = enable ? ENABLE_MAC_SPOOFCHK : DISABLE_MAC_SPOOFCHK;
|
|
|
+
|
|
|
+ status = be_cmd_set_hsw_config(adapter, 0, vf + 1, vf_cfg->if_handle,
|
|
|
+ 0, spoofchk);
|
|
|
+ if (status) {
|
|
|
+ dev_err(&adapter->pdev->dev,
|
|
|
+ "Spoofchk change on VF %d failed: %#x\n", vf, status);
|
|
|
+ return be_cmd_status(status);
|
|
|
+ }
|
|
|
+
|
|
|
+ vf_cfg->spoofchk = enable;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static void be_aic_update(struct be_aic_obj *aic, u64 rx_pkts, u64 tx_pkts,
|
|
|
ulong now)
|
|
|
{
|
|
@@ -3612,6 +3646,7 @@ static int be_vf_setup(struct be_adapter *adapter)
|
|
|
struct device *dev = &adapter->pdev->dev;
|
|
|
struct be_vf_cfg *vf_cfg;
|
|
|
int status, old_vfs, vf;
|
|
|
+ bool spoofchk;
|
|
|
|
|
|
old_vfs = pci_num_vf(adapter->pdev);
|
|
|
|
|
@@ -3659,6 +3694,12 @@ static int be_vf_setup(struct be_adapter *adapter)
|
|
|
if (!old_vfs)
|
|
|
be_cmd_config_qos(adapter, 0, 0, vf + 1);
|
|
|
|
|
|
+ status = be_cmd_get_hsw_config(adapter, NULL, vf + 1,
|
|
|
+ vf_cfg->if_handle, NULL,
|
|
|
+ &spoofchk);
|
|
|
+ if (!status)
|
|
|
+ vf_cfg->spoofchk = spoofchk;
|
|
|
+
|
|
|
if (!old_vfs) {
|
|
|
be_cmd_enable_vf(adapter, vf + 1);
|
|
|
be_cmd_set_logical_link_config(adapter,
|
|
@@ -4831,7 +4872,7 @@ static int be_ndo_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,
|
|
|
adapter->if_handle,
|
|
|
mode == BRIDGE_MODE_VEPA ?
|
|
|
PORT_FWD_TYPE_VEPA :
|
|
|
- PORT_FWD_TYPE_VEB);
|
|
|
+ PORT_FWD_TYPE_VEB, 0);
|
|
|
if (status)
|
|
|
goto err;
|
|
|
|
|
@@ -4863,7 +4904,8 @@ static int be_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
|
|
hsw_mode = PORT_FWD_TYPE_VEB;
|
|
|
} else {
|
|
|
status = be_cmd_get_hsw_config(adapter, NULL, 0,
|
|
|
- adapter->if_handle, &hsw_mode);
|
|
|
+ adapter->if_handle, &hsw_mode,
|
|
|
+ NULL);
|
|
|
if (status)
|
|
|
return 0;
|
|
|
}
|
|
@@ -5016,6 +5058,7 @@ static const struct net_device_ops be_netdev_ops = {
|
|
|
.ndo_set_vf_rate = be_set_vf_tx_rate,
|
|
|
.ndo_get_vf_config = be_get_vf_config,
|
|
|
.ndo_set_vf_link_state = be_set_vf_link_state,
|
|
|
+ .ndo_set_vf_spoofchk = be_set_vf_spoofchk,
|
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
|
.ndo_poll_controller = be_netpoll,
|
|
|
#endif
|