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 */
 
        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;
 }