Commit 61db421d authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

ionic: link in the new hw timestamp code

These are changes to compile and link the new code, but no
new feature support is available or advertised yet.
Signed-off-by: default avatarAllen Hubbe <allenbh@pensando.io>
Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fee6efce
...@@ -6,3 +6,4 @@ obj-$(CONFIG_IONIC) := ionic.o ...@@ -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-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_debugfs.o ionic_lif.o ionic_rx_filter.o ionic_ethtool.o \
ionic_txrx.o ionic_stats.o ionic_fw.o ionic_txrx.o ionic_stats.o ionic_fw.o
ionic-$(CONFIG_PTP_1588_CLOCK) += ionic_phc.o
...@@ -20,6 +20,10 @@ struct ionic_lif; ...@@ -20,6 +20,10 @@ struct ionic_lif;
#define DEVCMD_TIMEOUT 10 #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 { struct ionic_vf {
u16 index; u16 index;
u8 macaddr[6]; u8 macaddr[6];
......
...@@ -79,6 +79,8 @@ int ionic_dev_setup(struct ionic *ionic) ...@@ -79,6 +79,8 @@ int ionic_dev_setup(struct ionic *ionic)
idev->intr_status = bar->vaddr + IONIC_BAR0_INTR_STATUS_OFFSET; idev->intr_status = bar->vaddr + IONIC_BAR0_INTR_STATUS_OFFSET;
idev->intr_ctrl = bar->vaddr + IONIC_BAR0_INTR_CTRL_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); sig = ioread32(&idev->dev_info_regs->signature);
if (sig != IONIC_DEV_INFO_SIGNATURE) { if (sig != IONIC_DEV_INFO_SIGNATURE) {
dev_err(dev, "Incompatible firmware signature %x", sig); dev_err(dev, "Incompatible firmware signature %x", sig);
......
...@@ -136,6 +136,7 @@ struct ionic_devinfo { ...@@ -136,6 +136,7 @@ struct ionic_devinfo {
struct ionic_dev { struct ionic_dev {
union ionic_dev_info_regs __iomem *dev_info_regs; union ionic_dev_info_regs __iomem *dev_info_regs;
union ionic_dev_cmd_regs __iomem *dev_cmd_regs; union ionic_dev_cmd_regs __iomem *dev_cmd_regs;
struct ionic_hwstamp_regs __iomem *hwstamp_regs;
atomic_long_t last_check_time; atomic_long_t last_check_time;
unsigned long last_hb_time; unsigned long last_hb_time;
......
...@@ -830,6 +830,31 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq) ...@@ -830,6 +830,31 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
return 0; 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, static bool ionic_notifyq_service(struct ionic_cq *cq,
struct ionic_cq_info *cq_info) struct ionic_cq_info *cq_info)
{ {
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
#ifndef _IONIC_LIF_H_ #ifndef _IONIC_LIF_H_
#define _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/dim.h>
#include <linux/pci.h> #include <linux/pci.h>
#include "ionic_rx_filter.h" #include "ionic_rx_filter.h"
...@@ -36,6 +39,8 @@ struct ionic_tx_stats { ...@@ -36,6 +39,8 @@ struct ionic_tx_stats {
u64 crc32_csum; u64 crc32_csum;
u64 sg_cntr[IONIC_MAX_NUM_SG_CNTR]; u64 sg_cntr[IONIC_MAX_NUM_SG_CNTR];
u64 dma_map_err; u64 dma_map_err;
u64 hwstamp_valid;
u64 hwstamp_invalid;
}; };
struct ionic_rx_stats { struct ionic_rx_stats {
...@@ -49,6 +54,8 @@ struct ionic_rx_stats { ...@@ -49,6 +54,8 @@ struct ionic_rx_stats {
u64 csum_error; u64 csum_error;
u64 dma_map_err; u64 dma_map_err;
u64 alloc_err; u64 alloc_err;
u64 hwstamp_valid;
u64 hwstamp_invalid;
}; };
#define IONIC_QCQ_F_INITED BIT(0) #define IONIC_QCQ_F_INITED BIT(0)
...@@ -125,6 +132,10 @@ struct ionic_lif_sw_stats { ...@@ -125,6 +132,10 @@ struct ionic_lif_sw_stats {
u64 rx_csum_none; u64 rx_csum_none;
u64 rx_csum_complete; u64 rx_csum_complete;
u64 rx_csum_error; 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_tx_dropped;
u64 hw_rx_dropped; u64 hw_rx_dropped;
u64 hw_rx_over_errors; u64 hw_rx_over_errors;
...@@ -158,6 +169,8 @@ struct ionic_qtype_info { ...@@ -158,6 +169,8 @@ struct ionic_qtype_info {
u16 sg_desc_stride; u16 sg_desc_stride;
}; };
struct ionic_phc;
#define IONIC_LIF_NAME_MAX_SZ 32 #define IONIC_LIF_NAME_MAX_SZ 32
struct ionic_lif { struct ionic_lif {
struct net_device *netdev; struct net_device *netdev;
...@@ -170,8 +183,10 @@ struct ionic_lif { ...@@ -170,8 +183,10 @@ struct ionic_lif {
struct ionic_qcq *adminqcq; struct ionic_qcq *adminqcq;
struct ionic_qcq *notifyqcq; struct ionic_qcq *notifyqcq;
struct ionic_qcq **txqcqs; struct ionic_qcq **txqcqs;
struct ionic_qcq *hwstamp_txq;
struct ionic_tx_stats *txqstats; struct ionic_tx_stats *txqstats;
struct ionic_qcq **rxqcqs; struct ionic_qcq **rxqcqs;
struct ionic_qcq *hwstamp_rxq;
struct ionic_rx_stats *rxqstats; struct ionic_rx_stats *rxqstats;
struct ionic_deferred deferred; struct ionic_deferred deferred;
struct work_struct tx_timeout_work; struct work_struct tx_timeout_work;
...@@ -214,9 +229,29 @@ struct ionic_lif { ...@@ -214,9 +229,29 @@ struct ionic_lif {
unsigned long *dbid_inuse; unsigned long *dbid_inuse;
unsigned int dbid_count; unsigned int dbid_count;
struct ionic_phc *phc;
struct dentry *dentry; 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 { struct ionic_queue_params {
unsigned int nxqs; unsigned int nxqs;
unsigned int ntxq_descs; unsigned int ntxq_descs;
...@@ -265,6 +300,43 @@ void ionic_lif_unregister(struct ionic_lif *lif); ...@@ -265,6 +300,43 @@ void ionic_lif_unregister(struct ionic_lif *lif);
int ionic_lif_identify(struct ionic *ionic, u8 lif_type, int ionic_lif_identify(struct ionic *ionic, u8 lif_type,
union ionic_lif_identity *lif_ident); union ionic_lif_identity *lif_ident);
int ionic_lif_size(struct ionic *ionic); 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, int ionic_lif_rss_config(struct ionic_lif *lif, u16 types,
const u8 *key, const u32 *indir); const u8 *key, const u32 *indir);
int ionic_reconfigure_queues(struct ionic_lif *lif, int ionic_reconfigure_queues(struct ionic_lif *lif,
......
...@@ -148,6 +148,8 @@ static const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode) ...@@ -148,6 +148,8 @@ static const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode)
return "IONIC_CMD_LIF_SETATTR"; return "IONIC_CMD_LIF_SETATTR";
case IONIC_CMD_LIF_GETATTR: case IONIC_CMD_LIF_GETATTR:
return "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: case IONIC_CMD_RX_MODE_SET:
return "IONIC_CMD_RX_MODE_SET"; return "IONIC_CMD_RX_MODE_SET";
case IONIC_CMD_RX_FILTER_ADD: case IONIC_CMD_RX_FILTER_ADD:
......
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