int nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app,
                                   struct nfp_net *nn, unsigned int id);
 
-struct devlink *nfp_devlink_get_devlink(struct net_device *netdev);
+struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev);
 
 #endif
 
        devlink_port_type_clear(&port->dl_port);
 }
 
-struct devlink *nfp_devlink_get_devlink(struct net_device *netdev)
+struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev)
 {
-       struct nfp_app *app;
+       struct nfp_port *port;
 
-       app = nfp_app_from_netdev(netdev);
-       if (!app)
+       port = nfp_port_from_netdev(netdev);
+       if (!port)
                return NULL;
 
-       return priv_to_devlink(app->pf);
+       return &port->dl_port;
 }
 
        .ndo_udp_tunnel_del     = nfp_net_del_vxlan_port,
        .ndo_bpf                = nfp_net_xdp,
        .ndo_get_port_parent_id = nfp_port_get_port_parent_id,
-       .ndo_get_devlink        = nfp_devlink_get_devlink,
+       .ndo_get_devlink_port   = nfp_devlink_get_devlink_port,
 };
 
 /**
 
        .ndo_set_features       = nfp_port_set_features,
        .ndo_set_mac_address    = eth_mac_addr,
        .ndo_get_port_parent_id = nfp_port_get_port_parent_id,
-       .ndo_get_devlink        = nfp_devlink_get_devlink,
+       .ndo_get_devlink_port   = nfp_devlink_get_devlink_port,
 };
 
 void
 
  *     that got dropped are freed/returned via xdp_return_frame().
  *     Returns negative number, means general error invoking ndo, meaning
  *     no frames were xmit'ed and core-caller will free all frames.
- * struct devlink *(*ndo_get_devlink)(struct net_device *dev);
- *     Get devlink instance associated with a given netdev.
+ * struct devlink_port *(*ndo_get_devlink_port)(struct net_device *dev);
+ *     Get devlink port instance associated with a given netdev.
  *     Called with a reference on the netdevice and devlink locks only,
  *     rtnl_lock is not held.
  */
                                                u32 flags);
        int                     (*ndo_xsk_async_xmit)(struct net_device *dev,
                                                      u32 queue_id);
-       struct devlink *        (*ndo_get_devlink)(struct net_device *dev);
+       struct devlink_port *   (*ndo_get_devlink_port)(struct net_device *dev);
 };
 
 /**
 
        return container_of(priv, struct devlink, priv);
 }
 
+static inline struct devlink_port *
+netdev_to_devlink_port(struct net_device *dev)
+{
+       if (dev->netdev_ops->ndo_get_devlink_port)
+               return dev->netdev_ops->ndo_get_devlink_port(dev);
+       return NULL;
+}
+
 static inline struct devlink *netdev_to_devlink(struct net_device *dev)
 {
-       if (dev->netdev_ops->ndo_get_devlink)
-               return dev->netdev_ops->ndo_get_devlink(dev);
+       struct devlink_port *devlink_port = netdev_to_devlink_port(dev);
+
+       if (devlink_port)
+               return devlink_port->devlink;
        return NULL;
 }