diff mbox series

[v2,01/36] soc: fsl: cpm1: qmc: Update TRNSYNC only in transparent mode

Message ID 20240808071132.149251-2-herve.codina@bootlin.com (mailing list archive)
State New, archived
Headers show
Series soc: fsl: Add support for QUICC Engine TSA and QMC | expand

Commit Message

Herve Codina Aug. 8, 2024, 7:10 a.m. UTC
The TRNSYNC feature is available (and enabled) only in transparent mode.

Since commit 7cc9bda9c163 ("soc: fsl: cpm1: qmc: Handle timeslot entries
at channel start() and stop()") TRNSYNC register is updated in
transparent and hdlc mode. In hdlc mode, the address of the TRNSYNC
register is used by the QMC for other internal purpose. Even if no weird
results were observed in hdlc mode, touching this register in this mode
is wrong.

Update TRNSYNC only in transparent mode.

Fixes: 7cc9bda9c163 ("soc: fsl: cpm1: qmc: Handle timeslot entries at channel start() and stop()")
Cc: stable@vger.kernel.org
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
---
 drivers/soc/fsl/qe/qmc.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

Comments

Christophe Leroy Aug. 23, 2024, 8:03 a.m. UTC | #1
Le 08/08/2024 à 09:10, Herve Codina a écrit :
> The TRNSYNC feature is available (and enabled) only in transparent mode.
> 
> Since commit 7cc9bda9c163 ("soc: fsl: cpm1: qmc: Handle timeslot entries
> at channel start() and stop()") TRNSYNC register is updated in
> transparent and hdlc mode. In hdlc mode, the address of the TRNSYNC
> register is used by the QMC for other internal purpose. Even if no weird
> results were observed in hdlc mode, touching this register in this mode
> is wrong.
> 
> Update TRNSYNC only in transparent mode.
> 
> Fixes: 7cc9bda9c163 ("soc: fsl: cpm1: qmc: Handle timeslot entries at channel start() and stop()")
> Cc: stable@vger.kernel.org
> Signed-off-by: Herve Codina <herve.codina@bootlin.com>

Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>

> ---
>   drivers/soc/fsl/qe/qmc.c | 24 ++++++++++++++----------
>   1 file changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/soc/fsl/qe/qmc.c b/drivers/soc/fsl/qe/qmc.c
> index 76bb496305a0..bacabf731dcb 100644
> --- a/drivers/soc/fsl/qe/qmc.c
> +++ b/drivers/soc/fsl/qe/qmc.c
> @@ -940,11 +940,13 @@ static int qmc_chan_start_rx(struct qmc_chan *chan)
>   		goto end;
>   	}
>   
> -	ret = qmc_setup_chan_trnsync(chan->qmc, chan);
> -	if (ret) {
> -		dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
> -			chan->id, ret);
> -		goto end;
> +	if (chan->mode == QMC_TRANSPARENT) {
> +		ret = qmc_setup_chan_trnsync(chan->qmc, chan);
> +		if (ret) {
> +			dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
> +				chan->id, ret);
> +			goto end;
> +		}
>   	}
>   
>   	/* Restart the receiver */
> @@ -982,11 +984,13 @@ static int qmc_chan_start_tx(struct qmc_chan *chan)
>   		goto end;
>   	}
>   
> -	ret = qmc_setup_chan_trnsync(chan->qmc, chan);
> -	if (ret) {
> -		dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
> -			chan->id, ret);
> -		goto end;
> +	if (chan->mode == QMC_TRANSPARENT) {
> +		ret = qmc_setup_chan_trnsync(chan->qmc, chan);
> +		if (ret) {
> +			dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
> +				chan->id, ret);
> +			goto end;
> +		}
>   	}
>   
>   	/*
diff mbox series

Patch

diff --git a/drivers/soc/fsl/qe/qmc.c b/drivers/soc/fsl/qe/qmc.c
index 76bb496305a0..bacabf731dcb 100644
--- a/drivers/soc/fsl/qe/qmc.c
+++ b/drivers/soc/fsl/qe/qmc.c
@@ -940,11 +940,13 @@  static int qmc_chan_start_rx(struct qmc_chan *chan)
 		goto end;
 	}
 
-	ret = qmc_setup_chan_trnsync(chan->qmc, chan);
-	if (ret) {
-		dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
-			chan->id, ret);
-		goto end;
+	if (chan->mode == QMC_TRANSPARENT) {
+		ret = qmc_setup_chan_trnsync(chan->qmc, chan);
+		if (ret) {
+			dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
+				chan->id, ret);
+			goto end;
+		}
 	}
 
 	/* Restart the receiver */
@@ -982,11 +984,13 @@  static int qmc_chan_start_tx(struct qmc_chan *chan)
 		goto end;
 	}
 
-	ret = qmc_setup_chan_trnsync(chan->qmc, chan);
-	if (ret) {
-		dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
-			chan->id, ret);
-		goto end;
+	if (chan->mode == QMC_TRANSPARENT) {
+		ret = qmc_setup_chan_trnsync(chan->qmc, chan);
+		if (ret) {
+			dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n",
+				chan->id, ret);
+			goto end;
+		}
 	}
 
 	/*