speakup: Make dectlk flush timeout configurable

In case the serial port or cable got faulty, we may not be getting
acknowledgements any more. The driver then currently waits for 4s to
avoid jamming the device. This makes this delay configurable.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Link: https://lore.kernel.org/r/20210128180116.1848120-3-samuel.thibault@ens-lyon.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Samuel Thibault 2021-01-28 19:01:16 +01:00 committed by Greg Kroah-Hartman
parent 49f259eff8
commit 1f7c14afd4
5 changed files with 23 additions and 2 deletions

View File

@ -312,6 +312,13 @@ Contact: speakup@linux-speakup.org
Description: Gets or sets the frequency of the speech synthesizer. Range is Description: Gets or sets the frequency of the speech synthesizer. Range is
0-9. 0-9.
What: /sys/accessibility/speakup/<synth-name>/flush_time
KernelVersion: 5.12
Contact: speakup@linux-speakup.org
Description: Gets or sets the timeout to wait for the synthesizer flush to
complete. This can be used when the cable gets faulty and flush
notifications are getting lost.
What: /sys/accessibility/speakup/<synth-name>/full_time What: /sys/accessibility/speakup/<synth-name>/full_time
KernelVersion: 2.6 KernelVersion: 2.6
Contact: speakup@linux-speakup.org Contact: speakup@linux-speakup.org

View File

@ -78,6 +78,8 @@ static struct kobj_attribute direct_attribute =
__ATTR(direct, 0644, spk_var_show, spk_var_store); __ATTR(direct, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute full_time_attribute = static struct kobj_attribute full_time_attribute =
__ATTR(full_time, 0644, spk_var_show, spk_var_store); __ATTR(full_time, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute flush_time_attribute =
__ATTR(flush_time, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute jiffy_delta_attribute = static struct kobj_attribute jiffy_delta_attribute =
__ATTR(jiffy_delta, 0644, spk_var_show, spk_var_store); __ATTR(jiffy_delta, 0644, spk_var_show, spk_var_store);
static struct kobj_attribute trigger_time_attribute = static struct kobj_attribute trigger_time_attribute =
@ -99,6 +101,7 @@ static struct attribute *synth_attrs[] = {
&delay_time_attribute.attr, &delay_time_attribute.attr,
&direct_attribute.attr, &direct_attribute.attr,
&full_time_attribute.attr, &full_time_attribute.attr,
&flush_time_attribute.attr,
&jiffy_delta_attribute.attr, &jiffy_delta_attribute.attr,
&trigger_time_attribute.attr, &trigger_time_attribute.attr,
NULL, /* need to NULL terminate the list of attributes */ NULL, /* need to NULL terminate the list of attributes */
@ -118,6 +121,7 @@ static struct spk_synth synth_dectlk = {
.trigger = 50, .trigger = 50,
.jiffies = 50, .jiffies = 50,
.full = 40000, .full = 40000,
.flush_time = 4000,
.dev_name = SYNTH_DEFAULT_DEV, .dev_name = SYNTH_DEFAULT_DEV,
.startup = SYNTH_START, .startup = SYNTH_START,
.checkval = SYNTH_CHECK, .checkval = SYNTH_CHECK,
@ -200,18 +204,23 @@ static void do_catch_up(struct spk_synth *synth)
static u_char last = '\0'; static u_char last = '\0';
unsigned long flags; unsigned long flags;
unsigned long jiff_max; unsigned long jiff_max;
unsigned long timeout = msecs_to_jiffies(4000); unsigned long timeout;
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
struct var_t *jiffy_delta; struct var_t *jiffy_delta;
struct var_t *delay_time; struct var_t *delay_time;
struct var_t *flush_time;
int jiffy_delta_val; int jiffy_delta_val;
int delay_time_val; int delay_time_val;
int timeout_val;
jiffy_delta = spk_get_var(JIFFY); jiffy_delta = spk_get_var(JIFFY);
delay_time = spk_get_var(DELAY); delay_time = spk_get_var(DELAY);
flush_time = spk_get_var(FLUSH);
spin_lock_irqsave(&speakup_info.spinlock, flags); spin_lock_irqsave(&speakup_info.spinlock, flags);
jiffy_delta_val = jiffy_delta->u.n.value; jiffy_delta_val = jiffy_delta->u.n.value;
timeout_val = flush_time->u.n.value;
spin_unlock_irqrestore(&speakup_info.spinlock, flags); spin_unlock_irqrestore(&speakup_info.spinlock, flags);
timeout = msecs_to_jiffies(timeout_val);
jiff_max = jiffies + jiffy_delta_val; jiff_max = jiffies + jiffy_delta_val;
while (!kthread_should_stop()) { while (!kthread_should_stop()) {

View File

@ -48,7 +48,7 @@ enum var_id_t {
ATTRIB_BLEEP, BLEEPS, ATTRIB_BLEEP, BLEEPS,
RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG,
DIRECT, PAUSE, DIRECT, PAUSE,
CAPS_START, CAPS_STOP, CHARTAB, INFLECTION, CAPS_START, CAPS_STOP, CHARTAB, INFLECTION, FLUSH,
MAXVARS MAXVARS
}; };
@ -178,6 +178,7 @@ struct spk_synth {
int trigger; int trigger;
int jiffies; int jiffies;
int full; int full;
int flush_time;
int ser; int ser;
char *dev_name; char *dev_name;
short flags; short flags;

View File

@ -348,6 +348,7 @@ struct var_t synth_time_vars[] = {
{ TRIGGER, .u.n = {NULL, 20, 10, 2000, 0, 0, NULL } }, { TRIGGER, .u.n = {NULL, 20, 10, 2000, 0, 0, NULL } },
{ JIFFY, .u.n = {NULL, 50, 20, 200, 0, 0, NULL } }, { JIFFY, .u.n = {NULL, 50, 20, 200, 0, 0, NULL } },
{ FULL, .u.n = {NULL, 400, 200, 60000, 0, 0, NULL } }, { FULL, .u.n = {NULL, 400, 200, 60000, 0, 0, NULL } },
{ FLUSH, .u.n = {NULL, 4000, 100, 4000, 0, 0, NULL } },
V_LAST_VAR V_LAST_VAR
}; };
@ -408,6 +409,8 @@ static int do_synth_init(struct spk_synth *in_synth)
synth_time_vars[2].u.n.default_val = synth->jiffies; synth_time_vars[2].u.n.default_val = synth->jiffies;
synth_time_vars[3].u.n.value = synth_time_vars[3].u.n.value =
synth_time_vars[3].u.n.default_val = synth->full; synth_time_vars[3].u.n.default_val = synth->full;
synth_time_vars[4].u.n.value =
synth_time_vars[4].u.n.default_val = synth->flush_time;
synth_printf("%s", synth->init); synth_printf("%s", synth->init);
for (var = synth->vars; for (var = synth->vars;
(var->var_id >= 0) && (var->var_id < MAXVARS); var++) (var->var_id >= 0) && (var->var_id < MAXVARS); var++)

View File

@ -23,6 +23,7 @@ static struct st_var_header var_headers[] = {
{ "trigger_time", TRIGGER, VAR_TIME, NULL, NULL }, { "trigger_time", TRIGGER, VAR_TIME, NULL, NULL },
{ "jiffy_delta", JIFFY, VAR_TIME, NULL, NULL }, { "jiffy_delta", JIFFY, VAR_TIME, NULL, NULL },
{ "full_time", FULL, VAR_TIME, NULL, NULL }, { "full_time", FULL, VAR_TIME, NULL, NULL },
{ "flush_time", FLUSH, VAR_TIME, NULL, NULL },
{ "spell_delay", SPELL_DELAY, VAR_NUM, &spk_spell_delay, NULL }, { "spell_delay", SPELL_DELAY, VAR_NUM, &spk_spell_delay, NULL },
{ "bleeps", BLEEPS, VAR_NUM, &spk_bleeps, NULL }, { "bleeps", BLEEPS, VAR_NUM, &spk_bleeps, NULL },
{ "attrib_bleep", ATTRIB_BLEEP, VAR_NUM, &spk_attrib_bleep, NULL }, { "attrib_bleep", ATTRIB_BLEEP, VAR_NUM, &spk_attrib_bleep, NULL },