Commit 43510ef4 authored by Naveen Mamindlapalli's avatar Naveen Mamindlapalli Committed by David S. Miller

octeontx2-nicvf: Add PTP hardware clock support to NIX VF

This patch adds PTP PHC support to NIX VF interfaces. This enables
a VF to run PTP master/slave instance. PTP block being a shared
hardware resource it is recommended to avoid running multiple
PTP instances in the system which will impact the PTP clock
accuracy.
Signed-off-by: default avatarNaveen Mamindlapalli <naveenm@marvell.com>
Signed-off-by: default avatarSubbaraya Sundeep <sbhatta@marvell.com>
Signed-off-by: default avatarSunil Kovvuri Goutham <sgoutham@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ffd2f89a
...@@ -730,6 +730,9 @@ static int rvu_cgx_ptp_rx_cfg(struct rvu *rvu, u16 pcifunc, bool enable) ...@@ -730,6 +730,9 @@ static int rvu_cgx_ptp_rx_cfg(struct rvu *rvu, u16 pcifunc, bool enable)
int rvu_mbox_handler_cgx_ptp_rx_enable(struct rvu *rvu, struct msg_req *req, int rvu_mbox_handler_cgx_ptp_rx_enable(struct rvu *rvu, struct msg_req *req,
struct msg_rsp *rsp) 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); return rvu_cgx_ptp_rx_cfg(rvu, req->hdr.pcifunc, true);
} }
......
...@@ -9,6 +9,6 @@ obj-$(CONFIG_OCTEONTX2_VF) += rvu_nicvf.o ...@@ -9,6 +9,6 @@ obj-$(CONFIG_OCTEONTX2_VF) += rvu_nicvf.o
rvu_nicpf-y := otx2_pf.o otx2_common.o otx2_txrx.o otx2_ethtool.o \ 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_ptp.o otx2_flows.o otx2_tc.o cn10k.o otx2_dmac_flt.o \
otx2_devlink.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 ccflags-y += -I$(srctree)/drivers/net/ethernet/marvell/octeontx2/af
...@@ -834,6 +834,9 @@ int otx2_open(struct net_device *netdev); ...@@ -834,6 +834,9 @@ int otx2_open(struct net_device *netdev);
int otx2_stop(struct net_device *netdev); int otx2_stop(struct net_device *netdev);
int otx2_set_real_num_queues(struct net_device *netdev, int otx2_set_real_num_queues(struct net_device *netdev,
int tx_queues, int rx_queues); 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 */ /* MCAM filter related APIs */
int otx2_mcam_flow_init(struct otx2_nic *pf); int otx2_mcam_flow_init(struct otx2_nic *pf);
int otx2vf_mcam_flow_init(struct otx2_nic *pfvf); int otx2vf_mcam_flow_init(struct otx2_nic *pfvf);
......
...@@ -1347,6 +1347,7 @@ static const struct ethtool_ops otx2vf_ethtool_ops = { ...@@ -1347,6 +1347,7 @@ static const struct ethtool_ops otx2vf_ethtool_ops = {
.get_pauseparam = otx2_get_pauseparam, .get_pauseparam = otx2_get_pauseparam,
.set_pauseparam = otx2_set_pauseparam, .set_pauseparam = otx2_set_pauseparam,
.get_link_ksettings = otx2vf_get_link_ksettings, .get_link_ksettings = otx2vf_get_link_ksettings,
.get_ts_info = otx2_get_ts_info,
}; };
void otx2vf_set_ethtool_ops(struct net_device *netdev) void otx2vf_set_ethtool_ops(struct net_device *netdev)
......
...@@ -1975,7 +1975,7 @@ static int otx2_config_hw_tx_tstamp(struct otx2_nic *pfvf, bool enable) ...@@ -1975,7 +1975,7 @@ static int otx2_config_hw_tx_tstamp(struct otx2_nic *pfvf, bool enable)
return 0; 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 otx2_nic *pfvf = netdev_priv(netdev);
struct hwtstamp_config config; struct hwtstamp_config config;
...@@ -2031,8 +2031,9 @@ static int otx2_config_hwtstamp(struct net_device *netdev, struct ifreq *ifr) ...@@ -2031,8 +2031,9 @@ static int otx2_config_hwtstamp(struct net_device *netdev, struct ifreq *ifr)
return copy_to_user(ifr->ifr_data, &config, return copy_to_user(ifr->ifr_data, &config,
sizeof(config)) ? -EFAULT : 0; 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 otx2_nic *pfvf = netdev_priv(netdev);
struct hwtstamp_config *cfg = &pfvf->tstamp; struct hwtstamp_config *cfg = &pfvf->tstamp;
...@@ -2047,6 +2048,7 @@ static int otx2_ioctl(struct net_device *netdev, struct ifreq *req, int cmd) ...@@ -2047,6 +2048,7 @@ static int otx2_ioctl(struct net_device *netdev, struct ifreq *req, int cmd)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
} }
EXPORT_SYMBOL(otx2_ioctl);
static int otx2_do_set_vf_mac(struct otx2_nic *pf, int vf, const u8 *mac) static int otx2_do_set_vf_mac(struct otx2_nic *pf, int vf, const u8 *mac)
{ {
......
...@@ -223,6 +223,11 @@ int otx2_ptp_init(struct otx2_nic *pfvf) ...@@ -223,6 +223,11 @@ int otx2_ptp_init(struct otx2_nic *pfvf)
struct ptp_req *req; struct ptp_req *req;
int err; int err;
if (is_otx2_lbkvf(pfvf->pdev)) {
pfvf->ptp = NULL;
return 0;
}
mutex_lock(&pfvf->mbox.lock); mutex_lock(&pfvf->mbox.lock);
/* check if PTP block is available */ /* check if PTP block is available */
req = otx2_mbox_alloc_msg_ptp_op(&pfvf->mbox); req = otx2_mbox_alloc_msg_ptp_op(&pfvf->mbox);
......
...@@ -8,9 +8,11 @@ ...@@ -8,9 +8,11 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/net_tstamp.h>
#include "otx2_common.h" #include "otx2_common.h"
#include "otx2_reg.h" #include "otx2_reg.h"
#include "otx2_ptp.h"
#include "cn10k.h" #include "cn10k.h"
#define DRV_NAME "rvu_nicvf" #define DRV_NAME "rvu_nicvf"
...@@ -500,6 +502,7 @@ static const struct net_device_ops otx2vf_netdev_ops = { ...@@ -500,6 +502,7 @@ static const struct net_device_ops otx2vf_netdev_ops = {
.ndo_set_features = otx2vf_set_features, .ndo_set_features = otx2vf_set_features,
.ndo_get_stats64 = otx2_get_stats64, .ndo_get_stats64 = otx2_get_stats64,
.ndo_tx_timeout = otx2_tx_timeout, .ndo_tx_timeout = otx2_tx_timeout,
.ndo_do_ioctl = otx2_ioctl,
}; };
static int otx2_wq_init(struct otx2_nic *vf) static int otx2_wq_init(struct otx2_nic *vf)
...@@ -640,6 +643,9 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -640,6 +643,9 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (err) if (err)
goto err_detach_rsrc; goto err_detach_rsrc;
/* Don't check for error. Proceed without ptp */
otx2_ptp_init(vf);
/* Assign default mac address */ /* Assign default mac address */
otx2_get_mac_from_af(netdev); otx2_get_mac_from_af(netdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment