1 // SPDX-License-Identifier: GPL-2.0 2 // Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. 3 4 #include <linux/delay.h> 5 6 #include "hinic3_hw_comm.h" 7 #include "hinic3_hwdev.h" 8 #include "hinic3_hwif.h" 9 #include "hinic3_mbox.h" 10 11 int hinic3_set_interrupt_cfg_direct(struct hinic3_hwdev *hwdev, 12 const struct hinic3_interrupt_info *info) 13 { 14 struct comm_cmd_cfg_msix_ctrl_reg msix_cfg = {}; 15 struct mgmt_msg_params msg_params = {}; 16 int err; 17 18 msix_cfg.func_id = hinic3_global_func_id(hwdev); 19 msix_cfg.msix_index = info->msix_index; 20 msix_cfg.opcode = MGMT_MSG_CMD_OP_SET; 21 22 msix_cfg.lli_credit_cnt = info->lli_credit_limit; 23 msix_cfg.lli_timer_cnt = info->lli_timer_cfg; 24 msix_cfg.pending_cnt = info->pending_limit; 25 msix_cfg.coalesce_timer_cnt = info->coalesc_timer_cfg; 26 msix_cfg.resend_timer_cnt = info->resend_timer_cfg; 27 28 mgmt_msg_params_init_default(&msg_params, &msix_cfg, sizeof(msix_cfg)); 29 30 err = hinic3_send_mbox_to_mgmt(hwdev, MGMT_MOD_COMM, 31 COMM_CMD_CFG_MSIX_CTRL_REG, &msg_params); 32 if (err || msix_cfg.head.status) { 33 dev_err(hwdev->dev, 34 "Failed to set interrupt config, err: %d, status: 0x%x\n", 35 err, msix_cfg.head.status); 36 return -EINVAL; 37 } 38 39 return 0; 40 } 41 42 int hinic3_func_reset(struct hinic3_hwdev *hwdev, u16 func_id, u64 reset_flag) 43 { 44 struct comm_cmd_func_reset func_reset = {}; 45 struct mgmt_msg_params msg_params = {}; 46 int err; 47 48 func_reset.func_id = func_id; 49 func_reset.reset_flag = reset_flag; 50 51 mgmt_msg_params_init_default(&msg_params, &func_reset, 52 sizeof(func_reset)); 53 54 err = hinic3_send_mbox_to_mgmt(hwdev, MGMT_MOD_COMM, 55 COMM_CMD_FUNC_RESET, &msg_params); 56 if (err || func_reset.head.status) { 57 dev_err(hwdev->dev, "Failed to reset func resources, reset_flag 0x%llx, err: %d, status: 0x%x\n", 58 reset_flag, err, func_reset.head.status); 59 return -EIO; 60 } 61 62 return 0; 63 } 64