On Wed, 26 Jun 2019 at 19:41, Guenter Roeck <linux@xxxxxxxxxxxx> wrote: > > 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. Yes. Eddie, can you please collect the acks and send to Greg? Cheers, Joel > > 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 > >