ionic: link in the new hw timestamp code
authorShannon Nelson <snelson@pensando.io>
Thu, 1 Apr 2021 17:56:04 +0000 (10:56 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 2 Apr 2021 21:18:32 +0000 (14:18 -0700)
These are changes to compile and link the new code, but no
new feature support is available or advertised yet.

Signed-off-by: Allen Hubbe <allenbh@pensando.io>
Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/Makefile
drivers/net/ethernet/pensando/ionic/ionic.h
drivers/net/ethernet/pensando/ionic/ionic_dev.c
drivers/net/ethernet/pensando/ionic/ionic_dev.h
drivers/net/ethernet/pensando/ionic/ionic_lif.c
drivers/net/ethernet/pensando/ionic/ionic_lif.h
drivers/net/ethernet/pensando/ionic/ionic_main.c

index 8d3c2d3..4e7642a 100644 (file)
@@ -6,3 +6,4 @@ obj-$(CONFIG_IONIC) := ionic.o
 ionic-y := ionic_main.o ionic_bus_pci.o ionic_devlink.o ionic_dev.o \
           ionic_debugfs.o ionic_lif.o ionic_rx_filter.o ionic_ethtool.o \
           ionic_txrx.o ionic_stats.o ionic_fw.o
+ionic-$(CONFIG_PTP_1588_CLOCK) += ionic_phc.o
index 18e9210..6620410 100644 (file)
@@ -20,6 +20,10 @@ struct ionic_lif;
 
 #define DEVCMD_TIMEOUT  10
 
+#define IONIC_PHC_UPDATE_NS    10000000000         /* 10s in nanoseconds */
+#define NORMAL_PPB             1000000000          /* one billion parts per billion */
+#define SCALED_PPM             (1000000ull << 16)  /* 2^16 million parts per 2^16 million */
+
 struct ionic_vf {
        u16      index;
        u8       macaddr[6];
index 0e8e88c..1dfe962 100644 (file)
@@ -79,6 +79,8 @@ int ionic_dev_setup(struct ionic *ionic)
        idev->intr_status = bar->vaddr + IONIC_BAR0_INTR_STATUS_OFFSET;
        idev->intr_ctrl = bar->vaddr + IONIC_BAR0_INTR_CTRL_OFFSET;
 
+       idev->hwstamp_regs = &idev->dev_info_regs->hwstamp;
+
        sig = ioread32(&idev->dev_info_regs->signature);
        if (sig != IONIC_DEV_INFO_SIGNATURE) {
                dev_err(dev, "Incompatible firmware signature %x", sig);
index 25c52c0..28994e0 100644 (file)
@@ -136,6 +136,7 @@ struct ionic_devinfo {
 struct ionic_dev {
        union ionic_dev_info_regs __iomem *dev_info_regs;
        union ionic_dev_cmd_regs __iomem *dev_cmd_regs;
+       struct ionic_hwstamp_regs __iomem *hwstamp_regs;
 
        atomic_long_t last_check_time;
        unsigned long last_hb_time;
index 9a61b2b..ced80de 100644 (file)
@@ -830,6 +830,31 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
        return 0;
 }
 
+int ionic_lif_create_hwstamp_txq(struct ionic_lif *lif)
+{
+       return 0;
+}
+
+int ionic_lif_create_hwstamp_rxq(struct ionic_lif *lif)
+{
+       return 0;
+}
+
+int ionic_lif_config_hwstamp_rxq_all(struct ionic_lif *lif, bool rx_all)
+{
+       return 0;
+}
+
+int ionic_lif_set_hwstamp_txmode(struct ionic_lif *lif, u16 txstamp_mode)
+{
+       return 0;
+}
+
+int ionic_lif_set_hwstamp_rxfilt(struct ionic_lif *lif, u64 pkt_class)
+{
+       return 0;
+}
+
 static bool ionic_notifyq_service(struct ionic_cq *cq,
                                  struct ionic_cq_info *cq_info)
 {
index 93d3058..ea3b086 100644 (file)
@@ -4,6 +4,9 @@
 #ifndef _IONIC_LIF_H_
 #define _IONIC_LIF_H_
 
+#include <linux/ptp_clock_kernel.h>
+#include <linux/timecounter.h>
+#include <uapi/linux/net_tstamp.h>
 #include <linux/dim.h>
 #include <linux/pci.h>
 #include "ionic_rx_filter.h"
@@ -36,6 +39,8 @@ struct ionic_tx_stats {
        u64 crc32_csum;
        u64 sg_cntr[IONIC_MAX_NUM_SG_CNTR];
        u64 dma_map_err;
+       u64 hwstamp_valid;
+       u64 hwstamp_invalid;
 };
 
 struct ionic_rx_stats {
@@ -49,6 +54,8 @@ struct ionic_rx_stats {
        u64 csum_error;
        u64 dma_map_err;
        u64 alloc_err;
+       u64 hwstamp_valid;
+       u64 hwstamp_invalid;
 };
 
 #define IONIC_QCQ_F_INITED             BIT(0)
@@ -125,6 +132,10 @@ struct ionic_lif_sw_stats {
        u64 rx_csum_none;
        u64 rx_csum_complete;
        u64 rx_csum_error;
+       u64 tx_hwstamp_valid;
+       u64 tx_hwstamp_invalid;
+       u64 rx_hwstamp_valid;
+       u64 rx_hwstamp_invalid;
        u64 hw_tx_dropped;
        u64 hw_rx_dropped;
        u64 hw_rx_over_errors;
@@ -158,6 +169,8 @@ struct ionic_qtype_info {
        u16 sg_desc_stride;
 };
 
+struct ionic_phc;
+
 #define IONIC_LIF_NAME_MAX_SZ          32
 struct ionic_lif {
        struct net_device *netdev;
@@ -170,8 +183,10 @@ struct ionic_lif {
        struct ionic_qcq *adminqcq;
        struct ionic_qcq *notifyqcq;
        struct ionic_qcq **txqcqs;
+       struct ionic_qcq *hwstamp_txq;
        struct ionic_tx_stats *txqstats;
        struct ionic_qcq **rxqcqs;
+       struct ionic_qcq *hwstamp_rxq;
        struct ionic_rx_stats *rxqstats;
        struct ionic_deferred deferred;
        struct work_struct tx_timeout_work;
@@ -214,9 +229,29 @@ struct ionic_lif {
        unsigned long *dbid_inuse;
        unsigned int dbid_count;
 
+       struct ionic_phc *phc;
+
        struct dentry *dentry;
 };
 
+struct ionic_phc {
+       spinlock_t lock; /* lock for cc and tc */
+       struct cyclecounter cc;
+       struct timecounter tc;
+
+       struct mutex config_lock; /* lock for ts_config */
+       struct hwtstamp_config ts_config;
+       u64 ts_config_rx_filt;
+       u32 ts_config_tx_mode;
+
+       u32 init_cc_mult;
+       long aux_work_delay;
+
+       struct ptp_clock_info ptp_info;
+       struct ptp_clock *ptp;
+       struct ionic_lif *lif;
+};
+
 struct ionic_queue_params {
        unsigned int nxqs;
        unsigned int ntxq_descs;
@@ -265,6 +300,43 @@ void ionic_lif_unregister(struct ionic_lif *lif);
 int ionic_lif_identify(struct ionic *ionic, u8 lif_type,
                       union ionic_lif_identity *lif_ident);
 int ionic_lif_size(struct ionic *ionic);
+
+#if IS_ENABLED(CONFIG_PTP_1588_CLOCK)
+int ionic_lif_hwstamp_set(struct ionic_lif *lif, struct ifreq *ifr);
+int ionic_lif_hwstamp_get(struct ionic_lif *lif, struct ifreq *ifr);
+ktime_t ionic_lif_phc_ktime(struct ionic_lif *lif, u64 counter);
+void ionic_lif_register_phc(struct ionic_lif *lif);
+void ionic_lif_unregister_phc(struct ionic_lif *lif);
+void ionic_lif_alloc_phc(struct ionic_lif *lif);
+void ionic_lif_free_phc(struct ionic_lif *lif);
+#else
+static inline int ionic_lif_hwstamp_set(struct ionic_lif *lif, struct ifreq *ifr)
+{
+       return -EOPNOTSUPP;
+}
+
+static inline int ionic_lif_hwstamp_get(struct ionic_lif *lif, struct ifreq *ifr)
+{
+       return -EOPNOTSUPP;
+}
+
+static inline ktime_t ionic_lif_phc_ktime(struct ionic_lif *lif, u64 counter)
+{
+       return ns_to_ktime(0);
+}
+
+static inline void ionic_lif_register_phc(struct ionic_lif *lif) {}
+static inline void ionic_lif_unregister_phc(struct ionic_lif *lif) {}
+static inline void ionic_lif_alloc_phc(struct ionic_lif *lif) {}
+static inline void ionic_lif_free_phc(struct ionic_lif *lif) {}
+#endif
+
+int ionic_lif_create_hwstamp_txq(struct ionic_lif *lif);
+int ionic_lif_create_hwstamp_rxq(struct ionic_lif *lif);
+int ionic_lif_config_hwstamp_rxq_all(struct ionic_lif *lif, bool rx_all);
+int ionic_lif_set_hwstamp_txmode(struct ionic_lif *lif, u16 txstamp_mode);
+int ionic_lif_set_hwstamp_rxfilt(struct ionic_lif *lif, u64 pkt_class);
+
 int ionic_lif_rss_config(struct ionic_lif *lif, u16 types,
                         const u8 *key, const u32 *indir);
 int ionic_reconfigure_queues(struct ionic_lif *lif,
index 8c27fbe..61cfe21 100644 (file)
@@ -148,6 +148,8 @@ static const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode)
                return "IONIC_CMD_LIF_SETATTR";
        case IONIC_CMD_LIF_GETATTR:
                return "IONIC_CMD_LIF_GETATTR";
+       case IONIC_CMD_LIF_SETPHC:
+               return "IONIC_CMD_LIF_SETPHC";
        case IONIC_CMD_RX_MODE_SET:
                return "IONIC_CMD_RX_MODE_SET";
        case IONIC_CMD_RX_FILTER_ADD: