Re: [PATCH] OCC: FSI and hwmon: Add sequence numbering
From: Guenter Roeck
Date: Wed Jun 26 2019 - 15:40:54 EST
On Wed, Jun 26, 2019 at 02:13:15PM -0500, Eddie James wrote:
> Sequence numbering of the commands submitted to the OCC is required by
> the OCC interface specification. Add sequence numbering and check for
> the correct sequence number on the response.
>
> Signed-off-by: Eddie James <eajames@xxxxxxxxxxxxx>
For hwmon:
Acked-by: Guenter Roeck <linux@xxxxxxxxxxxx>
I assume this will be pushed through drivers/fsi.
Guenter
> ---
> drivers/fsi/fsi-occ.c | 15 ++++++++++++---
> drivers/hwmon/occ/common.c | 4 ++--
> drivers/hwmon/occ/common.h | 1 +
> 3 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/fsi/fsi-occ.c b/drivers/fsi/fsi-occ.c
> index a2301ce..7da9c81 100644
> --- a/drivers/fsi/fsi-occ.c
> +++ b/drivers/fsi/fsi-occ.c
> @@ -412,6 +412,7 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
> msecs_to_jiffies(OCC_CMD_IN_PRG_WAIT_MS);
> struct occ *occ = dev_get_drvdata(dev);
> struct occ_response *resp = response;
> + u8 seq_no;
> u16 resp_data_length;
> unsigned long start;
> int rc;
> @@ -426,6 +427,8 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
>
> mutex_lock(&occ->occ_lock);
>
> + /* Extract the seq_no from the command (first byte) */
> + seq_no = *(const u8 *)request;
> rc = occ_putsram(occ, OCC_SRAM_CMD_ADDR, request, req_len);
> if (rc)
> goto done;
> @@ -441,11 +444,17 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
> if (rc)
> goto done;
>
> - if (resp->return_status == OCC_RESP_CMD_IN_PRG) {
> + if (resp->return_status == OCC_RESP_CMD_IN_PRG ||
> + resp->seq_no != seq_no) {
> rc = -ETIMEDOUT;
>
> - if (time_after(jiffies, start + timeout))
> - break;
> + if (time_after(jiffies, start + timeout)) {
> + dev_err(occ->dev, "resp timeout status=%02x "
> + "resp seq_no=%d our seq_no=%d\n",
> + resp->return_status, resp->seq_no,
> + seq_no);
> + goto done;
> + }
>
> set_current_state(TASK_UNINTERRUPTIBLE);
> schedule_timeout(wait_time);
> diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c
> index d593517..a7d2b16 100644
> --- a/drivers/hwmon/occ/common.c
> +++ b/drivers/hwmon/occ/common.c
> @@ -124,12 +124,12 @@ struct extended_sensor {
> static int occ_poll(struct occ *occ)
> {
> int rc;
> - u16 checksum = occ->poll_cmd_data + 1;
> + u16 checksum = occ->poll_cmd_data + occ->seq_no + 1;
> u8 cmd[8];
> struct occ_poll_response_header *header;
>
> /* big endian */
> - cmd[0] = 0; /* sequence number */
> + cmd[0] = occ->seq_no++; /* sequence number */
> cmd[1] = 0; /* cmd type */
> cmd[2] = 0; /* data length msb */
> cmd[3] = 1; /* data length lsb */
> diff --git a/drivers/hwmon/occ/common.h b/drivers/hwmon/occ/common.h
> index fc13f3c..67e6968 100644
> --- a/drivers/hwmon/occ/common.h
> +++ b/drivers/hwmon/occ/common.h
> @@ -95,6 +95,7 @@ struct occ {
> struct occ_sensors sensors;
>
> int powr_sample_time_us; /* average power sample time */
> + u8 seq_no;
> u8 poll_cmd_data; /* to perform OCC poll command */
> int (*send_cmd)(struct occ *occ, u8 *cmd);
>
> --
> 1.8.3.1
>