dpaa2-eth: Support multiple traffic classes on Tx

DPNI objects can have multiple traffic classes, as reflected by
the num_tc attribute. Until now we ignored its value and only
used traffic class 0.

This patch adds support for multiple Tx traffic classes; we have
num_queues x num_tcs hardware queues available for each interface.

Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Ioana Radulescu 2019-06-11 14:50:02 +03:00 committed by David S. Miller
parent 06d5b17911
commit 15c87f6b0d
2 changed files with 19 additions and 11 deletions

View File

@ -2371,11 +2371,10 @@ static inline int dpaa2_eth_enqueue_qd(struct dpaa2_eth_priv *priv,
static inline int dpaa2_eth_enqueue_fq(struct dpaa2_eth_priv *priv, static inline int dpaa2_eth_enqueue_fq(struct dpaa2_eth_priv *priv,
struct dpaa2_eth_fq *fq, struct dpaa2_eth_fq *fq,
struct dpaa2_fd *fd, struct dpaa2_fd *fd, u8 prio)
u8 prio __always_unused)
{ {
return dpaa2_io_service_enqueue_fq(fq->channel->dpio, return dpaa2_io_service_enqueue_fq(fq->channel->dpio,
fq->tx_fqid, fd); fq->tx_fqid[prio], fd);
} }
static void set_enqueue_mode(struct dpaa2_eth_priv *priv) static void set_enqueue_mode(struct dpaa2_eth_priv *priv)
@ -2531,17 +2530,21 @@ static int setup_tx_flow(struct dpaa2_eth_priv *priv,
struct device *dev = priv->net_dev->dev.parent; struct device *dev = priv->net_dev->dev.parent;
struct dpni_queue queue; struct dpni_queue queue;
struct dpni_queue_id qid; struct dpni_queue_id qid;
int err; int i, err;
for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token, err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
DPNI_QUEUE_TX, 0, fq->flowid, &queue, &qid); DPNI_QUEUE_TX, i, fq->flowid,
&queue, &qid);
if (err) { if (err) {
dev_err(dev, "dpni_get_queue(TX) failed\n"); dev_err(dev, "dpni_get_queue(TX) failed\n");
return err; return err;
} }
fq->tx_fqid[i] = qid.fqid;
}
/* All Tx queues belonging to the same flowid have the same qdbin */
fq->tx_qdbin = qid.qdbin; fq->tx_qdbin = qid.qdbin;
fq->tx_fqid = qid.fqid;
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token, err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
DPNI_QUEUE_TX_CONFIRM, 0, fq->flowid, DPNI_QUEUE_TX_CONFIRM, 0, fq->flowid,

View File

@ -282,6 +282,7 @@ struct dpaa2_eth_ch_stats {
}; };
/* Maximum number of queues associated with a DPNI */ /* Maximum number of queues associated with a DPNI */
#define DPAA2_ETH_MAX_TCS 8
#define DPAA2_ETH_MAX_RX_QUEUES 16 #define DPAA2_ETH_MAX_RX_QUEUES 16
#define DPAA2_ETH_MAX_TX_QUEUES 16 #define DPAA2_ETH_MAX_TX_QUEUES 16
#define DPAA2_ETH_MAX_QUEUES (DPAA2_ETH_MAX_RX_QUEUES + \ #define DPAA2_ETH_MAX_QUEUES (DPAA2_ETH_MAX_RX_QUEUES + \
@ -299,8 +300,9 @@ struct dpaa2_eth_priv;
struct dpaa2_eth_fq { struct dpaa2_eth_fq {
u32 fqid; u32 fqid;
u32 tx_qdbin; u32 tx_qdbin;
u32 tx_fqid; u32 tx_fqid[DPAA2_ETH_MAX_TCS];
u16 flowid; u16 flowid;
u8 tc;
int target_cpu; int target_cpu;
u32 dq_frames; u32 dq_frames;
u32 dq_bytes; u32 dq_bytes;
@ -448,6 +450,9 @@ static inline int dpaa2_eth_cmp_dpni_ver(struct dpaa2_eth_priv *priv,
#define dpaa2_eth_fs_count(priv) \ #define dpaa2_eth_fs_count(priv) \
((priv)->dpni_attrs.fs_entries) ((priv)->dpni_attrs.fs_entries)
#define dpaa2_eth_tc_count(priv) \
((priv)->dpni_attrs.num_tcs)
/* We have exactly one {Rx, Tx conf} queue per channel */ /* We have exactly one {Rx, Tx conf} queue per channel */
#define dpaa2_eth_queue_count(priv) \ #define dpaa2_eth_queue_count(priv) \
((priv)->num_channels) ((priv)->num_channels)