Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c55215c authored by Sudarsana Reddy Kalluru's avatar Sudarsana Reddy Kalluru Committed by David S. Miller
Browse files

qede: Add driver support for PTP



This patch adds the driver support for,
  - Registering the ptp clock functionality with the OS.
  - Timestamping the Rx/Tx PTP packets.
  - Ethtool callbacks related to PTP.

Signed-off-by: default avatarSudarsana Reddy Kalluru <Sudarsana.Kalluru@cavium.com>
Signed-off-by: default avatarYuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c78c70fa
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -104,6 +104,7 @@ config QED_SRIOV
config QEDE
config QEDE
	tristate "QLogic QED 25/40/100Gb Ethernet NIC"
	tristate "QLogic QED 25/40/100Gb Ethernet NIC"
	depends on QED
	depends on QED
	imply PTP_1588_CLOCK
	---help---
	---help---
	  This enables the support for ...
	  This enables the support for ...


+1 −1
Original line number Original line Diff line number Diff line
obj-$(CONFIG_QEDE) := qede.o
obj-$(CONFIG_QEDE) := qede.o


qede-y := qede_main.o qede_fp.o qede_filter.o qede_ethtool.o
qede-y := qede_main.o qede_fp.o qede_filter.o qede_ethtool.o qede_ptp.o
qede-$(CONFIG_DCB) += qede_dcbnl.o
qede-$(CONFIG_DCB) += qede_dcbnl.o
qede-$(CONFIG_QED_RDMA) += qede_roce.o
qede-$(CONFIG_QED_RDMA) += qede_roce.o
+4 −0
Original line number Original line Diff line number Diff line
@@ -137,6 +137,8 @@ struct qede_rdma_dev {
	struct workqueue_struct *roce_wq;
	struct workqueue_struct *roce_wq;
};
};


struct qede_ptp;

struct qede_dev {
struct qede_dev {
	struct qed_dev			*cdev;
	struct qed_dev			*cdev;
	struct net_device		*ndev;
	struct net_device		*ndev;
@@ -148,8 +150,10 @@ struct qede_dev {
	u32 flags;
	u32 flags;
#define QEDE_FLAG_IS_VF	BIT(0)
#define QEDE_FLAG_IS_VF	BIT(0)
#define IS_VF(edev)	(!!((edev)->flags & QEDE_FLAG_IS_VF))
#define IS_VF(edev)	(!!((edev)->flags & QEDE_FLAG_IS_VF))
#define QEDE_TX_TIMESTAMPING_EN		BIT(1)


	const struct qed_eth_ops	*ops;
	const struct qed_eth_ops	*ops;
	struct qede_ptp			*ptp;


	struct qed_dev_eth_info dev_info;
	struct qed_dev_eth_info dev_info;
#define QEDE_MAX_RSS_CNT(edev)	((edev)->dev_info.num_queues)
#define QEDE_MAX_RSS_CNT(edev)	((edev)->dev_info.num_queues)
+10 −0
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@
#include <linux/capability.h>
#include <linux/capability.h>
#include <linux/vmalloc.h>
#include <linux/vmalloc.h>
#include "qede.h"
#include "qede.h"
#include "qede_ptp.h"


#define QEDE_RQSTAT_OFFSET(stat_name) \
#define QEDE_RQSTAT_OFFSET(stat_name) \
	 (offsetof(struct qede_rx_queue, stat_name))
	 (offsetof(struct qede_rx_queue, stat_name))
@@ -940,6 +941,14 @@ static int qede_set_channels(struct net_device *dev,
	return 0;
	return 0;
}
}


static int qede_get_ts_info(struct net_device *dev,
			    struct ethtool_ts_info *info)
{
	struct qede_dev *edev = netdev_priv(dev);

	return qede_ptp_get_ts_info(edev, info);
}

static int qede_set_phys_id(struct net_device *dev,
static int qede_set_phys_id(struct net_device *dev,
			    enum ethtool_phys_id_state state)
			    enum ethtool_phys_id_state state)
{
{
@@ -1586,6 +1595,7 @@ static const struct ethtool_ops qede_ethtool_ops = {
	.get_rxfh_key_size = qede_get_rxfh_key_size,
	.get_rxfh_key_size = qede_get_rxfh_key_size,
	.get_rxfh = qede_get_rxfh,
	.get_rxfh = qede_get_rxfh,
	.set_rxfh = qede_set_rxfh,
	.set_rxfh = qede_set_rxfh,
	.get_ts_info = qede_get_ts_info,
	.get_channels = qede_get_channels,
	.get_channels = qede_get_channels,
	.set_channels = qede_set_channels,
	.set_channels = qede_set_channels,
	.self_test = qede_self_test,
	.self_test = qede_self_test,
+5 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,7 @@
#include <linux/if_ether.h>
#include <linux/if_ether.h>
#include <linux/if_vlan.h>
#include <linux/if_vlan.h>
#include <net/ip6_checksum.h>
#include <net/ip6_checksum.h>
#include "qede_ptp.h"


#include <linux/qed/qed_if.h>
#include <linux/qed/qed_if.h>
#include "qede.h"
#include "qede.h"
@@ -1277,6 +1278,7 @@ static int qede_rx_process_cqe(struct qede_dev *edev,
	qede_get_rxhash(skb, fp_cqe->bitfields, fp_cqe->rss_hash);
	qede_get_rxhash(skb, fp_cqe->bitfields, fp_cqe->rss_hash);
	qede_set_skb_csum(skb, csum_flag);
	qede_set_skb_csum(skb, csum_flag);
	skb_record_rx_queue(skb, rxq->rxq_id);
	skb_record_rx_queue(skb, rxq->rxq_id);
	qede_ptp_record_rx_ts(edev, cqe, skb);


	/* SKB is prepared - pass it to stack */
	/* SKB is prepared - pass it to stack */
	qede_skb_receive(edev, fp, rxq, skb, le16_to_cpu(fp_cqe->vlan_tag));
	qede_skb_receive(edev, fp, rxq, skb, le16_to_cpu(fp_cqe->vlan_tag));
@@ -1451,6 +1453,9 @@ netdev_tx_t qede_start_xmit(struct sk_buff *skb, struct net_device *ndev)
	first_bd->data.bd_flags.bitfields =
	first_bd->data.bd_flags.bitfields =
		1 << ETH_TX_1ST_BD_FLAGS_START_BD_SHIFT;
		1 << ETH_TX_1ST_BD_FLAGS_START_BD_SHIFT;


	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
		qede_ptp_tx_ts(edev, skb);

	/* Map skb linear data for DMA and set in the first BD */
	/* Map skb linear data for DMA and set in the first BD */
	mapping = dma_map_single(txq->dev, skb->data,
	mapping = dma_map_single(txq->dev, skb->data,
				 skb_headlen(skb), DMA_TO_DEVICE);
				 skb_headlen(skb), DMA_TO_DEVICE);
Loading