Down messages should be processed only when down interrupt is received while UP messages should be processed when up interrupt is received. A scenario has been observed where processing down message on UP message interrupt causes processing of old message response while response of latest message is not received.
Fixes: fa4ee2d43188 ("common/cnxk: sync between mbox up and down messages") Signed-off-by: Harman Kalra <hka...@marvell.com> --- drivers/common/cnxk/roc_dev.c | 40 ++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/drivers/common/cnxk/roc_dev.c b/drivers/common/cnxk/roc_dev.c index e41235ea8a..c948caba63 100644 --- a/drivers/common/cnxk/roc_dev.c +++ b/drivers/common/cnxk/roc_dev.c @@ -770,14 +770,22 @@ roc_pf_vf_mbox_irq(void *param) * by 1ms until this region is zeroed mbox_wait_for_zero() */ mbox_data = plt_read64(dev->bar2 + RVU_VF_VFPF_MBOX0); - if (mbox_data) - plt_write64(!mbox_data, dev->bar2 + RVU_VF_VFPF_MBOX0); + /* If interrupt occurred for down message */ + if (mbox_data & MBOX_DOWN_MSG) { + mbox_data &= ~MBOX_DOWN_MSG; + plt_write64(mbox_data, dev->bar2 + RVU_VF_VFPF_MBOX0); - /* First process all configuration messages */ - process_msgs(dev, dev->mbox); + /* First process all configuration messages */ + process_msgs(dev, dev->mbox); + } + /* If interrupt occurred for UP message */ + if (mbox_data & MBOX_UP_MSG) { + mbox_data &= ~MBOX_UP_MSG; + plt_write64(mbox_data, dev->bar2 + RVU_VF_VFPF_MBOX0); - /* Process Uplink messages */ - process_msgs_up(dev, &dev->mbox_up); + /* Process Uplink messages */ + process_msgs_up(dev, &dev->mbox_up); + } } /* IRQ to PF from AF - PF context (interrupt thread) */ @@ -799,14 +807,22 @@ roc_af_pf_mbox_irq(void *param) * by 1ms until this region is zeroed mbox_wait_for_zero() */ mbox_data = plt_read64(dev->bar2 + RVU_PF_PFAF_MBOX0); - if (mbox_data) - plt_write64(!mbox_data, dev->bar2 + RVU_PF_PFAF_MBOX0); + /* If interrupt occurred for down message */ + if (mbox_data & MBOX_DOWN_MSG) { + mbox_data &= ~MBOX_DOWN_MSG; + plt_write64(mbox_data, dev->bar2 + RVU_PF_PFAF_MBOX0); - /* First process all configuration messages */ - process_msgs(dev, dev->mbox); + /* First process all configuration messages */ + process_msgs(dev, dev->mbox); + } + /* If interrupt occurred for up message */ + if (mbox_data & MBOX_UP_MSG) { + mbox_data &= ~MBOX_UP_MSG; + plt_write64(mbox_data, dev->bar2 + RVU_PF_PFAF_MBOX0); - /* Process Uplink messages */ - process_msgs_up(dev, &dev->mbox_up); + /* Process Uplink messages */ + process_msgs_up(dev, &dev->mbox_up); + } } static int -- 2.18.0