From dae4798fb4239fe290a13df76450d7645ef8cc8e Mon Sep 17 00:00:00 2001 From: qiangwenhui Date: Fri, 11 Sep 2026 17:09:31 +0800 Subject: [PATCH] fix(espi): handle posted transaction availability Track posted-channel availability separately so non-posted buffer ownership is returned only after the posted transaction completes. Signed-off-by: qiangwenhui --- drivers/espi/espi_ls.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/espi/espi_ls.c b/drivers/espi/espi_ls.c index 552d59c72d8..e1b4b1fd5b9 100644 --- a/drivers/espi/espi_ls.c +++ b/drivers/espi/espi_ls.c @@ -185,7 +185,7 @@ static void espi_reg_init(const struct device *dev) reg->DW_PSTC_ADR = espi_buf_addr_to_reg(dev,pc_rx_buf_get(dev)); reg->UP_PSTC_ADR = espi_buf_addr_to_reg(dev,pc_tx_buf_get(dev)); reg->UP_VWIR_ADR = espi_buf_addr_to_reg(dev,vw_tx_buf_get(dev)); - reg->INTERRUPT_CLEAR = ESPI_INTR_STT_DN_CNFG_MASK|ESPI_INTR_STT_DN_REST_MASK|ESPI_INTR_STT_PSTC_FREE_MASK|ESPI_INTR_STT_NPST_FREE_MASK + reg->INTERRUPT_CLEAR = ESPI_INTR_STT_DN_CNFG_MASK|ESPI_INTR_STT_DN_REST_MASK|ESPI_INTR_STT_PSTC_FREE_MASK|ESPI_INTR_STT_PSTC_AVAL_MASK|ESPI_INTR_STT_NPST_FREE_MASK |ESPI_INTR_STT_DN_VWIR_02_MASK|ESPI_INTR_STT_DN_VWIR_03_MASK|ESPI_INTR_STT_DN_VWIR_07_MASK; reg->GEN_CFG = 0<INTERRUPT_MASK = ESPI_INTR_STT_DN_CNFG_MASK|ESPI_INTR_STT_DN_REST_MASK|ESPI_INTR_STT_PSTC_FREE_MASK|ESPI_INTR_STT_NPST_FREE_MASK + reg->INTERRUPT_MASK = ESPI_INTR_STT_DN_CNFG_MASK|ESPI_INTR_STT_DN_REST_MASK|ESPI_INTR_STT_PSTC_FREE_MASK|ESPI_INTR_STT_PSTC_AVAL_MASK|ESPI_INTR_STT_NPST_FREE_MASK |ESPI_INTR_STT_DN_VWIR_02_MASK|ESPI_INTR_STT_DN_VWIR_03_MASK|ESPI_INTR_STT_DN_VWIR_07_MASK; } static int espi_reset(const struct device *dev) @@ -265,6 +265,14 @@ static void ls_espi_isr(void *arg) } reg->STATUS_SET = ESPI_STATUS_SET_PC_FREE_MASK; } + if(stt&ESPI_INTR_STT_PSTC_AVAL_MASK) + { + reg->INTERRUPT_CLEAR = ESPI_INTR_STT_PSTC_AVAL_MASK; + if(!(stt&ESPI_INTR_STT_NPST_FREE_MASK)) + { + reg->STATUS_SET = ESPI_STATUS_SET_NP_FREE_MASK; + } + } if(stt&ESPI_INTR_STT_NPST_FREE_MASK) { uint8_t *rx = np_rx_buf_get(dev); @@ -305,7 +313,7 @@ static void ls_espi_isr(void *arg) reg->UP_PSTC_DAT = up_first_word; reg->UP_PSTC_LEN_M1 = up_len - 1; } - reg->STATUS_SET = ESPI_STATUS_ALERT_SET_MASK | ESPI_STATUS_SET_PC_AVAIL_MASK | ESPI_STATUS_SET_NP_FREE_MASK; + reg->STATUS_SET = ESPI_STATUS_ALERT_SET_MASK | ESPI_STATUS_SET_PC_AVAIL_MASK; } if(stt&ESPI_INTR_STT_VWIR_FREE_MASK) { -- Gitee