

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)

_
