This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DP83869HM: Set op-mode from STRAP_OPMODE in the DP83869 Linux driver

Part Number: DP83869HM
Other Parts Discussed in Thread: DP83869

When 'ti,op-mode' is not in device tree, DP83869 Linux driver reads STRAP_OPMODE from STRAP_STS register.

static int dp83869_set_strapped_mode(struct phy_device *phydev)
{
	struct dp83869_private *dp83869 = phydev->priv;
	int val;

	val = phy_read_mmd(phydev, DP83869_DEVADDR, DP83869_STRAP_STS1);
	if (val < 0)
		return val;

	dp83869->mode = val & DP83869_STRAP_OP_MODE_MASK;

	return 0;
}

But, STRAP_OPMODE is bit11-9 of the STRAP_STS register.
Please tell me, need 9-bits right shift?

dp83869->mode = (val >> 9) & DP83869_STRAP_OP_MODE_MASK;

Best Regards.

  • Please also check when 'rx-internal-delay-ps' or 'tx-internal-delay-ps' is not in device tree.
    Below is my draft fix code.

    --- dp83869.c.org	2021-12-28 10:27:20.531165478 +0900
    +++ dp83869.c	2021-12-28 10:40:17.583142803 +0900
    @@ -83,7 +83,8 @@
     #define DP83869_CLK_DELAY_DEF			7
     
     /* STRAP_STS1 bits */
    -#define DP83869_STRAP_OP_MODE_MASK		GENMASK(2, 0)
    +#define DP83869_STRAP_OP_MODE_MASK		GENMASK(11, 9)
    +#define DP83869_STRAP_OP_MODE_SHIFT		9
     #define DP83869_STRAP_STS1_RESERVED		BIT(11)
     #define DP83869_STRAP_MIRROR_ENABLED           BIT(12)
     
    @@ -480,7 +481,7 @@
     	if (val < 0)
     		return val;
     
    -	dp83869->mode = val & DP83869_STRAP_OP_MODE_MASK;
    +	dp83869->mode = (val & DP83869_STRAP_OP_MODE_MASK) >> DP83869_STRAP_OP_MODE_SHIFT;
     
     	return 0;
     }
    @@ -553,15 +554,13 @@
     						       &dp83869_internal_delay[0],
     						       delay_size, true);
     	if (dp83869->rx_int_delay < 0)
    -		dp83869->rx_int_delay =
    -				dp83869_internal_delay[DP83869_CLK_DELAY_DEF];
    +		dp83869->rx_int_delay = DP83869_CLK_DELAY_DEF;
     
     	dp83869->tx_int_delay = phy_get_internal_delay(phydev, dev,
     						       &dp83869_internal_delay[0],
     						       delay_size, false);
     	if (dp83869->tx_int_delay < 0)
    -		dp83869->tx_int_delay =
    -				dp83869_internal_delay[DP83869_CLK_DELAY_DEF];
    +		dp83869->tx_int_delay = DP83869_CLK_DELAY_DEF;
     
     	return ret;
     }

    Please check it.

    Best Regards.

  • Hello,

    Thank you for your query. Due to holiday season, please expect delayed responses until next week. 

    Sincerely,

    Gerome

  • Hello,

    I was able to check with our team, and the concerns you are bringing up will be addressed in a new revision of the driver.

    Sincerely,

    Gerome

  • Dear, Gerome
    Thank you for confirming.
    I'm looking forward to the driver update.
    Best Regards,
    Harumi