On Mon, 10 Feb 2025 09:50:17 +0800 Bingbin Chen <chen.bing...@zte.com.cn> wrote:
> +static uint32_t > +zxdh_np_se_smmu0_ind_read(uint32_t dev_id, > + uint32_t base_addr, > + uint32_t index, > + uint32_t rd_mode, > + uint32_t rd_clr_mode, > + uint32_t *p_data) > +{ > + uint32_t rc = ZXDH_OK; > + uint32_t i = 0; > + uint32_t row_index = 0; > + uint32_t col_index = 0; > + uint32_t temp_data[4] = {0}; > + uint32_t *p_temp_data = NULL; > + ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T cpu_ind_cmd = {0}; > + ZXDH_MUTEX_T *p_ind_mutex = NULL; > + > + rc = zxdh_np_dev_opr_mutex_get(dev_id, ZXDH_DEV_MUTEX_T_SMMU0, > &p_ind_mutex); > + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get"); > + > + rc = zxdh_np_comm_mutex_lock(p_ind_mutex); > + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock"); > + > + rc = zxdh_np_se_done_status_check(dev_id, > ZXDH_SMMU0_SMMU0_WR_ARB_CPU_RDYR, 0); > + ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, > "zxdh_np_se_done_status_check", p_ind_mutex); > + > + if (rd_clr_mode == ZXDH_RD_MODE_HOLD) { > + cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD; > + cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_HOLD; > + cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b; > + > + switch (rd_mode) { > + case ZXDH_ERAM128_OPR_128b: > + { > + if ((0xFFFFFFFF - (base_addr)) < (index)) { > + rc = zxdh_np_comm_mutex_unlock(p_ind_mutex); > + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, > "zxdh_np_comm_mutex_unlock"); > + PMD_DRV_LOG(ERR, "%s : index 0x%x is invalid!", > __func__, index); > + return ZXDH_PAR_CHK_INVALID_INDEX; > + } > + if (base_addr + index > > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) { > + PMD_DRV_LOG(ERR, "%s : index out of range !", > __func__); > + rc = zxdh_np_comm_mutex_unlock(p_ind_mutex); > + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, > "zxdh_np_comm_mutex_unlock"); > + return ZXDH_ERR; > + } The error paths here are a bit of a mess. Do you really have to check return value of mutex_unlock if already have an error?