You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openwrt/target/linux/layerscape/patches-5.4/701-net-0068-sdk_dpaa-ceetm...

299 lines
9.7 KiB
Diff

From dfd2deb8bc482588999a4f03b5ab5d049e50fdb0 Mon Sep 17 00:00:00 2001
From: Camelia Groza <camelia.groza@nxp.com>
Date: Wed, 30 May 2018 14:51:35 +0300
Subject: [PATCH] sdk_dpaa: ceetm: propagate the ceetm channel through the
qdisc tree
Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
---
.../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c | 61 +++++++++-------------
.../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h | 4 +-
2 files changed, 29 insertions(+), 36 deletions(-)
--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c
@@ -242,7 +242,6 @@ static int ceetm_config_lfq(struct qm_ce
/* Configure a prio ceetm class */
static int ceetm_config_prio_cls(struct ceetm_class *cls,
struct net_device *dev,
- struct qm_ceetm_channel *channel,
unsigned int id)
{
int err;
@@ -253,22 +252,22 @@ static int ceetm_config_prio_cls(struct
return err;
/* Claim and configure the CCG */
- err = ceetm_config_ccg(&cls->prio.ccg, channel, id, cls->prio.fq,
+ err = ceetm_config_ccg(&cls->prio.ccg, cls->ch, id, cls->prio.fq,
dpa_priv);
if (err)
return err;
/* Claim and configure the CQ */
- err = qman_ceetm_cq_claim(&cls->prio.cq, channel, id, cls->prio.ccg);
+ err = qman_ceetm_cq_claim(&cls->prio.cq, cls->ch, id, cls->prio.ccg);
if (err)
return err;
if (cls->shaped) {
- err = qman_ceetm_channel_set_cq_cr_eligibility(channel, id, 1);
+ err = qman_ceetm_channel_set_cq_cr_eligibility(cls->ch, id, 1);
if (err)
return err;
- err = qman_ceetm_channel_set_cq_er_eligibility(channel, id, 1);
+ err = qman_ceetm_channel_set_cq_er_eligibility(cls->ch, id, 1);
if (err)
return err;
}
@@ -284,7 +283,6 @@ static int ceetm_config_prio_cls(struct
/* Configure a wbfs ceetm class */
static int ceetm_config_wbfs_cls(struct ceetm_class *cls,
struct net_device *dev,
- struct qm_ceetm_channel *channel,
unsigned int id, int type)
{
int err;
@@ -295,17 +293,17 @@ static int ceetm_config_wbfs_cls(struct
return err;
/* Claim and configure the CCG */
- err = ceetm_config_ccg(&cls->wbfs.ccg, channel, id, cls->wbfs.fq,
+ err = ceetm_config_ccg(&cls->wbfs.ccg, cls->ch, id, cls->wbfs.fq,
dpa_priv);
if (err)
return err;
/* Claim and configure the CQ */
if (type == WBFS_GRP_B)
- err = qman_ceetm_cq_claim_B(&cls->wbfs.cq, channel, id,
+ err = qman_ceetm_cq_claim_B(&cls->wbfs.cq, cls->ch, id,
cls->wbfs.ccg);
else
- err = qman_ceetm_cq_claim_A(&cls->wbfs.cq, channel, id,
+ err = qman_ceetm_cq_claim_A(&cls->wbfs.cq, cls->ch, id,
cls->wbfs.ccg);
if (err)
return err;
@@ -366,10 +364,10 @@ static void ceetm_cls_destroy(struct Qdi
cl->root.child = NULL;
}
- if (cl->root.ch && qman_ceetm_channel_release(cl->root.ch))
+ if (cl->ch && qman_ceetm_channel_release(cl->ch))
pr_err(KBUILD_BASENAME
" : %s : error releasing the channel %d\n",
- __func__, cl->root.ch->idx);
+ __func__, cl->ch->idx);
break;
@@ -766,6 +764,7 @@ static int ceetm_init_prio(struct Qdisc
priv->shaped = parent_cl->shaped;
priv->prio.qcount = qopt->qcount;
+ priv->prio.ch = parent_cl->ch;
/* Create and configure qcount child classes */
for (i = 0; i < priv->prio.qcount; i++) {
@@ -790,6 +789,7 @@ static int ceetm_init_prio(struct Qdisc
child_cl->type = CEETM_PRIO;
child_cl->shaped = priv->shaped;
child_cl->prio.child = NULL;
+ child_cl->ch = priv->prio.ch;
/* All shaped CQs have CR and ER enabled by default */
child_cl->prio.cr = child_cl->shaped;
@@ -798,8 +798,7 @@ static int ceetm_init_prio(struct Qdisc
child_cl->prio.cq = NULL;
/* Configure the corresponding hardware CQ */
- err = ceetm_config_prio_cls(child_cl, dev,
- parent_cl->root.ch, i);
+ err = ceetm_config_prio_cls(child_cl, dev, i);
if (err) {
pr_err(KBUILD_BASENAME " : %s : failed to configure the ceetm prio class %X\n",
__func__, child_cl->common.classid);
@@ -831,7 +830,6 @@ static int ceetm_init_wbfs(struct Qdisc
struct ceetm_class *parent_cl, *child_cl, *root_cl;
struct Qdisc *parent_qdisc;
struct ceetm_qdisc *parent_priv;
- struct qm_ceetm_channel *channel;
struct net_device *dev = qdisc_dev(sch);
pr_debug(KBUILD_BASENAME " : %s : qdisc %X\n", __func__, sch->handle);
@@ -904,8 +902,7 @@ static int ceetm_init_wbfs(struct Qdisc
priv->wbfs.qcount = qopt->qcount;
priv->wbfs.cr = qopt->cr;
priv->wbfs.er = qopt->er;
-
- channel = root_cl->root.ch;
+ priv->wbfs.ch = parent_cl->ch;
/* Configure the hardware wbfs channel groups */
if (priv->wbfs.qcount == CEETM_MAX_WBFS_QCOUNT) {
@@ -920,7 +917,7 @@ static int ceetm_init_wbfs(struct Qdisc
/* Configure the group B */
priv->wbfs.group_type = WBFS_GRP_B;
- err = qman_ceetm_channel_get_group(channel, &small_group,
+ err = qman_ceetm_channel_get_group(priv->wbfs.ch, &small_group,
&prio_a, &prio_b);
if (err) {
pr_err(KBUILD_BASENAME " : %s : failed to get group details\n",
@@ -938,7 +935,7 @@ static int ceetm_init_wbfs(struct Qdisc
/* Configure the small group A */
priv->wbfs.group_type = WBFS_GRP_A;
- err = qman_ceetm_channel_get_group(channel, &small_group,
+ err = qman_ceetm_channel_get_group(priv->wbfs.ch, &small_group,
&prio_a, &prio_b);
if (err) {
pr_err(KBUILD_BASENAME " : %s : failed to get group details\n",
@@ -953,13 +950,13 @@ static int ceetm_init_wbfs(struct Qdisc
prio_b = prio_b ? : prio_a;
}
- err = qman_ceetm_channel_set_group(channel, small_group, prio_a,
+ err = qman_ceetm_channel_set_group(priv->wbfs.ch, small_group, prio_a,
prio_b);
if (err)
goto err_init_wbfs;
if (priv->shaped) {
- err = qman_ceetm_channel_set_group_cr_eligibility(channel,
+ err = qman_ceetm_channel_set_group_cr_eligibility(priv->wbfs.ch,
group_b,
priv->wbfs.cr);
if (err) {
@@ -968,7 +965,7 @@ static int ceetm_init_wbfs(struct Qdisc
goto err_init_wbfs;
}
- err = qman_ceetm_channel_set_group_er_eligibility(channel,
+ err = qman_ceetm_channel_set_group_er_eligibility(priv->wbfs.ch,
group_b,
priv->wbfs.er);
if (err) {
@@ -1003,13 +1000,14 @@ static int ceetm_init_wbfs(struct Qdisc
child_cl->wbfs.fq = NULL;
child_cl->wbfs.cq = NULL;
child_cl->wbfs.weight = qopt->qweight[i];
+ child_cl->ch = priv->wbfs.ch;
if (priv->wbfs.group_type == WBFS_GRP_B)
id = WBFS_GRP_B_OFFSET + i;
else
id = WBFS_GRP_A_OFFSET + i;
- err = ceetm_config_wbfs_cls(child_cl, dev, channel, id,
+ err = ceetm_config_wbfs_cls(child_cl, dev, id,
priv->wbfs.group_type);
if (err) {
pr_err(KBUILD_BASENAME " : %s : failed to configure the ceetm wbfs class %X\n",
@@ -1178,9 +1176,6 @@ static int ceetm_change_wbfs(struct Qdis
{
int err;
bool group_b;
- struct qm_ceetm_channel *channel;
- struct ceetm_class *prio_class, *root_class;
- struct ceetm_qdisc *prio_qdisc;
if (qopt->qcount) {
pr_err("CEETM: the qcount can not be modified\n");
@@ -1206,14 +1201,10 @@ static int ceetm_change_wbfs(struct Qdis
if (!priv->shaped)
return 0;
- prio_class = priv->wbfs.parent;
- prio_qdisc = qdisc_priv(prio_class->parent);
- root_class = prio_qdisc->prio.parent;
- channel = root_class->root.ch;
group_b = priv->wbfs.group_type == WBFS_GRP_B;
if (qopt->cr != priv->wbfs.cr) {
- err = qman_ceetm_channel_set_group_cr_eligibility(channel,
+ err = qman_ceetm_channel_set_group_cr_eligibility(priv->wbfs.ch,
group_b,
qopt->cr);
if (err)
@@ -1222,7 +1213,7 @@ static int ceetm_change_wbfs(struct Qdis
}
if (qopt->er != priv->wbfs.er) {
- err = qman_ceetm_channel_set_group_er_eligibility(channel,
+ err = qman_ceetm_channel_set_group_er_eligibility(priv->wbfs.ch,
group_b,
qopt->er);
if (err)
@@ -1337,7 +1328,7 @@ static int ceetm_cls_change_root(struct
if (cl->shaped && cl->root.rate != copt->rate) {
bps = copt->rate << 3; /* Bps -> bps */
- err = qman_ceetm_channel_set_commit_rate_bps(cl->root.ch, bps,
+ err = qman_ceetm_channel_set_commit_rate_bps(cl->ch, bps,
dev->mtu);
if (err)
goto change_cls_err;
@@ -1346,7 +1337,7 @@ static int ceetm_cls_change_root(struct
if (cl->shaped && cl->root.ceil != copt->ceil) {
bps = copt->ceil << 3; /* Bps -> bps */
- err = qman_ceetm_channel_set_excess_rate_bps(cl->root.ch, bps,
+ err = qman_ceetm_channel_set_excess_rate_bps(cl->ch, bps,
dev->mtu);
if (err)
goto change_cls_err;
@@ -1354,7 +1345,7 @@ static int ceetm_cls_change_root(struct
}
if (!cl->shaped && cl->root.tbl != copt->tbl) {
- err = qman_ceetm_channel_set_weight(cl->root.ch, copt->tbl);
+ err = qman_ceetm_channel_set_weight(cl->ch, copt->tbl);
if (err)
goto change_cls_err;
cl->root.tbl = copt->tbl;
@@ -1555,7 +1546,7 @@ static int ceetm_cls_change(struct Qdisc
goto claim_err;
}
- cl->root.ch = channel;
+ cl->ch = channel;
if (cl->shaped) {
/* Configure the channel shaper */
--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h
@@ -121,12 +121,14 @@ struct root_q {
struct prio_q {
__u16 qcount;
struct ceetm_class *parent;
+ struct qm_ceetm_channel *ch;
};
struct wbfs_q {
__u16 qcount;
int group_type;
struct ceetm_class *parent;
+ struct qm_ceetm_channel *ch;
__u16 cr;
__u16 er;
};
@@ -165,7 +167,6 @@ struct root_c {
bool wbfs_grp_b;
bool wbfs_grp_large;
struct Qdisc *child;
- struct qm_ceetm_channel *ch;
};
struct prio_c {
@@ -194,6 +195,7 @@ struct ceetm_class {
struct tcf_proto *filter_list; /* class attached filters */
struct tcf_block *block;
struct Qdisc *parent;
+ struct qm_ceetm_channel *ch;
bool shaped;
int type; /* ROOT/PRIO/WBFS */
union {