Commit a1eabb01 authored by Haiyang Zhang's avatar Haiyang Zhang Committed by David S. Miller

hyperv: Add latest NetVSP versions to auto negotiation

It auto negotiates the highest NetVSP version supported by both guest and host.
Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 86c1a045
...@@ -139,6 +139,8 @@ int rndis_filter_set_device_mac(struct hv_device *hdev, char *mac); ...@@ -139,6 +139,8 @@ int rndis_filter_set_device_mac(struct hv_device *hdev, char *mac);
#define NVSP_PROTOCOL_VERSION_1 2 #define NVSP_PROTOCOL_VERSION_1 2
#define NVSP_PROTOCOL_VERSION_2 0x30002 #define NVSP_PROTOCOL_VERSION_2 0x30002
#define NVSP_PROTOCOL_VERSION_4 0x40000
#define NVSP_PROTOCOL_VERSION_5 0x50000
enum { enum {
NVSP_MSG_TYPE_NONE = 0, NVSP_MSG_TYPE_NONE = 0,
...@@ -193,6 +195,23 @@ enum { ...@@ -193,6 +195,23 @@ enum {
NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE, NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE,
NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP, NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP,
NVSP_MSG2_MAX = NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP,
/* Version 4 messages */
NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION,
NVSP_MSG4_TYPE_SWITCH_DATA_PATH,
NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED,
NVSP_MSG4_MAX = NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED,
/* Version 5 messages */
NVSP_MSG5_TYPE_OID_QUERY_EX,
NVSP_MSG5_TYPE_OID_QUERY_EX_COMP,
NVSP_MSG5_TYPE_SUBCHANNEL,
NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE,
NVSP_MSG5_MAX = NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE,
}; };
enum { enum {
...@@ -447,10 +466,44 @@ union nvsp_2_message_uber { ...@@ -447,10 +466,44 @@ union nvsp_2_message_uber {
struct nvsp_2_free_rxbuf free_rxbuf; struct nvsp_2_free_rxbuf free_rxbuf;
} __packed; } __packed;
enum nvsp_subchannel_operation {
NVSP_SUBCHANNEL_NONE = 0,
NVSP_SUBCHANNEL_ALLOCATE,
NVSP_SUBCHANNEL_MAX
};
struct nvsp_5_subchannel_request {
u32 op;
u32 num_subchannels;
} __packed;
struct nvsp_5_subchannel_complete {
u32 status;
u32 num_subchannels; /* Actual number of subchannels allocated */
} __packed;
struct nvsp_5_send_indirect_table {
/* The number of entries in the send indirection table */
u32 count;
/* The offset of the send indireciton table from top of this struct.
* The send indirection table tells which channel to put the send
* traffic on. Each entry is a channel number.
*/
u32 offset;
} __packed;
union nvsp_5_message_uber {
struct nvsp_5_subchannel_request subchn_req;
struct nvsp_5_subchannel_complete subchn_comp;
struct nvsp_5_send_indirect_table send_table;
} __packed;
union nvsp_all_messages { union nvsp_all_messages {
union nvsp_message_init_uber init_msg; union nvsp_message_init_uber init_msg;
union nvsp_1_message_uber v1_msg; union nvsp_1_message_uber v1_msg;
union nvsp_2_message_uber v2_msg; union nvsp_2_message_uber v2_msg;
union nvsp_5_message_uber v5_msg;
} __packed; } __packed;
/* ALL Messages */ /* ALL Messages */
......
...@@ -290,7 +290,7 @@ static int negotiate_nvsp_ver(struct hv_device *device, ...@@ -290,7 +290,7 @@ static int negotiate_nvsp_ver(struct hv_device *device,
NVSP_STAT_SUCCESS) NVSP_STAT_SUCCESS)
return -EINVAL; return -EINVAL;
if (nvsp_ver != NVSP_PROTOCOL_VERSION_2) if (nvsp_ver == NVSP_PROTOCOL_VERSION_1)
return 0; return 0;
/* NVSPv2 only: Send NDIS config */ /* NVSPv2 only: Send NDIS config */
...@@ -314,6 +314,9 @@ static int netvsc_connect_vsp(struct hv_device *device) ...@@ -314,6 +314,9 @@ static int netvsc_connect_vsp(struct hv_device *device)
struct nvsp_message *init_packet; struct nvsp_message *init_packet;
int ndis_version; int ndis_version;
struct net_device *ndev; struct net_device *ndev;
u32 ver_list[] = { NVSP_PROTOCOL_VERSION_1, NVSP_PROTOCOL_VERSION_2,
NVSP_PROTOCOL_VERSION_4, NVSP_PROTOCOL_VERSION_5 };
int i, num_ver = 4; /* number of different NVSP versions */
net_device = get_outbound_net_device(device); net_device = get_outbound_net_device(device);
if (!net_device) if (!net_device)
...@@ -323,13 +326,14 @@ static int netvsc_connect_vsp(struct hv_device *device) ...@@ -323,13 +326,14 @@ static int netvsc_connect_vsp(struct hv_device *device)
init_packet = &net_device->channel_init_pkt; init_packet = &net_device->channel_init_pkt;
/* Negotiate the latest NVSP protocol supported */ /* Negotiate the latest NVSP protocol supported */
if (negotiate_nvsp_ver(device, net_device, init_packet, for (i = num_ver - 1; i >= 0; i--)
NVSP_PROTOCOL_VERSION_2) == 0) { if (negotiate_nvsp_ver(device, net_device, init_packet,
net_device->nvsp_version = NVSP_PROTOCOL_VERSION_2; ver_list[i]) == 0) {
} else if (negotiate_nvsp_ver(device, net_device, init_packet, net_device->nvsp_version = ver_list[i];
NVSP_PROTOCOL_VERSION_1) == 0) { break;
net_device->nvsp_version = NVSP_PROTOCOL_VERSION_1; }
} else {
if (i < 0) {
ret = -EPROTO; ret = -EPROTO;
goto cleanup; goto cleanup;
} }
...@@ -339,7 +343,10 @@ static int netvsc_connect_vsp(struct hv_device *device) ...@@ -339,7 +343,10 @@ static int netvsc_connect_vsp(struct hv_device *device)
/* Send the ndis version */ /* Send the ndis version */
memset(init_packet, 0, sizeof(struct nvsp_message)); memset(init_packet, 0, sizeof(struct nvsp_message));
ndis_version = 0x00050001; if (net_device->nvsp_version <= NVSP_PROTOCOL_VERSION_4)
ndis_version = 0x00050001;
else
ndis_version = 0x0006001e;
init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_NDIS_VER; init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_NDIS_VER;
init_packet->msg.v1_msg. init_packet->msg.v1_msg.
......
...@@ -327,7 +327,7 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu) ...@@ -327,7 +327,7 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
if (nvdev == NULL || nvdev->destroy) if (nvdev == NULL || nvdev->destroy)
return -ENODEV; return -ENODEV;
if (nvdev->nvsp_version == NVSP_PROTOCOL_VERSION_2) if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2)
limit = NETVSC_MTU; limit = NETVSC_MTU;
if (mtu < 68 || mtu > limit) if (mtu < 68 || mtu > limit)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment