diff mbox series

[SRU,J:linux-bluefield,v1,1/1] UBUNTU: SAUCE: mlxbf-gige: Fix intermittent no ip issue

Message ID 20230228230421.30981-2-asmaa@nvidia.com
State New
Headers show
Series UBUNTU: SAUCE: mlxbf-gige: Fix intermittent no ip issue | expand

Commit Message

Asmaa Mnebhi Feb. 28, 2023, 11:04 p.m. UTC
BugLink: https://bugs.launchpad.net/bugs/2008833

During the reboot test, the OOB might not get an ip assigned.
This is due to a race condition between phy_startcall and the
RX DMA being enabled and depends on the amount of background
traffic received by the OOB. Enable the RX DMA after teh phy
is started.

Signed-off-by: Asmaa Mnebhi <asmaa@nvidia.com>
---
 .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c | 14 +++++++-------
 .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c   |  6 +++---
 2 files changed, 10 insertions(+), 10 deletions(-)

Comments

Asmaa Mnebhi March 1, 2023, 6:31 p.m. UTC | #1
++@Vladimir Sokolovsky<mailto:vlad@nvidia.com> @Karin Feldman<mailto:karinf@nvidia.com> @Peter Kjersgard<mailto:pkjersgard@nvidia.com> @David Thompson<mailto:davthompson@nvidia.com>



> -----Original Message-----

> From: Asmaa Mnebhi <asmaa@nvidia.com>

> Sent: Tuesday, February 28, 2023 6:04 PM

> To: kernel-team@lists.ubuntu.com

> Cc: Asmaa Mnebhi <asmaa@nvidia.com>

> Subject: [SRU][J:linux-bluefield][PATCH v1 1/1] UBUNTU: SAUCE: mlxbf-gige:

> Fix intermittent no ip issue

>

> BugLink: https://bugs.launchpad.net/bugs/2008833

>

> During the reboot test, the OOB might not get an ip assigned.

> This is due to a race condition between phy_startcall and the RX DMA being

> enabled and depends on the amount of background traffic received by the

> OOB. Enable the RX DMA after teh phy is started.

>

> Signed-off-by: Asmaa Mnebhi <asmaa@nvidia.com<mailto:asmaa@nvidia.com>>

> ---

>  .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c | 14 +++++++-------

>  .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c   |  6 +++---

>  2 files changed, 10 insertions(+), 10 deletions(-)

>

> diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c

> b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c

> index 4cf058cdbba0..5e929867bd6c 100644

> --- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c

> +++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c

> @@ -166,14 +166,14 @@ static int mlxbf_gige_open(struct net_device

> *netdev)

>             */

>            priv->valid_polarity = 0;

>

> -          err = mlxbf_gige_rx_init(priv);

> +         phy_start(phydev);

> +

> +         err = mlxbf_gige_tx_init(priv);

>            if (err)

>                           goto free_irqs;

> -          err = mlxbf_gige_tx_init(priv);

> +         err = mlxbf_gige_rx_init(priv);

>            if (err)

> -                        goto rx_deinit;

> -

> -          phy_start(phydev);

> +                       goto tx_deinit;

>

>            netif_napi_add(netdev, &priv->napi, mlxbf_gige_poll,

> NAPI_POLL_WEIGHT);

>            napi_enable(&priv->napi);

> @@ -195,8 +195,8 @@ static int mlxbf_gige_open(struct net_device

> *netdev)

>

>            return 0;

>

> -rx_deinit:

> -          mlxbf_gige_rx_deinit(priv);

> +tx_deinit:

> +         mlxbf_gige_tx_deinit(priv);

>

>  free_irqs:

>            mlxbf_gige_free_irqs(priv);

> diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c

> b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c

> index 96230763cf6c..f21dafde490b 100644

> --- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c

> +++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c

> @@ -142,6 +142,9 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv)

>            writeq(MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS_EN,

>                   priv->base + MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS);

>

> +         writeq(ilog2(priv->rx_q_entries),

> +                priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2);

> +

>            /* Clear MLXBF_GIGE_INT_MASK 'receive pkt' bit to

>             * indicate readiness to receive interrupts

>             */

> @@ -154,9 +157,6 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv)

>            data |= MLXBF_GIGE_RX_DMA_EN;

>            writeq(data, priv->base + MLXBF_GIGE_RX_DMA);

>

> -          writeq(ilog2(priv->rx_q_entries),

> -                 priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2);

> -

>            return 0;

>

>  free_wqe_and_skb:

> --

> 2.30.1
diff mbox series

Patch

diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c
index 4cf058cdbba0..5e929867bd6c 100644
--- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c
+++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c
@@ -166,14 +166,14 @@  static int mlxbf_gige_open(struct net_device *netdev)
 	 */
 	priv->valid_polarity = 0;
 
-	err = mlxbf_gige_rx_init(priv);
+	phy_start(phydev);
+
+	err = mlxbf_gige_tx_init(priv);
 	if (err)
 		goto free_irqs;
-	err = mlxbf_gige_tx_init(priv);
+	err = mlxbf_gige_rx_init(priv);
 	if (err)
-		goto rx_deinit;
-
-	phy_start(phydev);
+		goto tx_deinit;
 
 	netif_napi_add(netdev, &priv->napi, mlxbf_gige_poll, NAPI_POLL_WEIGHT);
 	napi_enable(&priv->napi);
@@ -195,8 +195,8 @@  static int mlxbf_gige_open(struct net_device *netdev)
 
 	return 0;
 
-rx_deinit:
-	mlxbf_gige_rx_deinit(priv);
+tx_deinit:
+	mlxbf_gige_tx_deinit(priv);
 
 free_irqs:
 	mlxbf_gige_free_irqs(priv);
diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c
index 96230763cf6c..f21dafde490b 100644
--- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c
+++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c
@@ -142,6 +142,9 @@  int mlxbf_gige_rx_init(struct mlxbf_gige *priv)
 	writeq(MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS_EN,
 	       priv->base + MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS);
 
+	writeq(ilog2(priv->rx_q_entries),
+	       priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2);
+
 	/* Clear MLXBF_GIGE_INT_MASK 'receive pkt' bit to
 	 * indicate readiness to receive interrupts
 	 */
@@ -154,9 +157,6 @@  int mlxbf_gige_rx_init(struct mlxbf_gige *priv)
 	data |= MLXBF_GIGE_RX_DMA_EN;
 	writeq(data, priv->base + MLXBF_GIGE_RX_DMA);
 
-	writeq(ilog2(priv->rx_q_entries),
-	       priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2);
-
 	return 0;
 
 free_wqe_and_skb: