From: Tom Knot Date: Tue, 26 Jun 2018 12:14:55 +0000 (+0200) Subject: - Cleaned up one static declaration and removed a few superfluous data structures X-Git-Url: http://git.graph-it.com/?a=commitdiff_plain;h=b66c615ac6aca9d994d9f972eca7c040bbed87fe;p=graphit%2Funipi-kernel.git - Cleaned up one static declaration and removed a few superfluous data structures - Reduced TX work limit to 4 --- diff --git a/modules/unipi/src/unipi_common.h b/modules/unipi/src/unipi_common.h index 2ee40c7..1b2137c 100644 --- a/modules/unipi/src/unipi_common.h +++ b/modules/unipi/src/unipi_common.h @@ -120,7 +120,8 @@ struct neuronspi_port struct kthread_work tx_work; struct kthread_work rx_work; struct kthread_work irq_work; - struct spinlock tx_lock; + struct spinlock tx_counter_lock; + struct mutex tx_lock; u8 tx_work_count; u32 flags; u8 ier_clear; @@ -237,33 +238,13 @@ struct neuronspi_sec_ao_driver u16 dev_count; }; -struct neuronspi_stm_ai_data +struct neuronspi_analog_data { u32 index; u32 mode; struct spi_device *parent; }; -struct neuronspi_stm_ao_data -{ - u32 index; - u32 mode; - struct spi_device *parent; -}; - -struct neuronspi_sec_ai_data -{ - u32 index; - u32 mode; - struct spi_device *parent; -}; - -struct neuronspi_sec_ao_data -{ - u32 index; - u32 mode; - struct spi_device *parent; -}; // Instantiated once per LED struct neuronspi_led_driver diff --git a/modules/unipi/src/unipi_iio.c b/modules/unipi/src/unipi_iio.c index ab7a31c..d82a729 100644 --- a/modules/unipi/src/unipi_iio.c +++ b/modules/unipi/src/unipi_iio.c @@ -24,10 +24,10 @@ ************************/ int neuronspi_iio_stm_ai_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); - regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ai_mode_reg, &ai_data->mode); + regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ai_mode_reg + ai_data->index, &ai_data->mode); switch(ai_data->mode) { case 0: { if (ch->type == IIO_VOLTAGE) { @@ -56,10 +56,10 @@ int neuronspi_iio_stm_ai_read_raw(struct iio_dev *indio_dev, struct iio_chan_spe int neuronspi_iio_stm_ao_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); - regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg, &ao_data->mode); + regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg + ao_data->index, &ao_data->mode); switch(ao_data->mode) { case 3: { if (ch->type == IIO_RESISTANCE) { @@ -79,10 +79,10 @@ int neuronspi_iio_stm_ao_read_raw(struct iio_dev *indio_dev, struct iio_chan_spe int neuronspi_iio_stm_ao_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int val, int val2, long mask) { - struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); - regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg, &ao_data->mode); + regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg + ao_data->index, &ao_data->mode); switch(ao_data->mode) { case 0: { if (ch->type == IIO_VOLTAGE) { @@ -111,7 +111,7 @@ int neuronspi_iio_stm_ao_write_raw(struct iio_dev *indio_dev, struct iio_chan_sp int neuronspi_iio_sec_ai_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); regmap_read(n_spi->reg_map, n_spi->regstart_table->sec_ai_mode_reg + ai_data->index, &ai_data->mode); diff --git a/modules/unipi/src/unipi_spi.c b/modules/unipi/src/unipi_spi.c index 00ac149..8812f3a 100644 --- a/modules/unipi/src/unipi_spi.c +++ b/modules/unipi/src/unipi_spi.c @@ -71,6 +71,8 @@ spinlock_t neuronspi_probe_spinlock; struct spi_device* neuronspi_s_dev[NEURONSPI_MAX_DEVS]; struct task_struct *neuronspi_invalidate_thread; +struct sched_param neuronspi_sched_param = { .sched_priority = MAX_RT_PRIO / 2 }; + /************************ * Non-static Functions * ************************/ @@ -448,7 +450,7 @@ u8 neuronspi_spi_uart_get_ldisc(struct spi_device* spi_dev, u8 port) */ void neuronspi_spi_iio_sec_ai_read_voltage(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 sec_ai_val_l = 0; @@ -472,7 +474,7 @@ void neuronspi_spi_iio_sec_ai_read_voltage(struct iio_dev *indio_dev, struct iio void neuronspi_spi_iio_sec_ai_read_current(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 sec_ai_val_l = 0; @@ -495,7 +497,7 @@ void neuronspi_spi_iio_sec_ai_read_current(struct iio_dev *indio_dev, struct iio void neuronspi_spi_iio_sec_ai_read_resistance(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 sec_ai_val_l = 0; @@ -517,7 +519,7 @@ void neuronspi_spi_iio_sec_ai_read_resistance(struct iio_dev *indio_dev, struct void neuronspi_spi_iio_sec_ao_set_voltage(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { - struct neuronspi_sec_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 sec_true_val = (val * 2) / 5; @@ -531,7 +533,7 @@ void neuronspi_spi_iio_sec_ao_set_voltage(struct iio_dev *indio_dev, struct iio_ */ void neuronspi_spi_iio_stm_ai_read_voltage(struct iio_dev *iio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_stm_ai_data *ai_data = iio_priv(iio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(iio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 stm_ai_val = 0; @@ -559,7 +561,7 @@ void neuronspi_spi_iio_stm_ai_read_voltage(struct iio_dev *iio_dev, struct iio_c void neuronspi_spi_iio_stm_ai_read_current(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 stm_ai_val = 0; @@ -587,7 +589,7 @@ void neuronspi_spi_iio_stm_ai_read_current(struct iio_dev *indio_dev, struct iio void neuronspi_spi_iio_stm_ao_read_resistance(struct iio_dev *indio_dev, struct iio_chan_spec const *ch, int *val, int *val2, long mask) { - struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 stm_aio_val = 0; @@ -598,7 +600,7 @@ void neuronspi_spi_iio_stm_ao_read_resistance(struct iio_dev *indio_dev, struct void neuronspi_spi_iio_stm_ao_set_voltage(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { - struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 stm_v_int_ref = 0; @@ -624,7 +626,7 @@ void neuronspi_spi_iio_stm_ao_set_voltage(struct iio_dev *indio_dev, struct iio_ void neuronspi_spi_iio_stm_ao_set_current(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { - struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); u32 stm_v_int_ref = 0; @@ -648,27 +650,6 @@ void neuronspi_spi_iio_stm_ao_set_current(struct iio_dev *indio_dev, struct iio_ regmap_write(n_spi->reg_map, n_spi->regstart_table->stm_ao_val_reg, (unsigned int)stm_true_val); } -/* -static s32 neuronspi_spi_watchdog(void *data) -{ - s32 *cycle = (s32 *) data; - while (!kthread_should_stop()) { - msleep(*cycle); - spin_lock(neuronspi_spi_w_spinlock); - if (neuronspi_spi_w_flag == 0) { - panic_timeout = -1; - panic("SPI Watchdog Failure\n"); - } else { - neuronspi_spi_w_flag = 0; - } - spin_unlock(neuronspi_spi_w_spinlock); - } - return 0; -} -*/ - - - int neuronspi_spi_send_message(struct spi_device* spi_dev, u8 *send_buf, u8 *recv_buf, s32 len, s32 freq, s32 delay, s32 send_header, u8 lock_val) { s32 i = 0; @@ -917,7 +898,6 @@ int neuronspi_spi_gpio_ro_set(struct spi_device* spi_dev, u32 id, int value) s32 neuronspi_spi_probe(struct spi_device *spi) { const struct neuronspi_devtype *devtype; - struct sched_param sched_param = { .sched_priority = MAX_RT_PRIO / 2 }; struct neuronspi_driver_data *n_spi; s32 ret, i, no_irq = 0; u8 uart_count = 0; @@ -979,7 +959,7 @@ s32 neuronspi_spi_probe(struct spi_device *spi) ret = PTR_ERR(n_spi->primary_worker_task); return ret; } - sched_setscheduler(n_spi->primary_worker_task, SCHED_FIFO, &sched_param); + sched_setscheduler(n_spi->primary_worker_task, SCHED_FIFO, &neuronspi_sched_param); // We perform an initial probe of registers 1000-1004 to identify the device, using a premade message @@ -1267,9 +1247,9 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n", } #endif if (n_spi->features->stm_ai_count) { - n_spi->stm_ai_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_stm_ai_data)); - ((struct neuronspi_stm_ai_data*)iio_priv(n_spi->stm_ai_driver))->parent = spi; - ((struct neuronspi_stm_ai_data*)iio_priv(n_spi->stm_ai_driver))->index = i; + n_spi->stm_ai_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data)); + ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ai_driver))->parent = spi; + ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ai_driver))->index = i; n_spi->stm_ai_driver->modes = INDIO_DIRECT_MODE; n_spi->stm_ai_driver->currentmode = INDIO_DIRECT_MODE; n_spi->stm_ai_driver->name = "ai_type_a"; @@ -1281,9 +1261,9 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n", iio_device_register(n_spi->stm_ai_driver); } if (n_spi->features->stm_ao_count) { - n_spi->stm_ao_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_stm_ai_data)); - ((struct neuronspi_stm_ao_data*)iio_priv(n_spi->stm_ao_driver))->parent = spi; - ((struct neuronspi_stm_ao_data*)iio_priv(n_spi->stm_ao_driver))->index = i; + n_spi->stm_ao_driver = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data)); + ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ao_driver))->parent = spi; + ((struct neuronspi_analog_data*)iio_priv(n_spi->stm_ao_driver))->index = i; n_spi->stm_ao_driver->modes = INDIO_DIRECT_MODE; n_spi->stm_ao_driver->currentmode = INDIO_DIRECT_MODE; n_spi->stm_ao_driver->name = "ao_type_a"; @@ -1295,11 +1275,11 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n", iio_device_register(n_spi->stm_ao_driver); } if (n_spi->features->sec_ai_count) { - n_spi->sec_ai_driver = kzalloc(sizeof(struct neuronspi_sec_ai_data*) * n_spi->features->sec_ai_count, GFP_ATOMIC); + n_spi->sec_ai_driver = kzalloc(sizeof(struct neuronspi_analog_data*) * n_spi->features->sec_ai_count, GFP_ATOMIC); for (i = 0; i < n_spi->features->sec_ai_count; i++) { - n_spi->sec_ai_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_sec_ai_data)); - ((struct neuronspi_sec_ai_data*)iio_priv(n_spi->sec_ai_driver[i]))->parent = spi; - ((struct neuronspi_sec_ai_data*)iio_priv(n_spi->sec_ai_driver[i]))->index = i; + n_spi->sec_ai_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data)); + ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ai_driver[i]))->parent = spi; + ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ai_driver[i]))->index = i; n_spi->sec_ai_driver[i]->modes = INDIO_DIRECT_MODE; n_spi->sec_ai_driver[i]->currentmode = INDIO_DIRECT_MODE; n_spi->sec_ai_driver[i]->name = "ai_type_b"; @@ -1312,11 +1292,11 @@ reg1001: %x, reg1002: %x, reg1003: %x, reg1004: %x\n", } } if (n_spi->features->sec_ao_count) { - n_spi->sec_ao_driver = kzalloc(sizeof(struct neuronspi_sec_ao_data*) * n_spi->features->sec_ao_count, GFP_ATOMIC); + n_spi->sec_ao_driver = kzalloc(sizeof(struct neuronspi_analog_data*) * n_spi->features->sec_ao_count, GFP_ATOMIC); for (i = 0; i < n_spi->features->sec_ao_count; i++) { - n_spi->sec_ao_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_sec_ao_data)); - ((struct neuronspi_sec_ao_data*)iio_priv(n_spi->sec_ao_driver[i]))->parent = spi; - ((struct neuronspi_sec_ao_data*)iio_priv(n_spi->sec_ao_driver[i]))->index = i; + n_spi->sec_ao_driver[i] = devm_iio_device_alloc(&(spi->dev), sizeof(struct neuronspi_analog_data)); + ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ao_driver[i]))->parent = spi; + ((struct neuronspi_analog_data*)iio_priv(n_spi->sec_ao_driver[i]))->index = i; n_spi->sec_ao_driver[i]->modes = INDIO_DIRECT_MODE; n_spi->sec_ao_driver[i]->currentmode = INDIO_DIRECT_MODE; n_spi->sec_ao_driver[i]->name = "ao_type_b"; diff --git a/modules/unipi/src/unipi_sysfs.c b/modules/unipi/src/unipi_sysfs.c index e94e5c2..fe2fcb9 100644 --- a/modules/unipi/src/unipi_sysfs.c +++ b/modules/unipi/src/unipi_sysfs.c @@ -996,7 +996,7 @@ static ssize_t neuronspi_iio_show_primary_ai_mode(struct device *dev, struct dev int ret = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ai_mode_reg + ai_data->index, &val); @@ -1009,7 +1009,7 @@ static ssize_t neuronspi_iio_store_primary_ai_mode(struct device *dev, struct de ssize_t err = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_stm_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); err = kstrtouint(buf, 0, &val); @@ -1026,7 +1026,7 @@ static ssize_t neuronspi_iio_show_primary_ao_mode(struct device *dev, struct dev int ret = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); regmap_read(n_spi->reg_map, n_spi->regstart_table->stm_ao_mode_reg + ao_data->index, &val); @@ -1039,7 +1039,7 @@ static ssize_t neuronspi_iio_store_primary_ao_mode(struct device *dev, struct de ssize_t err = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_stm_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); err = kstrtouint(buf, 0, &val); @@ -1056,7 +1056,7 @@ static ssize_t neuronspi_iio_show_secondary_ai_mode(struct device *dev, struct d int ret = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); regmap_read(n_spi->reg_map, n_spi->regstart_table->sec_ai_mode_reg + ai_data->index, &val); @@ -1068,7 +1068,7 @@ static ssize_t neuronspi_iio_store_secondary_ai_mode(struct device *dev, struct ssize_t err = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_sec_ai_data *ai_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ai_data = iio_priv(indio_dev); struct spi_device *spi = ai_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); err = kstrtouint(buf, 0, &val); @@ -1084,7 +1084,7 @@ static ssize_t neuronspi_iio_show_secondary_ao_mode(struct device *dev, struct d int ret = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_sec_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); regmap_read(n_spi->reg_map, n_spi->regstart_table->sec_ao_mode_reg + ao_data->index, &val); @@ -1096,7 +1096,7 @@ static ssize_t neuronspi_iio_store_secondary_ao_mode(struct device *dev, struct ssize_t err = 0; unsigned int val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct neuronspi_sec_ao_data *ao_data = iio_priv(indio_dev); + struct neuronspi_analog_data *ao_data = iio_priv(indio_dev); struct spi_device *spi = ao_data->parent; struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi); err = kstrtouint(buf, 0, &val); diff --git a/modules/unipi/src/unipi_tty.c b/modules/unipi/src/unipi_tty.c index 222ae77..6b23826 100644 --- a/modules/unipi/src/unipi_tty.c +++ b/modules/unipi/src/unipi_tty.c @@ -20,11 +20,11 @@ #include #include +static struct tty_ldisc_ops neuronspi_tty_ldisc; int neuronspi_tty_init() { int err; - static struct tty_ldisc_ops neuronspi_tty_ldisc; printk(KERN_INFO "NEURONSPI TTYInit\n"); memset(&neuronspi_tty_ldisc, 0, sizeof(neuronspi_tty_ldisc)); n_tty_inherit_ops(&neuronspi_tty_ldisc); diff --git a/modules/unipi/src/unipi_uart.c b/modules/unipi/src/unipi_uart.c index 287a659..a316a2e 100644 --- a/modules/unipi/src/unipi_uart.c +++ b/modules/unipi/src/unipi_uart.c @@ -27,6 +27,8 @@ struct neuronspi_uart_data* neuronspi_uart_glob_data; unsigned long neuronspi_lines; struct uart_driver* neuronspi_uart; +struct sched_param neuronspi_sched_param = { .sched_priority = MAX_RT_PRIO / 2 }; + /************************ * Non-static Functions * ************************/ @@ -77,7 +79,6 @@ void neuronspi_uart_tx_proc(struct kthread_work *ws) (port->port.rs485.delay_rts_before_send > 0)) { msleep(port->port.rs485.delay_rts_before_send); } - spin_lock(&port->port.lock); neuronspi_uart_handle_tx(port); } @@ -288,7 +289,7 @@ void neuronspi_uart_handle_rx(struct neuronspi_port *port, u32 rxlen, u32 iir) void neuronspi_uart_handle_tx(struct neuronspi_port *port) { - u32 max_txlen, to_send, i; + u32 max_txlen, to_send, to_send_packet, i; struct spi_device *spi; struct neuronspi_driver_data *d_data; struct circ_buf *xmit; @@ -304,7 +305,6 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port) spin_lock(&port->tx_lock); port->tx_work_count--; spin_unlock(&port->tx_lock); - spin_unlock(&port->port.lock); return; } @@ -312,7 +312,6 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port) spin_lock(&port->tx_lock); port->tx_work_count--; spin_unlock(&port->tx_lock); - spin_unlock(&port->port.lock); return; } @@ -323,18 +322,19 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port) /* Limit to size of (TX FIFO / 2) */ max_txlen = NEURONSPI_FIFO_SIZE >> 1; while (to_send > max_txlen) { - to_send = (to_send > max_txlen) ? max_txlen : to_send; + to_send_packet = (to_send > max_txlen) ? max_txlen : to_send; /* Add data to send */ - port->port.icount.tx += to_send; + port->port.icount.tx += to_send_packet; /* Convert to linear buffer */ - for (i = 0; i < to_send; ++i) { + for (i = 0; i < to_send_packet; ++i) { port->buf[i] = xmit->buf[xmit->tail]; xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); } - printk(KERN_INFO "NEURONSPI UART_HANDLE_TX, to_send:%d, tx_work_count:%d\n", to_send, port->tx_work_count); - neuronspi_uart_fifo_write(port, to_send); + printk(KERN_INFO "NEURONSPI UART_HANDLE_TX, to_send:%d, tx_work_count:%d\n", to_send_packet, port->tx_work_count); + neuronspi_uart_fifo_write(port, to_send_packet); + to_send -= to_send_packet; } to_send = (to_send > NEURONSPI_FIFO_SIZE - NEURONSPI_FIFO_MIN_CONTINUOUS) ? NEURONSPI_FIFO_SIZE - NEURONSPI_FIFO_MIN_CONTINUOUS : to_send; @@ -357,8 +357,6 @@ void neuronspi_uart_handle_tx(struct neuronspi_port *port) if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) { uart_write_wakeup(&port->port); } - - spin_unlock(&port->port.lock); } void neuronspi_uart_handle_irq(struct neuronspi_uart_data *uart_data, u32 portno) @@ -405,7 +403,7 @@ void neuronspi_uart_pm(struct uart_port *port, u32 state, u32 oldstate) s32 neuronspi_uart_probe(struct spi_device* dev, u8 device_index) { struct neuronspi_driver_data* driver_data = spi_get_drvdata(dev); - struct sched_param sched_param = { .sched_priority = MAX_RT_PRIO / 2 }; + s32 i, j, ret, new_uart_count; struct neuronspi_uart_data *uart_data = driver_data->uart_data; @@ -436,7 +434,7 @@ s32 neuronspi_uart_probe(struct spi_device* dev, u8 device_index) uart_data->p[i].port.rs485_config = neuronspi_uart_config_rs485; uart_data->p[i].port.ops = &neuronspi_uart_ops; uart_data->p[i].port.line = neuronspi_uart_alloc_line(); - spin_lock_init(&uart_data->p[i].tx_lock); + spin_lock_init(&uart_data->p[i].tx_counter_lock); spin_lock_init(&uart_data->p[i].port.lock); if (uart_data->p[i].port.line >= NEURONSPI_MAX_DEVS) { ret = -ENOMEM; @@ -500,7 +498,7 @@ s32 neuronspi_uart_probe(struct spi_device* dev, u8 device_index) if (IS_ERR(uart_data->kworker_task)) { ret = PTR_ERR(uart_data->kworker_task); } - sched_setscheduler(uart_data->kworker_task, SCHED_FIFO, &sched_param); + sched_setscheduler(uart_data->kworker_task, SCHED_FIFO, &neuronspi_sched_param); } return ret; } diff --git a/modules/unipi/src/unipi_uart.h b/modules/unipi/src/unipi_uart.h index db0ac06..5e5f1ac 100644 --- a/modules/unipi/src/unipi_uart.h +++ b/modules/unipi/src/unipi_uart.h @@ -30,7 +30,7 @@ #define NEURONSPI_UART_LDISC_REGISTER 503 #define NEURONSPI_UART_TIMEOUT_REGISTER 504 -#define NEURONSPI_MAX_TX_WORK 16 +#define NEURONSPI_MAX_TX_WORK 4 /************************* * Function Declarations * diff --git a/version.txt b/version.txt index d4b7292..b624a65 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -Repository:neuron-kernel ActiveBranch:[uart_timeout] PrecedingRelease:v.0.12 PrecedingRevision:56(8a63b19) LatestCommit:Mon Jun 25 21:06:19 CEST 2018 +Repository:neuron-kernel ActiveBranch:[uart_timeout] PrecedingRelease:v.0.12 PrecedingRevision:57(b6cfcc0) LatestCommit:Tue Jun 26 14:14:56 CEST 2018