OPAL has its own list of return codes. The patch provides a translation of such codes in errnos for the opal_sensor_read call.
Signed-off-by: Cédric Le Goater <c...@fr.ibm.com> --- arch/powerpc/platforms/powernv/opal-sensor.c | 37 ++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) Index: linux.git/arch/powerpc/platforms/powernv/opal-sensor.c =================================================================== --- linux.git.orig/arch/powerpc/platforms/powernv/opal-sensor.c +++ linux.git/arch/powerpc/platforms/powernv/opal-sensor.c @@ -26,6 +26,38 @@ static DEFINE_MUTEX(opal_sensor_mutex); + +/* + * opal_sensor_read() return codes + * + * OPAL_PARAMETER - invalid sensor handler + * OPAL_UNSUPPORTED - plateform does not support reading sensors. + * + * in case of communication with the FSP on IBM systems + * + * OPAL_ASYNC_COMPLETION - a request was sent and an async completion will + * be triggered with the @token argument + * OPAL_PARTIAL - the request completed but the data returned is invalid + * OPAL_BUSY_EVENT - a previous request is still pending + * OPAL_NO_MEM - allocation failed + * OPAL_INTERNAL_ERROR - communication failure with the FSP + * OPAL_HARDWARE - FSP is not available + */ +static int convert_opal_code(int ret) +{ + switch (ret) { + case OPAL_SUCCESS: return 0; + case OPAL_PARAMETER: return -EINVAL; + case OPAL_UNSUPPORTED: return -ENOSYS; + case OPAL_ASYNC_COMPLETION: return -EAGAIN; + case OPAL_BUSY_EVENT: return -EBUSY; + case OPAL_NO_MEM: return -ENOMEM; + case OPAL_HARDWARE: return -ENOENT; + case OPAL_INTERNAL_ERROR: return -EIO; + default: return -EIO; + } +} + /* * This will return sensor information to driver based on the requested sensor * handle. A handle is an opaque id for the powernv, read by the driver from the @@ -46,8 +78,10 @@ int opal_get_sensor_data(u32 sensor_hndl mutex_lock(&opal_sensor_mutex); ret = opal_sensor_read(sensor_hndl, token, &data); - if (ret != OPAL_ASYNC_COMPLETION) + if (ret != OPAL_ASYNC_COMPLETION) { + ret = convert_opal_code(ret); goto out_token; + } ret = opal_async_wait_response(token, &msg); if (ret) { @@ -58,6 +92,7 @@ int opal_get_sensor_data(u32 sensor_hndl *sensor_data = be32_to_cpu(data); ret = be64_to_cpu(msg.params[1]); + ret = convert_opal_code(ret); out_token: mutex_unlock(&opal_sensor_mutex); _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev