}
 }
 
+static void hclge_dbg_dump_loopback(struct hclge_dev *hdev,
+                                   const char *cmd_buf)
+{
+       struct phy_device *phydev = hdev->hw.mac.phydev;
+       struct hclge_config_mac_mode_cmd *req_app;
+       struct hclge_serdes_lb_cmd *req_serdes;
+       struct hclge_desc desc;
+       u8 loopback_en;
+       int ret;
+
+       req_app = (struct hclge_config_mac_mode_cmd *)desc.data;
+       req_serdes = (struct hclge_serdes_lb_cmd *)desc.data;
+
+       dev_info(&hdev->pdev->dev, "mac id: %u\n", hdev->hw.mac.mac_id);
+
+       hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true);
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "failed to dump app loopback status, ret = %d\n", ret);
+               return;
+       }
+
+       loopback_en = hnae3_get_bit(le32_to_cpu(req_app->txrx_pad_fcs_loop_en),
+                                   HCLGE_MAC_APP_LP_B);
+       dev_info(&hdev->pdev->dev, "app loopback: %s\n",
+                loopback_en ? "on" : "off");
+
+       hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_SERDES_LOOPBACK, true);
+       ret = hclge_cmd_send(&hdev->hw, &desc, 1);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "failed to dump serdes loopback status, ret = %d\n",
+                       ret);
+               return;
+       }
+
+       loopback_en = req_serdes->enable & HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;
+       dev_info(&hdev->pdev->dev, "serdes serial loopback: %s\n",
+                loopback_en ? "on" : "off");
+
+       loopback_en = req_serdes->enable &
+                       HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B;
+       dev_info(&hdev->pdev->dev, "serdes parallel loopback: %s\n",
+                loopback_en ? "on" : "off");
+
+       if (phydev)
+               dev_info(&hdev->pdev->dev, "phy loopback: %s\n",
+                        phydev->loopback_enabled ? "on" : "off");
+}
+
 /* hclge_dbg_dump_mac_tnl_status: print message about mac tnl interrupt
  * @hdev: pointer to struct hclge_dev
  */
 {
 #define DUMP_REG       "dump reg"
 #define DUMP_TM_MAP    "dump tm map"
+#define DUMP_LOOPBACK  "dump loopback"
 
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
                                          &cmd_buf[sizeof("dump ncl_config")]);
        } else if (strncmp(cmd_buf, "dump mac tnl status", 19) == 0) {
                hclge_dbg_dump_mac_tnl_status(hdev);
+       } else if (strncmp(cmd_buf, DUMP_LOOPBACK,
+                  strlen(DUMP_LOOPBACK)) == 0) {
+               hclge_dbg_dump_loopback(hdev, &cmd_buf[sizeof(DUMP_LOOPBACK)]);
        } else if (strncmp(cmd_buf, "dump qs shaper", 14) == 0) {
                hclge_dbg_dump_qs_shaper(hdev,
                                         &cmd_buf[sizeof("dump qs shaper")]);