]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
hv_netvsc: Add query for initial physical link speed
authorHaiyang Zhang <haiyangz@microsoft.com>
Thu, 4 Aug 2016 17:42:14 +0000 (10:42 -0700)
committerLuis Henriques <luis.henriques@canonical.com>
Fri, 20 Jan 2017 13:04:58 +0000 (13:04 +0000)
BugLink: http://bugs.launchpad.net/bugs/1650059
The physical link speed value will be reported by ethtool command.
The real speed is available from Windows 2016 host or later.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit b37879e6ca7079943542048da37f00a386c30cee)
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
Acked-by: Brad Figg <brad.figg@canonical.com>
Acked-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
drivers/net/hyperv/netvsc_drv.c
drivers/net/hyperv/rndis_filter.c

index bccdaaa404b877515d474017fa561f4aa90b096f..917e2e3e923dfced0d0a95aa51e4ddac5262937c 100644 (file)
@@ -1343,6 +1343,8 @@ static int netvsc_probe(struct hv_device *dev,
 
        netif_carrier_off(net);
 
+       netvsc_init_settings(net);
+
        net_device_ctx = netdev_priv(net);
        net_device_ctx->device_ctx = dev;
        net_device_ctx->msg_enable = netif_msg_init(debug, default_msg);
@@ -1404,8 +1406,6 @@ static int netvsc_probe(struct hv_device *dev,
        netif_set_real_num_tx_queues(net, nvdev->num_chn);
        netif_set_real_num_rx_queues(net, nvdev->num_chn);
 
-       netvsc_init_settings(net);
-
        ret = register_netdev(net);
        if (ret != 0) {
                pr_err("Unable to register netdev.\n");
index 8e830f741d47810cdb1aaeb92bfa4ce4b9cb3984..dd3b3352a9509a33c05032c7ff1a80c5eb5f99f9 100644 (file)
@@ -752,6 +752,28 @@ static int rndis_filter_query_device_link_status(struct rndis_device *dev)
        return ret;
 }
 
+static int rndis_filter_query_link_speed(struct rndis_device *dev)
+{
+       u32 size = sizeof(u32);
+       u32 link_speed;
+       struct net_device_context *ndc;
+       int ret;
+
+       ret = rndis_filter_query_device(dev, RNDIS_OID_GEN_LINK_SPEED,
+                                       &link_speed, &size);
+
+       if (!ret) {
+               ndc = netdev_priv(dev->ndev);
+
+               /* The link speed reported from host is in 100bps unit, so
+                * we convert it to Mbps here.
+                */
+               ndc->speed = link_speed / 10000;
+       }
+
+       return ret;
+}
+
 int rndis_filter_set_packet_filter(struct rndis_device *dev, u32 new_filter)
 {
        struct rndis_request *request;
@@ -1044,6 +1066,8 @@ int rndis_filter_device_add(struct hv_device *dev,
        if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5)
                return 0;
 
+       rndis_filter_query_link_speed(rndis_device);
+
        /* vRSS setup */
        memset(&rsscap, 0, rsscap_size);
        ret = rndis_filter_query_device(rndis_device,