Commit 52b6a4ff authored by Ioana Radulescu's avatar Ioana Radulescu Committed by David S. Miller

dpaa2-eth: Poll Tx pending frames counter on if down

Starting with firmware version MC10.18.0, a new counter for in flight
Tx frames is offered. Use it when bringing down the interface to
determine when all pending Tx frames have been processed by hardware
instead of sleeping a fixed amount of time.
Signed-off-by: default avatarIoana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d84c3a4d
...@@ -1348,7 +1348,7 @@ static u32 ingress_fq_count(struct dpaa2_eth_priv *priv) ...@@ -1348,7 +1348,7 @@ static u32 ingress_fq_count(struct dpaa2_eth_priv *priv)
return total; return total;
} }
static void wait_for_fq_empty(struct dpaa2_eth_priv *priv) static void wait_for_ingress_fq_empty(struct dpaa2_eth_priv *priv)
{ {
int retries = 10; int retries = 10;
u32 pending; u32 pending;
...@@ -1360,6 +1360,31 @@ static void wait_for_fq_empty(struct dpaa2_eth_priv *priv) ...@@ -1360,6 +1360,31 @@ static void wait_for_fq_empty(struct dpaa2_eth_priv *priv)
} while (pending && --retries); } while (pending && --retries);
} }
#define DPNI_TX_PENDING_VER_MAJOR 7
#define DPNI_TX_PENDING_VER_MINOR 13
static void wait_for_egress_fq_empty(struct dpaa2_eth_priv *priv)
{
union dpni_statistics stats;
int retries = 10;
int err;
if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_TX_PENDING_VER_MAJOR,
DPNI_TX_PENDING_VER_MINOR) < 0)
goto out;
do {
err = dpni_get_statistics(priv->mc_io, 0, priv->mc_token, 6,
&stats);
if (err)
goto out;
if (stats.page_6.tx_pending_frames == 0)
return;
} while (--retries);
out:
msleep(500);
}
static int dpaa2_eth_stop(struct net_device *net_dev) static int dpaa2_eth_stop(struct net_device *net_dev)
{ {
struct dpaa2_eth_priv *priv = netdev_priv(net_dev); struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
...@@ -1379,7 +1404,7 @@ static int dpaa2_eth_stop(struct net_device *net_dev) ...@@ -1379,7 +1404,7 @@ static int dpaa2_eth_stop(struct net_device *net_dev)
* on WRIOP. After it finishes, wait until all remaining frames on Rx * on WRIOP. After it finishes, wait until all remaining frames on Rx
* and Tx conf queues are consumed on NAPI poll. * and Tx conf queues are consumed on NAPI poll.
*/ */
msleep(500); wait_for_egress_fq_empty(priv);
do { do {
dpni_disable(priv->mc_io, 0, priv->mc_token); dpni_disable(priv->mc_io, 0, priv->mc_token);
...@@ -1395,7 +1420,7 @@ static int dpaa2_eth_stop(struct net_device *net_dev) ...@@ -1395,7 +1420,7 @@ static int dpaa2_eth_stop(struct net_device *net_dev)
*/ */
} }
wait_for_fq_empty(priv); wait_for_ingress_fq_empty(priv);
disable_ch_napi(priv); disable_ch_napi(priv);
/* Empty the buffer pool */ /* Empty the buffer pool */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment