Skip to content

Commit 4c55215

Browse files
Sudarsana Reddy Kallurudavem330
authored andcommitted
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: Sudarsana Reddy Kalluru <Sudarsana.Kalluru@cavium.com> Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent c78c70f commit 4c55215

File tree

8 files changed

+661
-1
lines changed

8 files changed

+661
-1
lines changed

drivers/net/ethernet/qlogic/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ config QED_SRIOV
104104
config QEDE
105105
tristate "QLogic QED 25/40/100Gb Ethernet NIC"
106106
depends on QED
107+
imply PTP_1588_CLOCK
107108
---help---
108109
This enables the support for ...
109110

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
obj-$(CONFIG_QEDE) := qede.o
22

3-
qede-y := qede_main.o qede_fp.o qede_filter.o qede_ethtool.o
3+
qede-y := qede_main.o qede_fp.o qede_filter.o qede_ethtool.o qede_ptp.o
44
qede-$(CONFIG_DCB) += qede_dcbnl.o
55
qede-$(CONFIG_QED_RDMA) += qede_roce.o

drivers/net/ethernet/qlogic/qede/qede.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ struct qede_rdma_dev {
137137
struct workqueue_struct *roce_wq;
138138
};
139139

140+
struct qede_ptp;
141+
140142
struct qede_dev {
141143
struct qed_dev *cdev;
142144
struct net_device *ndev;
@@ -148,8 +150,10 @@ struct qede_dev {
148150
u32 flags;
149151
#define QEDE_FLAG_IS_VF BIT(0)
150152
#define IS_VF(edev) (!!((edev)->flags & QEDE_FLAG_IS_VF))
153+
#define QEDE_TX_TIMESTAMPING_EN BIT(1)
151154

152155
const struct qed_eth_ops *ops;
156+
struct qede_ptp *ptp;
153157

154158
struct qed_dev_eth_info dev_info;
155159
#define QEDE_MAX_RSS_CNT(edev) ((edev)->dev_info.num_queues)

drivers/net/ethernet/qlogic/qede/qede_ethtool.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <linux/capability.h>
4040
#include <linux/vmalloc.h>
4141
#include "qede.h"
42+
#include "qede_ptp.h"
4243

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

944+
static int qede_get_ts_info(struct net_device *dev,
945+
struct ethtool_ts_info *info)
946+
{
947+
struct qede_dev *edev = netdev_priv(dev);
948+
949+
return qede_ptp_get_ts_info(edev, info);
950+
}
951+
943952
static int qede_set_phys_id(struct net_device *dev,
944953
enum ethtool_phys_id_state state)
945954
{
@@ -1586,6 +1595,7 @@ static const struct ethtool_ops qede_ethtool_ops = {
15861595
.get_rxfh_key_size = qede_get_rxfh_key_size,
15871596
.get_rxfh = qede_get_rxfh,
15881597
.set_rxfh = qede_set_rxfh,
1598+
.get_ts_info = qede_get_ts_info,
15891599
.get_channels = qede_get_channels,
15901600
.set_channels = qede_set_channels,
15911601
.self_test = qede_self_test,

drivers/net/ethernet/qlogic/qede/qede_fp.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <linux/if_ether.h>
4141
#include <linux/if_vlan.h>
4242
#include <net/ip6_checksum.h>
43+
#include "qede_ptp.h"
4344

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

12811283
/* SKB is prepared - pass it to stack */
12821284
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)
14511453
first_bd->data.bd_flags.bitfields =
14521454
1 << ETH_TX_1ST_BD_FLAGS_START_BD_SHIFT;
14531455

1456+
if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
1457+
qede_ptp_tx_ts(edev, skb);
1458+
14541459
/* Map skb linear data for DMA and set in the first BD */
14551460
mapping = dma_map_single(txq->dev, skb->data,
14561461
skb_headlen(skb), DMA_TO_DEVICE);

drivers/net/ethernet/qlogic/qede/qede_main.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#include <linux/vmalloc.h>
6363
#include <linux/qed/qede_roce.h>
6464
#include "qede.h"
65+
#include "qede_ptp.h"
6566

6667
static char version[] =
6768
"QLogic FastLinQ 4xxxx Ethernet Driver qede " DRV_MODULE_VERSION "\n";
@@ -484,6 +485,25 @@ static int qede_set_vf_trust(struct net_device *dev, int vfidx, bool setting)
484485
}
485486
#endif
486487

488+
static int qede_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
489+
{
490+
struct qede_dev *edev = netdev_priv(dev);
491+
492+
if (!netif_running(dev))
493+
return -EAGAIN;
494+
495+
switch (cmd) {
496+
case SIOCSHWTSTAMP:
497+
return qede_ptp_hw_ts(edev, ifr);
498+
default:
499+
DP_VERBOSE(edev, QED_MSG_DEBUG,
500+
"default IOCTL cmd 0x%x\n", cmd);
501+
return -EOPNOTSUPP;
502+
}
503+
504+
return 0;
505+
}
506+
487507
static const struct net_device_ops qede_netdev_ops = {
488508
.ndo_open = qede_open,
489509
.ndo_stop = qede_close,
@@ -492,6 +512,7 @@ static const struct net_device_ops qede_netdev_ops = {
492512
.ndo_set_mac_address = qede_set_mac_addr,
493513
.ndo_validate_addr = eth_validate_addr,
494514
.ndo_change_mtu = qede_change_mtu,
515+
.ndo_do_ioctl = qede_ioctl,
495516
#ifdef CONFIG_QED_SRIOV
496517
.ndo_set_vf_mac = qede_set_vf_mac,
497518
.ndo_set_vf_vlan = qede_set_vf_vlan,
@@ -841,6 +862,15 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
841862

842863
edev->ops->common->set_id(cdev, edev->ndev->name, DRV_MODULE_VERSION);
843864

865+
/* PTP not supported on VFs */
866+
if (!is_vf) {
867+
rc = qede_ptp_register_phc(edev);
868+
if (rc) {
869+
DP_NOTICE(edev, "Cannot register PHC\n");
870+
goto err5;
871+
}
872+
}
873+
844874
edev->ops->register_ops(cdev, &qede_ll_ops, edev);
845875

846876
#ifdef CONFIG_DCB
@@ -856,6 +886,8 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
856886

857887
return 0;
858888

889+
err5:
890+
unregister_netdev(edev->ndev);
859891
err4:
860892
qede_roce_dev_remove(edev);
861893
err3:
@@ -907,6 +939,8 @@ static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode)
907939

908940
unregister_netdev(ndev);
909941

942+
qede_ptp_remove(edev);
943+
910944
qede_roce_dev_remove(edev);
911945

912946
edev->ops->common->set_power_state(cdev, PCI_D0);
@@ -1660,6 +1694,7 @@ static int qede_start_queues(struct qede_dev *edev, bool clear_stats)
16601694
if (!vport_update_params)
16611695
return -ENOMEM;
16621696

1697+
start.handle_ptp_pkts = !!(edev->ptp);
16631698
start.gro_enable = !edev->gro_disable;
16641699
start.mtu = edev->ndev->mtu;
16651700
start.vport_id = 0;
@@ -1781,6 +1816,8 @@ static void qede_unload(struct qede_dev *edev, enum qede_unload_mode mode,
17811816
qede_roce_dev_event_close(edev);
17821817
edev->state = QEDE_STATE_CLOSED;
17831818

1819+
qede_ptp_stop(edev);
1820+
17841821
/* Close OS Tx */
17851822
netif_tx_disable(edev->ndev);
17861823
netif_carrier_off(edev->ndev);
@@ -1882,6 +1919,8 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,
18821919
qede_roce_dev_event_open(edev);
18831920
qede_link_update(edev, &link_output);
18841921

1922+
qede_ptp_start(edev, (mode == QEDE_LOAD_NORMAL));
1923+
18851924
edev->state = QEDE_STATE_OPEN;
18861925

18871926
DP_INFO(edev, "Ending successfully qede load\n");

0 commit comments

Comments
 (0)