]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.14.105/hv_netvsc-fix-ethtool-change-hash-key-error.patch
Linux 4.14.105
[thirdparty/kernel/stable-queue.git] / releases / 4.14.105 / hv_netvsc-fix-ethtool-change-hash-key-error.patch
CommitLineData
9aa60b56
SL
1From 12054d07099326edda95a2ac4d76767f767d5c2f Mon Sep 17 00:00:00 2001
2From: Haiyang Zhang <haiyangz@microsoft.com>
3Date: Tue, 15 Jan 2019 00:51:42 +0000
4Subject: hv_netvsc: Fix ethtool change hash key error
5
6[ Upstream commit b4a10c750424e01b5e37372fef0a574ebf7b56c3 ]
7
8Hyper-V hosts require us to disable RSS before changing RSS key,
9otherwise the changing request will fail. This patch fixes the
10coding error.
11
12Fixes: ff4a44199012 ("netvsc: allow get/set of RSS indirection table")
13Reported-by: Wei Hu <weh@microsoft.com>
14Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
15Reviewed-by: Michael Kelley <mikelley@microsoft.com>
16[sl: fix up subject line]
17Signed-off-by: Sasha Levin <sashal@kernel.org>
18---
19 drivers/net/hyperv/rndis_filter.c | 25 +++++++++++++++++++------
20 1 file changed, 19 insertions(+), 6 deletions(-)
21
22diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
23index 17025d46bdac8..fc1d5e14d83e9 100644
24--- a/drivers/net/hyperv/rndis_filter.c
25+++ b/drivers/net/hyperv/rndis_filter.c
26@@ -711,8 +711,8 @@ rndis_filter_set_offload_params(struct net_device *ndev,
27 return ret;
28 }
29
30-int rndis_filter_set_rss_param(struct rndis_device *rdev,
31- const u8 *rss_key)
32+static int rndis_set_rss_param_msg(struct rndis_device *rdev,
33+ const u8 *rss_key, u16 flag)
34 {
35 struct net_device *ndev = rdev->ndev;
36 struct rndis_request *request;
37@@ -741,7 +741,7 @@ int rndis_filter_set_rss_param(struct rndis_device *rdev,
38 rssp->hdr.type = NDIS_OBJECT_TYPE_RSS_PARAMETERS;
39 rssp->hdr.rev = NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_2;
40 rssp->hdr.size = sizeof(struct ndis_recv_scale_param);
41- rssp->flag = 0;
42+ rssp->flag = flag;
43 rssp->hashinfo = NDIS_HASH_FUNC_TOEPLITZ | NDIS_HASH_IPV4 |
44 NDIS_HASH_TCP_IPV4 | NDIS_HASH_IPV6 |
45 NDIS_HASH_TCP_IPV6;
46@@ -766,9 +766,12 @@ int rndis_filter_set_rss_param(struct rndis_device *rdev,
47
48 wait_for_completion(&request->wait_event);
49 set_complete = &request->response_msg.msg.set_complete;
50- if (set_complete->status == RNDIS_STATUS_SUCCESS)
51- memcpy(rdev->rss_key, rss_key, NETVSC_HASH_KEYLEN);
52- else {
53+ if (set_complete->status == RNDIS_STATUS_SUCCESS) {
54+ if (!(flag & NDIS_RSS_PARAM_FLAG_DISABLE_RSS) &&
55+ !(flag & NDIS_RSS_PARAM_FLAG_HASH_KEY_UNCHANGED))
56+ memcpy(rdev->rss_key, rss_key, NETVSC_HASH_KEYLEN);
57+
58+ } else {
59 netdev_err(ndev, "Fail to set RSS parameters:0x%x\n",
60 set_complete->status);
61 ret = -EINVAL;
62@@ -779,6 +782,16 @@ int rndis_filter_set_rss_param(struct rndis_device *rdev,
63 return ret;
64 }
65
66+int rndis_filter_set_rss_param(struct rndis_device *rdev,
67+ const u8 *rss_key)
68+{
69+ /* Disable RSS before change */
70+ rndis_set_rss_param_msg(rdev, rss_key,
71+ NDIS_RSS_PARAM_FLAG_DISABLE_RSS);
72+
73+ return rndis_set_rss_param_msg(rdev, rss_key, 0);
74+}
75+
76 static int rndis_filter_query_device_link_status(struct rndis_device *dev,
77 struct netvsc_device *net_device)
78 {
79--
802.19.1
81