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