summaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000/regio.c
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2016-06-01 21:58:37 -0700
committerSascha Hauer <s.hauer@pengutronix.de>2016-06-03 09:14:14 +0200
commitff6a64d42ffc8cb9bb3ccfd0687633a6565d494d (patch)
tree9f55593a4a4930454c1076abfee257514311cd45 /drivers/net/e1000/regio.c
parent7477a1500a54483690e37dec3826119768f2b779 (diff)
downloadbarebox-ff6a64d42ffc8cb9bb3ccfd0687633a6565d494d.tar.gz
barebox-ff6a64d42ffc8cb9bb3ccfd0687633a6565d494d.tar.xz
e1000: Consolidate register offset fixups
Consolidate all code taking care on CSR offset differences for i210 chips into a single place in the driver and integrate that funcionality into e1000_{read,write}_reg functions. This way we can get rid of all those if (hw->mac_type == e1000_igb) { .... } else { .... } snippets sprinkled all across the driver code. Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net/e1000/regio.c')
-rw-r--r--drivers/net/e1000/regio.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/net/e1000/regio.c b/drivers/net/e1000/regio.c
index 8c529f1b23..497008463d 100644
--- a/drivers/net/e1000/regio.c
+++ b/drivers/net/e1000/regio.c
@@ -2,13 +2,38 @@
#include "e1000.h"
+static uint32_t e1000_true_offset(struct e1000_hw *hw, uint32_t reg)
+{
+ if (reg & E1000_MIGHT_BE_REMAPPED) {
+ reg &= ~E1000_MIGHT_BE_REMAPPED;
+
+ if (hw->mac_type == e1000_igb) {
+ switch (reg) {
+ case E1000_EEWR:
+ reg = E1000_I210_EEWR;
+ break;
+ case E1000_PHY_CTRL:
+ reg = E1000_I210_PHY_CTRL;
+ break;
+ case E1000_EEMNGCTL:
+ reg = E1000_I210_EEMNGCTL;
+ break;
+ }
+ };
+ }
+
+ return reg;
+}
+
void e1000_write_reg(struct e1000_hw *hw, uint32_t reg, uint32_t value)
{
+ reg = e1000_true_offset(hw, reg);
writel(value, hw->hw_addr + reg);
}
uint32_t e1000_read_reg(struct e1000_hw *hw, uint32_t reg)
{
+ reg = e1000_true_offset(hw, reg);
return readl(hw->hw_addr + reg);
}