[alsa-devel] [PATCH] sscape: fix incorrect timeout after microcode upload

Takashi Iwai tiwai at suse.de
Mon Jan 12 18:01:15 CET 2009


At Mon, 12 Jan 2009 17:54:16 +0100,
Krzysztof Helt wrote:
> 
> From: Krzysztof Helt <krzysztof.h1 at wp.pl>
> 
> A comment states that one should wait up to 5 secs
> while a waiting loop waits only 5 system ticks.
> 
> Signed-off-by: Krzysztof Helt <krzysztof.h1 at wp.pl>
> ---
> Ted tested that patch and it allowed him uploading
> a microcode into the Soundscape Elite. However,
> midi does not work for him yet.
> 
>  sound/isa/sscape.c |   20 ++++++++++----------
>  1 files changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c
> index bc44916..347a880 100644
> --- a/sound/isa/sscape.c
> +++ b/sound/isa/sscape.c
> @@ -393,19 +393,19 @@ static int sscape_wait_dma_unsafe(unsigned io_base, enum GA_REG reg, unsigned ti
>   */
>  static int obp_startup_ack(struct soundscape *s, unsigned timeout)
>  {
> -	while (timeout != 0) {
> +	unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
> +
> +	while (time_before(jiffies, end_time)) {

In general it's better to use a do-while for the time-out check.
That is, the timeout should be checked after the data check.

Could you fix and repost?


thanks,

Takashi


>  		unsigned long flags;
>  		unsigned char x;
>  
> -		schedule_timeout_uninterruptible(1);
> -
>  		spin_lock_irqsave(&s->lock, flags);
>  		x = inb(HOST_DATA_IO(s->io_base));
>  		spin_unlock_irqrestore(&s->lock, flags);
>  		if ((x & 0xfe) == 0xfe)
>  			return 1;
>  
> -		--timeout;
> +		msleep(10);
>  	} /* while */
>  
>  	return 0;
> @@ -420,19 +420,19 @@ static int obp_startup_ack(struct soundscape *s, unsigned timeout)
>   */
>  static int host_startup_ack(struct soundscape *s, unsigned timeout)
>  {
> -	while (timeout != 0) {
> +	unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
> +
> +	while (time_before(jiffies, end_time)) {
>  		unsigned long flags;
>  		unsigned char x;
>  
> -		schedule_timeout_uninterruptible(1);
> -
>  		spin_lock_irqsave(&s->lock, flags);
>  		x = inb(HOST_DATA_IO(s->io_base));
>  		spin_unlock_irqrestore(&s->lock, flags);
>  		if (x == 0xfe)
>  			return 1;
>  
> -		--timeout;
> +		msleep(10);
>  	} /* while */
>  
>  	return 0;
> @@ -529,10 +529,10 @@ static int upload_dma_data(struct soundscape *s,
>  	 * give it 5 seconds (max) ...
>  	 */
>  	ret = 0;
> -	if (!obp_startup_ack(s, 5)) {
> +	if (!obp_startup_ack(s, 5000)) {
>  		snd_printk(KERN_ERR "sscape: No response from on-board processor after upload\n");
>  		ret = -EAGAIN;
> -	} else if (!host_startup_ack(s, 5)) {
> +	} else if (!host_startup_ack(s, 5000)) {
>  		snd_printk(KERN_ERR "sscape: SoundScape failed to initialise\n");
>  		ret = -EAGAIN;
>  	}
> -- 
> 1.5.2.2
> 
> 
> -----------------------------------------------------------------------
> Promocja w Speak Up. Kwartal angielskiego za darmo. 
> 3 miesiace nauki gratis. Sprawdz teraz! >> http://link.interia.pl/f2019
> 


More information about the Alsa-devel mailing list