Linux Audio

Check our new training course

Loading...
  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 */
 24static 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 */
 35int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec);
 36
 37void aq_ptp_unregister(struct aq_nic_s *aq_nic);
 38void aq_ptp_free(struct aq_nic_s *aq_nic);
 39
 40int aq_ptp_irq_alloc(struct aq_nic_s *aq_nic);
 41void aq_ptp_irq_free(struct aq_nic_s *aq_nic);
 42
 43int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic);
 44void aq_ptp_ring_free(struct aq_nic_s *aq_nic);
 45
 46int aq_ptp_ring_init(struct aq_nic_s *aq_nic);
 47int aq_ptp_ring_start(struct aq_nic_s *aq_nic);
 48void aq_ptp_ring_stop(struct aq_nic_s *aq_nic);
 49void aq_ptp_ring_deinit(struct aq_nic_s *aq_nic);
 50
 51void aq_ptp_service_task(struct aq_nic_s *aq_nic);
 52
 53void aq_ptp_tm_offset_set(struct aq_nic_s *aq_nic, unsigned int mbps);
 54
 55void aq_ptp_clock_init(struct aq_nic_s *aq_nic);
 56
 57/* Traffic processing functions */
 58int aq_ptp_xmit(struct aq_nic_s *aq_nic, struct sk_buff *skb);
 59void aq_ptp_tx_hwtstamp(struct aq_nic_s *aq_nic, u64 timestamp);
 60
 61/* Must be to check available of PTP before call */
 62void aq_ptp_hwtstamp_config_get(struct aq_ptp_s *aq_ptp,
 63				struct hwtstamp_config *config);
 64int 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*/
 68bool aq_ptp_ring(struct aq_nic_s *aq_nic, struct aq_ring_s *ring);
 69
 70u16 aq_ptp_extract_ts(struct aq_nic_s *aq_nic, struct skb_shared_hwtstamps *shhwtstamps, u8 *p,
 71		      unsigned int len);
 72
 73struct ptp_clock *aq_ptp_get_ptp_clock(struct aq_ptp_s *aq_ptp);
 74
 75int aq_ptp_link_change(struct aq_nic_s *aq_nic);
 76
 77/* PTP ring statistics */
 78int aq_ptp_get_ring_cnt(struct aq_nic_s *aq_nic, const enum atl_ring_type ring_type);
 79u64 *aq_ptp_get_stats(struct aq_nic_s *aq_nic, u64 *data);
 80
 81#else
 82
 83static inline int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec)
 84{
 85	return 0;
 86}
 87
 88static inline void aq_ptp_unregister(struct aq_nic_s *aq_nic) {}
 89
 90static inline void aq_ptp_free(struct aq_nic_s *aq_nic)
 91{
 92}
 93
 94static inline int aq_ptp_irq_alloc(struct aq_nic_s *aq_nic)
 95{
 96	return 0;
 97}
 98
 99static inline void aq_ptp_irq_free(struct aq_nic_s *aq_nic)
100{
101}
102
103static inline int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic)
104{
105	return 0;
106}
107
108static inline void aq_ptp_ring_free(struct aq_nic_s *aq_nic) {}
109
110static inline int aq_ptp_ring_init(struct aq_nic_s *aq_nic)
111{
112	return 0;
113}
114
115static inline int aq_ptp_ring_start(struct aq_nic_s *aq_nic)
116{
117	return 0;
118}
119
120static inline void aq_ptp_ring_stop(struct aq_nic_s *aq_nic) {}
121static inline void aq_ptp_ring_deinit(struct aq_nic_s *aq_nic) {}
122static inline void aq_ptp_service_task(struct aq_nic_s *aq_nic) {}
123static inline void aq_ptp_tm_offset_set(struct aq_nic_s *aq_nic,
124					unsigned int mbps) {}
125static inline void aq_ptp_clock_init(struct aq_nic_s *aq_nic) {}
126static inline int aq_ptp_xmit(struct aq_nic_s *aq_nic, struct sk_buff *skb)
127{
128	return -EOPNOTSUPP;
129}
130
131static inline void aq_ptp_tx_hwtstamp(struct aq_nic_s *aq_nic, u64 timestamp) {}
132static inline void aq_ptp_hwtstamp_config_get(struct aq_ptp_s *aq_ptp,
133					      struct hwtstamp_config *config) {}
134static inline int aq_ptp_hwtstamp_config_set(struct aq_ptp_s *aq_ptp,
135					     struct hwtstamp_config *config)
136{
137	return 0;
138}
139
140static inline bool aq_ptp_ring(struct aq_nic_s *aq_nic, struct aq_ring_s *ring)
141{
142	return false;
143}
144
145static 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
152static inline struct ptp_clock *aq_ptp_get_ptp_clock(struct aq_ptp_s *aq_ptp)
153{
154	return NULL;
155}
156
157static 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 */