162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* Atlantic Network Driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2014-2019 aQuantia Corporation 562306a36Sopenharmony_ci * Copyright (C) 2019-2020 Marvell International Ltd. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci/* File aq_ptp.h: Declaration of PTP functions. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#ifndef AQ_PTP_H 1162306a36Sopenharmony_ci#define AQ_PTP_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/net_tstamp.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "aq_ring.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define PTP_8TC_RING_IDX 8 1862306a36Sopenharmony_ci#define PTP_4TC_RING_IDX 16 1962306a36Sopenharmony_ci#define PTP_HWST_RING_IDX 31 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* Index must to be 8 (8 TCs) or 16 (4 TCs). 2262306a36Sopenharmony_ci * It depends from Traffic Class mode. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_cistatic inline unsigned int aq_ptp_ring_idx(const enum aq_tc_mode tc_mode) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci if (tc_mode == AQ_TC_MODE_8TCS) 2762306a36Sopenharmony_ci return PTP_8TC_RING_IDX; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci return PTP_4TC_RING_IDX; 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#if IS_REACHABLE(CONFIG_PTP_1588_CLOCK) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* Common functions */ 3562306a36Sopenharmony_ciint aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_civoid aq_ptp_unregister(struct aq_nic_s *aq_nic); 3862306a36Sopenharmony_civoid aq_ptp_free(struct aq_nic_s *aq_nic); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciint aq_ptp_irq_alloc(struct aq_nic_s *aq_nic); 4162306a36Sopenharmony_civoid aq_ptp_irq_free(struct aq_nic_s *aq_nic); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ciint aq_ptp_ring_alloc(struct aq_nic_s *aq_nic); 4462306a36Sopenharmony_civoid aq_ptp_ring_free(struct aq_nic_s *aq_nic); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ciint aq_ptp_ring_init(struct aq_nic_s *aq_nic); 4762306a36Sopenharmony_ciint aq_ptp_ring_start(struct aq_nic_s *aq_nic); 4862306a36Sopenharmony_civoid aq_ptp_ring_stop(struct aq_nic_s *aq_nic); 4962306a36Sopenharmony_civoid aq_ptp_ring_deinit(struct aq_nic_s *aq_nic); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_civoid aq_ptp_service_task(struct aq_nic_s *aq_nic); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_civoid aq_ptp_tm_offset_set(struct aq_nic_s *aq_nic, unsigned int mbps); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_civoid aq_ptp_clock_init(struct aq_nic_s *aq_nic); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* Traffic processing functions */ 5862306a36Sopenharmony_ciint aq_ptp_xmit(struct aq_nic_s *aq_nic, struct sk_buff *skb); 5962306a36Sopenharmony_civoid aq_ptp_tx_hwtstamp(struct aq_nic_s *aq_nic, u64 timestamp); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* Must be to check available of PTP before call */ 6262306a36Sopenharmony_civoid aq_ptp_hwtstamp_config_get(struct aq_ptp_s *aq_ptp, 6362306a36Sopenharmony_ci struct hwtstamp_config *config); 6462306a36Sopenharmony_ciint aq_ptp_hwtstamp_config_set(struct aq_ptp_s *aq_ptp, 6562306a36Sopenharmony_ci struct hwtstamp_config *config); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/* Return either ring is belong to PTP or not*/ 6862306a36Sopenharmony_cibool aq_ptp_ring(struct aq_nic_s *aq_nic, struct aq_ring_s *ring); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ciu16 aq_ptp_extract_ts(struct aq_nic_s *aq_nic, struct skb_shared_hwtstamps *shhwtstamps, u8 *p, 7162306a36Sopenharmony_ci unsigned int len); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistruct ptp_clock *aq_ptp_get_ptp_clock(struct aq_ptp_s *aq_ptp); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ciint aq_ptp_link_change(struct aq_nic_s *aq_nic); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* PTP ring statistics */ 7862306a36Sopenharmony_ciint aq_ptp_get_ring_cnt(struct aq_nic_s *aq_nic, const enum atl_ring_type ring_type); 7962306a36Sopenharmony_ciu64 *aq_ptp_get_stats(struct aq_nic_s *aq_nic, u64 *data); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#else 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic inline int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci return 0; 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic inline void aq_ptp_unregister(struct aq_nic_s *aq_nic) {} 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic inline void aq_ptp_free(struct aq_nic_s *aq_nic) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic inline int aq_ptp_irq_alloc(struct aq_nic_s *aq_nic) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci return 0; 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistatic inline void aq_ptp_irq_free(struct aq_nic_s *aq_nic) 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic inline int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic) 10462306a36Sopenharmony_ci{ 10562306a36Sopenharmony_ci return 0; 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic inline void aq_ptp_ring_free(struct aq_nic_s *aq_nic) {} 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistatic inline int aq_ptp_ring_init(struct aq_nic_s *aq_nic) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci return 0; 11362306a36Sopenharmony_ci} 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic inline int aq_ptp_ring_start(struct aq_nic_s *aq_nic) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci return 0; 11862306a36Sopenharmony_ci} 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistatic inline void aq_ptp_ring_stop(struct aq_nic_s *aq_nic) {} 12162306a36Sopenharmony_cistatic inline void aq_ptp_ring_deinit(struct aq_nic_s *aq_nic) {} 12262306a36Sopenharmony_cistatic inline void aq_ptp_service_task(struct aq_nic_s *aq_nic) {} 12362306a36Sopenharmony_cistatic inline void aq_ptp_tm_offset_set(struct aq_nic_s *aq_nic, 12462306a36Sopenharmony_ci unsigned int mbps) {} 12562306a36Sopenharmony_cistatic inline void aq_ptp_clock_init(struct aq_nic_s *aq_nic) {} 12662306a36Sopenharmony_cistatic inline int aq_ptp_xmit(struct aq_nic_s *aq_nic, struct sk_buff *skb) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci return -EOPNOTSUPP; 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic inline void aq_ptp_tx_hwtstamp(struct aq_nic_s *aq_nic, u64 timestamp) {} 13262306a36Sopenharmony_cistatic inline void aq_ptp_hwtstamp_config_get(struct aq_ptp_s *aq_ptp, 13362306a36Sopenharmony_ci struct hwtstamp_config *config) {} 13462306a36Sopenharmony_cistatic inline int aq_ptp_hwtstamp_config_set(struct aq_ptp_s *aq_ptp, 13562306a36Sopenharmony_ci struct hwtstamp_config *config) 13662306a36Sopenharmony_ci{ 13762306a36Sopenharmony_ci return 0; 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic inline bool aq_ptp_ring(struct aq_nic_s *aq_nic, struct aq_ring_s *ring) 14162306a36Sopenharmony_ci{ 14262306a36Sopenharmony_ci return false; 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistatic inline u16 aq_ptp_extract_ts(struct aq_nic_s *aq_nic, 14662306a36Sopenharmony_ci struct skb_shared_hwtstamps *shhwtstamps, u8 *p, 14762306a36Sopenharmony_ci unsigned int len) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci return 0; 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic inline struct ptp_clock *aq_ptp_get_ptp_clock(struct aq_ptp_s *aq_ptp) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci return NULL; 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic inline int aq_ptp_link_change(struct aq_nic_s *aq_nic) 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci return 0; 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ci#endif 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci#endif /* AQ_PTP_H */ 164