diff -Nuarp linux-2.5.31/drivers/net/e100/e100.h linux-2.4.20-pre4/drivers/net/e100/e100.h
--- linux-2.5.31/drivers/net/e100/e100.h	Sat Aug 10 18:41:25 2002
+++ linux-2.4.20-pre4/drivers/net/e100/e100.h	Fri Aug 23 05:43:05 2002
@@ -97,6 +97,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 #include <asm/processor.h>
 #include <linux/ethtool.h>
 #include <linux/inetdevice.h>
+#include <linux/bitops.h>
 
 #include <linux/if.h>
 #include <asm/uaccess.h>
diff -Nuarp linux-2.5.31/drivers/net/e100/e100_main.c linux-2.4.20-pre4/drivers/net/e100/e100_main.c
--- linux-2.5.31/drivers/net/e100/e100_main.c	Sat Aug 10 18:41:28 2002
+++ linux-2.4.20-pre4/drivers/net/e100/e100_main.c	Fri Aug 23 05:43:05 2002
@@ -3532,7 +3532,7 @@ e100_ethtool_test(struct net_device *dev
 		       GFP_ATOMIC);
 
 	if (!info)
-		return -EFAULT;
+		return -ENOMEM;
 
 	memset((void *) info, 0, sizeof(*info) +
 				 E100_MAX_TEST_RES * sizeof(u64));
@@ -3616,6 +3616,10 @@ e100_ethtool_eeprom(struct net_device *d
 		(u16 *) (ifr->ifr_data + offsetof(struct ethtool_eeprom, data));
 
         max_len = bdp->eeprom_size * 2;
+        
+        if (ecmd.offset > ecmd.offset + ecmd.len)
+        	return -EINVAL;
+        	
 	if ((ecmd.offset + ecmd.len) > max_len)
 		ecmd.len = (max_len - ecmd.offset);
 
@@ -3929,7 +3933,7 @@ static int e100_ethtool_gstrings(struct 
 			info.len = E100_MAX_TEST_RES;
 		strings = kmalloc(info.len * ETH_GSTRING_LEN, GFP_ATOMIC);
 		if (!strings)
-			return -EFAULT;
+			return -ENOMEM;
 		memset(strings, 0, info.len * ETH_GSTRING_LEN);
 
 		for (i = 0; i < info.len; i++) {
