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