summaryrefslogtreecommitdiffstats
path: root/drivers/net/hyperv
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-03-14 22:31:55 -0400
committerDavid S. Miller <davem@davemloft.net>2014-03-14 22:31:55 -0400
commit85dcce7a73f1cc59f7a96fe52713b1630f4ca272 (patch)
tree6c645923eb2f0152073b90685ce80e46cfb7afed /drivers/net/hyperv
parent4c4e4113db249c828fffb286bc95ffb255e081f5 (diff)
parenta4ecdf82f8ea49f7d3a072121dcbd0bf3a7cb93a (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/usb/r8152.c drivers/net/xen-netback/netback.c Both the r8152 and netback conflicts were simple overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/hyperv')
-rw-r--r--drivers/net/hyperv/netvsc_drv.c4
-rw-r--r--drivers/net/hyperv/rndis_filter.c21
2 files changed, 24 insertions, 1 deletions
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 3d069901e6d9..4e4cf9e0c8d7 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -674,6 +674,8 @@ static int netvsc_probe(struct hv_device *dev,
674 if (!net) 674 if (!net)
675 return -ENOMEM; 675 return -ENOMEM;
676 676
677 netif_carrier_off(net);
678
677 net_device_ctx = netdev_priv(net); 679 net_device_ctx = netdev_priv(net);
678 net_device_ctx->device_ctx = dev; 680 net_device_ctx->device_ctx = dev;
679 hv_set_drvdata(dev, net); 681 hv_set_drvdata(dev, net);
@@ -706,6 +708,8 @@ static int netvsc_probe(struct hv_device *dev,
706 pr_err("Unable to register netdev.\n"); 708 pr_err("Unable to register netdev.\n");
707 rndis_filter_device_remove(dev); 709 rndis_filter_device_remove(dev);
708 free_netdev(net); 710 free_netdev(net);
711 } else {
712 schedule_delayed_work(&net_device_ctx->dwork, 0);
709 } 713 }
710 714
711 return ret; 715 return ret;
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
index 54553df74cd2..4a37e3db9e32 100644
--- a/drivers/net/hyperv/rndis_filter.c
+++ b/drivers/net/hyperv/rndis_filter.c
@@ -240,6 +240,22 @@ static int rndis_filter_send_request(struct rndis_device *dev,
240 return ret; 240 return ret;
241} 241}
242 242
243static void rndis_set_link_state(struct rndis_device *rdev,
244 struct rndis_request *request)
245{
246 u32 link_status;
247 struct rndis_query_complete *query_complete;
248
249 query_complete = &request->response_msg.msg.query_complete;
250
251 if (query_complete->status == RNDIS_STATUS_SUCCESS &&
252 query_complete->info_buflen == sizeof(u32)) {
253 memcpy(&link_status, (void *)((unsigned long)query_complete +
254 query_complete->info_buf_offset), sizeof(u32));
255 rdev->link_state = link_status != 0;
256 }
257}
258
243static void rndis_filter_receive_response(struct rndis_device *dev, 259static void rndis_filter_receive_response(struct rndis_device *dev,
244 struct rndis_message *resp) 260 struct rndis_message *resp)
245{ 261{
@@ -269,6 +285,10 @@ static void rndis_filter_receive_response(struct rndis_device *dev,
269 sizeof(struct rndis_message) + RNDIS_EXT_LEN) { 285 sizeof(struct rndis_message) + RNDIS_EXT_LEN) {
270 memcpy(&request->response_msg, resp, 286 memcpy(&request->response_msg, resp,
271 resp->msg_len); 287 resp->msg_len);
288 if (request->request_msg.ndis_msg_type ==
289 RNDIS_MSG_QUERY && request->request_msg.msg.
290 query_req.oid == RNDIS_OID_GEN_MEDIA_CONNECT_STATUS)
291 rndis_set_link_state(dev, request);
272 } else { 292 } else {
273 netdev_err(ndev, 293 netdev_err(ndev,
274 "rndis response buffer overflow " 294 "rndis response buffer overflow "
@@ -674,7 +694,6 @@ static int rndis_filter_query_device_link_status(struct rndis_device *dev)
674 ret = rndis_filter_query_device(dev, 694 ret = rndis_filter_query_device(dev,
675 RNDIS_OID_GEN_MEDIA_CONNECT_STATUS, 695 RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
676 &link_status, &size); 696 &link_status, &size);
677 dev->link_state = (link_status != 0) ? true : false;
678 697
679 return ret; 698 return ret;
680} 699}