[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