.xmo_rx_hash                    = mlx4_en_xdp_rx_hash,
 };
 
-struct mlx4_en_bond {
-       struct work_struct work;
-       struct mlx4_en_priv *priv;
-       int is_bonded;
-       struct mlx4_port_map port_map;
-};
-
-static void mlx4_en_bond_work(struct work_struct *work)
-{
-       struct mlx4_en_bond *bond = container_of(work,
-                                                    struct mlx4_en_bond,
-                                                    work);
-       int err = 0;
-       struct mlx4_dev *dev = bond->priv->mdev->dev;
-
-       if (bond->is_bonded) {
-               if (!mlx4_is_bonded(dev)) {
-                       err = mlx4_bond(dev);
-                       if (err)
-                               en_err(bond->priv, "Fail to bond device\n");
-               }
-               if (!err) {
-                       err = mlx4_port_map_set(dev, &bond->port_map);
-                       if (err)
-                               en_err(bond->priv, "Fail to set port map [%d][%d]: %d\n",
-                                      bond->port_map.port1,
-                                      bond->port_map.port2,
-                                      err);
-               }
-       } else if (mlx4_is_bonded(dev)) {
-               err = mlx4_unbond(dev);
-               if (err)
-                       en_err(bond->priv, "Fail to unbond device\n");
-       }
-       dev_put(bond->priv->dev);
-       kfree(bond);
-}
-
-static int mlx4_en_queue_bond_work(struct mlx4_en_priv *priv, int is_bonded,
-                                  u8 v2p_p1, u8 v2p_p2)
-{
-       struct mlx4_en_bond *bond;
-
-       bond = kzalloc(sizeof(*bond), GFP_ATOMIC);
-       if (!bond)
-               return -ENOMEM;
-
-       INIT_WORK(&bond->work, mlx4_en_bond_work);
-       bond->priv = priv;
-       bond->is_bonded = is_bonded;
-       bond->port_map.port1 = v2p_p1;
-       bond->port_map.port2 = v2p_p2;
-       dev_hold(priv->dev);
-       queue_work(priv->mdev->workqueue, &bond->work);
-       return 0;
-}
-
 int mlx4_en_netdev_event(struct notifier_block *this,
                         unsigned long event, void *ptr)
 {
        struct mlx4_dev *dev;
        int i, num_eth_ports = 0;
        bool do_bond = true;
-       struct mlx4_en_priv *priv;
        u8 v2p_port1 = 0;
        u8 v2p_port2 = 0;
 
        if ((do_bond && (event != NETDEV_BONDING_INFO)) || !port)
                return NOTIFY_DONE;
 
-       priv = netdev_priv(ndev);
        if (do_bond) {
                struct netdev_notifier_bonding_info *notifier_info = ptr;
                struct netdev_bonding_info *bonding_info =
                }
        }
 
-       mlx4_en_queue_bond_work(priv, do_bond,
-                               v2p_port1, v2p_port2);
+       mlx4_queue_bond_work(dev, do_bond, v2p_port1, v2p_port2);
 
        return NOTIFY_DONE;
 }
 
        return ret;
 }
 
-int mlx4_bond(struct mlx4_dev *dev)
+static int mlx4_bond(struct mlx4_dev *dev)
 {
        int ret = 0;
        struct mlx4_priv *priv = mlx4_priv(dev);
 
        return ret;
 }
-EXPORT_SYMBOL_GPL(mlx4_bond);
 
-int mlx4_unbond(struct mlx4_dev *dev)
+static int mlx4_unbond(struct mlx4_dev *dev)
 {
        int ret = 0;
        struct mlx4_priv *priv = mlx4_priv(dev);
 
        return ret;
 }
-EXPORT_SYMBOL_GPL(mlx4_unbond);
 
-
-int mlx4_port_map_set(struct mlx4_dev *dev, struct mlx4_port_map *v2p)
+static int mlx4_port_map_set(struct mlx4_dev *dev, struct mlx4_port_map *v2p)
 {
        u8 port1 = v2p->port1;
        u8 port2 = v2p->port2;
        mutex_unlock(&priv->bond_mutex);
        return err;
 }
-EXPORT_SYMBOL_GPL(mlx4_port_map_set);
+
+struct mlx4_bond {
+       struct work_struct work;
+       struct mlx4_dev *dev;
+       int is_bonded;
+       struct mlx4_port_map port_map;
+};
+
+static void mlx4_bond_work(struct work_struct *work)
+{
+       struct mlx4_bond *bond = container_of(work, struct mlx4_bond, work);
+       int err = 0;
+
+       if (bond->is_bonded) {
+               if (!mlx4_is_bonded(bond->dev)) {
+                       err = mlx4_bond(bond->dev);
+                       if (err)
+                               mlx4_err(bond->dev, "Fail to bond device\n");
+               }
+               if (!err) {
+                       err = mlx4_port_map_set(bond->dev, &bond->port_map);
+                       if (err)
+                               mlx4_err(bond->dev,
+                                        "Fail to set port map [%d][%d]: %d\n",
+                                        bond->port_map.port1,
+                                        bond->port_map.port2, err);
+               }
+       } else if (mlx4_is_bonded(bond->dev)) {
+               err = mlx4_unbond(bond->dev);
+               if (err)
+                       mlx4_err(bond->dev, "Fail to unbond device\n");
+       }
+       put_device(&bond->dev->persist->pdev->dev);
+       kfree(bond);
+}
+
+int mlx4_queue_bond_work(struct mlx4_dev *dev, int is_bonded, u8 v2p_p1,
+                        u8 v2p_p2)
+{
+       struct mlx4_bond *bond;
+
+       bond = kzalloc(sizeof(*bond), GFP_ATOMIC);
+       if (!bond)
+               return -ENOMEM;
+
+       INIT_WORK(&bond->work, mlx4_bond_work);
+       get_device(&dev->persist->pdev->dev);
+       bond->dev = dev;
+       bond->is_bonded = is_bonded;
+       bond->port_map.port1 = v2p_p1;
+       bond->port_map.port2 = v2p_p2;
+       queue_work(mlx4_wq, &bond->work);
+       return 0;
+}
+EXPORT_SYMBOL(mlx4_queue_bond_work);
 
 static int mlx4_load_fw(struct mlx4_dev *dev)
 {
 
        struct list_head steer_entries[MLX4_NUM_STEERS];
 };
 
+struct mlx4_port_map {
+       u8      port1;
+       u8      port2;
+};
+
 enum {
        MLX4_PCI_DEV_IS_VF              = 1 << 0,
        MLX4_PCI_DEV_FORCE_SENSE_PORT   = 1 << 1,
 
                        (offset & (PAGE_SIZE - 1));
 }
 
+static inline int mlx4_is_bonded(struct mlx4_dev *dev)
+{
+       return !!(dev->flags & MLX4_FLAG_BONDED);
+}
+
+static inline int mlx4_is_mf_bonded(struct mlx4_dev *dev)
+{
+       return (mlx4_is_bonded(dev) && mlx4_is_mfunc(dev));
+}
+
+int mlx4_queue_bond_work(struct mlx4_dev *dev, int is_bonded, u8 v2p_p1,
+                        u8 v2p_p2);
+
 int mlx4_pd_alloc(struct mlx4_dev *dev, u32 *pdn);
 void mlx4_pd_free(struct mlx4_dev *dev, u32 pdn);
 int mlx4_xrcd_alloc(struct mlx4_dev *dev, u32 *xrcdn);
 
 int mlx4_register_interface(struct mlx4_interface *intf);
 void mlx4_unregister_interface(struct mlx4_interface *intf);
 
-int mlx4_bond(struct mlx4_dev *dev);
-int mlx4_unbond(struct mlx4_dev *dev);
-static inline int mlx4_is_bonded(struct mlx4_dev *dev)
-{
-       return !!(dev->flags & MLX4_FLAG_BONDED);
-}
-
-static inline int mlx4_is_mf_bonded(struct mlx4_dev *dev)
-{
-       return (mlx4_is_bonded(dev) && mlx4_is_mfunc(dev));
-}
-
-struct mlx4_port_map {
-       u8      port1;
-       u8      port2;
-};
-
-int mlx4_port_map_set(struct mlx4_dev *dev, struct mlx4_port_map *v2p);
-
 int mlx4_register_event_notifier(struct mlx4_dev *dev,
                                 struct notifier_block *nb);
 int mlx4_unregister_event_notifier(struct mlx4_dev *dev,