| @@ -40,29 +40,17 @@ EXPORT_SYMBOL_GPL(vmbus_connection); · 39 unmodified lines |
| 40 | 40 | __u32 vmbus_proto_version; |
| 41 | 41 | EXPORT_SYMBOL_GPL(vmbus_proto_version); |
| 42 | 42 | |
| 43 | | −static __u32 vmbus_get_next_version(__u32 current_version) |
| 44 | | −{ |
| 45 | | − switch (current_version) { |
| 46 | | − case (VERSION_WIN7): |
| 47 | | − return VERSION_WS2008; |
| 48 | | − |
| 49 | | − case (VERSION_WIN8): |
| 50 | | − return VERSION_WIN7; |
| 51 | | − |
| 52 | | − case (VERSION_WIN8_1): |
| 53 | | − return VERSION_WIN8; |
| 54 | | − |
| 55 | | − case (VERSION_WIN10): |
| 56 | | − return VERSION_WIN8_1; |
| 57 | | − |
| 58 | | − case (VERSION_WIN10_V5): |
| 59 | | − return VERSION_WIN10; |
| 60 | | − |
| 61 | | − case (VERSION_WS2008): |
| 62 | | − default: |
| 63 | | − return VERSION_INVAL; |
| 64 | | − } |
| 65 | | −} |
| 43 | +/* |
| 44 | + * Table of VMBus versions listed from newest to oldest. |
| 45 | + */ |
| 46 | +static __u32 vmbus_versions[] = { |
| 47 | + VERSION_WIN10_V5, |
| 48 | + VERSION_WIN10, |
| 49 | + VERSION_WIN8_1, |
| 50 | + VERSION_WIN8, |
| 51 | + VERSION_WIN7, |
| 52 | + VERSION_WS2008 |
| 53 | +}; |
| 66 | 54 | |
| 67 | 55 | int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo, u32 version) |
| 68 | 56 | { |
| @@ -169,8 +157,8 @@ int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo, u32 version) · 100 unmodified lines |
| 169 | 157 | */ |
| 170 | 158 | int vmbus_connect(void) |
| 171 | 159 | { |
| 172 | | − int ret = 0; |
| 173 | 160 | struct vmbus_channel_msginfo *msginfo = NULL; |
| 161 | + int i, ret = 0; |
| 174 | 162 | __u32 version; |
| 175 | 163 | |
| 176 | 164 | /* Initialize the vmbus connection */ |
| @@ -244,21 +232,19 @@ int vmbus_connect(void) · 67 unmodified lines |
| 244 | 232 | * version. |
| 245 | 233 | */ |
| 246 | 234 | |
| 247 | | − version = VERSION_CURRENT; |
| 235 | + for (i = 0; ; i++) { |
| 236 | + if (i == ARRAY_SIZE(vmbus_versions)) |
| 237 | + goto cleanup; |
| 238 | + |
| 239 | + version = vmbus_versions[i]; |
| 248 | 240 | |
| 249 | | − do { |
| 250 | 241 | ret = vmbus_negotiate_version(msginfo, version); |
| 251 | 242 | if (ret == -ETIMEDOUT) |
| 252 | 243 | goto cleanup; |
| 253 | 244 | |
| 254 | 245 | if (vmbus_connection.conn_state == CONNECTED) |
| 255 | 246 | break; |
| 256 | | − |
| 257 | | − version = vmbus_get_next_version(version); |
| 258 | | − } while (version != VERSION_INVAL); |
| 259 | | − |
| 260 | | − if (version == VERSION_INVAL) |
| 261 | | − goto cleanup; |
| 247 | + } |
| 262 | 248 | |
| 263 | 249 | vmbus_proto_version = version; |
| 264 | 250 | pr_info("Vmbus version:%d.%d\n", |