params->mqprio.num_tc : 1;
 }
 
+/* Keep this enum consistent with the corresponding strings array
+ * declared in en/reporter_rx.c
+ */
 enum {
-       MLX5E_RQ_STATE_ENABLED,
+       MLX5E_RQ_STATE_ENABLED = 0,
        MLX5E_RQ_STATE_RECOVERING,
        MLX5E_RQ_STATE_DIM,
        MLX5E_RQ_STATE_NO_CSUM_COMPLETE,
        MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, /* set when mini_cqe_resp_stride_index cap is used */
        MLX5E_RQ_STATE_SHAMPO, /* set when SHAMPO cap is used */
        MLX5E_RQ_STATE_MINI_CQE_ENHANCED,  /* set when enhanced mini_cqe_cap is used */
+       MLX5E_NUM_RQ_STATES, /* Must be kept last */
 };
 
 struct mlx5e_cq {
 
 #include "ptp.h"
 #include "lib/tout.h"
 
+/* Keep this string array consistent with the MLX5E_RQ_STATE_* enums in en.h */
+static const char * const rq_sw_state_type_name[] = {
+       [MLX5E_RQ_STATE_ENABLED] = "enabled",
+       [MLX5E_RQ_STATE_RECOVERING] = "recovering",
+       [MLX5E_RQ_STATE_DIM] = "dim",
+       [MLX5E_RQ_STATE_NO_CSUM_COMPLETE] = "no_csum_complete",
+       [MLX5E_RQ_STATE_CSUM_FULL] = "csum_full",
+       [MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX] = "mini_cqe_hw_stridx",
+       [MLX5E_RQ_STATE_SHAMPO] = "shampo",
+       [MLX5E_RQ_STATE_MINI_CQE_ENHANCED] = "mini_cqe_enhanced",
+};
+
 static int mlx5e_query_rq_state(struct mlx5_core_dev *dev, u32 rqn, u8 *state)
 {
        int outlen = MLX5_ST_SZ_BYTES(query_rq_out);
        return mlx5e_health_fmsg_named_obj_nest_end(fmsg);
 }
 
+static int mlx5e_health_rq_put_sw_state(struct devlink_fmsg *fmsg, struct mlx5e_rq *rq)
+{
+       int err;
+       int i;
+
+       BUILD_BUG_ON_MSG(ARRAY_SIZE(rq_sw_state_type_name) != MLX5E_NUM_RQ_STATES,
+                        "rq_sw_state_type_name string array must be consistent with MLX5E_RQ_STATE_* enum in en.h");
+       err = devlink_fmsg_obj_nest_start(fmsg);
+       if (err)
+               return err;
+
+       err = mlx5e_health_fmsg_named_obj_nest_start(fmsg, "SW State");
+       if (err)
+               return err;
+
+       for (i = 0; i < ARRAY_SIZE(rq_sw_state_type_name); ++i) {
+               err = devlink_fmsg_u32_pair_put(fmsg, rq_sw_state_type_name[i],
+                                               test_bit(i, &rq->state));
+               if (err)
+                       return err;
+       }
+
+       err = mlx5e_health_fmsg_named_obj_nest_end(fmsg);
+       if (err)
+               return err;
+
+       return devlink_fmsg_obj_nest_end(fmsg);
+}
+
 static int
 mlx5e_rx_reporter_build_diagnose_output_rq_common(struct mlx5e_rq *rq,
                                                  struct devlink_fmsg *fmsg)
        if (err)
                return err;
 
-       err = devlink_fmsg_u8_pair_put(fmsg, "SW state", rq->state);
-       if (err)
-               return err;
-
        err = devlink_fmsg_u32_pair_put(fmsg, "WQE counter", wqe_counter);
        if (err)
                return err;
        if (err)
                return err;
 
+       err = mlx5e_health_rq_put_sw_state(fmsg, rq);
+       if (err)
+               return err;
+
        err = mlx5e_health_cq_diag_fmsg(&rq->cq, fmsg);
        if (err)
                return err;