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:
Родитель
06d5b17911
Коммит
15c87f6b0d
|
@ -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,
|
||||
struct dpaa2_eth_fq *fq,
|
||||
struct dpaa2_fd *fd,
|
||||
u8 prio __always_unused)
|
||||
struct dpaa2_fd *fd, u8 prio)
|
||||
{
|
||||
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)
|
||||
|
@ -2531,17 +2530,21 @@ static int setup_tx_flow(struct dpaa2_eth_priv *priv,
|
|||
struct device *dev = priv->net_dev->dev.parent;
|
||||
struct dpni_queue queue;
|
||||
struct dpni_queue_id qid;
|
||||
int err;
|
||||
int i, err;
|
||||
|
||||
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
|
||||
DPNI_QUEUE_TX, 0, fq->flowid, &queue, &qid);
|
||||
if (err) {
|
||||
dev_err(dev, "dpni_get_queue(TX) failed\n");
|
||||
return err;
|
||||
for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
|
||||
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
|
||||
DPNI_QUEUE_TX, i, fq->flowid,
|
||||
&queue, &qid);
|
||||
if (err) {
|
||||
dev_err(dev, "dpni_get_queue(TX) failed\n");
|
||||
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_fqid = qid.fqid;
|
||||
|
||||
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
|
||||
DPNI_QUEUE_TX_CONFIRM, 0, fq->flowid,
|
||||
|
|
|
@ -282,6 +282,7 @@ struct dpaa2_eth_ch_stats {
|
|||
};
|
||||
|
||||
/* 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_TX_QUEUES 16
|
||||
#define DPAA2_ETH_MAX_QUEUES (DPAA2_ETH_MAX_RX_QUEUES + \
|
||||
|
@ -299,8 +300,9 @@ struct dpaa2_eth_priv;
|
|||
struct dpaa2_eth_fq {
|
||||
u32 fqid;
|
||||
u32 tx_qdbin;
|
||||
u32 tx_fqid;
|
||||
u32 tx_fqid[DPAA2_ETH_MAX_TCS];
|
||||
u16 flowid;
|
||||
u8 tc;
|
||||
int target_cpu;
|
||||
u32 dq_frames;
|
||||
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) \
|
||||
((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 */
|
||||
#define dpaa2_eth_queue_count(priv) \
|
||||
((priv)->num_channels)
|
||||
|
|
Загрузка…
Ссылка в новой задаче