Re: [PATCH] OCC: FSI and hwmon: Add sequence numbering

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> >



[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux