summaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2018-07-12 11:29:11 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-07-13 08:24:20 +0200
commit8120d32a972990f6206063727dade9ae608c7781 (patch)
tree1d46e979ed0f2a4e7e25d53df4b555264867df38 /drivers/net/e1000
parent87c08ac664272a5a440be1b9323612d30b5bd64e (diff)
downloadbarebox-8120d32a972990f6206063727dade9ae608c7781.tar.gz
barebox-8120d32a972990f6206063727dade9ae608c7781.tar.xz
net/e1000: allow to overwrite flash size from device tree
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@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net/e1000')
-rw-r--r--drivers/net/e1000/eeprom.c56
1 files changed, 42 insertions, 14 deletions
diff --git a/drivers/net/e1000/eeprom.c b/drivers/net/e1000/eeprom.c
index 3f39db7164..dda022e054 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"
@@ -405,6 +407,45 @@ static void e1000_eeprom_uses_microwire(struct e1000_eeprom_info *eeprom,
eeprom->read = e1000_read_eeprom_microwire;
}
+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
@@ -480,20 +521,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;
}