14edc17fdSAya Levin /* SPDX-License-Identifier: GPL-2.0 */ 24edc17fdSAya Levin /* Copyright (c) 2019 Mellanox Technologies. */ 34edc17fdSAya Levin 44edc17fdSAya Levin #ifndef __MLX5E_EN_HEALTH_H 54edc17fdSAya Levin #define __MLX5E_EN_HEALTH_H 64edc17fdSAya Levin 74edc17fdSAya Levin #include "en.h" 85f29458bSAya Levin #include "diag/rsc_dump.h" 94edc17fdSAya Levin 100a35ab3eSSaeed Mahameed #define MLX5E_RX_ERR_CQE(cqe) (get_cqe_opcode(cqe) != MLX5_CQE_RESP_SEND) 110a35ab3eSSaeed Mahameed 128276ea13SAya Levin static inline bool cqe_syndrome_needs_recover(u8 syndrome) 138276ea13SAya Levin { 14187a9830SAya Levin return syndrome == MLX5_CQE_SYNDROME_LOCAL_QP_OP_ERR || 158276ea13SAya Levin syndrome == MLX5_CQE_SYNDROME_LOCAL_PROT_ERR || 168276ea13SAya Levin syndrome == MLX5_CQE_SYNDROME_WR_FLUSH_ERR; 178276ea13SAya Levin } 188276ea13SAya Levin 19b3ea4c4fSEran Ben Elisha void mlx5e_reporter_tx_create(struct mlx5e_priv *priv); 2006293ae4SAya Levin void mlx5e_reporter_tx_destroy(struct mlx5e_priv *priv); 2106293ae4SAya Levin void mlx5e_reporter_tx_err_cqe(struct mlx5e_txqsq *sq); 2206293ae4SAya Levin int mlx5e_reporter_tx_timeout(struct mlx5e_txqsq *sq); 234edc17fdSAya Levin 24d5cbedd7SAya Levin int mlx5e_health_cq_diag_fmsg(struct mlx5e_cq *cq, struct devlink_fmsg *fmsg); 25d5cbedd7SAya Levin int mlx5e_health_cq_common_diag_fmsg(struct mlx5e_cq *cq, struct devlink_fmsg *fmsg); 2656837c2aSAya Levin int mlx5e_health_eq_diag_fmsg(struct mlx5_eq_comp *eq, struct devlink_fmsg *fmsg); 27d5cbedd7SAya Levin int mlx5e_health_fmsg_named_obj_nest_start(struct devlink_fmsg *fmsg, char *name); 28d5cbedd7SAya Levin int mlx5e_health_fmsg_named_obj_nest_end(struct devlink_fmsg *fmsg); 292d708887SAya Levin 30b3ea4c4fSEran Ben Elisha void mlx5e_reporter_rx_create(struct mlx5e_priv *priv); 319032e719SAya Levin void mlx5e_reporter_rx_destroy(struct mlx5e_priv *priv); 32be5323c8SAya Levin void mlx5e_reporter_icosq_cqe_err(struct mlx5e_icosq *icosq); 338276ea13SAya Levin void mlx5e_reporter_rq_cqe_err(struct mlx5e_rq *rq); 3432c57fb2SAya Levin void mlx5e_reporter_rx_timeout(struct mlx5e_rq *rq); 359032e719SAya Levin 36c50de4afSAya Levin #define MLX5E_REPORTER_PER_Q_MAX_LEN 256 37e74e28aeSAya Levin #define MLX5E_REPORTER_FLUSH_TIMEOUT_MSEC 2000 38c50de4afSAya Levin 39c50de4afSAya Levin struct mlx5e_err_ctx { 40c50de4afSAya Levin int (*recover)(void *ctx); 415f29458bSAya Levin int (*dump)(struct mlx5e_priv *priv, struct devlink_fmsg *fmsg, void *ctx); 42c50de4afSAya Levin void *ctx; 43c50de4afSAya Levin }; 44c50de4afSAya Levin 45c50de4afSAya Levin int mlx5e_health_sq_to_ready(struct mlx5e_channel *channel, u32 sqn); 46c50de4afSAya Levin int mlx5e_health_channel_eq_recover(struct mlx5_eq_comp *eq, struct mlx5e_channel *channel); 47c50de4afSAya Levin int mlx5e_health_recover_channels(struct mlx5e_priv *priv); 48c50de4afSAya Levin int mlx5e_health_report(struct mlx5e_priv *priv, 49c50de4afSAya Levin struct devlink_health_reporter *reporter, char *err_str, 50c50de4afSAya Levin struct mlx5e_err_ctx *err_ctx); 51b3ea4c4fSEran Ben Elisha void mlx5e_health_create_reporters(struct mlx5e_priv *priv); 5211af6a6dSAya Levin void mlx5e_health_destroy_reporters(struct mlx5e_priv *priv); 5311af6a6dSAya Levin void mlx5e_health_channels_update(struct mlx5e_priv *priv); 545f29458bSAya Levin int mlx5e_health_rsc_fmsg_dump(struct mlx5e_priv *priv, struct mlx5_rsc_key *key, 555f29458bSAya Levin struct devlink_fmsg *fmsg); 565f29458bSAya Levin int mlx5e_health_queue_dump(struct mlx5e_priv *priv, struct devlink_fmsg *fmsg, 575f29458bSAya Levin int queue_idx, char *lbl); 584edc17fdSAya Levin #endif 59