Re: [PATCH 3/4] power_supply: Introduce PSE compliant algorithm

From: Sebastian Reichel
Date: Tue Jul 08 2014 - 11:56:27 EST


On Tue, Jul 08, 2014 at 06:07:29AM +0000, Tc, Jenny wrote:
> > > +static int get_tempzone(struct psy_pse_chrg_prof *pse_mod_bprof,
> > > + int temp)
> > > +{
> > > + int i = 0;
> > > + int temp_range_cnt;
> > > +
> > > + temp_range_cnt = min_t(u16, pse_mod_bprof->temp_mon_ranges,
> > > + BATT_TEMP_NR_RNG);
> > > + if ((temp < pse_mod_bprof->temp_low_lim) ||
> > > + (temp > pse_mod_bprof->temp_mon_range[0].temp_up_lim))
> > > + return -EINVAL;
> > > +
> > > + for (i = 0; i < temp_range_cnt; ++i)
> > > + if (temp > pse_mod_bprof->temp_mon_range[i].temp_up_lim)
> > > + break;
> > > + return i-1;
> > > +}
> >
> > pse_mod_bprof->temp_mon_ranges > BATT_TEMP_NR_RNG is not allowed, so I
> > suggest to print an error and return some error code.
> >
> min_t takes care of the upper bound. The algorithm process BATT_TEMP_NR_RNG
> even if the actual number of zones are greater than this.

Right, the function will not fail, but the zone information table is
truncated. I would expect at least warning about that. I think it
doesn't hurt to have a small function, which validates the zone
data as good as possible. Using incorrect temperature zones is a
safety thread and we should try our best to avoid exploding
batteries ;)

Maybe something like that:

static bool check_tempzones(struct psy_pse_chrg_prof *pse_mod_bprof)
{
int i = 0;
int last_temp = ;

/* check size */
if (BATT_TEMP_NR_RNG > pse_mod_bprof->temp_mon_ranges)
return false;

/* check zone order */
for (i = 0; i < pse_mod_bprof->temp_mon_ranges; i++) {
if (last_temp < pse_mod_bprof->temp_mon_range[i].temp_up_lim)
return false;
last_temp = pse_mod_bprof->temp_mon_range[i].temp_up_lim;
}

return true;
}

-- Sebastian

Attachment: signature.asc
Description: Digital signature