[patch 6/7] staging: speakup: add send_xchar, tiocmset and input functionality for tty

Okash Khawaja okash.khawaja at gmail.com
Fri Apr 28 03:45:40 EDT 2017


Hi,

Two of the mistakes are frankly embarassing (down_timeout and up
inside spk_ttyio_in) . At some point during testing with apollo and
ltlk harwdare, I had to import and modify the patches to suit 4.10
kernel as 4.11 was still not stable and giving problems with USB on my
computer. I remember fixing them during tests, which is why those
synths worked. But didn't merge them back.

I will fix this patch today.

Thanks,
Okash

On Thu, Apr 27, 2017 at 3:06 PM, Samuel Thibault
<samuel.thibault at ens-lyon.org> wrote:
> Hello,
>
> Okash Khawaja, on jeu. 13 avril 2017 18:41:34 +0100, wrote:
>> +static struct spk_synth *spk_ttyio_synth;
>> +/* TODO: make this part of synth and remove the global */
>
> Mmm, rather the other way round: add a synth pointer inside the
> spk_ldisc_data structure, so you can get the synth from
>
>> +static int spk_ttyio_receive_buf2(struct tty_struct *tty,
>
>
>> -             pr_err("Error registering line discipline.\n");
>> +             pr_err("speakup: Error registering line discipline.\n");
>
> Do not mix with unrelated changes :)
>
>> +static unsigned char ttyio_in(int timeout)
>> +{
>> +     struct spk_ldisc_data *ldisc_data =
>> +             (struct spk_ldisc_data *)speakup_tty->disc_data;
>> +     char rv;
>> +
>> +     if (!down_timeout(&ldisc_data->sem, usecs_to_jiffies(timeout))) {
>
> Err, this should actually be if (down_timeout(...) != 0) (error case),
> shouldn't it?
>
>> +             pr_warn("spk_ttyio: timeout (%d)  while waiting for input\n",
>> +                             timeout);
>> +             return 0xff;
>> +     }
>> +
>> +     rv = ldisc_data->buf;
>> +     /* Make sure we have read buf before we set buf_free to let
>> +      * the producer overwrite it */
>> +     mb();
>> +     ldisc_data->buf_free = true;
>> +     tty_schedule_flip(speakup_tty->port);
>
> Here, document that tty_schedule_flip lets the tty push more characters.
>
>> +     up(&ldisc_data->sem);
>
> Err, no, it's spk_ttyio_receive_buf2 (the producer) which does the up(),
> the consumer shouldn't do any up()!  This is really a resource-counting
> semaphore, not a mutex!
>
>> Index: linux-staging/drivers/staging/speakup/spk_priv.h
>> ===================================================================
>> --- linux-staging.orig/drivers/staging/speakup/spk_priv.h
>> +++ linux-staging/drivers/staging/speakup/spk_priv.h
>> @@ -39,6 +39,7 @@
>>  #endif
>>
>>  #define KT_SPKUP 15
>> +#define SPK_SYNTH_TIMEOUT 100000
>
> Please document the unit (us)
>
> Samuel


More information about the Speakup mailing list