Commit 3c01eb62 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

net: ethernet: fec: Allow the MDIO preamble to be disabled

An MDIO transaction normally starts with 32 1s as a preamble. However
not all devices requires such a preamble. Add a device tree property
which allows the preamble to be suppressed. This will half the size of
the MDIO transaction, allowing faster transactions. But it should only
be used when all devices on the bus support suppressed preamble.
Suggested-by: default avatarChris Healy <Chris.Healy@zii.aero>
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3e782985
...@@ -45,6 +45,12 @@ properties: ...@@ -45,6 +45,12 @@ properties:
defined 2.5MHz should only be used when all devices on the bus support defined 2.5MHz should only be used when all devices on the bus support
the given clock speed. the given clock speed.
suppress-preamble:
description:
The 32 bit preamble should be suppressed. In order for this to
work, all devices on the bus must support suppressed preamble.
type: boolean
patternProperties: patternProperties:
"^ethernet-phy@[0-9a-f]+$": "^ethernet-phy@[0-9a-f]+$":
type: object type: object
......
...@@ -2064,6 +2064,7 @@ static int fec_enet_mii_init(struct platform_device *pdev) ...@@ -2064,6 +2064,7 @@ static int fec_enet_mii_init(struct platform_device *pdev)
static struct mii_bus *fec0_mii_bus; static struct mii_bus *fec0_mii_bus;
struct net_device *ndev = platform_get_drvdata(pdev); struct net_device *ndev = platform_get_drvdata(pdev);
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
bool suppress_preamble = false;
struct device_node *node; struct device_node *node;
int err = -ENXIO; int err = -ENXIO;
u32 mii_speed, holdtime; u32 mii_speed, holdtime;
...@@ -2097,8 +2098,11 @@ static int fec_enet_mii_init(struct platform_device *pdev) ...@@ -2097,8 +2098,11 @@ static int fec_enet_mii_init(struct platform_device *pdev)
bus_freq = 2500000; /* 2.5MHz by default */ bus_freq = 2500000; /* 2.5MHz by default */
node = of_get_child_by_name(pdev->dev.of_node, "mdio"); node = of_get_child_by_name(pdev->dev.of_node, "mdio");
if (node) if (node) {
of_property_read_u32(node, "clock-frequency", &bus_freq); of_property_read_u32(node, "clock-frequency", &bus_freq);
suppress_preamble = of_property_read_bool(node,
"suppress-preamble");
}
/* /*
* Set MII speed (= clk_get_rate() / 2 * phy_speed) * Set MII speed (= clk_get_rate() / 2 * phy_speed)
...@@ -2135,6 +2139,9 @@ static int fec_enet_mii_init(struct platform_device *pdev) ...@@ -2135,6 +2139,9 @@ static int fec_enet_mii_init(struct platform_device *pdev)
fep->phy_speed = mii_speed << 1 | holdtime << 8; fep->phy_speed = mii_speed << 1 | holdtime << 8;
if (suppress_preamble)
fep->phy_speed |= BIT(7);
writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED);
/* Clear any pending transaction complete indication */ /* Clear any pending transaction complete indication */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment