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

Reply via email to