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