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

Gavin Shan gwshan at linux.vnet.ibm.com
Wed Sep 28 17:18:22 AEST 2016


On Wed, Sep 28, 2016 at 03:21:20PM +0930, Joel Stanley wrote:
>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?
>

Sure, will do in next revision.

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