From: mans@mansr.com (Måns Rullgård)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH v1] net: ethernet: nb8800: Reset HW block in ndo_open
Date: Fri, 28 Jul 2017 17:17:42 +0100 [thread overview]
Message-ID: <yw1xk22slemx.fsf@mansr.com> (raw)
In-Reply-To: <823b1540-b528-bbd7-7f99-5dc39a08868a@sigmadesigns.com> (Marc Gonzalez's message of "Fri, 28 Jul 2017 18:13:15 +0200")
Marc Gonzalez <marc_gonzalez@sigmadesigns.com> writes:
> ndo_stop breaks RX in a way that ndo_open is unable to undo.
Please elaborate. Why can't it be fixed in a less heavy-handed way?
> Work around the issue by resetting the HW in ndo_open.
> This will provide the basis for suspend/resume support.
>
> Signed-off-by: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
> ---
> drivers/net/ethernet/aurora/nb8800.c | 40 +++++++++++++++++-------------------
> drivers/net/ethernet/aurora/nb8800.h | 1 +
> 2 files changed, 20 insertions(+), 21 deletions(-)
I'm pretty sure this doesn't preserve everything it should.
> diff --git a/drivers/net/ethernet/aurora/nb8800.c b/drivers/net/ethernet/aurora/nb8800.c
> index e94159507847..954a28542c3b 100644
> --- a/drivers/net/ethernet/aurora/nb8800.c
> +++ b/drivers/net/ethernet/aurora/nb8800.c
> @@ -39,6 +39,7 @@
>
> #include "nb8800.h"
>
> +static void nb8800_init(struct net_device *dev);
> static void nb8800_tx_done(struct net_device *dev);
> static int nb8800_dma_stop(struct net_device *dev);
>
> @@ -957,6 +958,8 @@ static int nb8800_open(struct net_device *dev)
> struct phy_device *phydev;
> int err;
>
> + nb8800_init(dev);
> +
> /* clear any pending interrupts */
> nb8800_writel(priv, NB8800_RXC_SR, 0xf);
> nb8800_writel(priv, NB8800_TXC_SR, 0xf);
> @@ -1350,6 +1353,20 @@ static const struct of_device_id nb8800_dt_ids[] = {
> };
> MODULE_DEVICE_TABLE(of, nb8800_dt_ids);
>
> +static void nb8800_init(struct net_device *dev)
> +{
> + struct nb8800_priv *priv = netdev_priv(dev);
> + const struct nb8800_ops *ops = priv->ops;
> +
> + if (ops && ops->reset)
> + ops->reset(dev);
> + nb8800_hw_init(dev);
> + if (ops && ops->init)
> + ops->init(dev);
> + nb8800_update_mac_addr(dev);
> + priv->speed = 0;
> +}
> +
> static int nb8800_probe(struct platform_device *pdev)
> {
> const struct of_device_id *match;
> @@ -1389,6 +1406,7 @@ static int nb8800_probe(struct platform_device *pdev)
>
> priv = netdev_priv(dev);
> priv->base = base;
> + priv->ops = ops;
>
> priv->phy_mode = of_get_phy_mode(pdev->dev.of_node);
> if (priv->phy_mode < 0)
> @@ -1407,12 +1425,6 @@ static int nb8800_probe(struct platform_device *pdev)
>
> spin_lock_init(&priv->tx_lock);
>
> - if (ops && ops->reset) {
> - ret = ops->reset(dev);
> - if (ret)
> - goto err_disable_clk;
> - }
> -
> bus = devm_mdiobus_alloc(&pdev->dev);
> if (!bus) {
> ret = -ENOMEM;
> @@ -1454,16 +1466,6 @@ static int nb8800_probe(struct platform_device *pdev)
>
> priv->mii_bus = bus;
>
> - ret = nb8800_hw_init(dev);
> - if (ret)
> - goto err_deregister_fixed_link;
> -
> - if (ops && ops->init) {
> - ret = ops->init(dev);
> - if (ret)
> - goto err_deregister_fixed_link;
> - }
> -
> dev->netdev_ops = &nb8800_netdev_ops;
> dev->ethtool_ops = &nb8800_ethtool_ops;
> dev->flags |= IFF_MULTICAST;
> @@ -1476,14 +1478,12 @@ static int nb8800_probe(struct platform_device *pdev)
> if (!is_valid_ether_addr(dev->dev_addr))
> eth_hw_addr_random(dev);
>
> - nb8800_update_mac_addr(dev);
> -
> netif_carrier_off(dev);
>
> ret = register_netdev(dev);
> if (ret) {
> netdev_err(dev, "failed to register netdev\n");
> - goto err_free_dma;
> + goto err_deregister_fixed_link;
> }
>
> netif_napi_add(dev, &priv->napi, nb8800_poll, NAPI_POLL_WEIGHT);
> @@ -1492,8 +1492,6 @@ static int nb8800_probe(struct platform_device *pdev)
>
> return 0;
>
> -err_free_dma:
> - nb8800_dma_free(dev);
> err_deregister_fixed_link:
> if (of_phy_is_fixed_link(pdev->dev.of_node))
> of_phy_deregister_fixed_link(pdev->dev.of_node);
> diff --git a/drivers/net/ethernet/aurora/nb8800.h b/drivers/net/ethernet/aurora/nb8800.h
> index 6ec4a956e1e5..d5f4481a2c7b 100644
> --- a/drivers/net/ethernet/aurora/nb8800.h
> +++ b/drivers/net/ethernet/aurora/nb8800.h
> @@ -305,6 +305,7 @@ struct nb8800_priv {
> dma_addr_t tx_desc_dma;
>
> struct clk *clk;
> + const struct nb8800_ops *ops;
> };
>
> struct nb8800_ops {
> --
> 2.11.0
>
--
M?ns Rullg?rd
WARNING: multiple messages have this Message-ID (diff)
From: "Måns Rullgård" <mans@mansr.com>
To: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
netdev <netdev@vger.kernel.org>,
Linux ARM <linux-arm-kernel@lists.infradead.org>,
Mason <slash.tmp@free.fr>
Subject: Re: [RFC PATCH v1] net: ethernet: nb8800: Reset HW block in ndo_open
Date: Fri, 28 Jul 2017 17:17:42 +0100 [thread overview]
Message-ID: <yw1xk22slemx.fsf@mansr.com> (raw)
In-Reply-To: <823b1540-b528-bbd7-7f99-5dc39a08868a@sigmadesigns.com> (Marc Gonzalez's message of "Fri, 28 Jul 2017 18:13:15 +0200")
Marc Gonzalez <marc_gonzalez@sigmadesigns.com> writes:
> ndo_stop breaks RX in a way that ndo_open is unable to undo.
Please elaborate. Why can't it be fixed in a less heavy-handed way?
> Work around the issue by resetting the HW in ndo_open.
> This will provide the basis for suspend/resume support.
>
> Signed-off-by: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
> ---
> drivers/net/ethernet/aurora/nb8800.c | 40 +++++++++++++++++-------------------
> drivers/net/ethernet/aurora/nb8800.h | 1 +
> 2 files changed, 20 insertions(+), 21 deletions(-)
I'm pretty sure this doesn't preserve everything it should.
> diff --git a/drivers/net/ethernet/aurora/nb8800.c b/drivers/net/ethernet/aurora/nb8800.c
> index e94159507847..954a28542c3b 100644
> --- a/drivers/net/ethernet/aurora/nb8800.c
> +++ b/drivers/net/ethernet/aurora/nb8800.c
> @@ -39,6 +39,7 @@
>
> #include "nb8800.h"
>
> +static void nb8800_init(struct net_device *dev);
> static void nb8800_tx_done(struct net_device *dev);
> static int nb8800_dma_stop(struct net_device *dev);
>
> @@ -957,6 +958,8 @@ static int nb8800_open(struct net_device *dev)
> struct phy_device *phydev;
> int err;
>
> + nb8800_init(dev);
> +
> /* clear any pending interrupts */
> nb8800_writel(priv, NB8800_RXC_SR, 0xf);
> nb8800_writel(priv, NB8800_TXC_SR, 0xf);
> @@ -1350,6 +1353,20 @@ static const struct of_device_id nb8800_dt_ids[] = {
> };
> MODULE_DEVICE_TABLE(of, nb8800_dt_ids);
>
> +static void nb8800_init(struct net_device *dev)
> +{
> + struct nb8800_priv *priv = netdev_priv(dev);
> + const struct nb8800_ops *ops = priv->ops;
> +
> + if (ops && ops->reset)
> + ops->reset(dev);
> + nb8800_hw_init(dev);
> + if (ops && ops->init)
> + ops->init(dev);
> + nb8800_update_mac_addr(dev);
> + priv->speed = 0;
> +}
> +
> static int nb8800_probe(struct platform_device *pdev)
> {
> const struct of_device_id *match;
> @@ -1389,6 +1406,7 @@ static int nb8800_probe(struct platform_device *pdev)
>
> priv = netdev_priv(dev);
> priv->base = base;
> + priv->ops = ops;
>
> priv->phy_mode = of_get_phy_mode(pdev->dev.of_node);
> if (priv->phy_mode < 0)
> @@ -1407,12 +1425,6 @@ static int nb8800_probe(struct platform_device *pdev)
>
> spin_lock_init(&priv->tx_lock);
>
> - if (ops && ops->reset) {
> - ret = ops->reset(dev);
> - if (ret)
> - goto err_disable_clk;
> - }
> -
> bus = devm_mdiobus_alloc(&pdev->dev);
> if (!bus) {
> ret = -ENOMEM;
> @@ -1454,16 +1466,6 @@ static int nb8800_probe(struct platform_device *pdev)
>
> priv->mii_bus = bus;
>
> - ret = nb8800_hw_init(dev);
> - if (ret)
> - goto err_deregister_fixed_link;
> -
> - if (ops && ops->init) {
> - ret = ops->init(dev);
> - if (ret)
> - goto err_deregister_fixed_link;
> - }
> -
> dev->netdev_ops = &nb8800_netdev_ops;
> dev->ethtool_ops = &nb8800_ethtool_ops;
> dev->flags |= IFF_MULTICAST;
> @@ -1476,14 +1478,12 @@ static int nb8800_probe(struct platform_device *pdev)
> if (!is_valid_ether_addr(dev->dev_addr))
> eth_hw_addr_random(dev);
>
> - nb8800_update_mac_addr(dev);
> -
> netif_carrier_off(dev);
>
> ret = register_netdev(dev);
> if (ret) {
> netdev_err(dev, "failed to register netdev\n");
> - goto err_free_dma;
> + goto err_deregister_fixed_link;
> }
>
> netif_napi_add(dev, &priv->napi, nb8800_poll, NAPI_POLL_WEIGHT);
> @@ -1492,8 +1492,6 @@ static int nb8800_probe(struct platform_device *pdev)
>
> return 0;
>
> -err_free_dma:
> - nb8800_dma_free(dev);
> err_deregister_fixed_link:
> if (of_phy_is_fixed_link(pdev->dev.of_node))
> of_phy_deregister_fixed_link(pdev->dev.of_node);
> diff --git a/drivers/net/ethernet/aurora/nb8800.h b/drivers/net/ethernet/aurora/nb8800.h
> index 6ec4a956e1e5..d5f4481a2c7b 100644
> --- a/drivers/net/ethernet/aurora/nb8800.h
> +++ b/drivers/net/ethernet/aurora/nb8800.h
> @@ -305,6 +305,7 @@ struct nb8800_priv {
> dma_addr_t tx_desc_dma;
>
> struct clk *clk;
> + const struct nb8800_ops *ops;
> };
>
> struct nb8800_ops {
> --
> 2.11.0
>
--
Måns Rullgård
next prev parent reply other threads:[~2017-07-28 16:17 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-28 16:13 [RFC PATCH v1] net: ethernet: nb8800: Reset HW block in ndo_open Marc Gonzalez
2017-07-28 16:13 ` Marc Gonzalez
2017-07-28 16:17 ` Måns Rullgård [this message]
2017-07-28 16:17 ` Måns Rullgård
2017-07-28 16:43 ` Marc Gonzalez
2017-07-28 16:43 ` Marc Gonzalez
2017-07-28 18:56 ` Måns Rullgård
2017-07-28 18:56 ` Måns Rullgård
2017-07-28 21:53 ` Mason
2017-07-28 21:53 ` Mason
2017-07-29 11:24 ` Måns Rullgård
2017-07-29 11:24 ` Måns Rullgård
2017-07-29 12:02 ` Mason
2017-07-29 12:02 ` Mason
2017-07-29 12:05 ` Måns Rullgård
2017-07-29 12:05 ` Måns Rullgård
2017-07-29 12:44 ` Mason
2017-07-29 12:44 ` Mason
2017-07-29 12:51 ` Måns Rullgård
2017-07-29 12:51 ` Måns Rullgård
2017-07-29 20:15 ` Florian Fainelli
2017-07-29 20:15 ` Florian Fainelli
2017-07-29 22:48 ` Mason
2017-07-29 22:48 ` Mason
2017-07-29 15:18 ` Florian Fainelli
2017-07-29 15:18 ` Florian Fainelli
2017-07-31 11:49 ` Mason
2017-07-31 11:49 ` Mason
2017-07-31 11:59 ` Måns Rullgård
2017-07-31 11:59 ` Måns Rullgård
2017-07-31 14:08 ` Mason
2017-07-31 14:08 ` Mason
2017-07-31 15:18 ` Mason
2017-07-31 15:18 ` Mason
2017-07-31 15:28 ` Måns Rullgård
2017-07-31 15:28 ` Måns Rullgård
2017-07-31 15:18 ` Måns Rullgård
2017-07-31 15:18 ` Måns Rullgård
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=yw1xk22slemx.fsf@mansr.com \
--to=mans@mansr.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.