lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <27ab4feb-fe84-4d3b-1779-25a25065a9fa@ti.com>
Date:   Fri, 31 Jan 2020 19:30:05 -0600
From:   Dan Murphy <dmurphy@...com>
To:     Heiner Kallweit <hkallweit1@...il.com>, <andrew@...n.ch>,
        <f.fainelli@...il.com>, <bunk@...nel.org>
CC:     <netdev@...r.kernel.org>, <devicetree@...r.kernel.org>,
        <linux-kernel@...r.kernel.org>, <grygorii.strashko@...com>
Subject: Re: [PATCH net-master 1/1] net: phy: dp83867: Add speed optimization
 feature

Heiner

On 1/31/20 2:56 PM, Heiner Kallweit wrote:
> On 31.01.2020 16:11, Dan Murphy wrote:
>> Set the speed optimization bit on the DP83867 PHY.
>> This feature can also be strapped on the 64 pin PHY devices
>> but the 48 pin devices do not have the strap pin available to enable
>> this feature in the hardware.  PHY team suggests to have this bit set.
>>
> It's ok to enable downshift by default, however it would be good to
> make it configurable. Best implement the downshift tunable, you can
> use the Marvell PHY driver as reference.
> Can the number of attempts until downshifts happens be configured?

Yes we can tune the number of attempts it makes to negotiate 1000Mbps 
before enabling the speed optimization.  But why would we need to 
configure the number of attempts currently it is defaulted to 4.  Is 
there a use case for this level of configurability?


>
>> With this bit set the PHY will auto negotiate and report the link
>> parameters in the PHYSTS register and not in the BMCR.  So we need to
>> over ride the genphy_read_status with a DP83867 specific read status.
>>
>> Signed-off-by: Dan Murphy <dmurphy@...com>
>> ---
>>   drivers/net/phy/dp83867.c | 48 +++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 48 insertions(+)
>>
>> diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c
>> index 967f57ed0b65..695aaf4f942f 100644
>> --- a/drivers/net/phy/dp83867.c
>> +++ b/drivers/net/phy/dp83867.c
>> @@ -21,6 +21,7 @@
>>   #define DP83867_DEVADDR		0x1f
>>   
>>   #define MII_DP83867_PHYCTRL	0x10
>> +#define MII_DP83867_PHYSTS	0x11
>>   #define MII_DP83867_MICR	0x12
>>   #define MII_DP83867_ISR		0x13
>>   #define DP83867_CFG2		0x14
>> @@ -118,6 +119,15 @@
>>   #define DP83867_IO_MUX_CFG_CLK_O_SEL_MASK	(0x1f << 8)
>>   #define DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT	8
>>   
>> +/* PHY STS bits */
>> +#define DP83867_PHYSTS_1000			BIT(15)
>> +#define DP83867_PHYSTS_100			BIT(14)
>> +#define DP83867_PHYSTS_DUPLEX			BIT(13)
>> +#define DP83867_PHYSTS_LINK			BIT(10)
>> +
>> +/* CFG2 bits */
>> +#define DP83867_SPEED_OPTIMIZED_EN		(BIT(8) | BIT(9))
>> +
>>   /* CFG3 bits */
>>   #define DP83867_CFG3_INT_OE			BIT(7)
>>   #define DP83867_CFG3_ROBUST_AUTO_MDIX		BIT(9)
>> @@ -287,6 +297,36 @@ static int dp83867_config_intr(struct phy_device *phydev)
>>   	return phy_write(phydev, MII_DP83867_MICR, micr_status);
>>   }
>>   
>> +static int dp83867_read_status(struct phy_device *phydev)
>> +{
>> +	int status = phy_read(phydev, MII_DP83867_PHYSTS);
>> +
>> +	if (status < 0)
>> +		return status;
>> +
>> +	if (status & DP83867_PHYSTS_DUPLEX)
>> +		phydev->duplex = DUPLEX_FULL;
>> +	else
>> +		phydev->duplex = DUPLEX_HALF;
>> +
>> +	if (status & DP83867_PHYSTS_1000)
>> +		phydev->speed = SPEED_1000;
>> +	else if (status & DP83867_PHYSTS_100)
>> +		phydev->speed = SPEED_100;
>> +	else
>> +		phydev->speed = SPEED_10;
>> +
>> +	if (status & DP83867_PHYSTS_LINK)
>> +		phydev->link = 1;
>> +	else
>> +		phydev->link = 0;
>> +
>> +	phydev->pause = 0;
>> +	phydev->asym_pause = 0;
>> +
>> +	return 0;
>> +}
>> +
>>   static int dp83867_config_port_mirroring(struct phy_device *phydev)
>>   {
>>   	struct dp83867_private *dp83867 =
>> @@ -467,6 +507,12 @@ static int dp83867_config_init(struct phy_device *phydev)
>>   	int ret, val, bs;
>>   	u16 delay;
>>   
>> +	/* Force speed optimization for the PHY even if it strapped */
>> +	ret = phy_modify(phydev, DP83867_CFG2, DP83867_SPEED_OPTIMIZED_EN,
>> +			 DP83867_SPEED_OPTIMIZED_EN);
> Here phy_set_bits() would be easier.

Ack

Dan


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ