提交 7f5d5af0 编写于 作者: H Haiyang Zhang 提交者: David S. Miller

hv_netvsc: Add handler for physical link speed change

On Hyper-V host 2016 and later, VMs gets an event message of the physical
link speed when vSwitch is changed. This patch handles this message, so
the updated link speed can be reported by ethtool.
Signed-off-by: NHaiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: NK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 b37879e6
...@@ -490,6 +490,7 @@ struct nvsp_2_vsc_capability { ...@@ -490,6 +490,7 @@ struct nvsp_2_vsc_capability {
u64 sriov:1; u64 sriov:1;
u64 ieee8021q:1; u64 ieee8021q:1;
u64 correlation_id:1; u64 correlation_id:1;
u64 teaming:1;
}; };
}; };
} __packed; } __packed;
......
...@@ -472,9 +472,13 @@ static int negotiate_nvsp_ver(struct hv_device *device, ...@@ -472,9 +472,13 @@ static int negotiate_nvsp_ver(struct hv_device *device,
init_packet->msg.v2_msg.send_ndis_config.mtu = ndev->mtu + ETH_HLEN; init_packet->msg.v2_msg.send_ndis_config.mtu = ndev->mtu + ETH_HLEN;
init_packet->msg.v2_msg.send_ndis_config.capability.ieee8021q = 1; init_packet->msg.v2_msg.send_ndis_config.capability.ieee8021q = 1;
if (nvsp_ver >= NVSP_PROTOCOL_VERSION_5) if (nvsp_ver >= NVSP_PROTOCOL_VERSION_5) {
init_packet->msg.v2_msg.send_ndis_config.capability.sriov = 1; init_packet->msg.v2_msg.send_ndis_config.capability.sriov = 1;
/* Teaming bit is needed to receive link speed updates */
init_packet->msg.v2_msg.send_ndis_config.capability.teaming = 1;
}
ret = vmbus_sendpacket(device->channel, init_packet, ret = vmbus_sendpacket(device->channel, init_packet,
sizeof(struct nvsp_message), sizeof(struct nvsp_message),
(unsigned long)init_packet, (unsigned long)init_packet,
......
...@@ -579,19 +579,32 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj, ...@@ -579,19 +579,32 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
struct netvsc_reconfig *event; struct netvsc_reconfig *event;
unsigned long flags; unsigned long flags;
/* Handle link change statuses only */ net = hv_get_drvdata(device_obj);
if (!net)
return;
ndev_ctx = netdev_priv(net);
/* Update the physical link speed when changing to another vSwitch */
if (indicate->status == RNDIS_STATUS_LINK_SPEED_CHANGE) {
u32 speed;
speed = *(u32 *)((void *)indicate + indicate->
status_buf_offset) / 10000;
ndev_ctx->speed = speed;
return;
}
/* Handle these link change statuses below */
if (indicate->status != RNDIS_STATUS_NETWORK_CHANGE && if (indicate->status != RNDIS_STATUS_NETWORK_CHANGE &&
indicate->status != RNDIS_STATUS_MEDIA_CONNECT && indicate->status != RNDIS_STATUS_MEDIA_CONNECT &&
indicate->status != RNDIS_STATUS_MEDIA_DISCONNECT) indicate->status != RNDIS_STATUS_MEDIA_DISCONNECT)
return; return;
net = hv_get_drvdata(device_obj); if (net->reg_state != NETREG_REGISTERED)
if (!net || net->reg_state != NETREG_REGISTERED)
return; return;
ndev_ctx = netdev_priv(net);
event = kzalloc(sizeof(*event), GFP_ATOMIC); event = kzalloc(sizeof(*event), GFP_ATOMIC);
if (!event) if (!event)
return; return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册