moved buffers initialization

pull/192/head
matteo serva 2024-03-13 20:04:14 +01:00
rodzic 7c6f853dc1
commit baccfb4805
1 zmienionych plików z 34 dodań i 22 usunięć

Wyświetl plik

@ -762,17 +762,8 @@ void transfer_thread_stop(struct bcm2835_smi_dev_instance *inst)
*
***************************************************************************/
static int smi_stream_open(struct inode *inode, struct file *file)
static int smi_stream_init_buffers(struct bcm2835_smi_dev_instance *inst)
{
int dev = iminor(inode);
dev_dbg(inst->dev, "SMI device opened.");
if (dev != DEVICE_MINOR)
{
dev_err(inst->dev, "smi_stream_open: Unknown minor device: %d", dev); // error here
return -ENXIO;
}
// preinit the thread handlers to NULL
inst->reader_thread = NULL;
@ -799,6 +790,36 @@ static int smi_stream_open(struct inode *inode, struct file *file)
kfifo_init(&inst->rx_fifo, inst->rx_fifo_buffer, fifo_mtu_multiplier * DMA_BOUNCE_BUFFER_SIZE);
kfifo_init(&inst->tx_fifo, inst->tx_fifo_buffer, fifo_mtu_multiplier * DMA_BOUNCE_BUFFER_SIZE);
return 0;
}
static void smi_stream_clear_buffers(struct bcm2835_smi_dev_instance *inst)
{
if (inst->reader_thread != NULL) kthread_stop(inst->reader_thread);
if (inst->writer_thread != NULL) kthread_stop(inst->writer_thread);
if (inst->rx_fifo_buffer) vfree(inst->rx_fifo_buffer);
if (inst->tx_fifo_buffer) vfree(inst->tx_fifo_buffer);
inst->rx_fifo_buffer = NULL;
inst->tx_fifo_buffer = NULL;
inst->reader_thread = NULL;
inst->writer_thread = NULL;
}
static int smi_stream_open(struct inode *inode, struct file *file)
{
int dev = iminor(inode);
dev_dbg(inst->dev, "SMI device opened.");
if (dev != DEVICE_MINOR)
{
dev_err(inst->dev, "smi_stream_open: Unknown minor device: %d", dev); // error here
return -ENXIO;
}
smi_stream_init_buffers(inst);
// when file is being openned, stream state is still idle
set_state(smi_stream_idle);
@ -823,18 +844,9 @@ static int smi_stream_release(struct inode *inode, struct file *file)
// make sure stream is idle
set_state(smi_stream_idle);
if (inst->reader_thread != NULL) kthread_stop(inst->reader_thread);
if (inst->writer_thread != NULL) kthread_stop(inst->writer_thread);
if (inst->rx_fifo_buffer) vfree(inst->rx_fifo_buffer);
if (inst->tx_fifo_buffer) vfree(inst->tx_fifo_buffer);
inst->rx_fifo_buffer = NULL;
inst->tx_fifo_buffer = NULL;
inst->reader_thread = NULL;
inst->writer_thread = NULL;
inst->address_changed = 0;
smi_stream_clear_buffers(inst);
inst->address_changed = 0;
return 0;
}