--- sys/dev/pci/if_em_hw.c
+++ sys/dev/pci/if_em_hw.c
@@ -XXXX,XX +XXXX,XX @@ em_validate_eeprom_checksum(struct em_hw *hw)
 {
 	uint16_t checksum = 0;
 	uint16_t i, eeprom_data;
 	uint16_t checksum_reg;
+	int debug = 1;  /* Enable debug for I219 */
 	DEBUGFUNC("em_validate_eeprom_checksum");
 
+	if (debug) {
+		printf("em_validate_eeprom_checksum: START\n");
+		printf("  mac_type = %d (", hw->mac_type);
+		switch (hw->mac_type) {
+		case em_pch_lpt: printf("em_pch_lpt"); break;
+		case em_pch_spt: printf("em_pch_spt"); break;
+		case em_pch_cnp: printf("em_pch_cnp"); break;
+		case em_pch_tgp: printf("em_pch_tgp"); break;
+		case em_pch_adp: printf("em_pch_adp"); break;
+		default: printf("other"); break;
+		}
+		printf(")\n");
+		printf("  revision_id = 0x%02x\n", hw->revision_id);
+		printf("  IS_ICH8 = %d\n", IS_ICH8(hw->mac_type));
+	}
+
 	checksum_reg = hw->mac_type != em_icp_xxxx ? 
 	    EEPROM_CHECKSUM_REG : 
 	    EEPROM_CHECKSUM_REG_ICP_xxxx;
 
+	if (debug)
+		printf("  checksum_reg = 0x%04x\n", checksum_reg);
+
 	if (((hw->mac_type == em_82573) || (hw->mac_type == em_82574)) &&
 	    (em_is_onboard_nvm_eeprom(hw) == FALSE)) {
+		if (debug)
+			printf("  Checking 82573/82574 workaround\n");
 		/*
 		 * Check bit 4 of word 10h.  If it is 0, firmware is done
 		 * updating 10h-12h.  Checksum may need to be fixed.
 		 */
 		em_read_eeprom(hw, 0x10, 1, &eeprom_data);
+		if (debug)
+			printf("  word 0x10 = 0x%04x\n", eeprom_data);
 		if ((eeprom_data & 0x10) == 0) {
 			/*
 			 * Read 0x23 and check bit 15.  This bit is a 1 when
 			 * the checksum has already been fixed.  If the
 			 * checksum is still wrong and this bit is a 1, we
 			 * need to return bad checksum.  Otherwise, we need
 			 * to set this bit to a 1 and update the checksum.
 			 */
 			em_read_eeprom(hw, 0x23, 1, &eeprom_data);
+			if (debug)
+				printf("  word 0x23 = 0x%04x\n", eeprom_data);
 			if ((eeprom_data & 0x8000) == 0) {
+				if (debug)
+					printf("  Fixing checksum for 82573/82574\n");
 				eeprom_data |= 0x8000;
 				em_write_eeprom(hw, 0x23, 1, &eeprom_data);
 				em_update_eeprom_checksum(hw);
 			}
 		}
 	}
+
 	if (IS_ICH8(hw->mac_type)) {
 		uint16_t word;
 		uint16_t valid_csum_mask;
 		
+		if (debug)
+			printf("  Entering IS_ICH8 workaround section\n");
+		
 		/*
 		 * Drivers must allocate the shadow ram structure for the
 		 * EEPROM checksum to be updated.  Otherwise, this bit as
 		 * well as the checksum must both be set correctly for this
 		 * validation to pass.
 		 */
 		switch (hw->mac_type) {
 		case em_pch_lpt:
 		case em_pch_spt:
 		case em_pch_cnp:
 		case em_pch_tgp:
 		case em_pch_adp:
+			if (debug)
+				printf("  Using EEPROM_COMPAT workaround (I217+/I218+/I219+)\n");
 			word = EEPROM_COMPAT;
 			valid_csum_mask = EEPROM_COMPAT_VALID_CSUM;
 			break;
 		default:
+			if (debug)
+				printf("  Using EEPROM_FUTURE_INIT_WORD1 workaround\n");
 			word = EEPROM_FUTURE_INIT_WORD1;
 			valid_csum_mask = EEPROM_FUTURE_INIT_WORD1_VALID_CSUM;
 			break;
 		}
+		
+		if (debug)
+			printf("  Reading word 0x%04x, mask = 0x%04x\n", 
+			       word, valid_csum_mask);
+		
 		em_read_eeprom(hw, word, 1, &eeprom_data);
+		
+		if (debug) {
+			printf("  Read value = 0x%04x\n", eeprom_data);
+			printf("  Masked value = 0x%04x\n", 
+			       eeprom_data & valid_csum_mask);
+		}
+		
 		if ((eeprom_data & valid_csum_mask) == 0) {
+			if (debug)
+				printf("  Valid checksum bit NOT set, attempting to set it\n");
 			eeprom_data |= valid_csum_mask;
 			em_write_eeprom(hw, word, 1, &eeprom_data);
 			em_update_eeprom_checksum(hw);
+			if (debug)
+				printf("  Updated checksum\n");
+		} else {
+			if (debug)
+				printf("  Valid checksum bit already set\n");
 		}
 	}
+	
+	if (debug)
+		printf("  Starting checksum calculation (0 to 0x%04x)\n", 
+		       checksum_reg);
+	
 	for (i = 0; i < (checksum_reg + 1); i++) {
 		if (em_read_eeprom(hw, i, 1, &eeprom_data) < 0) {
 			DEBUGOUT("EEPROM Read Error\n");
+			if (debug)
+				printf("  EEPROM read FAILED at offset 0x%04x\n", i);
 			return -E1000_ERR_EEPROM;
 		}
+		if (debug && i < 16)  /* Print first 16 words */
+			printf("  NVM[0x%04x] = 0x%04x\n", i, eeprom_data);
 		checksum += eeprom_data;
 	}
 
+	if (debug) {
+		printf("  Calculated checksum = 0x%04x\n", checksum);
+		printf("  Expected checksum = 0x%04x\n", (uint16_t)EEPROM_SUM);
+		printf("  Difference = 0x%04x\n", 
+		       (uint16_t)(checksum - (uint16_t)EEPROM_SUM));
+	}
+
 	if (checksum == (uint16_t) EEPROM_SUM)
+	{
+		if (debug)
+			printf("  Checksum VALID!\n");
 		return E1000_SUCCESS;
-	else {
+	} else {
 		DEBUGOUT("EEPROM Checksum Invalid\n");
+		if (debug)
+			printf("  Checksum INVALID!\n");
 		return -E1000_ERR_EEPROM;
 	}
 }
