diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c index 6c67a2df291adbf943369492dcaab9e4d6d2d445..5bf88ab094e1fd703afc79d06c540d3c73e0d8bc 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c @@ -259,13 +259,13 @@ static void hns3_dbg_help(struct hnae3_handle *h) dev_info(&h->pdev->dev, "dump mac tnl status\n"); memset(printf_buf, 0, HNS3_DBG_BUF_LEN); - strncat(printf_buf, "dump reg [[bios common] [ssu]", + strncat(printf_buf, "dump reg [[bios common] [ssu ]", HNS3_DBG_BUF_LEN - 1); strncat(printf_buf + strlen(printf_buf), - " [igu egu] [rpu]", + " [igu egu ] [rpu ]", HNS3_DBG_BUF_LEN - strlen(printf_buf) - 1); strncat(printf_buf + strlen(printf_buf), - " [rtc] [ppp] [rcb] [tqp]]\n", + " [rtc] [ppp] [rcb] [tqp ]]\n", HNS3_DBG_BUF_LEN - strlen(printf_buf) - 1); dev_info(&h->pdev->dev, "%s", printf_buf); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c index a7b36e1318bd4f4a4f092986e26421b8d341667a..078ca3d9dcd9f20c2ba55ab34a26b2eed00a0fba 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c @@ -944,24 +944,69 @@ static int hclge_dbg_fd_tcam_read(struct hclge_dev *hdev, u8 stage, return ret; } +static int hclge_dbg_get_rules_location(struct hclge_dev *hdev, u16 *rule_locs) +{ + struct hclge_fd_rule *rule; + struct hlist_node *node; + int cnt = 0; + + spin_lock_bh(&hdev->fd_rule_lock); + hlist_for_each_entry_safe(rule, node, &hdev->fd_rule_list, rule_node) { + rule_locs[cnt] = rule->location; + cnt++; + } + spin_unlock_bh(&hdev->fd_rule_lock); + + if (cnt != hdev->hclge_fd_rule_num) + return -EINVAL; + return cnt; +} + static void hclge_dbg_fd_tcam(struct hclge_dev *hdev) { - u32 i, ret; + int i, ret, rule_cnt; + u16 *rule_locs; + + if (!hnae3_dev_fd_supported(hdev)) { + dev_err(&hdev->pdev->dev, + "Only FD-supported dev supports dump fd tcam\n"); + return; + } + + if (!hdev->hclge_fd_rule_num || + !hdev->fd_cfg.rule_num[HCLGE_FD_STAGE_1]) + return; + + rule_locs = kzalloc(hdev->fd_cfg.rule_num[HCLGE_FD_STAGE_1] * 2, + GFP_KERNEL); + if (!rule_locs) + return; + + rule_cnt = hclge_dbg_get_rules_location(hdev, rule_locs); + if (rule_cnt <= 0) { + dev_err(&hdev->pdev->dev, "get error rule number, ret = %d\n", + rule_cnt); + kfree(rule_locs); + return; + } - for (i = 0; i < hdev->fd_cfg.rule_num[0]; i++) { - ret = hclge_dbg_fd_tcam_read(hdev, 0, true, i); + for (i = 0; i < rule_cnt; i++) { + ret = hclge_dbg_fd_tcam_read(hdev, 0, true, rule_locs[i]); if (ret) { dev_err(&hdev->pdev->dev, "get fd tcam key x failed, ret = %d\n", ret); + kfree(rule_locs); return; } - ret = hclge_dbg_fd_tcam_read(hdev, 0, false, i); + ret = hclge_dbg_fd_tcam_read(hdev, 0, false, rule_locs[i]); if (ret) { dev_err(&hdev->pdev->dev, "get fd tcam key y failed, ret = %d\n", ret); + kfree(rule_locs); return; } } + kfree(rule_locs); } static void hclge_dbg_dump_rst_info(struct hclge_dev *hdev)