stream start/stop bugfix

bug_fixes_integration_tx
David Michaeli 2023-02-15 15:44:05 +00:00
rodzic c4ea098d20
commit 789bc2dc8b
4 zmienionych plików z 26453 dodań i 27981 usunięć

Wyświetl plik

@ -429,11 +429,10 @@ static struct dma_async_tx_descriptor *stream_smi_dma_submit_sgl(struct bcm2835_
write_smi_reg(inst, read_smi_reg(inst, SMICS) | SMICS_ACTIVE, SMICS);
return NULL;
}
//printk(KERN_ERR DRIVER_NAME": CB\n");
desc->callback = callback;
desc->callback_param = inst;
//printk(KERN_ERR DRIVER_NAME": SUBMIT_DESC\n");
if (dmaengine_submit(desc) < 0)
{
return NULL;
@ -492,17 +491,14 @@ ssize_t stream_smi_user_dma( struct bcm2835_smi_instance *inst,
spin_unlock(&inst->transaction_lock);
return 0;
}
//printk(KERN_ERR DRIVER_NAME": ASYNC PENDING\n");
dma_async_issue_pending(inst->dma_chan);
//printk(KERN_ERR DRIVER_NAME": PROGRAMMED READ\n");
// we have only 8 bit width
if (dma_dir == DMA_DEV_TO_MEM)
{
if (smi_init_programmed_read(inst, DMA_BOUNCE_BUFFER_SIZE) != 0)
{
//dev_err(inst->dev, "smi_init_programmed_read failed");
spin_unlock(&inst->transaction_lock);
return 0;
}
@ -511,7 +507,6 @@ ssize_t stream_smi_user_dma( struct bcm2835_smi_instance *inst,
{
if (smi_init_programmed_write(inst, DMA_BOUNCE_BUFFER_SIZE) != 0)
{
//dev_err(inst->dev, "smi_init_programmed_write failed");
spin_unlock(&inst->transaction_lock);
return 0;
}
@ -585,14 +580,29 @@ int reader_thread_stream_function(void *pv)
// timeout. This means that we didn't get enough data into the buffer during this period. we shall
// "continue" and try again
start = ktime_get();
if (down_timeout(&bounce->callback_sem, msecs_to_jiffies(1000)))
{
dev_info(inst->dev, "DMA bounce timed out");
spin_lock(&inst->smi_inst->transaction_lock);
dmaengine_terminate_sync(inst->smi_inst->dma_chan);
spin_unlock(&inst->smi_inst->transaction_lock);
continue;
}
while (1)
{
// wait for completion, but if not complete (timeout) - nevermind,
// try to wait more, unless someone tells us to stop
if (down_timeout(&bounce->callback_sem, msecs_to_jiffies(1000)))
{
dev_info(inst->dev, "DMA bounce timed out");
}
else
{
break;
}
// after each timeout check if we are still entitled to keep trying
// if not, shut down the DMA transaction and continue empty loop
if (inst->state != smi_stream_rx_channel_0 && inst->state != smi_stream_rx_channel_1)
{
spin_lock(&inst->smi_inst->transaction_lock);
dmaengine_terminate_sync(inst->smi_inst->dma_chan);
spin_unlock(&inst->smi_inst->transaction_lock);
break;
}
}
t3 = ktime_to_ns(ktime_sub(ktime_get(), start));
//--------------------------------------------------------

Wyświetl plik

@ -27,7 +27,7 @@ void cariboulite_radio_init(cariboulite_radio_state_st* radio, sys_st *sys, cari
memset (radio, 0, sizeof(cariboulite_radio_state_st));
radio->sys = sys;
radio->active = true;
radio->active = false;
radio->channel_direction = cariboulite_channel_dir_rx;
radio->type = type;
radio->cw_output = false;
@ -43,7 +43,7 @@ void cariboulite_radio_init(cariboulite_radio_state_st* radio, sys_st *sys, cari
//=========================================================================
int cariboulite_radio_dispose(cariboulite_radio_state_st* radio)
{
radio->active = false;
cariboulite_radio_activate_channel(radio, cariboulite_channel_dir_rx, false);
at86rf215_radio_set_state( &radio->sys->modem,
GET_MODEM_CH(radio->type),
@ -772,9 +772,6 @@ int cariboulite_radio_set_frequency(cariboulite_radio_state_st* radio,
radio->requested_rf_frequency = f_rf;
radio->rf_frequency_error = radio->actual_rf_frequency - radio->requested_rf_frequency;
if (freq) *freq = act_freq;
// activate the channel according to the new configuration
//cariboulite_radio_activate_channel(radio, 1);
}
if (error >= 0)
@ -782,8 +779,9 @@ int cariboulite_radio_set_frequency(cariboulite_radio_state_st* radio,
ZF_LOGD("Frequency setting CH: %d, Wanted: %.2f Hz, Set: %.2f Hz (MOD: %.2f, MIX: %.2f)",
radio->type, f_rf, act_freq, modem_act_freq, lo_act_freq);
}
return -error;
// reactivate the channel if it was active before the frequency change request was issued
return cariboulite_radio_activate_channel(radio, radio->channel_direction, radio->active);
}
//=========================================================================
@ -801,21 +799,20 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
bool activate)
{
radio->channel_direction = dir;
radio->active = activate;
ZF_LOGD("Activating channel %d, dir = %s, activate = %d", radio->type, radio->channel_direction==cariboulite_channel_dir_rx?"RX":"TX", activate);
// Deactivation first
if (activate == false)
{
int ret = 0;
caribou_fpga_set_smi_channel (&radio->sys->fpga, (radio->type == cariboulite_channel_s1g) ? caribou_fpga_smi_channel_0 : caribou_fpga_smi_channel_1);
caribou_fpga_set_io_ctrl_dig (&radio->sys->fpga, (radio->type == cariboulite_channel_s1g) ? 0 : 1, 0);
// if we deactivate, first shut off the smi stream
if (caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_stream_idle) != 0)
{
return -1;
}
usleep(100000);
ret = caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_stream_idle);
usleep(30000);
// then deactivate the modem's stream
at86rf215_radio_set_state( &radio->sys->modem,
@ -825,7 +822,7 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
//caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_stream_idle);
ZF_LOGD("Setup Modem state trx_off");
return 0;
return ret;
}
@ -851,7 +848,7 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
at86rf215_radio_state_cmd_rx);
radio->state = at86rf215_radio_state_cmd_rx;
ZF_LOGD("Setup Modem state cmd_rx");
usleep(100000);
usleep(30000);
// after modem is activated turn on the the smi stream
smi_stream_state_en smi_state = smi_stream_idle;
@ -861,7 +858,7 @@ int cariboulite_radio_activate_channel(cariboulite_radio_state_st* radio,
smi_state = smi_stream_rx_channel_1;
caribou_fpga_set_smi_channel (&radio->sys->fpga, radio->type == cariboulite_channel_s1g? caribou_fpga_smi_channel_0 : caribou_fpga_smi_channel_1);
caribou_fpga_set_io_ctrl_dig (&radio->sys->fpga, radio->type == cariboulite_channel_s1g?0:1, 0);
caribou_fpga_set_io_ctrl_dig (&radio->sys->fpga, radio->type == cariboulite_channel_s1g? 0 : 1, 0);
// apply the state
if (caribou_smi_set_driver_streaming_state(&radio->sys->smi, smi_state) != 0)

Plik binarny nie jest wyświetlany.