[PATCH] net/e1000: allow to overwrite flash size from device tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When barebox probes the e1000 driver and the flash on the i210 device is
unprogrammed, the driver assumes the flash has a size of only 4 kiB.
This is annoying because to program the flash an image must be written
that is bigger than 4 kiB. So you first have to flash the first sector
to make barebox detect the right size on the next boot. Then reset the
board to be able to write the remaining data.

To work around that limitation, try to read the actual size from the
device tree. (Note however that barebox' pci code currently doesn't use
the device tree and so currently this try always fails without further
patching.)

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx>
---
 drivers/net/e1000/eeprom.c | 57 ++++++++++++++++++++++++++++----------
 1 file changed, 43 insertions(+), 14 deletions(-)

diff --git a/drivers/net/e1000/eeprom.c b/drivers/net/e1000/eeprom.c
index 3f39db7164db..97cb09a718f9 100644
--- a/drivers/net/e1000/eeprom.c
+++ b/drivers/net/e1000/eeprom.c
@@ -3,6 +3,8 @@
 #include <malloc.h>
 #include <linux/math64.h>
 #include <linux/sizes.h>
+#include <of_device.h>
+#include <linux/pci.h>
 #include <linux/mtd/spi-nor.h>
 
 #include "e1000.h"
@@ -406,6 +408,46 @@ static void e1000_eeprom_uses_microwire(struct e1000_eeprom_info *eeprom,
 }
 
 
+size_t e1000_igb_get_flash_size(struct e1000_hw *hw)
+{
+	struct device_node *node =
+		hw->pdev->dev.device_node;
+	u32 flash_size;
+	uint32_t fla;
+	int ret = 0;
+
+	/*
+	 * There are two potential places where the size of the flash can be
+	 * specified. In the device tree, and in the flash itself.  Use the
+	 * first that looks valid.
+	 */
+
+	ret = of_property_read_u32(node, "flash-size", &flash_size);
+	if (ret == 0) {
+		dev_info(hw->dev,
+			 "Determined flash size from device tree (%u)\n",
+			 flash_size);
+		return flash_size;
+	}
+
+	fla = e1000_read_reg(hw, E1000_FLA);
+	fla &= E1000_FLA_FL_SIZE_MASK;
+	fla >>= E1000_FLA_FL_SIZE_SHIFT;
+
+	if (fla) {
+		flash_size = SZ_64K << fla;
+		dev_info(hw->dev,
+			 "Determined flash size from E1000_FLA.FL_SIZE (%u)\n",
+			 flash_size);
+		return flash_size;
+	}
+
+	dev_info(hw->dev,
+		 "Unprogrammed Flash detected and no flash-size found in device tree, limiting access to first 4 kiB\n");
+
+	return 4096;
+}
+
 /******************************************************************************
  * Sets up eeprom variables in the hw struct.  Must be called after mac_type
  * is configured.  Additionally, if this is ICH8, the flash controller GbE
@@ -480,20 +522,7 @@ int32_t e1000_init_eeprom_params(struct e1000_hw *hw)
 
 	case e1000_igb:
 		if (eecd & E1000_EECD_I210_FLASH_DETECTED) {
-			uint32_t fla;
-
-			fla  = e1000_read_reg(hw, E1000_FLA);
-			fla &= E1000_FLA_FL_SIZE_MASK;
-			fla >>= E1000_FLA_FL_SIZE_SHIFT;
-
-			if (fla) {
-				eeprom->word_size = (SZ_64K << fla) / 2;
-			} else {
-				eeprom->word_size = 2048;
-				dev_info(hw->dev, "Unprogrammed Flash detected, "
-					 "limiting access to first 4KB\n");
-			}
-
+			eeprom->word_size = e1000_igb_get_flash_size(hw) / 2;
 			eeprom->acquire = e1000_acquire_eeprom_flash;
 			eeprom->release = e1000_release_eeprom_flash;
 		}
-- 
2.18.0


_______________________________________________
barebox mailing list
barebox@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/barebox




[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux