All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] net: phy: state machine fixes for interrupt driven PHYs
@ 2017-03-22 11:02 Roger Quadros
  2017-03-22 11:02 ` [PATCH v2 1/2] net: phy: Fix PHY AN done state machine " Roger Quadros
  2017-03-22 11:02 ` [PATCH v2 2/2] net: phy: Don't miss phy_suspend() on PHY_HALTED for PHYs with interrupts Roger Quadros
  0 siblings, 2 replies; 13+ messages in thread
From: Roger Quadros @ 2017-03-22 11:02 UTC (permalink / raw)
  To: f.fainelli
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	Roger Quadros

Hi,

These 2 patches fix the following 2 issues with the PHY state machine
when used with interrupt driven PHYs.

- PHY link not coming up if Ethernet cable is plugged before Ethernet network
interface is brought up.

- PHY not being suspended when PHY is halted.

cheers,
-roger

Roger Quadros (2):
  net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  net: phy: Don't miss phy_suspend() on PHY_HALTED for PHYs with
    interrupts

 drivers/net/phy/phy.c | 5 +++++
 1 file changed, 5 insertions(+)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-22 11:02 [PATCH v2 0/2] net: phy: state machine fixes for interrupt driven PHYs Roger Quadros
@ 2017-03-22 11:02 ` Roger Quadros
  2017-03-23  9:52   ` Sergei Shtylyov
  2017-03-27 11:59   ` [PATCH v3 " Roger Quadros
  2017-03-22 11:02 ` [PATCH v2 2/2] net: phy: Don't miss phy_suspend() on PHY_HALTED for PHYs with interrupts Roger Quadros
  1 sibling, 2 replies; 13+ messages in thread
From: Roger Quadros @ 2017-03-22 11:02 UTC (permalink / raw)
  To: f.fainelli
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	Roger Quadros, stable # v4 . 9+

he ethernet link on an interrupt driven PHY was not coming up if the
ethernet cable was plugged before the ethernet interface was brought up.

The PHY state machine seems to be stuck from RUNNING to AN state
with no new interrupts from the PHY. So it doesn't know when the
PHY Auto-negotiation has been completed and doesn't transition to RUNNING
state with ANEG done thus netif_carrier_on() is never called.

NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
advertisement parameters didn't change.

Fix this by scheduling the PHY state machine in phy_start_aneg().

Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
Cc: stable <stable@vger.kernel.org> # v4.9+
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
 drivers/net/phy/phy.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 1be69d8..49dedf8 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -630,6 +630,10 @@ int phy_start_aneg(struct phy_device *phydev)
 
 out_unlock:
 	mutex_unlock(&phydev->lock);
+	if (!err && phy_interrupt_is_valid(phydev))
+		queue_delayed_work(system_power_efficient_wq,
+				   &phydev->state_queue, HZ);
+
 	return err;
 }
 EXPORT_SYMBOL(phy_start_aneg);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/2] net: phy: Don't miss phy_suspend() on PHY_HALTED for PHYs with interrupts
  2017-03-22 11:02 [PATCH v2 0/2] net: phy: state machine fixes for interrupt driven PHYs Roger Quadros
  2017-03-22 11:02 ` [PATCH v2 1/2] net: phy: Fix PHY AN done state machine " Roger Quadros
@ 2017-03-22 11:02 ` Roger Quadros
  2017-04-19 16:31   ` Florian Fainelli
  1 sibling, 1 reply; 13+ messages in thread
From: Roger Quadros @ 2017-03-22 11:02 UTC (permalink / raw)
  To: f.fainelli
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	Roger Quadros, stable # v4 . 9+

phy_suspend() doesn't get called as part of phy_stop() for PHYs
using interrupts because the phy state machine is never triggered
after a phy_stop().

Explicitly trigger the PHY state machine in phy_stop() so that it can
see the new PHY state (HALTED) and suspend the PHY.

As most PHYLIB consumers will call phy_stop() with rtnl_lock() held
from ndo_close() so we use don't wait for workqueue cancellation in
phy_trigger_machine() by passing false for the 'sync' argument.

Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
Cc: stable <stable@vger.kernel.org> # v4.9+
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
 drivers/net/phy/phy.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 49dedf8..ab14e7b 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -907,6 +907,7 @@ void phy_stop(struct phy_device *phydev)
 	 * of rtnl_lock(), but PHY_HALTED shall guarantee phy_change()
 	 * will not reenable interrupts.
 	 */
+	phy_trigger_machine(phydev, false);
 }
 EXPORT_SYMBOL(phy_stop);
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-22 11:02 ` [PATCH v2 1/2] net: phy: Fix PHY AN done state machine " Roger Quadros
@ 2017-03-23  9:52   ` Sergei Shtylyov
  2017-03-27 11:50     ` Roger Quadros
  2017-03-27 11:59   ` [PATCH v3 " Roger Quadros
  1 sibling, 1 reply; 13+ messages in thread
From: Sergei Shtylyov @ 2017-03-23  9:52 UTC (permalink / raw)
  To: Roger Quadros, f.fainelli
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+

Hello!

On 3/22/2017 2:02 PM, Roger Quadros wrote:

> he ethernet link on an interrupt driven PHY was not coming up if the

    s/he/The/?

> ethernet cable was plugged before the ethernet interface was brought up.

    Also, my spell checker trips on "ethernet", perhaps should be capitalized?

> The PHY state machine seems to be stuck from RUNNING to AN state
> with no new interrupts from the PHY. So it doesn't know when the
> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
> state with ANEG done thus netif_carrier_on() is never called.
>
> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
> advertisement parameters didn't change.
>
> Fix this by scheduling the PHY state machine in phy_start_aneg().
>
> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
> Cc: stable <stable@vger.kernel.org> # v4.9+
> Signed-off-by: Roger Quadros <rogerq@ti.com>
[...]

MBR, Sergei

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-23  9:52   ` Sergei Shtylyov
@ 2017-03-27 11:50     ` Roger Quadros
  0 siblings, 0 replies; 13+ messages in thread
From: Roger Quadros @ 2017-03-27 11:50 UTC (permalink / raw)
  To: Sergei Shtylyov, f.fainelli
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+

On 23/03/17 11:52, Sergei Shtylyov wrote:
> Hello!
> 
> On 3/22/2017 2:02 PM, Roger Quadros wrote:
> 
>> he ethernet link on an interrupt driven PHY was not coming up if the
> 
>    s/he/The/?
> 
>> ethernet cable was plugged before the ethernet interface was brought up.
> 
>    Also, my spell checker trips on "ethernet", perhaps should be capitalized?

Thanks. I'll fix both issues.

> 
>> The PHY state machine seems to be stuck from RUNNING to AN state
>> with no new interrupts from the PHY. So it doesn't know when the
>> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
>> state with ANEG done thus netif_carrier_on() is never called.
>>
>> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
>> advertisement parameters didn't change.
>>
>> Fix this by scheduling the PHY state machine in phy_start_aneg().
>>
>> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
>> Cc: stable <stable@vger.kernel.org> # v4.9+
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
> [...]
> 
> MBR, Sergei
> 

cheers,
-roger

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v3 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-22 11:02 ` [PATCH v2 1/2] net: phy: Fix PHY AN done state machine " Roger Quadros
  2017-03-23  9:52   ` Sergei Shtylyov
@ 2017-03-27 11:59   ` Roger Quadros
  2017-03-28 10:05     ` Roger Quadros
                       ` (2 more replies)
  1 sibling, 3 replies; 13+ messages in thread
From: Roger Quadros @ 2017-03-27 11:59 UTC (permalink / raw)
  To: f.fainelli
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+,
	Sergei Shtylyov, rogerq

The Ethernet link on an interrupt driven PHY was not coming up if the
Ethernet cable was plugged before the Ethernet interface was brought up.

The PHY state machine seems to be stuck from RUNNING to AN state
with no new interrupts from the PHY. So it doesn't know when the
PHY Auto-negotiation has been completed and doesn't transition to RUNNING
state with ANEG done thus netif_carrier_on() is never called.

NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
advertisement parameters didn't change.

Fix this by scheduling the PHY state machine in phy_start_aneg().
There is no way of knowing in phy.c whether auto-negotiation was
restarted or not by the PHY driver so we just wait for the next
poll/interrupt to update the PHY state machine.

Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
Cc: stable <stable@vger.kernel.org> # v4.9+
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
v3: Fix typo in commit message

 drivers/net/phy/phy.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 1be69d8..49dedf8 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -630,6 +630,10 @@ int phy_start_aneg(struct phy_device *phydev)
 
 out_unlock:
 	mutex_unlock(&phydev->lock);
+	if (!err && phy_interrupt_is_valid(phydev))
+		queue_delayed_work(system_power_efficient_wq,
+				   &phydev->state_queue, HZ);
+
 	return err;
 }
 EXPORT_SYMBOL(phy_start_aneg);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-27 11:59   ` [PATCH v3 " Roger Quadros
@ 2017-03-28 10:05     ` Roger Quadros
  2017-04-11 11:17       ` Roger Quadros
  2017-03-30 12:59     ` Madalin-Cristian Bucur
  2017-03-30 20:02     ` Florian Fainelli
  2 siblings, 1 reply; 13+ messages in thread
From: Roger Quadros @ 2017-03-28 10:05 UTC (permalink / raw)
  To: f.fainelli, andrew
  Cc: davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+,
	Sergei Shtylyov, Andrew F. Davis, Nori, Sekhar

+Andrew Davis & Sekhar.

Hi,

Andrew Davis posted a few comments offline which I'm clarifying here.

On 27/03/17 14:59, Roger Quadros wrote:
> The Ethernet link on an interrupt driven PHY was not coming up if the
> Ethernet cable was plugged before the Ethernet interface was brought up.
> 
> The PHY state machine seems to be stuck from RUNNING to AN state
> with no new interrupts from the PHY. So it doesn't know when the
> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
> state with ANEG done thus netif_carrier_on() is never called.
> 
> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
> advertisement parameters didn't change.

Is phy->config_aneg expected to *always* restart auto-negotiation even if
advertisement parameters didn't change?
If so then we'll need to fix genphy_config_aneg().

> 
> Fix this by scheduling the PHY state machine in phy_start_aneg().
> There is no way of knowing in phy.c whether auto-negotiation was
> restarted or not by the PHY driver so we just wait for the next
> poll/interrupt to update the PHY state machine.
> 
> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
> Cc: stable <stable@vger.kernel.org> # v4.9+
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
> v3: Fix typo in commit message
> 
>  drivers/net/phy/phy.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index 1be69d8..49dedf8 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -630,6 +630,10 @@ int phy_start_aneg(struct phy_device *phydev)
>  
>  out_unlock:
>  	mutex_unlock(&phydev->lock);
> +	if (!err && phy_interrupt_is_valid(phydev))
> +		queue_delayed_work(system_power_efficient_wq,
> +				   &phydev->state_queue, HZ);
> +
>  	return err;
>  }
>  EXPORT_SYMBOL(phy_start_aneg);
> 

There is still room for optimization for interrupt driven PHYs as I still
see a delay of 1 second between "ifconfig ethx up" and link status coming up
if cable was already plugged in. In fact if Auto-negotiation was already completed
and not required to be restarted, the PHY state machine should have move from
AN to RUNNING instantly without expecting a PHY interrupt.

How can we get rid of the unnecessary delay in the case where auto-negotiation
is not restarted?
Should we check for phy_aneg_done() immediately after issuing a phy_start_aneg()
in phy_state_machine() and switch from PHY_AN to PHY_RUNNING?

This should avoid the need to re-schedule the state machine in phy_start_angeg().

cheers,
-roger

^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: [PATCH v3 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-27 11:59   ` [PATCH v3 " Roger Quadros
  2017-03-28 10:05     ` Roger Quadros
@ 2017-03-30 12:59     ` Madalin-Cristian Bucur
  2017-03-30 20:02     ` Florian Fainelli
  2 siblings, 0 replies; 13+ messages in thread
From: Madalin-Cristian Bucur @ 2017-03-30 12:59 UTC (permalink / raw)
  To: Roger Quadros, f.fainelli, netdev
  Cc: andrew, davem, kyle.roeschley, nsekhar, linux-kernel,
	stable # v4 . 9+,
	Sergei Shtylyov

On March 27, 2017 2:59 PM, Roger Quadros wrote:
> The Ethernet link on an interrupt driven PHY was not coming up if the
> Ethernet cable was plugged before the Ethernet interface was brought up.
> 
> The PHY state machine seems to be stuck from RUNNING to AN state
> with no new interrupts from the PHY. So it doesn't know when the
> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
> state with ANEG done thus netif_carrier_on() is never called.
> 
> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
> advertisement parameters didn't change.
> 
> Fix this by scheduling the PHY state machine in phy_start_aneg().
> There is no way of knowing in phy.c whether auto-negotiation was
> restarted or not by the PHY driver so we just wait for the next
> poll/interrupt to update the PHY state machine.
> 
> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and
> not polling.")
> Cc: stable <stable@vger.kernel.org> # v4.9+
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
> v3: Fix typo in commit message
> 
>  drivers/net/phy/phy.c | 4 ++++
>  1 file changed, 4 insertions(+)

Tested-by: Madalin Bucur <madalin.bucur@nxp.com>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-27 11:59   ` [PATCH v3 " Roger Quadros
  2017-03-28 10:05     ` Roger Quadros
  2017-03-30 12:59     ` Madalin-Cristian Bucur
@ 2017-03-30 20:02     ` Florian Fainelli
  2017-03-31  9:19       ` Roger Quadros
  2 siblings, 1 reply; 13+ messages in thread
From: Florian Fainelli @ 2017-03-30 20:02 UTC (permalink / raw)
  To: Roger Quadros
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+,
	Sergei Shtylyov

On 03/27/2017 04:59 AM, Roger Quadros wrote:
> The Ethernet link on an interrupt driven PHY was not coming up if the
> Ethernet cable was plugged before the Ethernet interface was brought up.
> 
> The PHY state machine seems to be stuck from RUNNING to AN state
> with no new interrupts from the PHY. So it doesn't know when the
> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
> state with ANEG done thus netif_carrier_on() is never called.
> 
> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
> advertisement parameters didn't change.
> 
> Fix this by scheduling the PHY state machine in phy_start_aneg().
> There is no way of knowing in phy.c whether auto-negotiation was
> restarted or not by the PHY driver so we just wait for the next
> poll/interrupt to update the PHY state machine.
> 
> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
> Cc: stable <stable@vger.kernel.org> # v4.9+
> Signed-off-by: Roger Quadros <rogerq@ti.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-30 20:02     ` Florian Fainelli
@ 2017-03-31  9:19       ` Roger Quadros
  0 siblings, 0 replies; 13+ messages in thread
From: Roger Quadros @ 2017-03-31  9:19 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: andrew, davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+,
	Sergei Shtylyov

Florian,

On 30/03/17 23:02, Florian Fainelli wrote:
> On 03/27/2017 04:59 AM, Roger Quadros wrote:
>> The Ethernet link on an interrupt driven PHY was not coming up if the
>> Ethernet cable was plugged before the Ethernet interface was brought up.
>>
>> The PHY state machine seems to be stuck from RUNNING to AN state
>> with no new interrupts from the PHY. So it doesn't know when the
>> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
>> state with ANEG done thus netif_carrier_on() is never called.
>>
>> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
>> advertisement parameters didn't change.
>>
>> Fix this by scheduling the PHY state machine in phy_start_aneg().
>> There is no way of knowing in phy.c whether auto-negotiation was
>> restarted or not by the PHY driver so we just wait for the next
>> poll/interrupt to update the PHY state machine.
>>
>> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
>> Cc: stable <stable@vger.kernel.org> # v4.9+
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
> 
> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
> 
Thanks for the review, but there are a still few unanswered questions in the parallel thread.
Can you please clarify those first before this patch gets picked? Thanks.

cheers,
-roger

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-03-28 10:05     ` Roger Quadros
@ 2017-04-11 11:17       ` Roger Quadros
  2017-04-19 16:28         ` Florian Fainelli
  0 siblings, 1 reply; 13+ messages in thread
From: Roger Quadros @ 2017-04-11 11:17 UTC (permalink / raw)
  To: f.fainelli, andrew
  Cc: davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+,
	Sergei Shtylyov, Andrew F. Davis

Hi,

On 28/03/17 13:05, Roger Quadros wrote:
> +Andrew Davis & Sekhar.
> 
> Hi,
> 
> Andrew Davis posted a few comments offline which I'm clarifying here.
> 
> On 27/03/17 14:59, Roger Quadros wrote:
>> The Ethernet link on an interrupt driven PHY was not coming up if the
>> Ethernet cable was plugged before the Ethernet interface was brought up.
>>
>> The PHY state machine seems to be stuck from RUNNING to AN state
>> with no new interrupts from the PHY. So it doesn't know when the
>> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
>> state with ANEG done thus netif_carrier_on() is never called.
>>
>> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
>> advertisement parameters didn't change.
> 
> Is phy->config_aneg expected to *always* restart auto-negotiation even if
> advertisement parameters didn't change?
> If so then we'll need to fix genphy_config_aneg().
> 
>>
>> Fix this by scheduling the PHY state machine in phy_start_aneg().
>> There is no way of knowing in phy.c whether auto-negotiation was
>> restarted or not by the PHY driver so we just wait for the next
>> poll/interrupt to update the PHY state machine.
>>
>> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
>> Cc: stable <stable@vger.kernel.org> # v4.9+
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> ---
>> v3: Fix typo in commit message
>>
>>  drivers/net/phy/phy.c | 4 ++++
>>  1 file changed, 4 insertions(+)
>>
>> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
>> index 1be69d8..49dedf8 100644
>> --- a/drivers/net/phy/phy.c
>> +++ b/drivers/net/phy/phy.c
>> @@ -630,6 +630,10 @@ int phy_start_aneg(struct phy_device *phydev)
>>  
>>  out_unlock:
>>  	mutex_unlock(&phydev->lock);
>> +	if (!err && phy_interrupt_is_valid(phydev))
>> +		queue_delayed_work(system_power_efficient_wq,
>> +				   &phydev->state_queue, HZ);
>> +
>>  	return err;
>>  }
>>  EXPORT_SYMBOL(phy_start_aneg);
>>
> 
> There is still room for optimization for interrupt driven PHYs as I still
> see a delay of 1 second between "ifconfig ethx up" and link status coming up
> if cable was already plugged in. In fact if Auto-negotiation was already completed
> and not required to be restarted, the PHY state machine should have move from
> AN to RUNNING instantly without expecting a PHY interrupt.
> 
> How can we get rid of the unnecessary delay in the case where auto-negotiation
> is not restarted?
> Should we check for phy_aneg_done() immediately after issuing a phy_start_aneg()
> in phy_state_machine() and switch from PHY_AN to PHY_RUNNING?
> 
> This should avoid the need to re-schedule the state machine in phy_start_angeg().

Any comments on my questions?

cheers,
-roger

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/2] net: phy: Fix PHY AN done state machine for interrupt driven PHYs
  2017-04-11 11:17       ` Roger Quadros
@ 2017-04-19 16:28         ` Florian Fainelli
  0 siblings, 0 replies; 13+ messages in thread
From: Florian Fainelli @ 2017-04-19 16:28 UTC (permalink / raw)
  To: Roger Quadros, andrew
  Cc: davem, kyle.roeschley, nsekhar, netdev, linux-kernel,
	stable # v4 . 9+,
	Sergei Shtylyov, Andrew F. Davis, Alexander Kochetkov

On 04/11/2017 04:17 AM, Roger Quadros wrote:
> Hi,
> 
> On 28/03/17 13:05, Roger Quadros wrote:
>> +Andrew Davis & Sekhar.
>>
>> Hi,
>>
>> Andrew Davis posted a few comments offline which I'm clarifying here.
>>
>> On 27/03/17 14:59, Roger Quadros wrote:
>>> The Ethernet link on an interrupt driven PHY was not coming up if the
>>> Ethernet cable was plugged before the Ethernet interface was brought up.
>>>
>>> The PHY state machine seems to be stuck from RUNNING to AN state
>>> with no new interrupts from the PHY. So it doesn't know when the
>>> PHY Auto-negotiation has been completed and doesn't transition to RUNNING
>>> state with ANEG done thus netif_carrier_on() is never called.
>>>
>>> NOTE: genphy_config_aneg() will not restart PHY Auto-negotiation of
>>> advertisement parameters didn't change.
>>
>> Is phy->config_aneg expected to *always* restart auto-negotiation even if
>> advertisement parameters didn't change?
>> If so then we'll need to fix genphy_config_aneg().
>>
>>>
>>> Fix this by scheduling the PHY state machine in phy_start_aneg().
>>> There is no way of knowing in phy.c whether auto-negotiation was
>>> restarted or not by the PHY driver so we just wait for the next
>>> poll/interrupt to update the PHY state machine.
>>>
>>> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
>>> Cc: stable <stable@vger.kernel.org> # v4.9+
>>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>>> ---
>>> v3: Fix typo in commit message
>>>
>>>  drivers/net/phy/phy.c | 4 ++++
>>>  1 file changed, 4 insertions(+)
>>>
>>> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
>>> index 1be69d8..49dedf8 100644
>>> --- a/drivers/net/phy/phy.c
>>> +++ b/drivers/net/phy/phy.c
>>> @@ -630,6 +630,10 @@ int phy_start_aneg(struct phy_device *phydev)
>>>  
>>>  out_unlock:
>>>  	mutex_unlock(&phydev->lock);
>>> +	if (!err && phy_interrupt_is_valid(phydev))
>>> +		queue_delayed_work(system_power_efficient_wq,
>>> +				   &phydev->state_queue, HZ);
>>> +
>>>  	return err;
>>>  }
>>>  EXPORT_SYMBOL(phy_start_aneg);
>>>
>>
>> There is still room for optimization for interrupt driven PHYs as I still
>> see a delay of 1 second between "ifconfig ethx up" and link status coming up
>> if cable was already plugged in. In fact if Auto-negotiation was already completed
>> and not required to be restarted, the PHY state machine should have move from
>> AN to RUNNING instantly without expecting a PHY interrupt.
>>
>> How can we get rid of the unnecessary delay in the case where auto-negotiation
>> is not restarted?
>> Should we check for phy_aneg_done() immediately after issuing a phy_start_aneg()
>> in phy_state_machine() and switch from PHY_AN to PHY_RUNNING?

That sounds like a good idea yes. It seems to me like Alexander's patch
actually takes care of that:

http://patchwork.ozlabs.org/patch/752288/

Let's try to merge threads/recipients so we can shoot for a fix to be
included soon.

Thanks!

>>
>> This should avoid the need to re-schedule the state machine in phy_start_angeg().
> 
> Any comments on my questions?
> 
> cheers,
> -roger
> 


-- 
Florian

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 2/2] net: phy: Don't miss phy_suspend() on PHY_HALTED for PHYs with interrupts
  2017-03-22 11:02 ` [PATCH v2 2/2] net: phy: Don't miss phy_suspend() on PHY_HALTED for PHYs with interrupts Roger Quadros
@ 2017-04-19 16:31   ` Florian Fainelli
  0 siblings, 0 replies; 13+ messages in thread
From: Florian Fainelli @ 2017-04-19 16:31 UTC (permalink / raw)
  To: Roger Quadros
  Cc: andrew, davem, nsekhar, netdev, linux-kernel, stable # v4 . 9+,
	Alexander Kochetkov

On 03/22/2017 04:02 AM, Roger Quadros wrote:
> phy_suspend() doesn't get called as part of phy_stop() for PHYs
> using interrupts because the phy state machine is never triggered
> after a phy_stop().
> 
> Explicitly trigger the PHY state machine in phy_stop() so that it can
> see the new PHY state (HALTED) and suspend the PHY.
> 
> As most PHYLIB consumers will call phy_stop() with rtnl_lock() held
> from ndo_close() so we use don't wait for workqueue cancellation in
> phy_trigger_machine() by passing false for the 'sync' argument.

Sorry for this long delay in responding. I am not exactly sure if this
thing to do here. phy_stop() does not have a requirement to suspend the
PHY as it is currently defined. You may want to manually suspend the PHY
after a phy_stop() by explicitly calling phy_suspend().

Let me think about it some more.

> 
> Fixes: 3c293f4e08b5 ("net: phy: Trigger state machine on state change and not polling.")
> Cc: stable <stable@vger.kernel.org> # v4.9+
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
>  drivers/net/phy/phy.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index 49dedf8..ab14e7b 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -907,6 +907,7 @@ void phy_stop(struct phy_device *phydev)
>  	 * of rtnl_lock(), but PHY_HALTED shall guarantee phy_change()
>  	 * will not reenable interrupts.
>  	 */
> +	phy_trigger_machine(phydev, false);
>  }
>  EXPORT_SYMBOL(phy_stop);
>  
> 


-- 
Florian

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-04-19 16:31 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-22 11:02 [PATCH v2 0/2] net: phy: state machine fixes for interrupt driven PHYs Roger Quadros
2017-03-22 11:02 ` [PATCH v2 1/2] net: phy: Fix PHY AN done state machine " Roger Quadros
2017-03-23  9:52   ` Sergei Shtylyov
2017-03-27 11:50     ` Roger Quadros
2017-03-27 11:59   ` [PATCH v3 " Roger Quadros
2017-03-28 10:05     ` Roger Quadros
2017-04-11 11:17       ` Roger Quadros
2017-04-19 16:28         ` Florian Fainelli
2017-03-30 12:59     ` Madalin-Cristian Bucur
2017-03-30 20:02     ` Florian Fainelli
2017-03-31  9:19       ` Roger Quadros
2017-03-22 11:02 ` [PATCH v2 2/2] net: phy: Don't miss phy_suspend() on PHY_HALTED for PHYs with interrupts Roger Quadros
2017-04-19 16:31   ` Florian Fainelli

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.