Commit 5ca63ffd authored by Rohan G Thomas's avatar Rohan G Thomas Committed by David S. Miller
Browse files

net: stmmac: Report taprio offload status



Report taprio offload status. This includes per txq and global
counters of window_drops and tx_overruns.

Window_drops count include count of frames dropped because of
queueMaxSDU setting and HLBF error. Transmission overrun counter
inform the user application whether any packets are currently being
transmitted on a particular queue during a gate-close event.DWMAC IPs
takes care Transmission overrun won't happen hence this is always 0.

Signed-off-by: default avatarRohan G Thomas <rohan.g.thomas@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fd5a6a71
Loading
Loading
Loading
Loading
+58 −4
Original line number Diff line number Diff line
@@ -937,7 +937,7 @@ static void tc_taprio_map_maxsdu_txq(struct stmmac_priv *priv,
	}
}

static int tc_setup_taprio(struct stmmac_priv *priv,
static int tc_taprio_configure(struct stmmac_priv *priv,
			       struct tc_taprio_qopt_offload *qopt)
{
	u32 size, wid = priv->dma_cap.estwid, dep = priv->dma_cap.estdep;
@@ -990,8 +990,6 @@ static int tc_setup_taprio(struct stmmac_priv *priv,

	if (qopt->cmd == TAPRIO_CMD_DESTROY)
		goto disable;
	else if (qopt->cmd != TAPRIO_CMD_REPLACE)
		return -EOPNOTSUPP;

	if (qopt->num_entries >= dep)
		return -EINVAL;
@@ -1102,6 +1100,11 @@ static int tc_setup_taprio(struct stmmac_priv *priv,
		priv->plat->est->enable = false;
		stmmac_est_configure(priv, priv, priv->plat->est,
				     priv->plat->clk_ptp_rate);
		/* Reset taprio status */
		for (i = 0; i < priv->plat->tx_queues_to_use; i++) {
			priv->xstats.max_sdu_txq_drop[i] = 0;
			priv->xstats.mtl_est_txq_hlbf[i] = 0;
		}
		mutex_unlock(&priv->plat->est->lock);
	}

@@ -1119,6 +1122,57 @@ static int tc_setup_taprio(struct stmmac_priv *priv,
	return ret;
}

static void tc_taprio_stats(struct stmmac_priv *priv,
			    struct tc_taprio_qopt_offload *qopt)
{
	u64 window_drops = 0;
	int i = 0;

	for (i = 0; i < priv->plat->tx_queues_to_use; i++)
		window_drops += priv->xstats.max_sdu_txq_drop[i] +
				priv->xstats.mtl_est_txq_hlbf[i];
	qopt->stats.window_drops = window_drops;

	/* Transmission overrun doesn't happen for stmmac, hence always 0 */
	qopt->stats.tx_overruns = 0;
}

static void tc_taprio_queue_stats(struct stmmac_priv *priv,
				  struct tc_taprio_qopt_offload *qopt)
{
	struct tc_taprio_qopt_queue_stats *q_stats = &qopt->queue_stats;
	int queue = qopt->queue_stats.queue;

	q_stats->stats.window_drops = priv->xstats.max_sdu_txq_drop[queue] +
				      priv->xstats.mtl_est_txq_hlbf[queue];

	/* Transmission overrun doesn't happen for stmmac, hence always 0 */
	q_stats->stats.tx_overruns = 0;
}

static int tc_setup_taprio(struct stmmac_priv *priv,
			   struct tc_taprio_qopt_offload *qopt)
{
	int err = 0;

	switch (qopt->cmd) {
	case TAPRIO_CMD_REPLACE:
	case TAPRIO_CMD_DESTROY:
		err = tc_taprio_configure(priv, qopt);
		break;
	case TAPRIO_CMD_STATS:
		tc_taprio_stats(priv, qopt);
		break;
	case TAPRIO_CMD_QUEUE_STATS:
		tc_taprio_queue_stats(priv, qopt);
		break;
	default:
		err = -EOPNOTSUPP;
	}

	return err;
}

static int tc_setup_etf(struct stmmac_priv *priv,
			struct tc_etf_qopt_offload *qopt)
{