]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-4.14/hv_netvsc-fix-ethtool-change-hash-key-error.patch
b34e183406d2f4dade866337ad65e2155ec3229f
[thirdparty/kernel/stable-queue.git] / queue-4.14 / hv_netvsc-fix-ethtool-change-hash-key-error.patch
1 From 12054d07099326edda95a2ac4d76767f767d5c2f Mon Sep 17 00:00:00 2001
2 From: Haiyang Zhang <haiyangz@microsoft.com>
3 Date: Tue, 15 Jan 2019 00:51:42 +0000
4 Subject: hv_netvsc: Fix ethtool change hash key error
5
6 [ Upstream commit b4a10c750424e01b5e37372fef0a574ebf7b56c3 ]
7
8 Hyper-V hosts require us to disable RSS before changing RSS key,
9 otherwise the changing request will fail. This patch fixes the
10 coding error.
11
12 Fixes: ff4a44199012 ("netvsc: allow get/set of RSS indirection table")
13 Reported-by: Wei Hu <weh@microsoft.com>
14 Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
15 Reviewed-by: Michael Kelley <mikelley@microsoft.com>
16 [sl: fix up subject line]
17 Signed-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
22 diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
23 index 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 --
80 2.19.1
81