1
There are some bugfix for the HNS3 ethernet driver
1
There are some bugfix for the HNS3 ethernet driver
2
2
3
Hao Lan (1):
3
Jian Shen (2):
4
net: hns3: fix spelling mistake "reg_um" -> "reg_num"
4
net: hns3: fix add VLAN fail issue
5
net: hns3: fix incorrect capability bit display for copper port
5
6
6
Jian Shen (1):
7
Jijie Shao (2):
7
net: hns3: store rx VLAN tag offload state for VF
8
net: hns3: fix VF reset fail issue
9
net: hns3: fix VF wrong speed and duplex issue
8
10
9
Yonglong Liu (1):
11
Yonglong Liu (3):
10
net: hns3: fix a use of uninitialized variable problem
12
net: hns3: add barrier in vf mailbox reply process
13
net: hns3: fix out-of-bounds access may occur when coalesce info is
14
read via debugfs
15
net: hns3: fix variable may not initialized problem in
16
hns3_init_mac_addr()
11
17
12
.../hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
18
.../ethernet/hisilicon/hns3/hns3_debugfs.c | 9 ++++---
13
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++-----
19
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 2 +-
14
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++-
20
.../hisilicon/hns3/hns3pf/hclge_main.c | 26 ++++++++++++++-----
15
.../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++---------
21
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 24 +++++++++++++----
16
4 files changed, 36 insertions(+), 21 deletions(-)
22
.../hisilicon/hns3/hns3vf/hclgevf_mbx.c | 7 +++++
23
5 files changed, 53 insertions(+), 15 deletions(-)
17
24
18
--
25
--
19
2.33.0
26
2.30.0
diff view generated by jsdifflib
New patch
1
From: Jian Shen <shenjian15@huawei.com>
1
2
3
The hclge_sync_vlan_filter is called in periodic task,
4
trying to remove VLAN from vlan_del_fail_bmap. It can
5
be concurrence with VLAN adding operation from user.
6
So once user failed to delete a VLAN id, and add it
7
again soon, it may be removed by the periodic task,
8
which may cause the software configuration being
9
inconsistent with hardware. So add mutex handling
10
to avoid this.
11
12
user hns3 driver
13
14
periodic task
15
16
add vlan 10 ───── hns3_vlan_rx_add_vid │
17
│ (suppose success) │
18
│ │
19
del vlan 10 ───── hns3_vlan_rx_kill_vid │
20
│ (suppose fail,add to │
21
│ vlan_del_fail_bmap) │
22
│ │
23
add vlan 10 ───── hns3_vlan_rx_add_vid │
24
(suppose success) │
25
foreach vlan_del_fail_bmp
26
del vlan 10
27
28
Fixes: fe4144d47eef ("net: hns3: sync VLAN filter entries when kill VLAN ID failed")
29
Signed-off-by: Jian Shen <shenjian15@huawei.com>
30
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
31
---
32
.../hisilicon/hns3/hns3pf/hclge_main.c | 21 +++++++++++++------
33
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 11 ++++++++--
34
2 files changed, 24 insertions(+), 8 deletions(-)
35
36
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
39
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
40
@@ -XXX,XX +XXX,XX @@ static void hclge_rm_vport_vlan_table(struct hclge_vport *vport, u16 vlan_id,
41
    struct hclge_vport_vlan_cfg *vlan, *tmp;
42
    struct hclge_dev *hdev = vport->back;
43
44
-    mutex_lock(&hdev->vport_lock);
45
-
46
    list_for_each_entry_safe(vlan, tmp, &vport->vlan_list, node) {
47
        if (vlan->vlan_id == vlan_id) {
48
            if (is_write_tbl && vlan->hd_tbl_status)
49
@@ -XXX,XX +XXX,XX @@ static void hclge_rm_vport_vlan_table(struct hclge_vport *vport, u16 vlan_id,
50
            break;
51
        }
52
    }
53
-
54
-    mutex_unlock(&hdev->vport_lock);
55
}
56
57
void hclge_rm_vport_all_vlan_table(struct hclge_vport *vport, bool is_del_list)
58
@@ -XXX,XX +XXX,XX @@ int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto,
59
     * handle mailbox. Just record the vlan id, and remove it after
60
     * reset finished.
61
     */
62
+    mutex_lock(&hdev->vport_lock);
63
    if ((test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
64
     test_bit(HCLGE_STATE_RST_FAIL, &hdev->state)) && is_kill) {
65
        set_bit(vlan_id, vport->vlan_del_fail_bmap);
66
+        mutex_unlock(&hdev->vport_lock);
67
        return -EBUSY;
68
+    } else if (!is_kill && test_bit(vlan_id, vport->vlan_del_fail_bmap)) {
69
+        clear_bit(vlan_id, vport->vlan_del_fail_bmap);
70
    }
71
+    mutex_unlock(&hdev->vport_lock);
72
73
    /* when port base vlan enabled, we use port base vlan as the vlan
74
     * filter entry. In this case, we don't update vlan filter table
75
@@ -XXX,XX +XXX,XX @@ int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto,
76
         * and try to remove it from hw later, to be consistence
77
         * with stack
78
         */
79
+        mutex_lock(&hdev->vport_lock);
80
        set_bit(vlan_id, vport->vlan_del_fail_bmap);
81
+        mutex_unlock(&hdev->vport_lock);
82
    }
83
84
    hclge_set_vport_vlan_fltr_change(vport);
85
@@ -XXX,XX +XXX,XX @@ static void hclge_sync_vlan_filter(struct hclge_dev *hdev)
86
    int i, ret, sync_cnt = 0;
87
    u16 vlan_id;
88
89
+    mutex_lock(&hdev->vport_lock);
90
    /* start from vport 1 for PF is always alive */
91
    for (i = 0; i < hdev->num_alloc_vport; i++) {
92
        struct hclge_vport *vport = &hdev->vport[i];
93
@@ -XXX,XX +XXX,XX @@ static void hclge_sync_vlan_filter(struct hclge_dev *hdev)
94
            ret = hclge_set_vlan_filter_hw(hdev, htons(ETH_P_8021Q),
95
                         vport->vport_id, vlan_id,
96
                         true);
97
-            if (ret && ret != -EINVAL)
98
+            if (ret && ret != -EINVAL) {
99
+                mutex_unlock(&hdev->vport_lock);
100
                return;
101
+            }
102
103
            clear_bit(vlan_id, vport->vlan_del_fail_bmap);
104
            hclge_rm_vport_vlan_table(vport, vlan_id, false);
105
            hclge_set_vport_vlan_fltr_change(vport);
106
107
            sync_cnt++;
108
-            if (sync_cnt >= HCLGE_MAX_SYNC_COUNT)
109
+            if (sync_cnt >= HCLGE_MAX_SYNC_COUNT) {
110
+                mutex_unlock(&hdev->vport_lock);
111
                return;
112
+            }
113
114
            vlan_id = find_first_bit(vport->vlan_del_fail_bmap,
115
                         VLAN_N_VID);
116
        }
117
    }
118
+    mutex_unlock(&hdev->vport_lock);
119
120
    hclge_sync_vlan_fltr_state(hdev);
121
}
122
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
125
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
126
@@ -XXX,XX +XXX,XX @@ static int hclgevf_set_vlan_filter(struct hnae3_handle *handle,
127
     test_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state)) && is_kill) {
128
        set_bit(vlan_id, hdev->vlan_del_fail_bmap);
129
        return -EBUSY;
130
+    } else if (!is_kill && test_bit(vlan_id, hdev->vlan_del_fail_bmap)) {
131
+        clear_bit(vlan_id, hdev->vlan_del_fail_bmap);
132
    }
133
134
    hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
135
@@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev)
136
    int ret, sync_cnt = 0;
137
    u16 vlan_id;
138
139
+    if (bitmap_empty(hdev->vlan_del_fail_bmap, VLAN_N_VID))
140
+        return;
141
+
142
+    rtnl_lock();
143
    vlan_id = find_first_bit(hdev->vlan_del_fail_bmap, VLAN_N_VID);
144
    while (vlan_id != VLAN_N_VID) {
145
        ret = hclgevf_set_vlan_filter(handle, htons(ETH_P_8021Q),
146
                     vlan_id, true);
147
        if (ret)
148
-            return;
149
+            break;
150
151
        clear_bit(vlan_id, hdev->vlan_del_fail_bmap);
152
        sync_cnt++;
153
        if (sync_cnt >= HCLGEVF_MAX_SYNC_COUNT)
154
-            return;
155
+            break;
156
157
        vlan_id = find_first_bit(hdev->vlan_del_fail_bmap, VLAN_N_VID);
158
    }
159
+    rtnl_unlock();
160
}
161
162
static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
163
--
164
2.30.0
165
diff view generated by jsdifflib
New patch
1
From: Yonglong Liu <liuyonglong@huawei.com>
1
2
3
In hclgevf_mbx_handler() and hclgevf_get_mbx_resp() functions,
4
there is a typical store-store and load-load scenario between
5
received_resp and additional_info. This patch adds barrier
6
to fix the problem.
7
8
Fixes: 4671042f1ef0 ("net: hns3: add match_id to check mailbox response from PF to VF")
9
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
10
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
11
---
12
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | 7 +++++++
13
1 file changed, 7 insertions(+)
14
15
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
18
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c
19
@@ -XXX,XX +XXX,XX @@ static int hclgevf_get_mbx_resp(struct hclgevf_dev *hdev, u16 code0, u16 code1,
20
        i++;
21
    }
22
23
+    /* ensure additional_info will be seen after received_resp */
24
+    smp_rmb();
25
+
26
    if (i >= HCLGEVF_MAX_TRY_TIMES) {
27
        dev_err(&hdev->pdev->dev,
28
            "VF could not get mbx(%u,%u) resp(=%d) from PF in %d tries\n",
29
@@ -XXX,XX +XXX,XX @@ static void hclgevf_handle_mbx_response(struct hclgevf_dev *hdev,
30
    resp->resp_status = hclgevf_resp_to_errno(resp_status);
31
    memcpy(resp->additional_info, req->msg.resp_data,
32
     HCLGE_MBX_MAX_RESP_DATA_SIZE * sizeof(u8));
33
+
34
+    /* ensure additional_info will be seen before setting received_resp */
35
+    smp_wmb();
36
+
37
    if (match_id) {
38
        /* If match_id is not zero, it means PF support match_id.
39
         * if the match_id is right, VF get the right response, or
40
--
41
2.30.0
diff view generated by jsdifflib
New patch
1
From: Jian Shen <shenjian15@huawei.com>
1
2
3
Currently, the FEC capability bit is default set for device version V2.
4
It's incorrect for the copper port. Eventhough it doesn't make the nic
5
work abnormal, but the capability information display in debugfs may
6
confuse user. So clear it when driver get the port type inforamtion.
7
8
Fixes: 433ccce83504 ("net: hns3: use FEC capability queried from firmware")
9
Signed-off-by: Jian Shen <shenjian15@huawei.com>
10
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
11
---
12
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 1 +
13
1 file changed, 1 insertion(+)
14
15
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
18
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
19
@@ -XXX,XX +XXX,XX @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
20
        goto err_msi_irq_uninit;
21
22
    if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER) {
23
+        clear_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps);
24
        if (hnae3_dev_phy_imp_supported(hdev))
25
            ret = hclge_update_tp_port_info(hdev);
26
        else
27
--
28
2.30.0
diff view generated by jsdifflib
1
From: Hao Lan <lanhao@huawei.com>
1
From: Yonglong Liu <liuyonglong@huawei.com>
2
2
3
There are spelling mistakes in hclgevf_get_regs. Fix them.
3
The hns3 driver define an array of string to show the coalesce
4
info, but if the kernel adds a new mode or a new state,
5
out-of-bounds access may occur when coalesce info is read via
6
debugfs, this patch fix the problem.
4
7
5
Signed-off-by: Hao Lan <lanhao@huawei.com>
8
Fixes: c99fead7cb07 ("net: hns3: add debugfs support for interrupt coalesce")
9
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
6
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
10
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
7
---
11
---
8
.../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++---------
12
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 9 ++++++---
9
1 file changed, 14 insertions(+), 13 deletions(-)
13
1 file changed, 6 insertions(+), 3 deletions(-)
10
14
11
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
15
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
17
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
14
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
18
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
15
@@ -XXX,XX +XXX,XX @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version,
19
@@ -XXX,XX +XXX,XX @@ static void hns3_get_coal_info(struct hns3_enet_tqp_vector *tqp_vector,
16
17
    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
18
    struct hnae3_queue *tqp;
19
-    int i, j, reg_um;
20
+    int i, j, reg_num;
21
    u32 *reg = data;
22
23
    *version = hdev->fw_version;
24
    reg += hclgevf_reg_get_header(reg);
25
26
    /* fetching per-VF registers values from VF PCIe register space */
27
-    reg_um = ARRAY_SIZE(cmdq_reg_addr_list);
28
-    reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg);
29
-    for (i = 0; i < reg_um; i++)
30
+    reg_num = ARRAY_SIZE(cmdq_reg_addr_list);
31
+    reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_num, reg);
32
+    for (i = 0; i < reg_num; i++)
33
        *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]);
34
35
-    reg_um = ARRAY_SIZE(common_reg_addr_list);
36
-    reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg);
37
-    for (i = 0; i < reg_um; i++)
38
+    reg_num = ARRAY_SIZE(common_reg_addr_list);
39
+    reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_num, reg);
40
+    for (i = 0; i < reg_num; i++)
41
        *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]);
42
43
-    reg_um = ARRAY_SIZE(ring_reg_addr_list);
44
+    reg_num = ARRAY_SIZE(ring_reg_addr_list);
45
    for (j = 0; j < hdev->num_tqps; j++) {
46
-        reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg);
47
+        reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_num, reg);
48
        tqp = &hdev->htqp[j].q;
49
-        for (i = 0; i < reg_um; i++)
50
+        for (i = 0; i < reg_num; i++)
51
            *reg++ = readl_relaxed(tqp->io_base -
52
                     HCLGEVF_TQP_REG_OFFSET +
53
                     ring_reg_addr_list[i]);
54
    }
20
    }
55
21
56
-    reg_um = ARRAY_SIZE(tqp_intr_reg_addr_list);
22
    sprintf(result[j++], "%d", i);
57
+    reg_num = ARRAY_SIZE(tqp_intr_reg_addr_list);
23
-    sprintf(result[j++], "%s", dim_state_str[dim->state]);
58
    for (j = 0; j < hdev->num_msi_used - 1; j++) {
24
+    sprintf(result[j++], "%s", dim->state < ARRAY_SIZE(dim_state_str) ?
59
-        reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_um, reg);
25
+        dim_state_str[dim->state] : "unknown");
60
-        for (i = 0; i < reg_um; i++)
26
    sprintf(result[j++], "%u", dim->profile_ix);
61
+        reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR,
27
-    sprintf(result[j++], "%s", dim_cqe_mode_str[dim->mode]);
62
+                     reg_num, reg);
28
+    sprintf(result[j++], "%s", dim->mode < ARRAY_SIZE(dim_cqe_mode_str) ?
63
+        for (i = 0; i < reg_num; i++)
29
+        dim_cqe_mode_str[dim->mode] : "unknown");
64
            *reg++ = hclgevf_read_dev(&hdev->hw,
30
    sprintf(result[j++], "%s",
65
                         tqp_intr_reg_addr_list[i] +
31
-        dim_tune_stat_str[dim->tune_state]);
66
                         HCLGEVF_RING_INT_REG_OFFSET * j);
32
+        dim->tune_state < ARRAY_SIZE(dim_tune_stat_str) ?
33
+        dim_tune_stat_str[dim->tune_state] : "unknown");
34
    sprintf(result[j++], "%u", dim->steps_left);
35
    sprintf(result[j++], "%u", dim->steps_right);
36
    sprintf(result[j++], "%u", dim->tired);
67
--
37
--
68
2.33.0
38
2.30.0
diff view generated by jsdifflib
New patch
1
From: Yonglong Liu <liuyonglong@huawei.com>
1
2
3
When a VF is calling hns3_init_mac_addr(), get_mac_addr() may
4
return fail, then the value of mac_addr_temp is not initialized.
5
6
Fixes: 76ad4f0ee747 ("net: hns3: Add support of HNS3 Ethernet Driver for hip08 SoC")
7
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
8
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
9
---
10
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
16
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
17
@@ -XXX,XX +XXX,XX @@ static int hns3_init_mac_addr(struct net_device *netdev)
18
    struct hns3_nic_priv *priv = netdev_priv(netdev);
19
    char format_mac_addr[HNAE3_FORMAT_MAC_ADDR_LEN];
20
    struct hnae3_handle *h = priv->ae_handle;
21
-    u8 mac_addr_temp[ETH_ALEN];
22
+    u8 mac_addr_temp[ETH_ALEN] = {0};
23
    int ret = 0;
24
25
    if (h->ae_algo->ops->get_mac_addr)
26
--
27
2.30.0
diff view generated by jsdifflib
1
From: Jian Shen <shenjian15@huawei.com>
1
Currently the reset process in hns3 and firmware watchdog init process is
2
asynchronous. We think firmware watchdog initialization is completed
3
before VF clear the interrupt source. However, firmware initialization
4
may not complete early. So VF will receive multiple reset interrupts
5
and fail to reset.
2
6
3
The VF driver missed to store the rx VLAN tag strip state when
7
So we add delay before VF interrupt source and 5 ms delay
4
user change the rx VLAN tag offload state. And it will default
8
is enough to avoid second reset interrupt.
5
to enable the rx vlan tag strip when re-init VF device after
6
reset. So if user disable rx VLAN tag offload, and trig reset,
7
then the HW will still strip the VLAN tag from packet nad fill
8
into RX BD, but the VF driver will ignore it for rx VLAN tag
9
offload disabled. It may cause the rx VLAN tag dropped.
10
9
11
Fixes: b2641e2ad456 ("net: hns3: Add support of hardware rx-vlan-offload to HNS3 VF driver")
10
Fixes: 427900d27d86 ("net: hns3: fix the timing issue of VF clearing interrupt sources")
12
Signed-off-by: Jian Shen <shenjian15@huawei.com>
13
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
11
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
14
---
12
---
15
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++-----
13
.../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 13 ++++++++++---
16
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++-
14
1 file changed, 10 insertions(+), 3 deletions(-)
17
2 files changed, 21 insertions(+), 7 deletions(-)
18
15
19
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
16
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
18
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
22
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
19
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
23
@@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev)
20
@@ -XXX,XX +XXX,XX @@ static void hclgevf_service_task(struct work_struct *work)
24
    rtnl_unlock();
21
    hclgevf_mailbox_service_task(hdev);
25
}
22
}
26
23
27
-static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
24
-static void hclgevf_clear_event_cause(struct hclgevf_dev *hdev, u32 regclr)
28
+static int hclgevf_en_hw_strip_rxvtag_cmd(struct hclgevf_dev *hdev, bool enable)
25
+static void hclgevf_clear_event_cause(struct hclgevf_dev *hdev, u32 regclr,
26
+                 bool need_dalay)
29
{
27
{
30
-    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
28
+#define HCLGEVF_RESET_DELAY        5
31
    struct hclge_vf_to_pf_msg send_msg;
29
+
32
30
+    if (need_dalay)
33
    hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
31
+        mdelay(HCLGEVF_RESET_DELAY);
34
@@ -XXX,XX +XXX,XX @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
32
+
35
    return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
33
    hclgevf_write_dev(&hdev->hw, HCLGE_COMM_VECTOR0_CMDQ_SRC_REG, regclr);
36
}
34
}
37
35
38
+static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
36
@@ -XXX,XX +XXX,XX @@ static irqreturn_t hclgevf_misc_irq_handle(int irq, void *data)
39
+{
37
    hclgevf_enable_vector(&hdev->misc_vector, false);
40
+    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
38
    event_cause = hclgevf_check_evt_cause(hdev, &clearval);
41
+    int ret;
39
    if (event_cause != HCLGEVF_VECTOR0_EVENT_OTHER)
42
+
40
-        hclgevf_clear_event_cause(hdev, clearval);
43
+    ret = hclgevf_en_hw_strip_rxvtag_cmd(hdev, enable);
41
+        hclgevf_clear_event_cause(hdev, clearval,
44
+    if (ret)
42
+                     event_cause == HCLGEVF_VECTOR0_EVENT_RST);
45
+        return ret;
43
46
+
44
    switch (event_cause) {
47
+    hdev->rxvtag_strip_en = enable;
45
    case HCLGEVF_VECTOR0_EVENT_RST:
48
+    return 0;
46
@@ -XXX,XX +XXX,XX @@ static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev)
49
+}
50
+
51
static int hclgevf_reset_tqp(struct hnae3_handle *handle)
52
{
53
#define HCLGEVF_RESET_ALL_QUEUE_DONE    1U
54
@@ -XXX,XX +XXX,XX @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
55
                     tc_valid, tc_size);
56
}
57
58
-static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev)
59
+static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev,
60
+                 bool rxvtag_strip_en)
61
{
62
    struct hnae3_handle *nic = &hdev->nic;
63
    int ret;
64
65
-    ret = hclgevf_en_hw_strip_rxvtag(nic, true);
66
+    ret = hclgevf_en_hw_strip_rxvtag(nic, rxvtag_strip_en);
67
    if (ret) {
68
        dev_err(&hdev->pdev->dev,
69
            "failed to enable rx vlan offload, ret = %d\n", ret);
70
@@ -XXX,XX +XXX,XX @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
71
    if (ret)
72
        return ret;
47
        return ret;
73
74
-    ret = hclgevf_init_vlan_config(hdev);
75
+    ret = hclgevf_init_vlan_config(hdev, hdev->rxvtag_strip_en);
76
    if (ret) {
77
        dev_err(&hdev->pdev->dev,
78
            "failed(%d) to initialize VLAN config\n", ret);
79
@@ -XXX,XX +XXX,XX @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
80
        goto err_config;
81
    }
48
    }
82
49
83
-    ret = hclgevf_init_vlan_config(hdev);
50
-    hclgevf_clear_event_cause(hdev, 0);
84
+    ret = hclgevf_init_vlan_config(hdev, true);
51
+    hclgevf_clear_event_cause(hdev, 0, false);
85
    if (ret) {
52
86
        dev_err(&hdev->pdev->dev,
53
    /* enable misc. vector(vector 0) */
87
            "failed(%d) to initialize VLAN config\n", ret);
54
    hclgevf_enable_vector(&hdev->misc_vector, true);
88
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
89
index XXXXXXX..XXXXXXX 100644
90
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
91
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
92
@@ -XXX,XX +XXX,XX @@ struct hclgevf_dev {
93
    u16 *vector_status;
94
    int *vector_irq;
95
96
-    bool gro_en;
97
+    u32 gro_en :1;
98
+    u32 rxvtag_strip_en :1;
99
100
    unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)];
101
102
--
55
--
103
2.33.0
56
2.30.0
diff view generated by jsdifflib
1
From: Yonglong Liu <liuyonglong@huawei.com>
1
If PF is down, firmware will returns 10 Mbit/s rate and half-duplex mode
2
when PF queries the port information from firmware.
2
3
3
In hclge_add_fd_entry(), if the flow type is FLOW_EXT, and the data of
4
After imp reset command is executed, PF status changes to down,
4
m_ext is all zero, then some members of the local variable "info" are
5
and PF will query link status and updates port information
5
not initialized.
6
from firmware in a periodic scheduled task.
6
7
7
Fixes: 67b0e1428e2f ("net: hns3: add support for user-def data of flow director")
8
However, there is a low probability that port information is updated
8
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
9
when PF is down, and then PF link status changes to up.
10
In this case, PF synchronizes incorrect rate and duplex mode to VF.
11
12
This patch fixes it by updating port information before
13
PF synchronizes the rate and duplex to the VF
14
when PF changes to up.
15
16
Fixes: 18b6e31f8bf4 ("net: hns3: PF add support for pushing link status to VFs")
9
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
17
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
10
---
18
---
11
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
19
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 ++++
12
1 file changed, 1 insertion(+), 1 deletion(-)
20
1 file changed, 4 insertions(+)
13
21
14
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
22
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
15
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
16
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
24
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
17
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
25
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
18
@@ -XXX,XX +XXX,XX @@ static int hclge_add_fd_entry(struct hnae3_handle *handle,
26
@@ -XXX,XX +XXX,XX @@ static void hclge_sync_fd_table(struct hclge_dev *hdev);
19
             struct ethtool_rxnfc *cmd)
27
static void hclge_update_fec_stats(struct hclge_dev *hdev);
20
{
28
static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret,
21
    struct hclge_vport *vport = hclge_get_vport(handle);
29
                 int wait_cnt);
22
+    struct hclge_fd_user_def_info info = {0};
30
+static int hclge_update_port_info(struct hclge_dev *hdev);
23
    struct hclge_dev *hdev = vport->back;
31
24
-    struct hclge_fd_user_def_info info;
32
static struct hnae3_ae_algo ae_algo;
25
    u16 dst_vport_id = 0, q_index = 0;
33
26
    struct ethtool_rx_flow_spec *fs;
34
@@ -XXX,XX +XXX,XX @@ static void hclge_update_link_status(struct hclge_dev *hdev)
27
    struct hclge_fd_rule *rule;
35
36
    if (state != hdev->hw.mac.link) {
37
        hdev->hw.mac.link = state;
38
+        if (state == HCLGE_LINK_STATUS_UP)
39
+            hclge_update_port_info(hdev);
40
+
41
        client->ops->link_status_change(handle, state);
42
        hclge_config_mac_tnl_int(hdev, state);
43
        if (rclient && rclient->ops->link_status_change)
28
--
44
--
29
2.33.0
45
2.30.0
diff view generated by jsdifflib