debugfs_remove_recursive(pdata->xgbe_debugfs);
        pdata->xgbe_debugfs = NULL;
 }
+
+void xgbe_debugfs_rename(struct xgbe_prv_data *pdata)
+{
+       struct dentry *pfile;
+       char *buf;
+
+       if (!pdata->xgbe_debugfs)
+               return;
+
+       buf = kasprintf(GFP_KERNEL, "amd-xgbe-%s", pdata->netdev->name);
+       if (!buf)
+               return;
+
+       if (!strcmp(pdata->xgbe_debugfs->d_name.name, buf))
+               goto out;
+
+       pfile = debugfs_rename(pdata->xgbe_debugfs->d_parent,
+                              pdata->xgbe_debugfs,
+                              pdata->xgbe_debugfs->d_parent, buf);
+       if (!pfile)
+               netdev_err(pdata->netdev, "debugfs_rename failed\n");
+
+out:
+       kfree(buf);
+}
 
                     (unsigned long)pdata);
 
        ret = devm_request_irq(pdata->dev, pdata->dev_irq, xgbe_isr, 0,
-                              netdev->name, pdata);
+                              netdev_name(netdev), pdata);
        if (ret) {
                netdev_alert(netdev, "error requesting irq %d\n",
                             pdata->dev_irq);
 
        DBGPR("-->xgbe_open\n");
 
+       /* Create the various names based on netdev name */
+       snprintf(pdata->an_name, sizeof(pdata->an_name) - 1, "%s-pcs",
+                netdev_name(netdev));
+
+       snprintf(pdata->ecc_name, sizeof(pdata->ecc_name) - 1, "%s-ecc",
+                netdev_name(netdev));
+
+       snprintf(pdata->i2c_name, sizeof(pdata->i2c_name) - 1, "%s-i2c",
+                netdev_name(netdev));
+
+       /* Create workqueues */
+       pdata->dev_workqueue =
+               create_singlethread_workqueue(netdev_name(netdev));
+       if (!pdata->dev_workqueue) {
+               netdev_err(netdev, "device workqueue creation failed\n");
+               return -ENOMEM;
+       }
+
+       pdata->an_workqueue =
+               create_singlethread_workqueue(pdata->an_name);
+       if (!pdata->an_workqueue) {
+               netdev_err(netdev, "phy workqueue creation failed\n");
+               ret = -ENOMEM;
+               goto err_dev_wq;
+       }
+
        /* Reset the phy settings */
        ret = xgbe_phy_reset(pdata);
        if (ret)
-               return ret;
+               goto err_an_wq;
 
        /* Enable the clocks */
        ret = clk_prepare_enable(pdata->sysclk);
        if (ret) {
                netdev_alert(netdev, "dma clk_prepare_enable failed\n");
-               return ret;
+               goto err_an_wq;
        }
 
        ret = clk_prepare_enable(pdata->ptpclk);
 err_sysclk:
        clk_disable_unprepare(pdata->sysclk);
 
+err_an_wq:
+       destroy_workqueue(pdata->an_workqueue);
+
+err_dev_wq:
+       destroy_workqueue(pdata->dev_workqueue);
+
        return ret;
 }
 
        clk_disable_unprepare(pdata->ptpclk);
        clk_disable_unprepare(pdata->sysclk);
 
+       flush_workqueue(pdata->an_workqueue);
+       destroy_workqueue(pdata->an_workqueue);
+
+       flush_workqueue(pdata->dev_workqueue);
+       destroy_workqueue(pdata->dev_workqueue);
+
        set_bit(XGBE_DOWN, &pdata->dev_state);
 
        DBGPR("<--xgbe_close\n");
 
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/io.h>
+#include <linux/notifier.h>
 
 #include "xgbe.h"
 #include "xgbe-common.h"
                return ret;
        }
 
-       /* Create the PHY/ANEG name based on netdev name */
-       snprintf(pdata->an_name, sizeof(pdata->an_name) - 1, "%s-pcs",
-                netdev_name(netdev));
-
-       /* Create the ECC name based on netdev name */
-       snprintf(pdata->ecc_name, sizeof(pdata->ecc_name) - 1, "%s-ecc",
-                netdev_name(netdev));
-
-       /* Create the I2C name based on netdev name */
-       snprintf(pdata->i2c_name, sizeof(pdata->i2c_name) - 1, "%s-i2c",
-                netdev_name(netdev));
-
-       /* Create workqueues */
-       pdata->dev_workqueue =
-               create_singlethread_workqueue(netdev_name(netdev));
-       if (!pdata->dev_workqueue) {
-               netdev_err(netdev, "device workqueue creation failed\n");
-               ret = -ENOMEM;
-               goto err_netdev;
-       }
-
-       pdata->an_workqueue =
-               create_singlethread_workqueue(pdata->an_name);
-       if (!pdata->an_workqueue) {
-               netdev_err(netdev, "phy workqueue creation failed\n");
-               ret = -ENOMEM;
-               goto err_wq;
-       }
-
        if (IS_REACHABLE(CONFIG_PTP_1588_CLOCK))
                xgbe_ptp_register(pdata);
 
                  pdata->rx_ring_count);
 
        return 0;
-
-err_wq:
-       destroy_workqueue(pdata->dev_workqueue);
-
-err_netdev:
-       unregister_netdev(netdev);
-
-       return ret;
 }
 
 void xgbe_deconfig_netdev(struct xgbe_prv_data *pdata)
        unregister_netdev(netdev);
 
        pdata->phy_if.phy_exit(pdata);
+}
 
-       flush_workqueue(pdata->an_workqueue);
-       destroy_workqueue(pdata->an_workqueue);
+static int xgbe_netdev_event(struct notifier_block *nb, unsigned long event,
+                            void *data)
+{
+       struct net_device *netdev = netdev_notifier_info_to_dev(data);
+       struct xgbe_prv_data *pdata = netdev_priv(netdev);
 
-       flush_workqueue(pdata->dev_workqueue);
-       destroy_workqueue(pdata->dev_workqueue);
+       if (netdev->netdev_ops != xgbe_get_netdev_ops())
+               goto out;
+
+       switch (event) {
+       case NETDEV_CHANGENAME:
+               xgbe_debugfs_rename(pdata);
+               break;
+
+       default:
+               break;
+       }
+
+out:
+       return NOTIFY_DONE;
 }
 
+static struct notifier_block xgbe_netdev_notifier = {
+       .notifier_call = xgbe_netdev_event,
+};
+
 static int __init xgbe_mod_init(void)
 {
        int ret;
 
+       ret = register_netdevice_notifier(&xgbe_netdev_notifier);
+       if (ret)
+               return ret;
+
        ret = xgbe_platform_init();
        if (ret)
                return ret;
        xgbe_pci_exit();
 
        xgbe_platform_exit();
+
+       unregister_netdevice_notifier(&xgbe_netdev_notifier);
 }
 
 module_init(xgbe_mod_init);
 
 #include <linux/completion.h>
 #include <linux/cpumask.h>
 #include <linux/interrupt.h>
+#include <linux/dcache.h>
 
 #define XGBE_DRV_NAME          "amd-xgbe"
 #define XGBE_DRV_VERSION       "1.0.3"
        struct tasklet_struct tasklet_i2c;
        struct tasklet_struct tasklet_an;
 
-#ifdef CONFIG_DEBUG_FS
        struct dentry *xgbe_debugfs;
 
        unsigned int debugfs_xgmac_reg;
        unsigned int debugfs_xprop_reg;
 
        unsigned int debugfs_xi2c_reg;
-#endif
 };
 
 /* Function prototypes*/
 #ifdef CONFIG_DEBUG_FS
 void xgbe_debugfs_init(struct xgbe_prv_data *);
 void xgbe_debugfs_exit(struct xgbe_prv_data *);
+void xgbe_debugfs_rename(struct xgbe_prv_data *pdata);
 #else
 static inline void xgbe_debugfs_init(struct xgbe_prv_data *pdata) {}
 static inline void xgbe_debugfs_exit(struct xgbe_prv_data *pdata) {}
+static inline void xgbe_debugfs_rename(struct xgbe_prv_data *pdata) {}
 #endif /* CONFIG_DEBUG_FS */
 
 /* NOTE: Uncomment for function trace log messages in KERNEL LOG */