Message ID | 20230228230421.30981-2-asmaa@nvidia.com |
---|---|
State | New |
Headers | show |
Series | UBUNTU: SAUCE: mlxbf-gige: Fix intermittent no ip issue | expand |
++@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 --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:
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(-)