net: hinic: Add support for configuration of rx-vlan-filter by ethtool
When ethtool config rx-vlan-filter, the driver will send control command to firmware, then set to hardware in this patch. Signed-off-by: Cai Huoqing <cai.huoqing@linux.dev> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
13265568a8
commit
2acf960e3b
3 changed files with 55 additions and 0 deletions
|
@ -1092,6 +1092,16 @@ static int set_features(struct hinic_dev *nic_dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) {
|
||||||
|
ret = hinic_set_vlan_fliter(nic_dev,
|
||||||
|
!!(features &
|
||||||
|
NETIF_F_HW_VLAN_CTAG_FILTER));
|
||||||
|
if (ret) {
|
||||||
|
err = ret;
|
||||||
|
failed_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
nic_dev->netdev->features = features ^ failed_features;
|
nic_dev->netdev->features = features ^ failed_features;
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
|
@ -447,6 +447,39 @@ int hinic_set_rx_vlan_offload(struct hinic_dev *nic_dev, u8 en)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int hinic_set_vlan_fliter(struct hinic_dev *nic_dev, u32 en)
|
||||||
|
{
|
||||||
|
struct hinic_hwdev *hwdev = nic_dev->hwdev;
|
||||||
|
struct hinic_hwif *hwif = hwdev->hwif;
|
||||||
|
struct pci_dev *pdev = hwif->pdev;
|
||||||
|
struct hinic_vlan_filter vlan_filter;
|
||||||
|
u16 out_size = sizeof(vlan_filter);
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!hwdev)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
vlan_filter.func_idx = HINIC_HWIF_FUNC_IDX(hwif);
|
||||||
|
vlan_filter.enable = en;
|
||||||
|
|
||||||
|
err = hinic_port_msg_cmd(hwdev, HINIC_PORT_CMD_SET_VLAN_FILTER,
|
||||||
|
&vlan_filter, sizeof(vlan_filter),
|
||||||
|
&vlan_filter, &out_size);
|
||||||
|
if (vlan_filter.status == HINIC_MGMT_CMD_UNSUPPORTED) {
|
||||||
|
err = HINIC_MGMT_CMD_UNSUPPORTED;
|
||||||
|
} else if ((err == HINIC_MBOX_VF_CMD_ERROR) &&
|
||||||
|
HINIC_IS_VF(hwif)) {
|
||||||
|
err = HINIC_MGMT_CMD_UNSUPPORTED;
|
||||||
|
} else if (err || !out_size || vlan_filter.status) {
|
||||||
|
dev_err(&pdev->dev,
|
||||||
|
"Failed to set vlan fliter, err: %d, status: 0x%x, out size: 0x%x\n",
|
||||||
|
err, vlan_filter.status, out_size);
|
||||||
|
err = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
int hinic_set_max_qnum(struct hinic_dev *nic_dev, u8 num_rqs)
|
int hinic_set_max_qnum(struct hinic_dev *nic_dev, u8 num_rqs)
|
||||||
{
|
{
|
||||||
struct hinic_hwdev *hwdev = nic_dev->hwdev;
|
struct hinic_hwdev *hwdev = nic_dev->hwdev;
|
||||||
|
|
|
@ -351,6 +351,16 @@ struct hinic_vlan_cfg {
|
||||||
u8 rsvd1[5];
|
u8 rsvd1[5];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct hinic_vlan_filter {
|
||||||
|
u8 status;
|
||||||
|
u8 version;
|
||||||
|
u8 rsvd0[6];
|
||||||
|
|
||||||
|
u16 func_idx;
|
||||||
|
u8 rsvd1[2];
|
||||||
|
u32 enable;
|
||||||
|
};
|
||||||
|
|
||||||
struct hinic_rss_template_mgmt {
|
struct hinic_rss_template_mgmt {
|
||||||
u8 status;
|
u8 status;
|
||||||
u8 version;
|
u8 version;
|
||||||
|
@ -831,6 +841,8 @@ int hinic_get_vport_stats(struct hinic_dev *nic_dev,
|
||||||
|
|
||||||
int hinic_set_rx_vlan_offload(struct hinic_dev *nic_dev, u8 en);
|
int hinic_set_rx_vlan_offload(struct hinic_dev *nic_dev, u8 en);
|
||||||
|
|
||||||
|
int hinic_set_vlan_fliter(struct hinic_dev *nic_dev, u32 en);
|
||||||
|
|
||||||
int hinic_get_mgmt_version(struct hinic_dev *nic_dev, u8 *mgmt_ver);
|
int hinic_get_mgmt_version(struct hinic_dev *nic_dev, u8 *mgmt_ver);
|
||||||
|
|
||||||
int hinic_set_link_settings(struct hinic_hwdev *hwdev,
|
int hinic_set_link_settings(struct hinic_hwdev *hwdev,
|
||||||
|
|
Loading…
Add table
Reference in a new issue