#ifdef CONFIG_NFP_DEBUG
 void nfp_net_debugfs_create(void);
 void nfp_net_debugfs_destroy(void);
-void nfp_net_debugfs_adapter_add(struct nfp_net *nn);
-void nfp_net_debugfs_adapter_del(struct nfp_net *nn);
+struct dentry *nfp_net_debugfs_device_add(struct pci_dev *pdev);
+void nfp_net_debugfs_port_add(struct nfp_net *nn, struct dentry *ddir, int id);
+void nfp_net_debugfs_dir_clean(struct dentry **dir);
 #else
 static inline void nfp_net_debugfs_create(void)
 {
 {
 }
 
-static inline void nfp_net_debugfs_adapter_add(struct nfp_net *nn)
+static inline struct dentry *nfp_net_debugfs_device_add(struct pci_dev *pdev)
 {
+       return NULL;
 }
 
-static inline void nfp_net_debugfs_adapter_del(struct nfp_net *nn)
+static inline void
+nfp_net_debugfs_port_add(struct nfp_net *nn, struct dentry *ddir, int id)
+{
+}
+
+static inline void nfp_net_debugfs_dir_clean(struct dentry **dir)
 {
 }
 #endif /* CONFIG_NFP_DEBUG */
 
 /*
- * Copyright (C) 2015 Netronome Systems, Inc.
+ * Copyright (C) 2015-2017 Netronome Systems, Inc.
  *
  * This software is dual licensed under the GNU General License Version 2,
  * June 1991 as shown in the file COPYING in the top-level directory of this
        .llseek = seq_lseek
 };
 
-void nfp_net_debugfs_adapter_add(struct nfp_net *nn)
+void nfp_net_debugfs_port_add(struct nfp_net *nn, struct dentry *ddir, int id)
 {
        struct dentry *queues, *tx, *rx, *xdp;
-       char int_name[16];
+       char name[20];
        int i;
 
        if (IS_ERR_OR_NULL(nfp_dir))
                return;
 
-       nn->debugfs_dir = debugfs_create_dir(pci_name(nn->pdev), nfp_dir);
+       sprintf(name, "port%d", id);
+       nn->debugfs_dir = debugfs_create_dir(name, ddir);
        if (IS_ERR_OR_NULL(nn->debugfs_dir))
                return;
 
                return;
 
        for (i = 0; i < min(nn->max_rx_rings, nn->max_r_vecs); i++) {
-               sprintf(int_name, "%d", i);
-               debugfs_create_file(int_name, S_IRUSR, rx,
+               sprintf(name, "%d", i);
+               debugfs_create_file(name, S_IRUSR, rx,
                                    &nn->r_vecs[i], &nfp_rx_q_fops);
-               debugfs_create_file(int_name, S_IRUSR, xdp,
+               debugfs_create_file(name, S_IRUSR, xdp,
                                    &nn->r_vecs[i], &nfp_xdp_q_fops);
        }
 
        for (i = 0; i < min(nn->max_tx_rings, nn->max_r_vecs); i++) {
-               sprintf(int_name, "%d", i);
-               debugfs_create_file(int_name, S_IRUSR, tx,
+               sprintf(name, "%d", i);
+               debugfs_create_file(name, S_IRUSR, tx,
                                    &nn->r_vecs[i], &nfp_tx_q_fops);
        }
 }
 
-void nfp_net_debugfs_adapter_del(struct nfp_net *nn)
+struct dentry *nfp_net_debugfs_device_add(struct pci_dev *pdev)
 {
-       debugfs_remove_recursive(nn->debugfs_dir);
-       nn->debugfs_dir = NULL;
+       struct dentry *dev_dir;
+
+       if (IS_ERR_OR_NULL(nfp_dir))
+               return NULL;
+
+       dev_dir = debugfs_create_dir(pci_name(pdev), nfp_dir);
+       if (IS_ERR_OR_NULL(dev_dir))
+               return NULL;
+
+       return dev_dir;
+}
+
+void nfp_net_debugfs_dir_clean(struct dentry **dir)
+{
+       debugfs_remove_recursive(*dir);
+       *dir = NULL;
 }
 
 void nfp_net_debugfs_create(void)
 
        u32 tx_bar_sz, rx_bar_sz;
        int tx_bar_no, rx_bar_no;
        u8 __iomem *ctrl_bar;
+       struct dentry *ddir;
        struct nfp_net *nn;
        u32 startq;
        int stride;
        pci_set_drvdata(pdev, nn);
 
        nfp_net_info(nn);
-       nfp_net_debugfs_adapter_add(nn);
+       ddir = nfp_net_debugfs_device_add(pdev);
+       nfp_net_debugfs_port_add(nn, ddir, 0);
+       nn->debugfs_dir = ddir;
 
        return 0;
 
        /* Note, the order is slightly different from above as we need
         * to keep the nn pointer around till we have freed everything.
         */
-       nfp_net_debugfs_adapter_del(nn);
+       nfp_net_debugfs_dir_clean(&nn->debugfs_dir);
 
        nfp_net_netdev_clean(nn->netdev);