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: <20240426142519.GA513047@kernel.org>
Date: Fri, 26 Apr 2024 15:25:19 +0100
From: Simon Horman <horms@...nel.org>
To: Jijie Shao <shaojijie@...wei.com>
Cc: yisen.zhuang@...wei.com, salil.mehta@...wei.com, davem@...emloft.net,
	edumazet@...gle.com, kuba@...nel.org, pabeni@...hat.com,
	jiri@...nulli.us, shenjian15@...wei.com, wangjie125@...wei.com,
	liuyonglong@...wei.com, chenhao418@...wei.com,
	netdev@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH V2 net 5/7] net: hns3: using user configure after
 hardware reset

On Fri, Apr 26, 2024 at 06:00:43PM +0800, Jijie Shao wrote:
> From: Peiyang Wang <wangpeiyang1@...wei.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." ?

> 
> Fixes: f5f2b3e4dcc0 ("net: hns3: add support for imp-controlled PHYs")
> Signed-off-by: Peiyang Wang <wangpeiyang1@...wei.com>
> Signed-off-by: Jijie Shao <shaojijie@...wei.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).

>  	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.

>  	linkmode_copy(hdev->hw.mac.advertising, cmd.link_modes.advertising);
>  
>  	return 0;

..

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ