Skip to contentSkip to conversation

Patch "net: qcom/emac: do not use hardware mdio automatic polling" has been added to the 4.11-stable tree

PATCH [email protected] 1 participant 1 message Jun 12, 2017

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

net: qcom/emac: do not use hardware mdio automatic polling

to the 4.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
net-qcom-emac-do-not-use-hardware-mdio-automatic-polling.patch
and it can be found in the queue-4.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 246096690be0742d9bb5f3456d2cb95b68f7b46d Mon Sep 17 00:00:00 2001

From: Timur Tabi <[email protected]>
Date: Thu, 1 Jun 2017 16:08:13 -0500
Subject: net: qcom/emac: do not use hardware mdio automatic polling

From: Timur Tabi <[email protected]>

commit 246096690be0742d9bb5f3456d2cb95b68f7b46d upstream.

Use software polling (PHY_POLL) to check for link state changes instead of relying on the EMAC's hardware polling feature. Some PHY drivers are unable to get a functioning link because the HW polling is not robust enough.

The EMAC is able to poll the PHY on the MDIO bus looking for link state changes (via the Link Status bit in the Status Register at address 0x1). When the link state changes, the EMAC triggers an interrupt and tells the driver what the new state is. The feature eliminates the need for software to poll the MDIO bus.

Unfortunately, this feature is incompatible with phylib, because it ignores everything that the PHY core and PHY drivers are trying to do. In particular:

1. It assumes a compatible register set, so PHYs with different registers may not work.

2. It doesn't allow for hardware errata that have work-arounds implemented in the PHY driver.

3. It doesn't support multiple register pages. If the PHY core switches the register set to another page, the EMAC won't know the page has changed and will still attempt to read the same PHY register.

4. It only checks the copper side of the link, not the SGMII side. Some PHY drivers (e.g. at803x) may also check the SGMII side, and report the link as not ready during autonegotiation if the SGMII link is still down. Phylib then waits for another interrupt to query the PHY again, but the EMAC won't send another interrupt because it thinks the link is up.

---
 drivers/net/ethernet/qualcomm/emac/emac-mac.c |    2 
 drivers/net/ethernet/qualcomm/emac/emac-phy.c |   75 +-------------------------
 drivers/net/ethernet/qualcomm/emac/emac.c     |   22 -------
 3 files changed, 6 insertions(+), 93 deletions(-)
drivers/net/ethernet/qualcomm/emac/emac-mac.c +1 -1
@@ -931,7 +931,7 @@ int emac_mac_up(struct emac_adapter *adp
 	emac_mac_config(adpt);
 	emac_mac_rx_descs_refill(adpt, &adpt->rx_q);
 
-	adpt->phydev->irq = PHY_IGNORE_INTERRUPT;
+	adpt->phydev->irq = PHY_POLL;
 	ret = phy_connect_direct(netdev, adpt->phydev, emac_adjust_link,
 				 PHY_INTERFACE_MODE_SGMII);
 	if (ret) {
drivers/net/ethernet/qualcomm/emac/emac-phy.c +4 -71

116 lines not on this page · raw message

drivers/net/ethernet/qualcomm/emac/emac.c +1 -21
@@ -50,19 +50,7 @@
 #define DMAR_DLY_CNT_DEF				    15
 #define DMAW_DLY_CNT_DEF				     4
 
-#define IMR_NORMAL_MASK         (\
-		ISR_ERROR       |\
-		ISR_GPHY_LINK   |\
-		ISR_TX_PKT      |\
-		GPHY_WAKEUP_INT)
-
-#define IMR_EXTENDED_MASK       (\
-		SW_MAN_INT      |\
-		ISR_OVER        |\
-		ISR_ERROR       |\
-		ISR_GPHY_LINK   |\
-		ISR_TX_PKT      |\
-		GPHY_WAKEUP_INT)
+#define IMR_NORMAL_MASK		(ISR_ERROR | ISR_OVER | ISR_TX_PKT)
 
 #define ISR_TX_PKT      (\
 	TX_PKT_INT      |\
@@ -70,10 +58,6 @@
 	TX_PKT_INT2     |\
 	TX_PKT_INT3)
 
-#define ISR_GPHY_LINK        (\
-	GPHY_LINK_UP_INT     |\
-	GPHY_LINK_DOWN_INT)
-
 #define ISR_OVER        (\
 	RFD0_UR_INT     |\
 	RFD1_UR_INT     |\
@@ -187,10 +171,6 @@ irqreturn_t emac_isr(int _irq, void *dat
 	if (status & ISR_OVER)
 		net_warn_ratelimited("warning: TX/RX overflow\n");
 
-	/* link event */
-	if (status & ISR_GPHY_LINK)
-		phy_mac_interrupt(adpt->phydev, !!(status & GPHY_LINK_UP_INT));
-
 exit:
 	/* enable the interrupt */
 	writel(irq->mask, adpt->base + EMAC_INT_MASK);

Patches currently in stable-queue which might be from [email protected] are

queue-4.11/net-qcom-emac-do-not-use-hardware-mdio-automatic-polling.patch