[Sound-open-firmware] [PATCH] Host: fix error return handlings for some dma invokings.

Keyon Jie yang.jie at linux.intel.com
Tue Apr 3 12:59:33 CEST 2018


Add hanle for error on dma_set_config(), dma_start() and dma_copy().

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
---
 src/audio/host.c | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/audio/host.c b/src/audio/host.c
index 930cace..d346b5e 100644
--- a/src/audio/host.c
+++ b/src/audio/host.c
@@ -462,14 +462,19 @@ static int host_trigger(struct comp_dev *dev, int cmd)
 
 	ret = comp_set_state(dev, cmd);
 	if (ret < 0)
-		return ret;
+		goto out;
 
 	switch (cmd) {
 	case COMP_TRIGGER_STOP:
 		ret = host_stop(dev);
 		break;
 	case COMP_TRIGGER_START:
-		dma_start(hd->dma, hd->chan);
+		ret = dma_start(hd->dma, hd->chan);
+		if (ret < 0) {
+			trace_host_error("TsF");
+			trace_error_value(ret);
+			goto out;
+		}
 
 		/* preload first playback period for preloader task */
 		if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
@@ -485,6 +490,7 @@ static int host_trigger(struct comp_dev *dev, int cmd)
 		break;
 	}
 
+out:
 	return ret;
 }
 
@@ -700,7 +706,12 @@ static int host_params(struct comp_dev *dev)
 		trace_host_error("eDC");
 		return -ENODEV;
 	}
-	dma_set_config(hd->dma, hd->chan, &hd->config);
+	err = dma_set_config(hd->dma, hd->chan, &hd->config);
+	if (err < 0) {
+		trace_host_error("eDc");
+		dma_channel_put(hd->dma, hd->chan);
+		return err;
+	}
 #endif
 
 	return 0;
@@ -844,6 +855,7 @@ static int host_copy(struct comp_dev *dev)
 {
 	struct host_data *hd = comp_get_drvdata(dev);
 	struct dma_sg_elem *local_elem;
+	int ret;
 
 	tracev_host("cpy");
 
@@ -888,13 +900,23 @@ static int host_copy(struct comp_dev *dev)
 	host_gw_dma_update(dev);
 
 	/* tell gateway to copy another period */
-	dma_copy(hd->dma, hd->chan, hd->period_bytes);
+	ret = dma_copy(hd->dma, hd->chan, hd->period_bytes);
+	if (ret < 0)
+		goto out;
 #else
 	/* do DMA transfer */
-	dma_set_config(hd->dma, hd->chan, &hd->config);
-	dma_start(hd->dma, hd->chan);
+	ret = dma_set_config(hd->dma, hd->chan, &hd->config);
+	if (ret < 0)
+		goto out;
+	ret = dma_start(hd->dma, hd->chan);
+	if (ret < 0)
+		goto out;
 #endif
 	return dev->frames;
+out:
+	trace_host_error("CpF");
+	trace_error_value(ret);
+	return ret;
 }
 
 struct comp_driver comp_host = {
-- 
2.14.1



More information about the Sound-open-firmware mailing list