|
@@ -348,19 +348,6 @@ static int netvsc_probe(struct hv_device *dev)
|
|
|
dev_set_drvdata(&dev->device, net);
|
|
|
INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_send_garp);
|
|
|
|
|
|
- /* Notify the netvsc driver of the new device */
|
|
|
- device_info.ring_size = ring_size;
|
|
|
- ret = rndis_filter_device_add(dev, &device_info);
|
|
|
- if (ret != 0) {
|
|
|
- free_netdev(net);
|
|
|
- dev_set_drvdata(&dev->device, NULL);
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- netif_carrier_on(net);
|
|
|
-
|
|
|
- memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN);
|
|
|
-
|
|
|
net->netdev_ops = &device_ops;
|
|
|
|
|
|
/* TODO: Add GSO and Checksum offload */
|
|
@@ -372,11 +359,26 @@ static int netvsc_probe(struct hv_device *dev)
|
|
|
|
|
|
ret = register_netdev(net);
|
|
|
if (ret != 0) {
|
|
|
- /* Remove the device and release the resource */
|
|
|
- rndis_filter_device_remove(dev);
|
|
|
+ pr_err("Unable to register netdev.\n");
|
|
|
free_netdev(net);
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
+ /* Notify the netvsc driver of the new device */
|
|
|
+ device_info.ring_size = ring_size;
|
|
|
+ ret = rndis_filter_device_add(dev, &device_info);
|
|
|
+ if (ret != 0) {
|
|
|
+ netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
|
|
|
+ unregister_netdev(net);
|
|
|
+ free_netdev(net);
|
|
|
+ dev_set_drvdata(&dev->device, NULL);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN);
|
|
|
+
|
|
|
+ netif_carrier_on(net);
|
|
|
+
|
|
|
+out:
|
|
|
return ret;
|
|
|
}
|
|
|
|