13988ab0eSWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause 253e6f86cSMin Hu (Connor) * Copyright(c) 2018-2021 HiSilicon Limited. 33988ab0eSWei Hu (Xavier) */ 43988ab0eSWei Hu (Xavier) 53988ab0eSWei Hu (Xavier) #include <rte_alarm.h> 63988ab0eSWei Hu (Xavier) #include <rte_cycles.h> 73988ab0eSWei Hu (Xavier) #include <rte_ethdev.h> 83988ab0eSWei Hu (Xavier) #include <rte_io.h> 93988ab0eSWei Hu (Xavier) #include <rte_malloc.h> 103988ab0eSWei Hu (Xavier) 11a4c7152dSHuisong Li #include "hns3_common.h" 123988ab0eSWei Hu (Xavier) #include "hns3_logs.h" 133988ab0eSWei Hu (Xavier) #include "hns3_regs.h" 143988ab0eSWei Hu (Xavier) #include "hns3_rxtx.h" 151c757dd5SChengwen Feng #include "hns3_intr.h" 163988ab0eSWei Hu (Xavier) 173988ab0eSWei Hu (Xavier) #define SWITCH_CONTEXT_US 10 183988ab0eSWei Hu (Xavier) 192790c646SWei Hu (Xavier) static const char *reset_string[HNS3_MAX_RESET] = { 201c1eb759SHongbo Zheng "flr", "vf_func", "vf_pf_func", "vf_full", "vf_global", 211c1eb759SHongbo Zheng "pf_func", "global", "IMP", "none", 222790c646SWei Hu (Xavier) }; 232790c646SWei Hu (Xavier) 24f53a793bSWei Hu (Xavier) static const struct hns3_hw_error mac_afifo_tnl_int[] = { 25a3e124faSHongbo Zheng { 26a3e124faSHongbo Zheng .int_msk = BIT(0), 27d3d31324SHongbo Zheng .msg = "egu_cge_afifo_ecc_1bit_err", 28a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 29a3e124faSHongbo Zheng }, { 30a3e124faSHongbo Zheng .int_msk = BIT(1), 31d3d31324SHongbo Zheng .msg = "egu_cge_afifo_ecc_mbit_err", 32a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 33a3e124faSHongbo Zheng }, { 34a3e124faSHongbo Zheng .int_msk = BIT(2), 35d3d31324SHongbo Zheng .msg = "egu_lge_afifo_ecc_1bit_err", 36a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 37a3e124faSHongbo Zheng }, { 38a3e124faSHongbo Zheng .int_msk = BIT(3), 39d3d31324SHongbo Zheng .msg = "egu_lge_afifo_ecc_mbit_err", 40a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 41a3e124faSHongbo Zheng }, { 42a3e124faSHongbo Zheng .int_msk = BIT(4), 43d3d31324SHongbo Zheng .msg = "cge_igu_afifo_ecc_1bit_err", 44a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 45a3e124faSHongbo Zheng }, { 46a3e124faSHongbo Zheng .int_msk = BIT(5), 47d3d31324SHongbo Zheng .msg = "cge_igu_afifo_ecc_mbit_err", 48a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 49a3e124faSHongbo Zheng }, { 50a3e124faSHongbo Zheng .int_msk = BIT(6), 51d3d31324SHongbo Zheng .msg = "lge_igu_afifo_ecc_1bit_err", 52a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 53a3e124faSHongbo Zheng }, { 54a3e124faSHongbo Zheng .int_msk = BIT(7), 55d3d31324SHongbo Zheng .msg = "lge_igu_afifo_ecc_mbit_err", 56a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 57a3e124faSHongbo Zheng }, { 58a3e124faSHongbo Zheng .int_msk = BIT(8), 59d3d31324SHongbo Zheng .msg = "cge_igu_afifo_overflow_err", 60a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 61a3e124faSHongbo Zheng }, { 62a3e124faSHongbo Zheng .int_msk = BIT(9), 63d3d31324SHongbo Zheng .msg = "lge_igu_afifo_overflow_err", 64a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 65a3e124faSHongbo Zheng }, { 66a3e124faSHongbo Zheng .int_msk = BIT(10), 67d3d31324SHongbo Zheng .msg = "egu_cge_afifo_underrun_err", 68a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 69a3e124faSHongbo Zheng }, { 70a3e124faSHongbo Zheng .int_msk = BIT(11), 71d3d31324SHongbo Zheng .msg = "egu_lge_afifo_underrun_err", 72a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 73a3e124faSHongbo Zheng }, { 74a3e124faSHongbo Zheng .int_msk = BIT(12), 75d3d31324SHongbo Zheng .msg = "egu_ge_afifo_underrun_err", 76a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 77a3e124faSHongbo Zheng }, { 78a3e124faSHongbo Zheng .int_msk = BIT(13), 79d3d31324SHongbo Zheng .msg = "ge_igu_afifo_overflow_err", 80a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 81a3e124faSHongbo Zheng }, { 82a3e124faSHongbo Zheng .int_msk = 0, 83d3d31324SHongbo Zheng .msg = NULL, 84a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 85a3e124faSHongbo Zheng } 863988ab0eSWei Hu (Xavier) }; 873988ab0eSWei Hu (Xavier) 88f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st1[] = { 89a3e124faSHongbo Zheng { 90a3e124faSHongbo Zheng .int_msk = 0xFFFFFFFF, 91d3d31324SHongbo Zheng .msg = "rpu_rx_pkt_ecc_mbit_err", 92a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 93a3e124faSHongbo Zheng }, { 94a3e124faSHongbo Zheng .int_msk = 0, 95d3d31324SHongbo Zheng .msg = NULL, 96a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 97a3e124faSHongbo Zheng } 98f53a793bSWei Hu (Xavier) }; 99f53a793bSWei Hu (Xavier) 100f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st2_ras[] = { 101a3e124faSHongbo Zheng { 102a3e124faSHongbo Zheng .int_msk = BIT(13), 103d3d31324SHongbo Zheng .msg = "rpu_rx_pkt_bit32_ecc_mbit_err", 104a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 105a3e124faSHongbo Zheng }, { 106a3e124faSHongbo Zheng .int_msk = BIT(14), 107d3d31324SHongbo Zheng .msg = "rpu_rx_pkt_bit33_ecc_mbit_err", 108a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 109a3e124faSHongbo Zheng }, { 110a3e124faSHongbo Zheng .int_msk = BIT(15), 111d3d31324SHongbo Zheng .msg = "rpu_rx_pkt_bit34_ecc_mbit_err", 112a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 113a3e124faSHongbo Zheng }, { 114a3e124faSHongbo Zheng .int_msk = BIT(16), 115d3d31324SHongbo Zheng .msg = "rpu_rx_pkt_bit35_ecc_mbit_err", 116a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 117a3e124faSHongbo Zheng }, { 118a3e124faSHongbo Zheng .int_msk = BIT(17), 119d3d31324SHongbo Zheng .msg = "rcb_tx_ring_ecc_mbit_err", 120a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 121a3e124faSHongbo Zheng }, { 122a3e124faSHongbo Zheng .int_msk = BIT(18), 123d3d31324SHongbo Zheng .msg = "rcb_rx_ring_ecc_mbit_err", 124a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 125a3e124faSHongbo Zheng }, { 126a3e124faSHongbo Zheng .int_msk = BIT(19), 127d3d31324SHongbo Zheng .msg = "rcb_tx_fbd_ecc_mbit_err", 128a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 129a3e124faSHongbo Zheng }, { 130a3e124faSHongbo Zheng .int_msk = BIT(20), 131d3d31324SHongbo Zheng .msg = "rcb_rx_ebd_ecc_mbit_err", 132a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 133a3e124faSHongbo Zheng }, { 134a3e124faSHongbo Zheng .int_msk = BIT(21), 135d3d31324SHongbo Zheng .msg = "rcb_tso_info_ecc_mbit_err", 136a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 137a3e124faSHongbo Zheng }, { 138a3e124faSHongbo Zheng .int_msk = BIT(22), 139d3d31324SHongbo Zheng .msg = "rcb_tx_int_info_ecc_mbit_err", 140a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 141a3e124faSHongbo Zheng }, { 142a3e124faSHongbo Zheng .int_msk = BIT(23), 143d3d31324SHongbo Zheng .msg = "rcb_rx_int_info_ecc_mbit_err", 144a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 145a3e124faSHongbo Zheng }, { 146a3e124faSHongbo Zheng .int_msk = BIT(24), 147d3d31324SHongbo Zheng .msg = "tpu_tx_pkt_0_ecc_mbit_err", 148a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 149a3e124faSHongbo Zheng }, { 150a3e124faSHongbo Zheng .int_msk = BIT(25), 151d3d31324SHongbo Zheng .msg = "tpu_tx_pkt_1_ecc_mbit_err", 152a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 153a3e124faSHongbo Zheng }, { 154a3e124faSHongbo Zheng .int_msk = BIT(26), 155d3d31324SHongbo Zheng .msg = "rd_bus_err", 156a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 157a3e124faSHongbo Zheng }, { 158a3e124faSHongbo Zheng .int_msk = BIT(27), 159d3d31324SHongbo Zheng .msg = "wr_bus_err", 160a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 161a3e124faSHongbo Zheng }, { 162a3e124faSHongbo Zheng .int_msk = BIT(30), 163d3d31324SHongbo Zheng .msg = "ooo_ecc_err_detect", 164a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 165a3e124faSHongbo Zheng }, { 166a3e124faSHongbo Zheng .int_msk = BIT(31), 167d3d31324SHongbo Zheng .msg = "ooo_ecc_err_multpl", 168a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 169a3e124faSHongbo Zheng }, { 170a3e124faSHongbo Zheng .int_msk = 0, 171d3d31324SHongbo Zheng .msg = NULL, 172a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 173a3e124faSHongbo Zheng } 1743988ab0eSWei Hu (Xavier) }; 1753988ab0eSWei Hu (Xavier) 176f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st2_msix[] = { 177a3e124faSHongbo Zheng { 178a3e124faSHongbo Zheng .int_msk = BIT(29), 179d3d31324SHongbo Zheng .msg = "rx_q_search_miss", 180a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 181a3e124faSHongbo Zheng }, { 182a3e124faSHongbo Zheng .int_msk = 0, 183d3d31324SHongbo Zheng .msg = NULL, 184a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 185a3e124faSHongbo Zheng } 1863988ab0eSWei Hu (Xavier) }; 1873988ab0eSWei Hu (Xavier) 188f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_port_based_pf_int[] = { 189a3e124faSHongbo Zheng { 190a3e124faSHongbo Zheng .int_msk = BIT(0), 191d3d31324SHongbo Zheng .msg = "roc_pkt_without_key_port", 192a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 193a3e124faSHongbo Zheng }, { 194a3e124faSHongbo Zheng .int_msk = BIT(9), 195d3d31324SHongbo Zheng .msg = "low_water_line_err_port", 196a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 197a3e124faSHongbo Zheng }, { 198a3e124faSHongbo Zheng .int_msk = 0, 199d3d31324SHongbo Zheng .msg = NULL, 200a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 201a3e124faSHongbo Zheng } 202f53a793bSWei Hu (Xavier) }; 203f53a793bSWei Hu (Xavier) 204f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppp_pf_abnormal_int[] = { 205a3e124faSHongbo Zheng { 206a3e124faSHongbo Zheng .int_msk = BIT(0), 207d3d31324SHongbo Zheng .msg = "tx_vlan_tag_err", 208a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 209a3e124faSHongbo Zheng }, { 210a3e124faSHongbo Zheng .int_msk = BIT(1), 211d3d31324SHongbo Zheng .msg = "rss_list_tc_unassigned_queue_err", 212a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 213a3e124faSHongbo Zheng }, { 214a3e124faSHongbo Zheng .int_msk = 0, 215d3d31324SHongbo Zheng .msg = NULL, 216a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 217a3e124faSHongbo Zheng } 2183988ab0eSWei Hu (Xavier) }; 2193988ab0eSWei Hu (Xavier) 220f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_pf_abnormal_int_ras[] = { 221a3e124faSHongbo Zheng { 222a3e124faSHongbo Zheng .int_msk = BIT(3), 223d3d31324SHongbo Zheng .msg = "tx_rd_fbd_poison", 224a3e124faSHongbo Zheng .reset_level = HNS3_FUNC_RESET 225a3e124faSHongbo Zheng }, { 226a3e124faSHongbo Zheng .int_msk = BIT(4), 227d3d31324SHongbo Zheng .msg = "rx_rd_ebd_poison", 228a3e124faSHongbo Zheng .reset_level = HNS3_FUNC_RESET 229a3e124faSHongbo Zheng }, { 230a3e124faSHongbo Zheng .int_msk = 0, 231d3d31324SHongbo Zheng .msg = NULL, 232a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 233a3e124faSHongbo Zheng } 234f53a793bSWei Hu (Xavier) }; 235f53a793bSWei Hu (Xavier) 236f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_pf_abnormal_int_msix[] = { 237a3e124faSHongbo Zheng { 238a3e124faSHongbo Zheng .int_msk = BIT(0), 239d3d31324SHongbo Zheng .msg = "over_8bd_no_fe", 240a3e124faSHongbo Zheng .reset_level = HNS3_FUNC_RESET 241a3e124faSHongbo Zheng }, { 242a3e124faSHongbo Zheng .int_msk = BIT(1), 243d3d31324SHongbo Zheng .msg = "tso_mss_cmp_min_err", 244a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 245a3e124faSHongbo Zheng }, { 246a3e124faSHongbo Zheng .int_msk = BIT(2), 247d3d31324SHongbo Zheng .msg = "tso_mss_cmp_max_err", 248a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 249a3e124faSHongbo Zheng }, { 250a3e124faSHongbo Zheng .int_msk = BIT(5), 251d3d31324SHongbo Zheng .msg = "buf_wait_timeout", 252a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 253a3e124faSHongbo Zheng }, { 254a3e124faSHongbo Zheng .int_msk = 0, 255d3d31324SHongbo Zheng .msg = NULL, 256a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 257a3e124faSHongbo Zheng } 2583988ab0eSWei Hu (Xavier) }; 2593988ab0eSWei Hu (Xavier) 260f53a793bSWei Hu (Xavier) static const struct hns3_hw_error imp_tcm_ecc_int[] = { 261a3e124faSHongbo Zheng { 262a3e124faSHongbo Zheng .int_msk = BIT(1), 263d3d31324SHongbo Zheng .msg = "imp_itcm0_ecc_mbit_err", 264a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 265a3e124faSHongbo Zheng }, { 266a3e124faSHongbo Zheng .int_msk = BIT(3), 267d3d31324SHongbo Zheng .msg = "imp_itcm1_ecc_mbit_err", 268a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 269a3e124faSHongbo Zheng }, { 270a3e124faSHongbo Zheng .int_msk = BIT(5), 271d3d31324SHongbo Zheng .msg = "imp_itcm2_ecc_mbit_err", 272a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 273a3e124faSHongbo Zheng }, { 274a3e124faSHongbo Zheng .int_msk = BIT(7), 275d3d31324SHongbo Zheng .msg = "imp_itcm3_ecc_mbit_err", 276a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 277a3e124faSHongbo Zheng }, { 278a3e124faSHongbo Zheng .int_msk = BIT(9), 279d3d31324SHongbo Zheng .msg = "imp_dtcm0_mem0_ecc_mbit_err", 280a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 281a3e124faSHongbo Zheng }, { 282a3e124faSHongbo Zheng .int_msk = BIT(11), 283d3d31324SHongbo Zheng .msg = "imp_dtcm0_mem1_ecc_mbit_err", 284a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 285a3e124faSHongbo Zheng }, { 286a3e124faSHongbo Zheng .int_msk = BIT(13), 287d3d31324SHongbo Zheng .msg = "imp_dtcm1_mem0_ecc_mbit_err", 288a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 289a3e124faSHongbo Zheng }, { 290a3e124faSHongbo Zheng .int_msk = BIT(15), 291d3d31324SHongbo Zheng .msg = "imp_dtcm1_mem1_ecc_mbit_err", 292a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 293a3e124faSHongbo Zheng }, { 294a3e124faSHongbo Zheng .int_msk = BIT(17), 295d3d31324SHongbo Zheng .msg = "imp_itcm4_ecc_mbit_err", 296a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 297a3e124faSHongbo Zheng }, { 298a3e124faSHongbo Zheng .int_msk = 0, 299d3d31324SHongbo Zheng .msg = NULL, 300a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 301a3e124faSHongbo Zheng } 302f53a793bSWei Hu (Xavier) }; 303f53a793bSWei Hu (Xavier) 304f53a793bSWei Hu (Xavier) static const struct hns3_hw_error cmdq_mem_ecc_int[] = { 305a3e124faSHongbo Zheng { 306a3e124faSHongbo Zheng .int_msk = BIT(1), 307d3d31324SHongbo Zheng .msg = "cmdq_nic_rx_depth_ecc_mbit_err", 308a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 309a3e124faSHongbo Zheng }, { 310a3e124faSHongbo Zheng .int_msk = BIT(3), 311d3d31324SHongbo Zheng .msg = "cmdq_nic_tx_depth_ecc_mbit_err", 312a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 313a3e124faSHongbo Zheng }, { 314a3e124faSHongbo Zheng .int_msk = BIT(5), 315d3d31324SHongbo Zheng .msg = "cmdq_nic_rx_tail_ecc_mbit_err", 316a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 317a3e124faSHongbo Zheng }, { 318a3e124faSHongbo Zheng .int_msk = BIT(7), 319d3d31324SHongbo Zheng .msg = "cmdq_nic_tx_tail_ecc_mbit_err", 320a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 321a3e124faSHongbo Zheng }, { 322a3e124faSHongbo Zheng .int_msk = BIT(9), 323d3d31324SHongbo Zheng .msg = "cmdq_nic_rx_head_ecc_mbit_err", 324a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 325a3e124faSHongbo Zheng }, { 326a3e124faSHongbo Zheng .int_msk = BIT(11), 327d3d31324SHongbo Zheng .msg = "cmdq_nic_tx_head_ecc_mbit_err", 328a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 329a3e124faSHongbo Zheng }, { 330a3e124faSHongbo Zheng .int_msk = BIT(13), 331d3d31324SHongbo Zheng .msg = "cmdq_nic_rx_addr_ecc_mbit_err", 332a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 333a3e124faSHongbo Zheng }, { 334a3e124faSHongbo Zheng .int_msk = BIT(15), 335d3d31324SHongbo Zheng .msg = "cmdq_nic_tx_addr_ecc_mbit_err", 336a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 337a3e124faSHongbo Zheng }, { 338a3e124faSHongbo Zheng .int_msk = 0, 339d3d31324SHongbo Zheng .msg = NULL, 340a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 341a3e124faSHongbo Zheng } 342f53a793bSWei Hu (Xavier) }; 343f53a793bSWei Hu (Xavier) 344f53a793bSWei Hu (Xavier) static const struct hns3_hw_error tqp_int_ecc_int[] = { 345a3e124faSHongbo Zheng { 346a3e124faSHongbo Zheng .int_msk = BIT(6), 347d3d31324SHongbo Zheng .msg = "tqp_int_cfg_even_ecc_mbit_err", 348a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 349a3e124faSHongbo Zheng }, { 350a3e124faSHongbo Zheng .int_msk = BIT(7), 351d3d31324SHongbo Zheng .msg = "tqp_int_cfg_odd_ecc_mbit_err", 352a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 353a3e124faSHongbo Zheng }, { 354a3e124faSHongbo Zheng .int_msk = BIT(8), 355d3d31324SHongbo Zheng .msg = "tqp_int_ctrl_even_ecc_mbit_err", 356a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 357a3e124faSHongbo Zheng }, { 358a3e124faSHongbo Zheng .int_msk = BIT(9), 359d3d31324SHongbo Zheng .msg = "tqp_int_ctrl_odd_ecc_mbit_err", 360a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 361a3e124faSHongbo Zheng }, { 362a3e124faSHongbo Zheng .int_msk = BIT(10), 363d3d31324SHongbo Zheng .msg = "tx_queue_scan_int_ecc_mbit_err", 364a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 365a3e124faSHongbo Zheng }, { 366a3e124faSHongbo Zheng .int_msk = BIT(11), 367d3d31324SHongbo Zheng .msg = "rx_queue_scan_int_ecc_mbit_err", 368a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 369a3e124faSHongbo Zheng }, { 370a3e124faSHongbo Zheng .int_msk = 0, 371d3d31324SHongbo Zheng .msg = NULL, 372a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 373a3e124faSHongbo Zheng } 374f53a793bSWei Hu (Xavier) }; 375f53a793bSWei Hu (Xavier) 376f53a793bSWei Hu (Xavier) static const struct hns3_hw_error imp_rd_poison_int[] = { 377a3e124faSHongbo Zheng { 378a3e124faSHongbo Zheng .int_msk = BIT(0), 379d3d31324SHongbo Zheng .msg = "imp_rd_poison_int", 380a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 381a3e124faSHongbo Zheng }, { 382a3e124faSHongbo Zheng .int_msk = 0, 383d3d31324SHongbo Zheng .msg = NULL, 384a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 385a3e124faSHongbo Zheng } 386f53a793bSWei Hu (Xavier) }; 387f53a793bSWei Hu (Xavier) 388f53a793bSWei Hu (Xavier) #define HNS3_SSU_MEM_ECC_ERR(x) \ 389a3e124faSHongbo Zheng { \ 390a3e124faSHongbo Zheng .int_msk = BIT(x), \ 391d3d31324SHongbo Zheng .msg = "ssu_mem" #x "_ecc_mbit_err", \ 392a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET \ 393a3e124faSHongbo Zheng } 394f53a793bSWei Hu (Xavier) 395f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_ecc_multi_bit_int_0[] = { 396f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(0), 397f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(1), 398f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(2), 399f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(3), 400f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(4), 401f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(5), 402f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(6), 403f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(7), 404f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(8), 405f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(9), 406f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(10), 407f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(11), 408f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(12), 409f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(13), 410f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(14), 411f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(15), 412f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(16), 413f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(17), 414f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(18), 415f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(19), 416f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(20), 417f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(21), 418f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(22), 419f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(23), 420f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(24), 421f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(25), 422f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(26), 423f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(27), 424f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(28), 425f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(29), 426f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(30), 427f53a793bSWei Hu (Xavier) HNS3_SSU_MEM_ECC_ERR(31), 428d3d31324SHongbo Zheng { .int_msk = 0, 429d3d31324SHongbo Zheng .msg = NULL, 430f53a793bSWei Hu (Xavier) .reset_level = HNS3_NONE_RESET} 431f53a793bSWei Hu (Xavier) }; 432f53a793bSWei Hu (Xavier) 433f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_ecc_multi_bit_int_1[] = { 434a3e124faSHongbo Zheng { 435a3e124faSHongbo Zheng .int_msk = BIT(0), 436d3d31324SHongbo Zheng .msg = "ssu_mem32_ecc_mbit_err", 437a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 438a3e124faSHongbo Zheng }, { 439a3e124faSHongbo Zheng .int_msk = 0, 440d3d31324SHongbo Zheng .msg = NULL, 441a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 442a3e124faSHongbo Zheng } 443f53a793bSWei Hu (Xavier) }; 444f53a793bSWei Hu (Xavier) 445f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_common_ecc_int[] = { 446a3e124faSHongbo Zheng { 447a3e124faSHongbo Zheng .int_msk = BIT(0), 448d3d31324SHongbo Zheng .msg = "buf_sum_err", 449a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 450a3e124faSHongbo Zheng }, { 451a3e124faSHongbo Zheng .int_msk = BIT(1), 452d3d31324SHongbo Zheng .msg = "ppp_mb_num_err", 453a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 454a3e124faSHongbo Zheng }, { 455a3e124faSHongbo Zheng .int_msk = BIT(2), 456d3d31324SHongbo Zheng .msg = "ppp_mbid_err", 457a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 458a3e124faSHongbo Zheng }, { 459a3e124faSHongbo Zheng .int_msk = BIT(3), 460d3d31324SHongbo Zheng .msg = "ppp_rlt_mac_err", 461a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 462a3e124faSHongbo Zheng }, { 463a3e124faSHongbo Zheng .int_msk = BIT(4), 464d3d31324SHongbo Zheng .msg = "ppp_rlt_host_err", 465a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 466a3e124faSHongbo Zheng }, { 467a3e124faSHongbo Zheng .int_msk = BIT(5), 468d3d31324SHongbo Zheng .msg = "cks_edit_position_err", 469a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 470a3e124faSHongbo Zheng }, { 471a3e124faSHongbo Zheng .int_msk = BIT(6), 472d3d31324SHongbo Zheng .msg = "cks_edit_condition_err", 473a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 474a3e124faSHongbo Zheng }, { 475a3e124faSHongbo Zheng .int_msk = BIT(7), 476d3d31324SHongbo Zheng .msg = "vlan_edit_condition_err", 477a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 478a3e124faSHongbo Zheng }, { 479a3e124faSHongbo Zheng .int_msk = BIT(8), 480d3d31324SHongbo Zheng .msg = "vlan_num_ot_err", 481a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 482a3e124faSHongbo Zheng }, { 483a3e124faSHongbo Zheng .int_msk = BIT(9), 484d3d31324SHongbo Zheng .msg = "vlan_num_in_err", 485a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 486a3e124faSHongbo Zheng }, { 487a3e124faSHongbo Zheng .int_msk = 0, 488d3d31324SHongbo Zheng .msg = NULL, 489a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 490a3e124faSHongbo Zheng } 491f53a793bSWei Hu (Xavier) }; 492f53a793bSWei Hu (Xavier) 493f53a793bSWei Hu (Xavier) static const struct hns3_hw_error igu_int[] = { 494a3e124faSHongbo Zheng { 495a3e124faSHongbo Zheng .int_msk = BIT(0), 496d3d31324SHongbo Zheng .msg = "igu_rx_buf0_ecc_mbit_err", 497a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 498a3e124faSHongbo Zheng }, { 499a3e124faSHongbo Zheng .int_msk = BIT(2), 500d3d31324SHongbo Zheng .msg = "igu_rx_buf1_ecc_mbit_err", 501a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 502a3e124faSHongbo Zheng }, { 503a3e124faSHongbo Zheng .int_msk = 0, 504d3d31324SHongbo Zheng .msg = NULL, 505a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 506a3e124faSHongbo Zheng } 507f53a793bSWei Hu (Xavier) }; 508f53a793bSWei Hu (Xavier) 509f53a793bSWei Hu (Xavier) static const struct hns3_hw_error msix_ecc_int[] = { 510a3e124faSHongbo Zheng { 511a3e124faSHongbo Zheng .int_msk = BIT(1), 512d3d31324SHongbo Zheng .msg = "msix_nic_ecc_mbit_err", 513a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 514a3e124faSHongbo Zheng }, { 515a3e124faSHongbo Zheng .int_msk = 0, 516d3d31324SHongbo Zheng .msg = NULL, 517a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 518a3e124faSHongbo Zheng } 519f53a793bSWei Hu (Xavier) }; 520f53a793bSWei Hu (Xavier) 521f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppp_mpf_abnormal_int_st1[] = { 522a3e124faSHongbo Zheng { 523a3e124faSHongbo Zheng .int_msk = BIT(0), 524d3d31324SHongbo Zheng .msg = "vf_vlan_ad_mem_ecc_mbit_err", 525a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 526a3e124faSHongbo Zheng }, { 527a3e124faSHongbo Zheng .int_msk = BIT(1), 528d3d31324SHongbo Zheng .msg = "umv_mcast_group_mem_ecc_mbit_err", 529a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 530a3e124faSHongbo Zheng }, { 531a3e124faSHongbo Zheng .int_msk = BIT(2), 532d3d31324SHongbo Zheng .msg = "umv_key_mem0_ecc_mbit_err", 533a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 534a3e124faSHongbo Zheng }, { 535a3e124faSHongbo Zheng .int_msk = BIT(3), 536d3d31324SHongbo Zheng .msg = "umv_key_mem1_ecc_mbit_err", 537a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 538a3e124faSHongbo Zheng }, { 539a3e124faSHongbo Zheng .int_msk = BIT(4), 540d3d31324SHongbo Zheng .msg = "umv_key_mem2_ecc_mbit_err", 541a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 542a3e124faSHongbo Zheng }, { 543a3e124faSHongbo Zheng .int_msk = BIT(5), 544d3d31324SHongbo Zheng .msg = "umv_key_mem3_ecc_mbit_err", 545a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 546a3e124faSHongbo Zheng }, { 547a3e124faSHongbo Zheng .int_msk = BIT(6), 548d3d31324SHongbo Zheng .msg = "umv_ad_mem_ecc_mbit_err", 549a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 550a3e124faSHongbo Zheng }, { 551a3e124faSHongbo Zheng .int_msk = BIT(7), 552d3d31324SHongbo Zheng .msg = "rss_tc_mode_mem_ecc_mbit_err", 553a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 554a3e124faSHongbo Zheng }, { 555a3e124faSHongbo Zheng .int_msk = BIT(8), 556d3d31324SHongbo Zheng .msg = "rss_idt_mem0_ecc_mbit_err", 557a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 558a3e124faSHongbo Zheng }, { 559a3e124faSHongbo Zheng .int_msk = BIT(9), 560d3d31324SHongbo Zheng .msg = "rss_idt_mem1_ecc_mbit_err", 561a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 562a3e124faSHongbo Zheng }, { 563a3e124faSHongbo Zheng .int_msk = BIT(10), 564d3d31324SHongbo Zheng .msg = "rss_idt_mem2_ecc_mbit_err", 565a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 566a3e124faSHongbo Zheng }, { 567a3e124faSHongbo Zheng .int_msk = BIT(11), 568d3d31324SHongbo Zheng .msg = "rss_idt_mem3_ecc_mbit_err", 569a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 570a3e124faSHongbo Zheng }, { 571a3e124faSHongbo Zheng .int_msk = BIT(12), 572d3d31324SHongbo Zheng .msg = "rss_idt_mem4_ecc_mbit_err", 573a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 574a3e124faSHongbo Zheng }, { 575a3e124faSHongbo Zheng .int_msk = BIT(13), 576d3d31324SHongbo Zheng .msg = "rss_idt_mem5_ecc_mbit_err", 577a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 578a3e124faSHongbo Zheng }, { 579a3e124faSHongbo Zheng .int_msk = BIT(14), 580d3d31324SHongbo Zheng .msg = "rss_idt_mem6_ecc_mbit_err", 581a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 582a3e124faSHongbo Zheng }, { 583a3e124faSHongbo Zheng .int_msk = BIT(15), 584d3d31324SHongbo Zheng .msg = "rss_idt_mem7_ecc_mbit_err", 585a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 586a3e124faSHongbo Zheng }, { 587a3e124faSHongbo Zheng .int_msk = BIT(16), 588d3d31324SHongbo Zheng .msg = "rss_idt_mem8_ecc_mbit_err", 589a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 590a3e124faSHongbo Zheng }, { 591a3e124faSHongbo Zheng .int_msk = BIT(17), 592d3d31324SHongbo Zheng .msg = "rss_idt_mem9_ecc_mbit_err", 593a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 594a3e124faSHongbo Zheng }, { 595a3e124faSHongbo Zheng .int_msk = BIT(18), 596d3d31324SHongbo Zheng .msg = "rss_idt_mem10_ecc_m1bit_err", 597a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 598a3e124faSHongbo Zheng }, { 599a3e124faSHongbo Zheng .int_msk = BIT(19), 600d3d31324SHongbo Zheng .msg = "rss_idt_mem11_ecc_mbit_err", 601a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 602a3e124faSHongbo Zheng }, { 603a3e124faSHongbo Zheng .int_msk = BIT(20), 604d3d31324SHongbo Zheng .msg = "rss_idt_mem12_ecc_mbit_err", 605a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 606a3e124faSHongbo Zheng }, { 607a3e124faSHongbo Zheng .int_msk = BIT(21), 608d3d31324SHongbo Zheng .msg = "rss_idt_mem13_ecc_mbit_err", 609a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 610a3e124faSHongbo Zheng }, { 611a3e124faSHongbo Zheng .int_msk = BIT(22), 612d3d31324SHongbo Zheng .msg = "rss_idt_mem14_ecc_mbit_err", 613a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 614a3e124faSHongbo Zheng }, { 615a3e124faSHongbo Zheng .int_msk = BIT(23), 616d3d31324SHongbo Zheng .msg = "rss_idt_mem15_ecc_mbit_err", 617a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 618a3e124faSHongbo Zheng }, { 619a3e124faSHongbo Zheng .int_msk = BIT(24), 620d3d31324SHongbo Zheng .msg = "port_vlan_mem_ecc_mbit_err", 621a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 622a3e124faSHongbo Zheng }, { 623a3e124faSHongbo Zheng .int_msk = BIT(25), 624d3d31324SHongbo Zheng .msg = "mcast_linear_table_mem_ecc_mbit_err", 625a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 626a3e124faSHongbo Zheng }, { 627a3e124faSHongbo Zheng .int_msk = BIT(26), 628d3d31324SHongbo Zheng .msg = "mcast_result_mem_ecc_mbit_err", 629a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 630a3e124faSHongbo Zheng }, { 631a3e124faSHongbo Zheng .int_msk = BIT(27), 632d3d31324SHongbo Zheng .msg = "flow_director_ad_mem0_ecc_mbit_err", 633a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 634a3e124faSHongbo Zheng }, { 635a3e124faSHongbo Zheng .int_msk = BIT(28), 636d3d31324SHongbo Zheng .msg = "flow_director_ad_mem1_ecc_mbit_err", 637a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 638a3e124faSHongbo Zheng }, { 639a3e124faSHongbo Zheng .int_msk = BIT(29), 640d3d31324SHongbo Zheng .msg = "rx_vlan_tag_memory_ecc_mbit_err", 641a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 642a3e124faSHongbo Zheng }, { 643a3e124faSHongbo Zheng .int_msk = BIT(30), 644d3d31324SHongbo Zheng .msg = "Tx_UP_mapping_config_mem_ecc_mbit_err", 645a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 646a3e124faSHongbo Zheng }, { 647a3e124faSHongbo Zheng .int_msk = 0, 648d3d31324SHongbo Zheng .msg = NULL, 649a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 650a3e124faSHongbo Zheng } 651f53a793bSWei Hu (Xavier) }; 652f53a793bSWei Hu (Xavier) 653f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppp_mpf_abnormal_int_st3[] = { 654a3e124faSHongbo Zheng { 655a3e124faSHongbo Zheng .int_msk = BIT(0), 656d3d31324SHongbo Zheng .msg = "hfs_fifo_mem_ecc_mbit_err", 657a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 658a3e124faSHongbo Zheng }, { 659a3e124faSHongbo Zheng .int_msk = BIT(1), 660d3d31324SHongbo Zheng .msg = "rslt_descr_fifo_mem_ecc_mbit_err", 661a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 662a3e124faSHongbo Zheng }, { 663a3e124faSHongbo Zheng .int_msk = BIT(2), 664d3d31324SHongbo Zheng .msg = "tx_vlan_tag_mem_ecc_mbit_err", 665a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 666a3e124faSHongbo Zheng }, { 667a3e124faSHongbo Zheng .int_msk = BIT(3), 668d3d31324SHongbo Zheng .msg = "FD_CN0_memory_ecc_mbit_err", 669a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 670a3e124faSHongbo Zheng }, { 671a3e124faSHongbo Zheng .int_msk = BIT(4), 672d3d31324SHongbo Zheng .msg = "FD_CN1_memory_ecc_mbit_err", 673a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 674a3e124faSHongbo Zheng }, { 675a3e124faSHongbo Zheng .int_msk = BIT(5), 676d3d31324SHongbo Zheng .msg = "GRO_AD_memory_ecc_mbit_err", 677a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 678a3e124faSHongbo Zheng }, { 679a3e124faSHongbo Zheng .int_msk = 0, 680d3d31324SHongbo Zheng .msg = NULL, 681a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 682a3e124faSHongbo Zheng } 683f53a793bSWei Hu (Xavier) }; 684f53a793bSWei Hu (Xavier) 685f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ppu_mpf_abnormal_int_st3[] = { 686a3e124faSHongbo Zheng { 687a3e124faSHongbo Zheng .int_msk = BIT(4), 688d3d31324SHongbo Zheng .msg = "gro_bd_ecc_mbit_err", 689a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 690a3e124faSHongbo Zheng }, { 691a3e124faSHongbo Zheng .int_msk = BIT(5), 692d3d31324SHongbo Zheng .msg = "gro_context_ecc_mbit_err", 693a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 694a3e124faSHongbo Zheng }, { 695a3e124faSHongbo Zheng .int_msk = BIT(6), 696d3d31324SHongbo Zheng .msg = "rx_stash_cfg_ecc_mbit_err", 697a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 698a3e124faSHongbo Zheng }, { 699a3e124faSHongbo Zheng .int_msk = BIT(7), 700d3d31324SHongbo Zheng .msg = "axi_rd_fbd_ecc_mbit_err", 701a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 702a3e124faSHongbo Zheng }, { 703a3e124faSHongbo Zheng .int_msk = 0, 704d3d31324SHongbo Zheng .msg = NULL, 705a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 706a3e124faSHongbo Zheng } 707f53a793bSWei Hu (Xavier) }; 708f53a793bSWei Hu (Xavier) 709f53a793bSWei Hu (Xavier) static const struct hns3_hw_error tm_sch_int[] = { 710a3e124faSHongbo Zheng { 711a3e124faSHongbo Zheng .int_msk = BIT(1), 712d3d31324SHongbo Zheng .msg = "tm_sch_ecc_mbit_err", 713a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 714a3e124faSHongbo Zheng }, { 715a3e124faSHongbo Zheng .int_msk = BIT(2), 716d3d31324SHongbo Zheng .msg = "tm_sch_port_shap_sub_fifo_wr_err", 717a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 718a3e124faSHongbo Zheng }, { 719a3e124faSHongbo Zheng .int_msk = BIT(3), 720d3d31324SHongbo Zheng .msg = "tm_sch_port_shap_sub_fifo_rd_err", 721a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 722a3e124faSHongbo Zheng }, { 723a3e124faSHongbo Zheng .int_msk = BIT(4), 724d3d31324SHongbo Zheng .msg = "tm_sch_pg_pshap_sub_fifo_wr_err", 725a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 726a3e124faSHongbo Zheng }, { 727a3e124faSHongbo Zheng .int_msk = BIT(5), 728d3d31324SHongbo Zheng .msg = "tm_sch_pg_pshap_sub_fifo_rd_err", 729a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 730a3e124faSHongbo Zheng }, { 731a3e124faSHongbo Zheng .int_msk = BIT(6), 732d3d31324SHongbo Zheng .msg = "tm_sch_pg_cshap_sub_fifo_wr_err", 733a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 734a3e124faSHongbo Zheng }, { 735a3e124faSHongbo Zheng .int_msk = BIT(7), 736d3d31324SHongbo Zheng .msg = "tm_sch_pg_cshap_sub_fifo_rd_err", 737a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 738a3e124faSHongbo Zheng }, { 739a3e124faSHongbo Zheng .int_msk = BIT(8), 740d3d31324SHongbo Zheng .msg = "tm_sch_pri_pshap_sub_fifo_wr_err", 741a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 742a3e124faSHongbo Zheng }, { 743a3e124faSHongbo Zheng .int_msk = BIT(9), 744d3d31324SHongbo Zheng .msg = "tm_sch_pri_pshap_sub_fifo_rd_err", 745a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 746a3e124faSHongbo Zheng }, { 747a3e124faSHongbo Zheng .int_msk = BIT(10), 748d3d31324SHongbo Zheng .msg = "tm_sch_pri_cshap_sub_fifo_wr_err", 749a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 750a3e124faSHongbo Zheng }, { 751a3e124faSHongbo Zheng .int_msk = BIT(11), 752d3d31324SHongbo Zheng .msg = "tm_sch_pri_cshap_sub_fifo_rd_err", 753a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 754a3e124faSHongbo Zheng }, { 755a3e124faSHongbo Zheng .int_msk = BIT(12), 756d3d31324SHongbo Zheng .msg = "tm_sch_port_shap_offset_fifo_wr_err", 757a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 758a3e124faSHongbo Zheng }, { 759a3e124faSHongbo Zheng .int_msk = BIT(13), 760d3d31324SHongbo Zheng .msg = "tm_sch_port_shap_offset_fifo_rd_err", 761a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 762a3e124faSHongbo Zheng }, { 763a3e124faSHongbo Zheng .int_msk = BIT(14), 764d3d31324SHongbo Zheng .msg = "tm_sch_pg_pshap_offset_fifo_wr_err", 765a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 766a3e124faSHongbo Zheng }, { 767a3e124faSHongbo Zheng .int_msk = BIT(15), 768d3d31324SHongbo Zheng .msg = "tm_sch_pg_pshap_offset_fifo_rd_err", 769a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 770a3e124faSHongbo Zheng }, { 771a3e124faSHongbo Zheng .int_msk = BIT(16), 772d3d31324SHongbo Zheng .msg = "tm_sch_pg_cshap_offset_fifo_wr_err", 773a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 774a3e124faSHongbo Zheng }, { 775a3e124faSHongbo Zheng .int_msk = BIT(17), 776d3d31324SHongbo Zheng .msg = "tm_sch_pg_cshap_offset_fifo_rd_err", 777a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 778a3e124faSHongbo Zheng }, { 779a3e124faSHongbo Zheng .int_msk = BIT(18), 780d3d31324SHongbo Zheng .msg = "tm_sch_pri_pshap_offset_fifo_wr_err", 781a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 782a3e124faSHongbo Zheng }, { 783a3e124faSHongbo Zheng .int_msk = BIT(19), 784d3d31324SHongbo Zheng .msg = "tm_sch_pri_pshap_offset_fifo_rd_err", 785a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 786a3e124faSHongbo Zheng }, { 787a3e124faSHongbo Zheng .int_msk = BIT(20), 788d3d31324SHongbo Zheng .msg = "tm_sch_pri_cshap_offset_fifo_wr_err", 789a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 790a3e124faSHongbo Zheng }, { 791a3e124faSHongbo Zheng .int_msk = BIT(21), 792d3d31324SHongbo Zheng .msg = "tm_sch_pri_cshap_offset_fifo_rd_err", 793a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 794a3e124faSHongbo Zheng }, { 795a3e124faSHongbo Zheng .int_msk = BIT(22), 796d3d31324SHongbo Zheng .msg = "tm_sch_rq_fifo_wr_err", 797a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 798a3e124faSHongbo Zheng }, { 799a3e124faSHongbo Zheng .int_msk = BIT(23), 800d3d31324SHongbo Zheng .msg = "tm_sch_rq_fifo_rd_err", 801a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 802a3e124faSHongbo Zheng }, { 803a3e124faSHongbo Zheng .int_msk = BIT(24), 804d3d31324SHongbo Zheng .msg = "tm_sch_nq_fifo_wr_err", 805a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 806a3e124faSHongbo Zheng }, { 807a3e124faSHongbo Zheng .int_msk = BIT(25), 808d3d31324SHongbo Zheng .msg = "tm_sch_nq_fifo_rd_err", 809a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 810a3e124faSHongbo Zheng }, { 811a3e124faSHongbo Zheng .int_msk = BIT(26), 812d3d31324SHongbo Zheng .msg = "tm_sch_roce_up_fifo_wr_err", 813a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 814a3e124faSHongbo Zheng }, { 815a3e124faSHongbo Zheng .int_msk = BIT(27), 816d3d31324SHongbo Zheng .msg = "tm_sch_roce_up_fifo_rd_err", 817a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 818a3e124faSHongbo Zheng }, { 819a3e124faSHongbo Zheng .int_msk = BIT(28), 820d3d31324SHongbo Zheng .msg = "tm_sch_rcb_byte_fifo_wr_err", 821a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 822a3e124faSHongbo Zheng }, { 823a3e124faSHongbo Zheng .int_msk = BIT(29), 824d3d31324SHongbo Zheng .msg = "tm_sch_rcb_byte_fifo_rd_err", 825a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 826a3e124faSHongbo Zheng }, { 827a3e124faSHongbo Zheng .int_msk = BIT(30), 828d3d31324SHongbo Zheng .msg = "tm_sch_ssu_byte_fifo_wr_err", 829a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 830a3e124faSHongbo Zheng }, { 831a3e124faSHongbo Zheng .int_msk = BIT(31), 832d3d31324SHongbo Zheng .msg = "tm_sch_ssu_byte_fifo_rd_err", 833a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 834a3e124faSHongbo Zheng }, { 835a3e124faSHongbo Zheng .int_msk = 0, 836d3d31324SHongbo Zheng .msg = NULL, 837a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 838a3e124faSHongbo Zheng } 839f53a793bSWei Hu (Xavier) }; 840f53a793bSWei Hu (Xavier) 841f53a793bSWei Hu (Xavier) static const struct hns3_hw_error qcn_fifo_int[] = { 842a3e124faSHongbo Zheng { 843a3e124faSHongbo Zheng .int_msk = BIT(0), 844d3d31324SHongbo Zheng .msg = "qcn_shap_gp0_sch_fifo_rd_err", 845a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 846a3e124faSHongbo Zheng }, { 847a3e124faSHongbo Zheng .int_msk = BIT(1), 848d3d31324SHongbo Zheng .msg = "qcn_shap_gp0_sch_fifo_wr_err", 849a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 850a3e124faSHongbo Zheng }, { 851a3e124faSHongbo Zheng .int_msk = BIT(2), 852d3d31324SHongbo Zheng .msg = "qcn_shap_gp1_sch_fifo_rd_err", 853a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 854a3e124faSHongbo Zheng }, { 855a3e124faSHongbo Zheng .int_msk = BIT(3), 856d3d31324SHongbo Zheng .msg = "qcn_shap_gp1_sch_fifo_wr_err", 857a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 858a3e124faSHongbo Zheng }, { 859a3e124faSHongbo Zheng .int_msk = BIT(4), 860d3d31324SHongbo Zheng .msg = "qcn_shap_gp2_sch_fifo_rd_err", 861a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 862a3e124faSHongbo Zheng }, { 863a3e124faSHongbo Zheng .int_msk = BIT(5), 864d3d31324SHongbo Zheng .msg = "qcn_shap_gp2_sch_fifo_wr_err", 865a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 866a3e124faSHongbo Zheng }, { 867a3e124faSHongbo Zheng .int_msk = BIT(6), 868d3d31324SHongbo Zheng .msg = "qcn_shap_gp3_sch_fifo_rd_err", 869a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 870a3e124faSHongbo Zheng }, { 871a3e124faSHongbo Zheng .int_msk = BIT(7), 872d3d31324SHongbo Zheng .msg = "qcn_shap_gp3_sch_fifo_wr_err", 873a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 874a3e124faSHongbo Zheng }, { 875a3e124faSHongbo Zheng .int_msk = BIT(8), 876d3d31324SHongbo Zheng .msg = "qcn_shap_gp0_offset_fifo_rd_err", 877a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 878a3e124faSHongbo Zheng }, { 879a3e124faSHongbo Zheng .int_msk = BIT(9), 880d3d31324SHongbo Zheng .msg = "qcn_shap_gp0_offset_fifo_wr_err", 881a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 882a3e124faSHongbo Zheng }, { 883a3e124faSHongbo Zheng .int_msk = BIT(10), 884d3d31324SHongbo Zheng .msg = "qcn_shap_gp1_offset_fifo_rd_err", 885a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 886a3e124faSHongbo Zheng }, { 887a3e124faSHongbo Zheng .int_msk = BIT(11), 888d3d31324SHongbo Zheng .msg = "qcn_shap_gp1_offset_fifo_wr_err", 889a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 890a3e124faSHongbo Zheng }, { 891a3e124faSHongbo Zheng .int_msk = BIT(12), 892d3d31324SHongbo Zheng .msg = "qcn_shap_gp2_offset_fifo_rd_err", 893a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 894a3e124faSHongbo Zheng }, { 895a3e124faSHongbo Zheng .int_msk = BIT(13), 896d3d31324SHongbo Zheng .msg = "qcn_shap_gp2_offset_fifo_wr_err", 897a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 898a3e124faSHongbo Zheng }, { 899a3e124faSHongbo Zheng .int_msk = BIT(14), 900d3d31324SHongbo Zheng .msg = "qcn_shap_gp3_offset_fifo_rd_err", 901a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 902a3e124faSHongbo Zheng }, { 903a3e124faSHongbo Zheng .int_msk = BIT(15), 904d3d31324SHongbo Zheng .msg = "qcn_shap_gp3_offset_fifo_wr_err", 905a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 906a3e124faSHongbo Zheng }, { 907a3e124faSHongbo Zheng .int_msk = BIT(16), 908d3d31324SHongbo Zheng .msg = "qcn_byte_info_fifo_rd_err", 909a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 910a3e124faSHongbo Zheng }, { 911a3e124faSHongbo Zheng .int_msk = BIT(17), 912d3d31324SHongbo Zheng .msg = "qcn_byte_info_fifo_wr_err", 913a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 914a3e124faSHongbo Zheng }, { 915a3e124faSHongbo Zheng .int_msk = 0, 916d3d31324SHongbo Zheng .msg = NULL, 917a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 918a3e124faSHongbo Zheng } 919f53a793bSWei Hu (Xavier) }; 920f53a793bSWei Hu (Xavier) 921f53a793bSWei Hu (Xavier) static const struct hns3_hw_error qcn_ecc_int[] = { 922a3e124faSHongbo Zheng { 923a3e124faSHongbo Zheng .int_msk = BIT(1), 924d3d31324SHongbo Zheng .msg = "qcn_byte_mem_ecc_mbit_err", 925a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 926a3e124faSHongbo Zheng }, { 927a3e124faSHongbo Zheng .int_msk = BIT(3), 928d3d31324SHongbo Zheng .msg = "qcn_time_mem_ecc_mbit_err", 929a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 930a3e124faSHongbo Zheng }, { 931a3e124faSHongbo Zheng .int_msk = BIT(5), 932d3d31324SHongbo Zheng .msg = "qcn_fb_mem_ecc_mbit_err", 933a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 934a3e124faSHongbo Zheng }, { 935a3e124faSHongbo Zheng .int_msk = BIT(7), 936d3d31324SHongbo Zheng .msg = "qcn_link_mem_ecc_mbit_err", 937a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 938a3e124faSHongbo Zheng }, { 939a3e124faSHongbo Zheng .int_msk = BIT(9), 940d3d31324SHongbo Zheng .msg = "qcn_rate_mem_ecc_mbit_err", 941a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 942a3e124faSHongbo Zheng }, { 943a3e124faSHongbo Zheng .int_msk = BIT(11), 944d3d31324SHongbo Zheng .msg = "qcn_tmplt_mem_ecc_mbit_err", 945a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 946a3e124faSHongbo Zheng }, { 947a3e124faSHongbo Zheng .int_msk = BIT(13), 948d3d31324SHongbo Zheng .msg = "qcn_shap_cfg_mem_ecc_mbit_err", 949a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 950a3e124faSHongbo Zheng }, { 951a3e124faSHongbo Zheng .int_msk = BIT(15), 952d3d31324SHongbo Zheng .msg = "qcn_gp0_barrel_mem_ecc_mbit_err", 953a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 954a3e124faSHongbo Zheng }, { 955a3e124faSHongbo Zheng .int_msk = BIT(17), 956d3d31324SHongbo Zheng .msg = "qcn_gp1_barrel_mem_ecc_mbit_err", 957a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 958a3e124faSHongbo Zheng }, { 959a3e124faSHongbo Zheng .int_msk = BIT(19), 960d3d31324SHongbo Zheng .msg = "qcn_gp2_barrel_mem_ecc_mbit_err", 961a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 962a3e124faSHongbo Zheng }, { 963a3e124faSHongbo Zheng .int_msk = BIT(21), 964d3d31324SHongbo Zheng .msg = "qcn_gp3_barral_mem_ecc_mbit_err", 965a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 966a3e124faSHongbo Zheng }, { 967a3e124faSHongbo Zheng .int_msk = 0, 968d3d31324SHongbo Zheng .msg = NULL, 969a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 970a3e124faSHongbo Zheng } 971f53a793bSWei Hu (Xavier) }; 972f53a793bSWei Hu (Xavier) 973f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ncsi_ecc_int[] = { 974a3e124faSHongbo Zheng { 975a3e124faSHongbo Zheng .int_msk = BIT(1), 976d3d31324SHongbo Zheng .msg = "ncsi_tx_ecc_mbit_err", 977a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 978a3e124faSHongbo Zheng }, { 979a3e124faSHongbo Zheng .int_msk = 0, 980d3d31324SHongbo Zheng .msg = NULL, 981a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 982a3e124faSHongbo Zheng } 983f53a793bSWei Hu (Xavier) }; 984f53a793bSWei Hu (Xavier) 985f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_fifo_overflow_int[] = { 986a3e124faSHongbo Zheng { 987a3e124faSHongbo Zheng .int_msk = BIT(0), 988d3d31324SHongbo Zheng .msg = "ig_mac_inf_int", 989a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 990a3e124faSHongbo Zheng }, { 991a3e124faSHongbo Zheng .int_msk = BIT(1), 992d3d31324SHongbo Zheng .msg = "ig_host_inf_int", 993a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 994a3e124faSHongbo Zheng }, { 995a3e124faSHongbo Zheng .int_msk = BIT(2), 996d3d31324SHongbo Zheng .msg = "ig_roc_buf_int", 997a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 998a3e124faSHongbo Zheng }, { 999a3e124faSHongbo Zheng .int_msk = BIT(3), 1000d3d31324SHongbo Zheng .msg = "ig_host_data_fifo_int", 1001a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1002a3e124faSHongbo Zheng }, { 1003a3e124faSHongbo Zheng .int_msk = BIT(4), 1004d3d31324SHongbo Zheng .msg = "ig_host_key_fifo_int", 1005a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1006a3e124faSHongbo Zheng }, { 1007a3e124faSHongbo Zheng .int_msk = BIT(5), 1008d3d31324SHongbo Zheng .msg = "tx_qcn_fifo_int", 1009a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1010a3e124faSHongbo Zheng }, { 1011a3e124faSHongbo Zheng .int_msk = BIT(6), 1012d3d31324SHongbo Zheng .msg = "rx_qcn_fifo_int", 1013a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1014a3e124faSHongbo Zheng }, { 1015a3e124faSHongbo Zheng .int_msk = BIT(7), 1016d3d31324SHongbo Zheng .msg = "tx_pf_rd_fifo_int", 1017a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1018a3e124faSHongbo Zheng }, { 1019a3e124faSHongbo Zheng .int_msk = BIT(8), 1020d3d31324SHongbo Zheng .msg = "rx_pf_rd_fifo_int", 1021a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1022a3e124faSHongbo Zheng }, { 1023a3e124faSHongbo Zheng .int_msk = BIT(9), 1024d3d31324SHongbo Zheng .msg = "qm_eof_fifo_int", 1025a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1026a3e124faSHongbo Zheng }, { 1027a3e124faSHongbo Zheng .int_msk = BIT(10), 1028d3d31324SHongbo Zheng .msg = "mb_rlt_fifo_int", 1029a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1030a3e124faSHongbo Zheng }, { 1031a3e124faSHongbo Zheng .int_msk = BIT(11), 1032d3d31324SHongbo Zheng .msg = "dup_uncopy_fifo_int", 1033a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1034a3e124faSHongbo Zheng }, { 1035a3e124faSHongbo Zheng .int_msk = BIT(12), 1036d3d31324SHongbo Zheng .msg = "dup_cnt_rd_fifo_int", 1037a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1038a3e124faSHongbo Zheng }, { 1039a3e124faSHongbo Zheng .int_msk = BIT(13), 1040d3d31324SHongbo Zheng .msg = "dup_cnt_drop_fifo_int", 1041a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1042a3e124faSHongbo Zheng }, { 1043a3e124faSHongbo Zheng .int_msk = BIT(14), 1044d3d31324SHongbo Zheng .msg = "dup_cnt_wrb_fifo_int", 1045a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1046a3e124faSHongbo Zheng }, { 1047a3e124faSHongbo Zheng .int_msk = BIT(15), 1048d3d31324SHongbo Zheng .msg = "host_cmd_fifo_int", 1049a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1050a3e124faSHongbo Zheng }, { 1051a3e124faSHongbo Zheng .int_msk = BIT(16), 1052d3d31324SHongbo Zheng .msg = "mac_cmd_fifo_int", 1053a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1054a3e124faSHongbo Zheng }, { 1055a3e124faSHongbo Zheng .int_msk = BIT(17), 1056d3d31324SHongbo Zheng .msg = "host_cmd_bitmap_empty_int", 1057a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1058a3e124faSHongbo Zheng }, { 1059a3e124faSHongbo Zheng .int_msk = BIT(18), 1060d3d31324SHongbo Zheng .msg = "mac_cmd_bitmap_empty_int", 1061a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1062a3e124faSHongbo Zheng }, { 1063a3e124faSHongbo Zheng .int_msk = BIT(19), 1064d3d31324SHongbo Zheng .msg = "dup_bitmap_empty_int", 1065a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1066a3e124faSHongbo Zheng }, { 1067a3e124faSHongbo Zheng .int_msk = BIT(20), 1068d3d31324SHongbo Zheng .msg = "out_queue_bitmap_empty_int", 1069a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1070a3e124faSHongbo Zheng }, { 1071a3e124faSHongbo Zheng .int_msk = BIT(21), 1072d3d31324SHongbo Zheng .msg = "bank2_bitmap_empty_int", 1073a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1074a3e124faSHongbo Zheng }, { 1075a3e124faSHongbo Zheng .int_msk = BIT(22), 1076d3d31324SHongbo Zheng .msg = "bank1_bitmap_empty_int", 1077a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1078a3e124faSHongbo Zheng }, { 1079a3e124faSHongbo Zheng .int_msk = BIT(23), 1080d3d31324SHongbo Zheng .msg = "bank0_bitmap_empty_int", 1081a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1082a3e124faSHongbo Zheng }, { 1083a3e124faSHongbo Zheng .int_msk = 0, 1084d3d31324SHongbo Zheng .msg = NULL, 1085a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 1086a3e124faSHongbo Zheng } 1087f53a793bSWei Hu (Xavier) }; 1088f53a793bSWei Hu (Xavier) 1089f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_ets_tcg_int[] = { 1090a3e124faSHongbo Zheng { 1091a3e124faSHongbo Zheng .int_msk = BIT(0), 1092d3d31324SHongbo Zheng .msg = "ets_rd_int_rx_tcg", 1093a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1094a3e124faSHongbo Zheng }, { 1095a3e124faSHongbo Zheng .int_msk = BIT(1), 1096d3d31324SHongbo Zheng .msg = "ets_wr_int_rx_tcg", 1097a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1098a3e124faSHongbo Zheng }, { 1099a3e124faSHongbo Zheng .int_msk = BIT(2), 1100d3d31324SHongbo Zheng .msg = "ets_rd_int_tx_tcg", 1101a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1102a3e124faSHongbo Zheng }, { 1103a3e124faSHongbo Zheng .int_msk = BIT(3), 1104d3d31324SHongbo Zheng .msg = "ets_wr_int_tx_tcg", 1105a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1106a3e124faSHongbo Zheng }, { 1107a3e124faSHongbo Zheng .int_msk = 0, 1108d3d31324SHongbo Zheng .msg = NULL, 1109a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 1110a3e124faSHongbo Zheng } 1111f53a793bSWei Hu (Xavier) }; 1112f53a793bSWei Hu (Xavier) 1113f53a793bSWei Hu (Xavier) static const struct hns3_hw_error igu_egu_tnl_int[] = { 1114a3e124faSHongbo Zheng { 1115a3e124faSHongbo Zheng .int_msk = BIT(0), 1116d3d31324SHongbo Zheng .msg = "rx_buf_overflow", 1117a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1118a3e124faSHongbo Zheng }, { 1119a3e124faSHongbo Zheng .int_msk = BIT(1), 1120d3d31324SHongbo Zheng .msg = "rx_stp_fifo_overflow", 1121a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1122a3e124faSHongbo Zheng }, { 1123a3e124faSHongbo Zheng .int_msk = BIT(2), 1124d3d31324SHongbo Zheng .msg = "rx_stp_fifo_underflow", 1125a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1126a3e124faSHongbo Zheng }, { 1127a3e124faSHongbo Zheng .int_msk = BIT(3), 1128d3d31324SHongbo Zheng .msg = "tx_buf_overflow", 1129a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1130a3e124faSHongbo Zheng }, { 1131a3e124faSHongbo Zheng .int_msk = BIT(4), 1132d3d31324SHongbo Zheng .msg = "tx_buf_underrun", 1133a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1134a3e124faSHongbo Zheng }, { 1135a3e124faSHongbo Zheng .int_msk = BIT(5), 1136d3d31324SHongbo Zheng .msg = "rx_stp_buf_overflow", 1137a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1138a3e124faSHongbo Zheng }, { 1139a3e124faSHongbo Zheng .int_msk = 0, 1140d3d31324SHongbo Zheng .msg = NULL, 1141a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 1142a3e124faSHongbo Zheng } 1143f53a793bSWei Hu (Xavier) }; 1144f53a793bSWei Hu (Xavier) 1145f53a793bSWei Hu (Xavier) static const struct hns3_hw_error ssu_port_based_err_int[] = { 1146a3e124faSHongbo Zheng { 1147a3e124faSHongbo Zheng .int_msk = BIT(0), 1148d3d31324SHongbo Zheng .msg = "roc_pkt_without_key_port", 1149a3e124faSHongbo Zheng .reset_level = HNS3_FUNC_RESET 1150a3e124faSHongbo Zheng }, { 1151a3e124faSHongbo Zheng .int_msk = BIT(1), 1152d3d31324SHongbo Zheng .msg = "tpu_pkt_without_key_port", 1153a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1154a3e124faSHongbo Zheng }, { 1155a3e124faSHongbo Zheng .int_msk = BIT(2), 1156d3d31324SHongbo Zheng .msg = "igu_pkt_without_key_port", 1157a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1158a3e124faSHongbo Zheng }, { 1159a3e124faSHongbo Zheng .int_msk = BIT(3), 1160d3d31324SHongbo Zheng .msg = "roc_eof_mis_match_port", 1161a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1162a3e124faSHongbo Zheng }, { 1163a3e124faSHongbo Zheng .int_msk = BIT(4), 1164d3d31324SHongbo Zheng .msg = "tpu_eof_mis_match_port", 1165a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1166a3e124faSHongbo Zheng }, { 1167a3e124faSHongbo Zheng .int_msk = BIT(5), 1168d3d31324SHongbo Zheng .msg = "igu_eof_mis_match_port", 1169a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1170a3e124faSHongbo Zheng }, { 1171a3e124faSHongbo Zheng .int_msk = BIT(6), 1172d3d31324SHongbo Zheng .msg = "roc_sof_mis_match_port", 1173a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1174a3e124faSHongbo Zheng }, { 1175a3e124faSHongbo Zheng .int_msk = BIT(7), 1176d3d31324SHongbo Zheng .msg = "tpu_sof_mis_match_port", 1177a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1178a3e124faSHongbo Zheng }, { 1179a3e124faSHongbo Zheng .int_msk = BIT(8), 1180d3d31324SHongbo Zheng .msg = "igu_sof_mis_match_port", 1181a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1182a3e124faSHongbo Zheng }, { 1183a3e124faSHongbo Zheng .int_msk = BIT(11), 1184d3d31324SHongbo Zheng .msg = "ets_rd_int_rx_port", 1185a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1186a3e124faSHongbo Zheng }, { 1187a3e124faSHongbo Zheng .int_msk = BIT(12), 1188d3d31324SHongbo Zheng .msg = "ets_wr_int_rx_port", 1189a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1190a3e124faSHongbo Zheng }, { 1191a3e124faSHongbo Zheng .int_msk = BIT(13), 1192d3d31324SHongbo Zheng .msg = "ets_rd_int_tx_port", 1193a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1194a3e124faSHongbo Zheng }, { 1195a3e124faSHongbo Zheng .int_msk = BIT(14), 1196d3d31324SHongbo Zheng .msg = "ets_wr_int_tx_port", 1197a3e124faSHongbo Zheng .reset_level = HNS3_GLOBAL_RESET 1198a3e124faSHongbo Zheng }, { 1199a3e124faSHongbo Zheng .int_msk = 0, 1200d3d31324SHongbo Zheng .msg = NULL, 1201a3e124faSHongbo Zheng .reset_level = HNS3_NONE_RESET 1202a3e124faSHongbo Zheng } 1203f53a793bSWei Hu (Xavier) }; 1204f53a793bSWei Hu (Xavier) 1205f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc mpf_ras_err_tbl[] = { 1206a3e124faSHongbo Zheng { 1207a3e124faSHongbo Zheng .desc_offset = 0, 1208d3d31324SHongbo Zheng .data_offset = 0, 1209f53a793bSWei Hu (Xavier) .msg = "IMP_TCM_ECC_INT_STS", 1210a3e124faSHongbo Zheng .hw_err = imp_tcm_ecc_int 1211a3e124faSHongbo Zheng }, { 1212a3e124faSHongbo Zheng .desc_offset = 0, 1213d3d31324SHongbo Zheng .data_offset = 1, 1214f53a793bSWei Hu (Xavier) .msg = "CMDQ_MEM_ECC_INT_STS", 1215a3e124faSHongbo Zheng .hw_err = cmdq_mem_ecc_int 1216a3e124faSHongbo Zheng }, { 1217a3e124faSHongbo Zheng .desc_offset = 0, 1218d3d31324SHongbo Zheng .data_offset = 2, 1219f53a793bSWei Hu (Xavier) .msg = "IMP_RD_POISON_INT_STS", 1220a3e124faSHongbo Zheng .hw_err = imp_rd_poison_int 1221a3e124faSHongbo Zheng }, { 1222a3e124faSHongbo Zheng .desc_offset = 0, 1223d3d31324SHongbo Zheng .data_offset = 3, 1224f53a793bSWei Hu (Xavier) .msg = "TQP_INT_ECC_INT_STS", 1225a3e124faSHongbo Zheng .hw_err = tqp_int_ecc_int 1226a3e124faSHongbo Zheng }, { 1227a3e124faSHongbo Zheng .desc_offset = 0, 1228d3d31324SHongbo Zheng .data_offset = 4, 1229f53a793bSWei Hu (Xavier) .msg = "MSIX_ECC_INT_STS", 1230a3e124faSHongbo Zheng .hw_err = msix_ecc_int 1231a3e124faSHongbo Zheng }, { 1232a3e124faSHongbo Zheng .desc_offset = 2, 1233d3d31324SHongbo Zheng .data_offset = 2, 1234f53a793bSWei Hu (Xavier) .msg = "SSU_ECC_MULTI_BIT_INT_0", 1235a3e124faSHongbo Zheng .hw_err = ssu_ecc_multi_bit_int_0 1236a3e124faSHongbo Zheng }, { 1237a3e124faSHongbo Zheng .desc_offset = 2, 1238d3d31324SHongbo Zheng .data_offset = 3, 1239f53a793bSWei Hu (Xavier) .msg = "SSU_ECC_MULTI_BIT_INT_1", 1240a3e124faSHongbo Zheng .hw_err = ssu_ecc_multi_bit_int_1 1241a3e124faSHongbo Zheng }, { 1242a3e124faSHongbo Zheng .desc_offset = 2, 1243d3d31324SHongbo Zheng .data_offset = 4, 1244f53a793bSWei Hu (Xavier) .msg = "SSU_COMMON_ERR_INT", 1245a3e124faSHongbo Zheng .hw_err = ssu_common_ecc_int 1246a3e124faSHongbo Zheng }, { 1247a3e124faSHongbo Zheng .desc_offset = 3, 1248d3d31324SHongbo Zheng .data_offset = 0, 1249f53a793bSWei Hu (Xavier) .msg = "IGU_INT_STS", 1250a3e124faSHongbo Zheng .hw_err = igu_int 1251a3e124faSHongbo Zheng }, { 1252a3e124faSHongbo Zheng .desc_offset = 4, 1253d3d31324SHongbo Zheng .data_offset = 1, 1254f53a793bSWei Hu (Xavier) .msg = "PPP_MPF_ABNORMAL_INT_ST1", 1255a3e124faSHongbo Zheng .hw_err = ppp_mpf_abnormal_int_st1 1256a3e124faSHongbo Zheng }, { 1257a3e124faSHongbo Zheng .desc_offset = 4, 1258d3d31324SHongbo Zheng .data_offset = 3, 1259f53a793bSWei Hu (Xavier) .msg = "PPP_MPF_ABNORMAL_INT_ST3", 1260a3e124faSHongbo Zheng .hw_err = ppp_mpf_abnormal_int_st3 1261a3e124faSHongbo Zheng }, { 1262a3e124faSHongbo Zheng .desc_offset = 5, 1263d3d31324SHongbo Zheng .data_offset = 1, 1264f53a793bSWei Hu (Xavier) .msg = "PPU_MPF_ABNORMAL_INT_ST1", 1265a3e124faSHongbo Zheng .hw_err = ppu_mpf_abnormal_int_st1 1266a3e124faSHongbo Zheng }, { 1267a3e124faSHongbo Zheng .desc_offset = 5, 1268d3d31324SHongbo Zheng .data_offset = 2, 1269f53a793bSWei Hu (Xavier) .msg = "PPU_MPF_ABNORMAL_INT_ST2_RAS", 1270a3e124faSHongbo Zheng .hw_err = ppu_mpf_abnormal_int_st2_ras 1271a3e124faSHongbo Zheng }, { 1272a3e124faSHongbo Zheng .desc_offset = 5, 1273d3d31324SHongbo Zheng .data_offset = 3, 1274f53a793bSWei Hu (Xavier) .msg = "PPU_MPF_ABNORMAL_INT_ST3", 1275a3e124faSHongbo Zheng .hw_err = ppu_mpf_abnormal_int_st3 1276a3e124faSHongbo Zheng }, { 1277a3e124faSHongbo Zheng .desc_offset = 6, 1278d3d31324SHongbo Zheng .data_offset = 0, 1279f53a793bSWei Hu (Xavier) .msg = "TM_SCH_RINT", 1280a3e124faSHongbo Zheng .hw_err = tm_sch_int 1281a3e124faSHongbo Zheng }, { 1282a3e124faSHongbo Zheng .desc_offset = 7, 1283d3d31324SHongbo Zheng .data_offset = 0, 1284f53a793bSWei Hu (Xavier) .msg = "QCN_FIFO_RINT", 1285a3e124faSHongbo Zheng .hw_err = qcn_fifo_int 1286a3e124faSHongbo Zheng }, { 1287a3e124faSHongbo Zheng .desc_offset = 7, 1288d3d31324SHongbo Zheng .data_offset = 1, 1289f53a793bSWei Hu (Xavier) .msg = "QCN_ECC_RINT", 1290a3e124faSHongbo Zheng .hw_err = qcn_ecc_int 1291a3e124faSHongbo Zheng }, { 1292a3e124faSHongbo Zheng .desc_offset = 9, 1293d3d31324SHongbo Zheng .data_offset = 0, 1294f53a793bSWei Hu (Xavier) .msg = "NCSI_ECC_INT_RPT", 1295a3e124faSHongbo Zheng .hw_err = ncsi_ecc_int 1296a3e124faSHongbo Zheng }, { 1297a3e124faSHongbo Zheng .desc_offset = 0, 1298d3d31324SHongbo Zheng .data_offset = 0, 1299f53a793bSWei Hu (Xavier) .msg = NULL, 1300a3e124faSHongbo Zheng .hw_err = NULL 1301a3e124faSHongbo Zheng } 1302f53a793bSWei Hu (Xavier) }; 1303f53a793bSWei Hu (Xavier) 1304f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc pf_ras_err_tbl[] = { 1305a3e124faSHongbo Zheng { 1306a3e124faSHongbo Zheng .desc_offset = 0, 1307d3d31324SHongbo Zheng .data_offset = 0, 1308f53a793bSWei Hu (Xavier) .msg = "SSU_PORT_BASED_ERR_INT_RAS", 1309a3e124faSHongbo Zheng .hw_err = ssu_port_based_err_int 1310a3e124faSHongbo Zheng }, { 1311a3e124faSHongbo Zheng .desc_offset = 0, 1312d3d31324SHongbo Zheng .data_offset = 1, 1313f53a793bSWei Hu (Xavier) .msg = "SSU_FIFO_OVERFLOW_INT", 1314a3e124faSHongbo Zheng .hw_err = ssu_fifo_overflow_int 1315a3e124faSHongbo Zheng }, { 1316a3e124faSHongbo Zheng .desc_offset = 0, 1317d3d31324SHongbo Zheng .data_offset = 2, 1318f53a793bSWei Hu (Xavier) .msg = "SSU_ETS_TCG_INT", 1319a3e124faSHongbo Zheng .hw_err = ssu_ets_tcg_int 1320a3e124faSHongbo Zheng }, { 1321a3e124faSHongbo Zheng .desc_offset = 1, 1322d3d31324SHongbo Zheng .data_offset = 0, 1323f53a793bSWei Hu (Xavier) .msg = "IGU_EGU_TNL_INT_STS", 1324a3e124faSHongbo Zheng .hw_err = igu_egu_tnl_int 1325a3e124faSHongbo Zheng }, { 1326a3e124faSHongbo Zheng .desc_offset = 3, 1327d3d31324SHongbo Zheng .data_offset = 0, 1328f53a793bSWei Hu (Xavier) .msg = "PPU_PF_ABNORMAL_INT_ST_RAS", 1329a3e124faSHongbo Zheng .hw_err = ppu_pf_abnormal_int_ras 1330a3e124faSHongbo Zheng }, { 1331a3e124faSHongbo Zheng .desc_offset = 0, 1332d3d31324SHongbo Zheng .data_offset = 0, 1333f53a793bSWei Hu (Xavier) .msg = NULL, 1334a3e124faSHongbo Zheng .hw_err = NULL 1335a3e124faSHongbo Zheng } 1336f53a793bSWei Hu (Xavier) }; 1337f53a793bSWei Hu (Xavier) 1338f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc mpf_msix_err_tbl[] = { 1339a3e124faSHongbo Zheng { 1340a3e124faSHongbo Zheng .desc_offset = 1, 1341d3d31324SHongbo Zheng .data_offset = 0, 1342f53a793bSWei Hu (Xavier) .msg = "MAC_AFIFO_TNL_INT_R", 1343a3e124faSHongbo Zheng .hw_err = mac_afifo_tnl_int 1344a3e124faSHongbo Zheng }, { 1345a3e124faSHongbo Zheng .desc_offset = 5, 1346d3d31324SHongbo Zheng .data_offset = 2, 1347f53a793bSWei Hu (Xavier) .msg = "PPU_MPF_ABNORMAL_INT_ST2_MSIX", 1348a3e124faSHongbo Zheng .hw_err = ppu_mpf_abnormal_int_st2_msix 1349a3e124faSHongbo Zheng }, { 1350a3e124faSHongbo Zheng .desc_offset = 0, 1351d3d31324SHongbo Zheng .data_offset = 0, 1352f53a793bSWei Hu (Xavier) .msg = NULL, 1353a3e124faSHongbo Zheng .hw_err = NULL 1354a3e124faSHongbo Zheng } 1355f53a793bSWei Hu (Xavier) }; 1356f53a793bSWei Hu (Xavier) 1357f53a793bSWei Hu (Xavier) static const struct hns3_hw_error_desc pf_msix_err_tbl[] = { 1358a3e124faSHongbo Zheng { 1359a3e124faSHongbo Zheng .desc_offset = 0, 1360d3d31324SHongbo Zheng .data_offset = 0, 1361f53a793bSWei Hu (Xavier) .msg = "SSU_PORT_BASED_ERR_INT_MSIX", 1362a3e124faSHongbo Zheng .hw_err = ssu_port_based_pf_int 1363a3e124faSHongbo Zheng }, { 1364a3e124faSHongbo Zheng .desc_offset = 2, 1365d3d31324SHongbo Zheng .data_offset = 0, 1366f53a793bSWei Hu (Xavier) .msg = "PPP_PF_ABNORMAL_INT_ST0", 1367a3e124faSHongbo Zheng .hw_err = ppp_pf_abnormal_int 1368a3e124faSHongbo Zheng }, { 1369a3e124faSHongbo Zheng .desc_offset = 3, 1370d3d31324SHongbo Zheng .data_offset = 0, 1371f53a793bSWei Hu (Xavier) .msg = "PPU_PF_ABNORMAL_INT_ST_MSIX", 1372a3e124faSHongbo Zheng .hw_err = ppu_pf_abnormal_int_msix 1373a3e124faSHongbo Zheng }, { 1374a3e124faSHongbo Zheng .desc_offset = 0, 1375d3d31324SHongbo Zheng .data_offset = 0, 1376f53a793bSWei Hu (Xavier) .msg = NULL, 1377a3e124faSHongbo Zheng .hw_err = NULL 1378a3e124faSHongbo Zheng } 1379f53a793bSWei Hu (Xavier) }; 1380f53a793bSWei Hu (Xavier) 13811c1eb759SHongbo Zheng enum hns3_hw_err_report_type { 1382f53a793bSWei Hu (Xavier) MPF_MSIX_ERR, 1383f53a793bSWei Hu (Xavier) PF_MSIX_ERR, 1384f53a793bSWei Hu (Xavier) MPF_RAS_ERR, 1385f53a793bSWei Hu (Xavier) PF_RAS_ERR, 1386f53a793bSWei Hu (Xavier) }; 1387f53a793bSWei Hu (Xavier) 13881c1eb759SHongbo Zheng static const struct hns3_hw_mod_name hns3_hw_module_name[] = { 13891c1eb759SHongbo Zheng { 13901c1eb759SHongbo Zheng .module_name = MODULE_NONE, 13911c1eb759SHongbo Zheng .msg = "MODULE_NONE" 13921c1eb759SHongbo Zheng }, { 13931c1eb759SHongbo Zheng .module_name = MODULE_BIOS_COMMON, 13941c1eb759SHongbo Zheng .msg = "MODULE_BIOS_COMMON" 13951c1eb759SHongbo Zheng }, { 13961c1eb759SHongbo Zheng .module_name = MODULE_GE, 13971c1eb759SHongbo Zheng .msg = "MODULE_GE" 13981c1eb759SHongbo Zheng }, { 13991c1eb759SHongbo Zheng .module_name = MODULE_IGU_EGU, 14001c1eb759SHongbo Zheng .msg = "MODULE_IGU_EGU" 14011c1eb759SHongbo Zheng }, { 14021c1eb759SHongbo Zheng .module_name = MODULE_LGE, 14031c1eb759SHongbo Zheng .msg = "MODULE_LGE" 14041c1eb759SHongbo Zheng }, { 14051c1eb759SHongbo Zheng .module_name = MODULE_NCSI, 14061c1eb759SHongbo Zheng .msg = "MODULE_NCSI" 14071c1eb759SHongbo Zheng }, { 14081c1eb759SHongbo Zheng .module_name = MODULE_PPP, 14091c1eb759SHongbo Zheng .msg = "MODULE_PPP" 14101c1eb759SHongbo Zheng }, { 14111c1eb759SHongbo Zheng .module_name = MODULE_QCN, 14121c1eb759SHongbo Zheng .msg = "MODULE_QCN" 14131c1eb759SHongbo Zheng }, { 14141c1eb759SHongbo Zheng .module_name = MODULE_RCB_RX, 14151c1eb759SHongbo Zheng .msg = "MODULE_RCB_RX" 14161c1eb759SHongbo Zheng }, { 14171c1eb759SHongbo Zheng .module_name = MODULE_RTC, 14181c1eb759SHongbo Zheng .msg = "MODULE_RTC" 14191c1eb759SHongbo Zheng }, { 14201c1eb759SHongbo Zheng .module_name = MODULE_SSU, 14211c1eb759SHongbo Zheng .msg = "MODULE_SSU" 14221c1eb759SHongbo Zheng }, { 14231c1eb759SHongbo Zheng .module_name = MODULE_TM, 14241c1eb759SHongbo Zheng .msg = "MODULE_TM" 14251c1eb759SHongbo Zheng }, { 14261c1eb759SHongbo Zheng .module_name = MODULE_RCB_TX, 14271c1eb759SHongbo Zheng .msg = "MODULE_RCB_TX" 14281c1eb759SHongbo Zheng }, { 14291c1eb759SHongbo Zheng .module_name = MODULE_TXDMA, 14301c1eb759SHongbo Zheng .msg = "MODULE_TXDMA" 14311c1eb759SHongbo Zheng }, { 14321c1eb759SHongbo Zheng .module_name = MODULE_MASTER, 14331c1eb759SHongbo Zheng .msg = "MODULE_MASTER" 14341c1eb759SHongbo Zheng }, { 1435*501a40aeSJie Hai .module_name = MODULE_HIMAC, 1436*501a40aeSJie Hai .msg = "MODULE_HIMAC" 14371c1eb759SHongbo Zheng } 14381c1eb759SHongbo Zheng }; 14391c1eb759SHongbo Zheng 14401c1eb759SHongbo Zheng static const struct hns3_hw_err_type hns3_hw_error_type[] = { 14411c1eb759SHongbo Zheng { 14421c1eb759SHongbo Zheng .error_type = NONE_ERROR, 14431c1eb759SHongbo Zheng .msg = "none_error" 14441c1eb759SHongbo Zheng }, { 14451c1eb759SHongbo Zheng .error_type = FIFO_ERROR, 14461c1eb759SHongbo Zheng .msg = "fifo_error" 14471c1eb759SHongbo Zheng }, { 14481c1eb759SHongbo Zheng .error_type = MEMORY_ERROR, 14491c1eb759SHongbo Zheng .msg = "memory_error" 14501c1eb759SHongbo Zheng }, { 14511c1eb759SHongbo Zheng .error_type = POISION_ERROR, 14521c1eb759SHongbo Zheng .msg = "poision_error" 14531c1eb759SHongbo Zheng }, { 14541c1eb759SHongbo Zheng .error_type = MSIX_ECC_ERROR, 14551c1eb759SHongbo Zheng .msg = "msix_ecc_error" 14561c1eb759SHongbo Zheng }, { 14571c1eb759SHongbo Zheng .error_type = TQP_INT_ECC_ERROR, 14581c1eb759SHongbo Zheng .msg = "tqp_int_ecc_error" 14591c1eb759SHongbo Zheng }, { 14601c1eb759SHongbo Zheng .error_type = PF_ABNORMAL_INT_ERROR, 14611c1eb759SHongbo Zheng .msg = "pf_abnormal_int_error" 14621c1eb759SHongbo Zheng }, { 14631c1eb759SHongbo Zheng .error_type = MPF_ABNORMAL_INT_ERROR, 14641c1eb759SHongbo Zheng .msg = "mpf_abnormal_int_error" 14651c1eb759SHongbo Zheng }, { 14661c1eb759SHongbo Zheng .error_type = COMMON_ERROR, 14671c1eb759SHongbo Zheng .msg = "common_error" 14681c1eb759SHongbo Zheng }, { 14691c1eb759SHongbo Zheng .error_type = PORT_ERROR, 14701c1eb759SHongbo Zheng .msg = "port_error" 14711c1eb759SHongbo Zheng }, { 14721c1eb759SHongbo Zheng .error_type = ETS_ERROR, 14731c1eb759SHongbo Zheng .msg = "ets_error" 14741c1eb759SHongbo Zheng }, { 14751c1eb759SHongbo Zheng .error_type = NCSI_ERROR, 14761c1eb759SHongbo Zheng .msg = "ncsi_error" 14771c1eb759SHongbo Zheng }, { 14781c1eb759SHongbo Zheng .error_type = GLB_ERROR, 14791c1eb759SHongbo Zheng .msg = "glb_error" 14801c1eb759SHongbo Zheng } 14811c1eb759SHongbo Zheng }; 14821c1eb759SHongbo Zheng 148353688fc9SChengwen Feng static void 148453688fc9SChengwen Feng hns3_report_reset_begin(struct hns3_hw *hw) 148553688fc9SChengwen Feng { 148653688fc9SChengwen Feng struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; 148753688fc9SChengwen Feng rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_ERR_RECOVERING, NULL); 148853688fc9SChengwen Feng } 148953688fc9SChengwen Feng 149053688fc9SChengwen Feng static void 149153688fc9SChengwen Feng hns3_report_reset_success(struct hns3_hw *hw) 149253688fc9SChengwen Feng { 149353688fc9SChengwen Feng struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; 149453688fc9SChengwen Feng rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_RECOVERY_SUCCESS, NULL); 149553688fc9SChengwen Feng } 149653688fc9SChengwen Feng 149753688fc9SChengwen Feng static void 149853688fc9SChengwen Feng hns3_report_reset_failed(struct hns3_hw *hw) 149953688fc9SChengwen Feng { 150053688fc9SChengwen Feng struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; 150153688fc9SChengwen Feng rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_RECOVERY_FAILED, NULL); 150253688fc9SChengwen Feng } 150353688fc9SChengwen Feng 1504f53a793bSWei Hu (Xavier) static int 1505f53a793bSWei Hu (Xavier) hns3_config_ncsi_hw_err_int(struct hns3_adapter *hns, bool en) 1506f53a793bSWei Hu (Xavier) { 1507f53a793bSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 1508f53a793bSWei Hu (Xavier) struct hns3_cmd_desc desc; 1509f53a793bSWei Hu (Xavier) int ret; 1510f53a793bSWei Hu (Xavier) 1511f53a793bSWei Hu (Xavier) /* configure NCSI error interrupts */ 1512f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_NCSI_INT_EN, false); 1513f53a793bSWei Hu (Xavier) if (en) 1514f53a793bSWei Hu (Xavier) desc.data[0] = rte_cpu_to_le_32(HNS3_NCSI_ERR_INT_EN); 1515f53a793bSWei Hu (Xavier) 1516f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 1517f53a793bSWei Hu (Xavier) if (ret) 1518f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s NCSI error interrupts, ret = %d", 1519f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 1520f53a793bSWei Hu (Xavier) 1521f53a793bSWei Hu (Xavier) return ret; 1522f53a793bSWei Hu (Xavier) } 1523f53a793bSWei Hu (Xavier) 1524f53a793bSWei Hu (Xavier) static int 1525f53a793bSWei Hu (Xavier) enable_igu_egu_err_intr(struct hns3_adapter *hns, bool en) 1526f53a793bSWei Hu (Xavier) { 1527f53a793bSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 1528f53a793bSWei Hu (Xavier) struct hns3_cmd_desc desc; 1529f53a793bSWei Hu (Xavier) int ret; 1530f53a793bSWei Hu (Xavier) 1531f53a793bSWei Hu (Xavier) /* configure IGU,EGU error interrupts */ 1532f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_IGU_COMMON_INT_EN, false); 1533f53a793bSWei Hu (Xavier) if (en) 1534f53a793bSWei Hu (Xavier) desc.data[0] = rte_cpu_to_le_32(HNS3_IGU_ERR_INT_ENABLE); 1535f53a793bSWei Hu (Xavier) else 1536f53a793bSWei Hu (Xavier) desc.data[0] = rte_cpu_to_le_32(HNS3_IGU_ERR_INT_DISABLE); 1537f53a793bSWei Hu (Xavier) 1538f53a793bSWei Hu (Xavier) desc.data[1] = rte_cpu_to_le_32(HNS3_IGU_ERR_INT_EN_MASK); 1539f53a793bSWei Hu (Xavier) 1540f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 1541f53a793bSWei Hu (Xavier) if (ret) { 1542f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s IGU common interrupts, ret = %d", 1543f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 1544f53a793bSWei Hu (Xavier) return ret; 1545f53a793bSWei Hu (Xavier) } 1546f53a793bSWei Hu (Xavier) 1547f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_IGU_EGU_TNL_INT_EN, false); 1548f53a793bSWei Hu (Xavier) if (en) 1549f53a793bSWei Hu (Xavier) desc.data[0] = rte_cpu_to_le_32(HNS3_IGU_TNL_ERR_INT_EN); 1550f53a793bSWei Hu (Xavier) 1551f53a793bSWei Hu (Xavier) desc.data[1] = rte_cpu_to_le_32(HNS3_IGU_TNL_ERR_INT_EN_MASK); 1552f53a793bSWei Hu (Xavier) 1553f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 1554f53a793bSWei Hu (Xavier) if (ret) { 1555f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s IGU-EGU TNL interrupts, ret = %d", 1556f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 1557f53a793bSWei Hu (Xavier) return ret; 1558f53a793bSWei Hu (Xavier) } 1559f53a793bSWei Hu (Xavier) 1560f53a793bSWei Hu (Xavier) return hns3_config_ncsi_hw_err_int(hns, en); 1561f53a793bSWei Hu (Xavier) } 1562f53a793bSWei Hu (Xavier) 15633988ab0eSWei Hu (Xavier) static int 15643988ab0eSWei Hu (Xavier) config_ppp_err_intr(struct hns3_adapter *hns, uint32_t cmd, bool en) 15653988ab0eSWei Hu (Xavier) { 15663988ab0eSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 15673988ab0eSWei Hu (Xavier) struct hns3_cmd_desc desc[2]; 15683988ab0eSWei Hu (Xavier) int ret; 15693988ab0eSWei Hu (Xavier) 15703988ab0eSWei Hu (Xavier) /* configure PPP error interrupts */ 15713988ab0eSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], cmd, false); 15723988ab0eSWei Hu (Xavier) desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT); 15733988ab0eSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[1], cmd, false); 15743988ab0eSWei Hu (Xavier) 1575f53a793bSWei Hu (Xavier) if (cmd == HNS3_OPC_PPP_CMD0_INT_CMD) { 15763988ab0eSWei Hu (Xavier) if (en) { 15773988ab0eSWei Hu (Xavier) desc[0].data[0] = 15783988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT0_EN); 15793988ab0eSWei Hu (Xavier) desc[0].data[1] = 15803988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT1_EN); 15813988ab0eSWei Hu (Xavier) desc[0].data[4] = 15823988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_PF_ERR_INT_EN); 15833988ab0eSWei Hu (Xavier) } 15843988ab0eSWei Hu (Xavier) 15853988ab0eSWei Hu (Xavier) desc[1].data[0] = 15863988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT0_EN_MASK); 15873988ab0eSWei Hu (Xavier) desc[1].data[1] = 15883988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT1_EN_MASK); 15893988ab0eSWei Hu (Xavier) desc[1].data[2] = 15903988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_PF_ERR_INT_EN_MASK); 1591f53a793bSWei Hu (Xavier) } else if (cmd == HNS3_OPC_PPP_CMD1_INT_CMD) { 15923988ab0eSWei Hu (Xavier) if (en) { 15933988ab0eSWei Hu (Xavier) desc[0].data[0] = 15943988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT2_EN); 15953988ab0eSWei Hu (Xavier) desc[0].data[1] = 15963988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT3_EN); 15973988ab0eSWei Hu (Xavier) } 15983988ab0eSWei Hu (Xavier) 15993988ab0eSWei Hu (Xavier) desc[1].data[0] = 16003988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT2_EN_MASK); 16013988ab0eSWei Hu (Xavier) desc[1].data[1] = 16023988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_PPP_MPF_ECC_ERR_INT3_EN_MASK); 16033988ab0eSWei Hu (Xavier) } 16043988ab0eSWei Hu (Xavier) 16053988ab0eSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc[0], 2); 16063988ab0eSWei Hu (Xavier) if (ret) 1607f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s PPP error int, ret = %d", 1608f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 16093988ab0eSWei Hu (Xavier) 16103988ab0eSWei Hu (Xavier) return ret; 16113988ab0eSWei Hu (Xavier) } 16123988ab0eSWei Hu (Xavier) 16133988ab0eSWei Hu (Xavier) static int 16143988ab0eSWei Hu (Xavier) enable_ppp_err_intr(struct hns3_adapter *hns, bool en) 16153988ab0eSWei Hu (Xavier) { 16163988ab0eSWei Hu (Xavier) int ret; 16173988ab0eSWei Hu (Xavier) 1618f53a793bSWei Hu (Xavier) ret = config_ppp_err_intr(hns, HNS3_OPC_PPP_CMD0_INT_CMD, en); 16193988ab0eSWei Hu (Xavier) if (ret) 16203988ab0eSWei Hu (Xavier) return ret; 16213988ab0eSWei Hu (Xavier) 1622f53a793bSWei Hu (Xavier) return config_ppp_err_intr(hns, HNS3_OPC_PPP_CMD1_INT_CMD, en); 16233988ab0eSWei Hu (Xavier) } 16243988ab0eSWei Hu (Xavier) 16253988ab0eSWei Hu (Xavier) static int 16263988ab0eSWei Hu (Xavier) enable_ssu_err_intr(struct hns3_adapter *hns, bool en) 16273988ab0eSWei Hu (Xavier) { 16283988ab0eSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 16293988ab0eSWei Hu (Xavier) struct hns3_cmd_desc desc[2]; 16303988ab0eSWei Hu (Xavier) int ret; 16313988ab0eSWei Hu (Xavier) 16323988ab0eSWei Hu (Xavier) /* configure SSU ecc error interrupts */ 1633f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], HNS3_OPC_SSU_ECC_INT_CMD, false); 16343988ab0eSWei Hu (Xavier) desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT); 1635f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[1], HNS3_OPC_SSU_ECC_INT_CMD, false); 16363988ab0eSWei Hu (Xavier) if (en) { 16373988ab0eSWei Hu (Xavier) desc[0].data[0] = 16383988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_SSU_1BIT_ECC_ERR_INT_EN); 16393988ab0eSWei Hu (Xavier) desc[0].data[1] = 16403988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_SSU_MULTI_BIT_ECC_ERR_INT_EN); 16413988ab0eSWei Hu (Xavier) desc[0].data[4] = 16423988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_SSU_BIT32_ECC_ERR_INT_EN); 16433988ab0eSWei Hu (Xavier) } 16443988ab0eSWei Hu (Xavier) 16453988ab0eSWei Hu (Xavier) desc[1].data[0] = rte_cpu_to_le_32(HNS3_SSU_1BIT_ECC_ERR_INT_EN_MASK); 16463988ab0eSWei Hu (Xavier) desc[1].data[1] = 16473988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_SSU_MULTI_BIT_ECC_ERR_INT_EN_MASK); 16483988ab0eSWei Hu (Xavier) desc[1].data[2] = rte_cpu_to_le_32(HNS3_SSU_BIT32_ECC_ERR_INT_EN_MASK); 16493988ab0eSWei Hu (Xavier) 16503988ab0eSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc[0], 2); 16513988ab0eSWei Hu (Xavier) if (ret) { 1652f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s SSU ECC error interrupt, ret = %d", 1653f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 16543988ab0eSWei Hu (Xavier) return ret; 16553988ab0eSWei Hu (Xavier) } 16563988ab0eSWei Hu (Xavier) 16573988ab0eSWei Hu (Xavier) /* configure SSU common error interrupts */ 1658f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], HNS3_OPC_SSU_COMMON_INT_CMD, false); 16593988ab0eSWei Hu (Xavier) desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT); 1660f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[1], HNS3_OPC_SSU_COMMON_INT_CMD, false); 16613988ab0eSWei Hu (Xavier) 16623988ab0eSWei Hu (Xavier) if (en) { 16633988ab0eSWei Hu (Xavier) desc[0].data[0] = rte_cpu_to_le_32(HNS3_SSU_COMMON_INT_EN); 16643988ab0eSWei Hu (Xavier) desc[0].data[1] = 16653988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_SSU_PORT_BASED_ERR_INT_EN); 16663988ab0eSWei Hu (Xavier) desc[0].data[2] = 16673988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_SSU_FIFO_OVERFLOW_ERR_INT_EN); 16683988ab0eSWei Hu (Xavier) } 16693988ab0eSWei Hu (Xavier) 16703988ab0eSWei Hu (Xavier) desc[1].data[0] = rte_cpu_to_le_32(HNS3_SSU_COMMON_INT_EN_MASK | 16713988ab0eSWei Hu (Xavier) HNS3_SSU_PORT_BASED_ERR_INT_EN_MASK); 16723988ab0eSWei Hu (Xavier) desc[1].data[1] = 16733988ab0eSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_SSU_FIFO_OVERFLOW_ERR_INT_EN_MASK); 16743988ab0eSWei Hu (Xavier) 16753988ab0eSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc[0], 2); 16763988ab0eSWei Hu (Xavier) if (ret) 1677f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s SSU COMMON error intr, ret = %d", 1678f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 16793988ab0eSWei Hu (Xavier) 16803988ab0eSWei Hu (Xavier) return ret; 16813988ab0eSWei Hu (Xavier) } 16823988ab0eSWei Hu (Xavier) 16835f8845f4SHongbo Zheng void 16845f8845f4SHongbo Zheng hns3_config_mac_tnl_int(struct hns3_hw *hw, bool en) 16855f8845f4SHongbo Zheng { 16865f8845f4SHongbo Zheng struct hns3_cmd_desc desc; 16875f8845f4SHongbo Zheng int ret; 16885f8845f4SHongbo Zheng 16895f8845f4SHongbo Zheng hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MAC_TNL_INT_EN, false); 16905f8845f4SHongbo Zheng if (en) 16915f8845f4SHongbo Zheng desc.data[0] = rte_cpu_to_le_32(HNS3_MAC_TNL_INT_EN); 16925f8845f4SHongbo Zheng else 16935f8845f4SHongbo Zheng desc.data[0] = 0; 16945f8845f4SHongbo Zheng 16955f8845f4SHongbo Zheng desc.data[1] = rte_cpu_to_le_32(HNS3_MAC_TNL_INT_EN_MASK); 16965f8845f4SHongbo Zheng 16975f8845f4SHongbo Zheng ret = hns3_cmd_send(hw, &desc, 1); 16985f8845f4SHongbo Zheng if (ret) 16995f8845f4SHongbo Zheng hns3_err(hw, "fail to %s mac tnl intr, ret = %d", 17005f8845f4SHongbo Zheng en ? "enable" : "disable", ret); 17015f8845f4SHongbo Zheng } 17025f8845f4SHongbo Zheng 17033988ab0eSWei Hu (Xavier) static int 17043988ab0eSWei Hu (Xavier) config_ppu_err_intrs(struct hns3_adapter *hns, uint32_t cmd, bool en) 17053988ab0eSWei Hu (Xavier) { 17063988ab0eSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 17073988ab0eSWei Hu (Xavier) struct hns3_cmd_desc desc[2]; 17083988ab0eSWei Hu (Xavier) int num = 1; 17093988ab0eSWei Hu (Xavier) 17103988ab0eSWei Hu (Xavier) /* configure PPU error interrupts */ 17113988ab0eSWei Hu (Xavier) switch (cmd) { 1712f53a793bSWei Hu (Xavier) case HNS3_OPC_PPU_MPF_ECC_INT_CMD: 17133988ab0eSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], cmd, false); 17143988ab0eSWei Hu (Xavier) desc[0].flag |= HNS3_CMD_FLAG_NEXT; 17153988ab0eSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[1], cmd, false); 17163988ab0eSWei Hu (Xavier) if (en) { 17173988ab0eSWei Hu (Xavier) desc[0].data[0] = HNS3_PPU_MPF_ABNORMAL_INT0_EN; 17183988ab0eSWei Hu (Xavier) desc[0].data[1] = HNS3_PPU_MPF_ABNORMAL_INT1_EN; 17193988ab0eSWei Hu (Xavier) desc[1].data[3] = HNS3_PPU_MPF_ABNORMAL_INT3_EN; 17203988ab0eSWei Hu (Xavier) desc[1].data[4] = HNS3_PPU_MPF_ABNORMAL_INT2_EN; 17213988ab0eSWei Hu (Xavier) } 17223988ab0eSWei Hu (Xavier) 17233988ab0eSWei Hu (Xavier) desc[1].data[0] = HNS3_PPU_MPF_ABNORMAL_INT0_EN_MASK; 17243988ab0eSWei Hu (Xavier) desc[1].data[1] = HNS3_PPU_MPF_ABNORMAL_INT1_EN_MASK; 17253988ab0eSWei Hu (Xavier) desc[1].data[2] = HNS3_PPU_MPF_ABNORMAL_INT2_EN_MASK; 17263988ab0eSWei Hu (Xavier) desc[1].data[3] |= HNS3_PPU_MPF_ABNORMAL_INT3_EN_MASK; 17273988ab0eSWei Hu (Xavier) num = 2; 17283988ab0eSWei Hu (Xavier) break; 1729f53a793bSWei Hu (Xavier) case HNS3_OPC_PPU_MPF_OTHER_INT_CMD: 17303988ab0eSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], cmd, false); 17313988ab0eSWei Hu (Xavier) if (en) 17323988ab0eSWei Hu (Xavier) desc[0].data[0] = HNS3_PPU_MPF_ABNORMAL_INT2_EN2; 17333988ab0eSWei Hu (Xavier) 17343988ab0eSWei Hu (Xavier) desc[0].data[2] = HNS3_PPU_MPF_ABNORMAL_INT2_EN2_MASK; 17353988ab0eSWei Hu (Xavier) break; 1736f53a793bSWei Hu (Xavier) case HNS3_OPC_PPU_PF_OTHER_INT_CMD: 17373988ab0eSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], cmd, false); 17383988ab0eSWei Hu (Xavier) if (en) 17393988ab0eSWei Hu (Xavier) desc[0].data[0] = HNS3_PPU_PF_ABNORMAL_INT_EN; 17403988ab0eSWei Hu (Xavier) 17413988ab0eSWei Hu (Xavier) desc[0].data[2] = HNS3_PPU_PF_ABNORMAL_INT_EN_MASK; 17423988ab0eSWei Hu (Xavier) break; 17433988ab0eSWei Hu (Xavier) default: 17443988ab0eSWei Hu (Xavier) hns3_err(hw, 17453988ab0eSWei Hu (Xavier) "Invalid cmd(%u) to configure PPU error interrupts.", 17463988ab0eSWei Hu (Xavier) cmd); 17473988ab0eSWei Hu (Xavier) return -EINVAL; 17483988ab0eSWei Hu (Xavier) } 17493988ab0eSWei Hu (Xavier) 17503988ab0eSWei Hu (Xavier) return hns3_cmd_send(hw, &desc[0], num); 17513988ab0eSWei Hu (Xavier) } 17523988ab0eSWei Hu (Xavier) 17533988ab0eSWei Hu (Xavier) static int 17543988ab0eSWei Hu (Xavier) enable_ppu_err_intr(struct hns3_adapter *hns, bool en) 17553988ab0eSWei Hu (Xavier) { 17563988ab0eSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 17573988ab0eSWei Hu (Xavier) int ret; 17583988ab0eSWei Hu (Xavier) 1759f53a793bSWei Hu (Xavier) ret = config_ppu_err_intrs(hns, HNS3_OPC_PPU_MPF_ECC_INT_CMD, en); 17603988ab0eSWei Hu (Xavier) if (ret) { 1761f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s PPU MPF ECC error intr, ret = %d", 1762f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 17633988ab0eSWei Hu (Xavier) return ret; 17643988ab0eSWei Hu (Xavier) } 17653988ab0eSWei Hu (Xavier) 1766f53a793bSWei Hu (Xavier) ret = config_ppu_err_intrs(hns, HNS3_OPC_PPU_MPF_OTHER_INT_CMD, en); 17673988ab0eSWei Hu (Xavier) if (ret) { 1768f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s PPU MPF other intr, ret = %d", 1769f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 17703988ab0eSWei Hu (Xavier) return ret; 17713988ab0eSWei Hu (Xavier) } 17723988ab0eSWei Hu (Xavier) 1773f53a793bSWei Hu (Xavier) ret = config_ppu_err_intrs(hns, HNS3_OPC_PPU_PF_OTHER_INT_CMD, en); 17743988ab0eSWei Hu (Xavier) if (ret) 1775f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s PPU PF error interrupts, ret = %d", 1776f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 1777f53a793bSWei Hu (Xavier) return ret; 1778f53a793bSWei Hu (Xavier) } 1779f53a793bSWei Hu (Xavier) 1780f53a793bSWei Hu (Xavier) static int 1781f53a793bSWei Hu (Xavier) enable_tm_err_intr(struct hns3_adapter *hns, bool en) 1782f53a793bSWei Hu (Xavier) { 1783f53a793bSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 1784f53a793bSWei Hu (Xavier) struct hns3_cmd_desc desc; 1785f53a793bSWei Hu (Xavier) int ret; 1786f53a793bSWei Hu (Xavier) 1787f53a793bSWei Hu (Xavier) /* configure TM SCH error interrupts */ 1788f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_TM_SCH_ECC_INT_EN, false); 1789f53a793bSWei Hu (Xavier) if (en) 1790f53a793bSWei Hu (Xavier) desc.data[0] = rte_cpu_to_le_32(HNS3_TM_SCH_ECC_ERR_INT_EN); 1791f53a793bSWei Hu (Xavier) 1792f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 1793f53a793bSWei Hu (Xavier) if (ret) { 1794f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s TM SCH interrupts, ret = %d", 1795f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 1796f53a793bSWei Hu (Xavier) return ret; 1797f53a793bSWei Hu (Xavier) } 1798f53a793bSWei Hu (Xavier) 1799f53a793bSWei Hu (Xavier) /* configure TM QCN hw errors */ 18003903c053SChengwen Feng hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_TM_QCN_MEM_INT_CFG, false); 1801ffb62592SChengwen Feng desc.data[0] = rte_cpu_to_le_32(HNS3_TM_QCN_ERR_INT_TYPE); 1802ffb62592SChengwen Feng if (en) { 1803ffb62592SChengwen Feng desc.data[0] |= rte_cpu_to_le_32(HNS3_TM_QCN_FIFO_INT_EN); 1804f53a793bSWei Hu (Xavier) desc.data[1] = rte_cpu_to_le_32(HNS3_TM_QCN_MEM_ERR_INT_EN); 1805ffb62592SChengwen Feng } 1806f53a793bSWei Hu (Xavier) 1807f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 1808f53a793bSWei Hu (Xavier) if (ret) 1809f665790aSDavid Marchand hns3_err(hw, "fail to %s TM QCN mem errors, ret = %d", 1810f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 1811f53a793bSWei Hu (Xavier) 1812f53a793bSWei Hu (Xavier) return ret; 1813f53a793bSWei Hu (Xavier) } 1814f53a793bSWei Hu (Xavier) 1815f53a793bSWei Hu (Xavier) static int 1816f53a793bSWei Hu (Xavier) enable_common_err_intr(struct hns3_adapter *hns, bool en) 1817f53a793bSWei Hu (Xavier) { 1818f53a793bSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 1819f53a793bSWei Hu (Xavier) struct hns3_cmd_desc desc[2]; 1820f53a793bSWei Hu (Xavier) int ret; 1821f53a793bSWei Hu (Xavier) 1822f53a793bSWei Hu (Xavier) /* configure common error interrupts */ 1823f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], HNS3_OPC_COMMON_ECC_INT_CFG, false); 1824f53a793bSWei Hu (Xavier) desc[0].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT); 1825f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[1], HNS3_OPC_COMMON_ECC_INT_CFG, false); 1826f53a793bSWei Hu (Xavier) 1827f53a793bSWei Hu (Xavier) if (en) { 1828f53a793bSWei Hu (Xavier) desc[0].data[0] = 1829f53a793bSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_IMP_TCM_ECC_ERR_INT_EN); 1830f53a793bSWei Hu (Xavier) desc[0].data[2] = 1831f53a793bSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_CMDQ_NIC_ECC_ERR_INT_EN); 1832f53a793bSWei Hu (Xavier) desc[0].data[3] = 1833f53a793bSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_IMP_RD_POISON_ERR_INT_EN); 1834f53a793bSWei Hu (Xavier) desc[0].data[4] = 1835f53a793bSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_TQP_ECC_ERR_INT_EN | 1836f53a793bSWei Hu (Xavier) HNS3_MSIX_SRAM_ECC_ERR_INT_EN); 1837f53a793bSWei Hu (Xavier) desc[0].data[5] = 1838f53a793bSWei Hu (Xavier) rte_cpu_to_le_32(HNS3_IMP_ITCM4_ECC_ERR_INT_EN); 1839f53a793bSWei Hu (Xavier) } 1840f53a793bSWei Hu (Xavier) 1841f53a793bSWei Hu (Xavier) desc[1].data[0] = rte_cpu_to_le_32(HNS3_IMP_TCM_ECC_ERR_INT_EN_MASK); 1842f53a793bSWei Hu (Xavier) desc[1].data[2] = rte_cpu_to_le_32(HNS3_CMDQ_NIC_ECC_ERR_INT_EN_MASK); 1843f53a793bSWei Hu (Xavier) desc[1].data[3] = rte_cpu_to_le_32(HNS3_IMP_RD_POISON_ERR_INT_EN_MASK); 1844f53a793bSWei Hu (Xavier) desc[1].data[4] = rte_cpu_to_le_32(HNS3_TQP_ECC_ERR_INT_EN_MASK | 1845f53a793bSWei Hu (Xavier) HNS3_MSIX_SRAM_ECC_ERR_INT_EN_MASK); 1846f53a793bSWei Hu (Xavier) desc[1].data[5] = rte_cpu_to_le_32(HNS3_IMP_ITCM4_ECC_ERR_INT_EN_MASK); 1847f53a793bSWei Hu (Xavier) 1848f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc[0], RTE_DIM(desc)); 1849f53a793bSWei Hu (Xavier) if (ret) 1850f665790aSDavid Marchand hns3_err(hw, "fail to %s common err interrupts, ret = %d", 1851f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 1852f53a793bSWei Hu (Xavier) 18533988ab0eSWei Hu (Xavier) return ret; 18543988ab0eSWei Hu (Xavier) } 18553988ab0eSWei Hu (Xavier) 18563988ab0eSWei Hu (Xavier) static int 18573988ab0eSWei Hu (Xavier) enable_mac_err_intr(struct hns3_adapter *hns, bool en) 18583988ab0eSWei Hu (Xavier) { 18593988ab0eSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 18603988ab0eSWei Hu (Xavier) struct hns3_cmd_desc desc; 18613988ab0eSWei Hu (Xavier) int ret; 18623988ab0eSWei Hu (Xavier) 18633988ab0eSWei Hu (Xavier) /* configure MAC common error interrupts */ 1864f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MAC_COMMON_INT_EN, false); 18653988ab0eSWei Hu (Xavier) if (en) 18663988ab0eSWei Hu (Xavier) desc.data[0] = rte_cpu_to_le_32(HNS3_MAC_COMMON_ERR_INT_EN); 18673988ab0eSWei Hu (Xavier) 18683988ab0eSWei Hu (Xavier) desc.data[1] = rte_cpu_to_le_32(HNS3_MAC_COMMON_ERR_INT_EN_MASK); 18693988ab0eSWei Hu (Xavier) 18703988ab0eSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 18713988ab0eSWei Hu (Xavier) if (ret) 1872f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to %s MAC COMMON error intr: %d", 1873f53a793bSWei Hu (Xavier) en ? "enable" : "disable", ret); 18743988ab0eSWei Hu (Xavier) 18753988ab0eSWei Hu (Xavier) return ret; 18763988ab0eSWei Hu (Xavier) } 18773988ab0eSWei Hu (Xavier) 18783988ab0eSWei Hu (Xavier) static const struct hns3_hw_blk hw_blk[] = { 18793988ab0eSWei Hu (Xavier) { 1880f53a793bSWei Hu (Xavier) .name = "IGU_EGU", 1881f53a793bSWei Hu (Xavier) .enable_err_intr = enable_igu_egu_err_intr, 1882f53a793bSWei Hu (Xavier) }, 1883f53a793bSWei Hu (Xavier) { 18843988ab0eSWei Hu (Xavier) .name = "PPP", 18853988ab0eSWei Hu (Xavier) .enable_err_intr = enable_ppp_err_intr, 18863988ab0eSWei Hu (Xavier) }, 18873988ab0eSWei Hu (Xavier) { 18883988ab0eSWei Hu (Xavier) .name = "SSU", 18893988ab0eSWei Hu (Xavier) .enable_err_intr = enable_ssu_err_intr, 18903988ab0eSWei Hu (Xavier) }, 18913988ab0eSWei Hu (Xavier) { 18923988ab0eSWei Hu (Xavier) .name = "PPU", 18933988ab0eSWei Hu (Xavier) .enable_err_intr = enable_ppu_err_intr, 18943988ab0eSWei Hu (Xavier) }, 18953988ab0eSWei Hu (Xavier) { 1896f53a793bSWei Hu (Xavier) .name = "TM", 1897f53a793bSWei Hu (Xavier) .enable_err_intr = enable_tm_err_intr, 1898f53a793bSWei Hu (Xavier) }, 1899f53a793bSWei Hu (Xavier) { 1900f53a793bSWei Hu (Xavier) .name = "COMMON", 1901f53a793bSWei Hu (Xavier) .enable_err_intr = enable_common_err_intr, 1902f53a793bSWei Hu (Xavier) }, 1903f53a793bSWei Hu (Xavier) { 19043988ab0eSWei Hu (Xavier) .name = "MAC", 19053988ab0eSWei Hu (Xavier) .enable_err_intr = enable_mac_err_intr, 19063988ab0eSWei Hu (Xavier) }, 19073988ab0eSWei Hu (Xavier) { 19083988ab0eSWei Hu (Xavier) .name = NULL, 19093988ab0eSWei Hu (Xavier) .enable_err_intr = NULL, 19103988ab0eSWei Hu (Xavier) } 19113988ab0eSWei Hu (Xavier) }; 19123988ab0eSWei Hu (Xavier) 19133988ab0eSWei Hu (Xavier) int 19143988ab0eSWei Hu (Xavier) hns3_enable_hw_error_intr(struct hns3_adapter *hns, bool en) 19153988ab0eSWei Hu (Xavier) { 19163988ab0eSWei Hu (Xavier) const struct hns3_hw_blk *module = hw_blk; 19173988ab0eSWei Hu (Xavier) int ret = 0; 19183988ab0eSWei Hu (Xavier) 19193988ab0eSWei Hu (Xavier) while (module->enable_err_intr) { 19203988ab0eSWei Hu (Xavier) ret = module->enable_err_intr(hns, en); 19213988ab0eSWei Hu (Xavier) if (ret) 19223988ab0eSWei Hu (Xavier) return ret; 19233988ab0eSWei Hu (Xavier) 19243988ab0eSWei Hu (Xavier) module++; 19253988ab0eSWei Hu (Xavier) } 19263988ab0eSWei Hu (Xavier) 19273988ab0eSWei Hu (Xavier) return ret; 19283988ab0eSWei Hu (Xavier) } 19293988ab0eSWei Hu (Xavier) 19303988ab0eSWei Hu (Xavier) static enum hns3_reset_level 19313988ab0eSWei Hu (Xavier) hns3_find_highest_level(struct hns3_adapter *hns, const char *reg, 19323988ab0eSWei Hu (Xavier) const struct hns3_hw_error *err, uint32_t err_sts) 19333988ab0eSWei Hu (Xavier) { 19343988ab0eSWei Hu (Xavier) enum hns3_reset_level reset_level = HNS3_FUNC_RESET; 19353988ab0eSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 19363988ab0eSWei Hu (Xavier) bool need_reset = false; 19373988ab0eSWei Hu (Xavier) 19383988ab0eSWei Hu (Xavier) while (err->msg) { 19393988ab0eSWei Hu (Xavier) if (err->int_msk & err_sts) { 19403988ab0eSWei Hu (Xavier) hns3_warn(hw, "%s %s found [error status=0x%x]", 19413988ab0eSWei Hu (Xavier) reg, err->msg, err_sts); 19423988ab0eSWei Hu (Xavier) if (err->reset_level != HNS3_NONE_RESET && 19433988ab0eSWei Hu (Xavier) err->reset_level >= reset_level) { 19443988ab0eSWei Hu (Xavier) reset_level = err->reset_level; 19453988ab0eSWei Hu (Xavier) need_reset = true; 19463988ab0eSWei Hu (Xavier) } 19473988ab0eSWei Hu (Xavier) } 19483988ab0eSWei Hu (Xavier) err++; 19493988ab0eSWei Hu (Xavier) } 19503988ab0eSWei Hu (Xavier) if (need_reset) 19513988ab0eSWei Hu (Xavier) return reset_level; 19523988ab0eSWei Hu (Xavier) else 19533988ab0eSWei Hu (Xavier) return HNS3_NONE_RESET; 19543988ab0eSWei Hu (Xavier) } 19553988ab0eSWei Hu (Xavier) 19563988ab0eSWei Hu (Xavier) static int 1957f53a793bSWei Hu (Xavier) query_num_bds(struct hns3_hw *hw, bool is_ras, uint32_t *mpf_bd_num, 1958f53a793bSWei Hu (Xavier) uint32_t *pf_bd_num) 19593988ab0eSWei Hu (Xavier) { 1960f53a793bSWei Hu (Xavier) uint32_t mpf_min_bd_num, pf_min_bd_num; 1961f53a793bSWei Hu (Xavier) uint32_t mpf_bd_num_val, pf_bd_num_val; 1962f53a793bSWei Hu (Xavier) enum hns3_opcode_type opcode; 1963f53a793bSWei Hu (Xavier) struct hns3_cmd_desc desc; 19643988ab0eSWei Hu (Xavier) int ret; 19653988ab0eSWei Hu (Xavier) 1966f53a793bSWei Hu (Xavier) if (is_ras) { 1967f53a793bSWei Hu (Xavier) opcode = HNS3_OPC_QUERY_RAS_INT_STS_BD_NUM; 1968f53a793bSWei Hu (Xavier) mpf_min_bd_num = HNS3_MPF_RAS_INT_MIN_BD_NUM; 1969f53a793bSWei Hu (Xavier) pf_min_bd_num = HNS3_PF_RAS_INT_MIN_BD_NUM; 1970f53a793bSWei Hu (Xavier) } else { 1971f53a793bSWei Hu (Xavier) opcode = HNS3_OPC_QUERY_MSIX_INT_STS_BD_NUM; 1972f53a793bSWei Hu (Xavier) mpf_min_bd_num = HNS3_MPF_MSIX_INT_MIN_BD_NUM; 1973f53a793bSWei Hu (Xavier) pf_min_bd_num = HNS3_PF_MSIX_INT_MIN_BD_NUM; 1974f53a793bSWei Hu (Xavier) } 19753988ab0eSWei Hu (Xavier) 1976f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, opcode, true); 1977f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 1978f53a793bSWei Hu (Xavier) if (ret) { 1979f53a793bSWei Hu (Xavier) hns3_err(hw, "query num bds in msix failed, ret = %d", ret); 19803988ab0eSWei Hu (Xavier) return ret; 19813988ab0eSWei Hu (Xavier) } 19823988ab0eSWei Hu (Xavier) 1983f53a793bSWei Hu (Xavier) mpf_bd_num_val = rte_le_to_cpu_32(desc.data[0]); 1984f53a793bSWei Hu (Xavier) pf_bd_num_val = rte_le_to_cpu_32(desc.data[1]); 1985f53a793bSWei Hu (Xavier) if (mpf_bd_num_val < mpf_min_bd_num || pf_bd_num_val < pf_min_bd_num) { 1986f53a793bSWei Hu (Xavier) hns3_err(hw, "error bd num: mpf(%u), min_mpf(%u), " 1987f665790aSDavid Marchand "pf(%u), min_pf(%u)", mpf_bd_num_val, mpf_min_bd_num, 1988f53a793bSWei Hu (Xavier) pf_bd_num_val, pf_min_bd_num); 1989f53a793bSWei Hu (Xavier) return -EINVAL; 19903988ab0eSWei Hu (Xavier) } 19913988ab0eSWei Hu (Xavier) 1992f53a793bSWei Hu (Xavier) *mpf_bd_num = mpf_bd_num_val; 1993f53a793bSWei Hu (Xavier) *pf_bd_num = pf_bd_num_val; 19943988ab0eSWei Hu (Xavier) 1995f53a793bSWei Hu (Xavier) return 0; 19963988ab0eSWei Hu (Xavier) } 19973988ab0eSWei Hu (Xavier) 19983988ab0eSWei Hu (Xavier) void 19993988ab0eSWei Hu (Xavier) hns3_intr_unregister(const struct rte_intr_handle *hdl, 20003988ab0eSWei Hu (Xavier) rte_intr_callback_fn cb_fn, void *cb_arg) 20013988ab0eSWei Hu (Xavier) { 20023988ab0eSWei Hu (Xavier) int retry_cnt = 0; 20033988ab0eSWei Hu (Xavier) int ret; 20043988ab0eSWei Hu (Xavier) 20053988ab0eSWei Hu (Xavier) do { 20063988ab0eSWei Hu (Xavier) ret = rte_intr_callback_unregister(hdl, cb_fn, cb_arg); 20073988ab0eSWei Hu (Xavier) if (ret >= 0) { 20083988ab0eSWei Hu (Xavier) break; 20093988ab0eSWei Hu (Xavier) } else if (ret != -EAGAIN) { 20103988ab0eSWei Hu (Xavier) PMD_INIT_LOG(ERR, "Failed to unregister intr: %d", ret); 20113988ab0eSWei Hu (Xavier) break; 20123988ab0eSWei Hu (Xavier) } 20133988ab0eSWei Hu (Xavier) rte_delay_ms(HNS3_INTR_UNREG_FAIL_DELAY_MS); 20143988ab0eSWei Hu (Xavier) } while (retry_cnt++ < HNS3_INTR_UNREG_FAIL_RETRY_CNT); 20153988ab0eSWei Hu (Xavier) } 20163988ab0eSWei Hu (Xavier) 2017f53a793bSWei Hu (Xavier) static uint32_t 2018f53a793bSWei Hu (Xavier) hns3_get_hw_error_status(struct hns3_cmd_desc *desc, uint8_t desc_offset, 2019f53a793bSWei Hu (Xavier) uint8_t data_offset) 2020f53a793bSWei Hu (Xavier) { 2021f53a793bSWei Hu (Xavier) uint32_t status; 2022f53a793bSWei Hu (Xavier) uint32_t *desc_data; 2023f53a793bSWei Hu (Xavier) 2024f53a793bSWei Hu (Xavier) if (desc_offset == 0) 2025f53a793bSWei Hu (Xavier) status = rte_le_to_cpu_32(desc[desc_offset].data[data_offset]); 2026f53a793bSWei Hu (Xavier) else { 2027f53a793bSWei Hu (Xavier) desc_data = (uint32_t *)&desc[desc_offset]; 2028f53a793bSWei Hu (Xavier) status = rte_le_to_cpu_32(*(desc_data + data_offset)); 2029f53a793bSWei Hu (Xavier) } 2030f53a793bSWei Hu (Xavier) 2031f53a793bSWei Hu (Xavier) return status; 2032f53a793bSWei Hu (Xavier) } 2033f53a793bSWei Hu (Xavier) 2034f53a793bSWei Hu (Xavier) static int 2035f53a793bSWei Hu (Xavier) hns3_handle_hw_error(struct hns3_adapter *hns, struct hns3_cmd_desc *desc, 2036e12a0166STyler Retzlaff int num, RTE_ATOMIC(uint64_t) *levels, 20371c1eb759SHongbo Zheng enum hns3_hw_err_report_type err_type) 2038f53a793bSWei Hu (Xavier) { 2039f53a793bSWei Hu (Xavier) const struct hns3_hw_error_desc *err = pf_ras_err_tbl; 2040f53a793bSWei Hu (Xavier) enum hns3_opcode_type opcode; 2041f53a793bSWei Hu (Xavier) enum hns3_reset_level req_level; 2042f53a793bSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 2043f53a793bSWei Hu (Xavier) uint32_t status; 2044f53a793bSWei Hu (Xavier) int ret; 2045f53a793bSWei Hu (Xavier) 2046f53a793bSWei Hu (Xavier) switch (err_type) { 2047f53a793bSWei Hu (Xavier) case MPF_MSIX_ERR: 2048f53a793bSWei Hu (Xavier) err = mpf_msix_err_tbl; 2049f53a793bSWei Hu (Xavier) opcode = HNS3_OPC_QUERY_CLEAR_ALL_MPF_MSIX_INT; 2050f53a793bSWei Hu (Xavier) break; 2051f53a793bSWei Hu (Xavier) case PF_MSIX_ERR: 2052f53a793bSWei Hu (Xavier) err = pf_msix_err_tbl; 2053f53a793bSWei Hu (Xavier) opcode = HNS3_OPC_QUERY_CLEAR_ALL_PF_MSIX_INT; 2054f53a793bSWei Hu (Xavier) break; 2055f53a793bSWei Hu (Xavier) case MPF_RAS_ERR: 2056f53a793bSWei Hu (Xavier) err = mpf_ras_err_tbl; 2057f53a793bSWei Hu (Xavier) opcode = HNS3_OPC_QUERY_CLEAR_MPF_RAS_INT; 2058f53a793bSWei Hu (Xavier) break; 2059f53a793bSWei Hu (Xavier) case PF_RAS_ERR: 2060f53a793bSWei Hu (Xavier) err = pf_ras_err_tbl; 2061f53a793bSWei Hu (Xavier) opcode = HNS3_OPC_QUERY_CLEAR_PF_RAS_INT; 2062f53a793bSWei Hu (Xavier) break; 2063f53a793bSWei Hu (Xavier) default: 2064f665790aSDavid Marchand hns3_err(hw, "error hardware err_type = %d", err_type); 2065f53a793bSWei Hu (Xavier) return -EINVAL; 2066f53a793bSWei Hu (Xavier) } 2067f53a793bSWei Hu (Xavier) 2068f53a793bSWei Hu (Xavier) /* query all hardware errors */ 2069f53a793bSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc[0], opcode, true); 2070f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc[0], num); 2071f53a793bSWei Hu (Xavier) if (ret) { 2072f665790aSDavid Marchand hns3_err(hw, "query hw err int 0x%x cmd failed, ret = %d", 2073f53a793bSWei Hu (Xavier) opcode, ret); 2074f53a793bSWei Hu (Xavier) return ret; 2075f53a793bSWei Hu (Xavier) } 2076f53a793bSWei Hu (Xavier) 2077f53a793bSWei Hu (Xavier) /* traverses the error table and process based on the error type */ 2078f53a793bSWei Hu (Xavier) while (err->msg) { 2079f53a793bSWei Hu (Xavier) status = hns3_get_hw_error_status(desc, err->desc_offset, 2080f53a793bSWei Hu (Xavier) err->data_offset); 2081f53a793bSWei Hu (Xavier) if (status) { 2082f53a793bSWei Hu (Xavier) /* 2083f53a793bSWei Hu (Xavier) * set the reset_level or non_reset flag based on 2084f53a793bSWei Hu (Xavier) * the error type and add error statistics. here just 2085f53a793bSWei Hu (Xavier) * set the flag, the actual reset action is in 2086f53a793bSWei Hu (Xavier) * hns3_msix_process. 2087f53a793bSWei Hu (Xavier) */ 2088f53a793bSWei Hu (Xavier) req_level = hns3_find_highest_level(hns, err->msg, 2089f53a793bSWei Hu (Xavier) err->hw_err, 2090f53a793bSWei Hu (Xavier) status); 2091f53a793bSWei Hu (Xavier) hns3_atomic_set_bit(req_level, levels); 2092f53a793bSWei Hu (Xavier) } 2093f53a793bSWei Hu (Xavier) err++; 2094f53a793bSWei Hu (Xavier) } 2095f53a793bSWei Hu (Xavier) 2096f53a793bSWei Hu (Xavier) /* clear all hardware errors */ 2097f53a793bSWei Hu (Xavier) hns3_cmd_reuse_desc(&desc[0], false); 2098f53a793bSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc[0], num); 2099f53a793bSWei Hu (Xavier) if (ret) 2100f665790aSDavid Marchand hns3_err(hw, "clear all hw err int cmd failed, ret = %d", 2101f53a793bSWei Hu (Xavier) ret); 2102f53a793bSWei Hu (Xavier) 2103f53a793bSWei Hu (Xavier) return ret; 2104f53a793bSWei Hu (Xavier) } 2105f53a793bSWei Hu (Xavier) 21063988ab0eSWei Hu (Xavier) void 2107e12a0166STyler Retzlaff hns3_handle_msix_error(struct hns3_adapter *hns, RTE_ATOMIC(uint64_t) *levels) 21083988ab0eSWei Hu (Xavier) { 21093988ab0eSWei Hu (Xavier) uint32_t mpf_bd_num, pf_bd_num, bd_num; 21103988ab0eSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 21113988ab0eSWei Hu (Xavier) struct hns3_cmd_desc *desc; 21123988ab0eSWei Hu (Xavier) int ret; 21133988ab0eSWei Hu (Xavier) 21143988ab0eSWei Hu (Xavier) /* query the number of bds for the MSIx int status */ 2115f53a793bSWei Hu (Xavier) ret = query_num_bds(hw, false, &mpf_bd_num, &pf_bd_num); 21163988ab0eSWei Hu (Xavier) if (ret) { 2117f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to query msix int status bd num: ret = %d", 2118f53a793bSWei Hu (Xavier) ret); 21193988ab0eSWei Hu (Xavier) return; 21203988ab0eSWei Hu (Xavier) } 21213988ab0eSWei Hu (Xavier) 2122f53a793bSWei Hu (Xavier) bd_num = RTE_MAX(mpf_bd_num, pf_bd_num); 21233988ab0eSWei Hu (Xavier) desc = rte_zmalloc(NULL, bd_num * sizeof(struct hns3_cmd_desc), 0); 21243988ab0eSWei Hu (Xavier) if (desc == NULL) { 2125f53a793bSWei Hu (Xavier) hns3_err(hw, 2126f53a793bSWei Hu (Xavier) "fail to zmalloc desc for handling msix error, size = %zu", 2127f53a793bSWei Hu (Xavier) bd_num * sizeof(struct hns3_cmd_desc)); 21283988ab0eSWei Hu (Xavier) return; 21293988ab0eSWei Hu (Xavier) } 21303988ab0eSWei Hu (Xavier) 2131f53a793bSWei Hu (Xavier) /* handle all main PF MSIx errors */ 2132f53a793bSWei Hu (Xavier) ret = hns3_handle_hw_error(hns, desc, mpf_bd_num, levels, MPF_MSIX_ERR); 21333988ab0eSWei Hu (Xavier) if (ret) { 2134f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to handle all main pf msix errors, ret = %d", 2135f53a793bSWei Hu (Xavier) ret); 21363988ab0eSWei Hu (Xavier) goto out; 21373988ab0eSWei Hu (Xavier) } 21383988ab0eSWei Hu (Xavier) 21393988ab0eSWei Hu (Xavier) memset(desc, 0, bd_num * sizeof(struct hns3_cmd_desc)); 2140f53a793bSWei Hu (Xavier) 2141f53a793bSWei Hu (Xavier) /* handle all PF MSIx errors */ 2142f53a793bSWei Hu (Xavier) ret = hns3_handle_hw_error(hns, desc, pf_bd_num, levels, PF_MSIX_ERR); 21433988ab0eSWei Hu (Xavier) if (ret) { 2144f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to handle all pf msix errors, ret = %d", 2145f53a793bSWei Hu (Xavier) ret); 21463988ab0eSWei Hu (Xavier) goto out; 21473988ab0eSWei Hu (Xavier) } 21483988ab0eSWei Hu (Xavier) 2149f53a793bSWei Hu (Xavier) out: 2150f53a793bSWei Hu (Xavier) rte_free(desc); 21513988ab0eSWei Hu (Xavier) } 21523988ab0eSWei Hu (Xavier) 2153f53a793bSWei Hu (Xavier) void 2154e12a0166STyler Retzlaff hns3_handle_ras_error(struct hns3_adapter *hns, RTE_ATOMIC(uint64_t) *levels) 2155f53a793bSWei Hu (Xavier) { 2156f53a793bSWei Hu (Xavier) uint32_t mpf_bd_num, pf_bd_num, bd_num; 2157f53a793bSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 2158f53a793bSWei Hu (Xavier) struct hns3_cmd_desc *desc; 2159f53a793bSWei Hu (Xavier) uint32_t status; 2160f53a793bSWei Hu (Xavier) int ret; 2161f53a793bSWei Hu (Xavier) 2162f53a793bSWei Hu (Xavier) status = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG); 2163f53a793bSWei Hu (Xavier) if ((status & HNS3_RAS_REG_NFE_MASK) == 0) 2164f53a793bSWei Hu (Xavier) return; 2165f53a793bSWei Hu (Xavier) 2166f53a793bSWei Hu (Xavier) /* query the number of bds for the RAS int status */ 2167f53a793bSWei Hu (Xavier) ret = query_num_bds(hw, true, &mpf_bd_num, &pf_bd_num); 2168f53a793bSWei Hu (Xavier) if (ret) { 2169f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to query ras int status bd num: ret = %d", 2170f53a793bSWei Hu (Xavier) ret); 2171f53a793bSWei Hu (Xavier) return; 21723988ab0eSWei Hu (Xavier) } 21733988ab0eSWei Hu (Xavier) 2174f53a793bSWei Hu (Xavier) bd_num = RTE_MAX(mpf_bd_num, pf_bd_num); 2175f53a793bSWei Hu (Xavier) desc = rte_zmalloc(NULL, bd_num * sizeof(struct hns3_cmd_desc), 0); 2176f53a793bSWei Hu (Xavier) if (desc == NULL) { 2177f53a793bSWei Hu (Xavier) hns3_err(hw, 2178f53a793bSWei Hu (Xavier) "fail to zmalloc desc for handing ras error, size = %zu", 2179f53a793bSWei Hu (Xavier) bd_num * sizeof(struct hns3_cmd_desc)); 2180f53a793bSWei Hu (Xavier) return; 21813988ab0eSWei Hu (Xavier) } 21823988ab0eSWei Hu (Xavier) 2183f53a793bSWei Hu (Xavier) /* handle all main PF RAS errors */ 2184f53a793bSWei Hu (Xavier) ret = hns3_handle_hw_error(hns, desc, mpf_bd_num, levels, MPF_RAS_ERR); 2185f53a793bSWei Hu (Xavier) if (ret) { 2186f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to handle all main pf ras errors, ret = %d", 2187f53a793bSWei Hu (Xavier) ret); 2188f53a793bSWei Hu (Xavier) goto out; 2189f53a793bSWei Hu (Xavier) } 2190f53a793bSWei Hu (Xavier) 2191f53a793bSWei Hu (Xavier) memset(desc, 0, bd_num * sizeof(struct hns3_cmd_desc)); 2192f53a793bSWei Hu (Xavier) 2193f53a793bSWei Hu (Xavier) /* handle all PF RAS errors */ 2194f53a793bSWei Hu (Xavier) ret = hns3_handle_hw_error(hns, desc, pf_bd_num, levels, PF_RAS_ERR); 2195f53a793bSWei Hu (Xavier) if (ret) { 2196f53a793bSWei Hu (Xavier) hns3_err(hw, "fail to handle all pf ras errors, ret = %d", ret); 2197f53a793bSWei Hu (Xavier) goto out; 2198f53a793bSWei Hu (Xavier) } 2199f53a793bSWei Hu (Xavier) 22003988ab0eSWei Hu (Xavier) out: 22013988ab0eSWei Hu (Xavier) rte_free(desc); 22023988ab0eSWei Hu (Xavier) } 22032790c646SWei Hu (Xavier) 22041c1eb759SHongbo Zheng static void 22051c1eb759SHongbo Zheng hns3_handle_type_reg_error_data(struct hns3_hw *hw, 22061c1eb759SHongbo Zheng struct hns3_mod_err_info *mod_err_info, 22071c1eb759SHongbo Zheng struct hns3_type_reg_err_info *err_info) 22081c1eb759SHongbo Zheng { 22091c1eb759SHongbo Zheng #define HNS3_ERR_TYPE_MASK 0x7F 22101c1eb759SHongbo Zheng #define HNS3_ERR_TYPE_IS_RAS_OFFSET 7 22111c1eb759SHongbo Zheng 22121c1eb759SHongbo Zheng uint8_t mod_id, total_module, type_id, total_type; 22131c1eb759SHongbo Zheng uint8_t is_ras; 22141c1eb759SHongbo Zheng uint8_t i; 22151c1eb759SHongbo Zheng 22161c1eb759SHongbo Zheng mod_id = mod_err_info->mod_id; 22171c1eb759SHongbo Zheng type_id = err_info->type_id & HNS3_ERR_TYPE_MASK; 22181c1eb759SHongbo Zheng is_ras = err_info->type_id >> HNS3_ERR_TYPE_IS_RAS_OFFSET; 22191c1eb759SHongbo Zheng 222077d1f6b1SChengwen Feng total_module = RTE_DIM(hns3_hw_module_name); 222177d1f6b1SChengwen Feng total_type = RTE_DIM(hns3_hw_error_type); 22221c1eb759SHongbo Zheng 22231c1eb759SHongbo Zheng hns3_err(hw, "total_module:%u, total_type:%u", 22241c1eb759SHongbo Zheng total_module, total_type); 22251c1eb759SHongbo Zheng 22261c1eb759SHongbo Zheng if (mod_id < total_module && type_id < total_type) 22271c1eb759SHongbo Zheng hns3_err(hw, "found %s %s, is %s error.", 22281c1eb759SHongbo Zheng hns3_hw_module_name[mod_id].msg, 22291c1eb759SHongbo Zheng hns3_hw_error_type[type_id].msg, 22301c1eb759SHongbo Zheng is_ras ? "ras" : "msix"); 22311c1eb759SHongbo Zheng else 22321c1eb759SHongbo Zheng hns3_err(hw, "unknown module[%u] or type[%u].", 22331c1eb759SHongbo Zheng mod_id, type_id); 22341c1eb759SHongbo Zheng 22351c1eb759SHongbo Zheng hns3_err(hw, "reg_value:"); 22361c1eb759SHongbo Zheng for (i = 0; i < err_info->reg_num; i++) 22371c1eb759SHongbo Zheng hns3_err(hw, "0x%08x", err_info->reg[i]); 22381c1eb759SHongbo Zheng } 22391c1eb759SHongbo Zheng 22401c1eb759SHongbo Zheng static void 22411c1eb759SHongbo Zheng hns3_handle_module_error_data(struct hns3_hw *hw, uint32_t *buf, 22421c1eb759SHongbo Zheng uint32_t buf_size) 22431c1eb759SHongbo Zheng { 22441c1eb759SHongbo Zheng struct hns3_type_reg_err_info *type_reg_err_info; 22451c1eb759SHongbo Zheng struct hns3_mod_err_info *mod_err_info; 22461c1eb759SHongbo Zheng struct hns3_sum_err_info *sum_err_info; 22471c1eb759SHongbo Zheng uint8_t mod_num, reset_type; 22481c1eb759SHongbo Zheng uint32_t offset = 0; 22491c1eb759SHongbo Zheng uint8_t err_num; 22501c1eb759SHongbo Zheng uint8_t i; 22511c1eb759SHongbo Zheng 22521c1eb759SHongbo Zheng sum_err_info = (struct hns3_sum_err_info *)&buf[offset++]; 22531c1eb759SHongbo Zheng mod_num = sum_err_info->mod_num; 22541c1eb759SHongbo Zheng reset_type = sum_err_info->reset_type; 22553db84600SChengwen Feng 22563db84600SChengwen Feng if (reset_type >= HNS3_MAX_RESET) { 22573db84600SChengwen Feng hns3_err(hw, "invalid reset type = %u", reset_type); 22583db84600SChengwen Feng return; 22593db84600SChengwen Feng } 22603db84600SChengwen Feng 22611c1eb759SHongbo Zheng if (reset_type && reset_type != HNS3_NONE_RESET) 22621c1eb759SHongbo Zheng hns3_atomic_set_bit(reset_type, &hw->reset.request); 22631c1eb759SHongbo Zheng 22641c1eb759SHongbo Zheng hns3_err(hw, "reset_type = %s, mod_num = %u.", 22651c1eb759SHongbo Zheng reset_string[reset_type], mod_num); 22661c1eb759SHongbo Zheng 22671c1eb759SHongbo Zheng while (mod_num--) { 22681c1eb759SHongbo Zheng if (offset >= buf_size) { 22691c1eb759SHongbo Zheng hns3_err(hw, "offset(%u) exceeds buf's size(%u).", 22701c1eb759SHongbo Zheng offset, buf_size); 22711c1eb759SHongbo Zheng return; 22721c1eb759SHongbo Zheng } 22731c1eb759SHongbo Zheng mod_err_info = (struct hns3_mod_err_info *)&buf[offset++]; 22741c1eb759SHongbo Zheng err_num = mod_err_info->err_num; 22751c1eb759SHongbo Zheng for (i = 0; i < err_num; i++) { 22761c1eb759SHongbo Zheng if (offset >= buf_size) { 22771c1eb759SHongbo Zheng hns3_err(hw, 22781c1eb759SHongbo Zheng "offset(%u) exceeds buf size(%u).", 22791c1eb759SHongbo Zheng offset, buf_size); 22801c1eb759SHongbo Zheng return; 22811c1eb759SHongbo Zheng } 22821c1eb759SHongbo Zheng 22831c1eb759SHongbo Zheng type_reg_err_info = (struct hns3_type_reg_err_info *) 22841c1eb759SHongbo Zheng &buf[offset++]; 22851c1eb759SHongbo Zheng hns3_handle_type_reg_error_data(hw, mod_err_info, 22861c1eb759SHongbo Zheng type_reg_err_info); 22871c1eb759SHongbo Zheng 22881c1eb759SHongbo Zheng offset += type_reg_err_info->reg_num; 22891c1eb759SHongbo Zheng } 22901c1eb759SHongbo Zheng } 22911c1eb759SHongbo Zheng } 22921c1eb759SHongbo Zheng 22931c1eb759SHongbo Zheng static int 22941c1eb759SHongbo Zheng hns3_query_all_err_bd_num(struct hns3_hw *hw, uint32_t *bd_num) 22951c1eb759SHongbo Zheng { 22961c1eb759SHongbo Zheng struct hns3_cmd_desc desc; 22971c1eb759SHongbo Zheng uint32_t bd_num_data; 22981c1eb759SHongbo Zheng int ret; 22991c1eb759SHongbo Zheng 23001c1eb759SHongbo Zheng hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_QUERY_ALL_ERR_BD_NUM, true); 23011c1eb759SHongbo Zheng ret = hns3_cmd_send(hw, &desc, 1); 23021c1eb759SHongbo Zheng if (ret) { 23031c1eb759SHongbo Zheng hns3_err(hw, "failed to query error bd_num, ret = %d.", ret); 23041c1eb759SHongbo Zheng return ret; 23051c1eb759SHongbo Zheng } 23061c1eb759SHongbo Zheng 23071c1eb759SHongbo Zheng bd_num_data = rte_le_to_cpu_32(desc.data[0]); 23081c1eb759SHongbo Zheng *bd_num = bd_num_data; 23091c1eb759SHongbo Zheng if (bd_num_data == 0) { 23101c1eb759SHongbo Zheng hns3_err(hw, "the value of bd_num is 0!"); 23111c1eb759SHongbo Zheng return -EINVAL; 23121c1eb759SHongbo Zheng } 23131c1eb759SHongbo Zheng 23141c1eb759SHongbo Zheng return 0; 23151c1eb759SHongbo Zheng } 23161c1eb759SHongbo Zheng 23171c1eb759SHongbo Zheng static int 23181c1eb759SHongbo Zheng hns3_query_all_err_info(struct hns3_hw *hw, struct hns3_cmd_desc *desc, 23191c1eb759SHongbo Zheng uint32_t bd_num) 23201c1eb759SHongbo Zheng { 23211c1eb759SHongbo Zheng int ret; 23221c1eb759SHongbo Zheng 23231c1eb759SHongbo Zheng hns3_cmd_setup_basic_desc(desc, HNS3_OPC_QUERY_ALL_ERR_INFO, true); 23241c1eb759SHongbo Zheng ret = hns3_cmd_send(hw, desc, bd_num); 23251c1eb759SHongbo Zheng if (ret) { 23261c1eb759SHongbo Zheng hns3_err(hw, "failed to query error info, ret = %d.", ret); 23271c1eb759SHongbo Zheng return ret; 23281c1eb759SHongbo Zheng } 23291c1eb759SHongbo Zheng 23301c1eb759SHongbo Zheng return ret; 23311c1eb759SHongbo Zheng } 23321c1eb759SHongbo Zheng 23331c1eb759SHongbo Zheng static void 23341c1eb759SHongbo Zheng hns3_handle_hw_error_v2(struct hns3_hw *hw) 23351c1eb759SHongbo Zheng { 23361c1eb759SHongbo Zheng uint32_t bd_num, buf_len, i, buf_size; 23371c1eb759SHongbo Zheng struct hns3_cmd_desc *desc; 23381c1eb759SHongbo Zheng uint32_t *desc_data; 23391c1eb759SHongbo Zheng uint32_t *buf; 23401c1eb759SHongbo Zheng int ret; 23411c1eb759SHongbo Zheng 23421c1eb759SHongbo Zheng ret = hns3_query_all_err_bd_num(hw, &bd_num); 23431c1eb759SHongbo Zheng if (ret) 23441c1eb759SHongbo Zheng goto out; 23451c1eb759SHongbo Zheng 23461c1eb759SHongbo Zheng desc = rte_zmalloc("hns3_ras", bd_num * sizeof(struct hns3_cmd_desc), 23471c1eb759SHongbo Zheng 0); 23481c1eb759SHongbo Zheng if (desc == NULL) { 23491c1eb759SHongbo Zheng hns3_err(hw, "failed to malloc hns3 ras cmd desc."); 23501c1eb759SHongbo Zheng goto out; 23511c1eb759SHongbo Zheng } 23521c1eb759SHongbo Zheng 23531c1eb759SHongbo Zheng ret = hns3_query_all_err_info(hw, desc, bd_num); 23541c1eb759SHongbo Zheng if (ret) 23551c1eb759SHongbo Zheng goto err_desc; 23561c1eb759SHongbo Zheng 23571c1eb759SHongbo Zheng buf_len = bd_num * sizeof(struct hns3_cmd_desc) - HNS3_DESC_NO_DATA_LEN; 23581c1eb759SHongbo Zheng buf_size = buf_len / HNS3_DESC_DATA_UNIT_SIZE; 23591c1eb759SHongbo Zheng 23601c1eb759SHongbo Zheng desc_data = rte_zmalloc("hns3_ras", buf_len, 0); 23611c1eb759SHongbo Zheng if (desc_data == NULL) { 23621c1eb759SHongbo Zheng hns3_err(hw, "failed to malloc hns3 ras desc data."); 23631c1eb759SHongbo Zheng goto err_desc; 23641c1eb759SHongbo Zheng } 23651c1eb759SHongbo Zheng 23661c1eb759SHongbo Zheng buf = rte_zmalloc("hns3_ras", buf_len, 0); 23671c1eb759SHongbo Zheng if (buf == NULL) { 23681c1eb759SHongbo Zheng hns3_err(hw, "failed to malloc hns3 ras buf data."); 23691c1eb759SHongbo Zheng goto err_buf_alloc; 23701c1eb759SHongbo Zheng } 23711c1eb759SHongbo Zheng 23721c1eb759SHongbo Zheng memcpy(desc_data, &desc[0].data[0], buf_len); 23731c1eb759SHongbo Zheng for (i = 0; i < buf_size; i++) 23741c1eb759SHongbo Zheng buf[i] = rte_le_to_cpu_32(desc_data[i]); 23751c1eb759SHongbo Zheng 23761c1eb759SHongbo Zheng hns3_handle_module_error_data(hw, buf, buf_size); 23771c1eb759SHongbo Zheng rte_free(buf); 23781c1eb759SHongbo Zheng 23791c1eb759SHongbo Zheng err_buf_alloc: 23801c1eb759SHongbo Zheng rte_free(desc_data); 23811c1eb759SHongbo Zheng err_desc: 23821c1eb759SHongbo Zheng rte_free(desc); 23831c1eb759SHongbo Zheng out: 23841c1eb759SHongbo Zheng return; 23851c1eb759SHongbo Zheng } 23861c1eb759SHongbo Zheng 23871c1eb759SHongbo Zheng void 23881c1eb759SHongbo Zheng hns3_handle_error(struct hns3_adapter *hns) 23891c1eb759SHongbo Zheng { 23901c1eb759SHongbo Zheng struct hns3_hw *hw = &hns->hw; 23911c1eb759SHongbo Zheng 2392efcaa81eSChengchang Tang if (hns3_dev_get_support(hw, RAS_IMP)) { 23931c1eb759SHongbo Zheng hns3_handle_hw_error_v2(hw); 23941c1eb759SHongbo Zheng hns3_schedule_reset(hns); 23951c1eb759SHongbo Zheng } else { 23961c1eb759SHongbo Zheng hns3_handle_msix_error(hns, &hw->reset.request); 23971c1eb759SHongbo Zheng hns3_handle_ras_error(hns, &hw->reset.request); 23981c1eb759SHongbo Zheng hns3_schedule_reset(hns); 23991c1eb759SHongbo Zheng } 24001c1eb759SHongbo Zheng } 24011c1eb759SHongbo Zheng 24022790c646SWei Hu (Xavier) int 24032790c646SWei Hu (Xavier) hns3_reset_init(struct hns3_hw *hw) 24042790c646SWei Hu (Xavier) { 24052790c646SWei Hu (Xavier) rte_spinlock_init(&hw->lock); 24062790c646SWei Hu (Xavier) hw->reset.level = HNS3_NONE_RESET; 24072790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_NONE; 24082790c646SWei Hu (Xavier) hw->reset.request = 0; 24092790c646SWei Hu (Xavier) hw->reset.pending = 0; 24101f089a3aSLijun Ou hw->reset.resetting = 0; 2411e12a0166STyler Retzlaff rte_atomic_store_explicit(&hw->reset.disable_cmd, 0, rte_memory_order_relaxed); 24122790c646SWei Hu (Xavier) hw->reset.wait_data = rte_zmalloc("wait_data", 24132790c646SWei Hu (Xavier) sizeof(struct hns3_wait_data), 0); 24142790c646SWei Hu (Xavier) if (!hw->reset.wait_data) { 24152790c646SWei Hu (Xavier) PMD_INIT_LOG(ERR, "Failed to allocate memory for wait_data"); 24162790c646SWei Hu (Xavier) return -ENOMEM; 24172790c646SWei Hu (Xavier) } 24182790c646SWei Hu (Xavier) return 0; 24192790c646SWei Hu (Xavier) } 24202790c646SWei Hu (Xavier) 24212790c646SWei Hu (Xavier) void 24222790c646SWei Hu (Xavier) hns3_schedule_reset(struct hns3_adapter *hns) 24232790c646SWei Hu (Xavier) { 24242790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 24252790c646SWei Hu (Xavier) 24262790c646SWei Hu (Xavier) /* Reschedule the reset process after successful initialization */ 24272790c646SWei Hu (Xavier) if (hw->adapter_state == HNS3_NIC_UNINITIALIZED) { 2428e12a0166STyler Retzlaff rte_atomic_store_explicit(&hw->reset.schedule, SCHEDULE_PENDING, 2429e12a0166STyler Retzlaff rte_memory_order_relaxed); 24302790c646SWei Hu (Xavier) return; 24312790c646SWei Hu (Xavier) } 24322790c646SWei Hu (Xavier) 24332790c646SWei Hu (Xavier) if (hw->adapter_state >= HNS3_NIC_CLOSED) 24342790c646SWei Hu (Xavier) return; 24352790c646SWei Hu (Xavier) 24362790c646SWei Hu (Xavier) /* Schedule restart alarm if it is not scheduled yet */ 2437e12a0166STyler Retzlaff if (rte_atomic_load_explicit(&hw->reset.schedule, rte_memory_order_relaxed) == 2438b5236601SChengchang Tang SCHEDULE_REQUESTED) 24392790c646SWei Hu (Xavier) return; 2440e12a0166STyler Retzlaff if (rte_atomic_load_explicit(&hw->reset.schedule, rte_memory_order_relaxed) == 2441b5236601SChengchang Tang SCHEDULE_DEFERRED) 24422790c646SWei Hu (Xavier) rte_eal_alarm_cancel(hw->reset.ops->reset_service, hns); 2443c48e7437SDengdui Huang 2444e12a0166STyler Retzlaff rte_atomic_store_explicit(&hw->reset.schedule, SCHEDULE_REQUESTED, 2445e12a0166STyler Retzlaff rte_memory_order_relaxed); 24462790c646SWei Hu (Xavier) 24472790c646SWei Hu (Xavier) rte_eal_alarm_set(SWITCH_CONTEXT_US, hw->reset.ops->reset_service, hns); 24482790c646SWei Hu (Xavier) } 24492790c646SWei Hu (Xavier) 24502790c646SWei Hu (Xavier) void 24512790c646SWei Hu (Xavier) hns3_schedule_delayed_reset(struct hns3_adapter *hns) 24522790c646SWei Hu (Xavier) { 24532790c646SWei Hu (Xavier) #define DEFERRED_SCHED_US (3 * MSEC_PER_SEC * USEC_PER_MSEC) 24542790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 24552790c646SWei Hu (Xavier) 24562790c646SWei Hu (Xavier) /* Do nothing if it is uninited or closed */ 24572790c646SWei Hu (Xavier) if (hw->adapter_state == HNS3_NIC_UNINITIALIZED || 24582790c646SWei Hu (Xavier) hw->adapter_state >= HNS3_NIC_CLOSED) { 24592790c646SWei Hu (Xavier) return; 24602790c646SWei Hu (Xavier) } 24612790c646SWei Hu (Xavier) 2462e12a0166STyler Retzlaff if (rte_atomic_load_explicit(&hw->reset.schedule, rte_memory_order_relaxed) != 2463b5236601SChengchang Tang SCHEDULE_NONE) 24642790c646SWei Hu (Xavier) return; 2465e12a0166STyler Retzlaff rte_atomic_store_explicit(&hw->reset.schedule, SCHEDULE_DEFERRED, 2466e12a0166STyler Retzlaff rte_memory_order_relaxed); 24672790c646SWei Hu (Xavier) rte_eal_alarm_set(DEFERRED_SCHED_US, hw->reset.ops->reset_service, hns); 24682790c646SWei Hu (Xavier) } 24692790c646SWei Hu (Xavier) 24702790c646SWei Hu (Xavier) void 24712790c646SWei Hu (Xavier) hns3_wait_callback(void *param) 24722790c646SWei Hu (Xavier) { 24732790c646SWei Hu (Xavier) struct hns3_wait_data *data = (struct hns3_wait_data *)param; 24742790c646SWei Hu (Xavier) struct hns3_adapter *hns = data->hns; 24752790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 24762790c646SWei Hu (Xavier) uint64_t msec; 24772790c646SWei Hu (Xavier) bool done; 24782790c646SWei Hu (Xavier) 24792790c646SWei Hu (Xavier) data->count--; 24802790c646SWei Hu (Xavier) if (data->check_completion) { 24812790c646SWei Hu (Xavier) /* 24822790c646SWei Hu (Xavier) * Check if the current time exceeds the deadline 24832790c646SWei Hu (Xavier) * or a pending reset coming, or reset during close. 24842790c646SWei Hu (Xavier) */ 248578dbb6f9SChengwen Feng msec = hns3_clock_gettime_ms(); 24862790c646SWei Hu (Xavier) if (msec > data->end_ms || is_reset_pending(hns) || 24872790c646SWei Hu (Xavier) hw->adapter_state == HNS3_NIC_CLOSING) { 24882790c646SWei Hu (Xavier) done = false; 24892790c646SWei Hu (Xavier) data->count = 0; 24902790c646SWei Hu (Xavier) } else 24912790c646SWei Hu (Xavier) done = data->check_completion(hw); 24922790c646SWei Hu (Xavier) } else 24932790c646SWei Hu (Xavier) done = true; 24942790c646SWei Hu (Xavier) 24952790c646SWei Hu (Xavier) if (!done && data->count > 0) { 24962790c646SWei Hu (Xavier) rte_eal_alarm_set(data->interval, hns3_wait_callback, data); 24972790c646SWei Hu (Xavier) return; 24982790c646SWei Hu (Xavier) } 24992790c646SWei Hu (Xavier) if (done) 25002790c646SWei Hu (Xavier) data->result = HNS3_WAIT_SUCCESS; 25012790c646SWei Hu (Xavier) else { 25022790c646SWei Hu (Xavier) hns3_err(hw, "%s wait timeout at stage %d", 25032790c646SWei Hu (Xavier) reset_string[hw->reset.level], hw->reset.stage); 25042790c646SWei Hu (Xavier) data->result = HNS3_WAIT_TIMEOUT; 25052790c646SWei Hu (Xavier) } 25062790c646SWei Hu (Xavier) hns3_schedule_reset(hns); 25072790c646SWei Hu (Xavier) } 25082790c646SWei Hu (Xavier) 25092790c646SWei Hu (Xavier) void 25102790c646SWei Hu (Xavier) hns3_notify_reset_ready(struct hns3_hw *hw, bool enable) 25112790c646SWei Hu (Xavier) { 25122790c646SWei Hu (Xavier) uint32_t reg_val; 25132790c646SWei Hu (Xavier) 25142790c646SWei Hu (Xavier) reg_val = hns3_read_dev(hw, HNS3_CMDQ_TX_DEPTH_REG); 25152790c646SWei Hu (Xavier) if (enable) 25162790c646SWei Hu (Xavier) reg_val |= HNS3_NIC_SW_RST_RDY; 25172790c646SWei Hu (Xavier) else 25182790c646SWei Hu (Xavier) reg_val &= ~HNS3_NIC_SW_RST_RDY; 25192790c646SWei Hu (Xavier) 25202790c646SWei Hu (Xavier) hns3_write_dev(hw, HNS3_CMDQ_TX_DEPTH_REG, reg_val); 25212790c646SWei Hu (Xavier) } 25222790c646SWei Hu (Xavier) 25232790c646SWei Hu (Xavier) int 25242790c646SWei Hu (Xavier) hns3_reset_req_hw_reset(struct hns3_adapter *hns) 25252790c646SWei Hu (Xavier) { 25262790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 25272790c646SWei Hu (Xavier) 25282790c646SWei Hu (Xavier) if (hw->reset.wait_data->result == HNS3_WAIT_UNKNOWN) { 25292790c646SWei Hu (Xavier) hw->reset.wait_data->hns = hns; 25302790c646SWei Hu (Xavier) hw->reset.wait_data->check_completion = NULL; 25312790c646SWei Hu (Xavier) hw->reset.wait_data->interval = HNS3_RESET_SYNC_US; 25322790c646SWei Hu (Xavier) hw->reset.wait_data->count = 1; 25332790c646SWei Hu (Xavier) hw->reset.wait_data->result = HNS3_WAIT_REQUEST; 25342790c646SWei Hu (Xavier) rte_eal_alarm_set(hw->reset.wait_data->interval, 25352790c646SWei Hu (Xavier) hns3_wait_callback, hw->reset.wait_data); 25362790c646SWei Hu (Xavier) return -EAGAIN; 25372790c646SWei Hu (Xavier) } else if (hw->reset.wait_data->result == HNS3_WAIT_REQUEST) 25382790c646SWei Hu (Xavier) return -EAGAIN; 25392790c646SWei Hu (Xavier) 25402790c646SWei Hu (Xavier) /* inform hardware that preparatory work is done */ 25412790c646SWei Hu (Xavier) hns3_notify_reset_ready(hw, true); 25422790c646SWei Hu (Xavier) return 0; 25432790c646SWei Hu (Xavier) } 25442790c646SWei Hu (Xavier) 25452790c646SWei Hu (Xavier) static void 2546e12a0166STyler Retzlaff hns3_clear_reset_level(struct hns3_hw *hw, RTE_ATOMIC(uint64_t) *levels) 25472790c646SWei Hu (Xavier) { 25482790c646SWei Hu (Xavier) uint64_t merge_cnt = hw->reset.stats.merge_cnt; 254982c2ca6dSMin Hu (Connor) uint64_t tmp; 25502790c646SWei Hu (Xavier) 25512790c646SWei Hu (Xavier) switch (hw->reset.level) { 25522790c646SWei Hu (Xavier) case HNS3_IMP_RESET: 25532790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_IMP_RESET, levels); 25542790c646SWei Hu (Xavier) tmp = hns3_test_and_clear_bit(HNS3_GLOBAL_RESET, levels); 255582c2ca6dSMin Hu (Connor) merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; 25562790c646SWei Hu (Xavier) tmp = hns3_test_and_clear_bit(HNS3_FUNC_RESET, levels); 255782c2ca6dSMin Hu (Connor) merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; 25582790c646SWei Hu (Xavier) break; 25592790c646SWei Hu (Xavier) case HNS3_GLOBAL_RESET: 25602790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_GLOBAL_RESET, levels); 25612790c646SWei Hu (Xavier) tmp = hns3_test_and_clear_bit(HNS3_FUNC_RESET, levels); 256282c2ca6dSMin Hu (Connor) merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; 25632790c646SWei Hu (Xavier) break; 25642790c646SWei Hu (Xavier) case HNS3_FUNC_RESET: 25652790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_FUNC_RESET, levels); 25662790c646SWei Hu (Xavier) break; 25672790c646SWei Hu (Xavier) case HNS3_VF_RESET: 25682790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_VF_RESET, levels); 25692790c646SWei Hu (Xavier) tmp = hns3_test_and_clear_bit(HNS3_VF_PF_FUNC_RESET, levels); 257082c2ca6dSMin Hu (Connor) merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; 25712790c646SWei Hu (Xavier) tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels); 257282c2ca6dSMin Hu (Connor) merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; 25732790c646SWei Hu (Xavier) break; 25742790c646SWei Hu (Xavier) case HNS3_VF_FULL_RESET: 25752790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_VF_FULL_RESET, levels); 25762790c646SWei Hu (Xavier) tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels); 257782c2ca6dSMin Hu (Connor) merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; 25782790c646SWei Hu (Xavier) break; 25792790c646SWei Hu (Xavier) case HNS3_VF_PF_FUNC_RESET: 25802790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_VF_PF_FUNC_RESET, levels); 25812790c646SWei Hu (Xavier) tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels); 258282c2ca6dSMin Hu (Connor) merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; 25832790c646SWei Hu (Xavier) break; 25842790c646SWei Hu (Xavier) case HNS3_VF_FUNC_RESET: 25852790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_VF_FUNC_RESET, levels); 25862790c646SWei Hu (Xavier) break; 25872790c646SWei Hu (Xavier) case HNS3_FLR_RESET: 25882790c646SWei Hu (Xavier) hns3_atomic_clear_bit(HNS3_FLR_RESET, levels); 25892790c646SWei Hu (Xavier) break; 25902790c646SWei Hu (Xavier) case HNS3_NONE_RESET: 25912790c646SWei Hu (Xavier) default: 25922790c646SWei Hu (Xavier) return; 25932790c646SWei Hu (Xavier) }; 259482c2ca6dSMin Hu (Connor) 259582c2ca6dSMin Hu (Connor) if (merge_cnt != hw->reset.stats.merge_cnt) { 25962790c646SWei Hu (Xavier) hns3_warn(hw, 25972790c646SWei Hu (Xavier) "No need to do low-level reset after %s reset. " 2598b80c527aSChengwen Feng "merge cnt: %" PRIu64 " total merge cnt: %" PRIu64, 25992790c646SWei Hu (Xavier) reset_string[hw->reset.level], 26002790c646SWei Hu (Xavier) hw->reset.stats.merge_cnt - merge_cnt, 26012790c646SWei Hu (Xavier) hw->reset.stats.merge_cnt); 260282c2ca6dSMin Hu (Connor) hw->reset.stats.merge_cnt = merge_cnt; 260382c2ca6dSMin Hu (Connor) } 26042790c646SWei Hu (Xavier) } 26052790c646SWei Hu (Xavier) 26062790c646SWei Hu (Xavier) static bool 26072790c646SWei Hu (Xavier) hns3_reset_err_handle(struct hns3_adapter *hns) 26082790c646SWei Hu (Xavier) { 2609b25987faSHongbo Zheng #define MAX_RESET_FAIL_CNT 30 26102790c646SWei Hu (Xavier) 26112790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 26122790c646SWei Hu (Xavier) 26132790c646SWei Hu (Xavier) if (hw->adapter_state == HNS3_NIC_CLOSING) 26142790c646SWei Hu (Xavier) goto reset_fail; 26152790c646SWei Hu (Xavier) 26162790c646SWei Hu (Xavier) if (is_reset_pending(hns)) { 26172790c646SWei Hu (Xavier) hw->reset.attempts = 0; 26182790c646SWei Hu (Xavier) hw->reset.stats.fail_cnt++; 26192790c646SWei Hu (Xavier) hns3_warn(hw, "%s reset fail because new Reset is pending " 2620b80c527aSChengwen Feng "attempts:%" PRIu64, 26212790c646SWei Hu (Xavier) reset_string[hw->reset.level], 26222790c646SWei Hu (Xavier) hw->reset.stats.fail_cnt); 26232790c646SWei Hu (Xavier) hw->reset.level = HNS3_NONE_RESET; 26242790c646SWei Hu (Xavier) return true; 26252790c646SWei Hu (Xavier) } 26262790c646SWei Hu (Xavier) 26272790c646SWei Hu (Xavier) hw->reset.attempts++; 26282790c646SWei Hu (Xavier) if (hw->reset.attempts < MAX_RESET_FAIL_CNT) { 26292790c646SWei Hu (Xavier) hns3_atomic_set_bit(hw->reset.level, &hw->reset.pending); 26302790c646SWei Hu (Xavier) hns3_warn(hw, "%s retry to reset attempts: %d", 26312790c646SWei Hu (Xavier) reset_string[hw->reset.level], 26322790c646SWei Hu (Xavier) hw->reset.attempts); 26332790c646SWei Hu (Xavier) return true; 26342790c646SWei Hu (Xavier) } 26352790c646SWei Hu (Xavier) 263680cd38e1SHongbo Zheng /* 263780cd38e1SHongbo Zheng * Failure to reset does not mean that the network port is 263880cd38e1SHongbo Zheng * completely unavailable, so cmd still needs to be initialized. 263980cd38e1SHongbo Zheng * Regardless of whether the execution is successful or not, the 264080cd38e1SHongbo Zheng * flow after execution must be continued. 264180cd38e1SHongbo Zheng */ 2642e12a0166STyler Retzlaff if (rte_atomic_load_explicit(&hw->reset.disable_cmd, rte_memory_order_relaxed)) 264380cd38e1SHongbo Zheng (void)hns3_cmd_init(hw); 26442790c646SWei Hu (Xavier) reset_fail: 26452790c646SWei Hu (Xavier) hw->reset.attempts = 0; 26462790c646SWei Hu (Xavier) hw->reset.stats.fail_cnt++; 2647b80c527aSChengwen Feng hns3_warn(hw, "%s reset fail fail_cnt:%" PRIu64 " success_cnt:%" PRIu64 2648b80c527aSChengwen Feng " global_cnt:%" PRIu64 " imp_cnt:%" PRIu64 2649b80c527aSChengwen Feng " request_cnt:%" PRIu64 " exec_cnt:%" PRIu64 2650b80c527aSChengwen Feng " merge_cnt:%" PRIu64 "adapter_state:%d", 26512790c646SWei Hu (Xavier) reset_string[hw->reset.level], hw->reset.stats.fail_cnt, 26522790c646SWei Hu (Xavier) hw->reset.stats.success_cnt, hw->reset.stats.global_cnt, 26532790c646SWei Hu (Xavier) hw->reset.stats.imp_cnt, hw->reset.stats.request_cnt, 2654cea37e51SChunsong Feng hw->reset.stats.exec_cnt, hw->reset.stats.merge_cnt, 2655cea37e51SChunsong Feng hw->adapter_state); 26562790c646SWei Hu (Xavier) 26572790c646SWei Hu (Xavier) /* IMP no longer waiting the ready flag */ 26582790c646SWei Hu (Xavier) hns3_notify_reset_ready(hw, true); 26592790c646SWei Hu (Xavier) return false; 26602790c646SWei Hu (Xavier) } 26612790c646SWei Hu (Xavier) 26622790c646SWei Hu (Xavier) static int 26632790c646SWei Hu (Xavier) hns3_reset_pre(struct hns3_adapter *hns) 26642790c646SWei Hu (Xavier) { 26652790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 26662790c646SWei Hu (Xavier) struct timeval tv; 26672790c646SWei Hu (Xavier) int ret; 26682790c646SWei Hu (Xavier) 26692790c646SWei Hu (Xavier) if (hw->reset.stage == RESET_STAGE_NONE) { 2670e12a0166STyler Retzlaff rte_atomic_store_explicit(&hns->hw.reset.resetting, 1, rte_memory_order_relaxed); 26712790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_DOWN; 267253688fc9SChengwen Feng hns3_report_reset_begin(hw); 26732790c646SWei Hu (Xavier) ret = hw->reset.ops->stop_service(hns); 267478dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 26752790c646SWei Hu (Xavier) if (ret) { 26762790c646SWei Hu (Xavier) hns3_warn(hw, "Reset step1 down fail=%d time=%ld.%.6ld", 26772790c646SWei Hu (Xavier) ret, tv.tv_sec, tv.tv_usec); 26782790c646SWei Hu (Xavier) return ret; 26792790c646SWei Hu (Xavier) } 26802790c646SWei Hu (Xavier) hns3_warn(hw, "Reset step1 down success time=%ld.%.6ld", 26812790c646SWei Hu (Xavier) tv.tv_sec, tv.tv_usec); 26822790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_PREWAIT; 26832790c646SWei Hu (Xavier) } 26842790c646SWei Hu (Xavier) if (hw->reset.stage == RESET_STAGE_PREWAIT) { 26852790c646SWei Hu (Xavier) ret = hw->reset.ops->prepare_reset(hns); 268678dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 26872790c646SWei Hu (Xavier) if (ret) { 26882790c646SWei Hu (Xavier) hns3_warn(hw, 26892790c646SWei Hu (Xavier) "Reset step2 prepare wait fail=%d time=%ld.%.6ld", 26902790c646SWei Hu (Xavier) ret, tv.tv_sec, tv.tv_usec); 26912790c646SWei Hu (Xavier) return ret; 26922790c646SWei Hu (Xavier) } 26932790c646SWei Hu (Xavier) hns3_warn(hw, "Reset step2 prepare wait success time=%ld.%.6ld", 26942790c646SWei Hu (Xavier) tv.tv_sec, tv.tv_usec); 26952790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_REQ_HW_RESET; 26962790c646SWei Hu (Xavier) hw->reset.wait_data->result = HNS3_WAIT_UNKNOWN; 26972790c646SWei Hu (Xavier) } 26982790c646SWei Hu (Xavier) return 0; 26992790c646SWei Hu (Xavier) } 27002790c646SWei Hu (Xavier) 27012790c646SWei Hu (Xavier) static int 27022790c646SWei Hu (Xavier) hns3_reset_post(struct hns3_adapter *hns) 27032790c646SWei Hu (Xavier) { 2704b25987faSHongbo Zheng #define TIMEOUT_RETRIES_CNT 30 27052790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 27062790c646SWei Hu (Xavier) struct timeval tv_delta; 27072790c646SWei Hu (Xavier) struct timeval tv; 27082790c646SWei Hu (Xavier) int ret = 0; 27092790c646SWei Hu (Xavier) 27102790c646SWei Hu (Xavier) if (hw->adapter_state == HNS3_NIC_CLOSING) { 27112790c646SWei Hu (Xavier) hns3_warn(hw, "Don't do reset_post during closing, just uninit cmd"); 27122790c646SWei Hu (Xavier) hns3_cmd_uninit(hw); 27132790c646SWei Hu (Xavier) return -EPERM; 27142790c646SWei Hu (Xavier) } 27152790c646SWei Hu (Xavier) 27162790c646SWei Hu (Xavier) if (hw->reset.stage == RESET_STAGE_DEV_INIT) { 27172790c646SWei Hu (Xavier) rte_spinlock_lock(&hw->lock); 27182790c646SWei Hu (Xavier) if (hw->reset.mbuf_deferred_free) { 27192790c646SWei Hu (Xavier) hns3_dev_release_mbufs(hns); 27202790c646SWei Hu (Xavier) hw->reset.mbuf_deferred_free = false; 27212790c646SWei Hu (Xavier) } 27222790c646SWei Hu (Xavier) ret = hw->reset.ops->reinit_dev(hns); 27232790c646SWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 272478dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 27252790c646SWei Hu (Xavier) if (ret) { 27262790c646SWei Hu (Xavier) hns3_warn(hw, "Reset step5 devinit fail=%d retries=%d", 27272790c646SWei Hu (Xavier) ret, hw->reset.retries); 27282790c646SWei Hu (Xavier) goto err; 27292790c646SWei Hu (Xavier) } 27302790c646SWei Hu (Xavier) hns3_warn(hw, "Reset step5 devinit success time=%ld.%.6ld", 27312790c646SWei Hu (Xavier) tv.tv_sec, tv.tv_usec); 27322790c646SWei Hu (Xavier) hw->reset.retries = 0; 27332790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_RESTORE; 27342790c646SWei Hu (Xavier) rte_eal_alarm_set(SWITCH_CONTEXT_US, 27352790c646SWei Hu (Xavier) hw->reset.ops->reset_service, hns); 27362790c646SWei Hu (Xavier) return -EAGAIN; 27372790c646SWei Hu (Xavier) } 27382790c646SWei Hu (Xavier) if (hw->reset.stage == RESET_STAGE_RESTORE) { 27392790c646SWei Hu (Xavier) rte_spinlock_lock(&hw->lock); 27402790c646SWei Hu (Xavier) ret = hw->reset.ops->restore_conf(hns); 27412790c646SWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 274278dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 27432790c646SWei Hu (Xavier) if (ret) { 27442790c646SWei Hu (Xavier) hns3_warn(hw, 27452790c646SWei Hu (Xavier) "Reset step6 restore fail=%d retries=%d", 27462790c646SWei Hu (Xavier) ret, hw->reset.retries); 27472790c646SWei Hu (Xavier) goto err; 27482790c646SWei Hu (Xavier) } 27492790c646SWei Hu (Xavier) hns3_warn(hw, "Reset step6 restore success time=%ld.%.6ld", 27502790c646SWei Hu (Xavier) tv.tv_sec, tv.tv_usec); 27512790c646SWei Hu (Xavier) hw->reset.retries = 0; 27522790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_DONE; 27532790c646SWei Hu (Xavier) } 27542790c646SWei Hu (Xavier) if (hw->reset.stage == RESET_STAGE_DONE) { 27552790c646SWei Hu (Xavier) /* IMP will wait ready flag before reset */ 27562790c646SWei Hu (Xavier) hns3_notify_reset_ready(hw, false); 27572790c646SWei Hu (Xavier) hns3_clear_reset_level(hw, &hw->reset.pending); 275894cf4db1SDengdui Huang hns3_clear_reset_status(hw); 2759e12a0166STyler Retzlaff rte_atomic_store_explicit(&hns->hw.reset.resetting, 0, rte_memory_order_relaxed); 27602790c646SWei Hu (Xavier) hw->reset.attempts = 0; 27612790c646SWei Hu (Xavier) hw->reset.stats.success_cnt++; 27622790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_NONE; 2763c4ae39b2SChengwen Feng rte_spinlock_lock(&hw->lock); 27642790c646SWei Hu (Xavier) hw->reset.ops->start_service(hns); 2765c4ae39b2SChengwen Feng rte_spinlock_unlock(&hw->lock); 276678dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 27672790c646SWei Hu (Xavier) timersub(&tv, &hw->reset.start_time, &tv_delta); 2768b80c527aSChengwen Feng hns3_warn(hw, "%s reset done fail_cnt:%" PRIu64 2769b80c527aSChengwen Feng " success_cnt:%" PRIu64 " global_cnt:%" PRIu64 2770b80c527aSChengwen Feng " imp_cnt:%" PRIu64 " request_cnt:%" PRIu64 2771b80c527aSChengwen Feng " exec_cnt:%" PRIu64 " merge_cnt:%" PRIu64, 27722790c646SWei Hu (Xavier) reset_string[hw->reset.level], 27732790c646SWei Hu (Xavier) hw->reset.stats.fail_cnt, hw->reset.stats.success_cnt, 27742790c646SWei Hu (Xavier) hw->reset.stats.global_cnt, hw->reset.stats.imp_cnt, 27752790c646SWei Hu (Xavier) hw->reset.stats.request_cnt, hw->reset.stats.exec_cnt, 27762790c646SWei Hu (Xavier) hw->reset.stats.merge_cnt); 27772790c646SWei Hu (Xavier) hns3_warn(hw, 277878dbb6f9SChengwen Feng "%s reset done delta %" PRIu64 " ms time=%ld.%.6ld", 27792790c646SWei Hu (Xavier) reset_string[hw->reset.level], 278078dbb6f9SChengwen Feng hns3_clock_calctime_ms(&tv_delta), 27812790c646SWei Hu (Xavier) tv.tv_sec, tv.tv_usec); 27822790c646SWei Hu (Xavier) hw->reset.level = HNS3_NONE_RESET; 278353688fc9SChengwen Feng hns3_report_reset_success(hw); 27842790c646SWei Hu (Xavier) } 27852790c646SWei Hu (Xavier) return 0; 27862790c646SWei Hu (Xavier) 27872790c646SWei Hu (Xavier) err: 27882790c646SWei Hu (Xavier) if (ret == -ETIME) { 27892790c646SWei Hu (Xavier) hw->reset.retries++; 27902790c646SWei Hu (Xavier) if (hw->reset.retries < TIMEOUT_RETRIES_CNT) { 27912790c646SWei Hu (Xavier) rte_eal_alarm_set(HNS3_RESET_SYNC_US, 27922790c646SWei Hu (Xavier) hw->reset.ops->reset_service, hns); 27932790c646SWei Hu (Xavier) return -EAGAIN; 27942790c646SWei Hu (Xavier) } 27952790c646SWei Hu (Xavier) } 27962790c646SWei Hu (Xavier) hw->reset.retries = 0; 27972790c646SWei Hu (Xavier) return -EIO; 27982790c646SWei Hu (Xavier) } 27992790c646SWei Hu (Xavier) 2800f13c07a5SHuisong Li static void 2801f13c07a5SHuisong Li hns3_reset_fail_handle(struct hns3_adapter *hns) 2802f13c07a5SHuisong Li { 2803f13c07a5SHuisong Li struct hns3_hw *hw = &hns->hw; 2804f13c07a5SHuisong Li struct timeval tv_delta; 2805f13c07a5SHuisong Li struct timeval tv; 2806f13c07a5SHuisong Li 2807f13c07a5SHuisong Li hns3_clear_reset_level(hw, &hw->reset.pending); 280894cf4db1SDengdui Huang hns3_clear_reset_status(hw); 2809f13c07a5SHuisong Li if (hns3_reset_err_handle(hns)) { 2810f13c07a5SHuisong Li hw->reset.stage = RESET_STAGE_PREWAIT; 2811f13c07a5SHuisong Li hns3_schedule_reset(hns); 2812f13c07a5SHuisong Li return; 2813f13c07a5SHuisong Li } 2814f13c07a5SHuisong Li 2815f13c07a5SHuisong Li rte_spinlock_lock(&hw->lock); 2816f13c07a5SHuisong Li if (hw->reset.mbuf_deferred_free) { 2817f13c07a5SHuisong Li hns3_dev_release_mbufs(hns); 2818f13c07a5SHuisong Li hw->reset.mbuf_deferred_free = false; 2819f13c07a5SHuisong Li } 2820f13c07a5SHuisong Li rte_spinlock_unlock(&hw->lock); 2821e12a0166STyler Retzlaff rte_atomic_store_explicit(&hns->hw.reset.resetting, 0, rte_memory_order_relaxed); 2822f13c07a5SHuisong Li hw->reset.stage = RESET_STAGE_NONE; 2823f13c07a5SHuisong Li hns3_clock_gettime(&tv); 2824f13c07a5SHuisong Li timersub(&tv, &hw->reset.start_time, &tv_delta); 2825f13c07a5SHuisong Li hns3_warn(hw, "%s reset fail delta %" PRIu64 " ms time=%ld.%.6ld", 2826f13c07a5SHuisong Li reset_string[hw->reset.level], 2827f13c07a5SHuisong Li hns3_clock_calctime_ms(&tv_delta), 2828f13c07a5SHuisong Li tv.tv_sec, tv.tv_usec); 2829f13c07a5SHuisong Li hw->reset.level = HNS3_NONE_RESET; 283053688fc9SChengwen Feng hns3_report_reset_failed(hw); 2831f13c07a5SHuisong Li } 2832f13c07a5SHuisong Li 28332790c646SWei Hu (Xavier) /* 28342790c646SWei Hu (Xavier) * There are three scenarios as follows: 28352790c646SWei Hu (Xavier) * When the reset is not in progress, the reset process starts. 28362790c646SWei Hu (Xavier) * During the reset process, if the reset level has not changed, 28372790c646SWei Hu (Xavier) * the reset process continues; otherwise, the reset process is aborted. 28382790c646SWei Hu (Xavier) * hw->reset.level new_level action 28392790c646SWei Hu (Xavier) * HNS3_NONE_RESET HNS3_XXXX_RESET start reset 28402790c646SWei Hu (Xavier) * HNS3_XXXX_RESET HNS3_XXXX_RESET continue reset 28412790c646SWei Hu (Xavier) * HNS3_LOW_RESET HNS3_HIGH_RESET abort 28422790c646SWei Hu (Xavier) */ 28432790c646SWei Hu (Xavier) int 28442790c646SWei Hu (Xavier) hns3_reset_process(struct hns3_adapter *hns, enum hns3_reset_level new_level) 28452790c646SWei Hu (Xavier) { 28462790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 28472790c646SWei Hu (Xavier) struct timeval tv; 28482790c646SWei Hu (Xavier) int ret; 28492790c646SWei Hu (Xavier) 28502790c646SWei Hu (Xavier) if (hw->reset.level == HNS3_NONE_RESET) { 28512790c646SWei Hu (Xavier) hw->reset.level = new_level; 28522790c646SWei Hu (Xavier) hw->reset.stats.exec_cnt++; 285378dbb6f9SChengwen Feng hns3_clock_gettime(&hw->reset.start_time); 28542790c646SWei Hu (Xavier) hns3_warn(hw, "Start %s reset time=%ld.%.6ld", 28552790c646SWei Hu (Xavier) reset_string[hw->reset.level], 28562790c646SWei Hu (Xavier) hw->reset.start_time.tv_sec, 28572790c646SWei Hu (Xavier) hw->reset.start_time.tv_usec); 28582790c646SWei Hu (Xavier) } 28592790c646SWei Hu (Xavier) 28602790c646SWei Hu (Xavier) if (is_reset_pending(hns)) { 286178dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 28622790c646SWei Hu (Xavier) hns3_warn(hw, 28632790c646SWei Hu (Xavier) "%s reset is aborted by high level time=%ld.%.6ld", 28642790c646SWei Hu (Xavier) reset_string[hw->reset.level], tv.tv_sec, tv.tv_usec); 28652790c646SWei Hu (Xavier) if (hw->reset.wait_data->result == HNS3_WAIT_REQUEST) 28662790c646SWei Hu (Xavier) rte_eal_alarm_cancel(hns3_wait_callback, 28672790c646SWei Hu (Xavier) hw->reset.wait_data); 28682790c646SWei Hu (Xavier) goto err; 28692790c646SWei Hu (Xavier) } 28702790c646SWei Hu (Xavier) 28712790c646SWei Hu (Xavier) ret = hns3_reset_pre(hns); 28722790c646SWei Hu (Xavier) if (ret) 28732790c646SWei Hu (Xavier) goto err; 28742790c646SWei Hu (Xavier) 28752790c646SWei Hu (Xavier) if (hw->reset.stage == RESET_STAGE_REQ_HW_RESET) { 28762790c646SWei Hu (Xavier) ret = hns3_reset_req_hw_reset(hns); 28772790c646SWei Hu (Xavier) if (ret == -EAGAIN) 28782790c646SWei Hu (Xavier) return ret; 287978dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 28802790c646SWei Hu (Xavier) hns3_warn(hw, 28812790c646SWei Hu (Xavier) "Reset step3 request IMP reset success time=%ld.%.6ld", 28822790c646SWei Hu (Xavier) tv.tv_sec, tv.tv_usec); 28832790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_WAIT; 28842790c646SWei Hu (Xavier) hw->reset.wait_data->result = HNS3_WAIT_UNKNOWN; 28852790c646SWei Hu (Xavier) } 28862790c646SWei Hu (Xavier) if (hw->reset.stage == RESET_STAGE_WAIT) { 28872790c646SWei Hu (Xavier) ret = hw->reset.ops->wait_hardware_ready(hns); 28882790c646SWei Hu (Xavier) if (ret) 28892790c646SWei Hu (Xavier) goto retry; 289078dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 28912790c646SWei Hu (Xavier) hns3_warn(hw, "Reset step4 reset wait success time=%ld.%.6ld", 28922790c646SWei Hu (Xavier) tv.tv_sec, tv.tv_usec); 28932790c646SWei Hu (Xavier) hw->reset.stage = RESET_STAGE_DEV_INIT; 28942790c646SWei Hu (Xavier) } 28952790c646SWei Hu (Xavier) 28962790c646SWei Hu (Xavier) ret = hns3_reset_post(hns); 28972790c646SWei Hu (Xavier) if (ret) 28982790c646SWei Hu (Xavier) goto retry; 28992790c646SWei Hu (Xavier) 29002790c646SWei Hu (Xavier) return 0; 29012790c646SWei Hu (Xavier) retry: 29022790c646SWei Hu (Xavier) if (ret == -EAGAIN) 29032790c646SWei Hu (Xavier) return ret; 29042790c646SWei Hu (Xavier) err: 2905f13c07a5SHuisong Li hns3_reset_fail_handle(hns); 29062790c646SWei Hu (Xavier) 29072790c646SWei Hu (Xavier) return -EIO; 29082790c646SWei Hu (Xavier) } 29092790c646SWei Hu (Xavier) 29102790c646SWei Hu (Xavier) /* 29112790c646SWei Hu (Xavier) * The reset process can only be terminated after handshake with IMP(step3), 29122790c646SWei Hu (Xavier) * so that IMP can complete the reset process normally. 29132790c646SWei Hu (Xavier) */ 29142790c646SWei Hu (Xavier) void 29152790c646SWei Hu (Xavier) hns3_reset_abort(struct hns3_adapter *hns) 29162790c646SWei Hu (Xavier) { 29172790c646SWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 29182790c646SWei Hu (Xavier) struct timeval tv; 29192790c646SWei Hu (Xavier) int i; 29202790c646SWei Hu (Xavier) 29212790c646SWei Hu (Xavier) for (i = 0; i < HNS3_QUIT_RESET_CNT; i++) { 29222790c646SWei Hu (Xavier) if (hw->reset.level == HNS3_NONE_RESET) 29232790c646SWei Hu (Xavier) break; 29242790c646SWei Hu (Xavier) rte_delay_ms(HNS3_QUIT_RESET_DELAY_MS); 29252790c646SWei Hu (Xavier) } 29262790c646SWei Hu (Xavier) 29272790c646SWei Hu (Xavier) /* IMP no longer waiting the ready flag */ 29282790c646SWei Hu (Xavier) hns3_notify_reset_ready(hw, true); 29292790c646SWei Hu (Xavier) 29302790c646SWei Hu (Xavier) rte_eal_alarm_cancel(hw->reset.ops->reset_service, hns); 29312790c646SWei Hu (Xavier) rte_eal_alarm_cancel(hns3_wait_callback, hw->reset.wait_data); 29322790c646SWei Hu (Xavier) 29332790c646SWei Hu (Xavier) if (hw->reset.level != HNS3_NONE_RESET) { 293478dbb6f9SChengwen Feng hns3_clock_gettime(&tv); 29352790c646SWei Hu (Xavier) hns3_err(hw, "Failed to terminate reset: %s time=%ld.%.6ld", 29362790c646SWei Hu (Xavier) reset_string[hw->reset.level], tv.tv_sec, tv.tv_usec); 29372790c646SWei Hu (Xavier) } 29382790c646SWei Hu (Xavier) } 29399bc2289fSChengwen Feng 29409bc2289fSChengwen Feng static void 29419bc2289fSChengwen Feng hns3_report_lse(void *arg) 29429bc2289fSChengwen Feng { 29439bc2289fSChengwen Feng struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; 29449bc2289fSChengwen Feng struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); 29459bc2289fSChengwen Feng 29469bc2289fSChengwen Feng if (hw->adapter_state == HNS3_NIC_STARTED) 29479bc2289fSChengwen Feng rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL); 29489bc2289fSChengwen Feng } 29499bc2289fSChengwen Feng 29509bc2289fSChengwen Feng void 29519bc2289fSChengwen Feng hns3_start_report_lse(struct rte_eth_dev *dev) 29529bc2289fSChengwen Feng { 29539bc2289fSChengwen Feng #define DELAY_REPORT_LSE_US 1 29549bc2289fSChengwen Feng /* 29559bc2289fSChengwen Feng * When this function called, the context may hold hns3_hw.lock, if 29569bc2289fSChengwen Feng * report lse right now, in some application such as bonding, it will 29579bc2289fSChengwen Feng * trigger call driver's ops which may acquire hns3_hw.lock again, so 29589bc2289fSChengwen Feng * lead to deadlock. 29599bc2289fSChengwen Feng * Here we use delay report to avoid the deadlock. 29609bc2289fSChengwen Feng */ 29619bc2289fSChengwen Feng rte_eal_alarm_set(DELAY_REPORT_LSE_US, hns3_report_lse, dev); 29629bc2289fSChengwen Feng } 29639bc2289fSChengwen Feng 29649bc2289fSChengwen Feng void 29659bc2289fSChengwen Feng hns3_stop_report_lse(struct rte_eth_dev *dev) 29669bc2289fSChengwen Feng { 29679bc2289fSChengwen Feng rte_eal_alarm_cancel(hns3_report_lse, dev); 29689bc2289fSChengwen Feng } 2969