Skip to content

Commit 8beb79b

Browse files
harini-katakamdavem330
authored andcommitted
net: macb: Check MDIO state before read/write and use timeouts
Replace the while loop in MDIO read/write functions with a timeout. In addition, add a check for MDIO bus busy before initiating a new operation as well to make sure there is no ongoing MDIO operation. Signed-off-by: Shubhrajyoti Datta <[email protected]> Signed-off-by: Sai Pavan Boddu <[email protected]> Signed-off-by: Harini Katakam <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 41bc0dd commit 8beb79b

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

drivers/net/ethernet/cadence/macb.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,8 @@
715715
__v; \
716716
})
717717

718+
#define MACB_READ_NSR(bp) macb_readl(bp, NSR)
719+
718720
/* struct macb_dma_desc - Hardware DMA descriptor
719721
* @addr: DMA address of data buffer
720722
* @ctrl: Control and status bits

drivers/net/ethernet/cadence/macb_main.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <linux/ip.h>
3737
#include <linux/udp.h>
3838
#include <linux/tcp.h>
39+
#include <linux/iopoll.h>
3940
#include "macb.h"
4041

4142
#define MACB_RX_BUFFER_SIZE 128
@@ -79,6 +80,8 @@
7980
*/
8081
#define MACB_HALT_TIMEOUT 1230
8182

83+
#define MACB_MDIO_TIMEOUT 1000000 /* in usecs */
84+
8285
/* DMA buffer descriptor might be different size
8386
* depends on hardware configuration:
8487
*
@@ -318,20 +321,33 @@ static void macb_get_hwaddr(struct macb *bp)
318321
eth_hw_addr_random(bp->dev);
319322
}
320323

324+
static int macb_mdio_wait_for_idle(struct macb *bp)
325+
{
326+
u32 val;
327+
328+
return readx_poll_timeout(MACB_READ_NSR, bp, val, val & MACB_BIT(IDLE),
329+
1, MACB_MDIO_TIMEOUT);
330+
}
331+
321332
static int macb_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
322333
{
323334
struct macb *bp = bus->priv;
324335
int value;
336+
int err;
337+
338+
err = macb_mdio_wait_for_idle(bp);
339+
if (err < 0)
340+
return err;
325341

326342
macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_SOF)
327343
| MACB_BF(RW, MACB_MAN_READ)
328344
| MACB_BF(PHYA, mii_id)
329345
| MACB_BF(REGA, regnum)
330346
| MACB_BF(CODE, MACB_MAN_CODE)));
331347

332-
/* wait for end of transfer */
333-
while (!MACB_BFEXT(IDLE, macb_readl(bp, NSR)))
334-
cpu_relax();
348+
err = macb_mdio_wait_for_idle(bp);
349+
if (err < 0)
350+
return err;
335351

336352
value = MACB_BFEXT(DATA, macb_readl(bp, MAN));
337353

@@ -342,6 +358,11 @@ static int macb_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
342358
u16 value)
343359
{
344360
struct macb *bp = bus->priv;
361+
int err;
362+
363+
err = macb_mdio_wait_for_idle(bp);
364+
if (err < 0)
365+
return err;
345366

346367
macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_SOF)
347368
| MACB_BF(RW, MACB_MAN_WRITE)
@@ -350,9 +371,9 @@ static int macb_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
350371
| MACB_BF(CODE, MACB_MAN_CODE)
351372
| MACB_BF(DATA, value)));
352373

353-
/* wait for end of transfer */
354-
while (!MACB_BFEXT(IDLE, macb_readl(bp, NSR)))
355-
cpu_relax();
374+
err = macb_mdio_wait_for_idle(bp);
375+
if (err < 0)
376+
return err;
356377

357378
return 0;
358379
}

0 commit comments

Comments
 (0)