162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright(c) 2017 - 2019 Pensando Systems, Inc */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _IONIC_LIF_H_
562306a36Sopenharmony_ci#define _IONIC_LIF_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/ptp_clock_kernel.h>
862306a36Sopenharmony_ci#include <linux/timecounter.h>
962306a36Sopenharmony_ci#include <uapi/linux/net_tstamp.h>
1062306a36Sopenharmony_ci#include <linux/dim.h>
1162306a36Sopenharmony_ci#include <linux/pci.h>
1262306a36Sopenharmony_ci#include "ionic_rx_filter.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define IONIC_ADMINQ_LENGTH	16	/* must be a power of two */
1562306a36Sopenharmony_ci#define IONIC_NOTIFYQ_LENGTH	64	/* must be a power of two */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define ADD_ADDR	true
1862306a36Sopenharmony_ci#define DEL_ADDR	false
1962306a36Sopenharmony_ci#define CAN_SLEEP	true
2062306a36Sopenharmony_ci#define CAN_NOT_SLEEP	false
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define IONIC_RX_COPYBREAK_DEFAULT	256
2362306a36Sopenharmony_ci#define IONIC_TX_BUDGET_DEFAULT		256
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct ionic_tx_stats {
2662306a36Sopenharmony_ci	u64 pkts;
2762306a36Sopenharmony_ci	u64 bytes;
2862306a36Sopenharmony_ci	u64 csum_none;
2962306a36Sopenharmony_ci	u64 csum;
3062306a36Sopenharmony_ci	u64 tso;
3162306a36Sopenharmony_ci	u64 tso_bytes;
3262306a36Sopenharmony_ci	u64 frags;
3362306a36Sopenharmony_ci	u64 vlan_inserted;
3462306a36Sopenharmony_ci	u64 clean;
3562306a36Sopenharmony_ci	u64 linearize;
3662306a36Sopenharmony_ci	u64 crc32_csum;
3762306a36Sopenharmony_ci	u64 dma_map_err;
3862306a36Sopenharmony_ci	u64 hwstamp_valid;
3962306a36Sopenharmony_ci	u64 hwstamp_invalid;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct ionic_rx_stats {
4362306a36Sopenharmony_ci	u64 pkts;
4462306a36Sopenharmony_ci	u64 bytes;
4562306a36Sopenharmony_ci	u64 csum_none;
4662306a36Sopenharmony_ci	u64 csum_complete;
4762306a36Sopenharmony_ci	u64 dropped;
4862306a36Sopenharmony_ci	u64 vlan_stripped;
4962306a36Sopenharmony_ci	u64 csum_error;
5062306a36Sopenharmony_ci	u64 dma_map_err;
5162306a36Sopenharmony_ci	u64 alloc_err;
5262306a36Sopenharmony_ci	u64 hwstamp_valid;
5362306a36Sopenharmony_ci	u64 hwstamp_invalid;
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define IONIC_QCQ_F_INITED		BIT(0)
5762306a36Sopenharmony_ci#define IONIC_QCQ_F_SG			BIT(1)
5862306a36Sopenharmony_ci#define IONIC_QCQ_F_INTR		BIT(2)
5962306a36Sopenharmony_ci#define IONIC_QCQ_F_TX_STATS		BIT(3)
6062306a36Sopenharmony_ci#define IONIC_QCQ_F_RX_STATS		BIT(4)
6162306a36Sopenharmony_ci#define IONIC_QCQ_F_NOTIFYQ		BIT(5)
6262306a36Sopenharmony_ci#define IONIC_QCQ_F_CMB_RINGS		BIT(6)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct ionic_qcq {
6562306a36Sopenharmony_ci	void *q_base;
6662306a36Sopenharmony_ci	dma_addr_t q_base_pa;
6762306a36Sopenharmony_ci	u32 q_size;
6862306a36Sopenharmony_ci	void *cq_base;
6962306a36Sopenharmony_ci	dma_addr_t cq_base_pa;
7062306a36Sopenharmony_ci	u32 cq_size;
7162306a36Sopenharmony_ci	void *sg_base;
7262306a36Sopenharmony_ci	dma_addr_t sg_base_pa;
7362306a36Sopenharmony_ci	u32 sg_size;
7462306a36Sopenharmony_ci	void __iomem *cmb_q_base;
7562306a36Sopenharmony_ci	phys_addr_t cmb_q_base_pa;
7662306a36Sopenharmony_ci	u32 cmb_q_size;
7762306a36Sopenharmony_ci	u32 cmb_pgid;
7862306a36Sopenharmony_ci	u32 cmb_order;
7962306a36Sopenharmony_ci	struct dim dim;
8062306a36Sopenharmony_ci	struct ionic_queue q;
8162306a36Sopenharmony_ci	struct ionic_cq cq;
8262306a36Sopenharmony_ci	struct ionic_intr_info intr;
8362306a36Sopenharmony_ci	struct timer_list napi_deadline;
8462306a36Sopenharmony_ci	struct napi_struct napi;
8562306a36Sopenharmony_ci	unsigned int flags;
8662306a36Sopenharmony_ci	struct ionic_qcq *napi_qcq;
8762306a36Sopenharmony_ci	struct dentry *dentry;
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci#define q_to_qcq(q)		container_of(q, struct ionic_qcq, q)
9162306a36Sopenharmony_ci#define q_to_tx_stats(q)	(&(q)->lif->txqstats[(q)->index])
9262306a36Sopenharmony_ci#define q_to_rx_stats(q)	(&(q)->lif->rxqstats[(q)->index])
9362306a36Sopenharmony_ci#define napi_to_qcq(napi)	container_of(napi, struct ionic_qcq, napi)
9462306a36Sopenharmony_ci#define napi_to_cq(napi)	(&napi_to_qcq(napi)->cq)
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cienum ionic_deferred_work_type {
9762306a36Sopenharmony_ci	IONIC_DW_TYPE_RX_MODE,
9862306a36Sopenharmony_ci	IONIC_DW_TYPE_LINK_STATUS,
9962306a36Sopenharmony_ci	IONIC_DW_TYPE_LIF_RESET,
10062306a36Sopenharmony_ci};
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistruct ionic_deferred_work {
10362306a36Sopenharmony_ci	struct list_head list;
10462306a36Sopenharmony_ci	enum ionic_deferred_work_type type;
10562306a36Sopenharmony_ci	union {
10662306a36Sopenharmony_ci		u8 addr[ETH_ALEN];
10762306a36Sopenharmony_ci		u8 fw_status;
10862306a36Sopenharmony_ci	};
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct ionic_deferred {
11262306a36Sopenharmony_ci	spinlock_t lock;		/* lock for deferred work list */
11362306a36Sopenharmony_ci	struct list_head list;
11462306a36Sopenharmony_ci	struct work_struct work;
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistruct ionic_lif_sw_stats {
11862306a36Sopenharmony_ci	u64 tx_packets;
11962306a36Sopenharmony_ci	u64 tx_bytes;
12062306a36Sopenharmony_ci	u64 rx_packets;
12162306a36Sopenharmony_ci	u64 rx_bytes;
12262306a36Sopenharmony_ci	u64 tx_tso;
12362306a36Sopenharmony_ci	u64 tx_tso_bytes;
12462306a36Sopenharmony_ci	u64 tx_csum_none;
12562306a36Sopenharmony_ci	u64 tx_csum;
12662306a36Sopenharmony_ci	u64 rx_csum_none;
12762306a36Sopenharmony_ci	u64 rx_csum_complete;
12862306a36Sopenharmony_ci	u64 rx_csum_error;
12962306a36Sopenharmony_ci	u64 tx_hwstamp_valid;
13062306a36Sopenharmony_ci	u64 tx_hwstamp_invalid;
13162306a36Sopenharmony_ci	u64 rx_hwstamp_valid;
13262306a36Sopenharmony_ci	u64 rx_hwstamp_invalid;
13362306a36Sopenharmony_ci	u64 hw_tx_dropped;
13462306a36Sopenharmony_ci	u64 hw_rx_dropped;
13562306a36Sopenharmony_ci	u64 hw_rx_over_errors;
13662306a36Sopenharmony_ci	u64 hw_rx_missed_errors;
13762306a36Sopenharmony_ci	u64 hw_tx_aborted_errors;
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cienum ionic_lif_state_flags {
14162306a36Sopenharmony_ci	IONIC_LIF_F_INITED,
14262306a36Sopenharmony_ci	IONIC_LIF_F_UP,
14362306a36Sopenharmony_ci	IONIC_LIF_F_LINK_CHECK_REQUESTED,
14462306a36Sopenharmony_ci	IONIC_LIF_F_FILTER_SYNC_NEEDED,
14562306a36Sopenharmony_ci	IONIC_LIF_F_FW_RESET,
14662306a36Sopenharmony_ci	IONIC_LIF_F_FW_STOPPING,
14762306a36Sopenharmony_ci	IONIC_LIF_F_SPLIT_INTR,
14862306a36Sopenharmony_ci	IONIC_LIF_F_BROKEN,
14962306a36Sopenharmony_ci	IONIC_LIF_F_TX_DIM_INTR,
15062306a36Sopenharmony_ci	IONIC_LIF_F_RX_DIM_INTR,
15162306a36Sopenharmony_ci	IONIC_LIF_F_CMB_TX_RINGS,
15262306a36Sopenharmony_ci	IONIC_LIF_F_CMB_RX_RINGS,
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	/* leave this as last */
15562306a36Sopenharmony_ci	IONIC_LIF_F_STATE_SIZE
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cistruct ionic_qtype_info {
15962306a36Sopenharmony_ci	u8  version;
16062306a36Sopenharmony_ci	u8  supported;
16162306a36Sopenharmony_ci	u64 features;
16262306a36Sopenharmony_ci	u16 desc_sz;
16362306a36Sopenharmony_ci	u16 comp_sz;
16462306a36Sopenharmony_ci	u16 sg_desc_sz;
16562306a36Sopenharmony_ci	u16 max_sg_elems;
16662306a36Sopenharmony_ci	u16 sg_desc_stride;
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistruct ionic_phc;
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci#define IONIC_LIF_NAME_MAX_SZ		32
17262306a36Sopenharmony_cistruct ionic_lif {
17362306a36Sopenharmony_ci	struct net_device *netdev;
17462306a36Sopenharmony_ci	DECLARE_BITMAP(state, IONIC_LIF_F_STATE_SIZE);
17562306a36Sopenharmony_ci	struct ionic *ionic;
17662306a36Sopenharmony_ci	unsigned int index;
17762306a36Sopenharmony_ci	unsigned int hw_index;
17862306a36Sopenharmony_ci	struct mutex queue_lock;	/* lock for queue structures */
17962306a36Sopenharmony_ci	struct mutex config_lock;	/* lock for config actions */
18062306a36Sopenharmony_ci	spinlock_t adminq_lock;		/* lock for AdminQ operations */
18162306a36Sopenharmony_ci	struct ionic_qcq *adminqcq;
18262306a36Sopenharmony_ci	struct ionic_qcq *notifyqcq;
18362306a36Sopenharmony_ci	struct ionic_qcq **txqcqs;
18462306a36Sopenharmony_ci	struct ionic_qcq *hwstamp_txq;
18562306a36Sopenharmony_ci	struct ionic_tx_stats *txqstats;
18662306a36Sopenharmony_ci	struct ionic_qcq **rxqcqs;
18762306a36Sopenharmony_ci	struct ionic_qcq *hwstamp_rxq;
18862306a36Sopenharmony_ci	struct ionic_rx_stats *rxqstats;
18962306a36Sopenharmony_ci	struct ionic_deferred deferred;
19062306a36Sopenharmony_ci	struct work_struct tx_timeout_work;
19162306a36Sopenharmony_ci	u64 last_eid;
19262306a36Sopenharmony_ci	unsigned int kern_pid;
19362306a36Sopenharmony_ci	u64 __iomem *kern_dbpage;
19462306a36Sopenharmony_ci	unsigned int neqs;
19562306a36Sopenharmony_ci	unsigned int nxqs;
19662306a36Sopenharmony_ci	unsigned int ntxq_descs;
19762306a36Sopenharmony_ci	unsigned int nrxq_descs;
19862306a36Sopenharmony_ci	u32 rx_copybreak;
19962306a36Sopenharmony_ci	u64 rxq_features;
20062306a36Sopenharmony_ci	u16 rx_mode;
20162306a36Sopenharmony_ci	u64 hw_features;
20262306a36Sopenharmony_ci	bool registered;
20362306a36Sopenharmony_ci	u16 lif_type;
20462306a36Sopenharmony_ci	unsigned int link_down_count;
20562306a36Sopenharmony_ci	unsigned int nmcast;
20662306a36Sopenharmony_ci	unsigned int nucast;
20762306a36Sopenharmony_ci	unsigned int nvlans;
20862306a36Sopenharmony_ci	unsigned int max_vlans;
20962306a36Sopenharmony_ci	char name[IONIC_LIF_NAME_MAX_SZ];
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	union ionic_lif_identity *identity;
21262306a36Sopenharmony_ci	struct ionic_lif_info *info;
21362306a36Sopenharmony_ci	dma_addr_t info_pa;
21462306a36Sopenharmony_ci	u32 info_sz;
21562306a36Sopenharmony_ci	struct ionic_qtype_info qtype_info[IONIC_QTYPE_MAX];
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	u16 rss_types;
21862306a36Sopenharmony_ci	u8 rss_hash_key[IONIC_RSS_HASH_KEY_SIZE];
21962306a36Sopenharmony_ci	u8 *rss_ind_tbl;
22062306a36Sopenharmony_ci	dma_addr_t rss_ind_tbl_pa;
22162306a36Sopenharmony_ci	u32 rss_ind_tbl_sz;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	struct ionic_rx_filters rx_filters;
22462306a36Sopenharmony_ci	u32 rx_coalesce_usecs;		/* what the user asked for */
22562306a36Sopenharmony_ci	u32 rx_coalesce_hw;		/* what the hw is using */
22662306a36Sopenharmony_ci	u32 tx_coalesce_usecs;		/* what the user asked for */
22762306a36Sopenharmony_ci	u32 tx_coalesce_hw;		/* what the hw is using */
22862306a36Sopenharmony_ci	unsigned int dbid_count;
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	struct ionic_phc *phc;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	struct dentry *dentry;
23362306a36Sopenharmony_ci};
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_cistruct ionic_phc {
23662306a36Sopenharmony_ci	spinlock_t lock; /* lock for cc and tc */
23762306a36Sopenharmony_ci	struct cyclecounter cc;
23862306a36Sopenharmony_ci	struct timecounter tc;
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	struct mutex config_lock; /* lock for ts_config */
24162306a36Sopenharmony_ci	struct hwtstamp_config ts_config;
24262306a36Sopenharmony_ci	u64 ts_config_rx_filt;
24362306a36Sopenharmony_ci	u32 ts_config_tx_mode;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	u32 init_cc_mult;
24662306a36Sopenharmony_ci	long aux_work_delay;
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	struct ptp_clock_info ptp_info;
24962306a36Sopenharmony_ci	struct ptp_clock *ptp;
25062306a36Sopenharmony_ci	struct ionic_lif *lif;
25162306a36Sopenharmony_ci};
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistruct ionic_queue_params {
25462306a36Sopenharmony_ci	unsigned int nxqs;
25562306a36Sopenharmony_ci	unsigned int ntxq_descs;
25662306a36Sopenharmony_ci	unsigned int nrxq_descs;
25762306a36Sopenharmony_ci	u64 rxq_features;
25862306a36Sopenharmony_ci	bool intr_split;
25962306a36Sopenharmony_ci	bool cmb_tx;
26062306a36Sopenharmony_ci	bool cmb_rx;
26162306a36Sopenharmony_ci};
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_cistatic inline void ionic_init_queue_params(struct ionic_lif *lif,
26462306a36Sopenharmony_ci					   struct ionic_queue_params *qparam)
26562306a36Sopenharmony_ci{
26662306a36Sopenharmony_ci	qparam->nxqs = lif->nxqs;
26762306a36Sopenharmony_ci	qparam->ntxq_descs = lif->ntxq_descs;
26862306a36Sopenharmony_ci	qparam->nrxq_descs = lif->nrxq_descs;
26962306a36Sopenharmony_ci	qparam->rxq_features = lif->rxq_features;
27062306a36Sopenharmony_ci	qparam->intr_split = test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state);
27162306a36Sopenharmony_ci	qparam->cmb_tx = test_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state);
27262306a36Sopenharmony_ci	qparam->cmb_rx = test_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state);
27362306a36Sopenharmony_ci}
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_cistatic inline void ionic_set_queue_params(struct ionic_lif *lif,
27662306a36Sopenharmony_ci					  struct ionic_queue_params *qparam)
27762306a36Sopenharmony_ci{
27862306a36Sopenharmony_ci	lif->nxqs = qparam->nxqs;
27962306a36Sopenharmony_ci	lif->ntxq_descs = qparam->ntxq_descs;
28062306a36Sopenharmony_ci	lif->nrxq_descs = qparam->nrxq_descs;
28162306a36Sopenharmony_ci	lif->rxq_features = qparam->rxq_features;
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci	if (qparam->intr_split)
28462306a36Sopenharmony_ci		set_bit(IONIC_LIF_F_SPLIT_INTR, lif->state);
28562306a36Sopenharmony_ci	else
28662306a36Sopenharmony_ci		clear_bit(IONIC_LIF_F_SPLIT_INTR, lif->state);
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	if (qparam->cmb_tx)
28962306a36Sopenharmony_ci		set_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state);
29062306a36Sopenharmony_ci	else
29162306a36Sopenharmony_ci		clear_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state);
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci	if (qparam->cmb_rx)
29462306a36Sopenharmony_ci		set_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state);
29562306a36Sopenharmony_ci	else
29662306a36Sopenharmony_ci		clear_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state);
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_cistatic inline u32 ionic_coal_usec_to_hw(struct ionic *ionic, u32 usecs)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	u32 mult = le32_to_cpu(ionic->ident.dev.intr_coal_mult);
30262306a36Sopenharmony_ci	u32 div = le32_to_cpu(ionic->ident.dev.intr_coal_div);
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	/* Div-by-zero should never be an issue, but check anyway */
30562306a36Sopenharmony_ci	if (!div || !mult)
30662306a36Sopenharmony_ci		return 0;
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	/* Round up in case usecs is close to the next hw unit */
30962306a36Sopenharmony_ci	usecs += (div / mult) >> 1;
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	/* Convert from usecs to device units */
31262306a36Sopenharmony_ci	return (usecs * mult) / div;
31362306a36Sopenharmony_ci}
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_civoid ionic_link_status_check_request(struct ionic_lif *lif, bool can_sleep);
31662306a36Sopenharmony_civoid ionic_get_stats64(struct net_device *netdev,
31762306a36Sopenharmony_ci		       struct rtnl_link_stats64 *ns);
31862306a36Sopenharmony_civoid ionic_lif_deferred_enqueue(struct ionic_deferred *def,
31962306a36Sopenharmony_ci				struct ionic_deferred_work *work);
32062306a36Sopenharmony_ciint ionic_lif_alloc(struct ionic *ionic);
32162306a36Sopenharmony_ciint ionic_lif_init(struct ionic_lif *lif);
32262306a36Sopenharmony_civoid ionic_lif_free(struct ionic_lif *lif);
32362306a36Sopenharmony_civoid ionic_lif_deinit(struct ionic_lif *lif);
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ciint ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr);
32662306a36Sopenharmony_ciint ionic_lif_addr_del(struct ionic_lif *lif, const u8 *addr);
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_civoid ionic_stop_queues_reconfig(struct ionic_lif *lif);
32962306a36Sopenharmony_civoid ionic_txrx_free(struct ionic_lif *lif);
33062306a36Sopenharmony_civoid ionic_qcqs_free(struct ionic_lif *lif);
33162306a36Sopenharmony_ciint ionic_restart_lif(struct ionic_lif *lif);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ciint ionic_lif_register(struct ionic_lif *lif);
33462306a36Sopenharmony_civoid ionic_lif_unregister(struct ionic_lif *lif);
33562306a36Sopenharmony_ciint ionic_lif_identify(struct ionic *ionic, u8 lif_type,
33662306a36Sopenharmony_ci		       union ionic_lif_identity *lif_ident);
33762306a36Sopenharmony_ciint ionic_lif_size(struct ionic *ionic);
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_PTP_1588_CLOCK)
34062306a36Sopenharmony_civoid ionic_lif_hwstamp_replay(struct ionic_lif *lif);
34162306a36Sopenharmony_civoid ionic_lif_hwstamp_recreate_queues(struct ionic_lif *lif);
34262306a36Sopenharmony_ciint ionic_lif_hwstamp_set(struct ionic_lif *lif, struct ifreq *ifr);
34362306a36Sopenharmony_ciint ionic_lif_hwstamp_get(struct ionic_lif *lif, struct ifreq *ifr);
34462306a36Sopenharmony_ciktime_t ionic_lif_phc_ktime(struct ionic_lif *lif, u64 counter);
34562306a36Sopenharmony_civoid ionic_lif_register_phc(struct ionic_lif *lif);
34662306a36Sopenharmony_civoid ionic_lif_unregister_phc(struct ionic_lif *lif);
34762306a36Sopenharmony_civoid ionic_lif_alloc_phc(struct ionic_lif *lif);
34862306a36Sopenharmony_civoid ionic_lif_free_phc(struct ionic_lif *lif);
34962306a36Sopenharmony_ci#else
35062306a36Sopenharmony_cistatic inline void ionic_lif_hwstamp_replay(struct ionic_lif *lif) {}
35162306a36Sopenharmony_cistatic inline void ionic_lif_hwstamp_recreate_queues(struct ionic_lif *lif) {}
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_cistatic inline int ionic_lif_hwstamp_set(struct ionic_lif *lif, struct ifreq *ifr)
35462306a36Sopenharmony_ci{
35562306a36Sopenharmony_ci	return -EOPNOTSUPP;
35662306a36Sopenharmony_ci}
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_cistatic inline int ionic_lif_hwstamp_get(struct ionic_lif *lif, struct ifreq *ifr)
35962306a36Sopenharmony_ci{
36062306a36Sopenharmony_ci	return -EOPNOTSUPP;
36162306a36Sopenharmony_ci}
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_cistatic inline ktime_t ionic_lif_phc_ktime(struct ionic_lif *lif, u64 counter)
36462306a36Sopenharmony_ci{
36562306a36Sopenharmony_ci	return ns_to_ktime(0);
36662306a36Sopenharmony_ci}
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_cistatic inline void ionic_lif_register_phc(struct ionic_lif *lif) {}
36962306a36Sopenharmony_cistatic inline void ionic_lif_unregister_phc(struct ionic_lif *lif) {}
37062306a36Sopenharmony_cistatic inline void ionic_lif_alloc_phc(struct ionic_lif *lif) {}
37162306a36Sopenharmony_cistatic inline void ionic_lif_free_phc(struct ionic_lif *lif) {}
37262306a36Sopenharmony_ci#endif
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ciint ionic_lif_create_hwstamp_txq(struct ionic_lif *lif);
37562306a36Sopenharmony_ciint ionic_lif_create_hwstamp_rxq(struct ionic_lif *lif);
37662306a36Sopenharmony_ciint ionic_lif_config_hwstamp_rxq_all(struct ionic_lif *lif, bool rx_all);
37762306a36Sopenharmony_ciint ionic_lif_set_hwstamp_txmode(struct ionic_lif *lif, u16 txstamp_mode);
37862306a36Sopenharmony_ciint ionic_lif_set_hwstamp_rxfilt(struct ionic_lif *lif, u64 pkt_class);
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ciint ionic_lif_rss_config(struct ionic_lif *lif, u16 types,
38162306a36Sopenharmony_ci			 const u8 *key, const u32 *indir);
38262306a36Sopenharmony_civoid ionic_lif_rx_mode(struct ionic_lif *lif);
38362306a36Sopenharmony_ciint ionic_reconfigure_queues(struct ionic_lif *lif,
38462306a36Sopenharmony_ci			     struct ionic_queue_params *qparam);
38562306a36Sopenharmony_ci#endif /* _IONIC_LIF_H_ */
386