1b2292360Sliuzhongzhu // SPDX-License-Identifier: GPL-2.0+ 2b2292360Sliuzhongzhu /* Copyright (c) 2018-2019 Hisilicon Limited. */ 3b2292360Sliuzhongzhu 4b2292360Sliuzhongzhu #include <linux/debugfs.h> 5b2292360Sliuzhongzhu #include <linux/device.h> 6b2292360Sliuzhongzhu 7b2292360Sliuzhongzhu #include "hnae3.h" 8*5e69ea7eSYufeng Mo #include "hns3_debugfs.h" 9b2292360Sliuzhongzhu #include "hns3_enet.h" 10b2292360Sliuzhongzhu 11b2292360Sliuzhongzhu static struct dentry *hns3_dbgfs_root; 12b2292360Sliuzhongzhu 13*5e69ea7eSYufeng Mo static struct hns3_dbg_dentry_info hns3_dbg_dentry[] = { 14*5e69ea7eSYufeng Mo { 15*5e69ea7eSYufeng Mo .name = "tm" 16*5e69ea7eSYufeng Mo }, 17*5e69ea7eSYufeng Mo /* keep common at the bottom and add new directory above */ 18*5e69ea7eSYufeng Mo { 19*5e69ea7eSYufeng Mo .name = "common" 20*5e69ea7eSYufeng Mo }, 21*5e69ea7eSYufeng Mo }; 22*5e69ea7eSYufeng Mo 23*5e69ea7eSYufeng Mo static int hns3_dbg_common_file_init(struct hnae3_handle *handle, 24*5e69ea7eSYufeng Mo unsigned int cmd); 25*5e69ea7eSYufeng Mo 26*5e69ea7eSYufeng Mo static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = { 27*5e69ea7eSYufeng Mo { 28*5e69ea7eSYufeng Mo .name = "tm_nodes", 29*5e69ea7eSYufeng Mo .cmd = HNAE3_DBG_CMD_TM_NODES, 30*5e69ea7eSYufeng Mo .dentry = HNS3_DBG_DENTRY_TM, 31*5e69ea7eSYufeng Mo .buf_len = HNS3_DBG_READ_LEN, 32*5e69ea7eSYufeng Mo .init = hns3_dbg_common_file_init, 33*5e69ea7eSYufeng Mo }, 34*5e69ea7eSYufeng Mo { 35*5e69ea7eSYufeng Mo .name = "tm_priority", 36*5e69ea7eSYufeng Mo .cmd = HNAE3_DBG_CMD_TM_PRI, 37*5e69ea7eSYufeng Mo .dentry = HNS3_DBG_DENTRY_TM, 38*5e69ea7eSYufeng Mo .buf_len = HNS3_DBG_READ_LEN, 39*5e69ea7eSYufeng Mo .init = hns3_dbg_common_file_init, 40*5e69ea7eSYufeng Mo }, 41*5e69ea7eSYufeng Mo { 42*5e69ea7eSYufeng Mo .name = "tm_qset", 43*5e69ea7eSYufeng Mo .cmd = HNAE3_DBG_CMD_TM_QSET, 44*5e69ea7eSYufeng Mo .dentry = HNS3_DBG_DENTRY_TM, 45*5e69ea7eSYufeng Mo .buf_len = HNS3_DBG_READ_LEN, 46*5e69ea7eSYufeng Mo .init = hns3_dbg_common_file_init, 47*5e69ea7eSYufeng Mo }, 48*5e69ea7eSYufeng Mo }; 49*5e69ea7eSYufeng Mo 50ebaf1908SWeihang Li static int hns3_dbg_queue_info(struct hnae3_handle *h, 51ebaf1908SWeihang Li const char *cmd_buf) 5257ceee2cSliuzhongzhu { 53dbaae5bbSGuangbin Huang struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev); 5457ceee2cSliuzhongzhu struct hns3_nic_priv *priv = h->priv; 5557ceee2cSliuzhongzhu struct hns3_enet_ring *ring; 5657ceee2cSliuzhongzhu u32 base_add_l, base_add_h; 5757ceee2cSliuzhongzhu u32 queue_num, queue_max; 589d8d5a36SYufeng Mo u32 value, i; 5957ceee2cSliuzhongzhu int cnt; 6057ceee2cSliuzhongzhu 615f06b903SYunsheng Lin if (!priv->ring) { 625f06b903SYunsheng Lin dev_err(&h->pdev->dev, "priv->ring is NULL\n"); 6357ceee2cSliuzhongzhu return -EFAULT; 6457ceee2cSliuzhongzhu } 6557ceee2cSliuzhongzhu 6657ceee2cSliuzhongzhu queue_max = h->kinfo.num_tqps; 6757ceee2cSliuzhongzhu cnt = kstrtouint(&cmd_buf[11], 0, &queue_num); 6857ceee2cSliuzhongzhu if (cnt) 6957ceee2cSliuzhongzhu queue_num = 0; 7057ceee2cSliuzhongzhu else 7157ceee2cSliuzhongzhu queue_max = queue_num + 1; 7257ceee2cSliuzhongzhu 7357ceee2cSliuzhongzhu dev_info(&h->pdev->dev, "queue info\n"); 7457ceee2cSliuzhongzhu 7557ceee2cSliuzhongzhu if (queue_num >= h->kinfo.num_tqps) { 7657ceee2cSliuzhongzhu dev_err(&h->pdev->dev, 77ed5b255bSYufeng Mo "Queue number(%u) is out of range(0-%u)\n", queue_num, 7857ceee2cSliuzhongzhu h->kinfo.num_tqps - 1); 7957ceee2cSliuzhongzhu return -EINVAL; 8057ceee2cSliuzhongzhu } 8157ceee2cSliuzhongzhu 8257ceee2cSliuzhongzhu for (i = queue_num; i < queue_max; i++) { 8357ceee2cSliuzhongzhu /* Each cycle needs to determine whether the instance is reset, 8457ceee2cSliuzhongzhu * to prevent reference to invalid memory. And need to ensure 8557ceee2cSliuzhongzhu * that the following code is executed within 100ms. 8657ceee2cSliuzhongzhu */ 877737f1fbSliuzhongzhu if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) || 8857ceee2cSliuzhongzhu test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) 8957ceee2cSliuzhongzhu return -EPERM; 9057ceee2cSliuzhongzhu 915f06b903SYunsheng Lin ring = &priv->ring[(u32)(i + h->kinfo.num_tqps)]; 9257ceee2cSliuzhongzhu base_add_h = readl_relaxed(ring->tqp->io_base + 9357ceee2cSliuzhongzhu HNS3_RING_RX_RING_BASEADDR_H_REG); 9457ceee2cSliuzhongzhu base_add_l = readl_relaxed(ring->tqp->io_base + 9557ceee2cSliuzhongzhu HNS3_RING_RX_RING_BASEADDR_L_REG); 96adcf738bSGuojia Liao dev_info(&h->pdev->dev, "RX(%u) BASE ADD: 0x%08x%08x\n", i, 9757ceee2cSliuzhongzhu base_add_h, base_add_l); 9857ceee2cSliuzhongzhu 9957ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 10057ceee2cSliuzhongzhu HNS3_RING_RX_RING_BD_NUM_REG); 101adcf738bSGuojia Liao dev_info(&h->pdev->dev, "RX(%u) RING BD NUM: %u\n", i, value); 10257ceee2cSliuzhongzhu 10357ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 10457ceee2cSliuzhongzhu HNS3_RING_RX_RING_BD_LEN_REG); 105adcf738bSGuojia Liao dev_info(&h->pdev->dev, "RX(%u) RING BD LEN: %u\n", i, value); 10657ceee2cSliuzhongzhu 10757ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 10857ceee2cSliuzhongzhu HNS3_RING_RX_RING_TAIL_REG); 109adcf738bSGuojia Liao dev_info(&h->pdev->dev, "RX(%u) RING TAIL: %u\n", i, value); 11057ceee2cSliuzhongzhu 11157ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 11257ceee2cSliuzhongzhu HNS3_RING_RX_RING_HEAD_REG); 113adcf738bSGuojia Liao dev_info(&h->pdev->dev, "RX(%u) RING HEAD: %u\n", i, value); 11457ceee2cSliuzhongzhu 11557ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 11657ceee2cSliuzhongzhu HNS3_RING_RX_RING_FBDNUM_REG); 117adcf738bSGuojia Liao dev_info(&h->pdev->dev, "RX(%u) RING FBDNUM: %u\n", i, value); 11857ceee2cSliuzhongzhu 11957ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 12057ceee2cSliuzhongzhu HNS3_RING_RX_RING_PKTNUM_RECORD_REG); 121adcf738bSGuojia Liao dev_info(&h->pdev->dev, "RX(%u) RING PKTNUM: %u\n", i, value); 12257ceee2cSliuzhongzhu 1235f06b903SYunsheng Lin ring = &priv->ring[i]; 12457ceee2cSliuzhongzhu base_add_h = readl_relaxed(ring->tqp->io_base + 12557ceee2cSliuzhongzhu HNS3_RING_TX_RING_BASEADDR_H_REG); 12657ceee2cSliuzhongzhu base_add_l = readl_relaxed(ring->tqp->io_base + 12757ceee2cSliuzhongzhu HNS3_RING_TX_RING_BASEADDR_L_REG); 128adcf738bSGuojia Liao dev_info(&h->pdev->dev, "TX(%u) BASE ADD: 0x%08x%08x\n", i, 12957ceee2cSliuzhongzhu base_add_h, base_add_l); 13057ceee2cSliuzhongzhu 13157ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 13257ceee2cSliuzhongzhu HNS3_RING_TX_RING_BD_NUM_REG); 133adcf738bSGuojia Liao dev_info(&h->pdev->dev, "TX(%u) RING BD NUM: %u\n", i, value); 13457ceee2cSliuzhongzhu 13557ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 13657ceee2cSliuzhongzhu HNS3_RING_TX_RING_TC_REG); 137adcf738bSGuojia Liao dev_info(&h->pdev->dev, "TX(%u) RING TC: %u\n", i, value); 13857ceee2cSliuzhongzhu 13957ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 14057ceee2cSliuzhongzhu HNS3_RING_TX_RING_TAIL_REG); 141adcf738bSGuojia Liao dev_info(&h->pdev->dev, "TX(%u) RING TAIL: %u\n", i, value); 14257ceee2cSliuzhongzhu 14357ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 14457ceee2cSliuzhongzhu HNS3_RING_TX_RING_HEAD_REG); 145adcf738bSGuojia Liao dev_info(&h->pdev->dev, "TX(%u) RING HEAD: %u\n", i, value); 14657ceee2cSliuzhongzhu 14757ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 14857ceee2cSliuzhongzhu HNS3_RING_TX_RING_FBDNUM_REG); 149adcf738bSGuojia Liao dev_info(&h->pdev->dev, "TX(%u) RING FBDNUM: %u\n", i, value); 15057ceee2cSliuzhongzhu 15157ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 15257ceee2cSliuzhongzhu HNS3_RING_TX_RING_OFFSET_REG); 153adcf738bSGuojia Liao dev_info(&h->pdev->dev, "TX(%u) RING OFFSET: %u\n", i, value); 15457ceee2cSliuzhongzhu 15557ceee2cSliuzhongzhu value = readl_relaxed(ring->tqp->io_base + 15657ceee2cSliuzhongzhu HNS3_RING_TX_RING_PKTNUM_RECORD_REG); 157dbaae5bbSGuangbin Huang dev_info(&h->pdev->dev, "TX(%u) RING PKTNUM: %u\n", i, value); 158dbaae5bbSGuangbin Huang 159dbaae5bbSGuangbin Huang value = readl_relaxed(ring->tqp->io_base + HNS3_RING_EN_REG); 160dbaae5bbSGuangbin Huang dev_info(&h->pdev->dev, "TX/RX(%u) RING EN: %s\n", i, 161dbaae5bbSGuangbin Huang value ? "enable" : "disable"); 162dbaae5bbSGuangbin Huang 163dbaae5bbSGuangbin Huang if (hnae3_ae_dev_tqp_txrx_indep_supported(ae_dev)) { 164dbaae5bbSGuangbin Huang value = readl_relaxed(ring->tqp->io_base + 165dbaae5bbSGuangbin Huang HNS3_RING_TX_EN_REG); 166dbaae5bbSGuangbin Huang dev_info(&h->pdev->dev, "TX(%u) RING EN: %s\n", i, 167dbaae5bbSGuangbin Huang value ? "enable" : "disable"); 168dbaae5bbSGuangbin Huang 169dbaae5bbSGuangbin Huang value = readl_relaxed(ring->tqp->io_base + 170dbaae5bbSGuangbin Huang HNS3_RING_RX_EN_REG); 171dbaae5bbSGuangbin Huang dev_info(&h->pdev->dev, "RX(%u) RING EN: %s\n", i, 172dbaae5bbSGuangbin Huang value ? "enable" : "disable"); 173dbaae5bbSGuangbin Huang } 174dbaae5bbSGuangbin Huang 175dbaae5bbSGuangbin Huang dev_info(&h->pdev->dev, "\n"); 17657ceee2cSliuzhongzhu } 17757ceee2cSliuzhongzhu 17857ceee2cSliuzhongzhu return 0; 17957ceee2cSliuzhongzhu } 18057ceee2cSliuzhongzhu 1810c29d191Sliuzhongzhu static int hns3_dbg_queue_map(struct hnae3_handle *h) 1820c29d191Sliuzhongzhu { 1830c29d191Sliuzhongzhu struct hns3_nic_priv *priv = h->priv; 1840c29d191Sliuzhongzhu int i; 1850c29d191Sliuzhongzhu 1860c29d191Sliuzhongzhu if (!h->ae_algo->ops->get_global_queue_id) 1870c29d191Sliuzhongzhu return -EOPNOTSUPP; 1880c29d191Sliuzhongzhu 1890c29d191Sliuzhongzhu dev_info(&h->pdev->dev, "map info for queue id and vector id\n"); 1900c29d191Sliuzhongzhu dev_info(&h->pdev->dev, 1910c29d191Sliuzhongzhu "local queue id | global queue id | vector id\n"); 1920c29d191Sliuzhongzhu for (i = 0; i < h->kinfo.num_tqps; i++) { 1930c29d191Sliuzhongzhu u16 global_qid; 1940c29d191Sliuzhongzhu 1950c29d191Sliuzhongzhu global_qid = h->ae_algo->ops->get_global_queue_id(h, i); 1965f06b903SYunsheng Lin if (!priv->ring || !priv->ring[i].tqp_vector) 1970c29d191Sliuzhongzhu continue; 1980c29d191Sliuzhongzhu 1990c29d191Sliuzhongzhu dev_info(&h->pdev->dev, 200c5aaf176SJiaran Zhang " %4d %4u %4d\n", 2015f06b903SYunsheng Lin i, global_qid, priv->ring[i].tqp_vector->vector_irq); 2020c29d191Sliuzhongzhu } 2030c29d191Sliuzhongzhu 2040c29d191Sliuzhongzhu return 0; 2050c29d191Sliuzhongzhu } 2060c29d191Sliuzhongzhu 207ebaf1908SWeihang Li static int hns3_dbg_bd_info(struct hnae3_handle *h, const char *cmd_buf) 208122bedc5Sliuzhongzhu { 209122bedc5Sliuzhongzhu struct hns3_nic_priv *priv = h->priv; 210122bedc5Sliuzhongzhu struct hns3_desc *rx_desc, *tx_desc; 211122bedc5Sliuzhongzhu struct device *dev = &h->pdev->dev; 212122bedc5Sliuzhongzhu struct hns3_enet_ring *ring; 213122bedc5Sliuzhongzhu u32 tx_index, rx_index; 214122bedc5Sliuzhongzhu u32 q_num, value; 21596e65abbSGuangbin Huang dma_addr_t addr; 21666d52f3bSHuazhong Tan u16 mss_hw_csum; 217b1533adaSHuazhong Tan u32 l234info; 218122bedc5Sliuzhongzhu int cnt; 219122bedc5Sliuzhongzhu 220122bedc5Sliuzhongzhu cnt = sscanf(&cmd_buf[8], "%u %u", &q_num, &tx_index); 221122bedc5Sliuzhongzhu if (cnt == 2) { 222122bedc5Sliuzhongzhu rx_index = tx_index; 223122bedc5Sliuzhongzhu } else if (cnt != 1) { 224122bedc5Sliuzhongzhu dev_err(dev, "bd info: bad command string, cnt=%d\n", cnt); 225122bedc5Sliuzhongzhu return -EINVAL; 226122bedc5Sliuzhongzhu } 227122bedc5Sliuzhongzhu 228122bedc5Sliuzhongzhu if (q_num >= h->kinfo.num_tqps) { 229ed5b255bSYufeng Mo dev_err(dev, "Queue number(%u) is out of range(0-%u)\n", q_num, 230122bedc5Sliuzhongzhu h->kinfo.num_tqps - 1); 231122bedc5Sliuzhongzhu return -EINVAL; 232122bedc5Sliuzhongzhu } 233122bedc5Sliuzhongzhu 2345f06b903SYunsheng Lin ring = &priv->ring[q_num]; 235122bedc5Sliuzhongzhu value = readl_relaxed(ring->tqp->io_base + HNS3_RING_TX_RING_TAIL_REG); 236122bedc5Sliuzhongzhu tx_index = (cnt == 1) ? value : tx_index; 237122bedc5Sliuzhongzhu 238122bedc5Sliuzhongzhu if (tx_index >= ring->desc_num) { 239ed5b255bSYufeng Mo dev_err(dev, "bd index(%u) is out of range(0-%u)\n", tx_index, 240122bedc5Sliuzhongzhu ring->desc_num - 1); 241122bedc5Sliuzhongzhu return -EINVAL; 242122bedc5Sliuzhongzhu } 243122bedc5Sliuzhongzhu 244122bedc5Sliuzhongzhu tx_desc = &ring->desc[tx_index]; 24596e65abbSGuangbin Huang addr = le64_to_cpu(tx_desc->addr); 24666d52f3bSHuazhong Tan mss_hw_csum = le16_to_cpu(tx_desc->tx.mss_hw_csum); 247122bedc5Sliuzhongzhu dev_info(dev, "TX Queue Num: %u, BD Index: %u\n", q_num, tx_index); 24896e65abbSGuangbin Huang dev_info(dev, "(TX)addr: %pad\n", &addr); 24939edaf24SGuojia Liao dev_info(dev, "(TX)vlan_tag: %u\n", le16_to_cpu(tx_desc->tx.vlan_tag)); 25039edaf24SGuojia Liao dev_info(dev, "(TX)send_size: %u\n", 25139edaf24SGuojia Liao le16_to_cpu(tx_desc->tx.send_size)); 252b1533adaSHuazhong Tan 253b1533adaSHuazhong Tan if (mss_hw_csum & BIT(HNS3_TXD_HW_CS_B)) { 254b1533adaSHuazhong Tan u32 offset = le32_to_cpu(tx_desc->tx.ol_type_vlan_len_msec); 255b1533adaSHuazhong Tan u32 start = le32_to_cpu(tx_desc->tx.type_cs_vlan_tso_len); 256b1533adaSHuazhong Tan 257b1533adaSHuazhong Tan dev_info(dev, "(TX)csum start: %u\n", 258b1533adaSHuazhong Tan hnae3_get_field(start, 259b1533adaSHuazhong Tan HNS3_TXD_CSUM_START_M, 260b1533adaSHuazhong Tan HNS3_TXD_CSUM_START_S)); 261b1533adaSHuazhong Tan dev_info(dev, "(TX)csum offset: %u\n", 262b1533adaSHuazhong Tan hnae3_get_field(offset, 263b1533adaSHuazhong Tan HNS3_TXD_CSUM_OFFSET_M, 264b1533adaSHuazhong Tan HNS3_TXD_CSUM_OFFSET_S)); 265b1533adaSHuazhong Tan } else { 266b1533adaSHuazhong Tan dev_info(dev, "(TX)vlan_tso: %u\n", 267b1533adaSHuazhong Tan tx_desc->tx.type_cs_vlan_tso); 268122bedc5Sliuzhongzhu dev_info(dev, "(TX)l2_len: %u\n", tx_desc->tx.l2_len); 269122bedc5Sliuzhongzhu dev_info(dev, "(TX)l3_len: %u\n", tx_desc->tx.l3_len); 270122bedc5Sliuzhongzhu dev_info(dev, "(TX)l4_len: %u\n", tx_desc->tx.l4_len); 271b1533adaSHuazhong Tan dev_info(dev, "(TX)vlan_msec: %u\n", 272b1533adaSHuazhong Tan tx_desc->tx.ol_type_vlan_msec); 273122bedc5Sliuzhongzhu dev_info(dev, "(TX)ol2_len: %u\n", tx_desc->tx.ol2_len); 274122bedc5Sliuzhongzhu dev_info(dev, "(TX)ol3_len: %u\n", tx_desc->tx.ol3_len); 275122bedc5Sliuzhongzhu dev_info(dev, "(TX)ol4_len: %u\n", tx_desc->tx.ol4_len); 276b1533adaSHuazhong Tan } 277b1533adaSHuazhong Tan 278b1533adaSHuazhong Tan dev_info(dev, "(TX)vlan_tag: %u\n", 279b1533adaSHuazhong Tan le16_to_cpu(tx_desc->tx.outer_vlan_tag)); 280b1533adaSHuazhong Tan dev_info(dev, "(TX)tv: %u\n", le16_to_cpu(tx_desc->tx.tv)); 2813e281621SHuazhong Tan dev_info(dev, "(TX)paylen_ol4cs: %u\n", 2823e281621SHuazhong Tan le32_to_cpu(tx_desc->tx.paylen_ol4cs)); 28339edaf24SGuojia Liao dev_info(dev, "(TX)vld_ra_ri: %u\n", 28439edaf24SGuojia Liao le16_to_cpu(tx_desc->tx.bdtp_fe_sc_vld_ra_ri)); 28566d52f3bSHuazhong Tan dev_info(dev, "(TX)mss_hw_csum: %u\n", mss_hw_csum); 286122bedc5Sliuzhongzhu 2875f06b903SYunsheng Lin ring = &priv->ring[q_num + h->kinfo.num_tqps]; 288122bedc5Sliuzhongzhu value = readl_relaxed(ring->tqp->io_base + HNS3_RING_RX_RING_TAIL_REG); 289122bedc5Sliuzhongzhu rx_index = (cnt == 1) ? value : tx_index; 290122bedc5Sliuzhongzhu rx_desc = &ring->desc[rx_index]; 291122bedc5Sliuzhongzhu 29296e65abbSGuangbin Huang addr = le64_to_cpu(rx_desc->addr); 293b1533adaSHuazhong Tan l234info = le32_to_cpu(rx_desc->rx.l234_info); 294122bedc5Sliuzhongzhu dev_info(dev, "RX Queue Num: %u, BD Index: %u\n", q_num, rx_index); 29596e65abbSGuangbin Huang dev_info(dev, "(RX)addr: %pad\n", &addr); 296b1533adaSHuazhong Tan dev_info(dev, "(RX)l234_info: %u\n", l234info); 297b1533adaSHuazhong Tan 29839edaf24SGuojia Liao dev_info(dev, "(RX)pkt_len: %u\n", le16_to_cpu(rx_desc->rx.pkt_len)); 29939edaf24SGuojia Liao dev_info(dev, "(RX)size: %u\n", le16_to_cpu(rx_desc->rx.size)); 30039edaf24SGuojia Liao dev_info(dev, "(RX)rss_hash: %u\n", le32_to_cpu(rx_desc->rx.rss_hash)); 30139edaf24SGuojia Liao dev_info(dev, "(RX)fd_id: %u\n", le16_to_cpu(rx_desc->rx.fd_id)); 30239edaf24SGuojia Liao dev_info(dev, "(RX)vlan_tag: %u\n", le16_to_cpu(rx_desc->rx.vlan_tag)); 30339edaf24SGuojia Liao dev_info(dev, "(RX)o_dm_vlan_id_fb: %u\n", 30439edaf24SGuojia Liao le16_to_cpu(rx_desc->rx.o_dm_vlan_id_fb)); 30539edaf24SGuojia Liao dev_info(dev, "(RX)ot_vlan_tag: %u\n", 30639edaf24SGuojia Liao le16_to_cpu(rx_desc->rx.ot_vlan_tag)); 30739edaf24SGuojia Liao dev_info(dev, "(RX)bd_base_info: %u\n", 30839edaf24SGuojia Liao le32_to_cpu(rx_desc->rx.bd_base_info)); 309122bedc5Sliuzhongzhu 310122bedc5Sliuzhongzhu return 0; 311122bedc5Sliuzhongzhu } 312122bedc5Sliuzhongzhu 313b2292360Sliuzhongzhu static void hns3_dbg_help(struct hnae3_handle *h) 314b2292360Sliuzhongzhu { 31527cf979aSliuzhongzhu #define HNS3_DBG_BUF_LEN 256 31627cf979aSliuzhongzhu 31727cf979aSliuzhongzhu char printf_buf[HNS3_DBG_BUF_LEN]; 31827cf979aSliuzhongzhu 319b2292360Sliuzhongzhu dev_info(&h->pdev->dev, "available commands\n"); 320ed5b255bSYufeng Mo dev_info(&h->pdev->dev, "queue info <number>\n"); 3210c29d191Sliuzhongzhu dev_info(&h->pdev->dev, "queue map\n"); 322ed5b255bSYufeng Mo dev_info(&h->pdev->dev, "bd info <q_num> <bd index>\n"); 3239484e337SGuangbin Huang dev_info(&h->pdev->dev, "dev capability\n"); 324b4442ec5SGuangbin Huang dev_info(&h->pdev->dev, "dev spec\n"); 32597afd47bSYufeng Mo 32697afd47bSYufeng Mo if (!hns3_is_phys_func(h->pdev)) 32797afd47bSYufeng Mo return; 32897afd47bSYufeng Mo 329b2292360Sliuzhongzhu dev_info(&h->pdev->dev, "dump fd tcam\n"); 3302849d4e7Sliuzhongzhu dev_info(&h->pdev->dev, "dump tc\n"); 331ed5b255bSYufeng Mo dev_info(&h->pdev->dev, "dump tm map <q_num>\n"); 33296227f4cSliuzhongzhu dev_info(&h->pdev->dev, "dump tm\n"); 333d958919dSliuzhongzhu dev_info(&h->pdev->dev, "dump qos pause cfg\n"); 3346fc22440Sliuzhongzhu dev_info(&h->pdev->dev, "dump qos pri map\n"); 3357d9d7f88Sliuzhongzhu dev_info(&h->pdev->dev, "dump qos buf cfg\n"); 3367737f1fbSliuzhongzhu dev_info(&h->pdev->dev, "dump mng tbl\n"); 337f02eb82dSHuazhong Tan dev_info(&h->pdev->dev, "dump reset info\n"); 33833a90e2fSZhongzhu Liu dev_info(&h->pdev->dev, "dump m7 info\n"); 339ffd140e2SWeihang Li dev_info(&h->pdev->dev, "dump ncl_config <offset> <length>(in hex)\n"); 340a6345787SWeihang Li dev_info(&h->pdev->dev, "dump mac tnl status\n"); 341ded45d40SYufeng Mo dev_info(&h->pdev->dev, "dump loopback\n"); 34289ec9485SYonglong Liu dev_info(&h->pdev->dev, "dump qs shaper [qs id]\n"); 343f671237aSJian Shen dev_info(&h->pdev->dev, "dump uc mac list <func id>\n"); 344f671237aSJian Shen dev_info(&h->pdev->dev, "dump mc mac list <func id>\n"); 345348775ebSYufeng Mo dev_info(&h->pdev->dev, "dump intr\n"); 34627cf979aSliuzhongzhu 34727cf979aSliuzhongzhu memset(printf_buf, 0, HNS3_DBG_BUF_LEN); 348ed5b255bSYufeng Mo strncat(printf_buf, "dump reg [[bios common] [ssu <port_id>]", 34927cf979aSliuzhongzhu HNS3_DBG_BUF_LEN - 1); 35027cf979aSliuzhongzhu strncat(printf_buf + strlen(printf_buf), 351ed5b255bSYufeng Mo " [igu egu <port_id>] [rpu <tc_queue_num>]", 35227cf979aSliuzhongzhu HNS3_DBG_BUF_LEN - strlen(printf_buf) - 1); 35327cf979aSliuzhongzhu strncat(printf_buf + strlen(printf_buf), 3545cb51cfeSYufeng Mo " [rtc] [ppp] [rcb] [tqp <queue_num>] [mac]]\n", 35527cf979aSliuzhongzhu HNS3_DBG_BUF_LEN - strlen(printf_buf) - 1); 35627cf979aSliuzhongzhu dev_info(&h->pdev->dev, "%s", printf_buf); 357c0ebebb9Sliuzhongzhu 358c0ebebb9Sliuzhongzhu memset(printf_buf, 0, HNS3_DBG_BUF_LEN); 359ed5b255bSYufeng Mo strncat(printf_buf, "dump reg dcb <port_id> <pri_id> <pg_id>", 360c0ebebb9Sliuzhongzhu HNS3_DBG_BUF_LEN - 1); 361ed5b255bSYufeng Mo strncat(printf_buf + strlen(printf_buf), " <rq_id> <nq_id> <qset_id>\n", 362c0ebebb9Sliuzhongzhu HNS3_DBG_BUF_LEN - strlen(printf_buf) - 1); 363c0ebebb9Sliuzhongzhu dev_info(&h->pdev->dev, "%s", printf_buf); 364b2292360Sliuzhongzhu } 365b2292360Sliuzhongzhu 3669484e337SGuangbin Huang static void hns3_dbg_dev_caps(struct hnae3_handle *h) 3679484e337SGuangbin Huang { 3689484e337SGuangbin Huang struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev); 3699484e337SGuangbin Huang unsigned long *caps; 3709484e337SGuangbin Huang 3719484e337SGuangbin Huang caps = ae_dev->caps; 3729484e337SGuangbin Huang 3739484e337SGuangbin Huang dev_info(&h->pdev->dev, "support FD: %s\n", 3749484e337SGuangbin Huang test_bit(HNAE3_DEV_SUPPORT_FD_B, caps) ? "yes" : "no"); 3759484e337SGuangbin Huang dev_info(&h->pdev->dev, "support GRO: %s\n", 3769484e337SGuangbin Huang test_bit(HNAE3_DEV_SUPPORT_GRO_B, caps) ? "yes" : "no"); 3779484e337SGuangbin Huang dev_info(&h->pdev->dev, "support FEC: %s\n", 3789484e337SGuangbin Huang test_bit(HNAE3_DEV_SUPPORT_FEC_B, caps) ? "yes" : "no"); 3799484e337SGuangbin Huang dev_info(&h->pdev->dev, "support UDP GSO: %s\n", 3809484e337SGuangbin Huang test_bit(HNAE3_DEV_SUPPORT_UDP_GSO_B, caps) ? "yes" : "no"); 3819484e337SGuangbin Huang dev_info(&h->pdev->dev, "support PTP: %s\n", 3829484e337SGuangbin Huang test_bit(HNAE3_DEV_SUPPORT_PTP_B, caps) ? "yes" : "no"); 3839484e337SGuangbin Huang dev_info(&h->pdev->dev, "support INT QL: %s\n", 3849484e337SGuangbin Huang test_bit(HNAE3_DEV_SUPPORT_INT_QL_B, caps) ? "yes" : "no"); 38566d52f3bSHuazhong Tan dev_info(&h->pdev->dev, "support HW TX csum: %s\n", 38666d52f3bSHuazhong Tan test_bit(HNAE3_DEV_SUPPORT_HW_TX_CSUM_B, caps) ? "yes" : "no"); 3873e281621SHuazhong Tan dev_info(&h->pdev->dev, "support UDP tunnel csum: %s\n", 3883e281621SHuazhong Tan test_bit(HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B, caps) ? 3893e281621SHuazhong Tan "yes" : "no"); 390e8194f32SYufeng Mo dev_info(&h->pdev->dev, "support PAUSE: %s\n", 391e8194f32SYufeng Mo test_bit(HNAE3_DEV_SUPPORT_PAUSE_B, ae_dev->caps) ? 392e8194f32SYufeng Mo "yes" : "no"); 393f5f2b3e4SGuangbin Huang dev_info(&h->pdev->dev, "support imp-controlled PHY: %s\n", 394f5f2b3e4SGuangbin Huang test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, caps) ? "yes" : "no"); 39579664077SHuazhong Tan dev_info(&h->pdev->dev, "support rxd advanced layout: %s\n", 39679664077SHuazhong Tan test_bit(HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, caps) ? 39779664077SHuazhong Tan "yes" : "no"); 3989484e337SGuangbin Huang } 3999484e337SGuangbin Huang 400b4442ec5SGuangbin Huang static void hns3_dbg_dev_specs(struct hnae3_handle *h) 401b4442ec5SGuangbin Huang { 402b4442ec5SGuangbin Huang struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev); 403b4442ec5SGuangbin Huang struct hnae3_dev_specs *dev_specs = &ae_dev->dev_specs; 404b4442ec5SGuangbin Huang struct hnae3_knic_private_info *kinfo = &h->kinfo; 405b4442ec5SGuangbin Huang struct hns3_nic_priv *priv = h->priv; 406b4442ec5SGuangbin Huang 407b4442ec5SGuangbin Huang dev_info(priv->dev, "MAC entry num: %u\n", dev_specs->mac_entry_num); 408b4442ec5SGuangbin Huang dev_info(priv->dev, "MNG entry num: %u\n", dev_specs->mng_entry_num); 409b4442ec5SGuangbin Huang dev_info(priv->dev, "MAX non tso bd num: %u\n", 410b4442ec5SGuangbin Huang dev_specs->max_non_tso_bd_num); 411b4442ec5SGuangbin Huang dev_info(priv->dev, "RSS ind tbl size: %u\n", 412b4442ec5SGuangbin Huang dev_specs->rss_ind_tbl_size); 413b4442ec5SGuangbin Huang dev_info(priv->dev, "RSS key size: %u\n", dev_specs->rss_key_size); 414b4442ec5SGuangbin Huang dev_info(priv->dev, "RSS size: %u\n", kinfo->rss_size); 415b4442ec5SGuangbin Huang dev_info(priv->dev, "Allocated RSS size: %u\n", kinfo->req_rss_size); 416b4442ec5SGuangbin Huang dev_info(priv->dev, "Task queue pairs numbers: %u\n", kinfo->num_tqps); 417b4442ec5SGuangbin Huang 418b4442ec5SGuangbin Huang dev_info(priv->dev, "RX buffer length: %u\n", kinfo->rx_buf_len); 419b4442ec5SGuangbin Huang dev_info(priv->dev, "Desc num per TX queue: %u\n", kinfo->num_tx_desc); 420b4442ec5SGuangbin Huang dev_info(priv->dev, "Desc num per RX queue: %u\n", kinfo->num_rx_desc); 42135244430SJian Shen dev_info(priv->dev, "Total number of enabled TCs: %u\n", 42235244430SJian Shen kinfo->tc_info.num_tc); 423b4442ec5SGuangbin Huang dev_info(priv->dev, "MAX INT QL: %u\n", dev_specs->int_ql_max); 424ab16b49cSHuazhong Tan dev_info(priv->dev, "MAX INT GL: %u\n", dev_specs->max_int_gl); 425e070c8b9SYufeng Mo dev_info(priv->dev, "MAX frame size: %u\n", dev_specs->max_frm_size); 4262783e77bSGuangbin Huang dev_info(priv->dev, "MAX TM RATE: %uMbps\n", dev_specs->max_tm_rate); 4273f094bd1SGuangbin Huang dev_info(priv->dev, "MAX QSET number: %u\n", dev_specs->max_qset_num); 428b4442ec5SGuangbin Huang } 429b4442ec5SGuangbin Huang 430b2292360Sliuzhongzhu static ssize_t hns3_dbg_cmd_read(struct file *filp, char __user *buffer, 431b2292360Sliuzhongzhu size_t count, loff_t *ppos) 432b2292360Sliuzhongzhu { 433b2292360Sliuzhongzhu int uncopy_bytes; 434b2292360Sliuzhongzhu char *buf; 435b2292360Sliuzhongzhu int len; 436b2292360Sliuzhongzhu 437b2292360Sliuzhongzhu if (*ppos != 0) 438b2292360Sliuzhongzhu return 0; 439b2292360Sliuzhongzhu 440b2292360Sliuzhongzhu if (count < HNS3_DBG_READ_LEN) 441b2292360Sliuzhongzhu return -ENOSPC; 442b2292360Sliuzhongzhu 443b2292360Sliuzhongzhu buf = kzalloc(HNS3_DBG_READ_LEN, GFP_KERNEL); 444b2292360Sliuzhongzhu if (!buf) 445b2292360Sliuzhongzhu return -ENOMEM; 446b2292360Sliuzhongzhu 44749e211c0SChen Zhou len = scnprintf(buf, HNS3_DBG_READ_LEN, "%s\n", 448b2292360Sliuzhongzhu "Please echo help to cmd to get help information"); 449b2292360Sliuzhongzhu uncopy_bytes = copy_to_user(buffer, buf, len); 450b2292360Sliuzhongzhu 451b2292360Sliuzhongzhu kfree(buf); 452b2292360Sliuzhongzhu 453b2292360Sliuzhongzhu if (uncopy_bytes) 454b2292360Sliuzhongzhu return -EFAULT; 455b2292360Sliuzhongzhu 456b2292360Sliuzhongzhu return (*ppos = len); 457b2292360Sliuzhongzhu } 458b2292360Sliuzhongzhu 459c318af3fSPeng Li static int hns3_dbg_check_cmd(struct hnae3_handle *handle, char *cmd_buf) 460c318af3fSPeng Li { 461c318af3fSPeng Li int ret = 0; 462c318af3fSPeng Li 463c318af3fSPeng Li if (strncmp(cmd_buf, "help", 4) == 0) 464c318af3fSPeng Li hns3_dbg_help(handle); 465c318af3fSPeng Li else if (strncmp(cmd_buf, "queue info", 10) == 0) 466c318af3fSPeng Li ret = hns3_dbg_queue_info(handle, cmd_buf); 467c318af3fSPeng Li else if (strncmp(cmd_buf, "queue map", 9) == 0) 468c318af3fSPeng Li ret = hns3_dbg_queue_map(handle); 469c318af3fSPeng Li else if (strncmp(cmd_buf, "bd info", 7) == 0) 470c318af3fSPeng Li ret = hns3_dbg_bd_info(handle, cmd_buf); 471c318af3fSPeng Li else if (strncmp(cmd_buf, "dev capability", 14) == 0) 472c318af3fSPeng Li hns3_dbg_dev_caps(handle); 473c318af3fSPeng Li else if (strncmp(cmd_buf, "dev spec", 8) == 0) 474c318af3fSPeng Li hns3_dbg_dev_specs(handle); 475c318af3fSPeng Li else if (handle->ae_algo->ops->dbg_run_cmd) 476c318af3fSPeng Li ret = handle->ae_algo->ops->dbg_run_cmd(handle, cmd_buf); 477c318af3fSPeng Li else 478c318af3fSPeng Li ret = -EOPNOTSUPP; 479c318af3fSPeng Li 480c318af3fSPeng Li return ret; 481c318af3fSPeng Li } 482c318af3fSPeng Li 483b2292360Sliuzhongzhu static ssize_t hns3_dbg_cmd_write(struct file *filp, const char __user *buffer, 484b2292360Sliuzhongzhu size_t count, loff_t *ppos) 485b2292360Sliuzhongzhu { 486b2292360Sliuzhongzhu struct hnae3_handle *handle = filp->private_data; 48757ceee2cSliuzhongzhu struct hns3_nic_priv *priv = handle->priv; 488b2292360Sliuzhongzhu char *cmd_buf, *cmd_buf_tmp; 489b2292360Sliuzhongzhu int uncopied_bytes; 490c318af3fSPeng Li int ret; 491b2292360Sliuzhongzhu 492b2292360Sliuzhongzhu if (*ppos != 0) 493b2292360Sliuzhongzhu return 0; 494b2292360Sliuzhongzhu 49557ceee2cSliuzhongzhu /* Judge if the instance is being reset. */ 4967737f1fbSliuzhongzhu if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) || 49757ceee2cSliuzhongzhu test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) 49857ceee2cSliuzhongzhu return 0; 49957ceee2cSliuzhongzhu 5007ac243f9SYufeng Mo if (count > HNS3_DBG_WRITE_LEN) 5017ac243f9SYufeng Mo return -ENOSPC; 5027ac243f9SYufeng Mo 503b2292360Sliuzhongzhu cmd_buf = kzalloc(count + 1, GFP_KERNEL); 504b2292360Sliuzhongzhu if (!cmd_buf) 505b2292360Sliuzhongzhu return count; 506b2292360Sliuzhongzhu 507b2292360Sliuzhongzhu uncopied_bytes = copy_from_user(cmd_buf, buffer, count); 508b2292360Sliuzhongzhu if (uncopied_bytes) { 509b2292360Sliuzhongzhu kfree(cmd_buf); 510b2292360Sliuzhongzhu return -EFAULT; 511b2292360Sliuzhongzhu } 512b2292360Sliuzhongzhu 513b2292360Sliuzhongzhu cmd_buf[count] = '\0'; 514b2292360Sliuzhongzhu 515b2292360Sliuzhongzhu cmd_buf_tmp = strchr(cmd_buf, '\n'); 516b2292360Sliuzhongzhu if (cmd_buf_tmp) { 517b2292360Sliuzhongzhu *cmd_buf_tmp = '\0'; 518b2292360Sliuzhongzhu count = cmd_buf_tmp - cmd_buf + 1; 519b2292360Sliuzhongzhu } 520b2292360Sliuzhongzhu 521c318af3fSPeng Li ret = hns3_dbg_check_cmd(handle, cmd_buf); 522b2292360Sliuzhongzhu if (ret) 523b2292360Sliuzhongzhu hns3_dbg_help(handle); 524b2292360Sliuzhongzhu 525b2292360Sliuzhongzhu kfree(cmd_buf); 526b2292360Sliuzhongzhu cmd_buf = NULL; 527b2292360Sliuzhongzhu 528b2292360Sliuzhongzhu return count; 529b2292360Sliuzhongzhu } 530b2292360Sliuzhongzhu 531*5e69ea7eSYufeng Mo static int hns3_dbg_get_cmd_index(struct hnae3_handle *handle, 532*5e69ea7eSYufeng Mo const unsigned char *name, u32 *index) 533*5e69ea7eSYufeng Mo { 534*5e69ea7eSYufeng Mo u32 i; 535*5e69ea7eSYufeng Mo 536*5e69ea7eSYufeng Mo for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) { 537*5e69ea7eSYufeng Mo if (!strncmp(name, hns3_dbg_cmd[i].name, 538*5e69ea7eSYufeng Mo strlen(hns3_dbg_cmd[i].name))) { 539*5e69ea7eSYufeng Mo *index = i; 540*5e69ea7eSYufeng Mo return 0; 541*5e69ea7eSYufeng Mo } 542*5e69ea7eSYufeng Mo } 543*5e69ea7eSYufeng Mo 544*5e69ea7eSYufeng Mo dev_err(&handle->pdev->dev, "unknown command(%s)\n", name); 545*5e69ea7eSYufeng Mo return -EINVAL; 546*5e69ea7eSYufeng Mo } 547*5e69ea7eSYufeng Mo 548*5e69ea7eSYufeng Mo static int hns3_dbg_read_cmd(struct hnae3_handle *handle, 549*5e69ea7eSYufeng Mo enum hnae3_dbg_cmd cmd, char *buf, int len) 550*5e69ea7eSYufeng Mo { 551*5e69ea7eSYufeng Mo const struct hnae3_ae_ops *ops = handle->ae_algo->ops; 552*5e69ea7eSYufeng Mo 553*5e69ea7eSYufeng Mo if (!ops->dbg_read_cmd) 554*5e69ea7eSYufeng Mo return -EOPNOTSUPP; 555*5e69ea7eSYufeng Mo 556*5e69ea7eSYufeng Mo return ops->dbg_read_cmd(handle, cmd, buf, len); 557*5e69ea7eSYufeng Mo } 558*5e69ea7eSYufeng Mo 55904987ca1SGuangbin Huang static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer, 56004987ca1SGuangbin Huang size_t count, loff_t *ppos) 56104987ca1SGuangbin Huang { 56204987ca1SGuangbin Huang struct hnae3_handle *handle = filp->private_data; 56304987ca1SGuangbin Huang struct hns3_nic_priv *priv = handle->priv; 56404987ca1SGuangbin Huang ssize_t size = 0; 565*5e69ea7eSYufeng Mo char **save_buf; 566*5e69ea7eSYufeng Mo char *read_buf; 567*5e69ea7eSYufeng Mo u32 index; 568*5e69ea7eSYufeng Mo int ret; 56904987ca1SGuangbin Huang 570*5e69ea7eSYufeng Mo ret = hns3_dbg_get_cmd_index(handle, filp->f_path.dentry->d_iname, 571*5e69ea7eSYufeng Mo &index); 572*5e69ea7eSYufeng Mo if (ret) 573*5e69ea7eSYufeng Mo return ret; 574*5e69ea7eSYufeng Mo 575*5e69ea7eSYufeng Mo save_buf = &hns3_dbg_cmd[index].buf; 576*5e69ea7eSYufeng Mo 577*5e69ea7eSYufeng Mo if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) || 578*5e69ea7eSYufeng Mo test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) { 579*5e69ea7eSYufeng Mo ret = -EBUSY; 580*5e69ea7eSYufeng Mo goto out; 581*5e69ea7eSYufeng Mo } 582*5e69ea7eSYufeng Mo 583*5e69ea7eSYufeng Mo if (*save_buf) { 584*5e69ea7eSYufeng Mo read_buf = *save_buf; 585*5e69ea7eSYufeng Mo } else { 586*5e69ea7eSYufeng Mo read_buf = kvzalloc(hns3_dbg_cmd[index].buf_len, GFP_KERNEL); 58704987ca1SGuangbin Huang if (!read_buf) 58804987ca1SGuangbin Huang return -ENOMEM; 58904987ca1SGuangbin Huang 590*5e69ea7eSYufeng Mo /* save the buffer addr until the last read operation */ 591*5e69ea7eSYufeng Mo *save_buf = read_buf; 592*5e69ea7eSYufeng Mo } 59304987ca1SGuangbin Huang 594*5e69ea7eSYufeng Mo /* get data ready for the first time to read */ 595*5e69ea7eSYufeng Mo if (!*ppos) { 596*5e69ea7eSYufeng Mo ret = hns3_dbg_read_cmd(handle, hns3_dbg_cmd[index].cmd, 597*5e69ea7eSYufeng Mo read_buf, hns3_dbg_cmd[index].buf_len); 598*5e69ea7eSYufeng Mo if (ret) 59904987ca1SGuangbin Huang goto out; 60004987ca1SGuangbin Huang } 60104987ca1SGuangbin Huang 60204987ca1SGuangbin Huang size = simple_read_from_buffer(buffer, count, ppos, read_buf, 60304987ca1SGuangbin Huang strlen(read_buf)); 604*5e69ea7eSYufeng Mo if (size > 0) 605*5e69ea7eSYufeng Mo return size; 60604987ca1SGuangbin Huang 60704987ca1SGuangbin Huang out: 608*5e69ea7eSYufeng Mo /* free the buffer for the last read operation */ 609*5e69ea7eSYufeng Mo if (*save_buf) { 610*5e69ea7eSYufeng Mo kvfree(*save_buf); 611*5e69ea7eSYufeng Mo *save_buf = NULL; 612*5e69ea7eSYufeng Mo } 613*5e69ea7eSYufeng Mo 614*5e69ea7eSYufeng Mo return ret; 61504987ca1SGuangbin Huang } 61604987ca1SGuangbin Huang 617b2292360Sliuzhongzhu static const struct file_operations hns3_dbg_cmd_fops = { 618b2292360Sliuzhongzhu .owner = THIS_MODULE, 619b2292360Sliuzhongzhu .open = simple_open, 620b2292360Sliuzhongzhu .read = hns3_dbg_cmd_read, 621b2292360Sliuzhongzhu .write = hns3_dbg_cmd_write, 622b2292360Sliuzhongzhu }; 623b2292360Sliuzhongzhu 62404987ca1SGuangbin Huang static const struct file_operations hns3_dbg_fops = { 62504987ca1SGuangbin Huang .owner = THIS_MODULE, 62604987ca1SGuangbin Huang .open = simple_open, 62704987ca1SGuangbin Huang .read = hns3_dbg_read, 62804987ca1SGuangbin Huang }; 62904987ca1SGuangbin Huang 630*5e69ea7eSYufeng Mo static int 631*5e69ea7eSYufeng Mo hns3_dbg_common_file_init(struct hnae3_handle *handle, u32 cmd) 632*5e69ea7eSYufeng Mo { 633*5e69ea7eSYufeng Mo struct dentry *entry_dir; 634*5e69ea7eSYufeng Mo 635*5e69ea7eSYufeng Mo entry_dir = hns3_dbg_dentry[hns3_dbg_cmd[cmd].dentry].dentry; 636*5e69ea7eSYufeng Mo debugfs_create_file(hns3_dbg_cmd[cmd].name, 0400, entry_dir, 637*5e69ea7eSYufeng Mo handle, &hns3_dbg_fops); 638*5e69ea7eSYufeng Mo 639*5e69ea7eSYufeng Mo return 0; 640*5e69ea7eSYufeng Mo } 641*5e69ea7eSYufeng Mo 642*5e69ea7eSYufeng Mo int hns3_dbg_init(struct hnae3_handle *handle) 643b2292360Sliuzhongzhu { 64404987ca1SGuangbin Huang struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev); 645b2292360Sliuzhongzhu const char *name = pci_name(handle->pdev); 646*5e69ea7eSYufeng Mo int ret; 647*5e69ea7eSYufeng Mo u32 i; 648b2292360Sliuzhongzhu 649*5e69ea7eSYufeng Mo hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry = 650*5e69ea7eSYufeng Mo debugfs_create_dir(name, hns3_dbgfs_root); 651*5e69ea7eSYufeng Mo handle->hnae3_dbgfs = hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry; 652b2292360Sliuzhongzhu 65311ab11e6SGreg Kroah-Hartman debugfs_create_file("cmd", 0600, handle->hnae3_dbgfs, handle, 654b2292360Sliuzhongzhu &hns3_dbg_cmd_fops); 65504987ca1SGuangbin Huang 656*5e69ea7eSYufeng Mo for (i = 0; i < HNS3_DBG_DENTRY_COMMON; i++) 657*5e69ea7eSYufeng Mo hns3_dbg_dentry[i].dentry = 658*5e69ea7eSYufeng Mo debugfs_create_dir(hns3_dbg_dentry[i].name, 659*5e69ea7eSYufeng Mo handle->hnae3_dbgfs); 660*5e69ea7eSYufeng Mo 661*5e69ea7eSYufeng Mo for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) { 662*5e69ea7eSYufeng Mo if (hns3_dbg_cmd[i].cmd == HNAE3_DBG_CMD_TM_NODES && 663*5e69ea7eSYufeng Mo ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2) 664*5e69ea7eSYufeng Mo continue; 665*5e69ea7eSYufeng Mo 666*5e69ea7eSYufeng Mo if (!hns3_dbg_cmd[i].init) { 667*5e69ea7eSYufeng Mo dev_err(&handle->pdev->dev, 668*5e69ea7eSYufeng Mo "cmd %s lack of init func\n", 669*5e69ea7eSYufeng Mo hns3_dbg_cmd[i].name); 670*5e69ea7eSYufeng Mo ret = -EINVAL; 671*5e69ea7eSYufeng Mo goto out; 672*5e69ea7eSYufeng Mo } 673*5e69ea7eSYufeng Mo 674*5e69ea7eSYufeng Mo ret = hns3_dbg_cmd[i].init(handle, i); 675*5e69ea7eSYufeng Mo if (ret) { 676*5e69ea7eSYufeng Mo dev_err(&handle->pdev->dev, "failed to init cmd %s\n", 677*5e69ea7eSYufeng Mo hns3_dbg_cmd[i].name); 678*5e69ea7eSYufeng Mo goto out; 679*5e69ea7eSYufeng Mo } 680*5e69ea7eSYufeng Mo } 681*5e69ea7eSYufeng Mo 682*5e69ea7eSYufeng Mo return 0; 683*5e69ea7eSYufeng Mo 684*5e69ea7eSYufeng Mo out: 685*5e69ea7eSYufeng Mo debugfs_remove_recursive(handle->hnae3_dbgfs); 686*5e69ea7eSYufeng Mo handle->hnae3_dbgfs = NULL; 687*5e69ea7eSYufeng Mo return ret; 688b2292360Sliuzhongzhu } 689b2292360Sliuzhongzhu 690b2292360Sliuzhongzhu void hns3_dbg_uninit(struct hnae3_handle *handle) 691b2292360Sliuzhongzhu { 692*5e69ea7eSYufeng Mo u32 i; 693*5e69ea7eSYufeng Mo 694*5e69ea7eSYufeng Mo for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) 695*5e69ea7eSYufeng Mo if (hns3_dbg_cmd[i].buf) { 696*5e69ea7eSYufeng Mo kvfree(hns3_dbg_cmd[i].buf); 697*5e69ea7eSYufeng Mo hns3_dbg_cmd[i].buf = NULL; 698*5e69ea7eSYufeng Mo } 699*5e69ea7eSYufeng Mo 700b2292360Sliuzhongzhu debugfs_remove_recursive(handle->hnae3_dbgfs); 701b2292360Sliuzhongzhu handle->hnae3_dbgfs = NULL; 702b2292360Sliuzhongzhu } 703b2292360Sliuzhongzhu 704b2292360Sliuzhongzhu void hns3_dbg_register_debugfs(const char *debugfs_dir_name) 705b2292360Sliuzhongzhu { 706b2292360Sliuzhongzhu hns3_dbgfs_root = debugfs_create_dir(debugfs_dir_name, NULL); 707b2292360Sliuzhongzhu } 708b2292360Sliuzhongzhu 709b2292360Sliuzhongzhu void hns3_dbg_unregister_debugfs(void) 710b2292360Sliuzhongzhu { 711b2292360Sliuzhongzhu debugfs_remove_recursive(hns3_dbgfs_root); 712b2292360Sliuzhongzhu hns3_dbgfs_root = NULL; 713b2292360Sliuzhongzhu } 714