]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
hwmon: (occ) Store error condition for rate-limited polls
authorEddie James <eajames@linux.ibm.com>
Tue, 16 Apr 2019 15:43:48 +0000 (15:43 +0000)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 16 Apr 2019 22:12:13 +0000 (15:12 -0700)
The OCC driver limits the rate of sending poll commands to the OCC. If a
user reads a hwmon entry after a poll response resulted in an error and
is rate-limited, the error is invisible to the user. Fix this by storing
the last error and returning that in the rate-limited case.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/occ/common.c
drivers/hwmon/occ/common.h

index 9d197e9d47c077dc68ecae89fba72ada4033d7ef..13a6290c8d2548a7db45e19be1e6fb1f771ec5b2 100644 (file)
@@ -141,6 +141,7 @@ static int occ_poll(struct occ *occ)
        /* mutex should already be locked if necessary */
        rc = occ->send_cmd(occ, cmd);
        if (rc) {
+               occ->last_error = rc;
                if (occ->error_count++ > OCC_ERROR_COUNT_THRESHOLD)
                        occ->error = rc;
 
@@ -149,6 +150,7 @@ static int occ_poll(struct occ *occ)
 
        /* clear error since communication was successful */
        occ->error_count = 0;
+       occ->last_error = 0;
        occ->error = 0;
 
        /* check for safe state */
@@ -210,6 +212,8 @@ int occ_update_response(struct occ *occ)
        if (time_after(jiffies, occ->last_update + OCC_UPDATE_FREQUENCY)) {
                rc = occ_poll(occ);
                occ->last_update = jiffies;
+       } else {
+               rc = occ->last_error;
        }
 
        mutex_unlock(&occ->lock);
index ed2cf42452953006e3619fcd68e1cde970d16a39..fc13f3c73c47fb5da042460e23793cbaad925613 100644 (file)
@@ -106,7 +106,8 @@ struct occ {
        struct attribute_group group;
        const struct attribute_group *groups[2];
 
-       int error;                      /* latest transfer error */
+       int error;                      /* final transfer error after retry */
+       int last_error;                 /* latest transfer error */
        unsigned int error_count;       /* number of xfr errors observed */
        unsigned long last_safe;        /* time OCC entered "safe" state */