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