Re: [PATCH v2] scsi: pm80xx: handle non-fatal errors

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

 



On Wed, Feb 23, 2022 at 1:47 AM Damien Le Moal
<damien.lemoal@xxxxxxxxxxxxxxxxxx> wrote:
>
> On 2/22/22 18:26, Ajish Koshy wrote:
> > Firmware expects host driver to clear scratchpad rsvd 0 register after
> > non-fatal error is found.
> >
> > This is done when firmware raises fatal error interrupt and indicates
> > non-fatal error. At this point firmware updates scratchpad rsvd 0
> > register with non-fatal error value. Here host has to clear the register
> > after reading it during non-fatal errors.
> >
> > Renamed
> > MSGU_HOST_SCRATCH_PAD_6 to MSGU_SCRATCH_PAD_RSVD_0
> > MSGU_HOST_SCRATCH_PAD_7 to MSGU_SCRATCH_PAD_RSVD_1
>
> Naming these registered "reserved" is very unfortunate since that
> generally means the they should not be touched at all...
+1
>
> In any case, this looks OK to me.
>
> Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx>
>
> >
> > Signed-off-by: Ajish Koshy <Ajish.Koshy@xxxxxxxxxxxxx>
> > Signed-off-by: Viswas G <Viswas.G@xxxxxxxxxxxxx>
Acked-by: Jack Wang <jinpu.wang@xxxxxxxxx>
> > ---
> >  drivers/scsi/pm8001/pm80xx_hwi.c | 28 ++++++++++++++++++++++------
> >  drivers/scsi/pm8001/pm80xx_hwi.h |  9 +++++++--
> >  2 files changed, 29 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> > index bbf538fe15b3..9fcc332d685b 100644
> > --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> > +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> > @@ -1552,9 +1552,9 @@ pm80xx_fatal_errors(struct pm8001_hba_info *pm8001_ha)
> >  {
> >       int ret = 0;
> >       u32 scratch_pad_rsvd0 = pm8001_cr32(pm8001_ha, 0,
> > -                                     MSGU_HOST_SCRATCH_PAD_6);
> > +                                         MSGU_SCRATCH_PAD_RSVD_0);
> >       u32 scratch_pad_rsvd1 = pm8001_cr32(pm8001_ha, 0,
> > -                                     MSGU_HOST_SCRATCH_PAD_7);
> > +                                         MSGU_SCRATCH_PAD_RSVD_1);
> >       u32 scratch_pad1 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
> >       u32 scratch_pad2 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_2);
> >       u32 scratch_pad3 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3);
> > @@ -1663,9 +1663,9 @@ pm80xx_chip_soft_rst(struct pm8001_hba_info *pm8001_ha)
> >                       PCI_VENDOR_ID_ATTO &&
> >                       pm8001_ha->pdev->subsystem_vendor != 0) {
> >                       ibutton0 = pm8001_cr32(pm8001_ha, 0,
> > -                                     MSGU_HOST_SCRATCH_PAD_6);
> > +                                            MSGU_SCRATCH_PAD_RSVD_0);
> >                       ibutton1 = pm8001_cr32(pm8001_ha, 0,
> > -                                     MSGU_HOST_SCRATCH_PAD_7);
> > +                                            MSGU_SCRATCH_PAD_RSVD_1);
> >                       if (!ibutton0 && !ibutton1) {
> >                               pm8001_dbg(pm8001_ha, FAIL,
> >                                          "iButton Feature is not Available!!!\n");
> > @@ -4138,9 +4138,9 @@ static void print_scratchpad_registers(struct pm8001_hba_info *pm8001_ha)
> >       pm8001_dbg(pm8001_ha, FAIL, "MSGU_HOST_SCRATCH_PAD_5: 0x%x\n",
> >                  pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_5));
> >       pm8001_dbg(pm8001_ha, FAIL, "MSGU_RSVD_SCRATCH_PAD_0: 0x%x\n",
> > -                pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_6));
> > +                pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_RSVD_0));
> >       pm8001_dbg(pm8001_ha, FAIL, "MSGU_RSVD_SCRATCH_PAD_1: 0x%x\n",
> > -                pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_7));
> > +                pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_RSVD_1));
> >  }
> >
> >  static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
> > @@ -4162,6 +4162,22 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
> >                       pm8001_handle_event(pm8001_ha, NULL, IO_FATAL_ERROR);
> >                       print_scratchpad_registers(pm8001_ha);
> >                       return ret;
> > +             } else {
> > +                     /*read scratchpad rsvd 0 register*/
> > +                     regval = pm8001_cr32(pm8001_ha, 0,
> > +                                          MSGU_SCRATCH_PAD_RSVD_0);
> > +                     switch (regval) {
> > +                     case NON_FATAL_SPBC_LBUS_ECC_ERR:
> > +                     case NON_FATAL_BDMA_ERR:
> > +                     case NON_FATAL_THERM_OVERTEMP_ERR:
> > +                             /*Clear the register*/
> > +                             pm8001_cw32(pm8001_ha, 0,
> > +                                         MSGU_SCRATCH_PAD_RSVD_0,
> > +                                         0x00000000);
> > +                             break;
> > +                     default:
> > +                             break;
> > +                     }
> >               }
> >       }
> >       circularQ = &pm8001_ha->outbnd_q_tbl[vec];
> > diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
> > index c7e5d93bea92..f0818540b2cd 100644
> > --- a/drivers/scsi/pm8001/pm80xx_hwi.h
> > +++ b/drivers/scsi/pm8001/pm80xx_hwi.h
> > @@ -1366,8 +1366,8 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
> >  #define MSGU_HOST_SCRATCH_PAD_3                      0x60
> >  #define MSGU_HOST_SCRATCH_PAD_4                      0x64
> >  #define MSGU_HOST_SCRATCH_PAD_5                      0x68
> > -#define MSGU_HOST_SCRATCH_PAD_6                      0x6C
> > -#define MSGU_HOST_SCRATCH_PAD_7                      0x70
> > +#define MSGU_SCRATCH_PAD_RSVD_0                      0x6C
> > +#define MSGU_SCRATCH_PAD_RSVD_1                      0x70
> >
> >  #define MSGU_SCRATCHPAD1_RAAE_STATE_ERR(x) ((x & 0x3) == 0x2)
> >  #define MSGU_SCRATCHPAD1_ILA_STATE_ERR(x) (((x >> 2) & 0x3) == 0x2)
> > @@ -1435,6 +1435,11 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
> >  #define SCRATCH_PAD_ERROR_MASK               0xFFFFFC00 /* Error mask bits */
> >  #define SCRATCH_PAD_STATE_MASK               0x00000003 /* State Mask bits */
> >
> > +/*state definition for Scratchpad Rsvd 0, Offset 0x6C, Non-fatal*/
> > +#define NON_FATAL_SPBC_LBUS_ECC_ERR  0x70000001
> > +#define NON_FATAL_BDMA_ERR           0xE0000001
> > +#define NON_FATAL_THERM_OVERTEMP_ERR 0x80000001
> > +
> >  /* main configuration offset - byte offset */
> >  #define MAIN_SIGNATURE_OFFSET                0x00 /* DWORD 0x00 */
> >  #define MAIN_INTERFACE_REVISION              0x04 /* DWORD 0x01 */
>
>
> --
> Damien Le Moal
> Western Digital Research



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux