diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2016-06-01 21:58:37 -0700 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2016-06-03 09:14:14 +0200 |
commit | ff6a64d42ffc8cb9bb3ccfd0687633a6565d494d (patch) | |
tree | 9f55593a4a4930454c1076abfee257514311cd45 /drivers/net/e1000/regio.c | |
parent | 7477a1500a54483690e37dec3826119768f2b779 (diff) | |
download | barebox-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.c | 25 |
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); } |