--- orig/netdev.c	2008-10-22 22:22:06.000000000 +0800
+++ new/netdev.c	2008-12-11 18:54:08.000000000 +0800
@@ -4246,17 +4246,23 @@
 	 * put the device in a known good starting state */
 	adapter->hw.mac.ops.reset_hw(&adapter->hw);
 
+	/* handle options */
+	e1000e_check_options(adapter);
+
 	/*
 	 * systems with ASPM and others may see the checksum fail on the first
 	 * attempt. Let's give it a few tries
 	 */
-	for (i = 0;; i++) {
-		if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
-			break;
-		if (i == 2) {
-			ndev_err(netdev, "The NVM Checksum Is Not Valid\n");
-			err = -EIO;
-			goto err_eeprom;
+	if (!(adapter->flags & FLAG_ALLOW_BAD_EEPROM_CHECKSUMS)) {
+		for (i = 0;; i++) {
+			if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
+				break;
+
+			if (i == 2) {
+				ndev_err(netdev, "The NVM Checksum Is Not Valid\n");
+				err = -EIO;
+				goto err_eeprom;
+			}
 		}
 	}
 
@@ -4288,8 +4294,6 @@
 	INIT_WORK(&adapter->reset_task, e1000_reset_task);
 	INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);
 
-	e1000e_check_options(adapter);
-
 	/* Initialize link parameters. User can change them with ethtool */
 	adapter->hw.mac.autoneg = 1;
 	adapter->fc_autoneg = 1;
--- orig/e1000.h	2008-10-22 22:22:06.000000000 +0800
+++ new/e1000.h	2008-12-11 18:54:08.000000000 +0800
@@ -322,6 +322,7 @@
 #define FLAG_RX_CSUM_ENABLED              (1 << 28)
 #define FLAG_TSO_FORCE                    (1 << 29)
 #define FLAG_RX_RESTART_NOW               (1 << 30)
+#define FLAG_ALLOW_BAD_EEPROM_CHECKSUMS   (1 << 31)
 
 #define E1000_RX_DESC_PS(R, i)	    \
 	(&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
--- orig/param.c	2008-04-17 10:49:44.000000000 +0800
+++ new/param.c	2008-12-11 18:54:08.000000000 +0800
@@ -123,6 +123,9 @@
  */
 E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround");
 
+/* Allow bad EEPROM checksums */
+E1000_PARAM(eeprom_bad_csum_allow, "Allow bad EEPROM checksums");
+
 struct e1000_option {
 	enum { enable_option, range_option, list_option } type;
 	const char *name;
@@ -373,4 +376,19 @@
 								       opt.def);
 		}
 	}
+	{ /* Allow bad EEPROM checksums */
+		const struct e1000_option opt = {
+			.type = enable_option,
+			.name = "Allow bad EEPROM checksums",
+			.err  = "defaulting to Disabled",
+			.def  = OPTION_DISABLED
+		};
+
+		if (num_eeprom_bad_csum_allow > bd) {
+			unsigned int ebca = eeprom_bad_csum_allow[bd];
+			e1000_validate_option(&ebca, &opt, adapter);
+			if (ebca)
+				adapter->flags |= FLAG_ALLOW_BAD_EEPROM_CHECKSUMS;
+		}
+	}
 }
