Skip to content

Commit

Permalink
Merge branch 'qcom-emac-pause'
Browse files Browse the repository at this point in the history
Timur Tabi says:

====================
net: qcom/emac: ensure that pause frames are enabled

The qcom emac driver experiences significant packet loss (through frame
check sequence errors) if flow control is not enabled and the phy is
not configured to allow pause frames to pass through it.  Therefore, we
need to enable flow control and force the phy to pass pause frames.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Nov 9, 2016
2 parents cdb26d3 + df63022 commit fd6f24d
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions drivers/net/ethernet/qualcomm/emac/emac-mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -575,10 +575,11 @@ void emac_mac_start(struct emac_adapter *adpt)

mac |= TXEN | RXEN; /* enable RX/TX */

/* We don't have ethtool support yet, so force flow-control mode
* to 'full' always.
*/
mac |= TXFC | RXFC;
/* Configure MAC flow control to match the PHY's settings. */
if (phydev->pause)
mac |= RXFC;
if (phydev->pause != phydev->asym_pause)
mac |= TXFC;

/* setup link speed */
mac &= ~SPEED_MASK;
Expand Down Expand Up @@ -1003,6 +1004,12 @@ int emac_mac_up(struct emac_adapter *adpt)
writel((u32)~DIS_INT, adpt->base + EMAC_INT_STATUS);
writel(adpt->irq.mask, adpt->base + EMAC_INT_MASK);

/* Enable pause frames. Without this feature, the EMAC has been shown
* to receive (and drop) frames with FCS errors at gigabit connections.
*/
adpt->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
adpt->phydev->advertising |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;

adpt->phydev->irq = PHY_IGNORE_INTERRUPT;
phy_start(adpt->phydev);

Expand Down

0 comments on commit fd6f24d

Please sign in to comment.