init_etherdev() and friends removed. They were inherently racy _and_ violated allocation policy. Proper replacement is dev = alloc_etherdev(size); if (!dev) FOAD set the things up, if failed - free_netdev(dev) and FOAD err = register_netdev(dev); if (err) { clean up after the setup we'd done free_netdev(dev); FOAD } Note that use of statically allocated net_device is a shootable offense now. They must be created with alloc_netdev() and its derivatives. Use of net_device->init() is strongly discouraged. It has valid uses (most of them in net/*), but unless all your setup and registration is done under externally held rtnl, don't do it. Do your init before register_netdev() instead. Blind use of ->init() almost certainly means a leak since we have no way to tell whether register_netdev() had failed in dev->init() or after it. dev_alloc() is removed. Use alloc_netdev() derivatives instead. Reason: use of dev_alloc_name() in it is inherently racy.