1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* Atlantic Network Driver 3 * 4 * Copyright (C) 2014-2019 aQuantia Corporation 5 * Copyright (C) 2019-2020 Marvell International Ltd. 6 */ 7 8 /* File aq_ptp.h: Declaration of PTP functions. 9 */ 10 #ifndef AQ_PTP_H 11 #define AQ_PTP_H 12 13 #include <linux/net_tstamp.h> 14 15 #include "aq_ring.h" 16 17 #define PTP_8TC_RING_IDX 8 18 #define PTP_4TC_RING_IDX 16 19 #define PTP_HWST_RING_IDX 31 20 21 /* Index must to be 8 (8 TCs) or 16 (4 TCs). 22 * It depends from Traffic Class mode. 23 */ 24 static inline unsigned int aq_ptp_ring_idx(const enum aq_tc_mode tc_mode) 25 { 26 if (tc_mode == AQ_TC_MODE_8TCS) 27 return PTP_8TC_RING_IDX; 28 29 return PTP_4TC_RING_IDX; 30 } 31 32 #if IS_REACHABLE(CONFIG_PTP_1588_CLOCK) 33 34 /* Common functions */ 35 int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec); 36 37 void aq_ptp_unregister(struct aq_nic_s *aq_nic); 38 void aq_ptp_free(struct aq_nic_s *aq_nic); 39 40 int aq_ptp_irq_alloc(struct aq_nic_s *aq_nic); 41 void aq_ptp_irq_free(struct aq_nic_s *aq_nic); 42 43 int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic); 44 void aq_ptp_ring_free(struct aq_nic_s *aq_nic); 45 46 int aq_ptp_ring_init(struct aq_nic_s *aq_nic); 47 int aq_ptp_ring_start(struct aq_nic_s *aq_nic); 48 void aq_ptp_ring_stop(struct aq_nic_s *aq_nic); 49 void aq_ptp_ring_deinit(struct aq_nic_s *aq_nic); 50 51 void aq_ptp_service_task(struct aq_nic_s *aq_nic); 52 53 void aq_ptp_tm_offset_set(struct aq_nic_s *aq_nic, unsigned int mbps); 54 55 void aq_ptp_clock_init(struct aq_nic_s *aq_nic); 56 57 /* Traffic processing functions */ 58 int aq_ptp_xmit(struct aq_nic_s *aq_nic, struct sk_buff *skb); 59 void aq_ptp_tx_hwtstamp(struct aq_nic_s *aq_nic, u64 timestamp); 60 61 /* Must be to check available of PTP before call */ 62 void aq_ptp_hwtstamp_config_get(struct aq_ptp_s *aq_ptp, 63 struct hwtstamp_config *config); 64 int aq_ptp_hwtstamp_config_set(struct aq_ptp_s *aq_ptp, 65 struct hwtstamp_config *config); 66 67 /* Return either ring is belong to PTP or not*/ 68 bool aq_ptp_ring(struct aq_nic_s *aq_nic, struct aq_ring_s *ring); 69 70 u16 aq_ptp_extract_ts(struct aq_nic_s *aq_nic, struct skb_shared_hwtstamps *shhwtstamps, u8 *p, 71 unsigned int len); 72 73 struct ptp_clock *aq_ptp_get_ptp_clock(struct aq_ptp_s *aq_ptp); 74 75 int aq_ptp_link_change(struct aq_nic_s *aq_nic); 76 77 /* PTP ring statistics */ 78 int aq_ptp_get_ring_cnt(struct aq_nic_s *aq_nic, const enum atl_ring_type ring_type); 79 u64 *aq_ptp_get_stats(struct aq_nic_s *aq_nic, u64 *data); 80 81 #else 82 83 static inline int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec) 84 { 85 return 0; 86 } 87 88 static inline void aq_ptp_unregister(struct aq_nic_s *aq_nic) {} 89 90 static inline void aq_ptp_free(struct aq_nic_s *aq_nic) 91 { 92 } 93 94 static inline int aq_ptp_irq_alloc(struct aq_nic_s *aq_nic) 95 { 96 return 0; 97 } 98 99 static inline void aq_ptp_irq_free(struct aq_nic_s *aq_nic) 100 { 101 } 102 103 static inline int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic) 104 { 105 return 0; 106 } 107 108 static inline void aq_ptp_ring_free(struct aq_nic_s *aq_nic) {} 109 110 static inline int aq_ptp_ring_init(struct aq_nic_s *aq_nic) 111 { 112 return 0; 113 } 114 115 static inline int aq_ptp_ring_start(struct aq_nic_s *aq_nic) 116 { 117 return 0; 118 } 119 120 static inline void aq_ptp_ring_stop(struct aq_nic_s *aq_nic) {} 121 static inline void aq_ptp_ring_deinit(struct aq_nic_s *aq_nic) {} 122 static inline void aq_ptp_service_task(struct aq_nic_s *aq_nic) {} 123 static inline void aq_ptp_tm_offset_set(struct aq_nic_s *aq_nic, 124 unsigned int mbps) {} 125 static inline void aq_ptp_clock_init(struct aq_nic_s *aq_nic) {} 126 static inline int aq_ptp_xmit(struct aq_nic_s *aq_nic, struct sk_buff *skb) 127 { 128 return -EOPNOTSUPP; 129 } 130 131 static inline void aq_ptp_tx_hwtstamp(struct aq_nic_s *aq_nic, u64 timestamp) {} 132 static inline void aq_ptp_hwtstamp_config_get(struct aq_ptp_s *aq_ptp, 133 struct hwtstamp_config *config) {} 134 static inline int aq_ptp_hwtstamp_config_set(struct aq_ptp_s *aq_ptp, 135 struct hwtstamp_config *config) 136 { 137 return 0; 138 } 139 140 static inline bool aq_ptp_ring(struct aq_nic_s *aq_nic, struct aq_ring_s *ring) 141 { 142 return false; 143 } 144 145 static inline u16 aq_ptp_extract_ts(struct aq_nic_s *aq_nic, 146 struct skb_shared_hwtstamps *shhwtstamps, u8 *p, 147 unsigned int len) 148 { 149 return 0; 150 } 151 152 static inline struct ptp_clock *aq_ptp_get_ptp_clock(struct aq_ptp_s *aq_ptp) 153 { 154 return NULL; 155 } 156 157 static inline int aq_ptp_link_change(struct aq_nic_s *aq_nic) 158 { 159 return 0; 160 } 161 #endif 162 163 #endif /* AQ_PTP_H */ 164