Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Oct 2019 09:46:59 -0600
From:      Ian Lepore <ian@freebsd.org>
To:        Andriy Gapon <avg@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r354076 - head/sys/dev/ow
Message-ID:  <ca3e991449dda0ed70bbc578aa6069cefce40fc4.camel@freebsd.org>
In-Reply-To: <201910251538.x9PFc9ii028313@repo.freebsd.org>
References:  <201910251538.x9PFc9ii028313@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 2019-10-25 at 15:38 +0000, Andriy Gapon wrote:
> Author: avg
> Date: Fri Oct 25 15:38:09 2019
> New Revision: 354076
> URL: https://svnweb.freebsd.org/changeset/base/354076
> 
> Log:
>   owc_gpiobus_read_data: compare times in sbintime_t units
>   
>   Previously the code used sbttous() before microseconds comparison
> in one
>   place, sbttons() and nanoseconds in another, division by SBT_1US
> and
>   microseconds in yet another.
>   
>   Now the code consistently uses multiplication by SBT_1US to convert
>   microseconds to sbintime_t before comparing them with periods
> between
>   calls to sbinuptime().  This is fast, this is precise enough (below
>   0.03%) and the periods defined by the protocol cannot overflow.
>   
>   Reviewed by:	imp (D22108)
>   MFC after:	2 weeks
> 
> Modified:
>   head/sys/dev/ow/owc_gpiobus.c
> 
> Modified: head/sys/dev/ow/owc_gpiobus.c
> =====================================================================
> =========
> --- head/sys/dev/ow/owc_gpiobus.c	Fri Oct 25 15:02:50 2019	(r354
> 075)
> +++ head/sys/dev/ow/owc_gpiobus.c	Fri Oct 25 15:38:09 2019	(r354
> 076)
> @@ -296,10 +296,10 @@ owc_gpiobus_read_data(device_t dev, struct
> ow_timing *
>  	do {
>  		now = sbinuptime();
>  		GETPIN(sc, &sample);
> -	} while (sbttous(now - then) < t->t_rdv + 2 && sample == 0);
> +	} while (now - then < (t->t_rdv + 2) * SBT_1US && sample == 0);
>  	critical_exit();
>  
> -	if (sbttons(now - then) < t->t_rdv * 1000)
> +	if (now - then < t->t_rdv * SBT_1US)
>  		*bit = 1;
>  	else
>  		*bit = 0;
> @@ -307,7 +307,7 @@ owc_gpiobus_read_data(device_t dev, struct
> ow_timing *
>  	/* Wait out the rest of t_slot */
>  	do {
>  		now = sbinuptime();
> -	} while ((now - then) / SBT_1US < t->t_slot);
> +	} while (now - then < t->t_slot * SBT_1US);
>  
>  	RELBUS(sc);
>  

Unit conversions with sbt times should be done using the macros that
carefully avoid roundoff errors.  I don't understand why you've changed
the code that correctly did use those macros to inline math.

-- Ian




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ca3e991449dda0ed70bbc578aa6069cefce40fc4.camel>