mirror of https://gitee.com/openkylin/linux.git
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:
parent
06d5b17911
commit
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,
|
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;
|
||||||
|
|
||||||
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
|
for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {
|
||||||
DPNI_QUEUE_TX, 0, fq->flowid, &queue, &qid);
|
err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,
|
||||||
if (err) {
|
DPNI_QUEUE_TX, i, fq->flowid,
|
||||||
dev_err(dev, "dpni_get_queue(TX) failed\n");
|
&queue, &qid);
|
||||||
return err;
|
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_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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue