Skip to content

Commit

Permalink
net: ethernet: fec: Allow the MDIO preamble to be disabled
Browse files Browse the repository at this point in the history
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: Chris Healy <Chris.Healy@zii.aero>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Andrew Lunn authored and David S. Miller committed Apr 20, 2020
1 parent 3e78298 commit 3c01eb6
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
6 changes: 6 additions & 0 deletions Documentation/devicetree/bindings/net/mdio.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ properties:
defined 2.5MHz should only be used when all devices on the bus support
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:
"^ethernet-phy@[0-9a-f]+$":
type: object
Expand Down
9 changes: 8 additions & 1 deletion drivers/net/ethernet/freescale/fec_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2064,6 +2064,7 @@ static int fec_enet_mii_init(struct platform_device *pdev)
static struct mii_bus *fec0_mii_bus;
struct net_device *ndev = platform_get_drvdata(pdev);
struct fec_enet_private *fep = netdev_priv(ndev);
bool suppress_preamble = false;
struct device_node *node;
int err = -ENXIO;
u32 mii_speed, holdtime;
Expand Down Expand Up @@ -2097,8 +2098,11 @@ static int fec_enet_mii_init(struct platform_device *pdev)

bus_freq = 2500000; /* 2.5MHz by default */
node = of_get_child_by_name(pdev->dev.of_node, "mdio");
if (node)
if (node) {
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)
Expand Down Expand Up @@ -2135,6 +2139,9 @@ static int fec_enet_mii_init(struct platform_device *pdev)

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);

/* Clear any pending transaction complete indication */
Expand Down

0 comments on commit 3c01eb6

Please sign in to comment.