diff options
Diffstat (limited to 'drivers/net/ethernet/xilinx/xilinx_emaclite.c')
| -rw-r--r-- | drivers/net/ethernet/xilinx/xilinx_emaclite.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c index 6886270da695..c409bab63bd3 100644 --- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/of_net.h> | 27 | #include <linux/of_net.h> |
| 28 | #include <linux/phy.h> | 28 | #include <linux/phy.h> |
| 29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
| 30 | #include <linux/iopoll.h> | ||
| 30 | 31 | ||
| 31 | #define DRIVER_NAME "xilinx_emaclite" | 32 | #define DRIVER_NAME "xilinx_emaclite" |
| 32 | 33 | ||
| @@ -714,20 +715,15 @@ static irqreturn_t xemaclite_interrupt(int irq, void *dev_id) | |||
| 714 | 715 | ||
| 715 | static int xemaclite_mdio_wait(struct net_local *lp) | 716 | static int xemaclite_mdio_wait(struct net_local *lp) |
| 716 | { | 717 | { |
| 717 | unsigned long end = jiffies + 2; | 718 | u32 val; |
| 718 | 719 | ||
| 719 | /* wait for the MDIO interface to not be busy or timeout | 720 | /* wait for the MDIO interface to not be busy or timeout |
| 720 | * after some time. | 721 | * after some time. |
| 721 | */ | 722 | */ |
| 722 | while (xemaclite_readl(lp->base_addr + XEL_MDIOCTRL_OFFSET) & | 723 | return readx_poll_timeout(xemaclite_readl, |
| 723 | XEL_MDIOCTRL_MDIOSTS_MASK) { | 724 | lp->base_addr + XEL_MDIOCTRL_OFFSET, |
| 724 | if (time_before_eq(end, jiffies)) { | 725 | val, !(val & XEL_MDIOCTRL_MDIOSTS_MASK), |
| 725 | WARN_ON(1); | 726 | 1000, 20000); |
| 726 | return -ETIMEDOUT; | ||
| 727 | } | ||
| 728 | msleep(1); | ||
| 729 | } | ||
| 730 | return 0; | ||
| 731 | } | 727 | } |
| 732 | 728 | ||
| 733 | /** | 729 | /** |
