Commit 2922b071 authored by Fengyan Mu's avatar Fengyan Mu Committed by Fengyan
Browse files

UNIC: Support changing MTU size in UB mode

driver inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I850RQ


CVE: NA

-----------------------------------------------------------

When the driver runs in UB mode and user prefers to modify
the MTU size, thr driver will judge if the size available
in UB mode.

Signed-off-by: default avatarFengyan Mu <mufengyan@hisilicon.com>
Signed-off-by: default avatarHaiqing Fang <fanghaiqing@huawei.com>
Signed-off-by: default avatarJunxin Chen <chenjunxin1@huawei.com>
parent f52063cd
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -31,6 +31,10 @@ void hns3_unic_set_default_cc(struct sk_buff *skb)

void hns3_unic_init(struct net_device *netdev)
{
	struct hnae3_handle *h = hns3_get_handle(netdev);
	struct pci_dev *pdev = h->pdev;
	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);

	netdev->features &= ~(NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_CSUM |
		NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
		NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_TX);
@@ -40,6 +44,7 @@ void hns3_unic_init(struct net_device *netdev)
		NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_TX);

	netdev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
	netdev->max_mtu = ae_dev->dev_specs.max_frm_size;
}

/**
+20 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include <net/ipv6.h>
#include <net/rtnetlink.h>
#include <net/vxlan.h>
#include "ubl.h"
#include "hclge_cmd.h"
#include "hclge_dcb.h"
#include "hclge_ext.h"
@@ -1829,6 +1830,10 @@ static int hclge_alloc_vport(struct hclge_dev *hdev)
		vport->vport_id = i;
		vport->vf_info.link_state = IFLA_VF_LINK_STATE_AUTO;
		vport->mps = HCLGE_MAC_DEFAULT_FRAME;
#ifdef CONFIG_HNS3_UBL
		if (hnae3_dev_ubl_supported(hdev->ae_dev))
			vport->mps = UB_DATA_LEN;
#endif
		vport->port_base_vlan_cfg.state = HNAE3_PORT_BASE_VLAN_DISABLE;
		vport->port_base_vlan_cfg.tbl_sta = true;
		vport->rxvlan_cfg.rx_vlan_offload_en = true;
@@ -11035,16 +11040,28 @@ static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu)

int hclge_set_vport_mtu(struct hclge_vport *vport, int new_mtu)
{
	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(vport->nic.pdev);
	int l2_hlen = ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN;
	int default_size = HCLGE_MAC_DEFAULT_FRAME;
	int min_frm_size = HCLGE_MAC_MIN_FRAME;
	struct hclge_dev *hdev = vport->back;
	int i, max_frm_size, ret;

#ifdef CONFIG_HNS3_UBL
	if (hnae3_dev_ubl_supported(ae_dev)) {
		/* UB MTU */
		l2_hlen = 0;
		min_frm_size = UB_MIN_MTU;
		default_size = UB_DATA_LEN;
	}
#endif
	/* HW supprt 2 layer vlan */
	max_frm_size = new_mtu + ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN;
	if (max_frm_size < HCLGE_MAC_MIN_FRAME ||
	max_frm_size = new_mtu + l2_hlen;
	if (max_frm_size < min_frm_size ||
	    max_frm_size > hdev->ae_dev->dev_specs.max_frm_size)
		return -EINVAL;

	max_frm_size = max(max_frm_size, HCLGE_MAC_DEFAULT_FRAME);
	max_frm_size = max(max_frm_size, default_size);
	mutex_lock(&hdev->vport_lock);
	/* VF's mps must fit within hdev->mps */
	if (vport->vport_id && max_frm_size > hdev->mps) {