summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2016-06-01 21:58:49 -0700
committerSascha Hauer <s.hauer@pengutronix.de>2016-06-03 09:14:14 +0200
commit91d3dd2fd84682c06b807e6f9755f095d399cf56 (patch)
tree44ac0987ad46569731b5ca9ea70a3a0abe7b8477 /drivers/net
parent72f02e6c0bf64d4598e13dfcc73c126311f243b9 (diff)
downloadbarebox-91d3dd2fd84682c06b807e6f9755f095d399cf56.tar.gz
barebox-91d3dd2fd84682c06b807e6f9755f095d399cf56.tar.xz
e1000: Add a "poll register" function
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/e1000/e1000.h4
-rw-r--r--drivers/net/e1000/regio.c16
2 files changed, 20 insertions, 0 deletions
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h
index c6d26d5787..cb3e5effdc 100644
--- a/drivers/net/e1000/e1000.h
+++ b/drivers/net/e1000/e1000.h
@@ -2144,5 +2144,9 @@ int32_t e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset,
int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask);
int32_t e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask);
+int e1000_poll_reg(struct e1000_hw *hw, uint32_t reg,
+ uint32_t mask, uint32_t value,
+ uint64_t timeout);
+
#endif /* _E1000_HW_H_ */
diff --git a/drivers/net/e1000/regio.c b/drivers/net/e1000/regio.c
index 497008463d..b2e9d7b6a7 100644
--- a/drivers/net/e1000/regio.c
+++ b/drivers/net/e1000/regio.c
@@ -52,3 +52,19 @@ void e1000_write_flush(struct e1000_hw *hw)
{
e1000_read_reg(hw, E1000_STATUS);
}
+
+int e1000_poll_reg(struct e1000_hw *hw, uint32_t reg, uint32_t mask,
+ uint32_t value, uint64_t timeout)
+{
+ const uint64_t start = get_time_ns();
+
+ do {
+ const uint32_t v = e1000_read_reg(hw, reg);
+
+ if ((v & mask) == value)
+ return 0;
+
+ } while (!is_timeout(start, timeout));
+
+ return -ETIMEDOUT;
+}