If the driver's init function returns an error code (most likely -ENODEV), register_netdevice will stomp on it and will always return -EIO. You end up always getting an "Input/Output error" from modprobe, which is confusing. Fix register_netdevice() to return the init function's error code, if it looks sane. net/core/dev.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff -puN net/core/dev.c~register_netdevice-retval-fix net/core/dev.c --- 25/net/core/dev.c~register_netdevice-retval-fix 2003-10-18 18:50:52.000000000 -0700 +++ 25-akpm/net/core/dev.c 2003-10-18 18:51:39.000000000 -0700 @@ -2652,9 +2652,14 @@ int register_netdevice(struct net_device dev->iflink = -1; /* Init, if this function is available */ - ret = -EIO; - if (dev->init && dev->init(dev)) - goto out_err; + if (dev->init) { + ret = dev->init(dev); + if (ret) { + if (ret > 0) + ret = -EIO; + goto out_err; + } + } dev->ifindex = dev_new_index(); if (dev->iflink == -1) _