netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jijie Shao <shaojijie@huawei.com>
To: Simon Horman <horms@kernel.org>
Cc: <shaojijie@huawei.com>, <yisen.zhuang@huawei.com>,
	<salil.mehta@huawei.com>, <davem@davemloft.net>,
	<edumazet@google.com>, <kuba@kernel.org>, <pabeni@redhat.com>,
	<jiri@resnulli.us>, <shenjian15@huawei.com>,
	<wangjie125@huawei.com>, <liuyonglong@huawei.com>,
	<chenhao418@huawei.com>, <netdev@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH V2 net 5/7] net: hns3: using user configure after hardware reset
Date: Sun, 28 Apr 2024 22:14:58 +0800	[thread overview]
Message-ID: <6b501b43-8baa-41f1-9688-5928e7ad9a77@huawei.com> (raw)
In-Reply-To: <20240426142519.GA513047@kernel.org>


on 2024/4/26 22:25, Simon Horman wrote:
> On Fri, Apr 26, 2024 at 06:00:43PM +0800, Jijie Shao wrote:
>> From: Peiyang Wang <wangpeiyang1@huawei.com>
>>
>> When a reset occurring, it's supposed to recover user's configuration.
>> Currently, the port info(speed, duplex and autoneg) is stored in hclge_mac
>> and will be scheduled updated. Consider the case that reset was happened
>> consecutively. During the first reset, the port info is configured with
>> a temporary value cause the PHY is reset and looking for best link config.
>> Second reset start and use pervious configuration which is not the user's.
>> The specific process is as follows:
>>
>> +------+               +----+                +----+
>> | USER |               | PF |                | HW |
>> +---+--+               +-+--+                +-+--+
>>      |  ethtool --reset   |                     |
>>      +------------------->|    reset command    |
>>      |  ethtool --reset   +-------------------->|
>>      +------------------->|                     +---+
>>      |                    +---+                 |   |
>>      |                    |   |reset currently  |   | HW RESET
>>      |                    |   |and wait to do   |   |
>>      |                    |<--+                 |   |
>>      |                    | send pervious cfg   |<--+
>>      |                    | (1000M FULL AN_ON)  |
>>      |                    +-------------------->|
>>      |                    | read cfg(time task) |
>>      |                    | (10M HALF AN_OFF)   +---+
>>      |                    |<--------------------+   | cfg take effect
>>      |                    |    reset command    |<--+
>>      |                    +-------------------->|
>>      |                    |                     +---+
>>      |                    | send pervious cfg   |   | HW RESET
>>      |                    | (10M HALF AN_OFF)   |<--+
>>      |                    +-------------------->|
>>      |                    | read cfg(time task) |
>>      |                    |  (10M HALF AN_OFF)  +---+
>>      |                    |<--------------------+   | cfg take effect
>>      |                    |                     |   |
>>      |                    | read cfg(time task) |<--+
>>      |                    |  (10M HALF AN_OFF)  |
>>      |                    |<--------------------+
>>      |                    |                     |
>>      v                    v                     v
>>
>> To avoid aboved situation, this patch introduced req_speed, req_duplex,
>> req_autoneg to store user's configuration and it only be used after
>> hardware reset and to recover user's configuration
> Hi Peiyang Wang and Jijie Shao,
>
> In reviewing this patch it would be helpful if the diagram above could be
> related to driver code.  I'm sure it is obvious enough, but I'm having a
> bit of trouble.  F.e., is it hclge_tp_port_init() where "port info is
> configured with a temporary value cause the PHY is reset and looking for
> best link config." ?

Sorry, the description here is a bit confusing.
driver periodically updates port info. If only one reset occurs, driver
updates the port info based on the actual port info of the HW after
the reset is complete. However, When two resets occur consecutively,
If the port info of the HW is not updated in time before the second reset,
The driver may query a temporary info instead of the actual port info.
As a result, the actual port info is overwritten, Therefore, the port info
restored by the driver after the second reset is incorrect.

>> Fixes: f5f2b3e4dcc0 ("net: hns3: add support for imp-controlled PHYs")
>> Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com>
>> Signed-off-by: Jijie Shao <shaojijie@huawei.com>
>> ---
>>   .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c   | 15 +++++++++------
>>   .../ethernet/hisilicon/hns3/hns3pf/hclge_main.h   |  3 +++
>>   2 files changed, 12 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
>> index 6eda73f1e6ad..5dc8593c97be 100644
>> --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
>> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
>> @@ -1537,6 +1537,9 @@ static int hclge_configure(struct hclge_dev *hdev)
>>   			cfg.default_speed, ret);
>>   		return ret;
>>   	}
>> +	hdev->hw.mac.req_speed = hdev->hw.mac.speed;
>> +	hdev->hw.mac.req_autoneg = AUTONEG_ENABLE;
>> +	hdev->hw.mac.req_duplex = DUPLEX_FULL;
> I am curious to know why the initialisation of req_autoneg and req_duplex
> is not:
>
> 	hdev->hw.mac.req_autoneg = hdev->hw.mac.autoneg;
> 	hdev->hw.mac.req_duplex = hdev->hw.mac.duplex
>
> As it seems to me the value .autoneg is 0 (AUTONEG_DISABLE)
> and the value of .duplex is 0 (DUPLEX_HALF).

Yes, the value .autoneg is 0 and the value of .duplex is 0 here.
We hope that the network port is initialized in AUTONEG_ENABLE
and DUPLEX_FULL, so req_autoneg and req_duplex are fixed.

>
>>   	hclge_parse_link_mode(hdev, cfg.speed_ability);
>>   
>> @@ -3344,9 +3347,9 @@ hclge_set_phy_link_ksettings(struct hnae3_handle *handle,
>>   		return ret;
>>   	}
>>   
>> -	hdev->hw.mac.autoneg = cmd->base.autoneg;
>> -	hdev->hw.mac.speed = cmd->base.speed;
>> -	hdev->hw.mac.duplex = cmd->base.duplex;
>> +	hdev->hw.mac.req_autoneg = cmd->base.autoneg;
>> +	hdev->hw.mac.req_speed = cmd->base.speed;
>> +	hdev->hw.mac.req_duplex = cmd->base.duplex;
>>   	linkmode_copy(hdev->hw.mac.advertising, cmd->link_modes.advertising);
>>   
>>   	return 0;
>> @@ -3364,9 +3367,9 @@ static int hclge_update_tp_port_info(struct hclge_dev *hdev)
>>   	if (ret)
>>   		return ret;
>>   
>> -	hdev->hw.mac.autoneg = cmd.base.autoneg;
>> -	hdev->hw.mac.speed = cmd.base.speed;
>> -	hdev->hw.mac.duplex = cmd.base.duplex;
>> +	cmd.base.autoneg = hdev->hw.mac.req_autoneg;
>> +	cmd.base.speed = hdev->hw.mac.req_speed;
>> +	cmd.base.duplex = hdev->hw.mac.req_duplex;
> It is unclear to me why fields of cmd are set here, cmd is a local variable
> and they don't seem to be used for the rest of the function.

I'm so sorry, the code here is wrong.
I will fix it in next version of this patch

Thank you very much for your review.


  reply	other threads:[~2024-04-28 14:15 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-26 10:00 [PATCH V2 net 0/7] There are some bugfix for the HNS3 ethernet driver Jijie Shao
2024-04-26 10:00 ` [PATCH V2 net 1/7] net: hns3: direct return when receive a unknown mailbox message Jijie Shao
2024-04-26 14:26   ` Simon Horman
2024-04-26 10:00 ` [PATCH V2 net 2/7] net: hns3: change type of numa_node_mask as nodemask_t Jijie Shao
2024-04-26 14:26   ` Simon Horman
2024-04-26 10:00 ` [PATCH V2 net 3/7] net: hns3: release PTP resources if pf initialization failed Jijie Shao
2024-04-26 11:21   ` Hariprasad Kelam
2024-04-26 10:00 ` [PATCH V2 net 4/7] net: hns3: use appropriate barrier function after setting a bit value Jijie Shao
2024-04-26 14:25   ` Simon Horman
2024-04-26 10:00 ` [PATCH V2 net 5/7] net: hns3: using user configure after hardware reset Jijie Shao
2024-04-26 14:25   ` Simon Horman
2024-04-28 14:14     ` Jijie Shao [this message]
2024-04-26 10:00 ` [PATCH V2 net 6/7] net: hns3: fix port vlan filter not disabled issue Jijie Shao
2024-04-26 18:15   ` Simon Horman
2024-04-26 10:00 ` [PATCH V2 net 7/7] net: hns3: fix kernel crash when devlink reload during initialization Jijie Shao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6b501b43-8baa-41f1-9688-5928e7ad9a77@huawei.com \
    --to=shaojijie@huawei.com \
    --cc=chenhao418@huawei.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=jiri@resnulli.us \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=liuyonglong@huawei.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=salil.mehta@huawei.com \
    --cc=shenjian15@huawei.com \
    --cc=wangjie125@huawei.com \
    --cc=yisen.zhuang@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).