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