]>
Commit | Line | Data |
---|---|---|
9aa60b56 SL |
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 |