| From: Anssi Hannula <anssi.hannula@bitwise.fi> |
| Date: Thu, 23 Aug 2018 10:45:22 +0300 |
| Subject: net: macb: do not disable MDIO bus at open/close time |
| |
| commit 0da70f808029476001109b6cb076737bc04cea2e upstream. |
| |
| macb_reset_hw() is called from macb_close() and indirectly from |
| macb_open(). macb_reset_hw() zeroes the NCR register, including the MPE |
| (Management Port Enable) bit. |
| |
| This will prevent accessing any other PHYs for other Ethernet MACs on |
| the MDIO bus, which remains registered at macb_reset_hw() time, until |
| macb_init_hw() is called from macb_open() which sets the MPE bit again. |
| |
| I.e. currently the MDIO bus has a short disruption at open time and is |
| disabled at close time until the interface is opened again. |
| |
| Fix that by only touching the RE and TE bits when enabling and disabling |
| RX/TX. |
| |
| v2: Make macb_init_hw() NCR write a single statement. |
| |
| Fixes: 6c36a7074436 ("macb: Use generic PHY layer") |
| Signed-off-by: Anssi Hannula <anssi.hannula@bitwise.fi> |
| Reviewed-by: Claudiu Beznea <claudiu.beznea@microchip.com> |
| Tested-by: Claudiu Beznea <claudiu.beznea@microchip.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| [bwh: Backported to 3.16: adjust filename, context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| --- a/drivers/net/ethernet/cadence/macb.c |
| +++ b/drivers/net/ethernet/cadence/macb.c |
| @@ -1257,14 +1257,18 @@ static void macb_init_rings(struct macb |
| |
| static void macb_reset_hw(struct macb *bp) |
| { |
| + u32 ctrl = macb_readl(bp, NCR); |
| + |
| /* |
| * Disable RX and TX (XXX: Should we halt the transmission |
| * more gracefully?) |
| */ |
| - macb_writel(bp, NCR, 0); |
| + ctrl &= ~(MACB_BIT(RE) | MACB_BIT(TE)); |
| |
| /* Clear the stats registers (XXX: Update stats first?) */ |
| - macb_writel(bp, NCR, MACB_BIT(CLRSTAT)); |
| + ctrl |= MACB_BIT(CLRSTAT); |
| + |
| + macb_writel(bp, NCR, ctrl); |
| |
| /* Clear all status flags */ |
| macb_writel(bp, TSR, -1); |
| @@ -1400,7 +1404,7 @@ static void macb_init_hw(struct macb *bp |
| macb_writel(bp, TBQP, bp->tx_ring_dma); |
| |
| /* Enable TX and RX */ |
| - macb_writel(bp, NCR, MACB_BIT(RE) | MACB_BIT(TE) | MACB_BIT(MPE)); |
| + macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(RE) | MACB_BIT(TE)); |
| |
| /* Enable interrupts */ |
| macb_writel(bp, IER, (MACB_RX_INT_FLAGS |