Commit 72b59174 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-fsl-fman-address-erratum-A011043'

Madalin Bucur says:

====================
net: fsl/fman: address erratum A011043

This addresses a HW erratum on some QorIQ DPAA devices.

MDIO reads to internal PCS registers may result in having
the MDIO_CFG[MDIO_RD_ER] bit set, even when there is no
error and read data (MDIO_DATA[MDIO_DATA]) is correct.
Software may get false read error when reading internal
PCS registers through MDIO. As a workaround, all internal
MDIO accesses should ignore the MDIO_CFG[MDIO_RD_ER] bit.
When the issue was present, one could see such errors
during boot:

  mdio_bus ffe4e5000: Error while reading PHY0 reg at 3.3
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 22e98449 1d3ca681
...@@ -403,6 +403,19 @@ PROPERTIES ...@@ -403,6 +403,19 @@ PROPERTIES
The settings and programming routines for internal/external The settings and programming routines for internal/external
MDIO are different. Must be included for internal MDIO. MDIO are different. Must be included for internal MDIO.
- fsl,erratum-a011043
Usage: optional
Value type: <boolean>
Definition: Indicates the presence of the A011043 erratum
describing that the MDIO_CFG[MDIO_RD_ER] bit may be falsely
set when reading internal PCS registers. MDIO reads to
internal PCS registers may result in having the
MDIO_CFG[MDIO_RD_ER] bit set, even when there is no error and
read data (MDIO_DATA[MDIO_DATA]) is correct.
Software may get false read error when reading internal
PCS registers through MDIO. As a workaround, all internal
MDIO accesses should ignore the MDIO_CFG[MDIO_RD_ER] bit.
For internal PHY device on internal mdio bus, a PHY node should be created. For internal PHY device on internal mdio bus, a PHY node should be created.
See the definition of the PHY node in booting-without-of.txt for an See the definition of the PHY node in booting-without-of.txt for an
example of how to define a PHY (Internal PHY has no interrupt line). example of how to define a PHY (Internal PHY has no interrupt line).
......
...@@ -63,6 +63,7 @@ mdio@e1000 { ...@@ -63,6 +63,7 @@ mdio@e1000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe1000 0x1000>; reg = <0xe1000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy0: ethernet-phy@0 { pcsphy0: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -60,6 +60,7 @@ mdio@f1000 { ...@@ -60,6 +60,7 @@ mdio@f1000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xf1000 0x1000>; reg = <0xf1000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy6: ethernet-phy@0 { pcsphy6: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -63,6 +63,7 @@ mdio@e3000 { ...@@ -63,6 +63,7 @@ mdio@e3000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe3000 0x1000>; reg = <0xe3000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy1: ethernet-phy@0 { pcsphy1: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -60,6 +60,7 @@ mdio@f3000 { ...@@ -60,6 +60,7 @@ mdio@f3000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xf3000 0x1000>; reg = <0xf3000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy7: ethernet-phy@0 { pcsphy7: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e1000 { ...@@ -59,6 +59,7 @@ mdio@e1000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe1000 0x1000>; reg = <0xe1000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy0: ethernet-phy@0 { pcsphy0: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e3000 { ...@@ -59,6 +59,7 @@ mdio@e3000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe3000 0x1000>; reg = <0xe3000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy1: ethernet-phy@0 { pcsphy1: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e5000 { ...@@ -59,6 +59,7 @@ mdio@e5000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe5000 0x1000>; reg = <0xe5000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy2: ethernet-phy@0 { pcsphy2: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e7000 { ...@@ -59,6 +59,7 @@ mdio@e7000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe7000 0x1000>; reg = <0xe7000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy3: ethernet-phy@0 { pcsphy3: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e9000 { ...@@ -59,6 +59,7 @@ mdio@e9000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe9000 0x1000>; reg = <0xe9000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy4: ethernet-phy@0 { pcsphy4: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@eb000 { ...@@ -59,6 +59,7 @@ mdio@eb000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xeb000 0x1000>; reg = <0xeb000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy5: ethernet-phy@0 { pcsphy5: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -60,6 +60,7 @@ mdio@f1000 { ...@@ -60,6 +60,7 @@ mdio@f1000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xf1000 0x1000>; reg = <0xf1000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy14: ethernet-phy@0 { pcsphy14: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -60,6 +60,7 @@ mdio@f3000 { ...@@ -60,6 +60,7 @@ mdio@f3000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xf3000 0x1000>; reg = <0xf3000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy15: ethernet-phy@0 { pcsphy15: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e1000 { ...@@ -59,6 +59,7 @@ mdio@e1000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe1000 0x1000>; reg = <0xe1000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy8: ethernet-phy@0 { pcsphy8: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e3000 { ...@@ -59,6 +59,7 @@ mdio@e3000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe3000 0x1000>; reg = <0xe3000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy9: ethernet-phy@0 { pcsphy9: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e5000 { ...@@ -59,6 +59,7 @@ mdio@e5000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe5000 0x1000>; reg = <0xe5000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy10: ethernet-phy@0 { pcsphy10: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e7000 { ...@@ -59,6 +59,7 @@ mdio@e7000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe7000 0x1000>; reg = <0xe7000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy11: ethernet-phy@0 { pcsphy11: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@e9000 { ...@@ -59,6 +59,7 @@ mdio@e9000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xe9000 0x1000>; reg = <0xe9000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy12: ethernet-phy@0 { pcsphy12: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -59,6 +59,7 @@ mdio@eb000 { ...@@ -59,6 +59,7 @@ mdio@eb000 {
#size-cells = <0>; #size-cells = <0>;
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
reg = <0xeb000 0x1000>; reg = <0xeb000 0x1000>;
fsl,erratum-a011043; /* must ignore read errors */
pcsphy13: ethernet-phy@0 { pcsphy13: ethernet-phy@0 {
reg = <0x0>; reg = <0x0>;
......
...@@ -49,6 +49,7 @@ struct tgec_mdio_controller { ...@@ -49,6 +49,7 @@ struct tgec_mdio_controller {
struct mdio_fsl_priv { struct mdio_fsl_priv {
struct tgec_mdio_controller __iomem *mdio_base; struct tgec_mdio_controller __iomem *mdio_base;
bool is_little_endian; bool is_little_endian;
bool has_a011043;
}; };
static u32 xgmac_read32(void __iomem *regs, static u32 xgmac_read32(void __iomem *regs,
...@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum) ...@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum)
return ret; return ret;
/* Return all Fs if nothing was there */ /* Return all Fs if nothing was there */
if (xgmac_read32(&regs->mdio_stat, endian) & MDIO_STAT_RD_ER) { if ((xgmac_read32(&regs->mdio_stat, endian) & MDIO_STAT_RD_ER) &&
!priv->has_a011043) {
dev_err(&bus->dev, dev_err(&bus->dev,
"Error while reading PHY%d reg at %d.%hhu\n", "Error while reading PHY%d reg at %d.%hhu\n",
phy_id, dev_addr, regnum); phy_id, dev_addr, regnum);
...@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev) ...@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev)
priv->is_little_endian = of_property_read_bool(pdev->dev.of_node, priv->is_little_endian = of_property_read_bool(pdev->dev.of_node,
"little-endian"); "little-endian");
priv->has_a011043 = of_property_read_bool(pdev->dev.of_node,
"fsl,erratum-a011043");
ret = of_mdiobus_register(bus, np); ret = of_mdiobus_register(bus, np);
if (ret) { if (ret) {
dev_err(&pdev->dev, "cannot register MDIO bus\n"); dev_err(&pdev->dev, "cannot register MDIO bus\n");
......
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