forked from Imagelibrary/rtems
leon, grspw_pkt: fixed error return path in dma_open
This commit is contained in:
@@ -1651,24 +1651,28 @@ void *grspw_dma_open(void *d, int chan_no)
|
|||||||
dma->cfg.tx_irq_en_cnt = 0;
|
dma->cfg.tx_irq_en_cnt = 0;
|
||||||
dma->cfg.flags = DMAFLAG_NO_SPILL;
|
dma->cfg.flags = DMAFLAG_NO_SPILL;
|
||||||
|
|
||||||
|
/* set to NULL so that error exit works correctly */
|
||||||
|
dma->sem_dma = RTEMS_ID_NONE;
|
||||||
|
dma->rx_wait.sem_wait = RTEMS_ID_NONE;
|
||||||
|
dma->tx_wait.sem_wait = RTEMS_ID_NONE;
|
||||||
|
dma->rx_ring_base = NULL;
|
||||||
|
|
||||||
/* DMA Channel Semaphore created with count = 1 */
|
/* DMA Channel Semaphore created with count = 1 */
|
||||||
if (rtems_semaphore_create(
|
if (rtems_semaphore_create(
|
||||||
rtems_build_name('S', 'D', '0' + priv->index, '0' + chan_no), 1,
|
rtems_build_name('S', 'D', '0' + priv->index, '0' + chan_no), 1,
|
||||||
RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE | \
|
RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE | \
|
||||||
RTEMS_NO_INHERIT_PRIORITY | RTEMS_LOCAL | \
|
RTEMS_NO_INHERIT_PRIORITY | RTEMS_LOCAL | \
|
||||||
RTEMS_NO_PRIORITY_CEILING, 0, &dma->sem_dma) != RTEMS_SUCCESSFUL) {
|
RTEMS_NO_PRIORITY_CEILING, 0, &dma->sem_dma) != RTEMS_SUCCESSFUL) {
|
||||||
dma = NULL;
|
dma->sem_dma = RTEMS_ID_NONE;
|
||||||
goto out;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate memory for the two descriptor rings */
|
/* Allocate memory for the two descriptor rings */
|
||||||
size = sizeof(struct grspw_ring) * (GRSPW_RXBD_NR + GRSPW_TXBD_NR);
|
size = sizeof(struct grspw_ring) * (GRSPW_RXBD_NR + GRSPW_TXBD_NR);
|
||||||
dma->rx_ring_base = (struct grspw_rxring *)malloc(size);
|
dma->rx_ring_base = (struct grspw_rxring *)malloc(size);
|
||||||
dma->tx_ring_base = (struct grspw_txring *)&dma->rx_ring_base[GRSPW_RXBD_NR];
|
dma->tx_ring_base = (struct grspw_txring *)&dma->rx_ring_base[GRSPW_RXBD_NR];
|
||||||
if (dma->rx_ring_base == NULL) {
|
if (dma->rx_ring_base == NULL)
|
||||||
dma = NULL;
|
goto err;
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create DMA RX and TX Channel sempahore with count = 0 */
|
/* Create DMA RX and TX Channel sempahore with count = 0 */
|
||||||
if (rtems_semaphore_create(
|
if (rtems_semaphore_create(
|
||||||
@@ -1676,16 +1680,16 @@ void *grspw_dma_open(void *d, int chan_no)
|
|||||||
RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE | \
|
RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE | \
|
||||||
RTEMS_NO_INHERIT_PRIORITY | RTEMS_LOCAL | \
|
RTEMS_NO_INHERIT_PRIORITY | RTEMS_LOCAL | \
|
||||||
RTEMS_NO_PRIORITY_CEILING, 0, &dma->rx_wait.sem_wait) != RTEMS_SUCCESSFUL) {
|
RTEMS_NO_PRIORITY_CEILING, 0, &dma->rx_wait.sem_wait) != RTEMS_SUCCESSFUL) {
|
||||||
dma = NULL;
|
dma->rx_wait.sem_wait = RTEMS_ID_NONE;
|
||||||
goto out;
|
goto err;
|
||||||
}
|
}
|
||||||
if (rtems_semaphore_create(
|
if (rtems_semaphore_create(
|
||||||
rtems_build_name('S', 'T', '0' + priv->index, '0' + chan_no), 0,
|
rtems_build_name('S', 'T', '0' + priv->index, '0' + chan_no), 0,
|
||||||
RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE | \
|
RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE | \
|
||||||
RTEMS_NO_INHERIT_PRIORITY | RTEMS_LOCAL | \
|
RTEMS_NO_INHERIT_PRIORITY | RTEMS_LOCAL | \
|
||||||
RTEMS_NO_PRIORITY_CEILING, 0, &dma->tx_wait.sem_wait) != RTEMS_SUCCESSFUL) {
|
RTEMS_NO_PRIORITY_CEILING, 0, &dma->tx_wait.sem_wait) != RTEMS_SUCCESSFUL) {
|
||||||
dma = NULL;
|
dma->tx_wait.sem_wait = RTEMS_ID_NONE;
|
||||||
goto out;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset software structures */
|
/* Reset software structures */
|
||||||
@@ -1698,6 +1702,19 @@ out:
|
|||||||
rtems_semaphore_release(grspw_sem);
|
rtems_semaphore_release(grspw_sem);
|
||||||
|
|
||||||
return dma;
|
return dma;
|
||||||
|
|
||||||
|
/* initialization error happended */
|
||||||
|
err:
|
||||||
|
if (dma->sem_dma != RTEMS_ID_NONE)
|
||||||
|
rtems_semaphore_delete(dma->sem_dma);
|
||||||
|
if (dma->rx_wait.sem_wait != RTEMS_ID_NONE)
|
||||||
|
rtems_semaphore_delete(dma->rx_wait.sem_wait);
|
||||||
|
if (dma->tx_wait.sem_wait != RTEMS_ID_NONE)
|
||||||
|
rtems_semaphore_delete(dma->tx_wait.sem_wait);
|
||||||
|
if (dma->rx_ring_base)
|
||||||
|
free(dma->rx_ring_base);
|
||||||
|
dma = NULL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize Software Structures:
|
/* Initialize Software Structures:
|
||||||
@@ -1751,7 +1768,9 @@ void grspw_dma_close(void *c)
|
|||||||
/* Free resources */
|
/* Free resources */
|
||||||
rtems_semaphore_delete(dma->rx_wait.sem_wait);
|
rtems_semaphore_delete(dma->rx_wait.sem_wait);
|
||||||
rtems_semaphore_delete(dma->tx_wait.sem_wait);
|
rtems_semaphore_delete(dma->tx_wait.sem_wait);
|
||||||
rtems_semaphore_delete(dma->sem_dma); /* Release and delete lock */
|
/* Release and delete lock. Operations requiring lock will fail */
|
||||||
|
rtems_semaphore_delete(dma->sem_dma);
|
||||||
|
dma->sem_dma = RTEMS_ID_NONE;
|
||||||
|
|
||||||
/* Free memory */
|
/* Free memory */
|
||||||
if (dma->rx_ring_base)
|
if (dma->rx_ring_base)
|
||||||
@@ -2941,7 +2960,7 @@ static int grspw_common_init(void)
|
|||||||
if (rtems_task_start(grspw_work_task, grspw_work_func, 0) !=
|
if (rtems_task_start(grspw_work_task, grspw_work_func, 0) !=
|
||||||
RTEMS_SUCCESSFUL)
|
RTEMS_SUCCESSFUL)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
grspw_initialized = 1;
|
grspw_initialized = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user