Message ID | 1475113131-18048-8-git-send-email-gwshan@linux.vnet.ibm.com |
---|---|
State | Superseded, archived |
Delegated to: | Joel Stanley |
Headers | show |
On Thu, Sep 29, 2016 at 11:08 AM, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote: > This introduces ncsi_stop_dev(), as counterpart to ncsi_start_dev(), > to stop the NCSI device so that it can be reenabled 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@linux.vnet.ibm.com> Reviewed-by: Joel Stanley <joel@jms.id.au> > --- > include/net/ncsi.h | 5 +++++ > net/ncsi/ncsi-manage.c | 33 ++++++++++++++++++++++----------- > 2 files changed, 27 insertions(+), 11 deletions(-) > > diff --git a/include/net/ncsi.h b/include/net/ncsi.h > index 1dbf42f..68680ba 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, > @@ -44,6 +45,10 @@ static inline int ncsi_start_dev(struct ncsi_dev *nd) > return -ENOTTY; > } > > +static void ncsi_stop_dev(struct ncsi_dev *nd) > +{ > +} > + > static inline void ncsi_unregister_dev(struct ncsi_dev *nd) > { > } > diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c > index 1b797c9..6a96873 100644 > --- a/net/ncsi/ncsi-manage.c > +++ b/net/ncsi/ncsi-manage.c > @@ -1161,9 +1161,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) > @@ -1175,9 +1173,27 @@ int ncsi_start_dev(struct ncsi_dev *nd) > return 0; > } > > - /* Reset channel's state and start over */ > + if (ndp->flags & NCSI_DEV_HWA) > + ret = ncsi_enable_hwa(ndp); > + else > + ret = ncsi_choose_active_channel(ndp); > + > + return ret; > +} > +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 = READ_ONCE(nc->state); > WRITE_ONCE(nc->state, NCSI_CHANNEL_INACTIVE); > WARN_ON_ONCE(!list_empty(&nc->link) || > @@ -1185,14 +1201,9 @@ int ncsi_start_dev(struct ncsi_dev *nd) > } > } > > - if (ndp->flags & NCSI_DEV_HWA) > - ret = ncsi_enable_hwa(ndp); > - else > - ret = ncsi_choose_active_channel(ndp); > - > - return ret; > + ncsi_report_link(ndp, true); > } > -EXPORT_SYMBOL_GPL(ncsi_start_dev); > +EXPORT_SYMBOL_GPL(ncsi_stop_dev); > > void ncsi_unregister_dev(struct ncsi_dev *nd) > { > -- > 2.1.0 >
diff --git a/include/net/ncsi.h b/include/net/ncsi.h index 1dbf42f..68680ba 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, @@ -44,6 +45,10 @@ static inline int ncsi_start_dev(struct ncsi_dev *nd) return -ENOTTY; } +static void ncsi_stop_dev(struct ncsi_dev *nd) +{ +} + static inline void ncsi_unregister_dev(struct ncsi_dev *nd) { } diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c index 1b797c9..6a96873 100644 --- a/net/ncsi/ncsi-manage.c +++ b/net/ncsi/ncsi-manage.c @@ -1161,9 +1161,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) @@ -1175,9 +1173,27 @@ int ncsi_start_dev(struct ncsi_dev *nd) return 0; } - /* Reset channel's state and start over */ + if (ndp->flags & NCSI_DEV_HWA) + ret = ncsi_enable_hwa(ndp); + else + ret = ncsi_choose_active_channel(ndp); + + return ret; +} +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 = READ_ONCE(nc->state); WRITE_ONCE(nc->state, NCSI_CHANNEL_INACTIVE); WARN_ON_ONCE(!list_empty(&nc->link) || @@ -1185,14 +1201,9 @@ int ncsi_start_dev(struct ncsi_dev *nd) } } - if (ndp->flags & NCSI_DEV_HWA) - ret = ncsi_enable_hwa(ndp); - else - ret = ncsi_choose_active_channel(ndp); - - return ret; + ncsi_report_link(ndp, true); } -EXPORT_SYMBOL_GPL(ncsi_start_dev); +EXPORT_SYMBOL_GPL(ncsi_stop_dev); void ncsi_unregister_dev(struct ncsi_dev *nd) {
This introduces ncsi_stop_dev(), as counterpart to ncsi_start_dev(), to stop the NCSI device so that it can be reenabled 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@linux.vnet.ibm.com> --- include/net/ncsi.h | 5 +++++ net/ncsi/ncsi-manage.c | 33 ++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 11 deletions(-)