Index: /lm-sensors/trunk/lib/sysfs.c
===================================================================
--- /lm-sensors/trunk/lib/sysfs.c	(revision 5844)
+++ /lm-sensors/trunk/lib/sysfs.c	(revision 5874)
@@ -137,13 +137,17 @@
 char sensors_sysfs_mount[NAME_MAX];
 
+#define MAX_MAIN_SENSOR_TYPES	6
+#define MAX_OTHER_SENSOR_TYPES	1
 #define MAX_SENSORS_PER_TYPE	24
 #define MAX_SUBFEATURES		8
-#define MAX_SENSOR_TYPES	6
-/* Room for all 6 types (in, fan, temp, power, energy, current) with all
-   their subfeatures + VID + misc features */
-#define ALL_POSSIBLE_SUBFEATURES \
-				(MAX_SENSORS_PER_TYPE * MAX_SUBFEATURES * \
-				 MAX_SENSOR_TYPES * 2 + \
-				 MAX_SENSORS_PER_TYPE + 1)
+#define FEATURE_SIZE		(MAX_SUBFEATURES * 2)
+#define FEATURE_TYPE_SIZE	(MAX_SENSORS_PER_TYPE * FEATURE_SIZE)
+
+/* Room for all 6 main types (in, fan, temp, power, energy, current) and 1
+   other type (VID) with all their subfeatures + misc features */
+#define SUB_OFFSET_OTHER	(MAX_MAIN_SENSOR_TYPES * FEATURE_TYPE_SIZE)
+#define SUB_OFFSET_MISC		(SUB_OFFSET_OTHER + \
+				 MAX_OTHER_SENSOR_TYPES * FEATURE_TYPE_SIZE)
+#define ALL_POSSIBLE_SUBFEATURES	(SUB_OFFSET_MISC + 1)
 
 static
@@ -405,14 +409,16 @@
 		switch (sftype) {
 		case SENSORS_SUBFEATURE_VID:
-			i = nr + MAX_SENSORS_PER_TYPE * MAX_SUBFEATURES *
-			    MAX_SENSOR_TYPES * 2;
+			i = SUB_OFFSET_OTHER +
+			    ((sftype >> 8) - SENSORS_FEATURE_VID) *
+			    FEATURE_TYPE_SIZE +
+			    nr * FEATURE_SIZE + (sftype & 0xFF);
 			break;
 		case SENSORS_SUBFEATURE_BEEP_ENABLE:
-			i = MAX_SENSORS_PER_TYPE * MAX_SUBFEATURES *
-			    MAX_SENSOR_TYPES * 2 + MAX_SENSORS_PER_TYPE;
+			i = SUB_OFFSET_MISC +
+			    ((sftype >> 8) - SENSORS_FEATURE_BEEP_ENABLE);
 			break;
 		default:
-			i = (sftype >> 8) * MAX_SENSORS_PER_TYPE *
-			    MAX_SUBFEATURES * 2 + nr * MAX_SUBFEATURES * 2 +
+			i = (sftype >> 8) * FEATURE_TYPE_SIZE +
+			    nr * FEATURE_SIZE +
 			    ((sftype & 0x80) >> 7) * MAX_SUBFEATURES +
 			    (sftype & 0x7F);
@@ -451,9 +457,7 @@
 			continue;
 
-		if (i >= MAX_SENSORS_PER_TYPE * MAX_SUBFEATURES *
-		    MAX_SENSOR_TYPES * 2 ||
-		    i / (MAX_SUBFEATURES * 2) != prev_slot) {
+		if (i >= SUB_OFFSET_MISC || i / FEATURE_SIZE != prev_slot) {
 			fnum++;
-			prev_slot = i / (MAX_SUBFEATURES * 2);
+			prev_slot = i / FEATURE_SIZE;
 		}
 	}
@@ -473,10 +477,8 @@
 
 		/* New main feature? */
-		if (i >= MAX_SENSORS_PER_TYPE * MAX_SUBFEATURES *
-		    MAX_SENSOR_TYPES * 2 ||
-		    i / (MAX_SUBFEATURES * 2) != prev_slot) {
+		if (i >= SUB_OFFSET_MISC || i / FEATURE_SIZE != prev_slot) {
 			ftype = all_subfeatures[i].type >> 8;
 			fnum++;
-			prev_slot = i / (MAX_SUBFEATURES * 2);
+			prev_slot = i / FEATURE_SIZE;
 
 			dyn_features[fnum].name = get_feature_name(ftype,
