Use complete chip names (prefix + bus + address) as the keys of

sensors_chip_features_list[]. Using only the prefix (as was done before)
makes it impossible to properly support multiple chips with the same prefix
but a different feature set.


git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@4508 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare committed 2007-06-28 12:09:00 +00:00
1 parent 8fdfa3f19d
commit 063f4b91d4
6 files changed
+30 -35

No files matched your search

+17 -17
View File
@@ -99,14 +99,14 @@ sensors_chip *sensors_for_all_config_chips(sensors_chip_name chip_name,
/* Look up a resource in the intern chip list, and return a pointer to it.
Do not modify the struct the return value points to! Returns NULL if
not found.*/
const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix,
const sensors_chip_feature *sensors_lookup_feature_nr(const sensors_chip_name *chip,
int feature)
{
int i, j;
const sensors_chip_feature *features;
for (i = 0; sensors_chip_features_list[i].prefix; i++)
if (!strcasecmp(sensors_chip_features_list[i].prefix, prefix)) {
for (i = 0; sensors_chip_features_list[i].chip.prefix; i++)
if (sensors_match_chip(sensors_chip_features_list[i].chip, *chip)) {
features = sensors_chip_features_list[i].feature;
for (j = 0; features[j].data.name; j++)
if (features[j].data.number == feature)
@@ -118,14 +118,14 @@ const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix,
/* Look up a resource in the intern chip list, and return a pointer to it.
Do not modify the struct the return value points to! Returns NULL if
not found.*/
const sensors_chip_feature *sensors_lookup_feature_name(const char *prefix,
const sensors_chip_feature *sensors_lookup_feature_name(const sensors_chip_name *chip,
const char *feature)
{
int i, j;
const sensors_chip_feature *features;
for (i = 0; sensors_chip_features_list[i].prefix; i++)
if (!strcasecmp(sensors_chip_features_list[i].prefix, prefix)) {
for (i = 0; sensors_chip_features_list[i].chip.prefix; i++)
if (sensors_match_chip(sensors_chip_features_list[i].chip, *chip)) {
features = sensors_chip_features_list[i].feature;
for (j = 0; features[j].data.name; j++)
if (!strcasecmp(features[j].data.name, feature))
@@ -161,7 +161,7 @@ int sensors_get_label(sensors_chip_name name, int feature, char **result)
*result = NULL;
if (sensors_chip_name_has_wildcards(name))
return -SENSORS_ERR_WILDCARDS;
if (!(featureptr = sensors_lookup_feature_nr(name.prefix, feature)))
if (!(featureptr = sensors_lookup_feature_nr(&name, feature)))
return -SENSORS_ERR_NO_ENTRY;
for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));)
@@ -193,12 +193,12 @@ int sensors_get_ignored(sensors_chip_name name, int feature)
res = 1;
if (sensors_chip_name_has_wildcards(name))
return -SENSORS_ERR_WILDCARDS;
if (!(featureptr = sensors_lookup_feature_nr(name.prefix, feature)))
if (!(featureptr = sensors_lookup_feature_nr(&name, feature)))
return -SENSORS_ERR_NO_ENTRY;
if (featureptr->data.mapping == SENSORS_NO_MAPPING)
alt_featureptr = NULL;
else if (!(alt_featureptr =
sensors_lookup_feature_nr(name.prefix,
sensors_lookup_feature_nr(&name,
featureptr->data.mapping)))
return -SENSORS_ERR_NO_ENTRY;
for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));)
@@ -227,11 +227,11 @@ int sensors_get_feature(sensors_chip_name name, int feature, double *result)
if (sensors_chip_name_has_wildcards(name))
return -SENSORS_ERR_WILDCARDS;
if (!(main_feature = sensors_lookup_feature_nr(name.prefix, feature)))
if (!(main_feature = sensors_lookup_feature_nr(&name, feature)))
return -SENSORS_ERR_NO_ENTRY;
if (main_feature->data.compute_mapping == SENSORS_NO_MAPPING)
alt_feature = NULL;
else if (!(alt_feature = sensors_lookup_feature_nr(name.prefix,
else if (!(alt_feature = sensors_lookup_feature_nr(&name,
main_feature->data.compute_mapping)))
return -SENSORS_ERR_NO_ENTRY;
if (!(main_feature->data.mode & SENSORS_MODE_R))
@@ -271,11 +271,11 @@ int sensors_set_feature(sensors_chip_name name, int feature, double value)
if (sensors_chip_name_has_wildcards(name))
return -SENSORS_ERR_WILDCARDS;
if (!(main_feature = sensors_lookup_feature_nr(name.prefix, feature)))
if (!(main_feature = sensors_lookup_feature_nr(&name, feature)))
return -SENSORS_ERR_NO_ENTRY;
if (main_feature->data.compute_mapping == SENSORS_NO_MAPPING)
alt_feature = NULL;
else if (!(alt_feature = sensors_lookup_feature_nr(name.prefix,
else if (!(alt_feature = sensors_lookup_feature_nr(&name,
main_feature->data.compute_mapping)))
return -SENSORS_ERR_NO_ENTRY;
if (!(main_feature->data.mode & SENSORS_MODE_W))
@@ -332,8 +332,8 @@ const sensors_feature_data *sensors_get_all_features(sensors_chip_name name,
sensors_chip_feature *feature_list;
int i;
for (i = 0; sensors_chip_features_list[i].prefix; i++)
if (!strcasecmp(sensors_chip_features_list[i].prefix, name.prefix)) {
for (i = 0; sensors_chip_features_list[i].chip.prefix; i++)
if (sensors_match_chip(sensors_chip_features_list[i].chip, name)) {
feature_list = sensors_chip_features_list[i].feature;
if (!*nr1 && !*nr2) { /* Return the first entry */
if (!feature_list[0].data.name) /* The list may be empty */
@@ -373,7 +373,7 @@ int sensors_eval_expr(sensors_chip_name chipname, const sensors_expr * expr,
return 0;
}
if (expr->kind == sensors_kind_var) {
if (!(feature = sensors_lookup_feature_name(chipname.prefix,
if (!(feature = sensors_lookup_feature_name(&chipname,
expr->data.var)))
return SENSORS_ERR_NO_ENTRY;
if (!(res = sensors_get_feature(chipname, feature->data.number, result)))
@@ -432,7 +432,7 @@ int sensors_do_this_chip_sets(sensors_chip_name name)
for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));)
for (i = 0; i < chip->sets_count; i++) {
feature = sensors_lookup_feature_name(name.prefix,
feature = sensors_lookup_feature_name(&name,
chip->sets[i].name);
if (!feature) {
sensors_parse_error("Unknown feature name",
+2 -2
View File
@@ -36,14 +36,14 @@ extern sensors_chip *sensors_for_all_config_chips(sensors_chip_name chip_name,
/* Look up a resource in the intern chip list, and return a pointer to it.
Do not modify the struct the return value points to! Returns NULL if
not found. */
extern const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix,
extern const sensors_chip_feature *sensors_lookup_feature_nr(const sensors_chip_name *chip,
int feature);
/* Look up a resource in the intern chip list, and return a pointer to it.
Do not modify the struct the return value points to! Returns NULL if
not found.*/
extern const sensors_chip_feature *sensors_lookup_feature_name
(const char *prefix, const char *feature);
(const sensors_chip_name *chip, const char *feature);
/* Substitute configuration bus numbers with real-world /proc bus numbers
in the chips lists */
+2 -2
View File
@@ -44,11 +44,11 @@ sensors_bus *sensors_proc_bus = NULL;
int sensors_proc_bus_count = 0;
int sensors_proc_bus_max = 0;
#define PLACEHOLDER_ELEMENTS {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}
#define PLACEHOLDER_ELEMENTS {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}
sensors_chip_features sensors_chip_features_list[] = {
PLACEHOLDER_ELEMENTS,
{ 0 }
{ { 0 } }
};
static int sensors_substitute_chip(sensors_chip_name *name,int lineno);
+1 -1
View File
@@ -147,7 +147,7 @@ typedef struct sensors_chip_feature {
/* Internal data about all features of a type of chip */
typedef struct sensors_chip_features {
const char *prefix;
struct sensors_chip_name chip;
struct sensors_chip_feature *feature;
} sensors_chip_features;
+2 -2
View File
@@ -39,7 +39,7 @@ int sensors_read_proc(sensors_chip_name name, int feature, double *value)
char n[NAME_MAX], altn[NAME_MAX];
FILE *f;
if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature)))
if (!(the_feature = sensors_lookup_feature_nr(&name, feature)))
return -SENSORS_ERR_NO_ENTRY;
strcpy(n, name.busname);
@@ -68,7 +68,7 @@ int sensors_write_proc(sensors_chip_name name, int feature, double value)
char n[NAME_MAX], altn[NAME_MAX];
FILE *f;
if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature)))
if (!(the_feature = sensors_lookup_feature_nr(&name, feature)))
return -SENSORS_ERR_NO_ENTRY;
strcpy(n, name.busname);
+6 -11
View File
@@ -67,7 +67,7 @@ sensors_chip_features sensors_read_dynamic_chip(struct sysfs_device *sysdir)
int i, type, fnum = 1;
struct sysfs_attribute *attr;
struct dlist *attrs;
sensors_chip_features ret = {0, 0};
sensors_chip_features ret = {{0}, 0};
/* room for all 3 (in, fan, temp) types, with all their subfeatures
+ misc features. We use a large sparse table at first to store all
found features, so that we can store them sorted at type and index
@@ -90,7 +90,7 @@ sensors_chip_features sensors_read_dynamic_chip(struct sysfs_device *sysdir)
name = attr->name;
if (!strcmp(name, "name")) {
ret.prefix = strndup(attr->value, strlen(attr->value) - 1);
ret.chip.prefix = strndup(attr->value, strlen(attr->value) - 1);
continue;
}
@@ -269,18 +269,13 @@ static int sensors_read_one_sysfs_chip(struct sysfs_device *dev)
} else
return -SENSORS_ERR_PARSE;
/* check whether this chip is known in the static list */
for (i = 0; sensors_chip_features_list[i].prefix; i++)
if (!strcasecmp(sensors_chip_features_list[i].prefix, name.prefix))
break;
/* if no chip definition matches */
if (!sensors_chip_features_list[i].prefix &&
total_dynamic < N_PLACEHOLDER_ELEMENTS) {
if (total_dynamic < N_PLACEHOLDER_ELEMENTS) {
sensors_chip_features n_entry = sensors_read_dynamic_chip(dev);
n_entry.chip.addr = name.addr;
n_entry.chip.bus = name.bus;
/* skip to end of list */
for(i = 0; sensors_chip_features_list[i].prefix; i++);
for(i = 0; sensors_chip_features_list[i].chip.prefix; i++);
sensors_chip_features_list[i] = n_entry;