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 9d197e9..13a6290 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 ed2cf42..fc13f3c 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 */