]> err.no Git - linux-2.6/blobdiff - drivers/hwmon/ibmaem.c
ibmaem: prevent infinite probing loop on x3650 M2 systems
[linux-2.6] / drivers / hwmon / ibmaem.c
index 5c006c9a43119ca2e84accb5433ac74850ee4a4f..08c5179e6d846cdaacbe4207e29534d166e5dcc2 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * A hwmon driver for the IBM Active Energy Manager temperature/power sensors
- * and capping functionality.
+ * A hwmon driver for the IBM System Director Active Energy Manager (AEM)
+ * temperature/power/energy sensors and capping functionality.
  * Copyright (C) 2008 IBM
  *
  * Author: Darrick J. Wong <djwong@us.ibm.com>
@@ -189,8 +189,8 @@ static struct aem_iana_id system_x_id = {
 struct aem_find_firmware_req {
        struct aem_iana_id      id;
        u8                      rsvd;
-       u16                     index;
-       u16                     module_type_id;
+       __be16                  index;
+       __be16                  module_type_id;
 } __packed;
 
 struct aem_find_firmware_resp {
@@ -202,7 +202,7 @@ struct aem_find_firmware_resp {
 struct aem_find_instance_req {
        struct aem_iana_id      id;
        u8                      instance_number;
-       u16                     module_type_id;
+       __be16                  module_type_id;
 } __packed;
 
 struct aem_find_instance_resp {
@@ -444,17 +444,17 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg,
        }
        case 2: {
                u16 *x = buf;
-               *x = be16_to_cpup((u16 *)rs_resp->bytes);
+               *x = be16_to_cpup((__be16 *)rs_resp->bytes);
                break;
        }
        case 4: {
                u32 *x = buf;
-               *x = be32_to_cpup((u32 *)rs_resp->bytes);
+               *x = be32_to_cpup((__be32 *)rs_resp->bytes);
                break;
        }
        case 8: {
                u64 *x = buf;
-               *x = be64_to_cpup((u64 *)rs_resp->bytes);
+               *x = be64_to_cpup((__be64 *)rs_resp->bytes);
                break;
        }
        }
@@ -676,7 +676,8 @@ static int aem_find_aem2(struct aem_ipmi_data *data,
                return -ETIMEDOUT;
 
        if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) ||
-           memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)))
+           memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)) ||
+           fi_resp->num_instances <= instance_num)
                return -ENOENT;
 
        return 0;
@@ -1104,7 +1105,7 @@ static void __exit aem_exit(void)
 }
 
 MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>");
-MODULE_DESCRIPTION("IBM Active Energy Manager power/temp sensor driver");
+MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver");
 MODULE_LICENSE("GPL");
 
 module_init(aem_init);