mirror of https://gitee.com/openkylin/linux.git
Merge branch 'net-hns3-updates-for-next'
Huazhong Tan says: ==================== net: hns3: updates for -next There are some updates for the HNS3 ethernet driver. promiscuous configuration more flexible, #2 adds ethtool private flags to control whether enable tx unicast promisc. previous version: https://patchwork.kernel.org/project/netdevbpf/cover/1606997936-22166-1-git-send-email-tanhuazhong@huawei.com/ ==================== Link: https://lore.kernel.org/r/1607227575-56689-1-git-send-email-tanhuazhong@huawei.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
c22c0d55d5
|
@ -110,6 +110,7 @@ struct hclge_vf_to_pf_msg {
|
|||
u8 en_bc;
|
||||
u8 en_uc;
|
||||
u8 en_mc;
|
||||
u8 en_limit_promisc;
|
||||
};
|
||||
struct {
|
||||
u8 vector_id;
|
||||
|
|
|
@ -719,6 +719,11 @@ struct hnae3_roce_private_info {
|
|||
#define HNAE3_UPE (HNAE3_USER_UPE | HNAE3_OVERFLOW_UPE)
|
||||
#define HNAE3_MPE (HNAE3_USER_MPE | HNAE3_OVERFLOW_MPE)
|
||||
|
||||
enum hnae3_pflag {
|
||||
HNAE3_PFLAG_LIMIT_PROMISC,
|
||||
HNAE3_PFLAG_MAX
|
||||
};
|
||||
|
||||
struct hnae3_handle {
|
||||
struct hnae3_client *client;
|
||||
struct pci_dev *pdev;
|
||||
|
@ -741,6 +746,9 @@ struct hnae3_handle {
|
|||
|
||||
/* Network interface message level enabled bits */
|
||||
u32 msg_enable;
|
||||
|
||||
unsigned long supported_pflags;
|
||||
unsigned long priv_flags;
|
||||
};
|
||||
|
||||
#define hnae3_set_field(origin, mask, shift, val) \
|
||||
|
|
|
@ -1006,6 +1006,7 @@ static int hns3_handle_vtags(struct hns3_enet_ring *tx_ring,
|
|||
struct sk_buff *skb)
|
||||
{
|
||||
struct hnae3_handle *handle = tx_ring->tqp->handle;
|
||||
struct hnae3_ae_dev *ae_dev;
|
||||
struct vlan_ethhdr *vhdr;
|
||||
int rc;
|
||||
|
||||
|
@ -1013,10 +1014,13 @@ static int hns3_handle_vtags(struct hns3_enet_ring *tx_ring,
|
|||
skb_vlan_tag_present(skb)))
|
||||
return 0;
|
||||
|
||||
/* Since HW limitation, if port based insert VLAN enabled, only one VLAN
|
||||
* header is allowed in skb, otherwise it will cause RAS error.
|
||||
/* For HW limitation on HNAE3_DEVICE_VERSION_V2, if port based insert
|
||||
* VLAN enabled, only one VLAN header is allowed in skb, otherwise it
|
||||
* will cause RAS error.
|
||||
*/
|
||||
ae_dev = pci_get_drvdata(handle->pdev);
|
||||
if (unlikely(skb_vlan_tagged_multi(skb) &&
|
||||
ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2 &&
|
||||
handle->port_base_vlan_state ==
|
||||
HNAE3_PORT_BASE_VLAN_ENABLE))
|
||||
return -EINVAL;
|
||||
|
@ -4226,6 +4230,9 @@ static int hns3_client_init(struct hnae3_handle *handle)
|
|||
|
||||
set_bit(HNS3_NIC_STATE_INITED, &priv->state);
|
||||
|
||||
if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3)
|
||||
set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->supported_pflags);
|
||||
|
||||
if (netif_msg_drv(handle))
|
||||
hns3_info_show(priv);
|
||||
|
||||
|
|
|
@ -18,6 +18,11 @@ struct hns3_sfp_type {
|
|||
u8 ext_type;
|
||||
};
|
||||
|
||||
struct hns3_pflag_desc {
|
||||
char name[ETH_GSTRING_LEN];
|
||||
void (*handler)(struct net_device *netdev, bool enable);
|
||||
};
|
||||
|
||||
/* tqp related stats */
|
||||
#define HNS3_TQP_STAT(_string, _member) { \
|
||||
.stats_string = _string, \
|
||||
|
@ -60,6 +65,8 @@ static const struct hns3_stats hns3_rxq_stats[] = {
|
|||
HNS3_TQP_STAT("non_reuse_pg", non_reuse_pg),
|
||||
};
|
||||
|
||||
#define HNS3_PRIV_FLAGS_LEN ARRAY_SIZE(hns3_priv_flags)
|
||||
|
||||
#define HNS3_RXQ_STATS_COUNT ARRAY_SIZE(hns3_rxq_stats)
|
||||
|
||||
#define HNS3_TQP_STATS_COUNT (HNS3_TXQ_STATS_COUNT + HNS3_RXQ_STATS_COUNT)
|
||||
|
@ -395,6 +402,23 @@ static void hns3_self_test(struct net_device *ndev,
|
|||
netif_dbg(h, drv, ndev, "self test end\n");
|
||||
}
|
||||
|
||||
static void hns3_update_limit_promisc_mode(struct net_device *netdev,
|
||||
bool enable)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
|
||||
if (enable)
|
||||
set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
|
||||
else
|
||||
clear_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
|
||||
|
||||
hns3_request_update_promisc_mode(handle);
|
||||
}
|
||||
|
||||
static const struct hns3_pflag_desc hns3_priv_flags[HNAE3_PFLAG_MAX] = {
|
||||
{ "limit_promisc", hns3_update_limit_promisc_mode }
|
||||
};
|
||||
|
||||
static int hns3_get_sset_count(struct net_device *netdev, int stringset)
|
||||
{
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
|
@ -411,6 +435,9 @@ static int hns3_get_sset_count(struct net_device *netdev, int stringset)
|
|||
case ETH_SS_TEST:
|
||||
return ops->get_sset_count(h, stringset);
|
||||
|
||||
case ETH_SS_PRIV_FLAGS:
|
||||
return HNAE3_PFLAG_MAX;
|
||||
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@ -464,6 +491,7 @@ static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
|
|||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
const struct hnae3_ae_ops *ops = h->ae_algo->ops;
|
||||
char *buff = (char *)data;
|
||||
int i;
|
||||
|
||||
if (!ops->get_strings)
|
||||
return;
|
||||
|
@ -476,6 +504,13 @@ static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
|
|||
case ETH_SS_TEST:
|
||||
ops->get_strings(h, stringset, data);
|
||||
break;
|
||||
case ETH_SS_PRIV_FLAGS:
|
||||
for (i = 0; i < HNS3_PRIV_FLAGS_LEN; i++) {
|
||||
snprintf(buff, ETH_GSTRING_LEN, "%s",
|
||||
hns3_priv_flags[i].name);
|
||||
buff += ETH_GSTRING_LEN;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1517,6 +1552,53 @@ static int hns3_get_module_eeprom(struct net_device *netdev,
|
|||
return ops->get_module_eeprom(handle, ee->offset, ee->len, data);
|
||||
}
|
||||
|
||||
static u32 hns3_get_priv_flags(struct net_device *netdev)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
|
||||
return handle->priv_flags;
|
||||
}
|
||||
|
||||
static int hns3_check_priv_flags(struct hnae3_handle *h, u32 changed)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < HNAE3_PFLAG_MAX; i++)
|
||||
if ((changed & BIT(i)) && !test_bit(i, &h->supported_pflags)) {
|
||||
netdev_err(h->netdev, "%s is unsupported\n",
|
||||
hns3_priv_flags[i].name);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hns3_set_priv_flags(struct net_device *netdev, u32 pflags)
|
||||
{
|
||||
struct hnae3_handle *handle = hns3_get_handle(netdev);
|
||||
u32 changed = pflags ^ handle->priv_flags;
|
||||
int ret;
|
||||
u32 i;
|
||||
|
||||
ret = hns3_check_priv_flags(handle, changed);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < HNAE3_PFLAG_MAX; i++) {
|
||||
if (changed & BIT(i)) {
|
||||
bool enable = !(handle->priv_flags & BIT(i));
|
||||
|
||||
if (enable)
|
||||
handle->priv_flags |= BIT(i);
|
||||
else
|
||||
handle->priv_flags &= ~BIT(i);
|
||||
hns3_priv_flags[i].handler(netdev, enable);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define HNS3_ETHTOOL_COALESCE (ETHTOOL_COALESCE_USECS | \
|
||||
ETHTOOL_COALESCE_USE_ADAPTIVE | \
|
||||
ETHTOOL_COALESCE_RX_USECS_HIGH | \
|
||||
|
@ -1547,6 +1629,8 @@ static const struct ethtool_ops hns3vf_ethtool_ops = {
|
|||
.get_link = hns3_get_link,
|
||||
.get_msglevel = hns3_get_msglevel,
|
||||
.set_msglevel = hns3_set_msglevel,
|
||||
.get_priv_flags = hns3_get_priv_flags,
|
||||
.set_priv_flags = hns3_set_priv_flags,
|
||||
};
|
||||
|
||||
static const struct ethtool_ops hns3_ethtool_ops = {
|
||||
|
@ -1583,6 +1667,8 @@ static const struct ethtool_ops hns3_ethtool_ops = {
|
|||
.set_fecparam = hns3_set_fecparam,
|
||||
.get_module_info = hns3_get_module_info,
|
||||
.get_module_eeprom = hns3_get_module_eeprom,
|
||||
.get_priv_flags = hns3_get_priv_flags,
|
||||
.set_priv_flags = hns3_set_priv_flags,
|
||||
};
|
||||
|
||||
void hns3_ethtool_set_ops(struct net_device *netdev)
|
||||
|
|
|
@ -583,23 +583,26 @@ struct hclge_link_status_cmd {
|
|||
u8 rsv[23];
|
||||
};
|
||||
|
||||
struct hclge_promisc_param {
|
||||
u8 vf_id;
|
||||
u8 enable;
|
||||
};
|
||||
/* for DEVICE_VERSION_V1/2, reference to promisc cmd byte8 */
|
||||
#define HCLGE_PROMISC_EN_UC 1
|
||||
#define HCLGE_PROMISC_EN_MC 2
|
||||
#define HCLGE_PROMISC_EN_BC 3
|
||||
#define HCLGE_PROMISC_TX_EN 4
|
||||
#define HCLGE_PROMISC_RX_EN 5
|
||||
|
||||
/* for DEVICE_VERSION_V3, reference to promisc cmd byte10 */
|
||||
#define HCLGE_PROMISC_UC_RX_EN 2
|
||||
#define HCLGE_PROMISC_MC_RX_EN 3
|
||||
#define HCLGE_PROMISC_BC_RX_EN 4
|
||||
#define HCLGE_PROMISC_UC_TX_EN 5
|
||||
#define HCLGE_PROMISC_MC_TX_EN 6
|
||||
#define HCLGE_PROMISC_BC_TX_EN 7
|
||||
|
||||
#define HCLGE_PROMISC_TX_EN_B BIT(4)
|
||||
#define HCLGE_PROMISC_RX_EN_B BIT(5)
|
||||
#define HCLGE_PROMISC_EN_B 1
|
||||
#define HCLGE_PROMISC_EN_ALL 0x7
|
||||
#define HCLGE_PROMISC_EN_UC 0x1
|
||||
#define HCLGE_PROMISC_EN_MC 0x2
|
||||
#define HCLGE_PROMISC_EN_BC 0x4
|
||||
struct hclge_promisc_cfg_cmd {
|
||||
u8 flag;
|
||||
u8 promisc;
|
||||
u8 vf_id;
|
||||
__le16 rsv0;
|
||||
u8 rsv1[20];
|
||||
u8 extend_promisc;
|
||||
u8 rsv0[21];
|
||||
};
|
||||
|
||||
enum hclge_promisc_type {
|
||||
|
@ -822,6 +825,7 @@ enum hclge_mac_vlan_cfg_sel {
|
|||
#define HCLGE_CFG_NIC_ROCE_SEL_B 4
|
||||
#define HCLGE_ACCEPT_TAG2_B 5
|
||||
#define HCLGE_ACCEPT_UNTAG2_B 6
|
||||
#define HCLGE_TAG_SHIFT_MODE_EN_B 7
|
||||
#define HCLGE_VF_NUM_PER_BYTE 8
|
||||
|
||||
struct hclge_vport_vtag_tx_cfg_cmd {
|
||||
|
@ -838,6 +842,8 @@ struct hclge_vport_vtag_tx_cfg_cmd {
|
|||
#define HCLGE_REM_TAG2_EN_B 1
|
||||
#define HCLGE_SHOW_TAG1_EN_B 2
|
||||
#define HCLGE_SHOW_TAG2_EN_B 3
|
||||
#define HCLGE_DISCARD_TAG1_EN_B 5
|
||||
#define HCLGE_DISCARD_TAG2_EN_B 6
|
||||
struct hclge_vport_vtag_rx_cfg_cmd {
|
||||
u8 vport_vlan_cfg;
|
||||
u8 vf_offset;
|
||||
|
|
|
@ -4826,61 +4826,56 @@ static int hclge_unmap_ring_frm_vector(struct hnae3_handle *handle, int vector,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev,
|
||||
struct hclge_promisc_param *param)
|
||||
static int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev, u8 vf_id,
|
||||
bool en_uc, bool en_mc, bool en_bc)
|
||||
{
|
||||
struct hclge_vport *vport = &hdev->vport[vf_id];
|
||||
struct hnae3_handle *handle = &vport->nic;
|
||||
struct hclge_promisc_cfg_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
bool uc_tx_en = en_uc;
|
||||
u8 promisc_cfg = 0;
|
||||
int ret;
|
||||
|
||||
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_PROMISC_MODE, false);
|
||||
|
||||
req = (struct hclge_promisc_cfg_cmd *)desc.data;
|
||||
req->vf_id = param->vf_id;
|
||||
req->vf_id = vf_id;
|
||||
|
||||
/* HCLGE_PROMISC_TX_EN_B and HCLGE_PROMISC_RX_EN_B are not supported on
|
||||
* pdev revision(0x20), new revision support them. The
|
||||
* value of this two fields will not return error when driver
|
||||
* send command to fireware in revision(0x20).
|
||||
*/
|
||||
req->flag = (param->enable << HCLGE_PROMISC_EN_B) |
|
||||
HCLGE_PROMISC_TX_EN_B | HCLGE_PROMISC_RX_EN_B;
|
||||
if (test_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags))
|
||||
uc_tx_en = false;
|
||||
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_UC_RX_EN, en_uc ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_MC_RX_EN, en_mc ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_BC_RX_EN, en_bc ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_UC_TX_EN, uc_tx_en ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_MC_TX_EN, en_mc ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_BC_TX_EN, en_bc ? 1 : 0);
|
||||
req->extend_promisc = promisc_cfg;
|
||||
|
||||
/* to be compatible with DEVICE_VERSION_V1/2 */
|
||||
promisc_cfg = 0;
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_EN_UC, en_uc ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_EN_MC, en_mc ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_EN_BC, en_bc ? 1 : 0);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_TX_EN, 1);
|
||||
hnae3_set_bit(promisc_cfg, HCLGE_PROMISC_RX_EN, 1);
|
||||
req->promisc = promisc_cfg;
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret)
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"failed to set vport %d promisc mode, ret = %d.\n",
|
||||
param->vf_id, ret);
|
||||
"failed to set vport %u promisc mode, ret = %d.\n",
|
||||
vf_id, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void hclge_promisc_param_init(struct hclge_promisc_param *param,
|
||||
bool en_uc, bool en_mc, bool en_bc,
|
||||
int vport_id)
|
||||
{
|
||||
if (!param)
|
||||
return;
|
||||
|
||||
memset(param, 0, sizeof(struct hclge_promisc_param));
|
||||
if (en_uc)
|
||||
param->enable = HCLGE_PROMISC_EN_UC;
|
||||
if (en_mc)
|
||||
param->enable |= HCLGE_PROMISC_EN_MC;
|
||||
if (en_bc)
|
||||
param->enable |= HCLGE_PROMISC_EN_BC;
|
||||
param->vf_id = vport_id;
|
||||
}
|
||||
|
||||
int hclge_set_vport_promisc_mode(struct hclge_vport *vport, bool en_uc_pmc,
|
||||
bool en_mc_pmc, bool en_bc_pmc)
|
||||
{
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
struct hclge_promisc_param param;
|
||||
|
||||
hclge_promisc_param_init(¶m, en_uc_pmc, en_mc_pmc, en_bc_pmc,
|
||||
vport->vport_id);
|
||||
return hclge_cmd_set_promisc_mode(hdev, ¶m);
|
||||
return hclge_cmd_set_promisc_mode(vport->back, vport->vport_id,
|
||||
en_uc_pmc, en_mc_pmc, en_bc_pmc);
|
||||
}
|
||||
|
||||
static int hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
|
||||
|
@ -8622,6 +8617,8 @@ static int hclge_set_vlan_tx_offload_cfg(struct hclge_vport *vport)
|
|||
vcfg->insert_tag1_en ? 1 : 0);
|
||||
hnae3_set_bit(req->vport_vlan_cfg, HCLGE_PORT_INS_TAG2_EN_B,
|
||||
vcfg->insert_tag2_en ? 1 : 0);
|
||||
hnae3_set_bit(req->vport_vlan_cfg, HCLGE_TAG_SHIFT_MODE_EN_B,
|
||||
vcfg->tag_shift_mode_en ? 1 : 0);
|
||||
hnae3_set_bit(req->vport_vlan_cfg, HCLGE_CFG_NIC_ROCE_SEL_B, 0);
|
||||
|
||||
req->vf_offset = vport->vport_id / HCLGE_VF_NUM_PER_CMD;
|
||||
|
@ -8659,6 +8656,10 @@ static int hclge_set_vlan_rx_offload_cfg(struct hclge_vport *vport)
|
|||
vcfg->vlan1_vlan_prionly ? 1 : 0);
|
||||
hnae3_set_bit(req->vport_vlan_cfg, HCLGE_SHOW_TAG2_EN_B,
|
||||
vcfg->vlan2_vlan_prionly ? 1 : 0);
|
||||
hnae3_set_bit(req->vport_vlan_cfg, HCLGE_DISCARD_TAG1_EN_B,
|
||||
vcfg->strip_tag1_discard_en ? 1 : 0);
|
||||
hnae3_set_bit(req->vport_vlan_cfg, HCLGE_DISCARD_TAG2_EN_B,
|
||||
vcfg->strip_tag2_discard_en ? 1 : 0);
|
||||
|
||||
req->vf_offset = vport->vport_id / HCLGE_VF_NUM_PER_CMD;
|
||||
bmap_index = vport->vport_id % HCLGE_VF_NUM_PER_CMD /
|
||||
|
@ -8686,7 +8687,10 @@ static int hclge_vlan_offload_cfg(struct hclge_vport *vport,
|
|||
vport->txvlan_cfg.insert_tag1_en = false;
|
||||
vport->txvlan_cfg.default_tag1 = 0;
|
||||
} else {
|
||||
vport->txvlan_cfg.accept_tag1 = false;
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(vport->nic.pdev);
|
||||
|
||||
vport->txvlan_cfg.accept_tag1 =
|
||||
ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3;
|
||||
vport->txvlan_cfg.insert_tag1_en = true;
|
||||
vport->txvlan_cfg.default_tag1 = vlan_tag;
|
||||
}
|
||||
|
@ -8701,16 +8705,21 @@ static int hclge_vlan_offload_cfg(struct hclge_vport *vport,
|
|||
vport->txvlan_cfg.accept_untag2 = true;
|
||||
vport->txvlan_cfg.insert_tag2_en = false;
|
||||
vport->txvlan_cfg.default_tag2 = 0;
|
||||
vport->txvlan_cfg.tag_shift_mode_en = true;
|
||||
|
||||
if (port_base_vlan_state == HNAE3_PORT_BASE_VLAN_DISABLE) {
|
||||
vport->rxvlan_cfg.strip_tag1_en = false;
|
||||
vport->rxvlan_cfg.strip_tag2_en =
|
||||
vport->rxvlan_cfg.rx_vlan_offload_en;
|
||||
vport->rxvlan_cfg.strip_tag2_discard_en = false;
|
||||
} else {
|
||||
vport->rxvlan_cfg.strip_tag1_en =
|
||||
vport->rxvlan_cfg.rx_vlan_offload_en;
|
||||
vport->rxvlan_cfg.strip_tag2_en = true;
|
||||
vport->rxvlan_cfg.strip_tag2_discard_en = true;
|
||||
}
|
||||
|
||||
vport->rxvlan_cfg.strip_tag1_discard_en = false;
|
||||
vport->rxvlan_cfg.vlan1_vlan_prionly = false;
|
||||
vport->rxvlan_cfg.vlan2_vlan_prionly = false;
|
||||
|
||||
|
@ -9005,10 +9014,14 @@ int hclge_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
|
|||
if (vport->port_base_vlan_cfg.state == HNAE3_PORT_BASE_VLAN_DISABLE) {
|
||||
vport->rxvlan_cfg.strip_tag1_en = false;
|
||||
vport->rxvlan_cfg.strip_tag2_en = enable;
|
||||
vport->rxvlan_cfg.strip_tag2_discard_en = false;
|
||||
} else {
|
||||
vport->rxvlan_cfg.strip_tag1_en = enable;
|
||||
vport->rxvlan_cfg.strip_tag2_en = true;
|
||||
vport->rxvlan_cfg.strip_tag2_discard_en = true;
|
||||
}
|
||||
|
||||
vport->rxvlan_cfg.strip_tag1_discard_en = false;
|
||||
vport->rxvlan_cfg.vlan1_vlan_prionly = false;
|
||||
vport->rxvlan_cfg.vlan2_vlan_prionly = false;
|
||||
vport->rxvlan_cfg.rx_vlan_offload_en = enable;
|
||||
|
@ -9120,6 +9133,7 @@ static u16 hclge_get_port_base_vlan_state(struct hclge_vport *vport,
|
|||
static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid,
|
||||
u16 vlan, u8 qos, __be16 proto)
|
||||
{
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
struct hclge_vlan_info vlan_info;
|
||||
|
@ -9149,16 +9163,25 @@ static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid,
|
|||
vlan_info.qos = qos;
|
||||
vlan_info.vlan_proto = ntohs(proto);
|
||||
|
||||
if (!test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state)) {
|
||||
return hclge_update_port_base_vlan_cfg(vport, state,
|
||||
&vlan_info);
|
||||
} else {
|
||||
ret = hclge_push_vf_port_base_vlan_info(&hdev->vport[0],
|
||||
ret = hclge_update_port_base_vlan_cfg(vport, state, &vlan_info);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"failed to update port base vlan for vf %d, ret = %d\n",
|
||||
vfid, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* for DEVICE_VERSION_V3, vf doesn't need to know about the port based
|
||||
* VLAN state.
|
||||
*/
|
||||
if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3 &&
|
||||
test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state))
|
||||
hclge_push_vf_port_base_vlan_info(&hdev->vport[0],
|
||||
vport->vport_id, state,
|
||||
vlan, qos,
|
||||
ntohs(proto));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hclge_clear_vf_vlan(struct hclge_dev *hdev)
|
||||
|
|
|
@ -850,15 +850,18 @@ struct hclge_tx_vtag_cfg {
|
|||
bool insert_tag2_en; /* Whether insert outer vlan tag */
|
||||
u16 default_tag1; /* The default inner vlan tag to insert */
|
||||
u16 default_tag2; /* The default outer vlan tag to insert */
|
||||
bool tag_shift_mode_en;
|
||||
};
|
||||
|
||||
/* VPort level vlan tag configuration for RX direction */
|
||||
struct hclge_rx_vtag_cfg {
|
||||
u8 rx_vlan_offload_en; /* Whether enable rx vlan offload */
|
||||
u8 strip_tag1_en; /* Whether strip inner vlan tag */
|
||||
u8 strip_tag2_en; /* Whether strip outer vlan tag */
|
||||
u8 vlan1_vlan_prionly; /* Inner VLAN Tag up to descriptor Enable */
|
||||
u8 vlan2_vlan_prionly; /* Outer VLAN Tag up to descriptor Enable */
|
||||
bool rx_vlan_offload_en; /* Whether enable rx vlan offload */
|
||||
bool strip_tag1_en; /* Whether strip inner vlan tag */
|
||||
bool strip_tag2_en; /* Whether strip outer vlan tag */
|
||||
bool vlan1_vlan_prionly; /* Inner vlan tag up to descriptor enable */
|
||||
bool vlan2_vlan_prionly; /* Outer vlan tag up to descriptor enable */
|
||||
bool strip_tag1_discard_en; /* Inner vlan tag discard for BD enable */
|
||||
bool strip_tag2_discard_en; /* Outer vlan tag discard for BD enable */
|
||||
};
|
||||
|
||||
struct hclge_rss_tuple_cfg {
|
||||
|
|
|
@ -227,6 +227,7 @@ static int hclge_set_vf_promisc_mode(struct hclge_vport *vport,
|
|||
bool en_bc = req->msg.en_bc ? true : false;
|
||||
bool en_uc = req->msg.en_uc ? true : false;
|
||||
bool en_mc = req->msg.en_mc ? true : false;
|
||||
struct hnae3_handle *handle = &vport->nic;
|
||||
int ret;
|
||||
|
||||
if (!vport->vf_info.trusted) {
|
||||
|
@ -234,6 +235,12 @@ static int hclge_set_vf_promisc_mode(struct hclge_vport *vport,
|
|||
en_mc = false;
|
||||
}
|
||||
|
||||
if (req->msg.en_limit_promisc)
|
||||
set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
|
||||
else
|
||||
clear_bit(HNAE3_PFLAG_LIMIT_PROMISC,
|
||||
&handle->priv_flags);
|
||||
|
||||
ret = hclge_set_vport_promisc_mode(vport, en_uc, en_mc, en_bc);
|
||||
|
||||
vport->vf_info.promisc_enable = (en_uc || en_mc) ? 1 : 0;
|
||||
|
@ -371,7 +378,16 @@ static int hclge_set_vf_vlan_cfg(struct hclge_vport *vport,
|
|||
status = hclge_update_port_base_vlan_cfg(vport, *state,
|
||||
vlan_info);
|
||||
} else if (msg_cmd->subcode == HCLGE_MBX_GET_PORT_BASE_VLAN_STATE) {
|
||||
resp_msg->data[0] = vport->port_base_vlan_cfg.state;
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(vport->nic.pdev);
|
||||
/* vf does not need to know about the port based VLAN state
|
||||
* on device HNAE3_DEVICE_VERSION_V3. So always return disable
|
||||
* on device HNAE3_DEVICE_VERSION_V3 if vf queries the port
|
||||
* based VLAN state.
|
||||
*/
|
||||
resp_msg->data[0] =
|
||||
ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3 ?
|
||||
HNAE3_PORT_BASE_VLAN_DISABLE :
|
||||
vport->port_base_vlan_cfg.state;
|
||||
resp_msg->len = sizeof(u8);
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@
|
|||
#define HCLGEVF_RESET_MAX_FAIL_CNT 5
|
||||
|
||||
static int hclgevf_reset_hdev(struct hclgevf_dev *hdev);
|
||||
static void hclgevf_task_schedule(struct hclgevf_dev *hdev,
|
||||
unsigned long delay);
|
||||
|
||||
static struct hnae3_ae_algo ae_algovf;
|
||||
|
||||
static struct workqueue_struct *hclgevf_wq;
|
||||
|
@ -1146,6 +1149,7 @@ static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,
|
|||
bool en_uc_pmc, bool en_mc_pmc,
|
||||
bool en_bc_pmc)
|
||||
{
|
||||
struct hnae3_handle *handle = &hdev->nic;
|
||||
struct hclge_vf_to_pf_msg send_msg;
|
||||
int ret;
|
||||
|
||||
|
@ -1154,6 +1158,8 @@ static int hclgevf_cmd_set_promisc_mode(struct hclgevf_dev *hdev,
|
|||
send_msg.en_bc = en_bc_pmc ? 1 : 0;
|
||||
send_msg.en_uc = en_uc_pmc ? 1 : 0;
|
||||
send_msg.en_mc = en_mc_pmc ? 1 : 0;
|
||||
send_msg.en_limit_promisc = test_bit(HNAE3_PFLAG_LIMIT_PROMISC,
|
||||
&handle->priv_flags) ? 1 : 0;
|
||||
|
||||
ret = hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
|
||||
if (ret)
|
||||
|
@ -1180,6 +1186,7 @@ static void hclgevf_request_update_promisc_mode(struct hnae3_handle *handle)
|
|||
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
|
||||
set_bit(HCLGEVF_STATE_PROMISC_CHANGED, &hdev->state);
|
||||
hclgevf_task_schedule(hdev, 0);
|
||||
}
|
||||
|
||||
static void hclgevf_sync_promisc_mode(struct hclgevf_dev *hdev)
|
||||
|
|
Loading…
Reference in New Issue