Commit 91796f50 authored by Petr Machata's avatar Petr Machata Committed by David S. Miller
Browse files

mlxsw: spectrum_qdisc: Extract two helpers for handling future FIFOs



Extract from __mlxsw_sp_qdisc_ets_replace() two helpers for handling of one
future FIFO resp. reinitializing the array of future FIFOs.

Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 76ff72a7
Loading
Loading
Loading
Loading
+33 −15
Original line number Diff line number Diff line
@@ -1022,6 +1022,32 @@ static struct mlxsw_sp_qdisc_ops mlxsw_sp_qdisc_ops_fifo = {
	.clean_stats = mlxsw_sp_setup_tc_qdisc_leaf_clean_stats,
};

static int
mlxsw_sp_qdisc_future_fifo_replace(struct mlxsw_sp_port *mlxsw_sp_port,
				   u32 handle, unsigned int band,
				   struct mlxsw_sp_qdisc *child_qdisc)
{
	struct mlxsw_sp_qdisc_state *qdisc_state = mlxsw_sp_port->qdisc;

	if (handle == qdisc_state->future_handle &&
	    qdisc_state->future_fifos[band])
		return mlxsw_sp_qdisc_replace(mlxsw_sp_port, TC_H_UNSPEC,
					      child_qdisc,
					      &mlxsw_sp_qdisc_ops_fifo,
					      NULL);
	return 0;
}

static void
mlxsw_sp_qdisc_future_fifos_init(struct mlxsw_sp_port *mlxsw_sp_port,
				 u32 handle)
{
	struct mlxsw_sp_qdisc_state *qdisc_state = mlxsw_sp_port->qdisc;

	qdisc_state->future_handle = handle;
	memset(qdisc_state->future_fifos, 0, sizeof(qdisc_state->future_fifos));
}

static int __mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port,
				    struct tc_fifo_qopt_offload *p)
{
@@ -1037,9 +1063,8 @@ static int __mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port,
			/* This notifications is for a different Qdisc than
			 * previously. Wipe the future cache.
			 */
			memset(qdisc_state->future_fifos, 0,
			       sizeof(qdisc_state->future_fifos));
			qdisc_state->future_handle = parent_handle;
			mlxsw_sp_qdisc_future_fifos_init(mlxsw_sp_port,
							 parent_handle);
		}

		band = TC_H_MIN(p->parent) - 1;
@@ -1141,7 +1166,6 @@ __mlxsw_sp_qdisc_ets_replace(struct mlxsw_sp_port *mlxsw_sp_port,
			     const u8 *priomap)
{
	struct mlxsw_sp_qdisc_ets_data *ets_data = mlxsw_sp_qdisc->ets_data;
	struct mlxsw_sp_qdisc_state *qdisc_state = mlxsw_sp_port->qdisc;
	struct mlxsw_sp_qdisc_ets_band *ets_band;
	struct mlxsw_sp_qdisc *child_qdisc;
	u8 old_priomap, new_priomap;
@@ -1201,16 +1225,11 @@ __mlxsw_sp_qdisc_ets_replace(struct mlxsw_sp_port *mlxsw_sp_port,
			child_qdisc->stats_base.backlog = backlog;
		}

		if (handle == qdisc_state->future_handle &&
		    qdisc_state->future_fifos[band]) {
			err = mlxsw_sp_qdisc_replace(mlxsw_sp_port, TC_H_UNSPEC,
						     child_qdisc,
						     &mlxsw_sp_qdisc_ops_fifo,
						     NULL);
		err = mlxsw_sp_qdisc_future_fifo_replace(mlxsw_sp_port, handle,
							 band, child_qdisc);
		if (err)
			return err;
	}
	}
	for (; band < IEEE_8021QAZ_MAX_TCS; band++) {
		ets_band = &ets_data->bands[band];
		ets_band->prio_bitmap = 0;
@@ -1223,8 +1242,7 @@ __mlxsw_sp_qdisc_ets_replace(struct mlxsw_sp_port *mlxsw_sp_port,
				      ets_band->tclass_num, 0, false, 0);
	}

	qdisc_state->future_handle = TC_H_UNSPEC;
	memset(qdisc_state->future_fifos, 0, sizeof(qdisc_state->future_fifos));
	mlxsw_sp_qdisc_future_fifos_init(mlxsw_sp_port, TC_H_UNSPEC);
	return 0;
}