summaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorHaiying Wang <Haiying.Wang@freescale.com>2014-10-24 17:36:02 (GMT)
committerMatthew Weigel <Matthew.Weigel@freescale.com>2014-12-11 18:40:08 (GMT)
commita73cd22b44963a0889ab87c5786bb4876a2c1b1d (patch)
treeb2bc11750ec3004d1352039268873a1ecd2b7cac /drivers/staging
parentcfb7dfe88785ecae6a7daac14260bea9db0bb729 (diff)
downloadlinux-fsl-qoriq-a73cd22b44963a0889ab87c5786bb4876a2c1b1d.tar.xz
fsl_qbman: change the ceetm shaping speed bps to be u64 typed
The original u32 define limited the ceetm shaping speed. Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com> Change-Id: I02fe21c541e5c78151b181b8ab75cc84d019661d Reviewed-on: http://git.am.freescale.net:8181/22074 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Geoff Thorpe <Geoff.Thorpe@freescale.com> Reviewed-by: Richard Schmitt <richard.schmitt@freescale.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/fsl_qbman/qman_high.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/staging/fsl_qbman/qman_high.c b/drivers/staging/fsl_qbman/qman_high.c
index 370e260..9b8a924 100644
--- a/drivers/staging/fsl_qbman/qman_high.c
+++ b/drivers/staging/fsl_qbman/qman_high.c
@@ -3223,7 +3223,7 @@ static int qman_ceetm_write_statistics(u16 cid, enum qm_dc_portal dcp_idx,
return 0;
}
-int qman_ceetm_bps2tokenrate(u32 bps, struct qm_ceetm_rate *token_rate,
+int qman_ceetm_bps2tokenrate(u64 bps, struct qm_ceetm_rate *token_rate,
int rounding)
{
u16 pres;
@@ -3254,16 +3254,20 @@ int qman_ceetm_bps2tokenrate(u32 bps, struct qm_ceetm_rate *token_rate,
* token-rate = (bps*2^19) / (PRES*QHZ)
* N = (bps*2^32) / (PRES*QHz)
*
+ * And to avoid 64-bit overflow if 'bps' is larger than 4Gbps
+ * (yet minimise rounding error if 'bps' is small), we reorganise
+ * the formula to use two 16-bit shifts rather than 1 32-bit shift.
+ * N = (((bps*2^16)/PRES)*2^16)/QHz
*/
- temp = ROUNDING(((u64)bps << 32), pres, rounding);
- temp = ROUNDING(temp, qman_freq, rounding);
+ temp = ROUNDING((bps << 16), pres, rounding);
+ temp = ROUNDING((temp << 16), qman_freq, rounding);
token_rate->whole = temp >> 13;
token_rate->fraction = temp & (((u64)1 << 13) - 1);
return 0;
}
EXPORT_SYMBOL(qman_ceetm_bps2tokenrate);
-int qman_ceetm_tokenrate2bps(const struct qm_ceetm_rate *token_rate, u32 *bps,
+int qman_ceetm_tokenrate2bps(const struct qm_ceetm_rate *token_rate, u64 *bps,
int rounding)
{
u16 pres;