[PATCH v4.7 7/7] net/ncsi: Introduce ncsi_stop_dev()

Joel Stanley joel at jms.id.au
Wed Sep 28 15:51:20 AEST 2016


On Wed, 2016-09-28 at 12:48 +1000, Gavin Shan wrote:
> This introduces ncsi_stop_dev(), as counterpart to ncsi_start_dev(),
> to stop the NCSI device so that it can be enabled in future. This
> API should be called when the network device driver is going to
> shutdown the device. There are 3 things done in the function: Stop
> the channel monitoring; Reset channels to inactive state; Report
> NCSI link down.
> 
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>

Makes sense. Can you split out the change to the faraday driver?

> ---
>  drivers/net/ethernet/faraday/ftgmac100.c |  2 ++
>  include/net/ncsi.h                       |  1 +
>  net/ncsi/ncsi-manage.c                   | 37 +++++++++++++++++++++-
> ----------
>  3 files changed, 27 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/net/ethernet/faraday/ftgmac100.c
> b/drivers/net/ethernet/faraday/ftgmac100.c
> index 134b9c5..f40fa92 100644
> --- a/drivers/net/ethernet/faraday/ftgmac100.c
> +++ b/drivers/net/ethernet/faraday/ftgmac100.c
> @@ -1189,6 +1189,8 @@ static int ftgmac100_stop(struct net_device
> *netdev)
>  	napi_disable(&priv->napi);
>  	if (netdev->phydev)
>  		phy_stop(netdev->phydev);
> +	else if (priv->use_ncsi)
> +		ncsi_stop_dev(priv->ndev);
>  
>  	ftgmac100_stop_hw(priv);
>  	free_irq(priv->irq, netdev);
> diff --git a/include/net/ncsi.h b/include/net/ncsi.h
> index 1dbf42f..3d166f7 100644
> --- a/include/net/ncsi.h
> +++ b/include/net/ncsi.h
> @@ -31,6 +31,7 @@ struct ncsi_dev {
>  struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
>  				   void (*notifier)(struct ncsi_dev
> *nd));
>  int ncsi_start_dev(struct ncsi_dev *nd);
> +void ncsi_stop_dev(struct ncsi_dev *nd);
>  void ncsi_unregister_dev(struct ncsi_dev *nd);
>  #else /* !CONFIG_NET_NCSI */
>  static inline struct ncsi_dev *ncsi_register_dev(struct net_device
> *dev,
> diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c
> index 5813ebe..73ab65f 100644
> --- a/net/ncsi/ncsi-manage.c
> +++ b/net/ncsi/ncsi-manage.c
> @@ -1160,9 +1160,7 @@ EXPORT_SYMBOL_GPL(ncsi_register_dev);
>  int ncsi_start_dev(struct ncsi_dev *nd)
>  {
>  	struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd);
> -	struct ncsi_package *np;
> -	struct ncsi_channel *nc;
> -	int old_state, ret;
> +	int ret;
>  
>  	if (nd->state != ncsi_dev_state_registered &&
>  	    nd->state != ncsi_dev_state_functional)
> @@ -1174,16 +1172,6 @@ int ncsi_start_dev(struct ncsi_dev *nd)
>  		return 0;
>  	}
>  
> -	/* Reset channel's state and start over */
> -	NCSI_FOR_EACH_PACKAGE(ndp, np) {
> -		NCSI_FOR_EACH_CHANNEL(np, nc) {
> -			old_state = atomic_xchg(&nc->state,
> -						NCSI_CHANNEL_INACTIV
> E);
> -			WARN_ON_ONCE(!list_empty(&nc->link) ||
> -				     old_state ==
> NCSI_CHANNEL_INVISIBLE);
> -		}
> -	}
> -
>  	if (ndp->flags & NCSI_DEV_HWA)
>  		ret = ncsi_enable_hwa(ndp);
>  	else
> @@ -1193,6 +1181,29 @@ int ncsi_start_dev(struct ncsi_dev *nd)
>  }
>  EXPORT_SYMBOL_GPL(ncsi_start_dev);
>  
> +void ncsi_stop_dev(struct ncsi_dev *nd)
> +{
> +	struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd);
> +	struct ncsi_package *np;
> +	struct ncsi_channel *nc;
> +	int old_state;
> +
> +	/* Stop the channel monitor and reset channel's state */
> +	NCSI_FOR_EACH_PACKAGE(ndp, np) {
> +		NCSI_FOR_EACH_CHANNEL(np, nc) {
> +			ncsi_stop_channel_monitor(nc);
> +
> +			old_state = atomic_xchg(&nc->state,
> +						NCSI_CHANNEL_INACTIV
> E);
> +			WARN_ON_ONCE(!list_empty(&nc->link) ||
> +				     old_state ==
> NCSI_CHANNEL_INVISIBLE);
> +                }
> +        }
> +
> +	ncsi_report_link(ndp, true);
> +}
> +EXPORT_SYMBOL_GPL(ncsi_stop_dev);
> +
>  void ncsi_unregister_dev(struct ncsi_dev *nd)
>  {
>  	struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd);
> 


More information about the openbmc mailing list