summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/fsl_qbman/qman_high.c23
-rw-r--r--include/linux/fsl_qman.h5
2 files changed, 20 insertions, 8 deletions
diff --git a/drivers/staging/fsl_qbman/qman_high.c b/drivers/staging/fsl_qbman/qman_high.c
index 9b8a924..8d3011e 100644
--- a/drivers/staging/fsl_qbman/qman_high.c
+++ b/drivers/staging/fsl_qbman/qman_high.c
@@ -3464,10 +3464,11 @@ int qman_ceetm_lni_enable_shaper(struct qm_ceetm_lni *lni, int coupled,
lni->shaper_enable = 1;
lni->shaper_couple = coupled;
+ lni->oal = oal;
config_opts.cid = CEETM_COMMAND_LNI_SHAPER | lni->idx;
config_opts.dcpid = lni->dcp_idx;
- config_opts.shaper_config.cpl = (coupled << 7) | oal;
+ config_opts.shaper_config.cpl = (coupled << 7) | lni->oal;
config_opts.shaper_config.crtcr = (lni->cr_token_rate.whole << 13) |
lni->cr_token_rate.fraction;
config_opts.shaper_config.ertcr = (lni->er_token_rate.whole << 13) |
@@ -3480,13 +3481,25 @@ EXPORT_SYMBOL(qman_ceetm_lni_enable_shaper);
int qman_ceetm_lni_disable_shaper(struct qm_ceetm_lni *lni)
{
+ struct qm_mcc_ceetm_mapping_shaper_tcfc_config config_opts;
+
if (!lni->shaper_enable) {
pr_err("The shaper has been disabled\n");
return -EINVAL;
}
+ config_opts.cid = CEETM_COMMAND_LNI_SHAPER | lni->idx;
+ config_opts.dcpid = lni->dcp_idx;
+ config_opts.shaper_config.cpl = (lni->shaper_couple << 7) | lni->oal;
+ config_opts.shaper_config.crtbl = lni->cr_token_bucket_limit;
+ config_opts.shaper_config.ertbl = lni->er_token_bucket_limit;
+ /* Set CR/ER rate with all 1's to configure an infinite rate, thus
+ * disable the shaping.
+ */
+ config_opts.shaper_config.crtcr = 0xFFFFFF;
+ config_opts.shaper_config.ertcr = 0xFFFFFF;
lni->shaper_enable = 0;
- return 0;
+ return qman_ceetm_configure_mapping_shaper_tcfc(&config_opts);
}
EXPORT_SYMBOL(qman_ceetm_lni_disable_shaper);
@@ -3540,8 +3553,7 @@ int qman_ceetm_lni_get_commit_rate(struct qm_ceetm_lni *lni,
query_opts.dcpid = lni->dcp_idx;
ret = qman_ceetm_query_mapping_shaper_tcfc(&query_opts, &query_result);
- if (ret | !query_result.shaper_query.crtcr |
- !query_result.shaper_query.crtbl) {
+ if (ret) {
pr_err("The LNI CR rate or limit is not set\n");
return -EINVAL;
}
@@ -3602,8 +3614,7 @@ int qman_ceetm_lni_get_excess_rate(struct qm_ceetm_lni *lni,
query_opts.cid = CEETM_COMMAND_LNI_SHAPER | lni->idx;
query_opts.dcpid = lni->dcp_idx;
ret = qman_ceetm_query_mapping_shaper_tcfc(&query_opts, &query_result);
- if (ret | !query_result.shaper_query.ertcr |
- !query_result.shaper_query.ertbl) {
+ if (ret) {
pr_err("The LNI ER rate or limit is not set\n");
return -EINVAL;
}
diff --git a/include/linux/fsl_qman.h b/include/linux/fsl_qman.h
index 2306f93..b149bc5 100644
--- a/include/linux/fsl_qman.h
+++ b/include/linux/fsl_qman.h
@@ -2381,8 +2381,9 @@ struct qm_ceetm_lni {
int is_claimed;
struct qm_ceetm_sp *sp;
struct list_head channels;
- u8 shaper_enable;
- u8 shaper_couple;
+ int shaper_enable;
+ int shaper_couple;
+ int oal;
struct qm_ceetm_rate cr_token_rate;
struct qm_ceetm_rate er_token_rate;
u16 cr_token_bucket_limit;