[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