mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	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: Naveen Mamindlapalli <naveenm@marvell.com> Signed-off-by: Subbaraya Sundeep <sbhatta@marvell.com> Signed-off-by: Sunil Kovvuri Goutham <sgoutham@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									ffd2f89ad0
								
							
						
					
					
						commit
						43510ef4dd
					
				| @ -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 | |||||||
| 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); | |||||||
| 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 = { | |||||||
| 	.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) | |||||||
| 	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) | |||||||
| 	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) | |||||||
| 		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) | |||||||
| 	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 @@ | |||||||
| #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 = { | |||||||
| 	.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) | |||||||
| 	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); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Naveen Mamindlapalli
						Naveen Mamindlapalli