diff options
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0068-sdk_dpaa-ceetm-propagate-the-ceetm-channel-through-t.patch')
-rw-r--r-- | target/linux/layerscape/patches-5.4/701-net-0068-sdk_dpaa-ceetm-propagate-the-ceetm-channel-through-t.patch | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0068-sdk_dpaa-ceetm-propagate-the-ceetm-channel-through-t.patch b/target/linux/layerscape/patches-5.4/701-net-0068-sdk_dpaa-ceetm-propagate-the-ceetm-channel-through-t.patch new file mode 100644 index 0000000000..f10670241c --- /dev/null +++ b/target/linux/layerscape/patches-5.4/701-net-0068-sdk_dpaa-ceetm-propagate-the-ceetm-channel-through-t.patch @@ -0,0 +1,298 @@ +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 { |