int rvu_mbox_handler_cgx_ptp_rx_enable(struct rvu *rvu, struct msg_req *req,
                                       struct msg_rsp *rsp)
 {
+       if (!is_pf_cgxmapped(rvu, rvu_get_pf(req->hdr.pcifunc)))
+               return -EPERM;
+
        return rvu_cgx_ptp_rx_cfg(rvu, req->hdr.pcifunc, true);
 }
 
 
 rvu_nicpf-y := otx2_pf.o otx2_common.o otx2_txrx.o otx2_ethtool.o \
                otx2_ptp.o otx2_flows.o otx2_tc.o cn10k.o otx2_dmac_flt.o \
                otx2_devlink.o
-rvu_nicvf-y := otx2_vf.o otx2_devlink.o
+rvu_nicvf-y := otx2_vf.o otx2_devlink.o otx2_ptp.o
 
 ccflags-y += -I$(srctree)/drivers/net/ethernet/marvell/octeontx2/af
 
 int otx2_stop(struct net_device *netdev);
 int otx2_set_real_num_queues(struct net_device *netdev,
                             int tx_queues, int rx_queues);
+int otx2_ioctl(struct net_device *netdev, struct ifreq *req, int cmd);
+int otx2_config_hwtstamp(struct net_device *netdev, struct ifreq *ifr);
+
 /* MCAM filter related APIs */
 int otx2_mcam_flow_init(struct otx2_nic *pf);
 int otx2vf_mcam_flow_init(struct otx2_nic *pfvf);
 
        .get_pauseparam         = otx2_get_pauseparam,
        .set_pauseparam         = otx2_set_pauseparam,
        .get_link_ksettings     = otx2vf_get_link_ksettings,
+       .get_ts_info            = otx2_get_ts_info,
 };
 
 void otx2vf_set_ethtool_ops(struct net_device *netdev)
 
        return 0;
 }
 
-static int otx2_config_hwtstamp(struct net_device *netdev, struct ifreq *ifr)
+int otx2_config_hwtstamp(struct net_device *netdev, struct ifreq *ifr)
 {
        struct otx2_nic *pfvf = netdev_priv(netdev);
        struct hwtstamp_config config;
        return copy_to_user(ifr->ifr_data, &config,
                            sizeof(config)) ? -EFAULT : 0;
 }
+EXPORT_SYMBOL(otx2_config_hwtstamp);
 
-static int otx2_ioctl(struct net_device *netdev, struct ifreq *req, int cmd)
+int otx2_ioctl(struct net_device *netdev, struct ifreq *req, int cmd)
 {
        struct otx2_nic *pfvf = netdev_priv(netdev);
        struct hwtstamp_config *cfg = &pfvf->tstamp;
                return -EOPNOTSUPP;
        }
 }
+EXPORT_SYMBOL(otx2_ioctl);
 
 static int otx2_do_set_vf_mac(struct otx2_nic *pf, int vf, const u8 *mac)
 {
 
        struct ptp_req *req;
        int err;
 
+       if (is_otx2_lbkvf(pfvf->pdev)) {
+               pfvf->ptp = NULL;
+               return 0;
+       }
+
        mutex_lock(&pfvf->mbox.lock);
        /* check if PTP block is available */
        req = otx2_mbox_alloc_msg_ptp_op(&pfvf->mbox);
 
 #include <linux/etherdevice.h>
 #include <linux/module.h>
 #include <linux/pci.h>
+#include <linux/net_tstamp.h>
 
 #include "otx2_common.h"
 #include "otx2_reg.h"
+#include "otx2_ptp.h"
 #include "cn10k.h"
 
 #define DRV_NAME       "rvu_nicvf"
        .ndo_set_features = otx2vf_set_features,
        .ndo_get_stats64 = otx2_get_stats64,
        .ndo_tx_timeout = otx2_tx_timeout,
+       .ndo_do_ioctl   = otx2_ioctl,
 };
 
 static int otx2_wq_init(struct otx2_nic *vf)
        if (err)
                goto err_detach_rsrc;
 
+       /* Don't check for error.  Proceed without ptp */
+       otx2_ptp_init(vf);
+
        /* Assign default mac address */
        otx2_get_mac_from_af(netdev);