From 780d715a1f4c39bfafd2402b3cd1a7bc396d3acf Mon Sep 17 00:00:00 2001
From: Chris J Arges <chris.j.arges@canonical.com>
Date: Fri, 30 Nov 2012 13:29:01 -0600
Subject: [PATCH] UBUNTU: SAUCE: add eeprom_bad_csum_allow module parameter
BugLink: http://bugs.ubuntu.com/bugs/1070182
This patch adds the eeprom_bad_csum_allow module parameter for the
e1000 and e1000e drivers. This allows users of affected hardware
to bypass EEPROM/NVM checksum validation.
Based on a patch by Ben Collins <bcollins@ubuntu.com>
Signed-off-by: Chris J Arges <chris.j.arges@canonical.com>
---
drivers/net/ethernet/intel/e1000/e1000_main.c | 8 ++++++--
drivers/net/ethernet/intel/e1000e/netdev.c | 14 ++++++++++++--
2 files changed, 18 insertions(+), 4 deletions(-)
@@ -187,6 +187,10 @@ module_param(copybreak, uint, 0644);
MODULE_PARM_DESC(copybreak,
"Maximum size of packet that is copied to a new buffer on receive");
+static int eeprom_bad_csum_allow __read_mostly = 0;
+module_param(eeprom_bad_csum_allow, int, 0);
+MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad EEPROM checksums");
+
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
pci_channel_state_t state);
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev);
@@ -1104,8 +1108,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
e1000_reset_hw(hw);
- /* make sure the EEPROM is good */
- if (e1000_validate_eeprom_checksum(hw) < 0) {
+ /* make sure the EEPROM is good, skip if eeprom_bad_csum_allow is 1 */
+ if ((e1000_validate_eeprom_checksum(hw) < 0) && (!eeprom_bad_csum_allow)) {
e_err(probe, "The EEPROM Checksum Is Not Valid\n");
e1000_dump_eeprom(adapter);
/*
@@ -65,6 +65,10 @@ static int debug = -1;
module_param(debug, int, 0);
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
+static int eeprom_bad_csum_allow __read_mostly = 0;
+module_param(eeprom_bad_csum_allow, int, 0);
+MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad EEPROM checksums");
+
static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state);
static const struct e1000_info *e1000_info_tbl[] = {
@@ -6277,8 +6281,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
break;
if (i == 2) {
dev_err(&pdev->dev, "The NVM Checksum Is Not Valid\n");
- err = -EIO;
- goto err_eeprom;
+
+ /* if we allow bad checksums, just break */
+ if (eeprom_bad_csum_allow) {
+ break;
+ } else {
+ err = -EIO;
+ goto err_eeprom;
+ }
}
}
--
1.8.0