mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
d92e4e6e33
On Spectrum-1, timestamps arrive through a pair of dedicated events: MLXSW_TRAP_ID_PTP_ING_FIFO and _EGR_FIFO. The payload delivered with those traps is contents of the timestamp FIFO at a given port in a given direction. Add a Spectrum-1-specific handler for these two events which decodes the timestamps and forwards them to the PTP module. Add a function that parses a packet, dispatching to ptp_classify_raw(), and decodes PTP message type, domain number, and sequence ID. Add a new mlxsw dependency on the PTP classifier. Add helpers that can store and retrieve unmatched timestamps and SKBs to the hash table added in a preceding patch. Add the matching code itself: upon arrival of a timestamp or a packet, look up the corresponding unmatched entry, and match it up. If there is none, add a new unmatched entry. This logic is the same on ingress as on egress. Packets and timestamps that never matched need to be eventually disposed of. A garbage collector added in a follow-up patch will take care of that. Since currently all this code is turned off, no crud will accumulate in the hash table. Signed-off-by: Petr Machata <petrm@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
113 lines
2.6 KiB
C
113 lines
2.6 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
|
|
/* Copyright (c) 2019 Mellanox Technologies. All rights reserved */
|
|
|
|
#ifndef _MLXSW_SPECTRUM_PTP_H
|
|
#define _MLXSW_SPECTRUM_PTP_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/rhashtable.h>
|
|
|
|
struct mlxsw_sp;
|
|
struct mlxsw_sp_port;
|
|
struct mlxsw_sp_ptp_clock;
|
|
|
|
#if IS_REACHABLE(CONFIG_PTP_1588_CLOCK)
|
|
|
|
struct mlxsw_sp_ptp_clock *
|
|
mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev);
|
|
|
|
void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock);
|
|
|
|
struct mlxsw_sp_ptp_state *mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp);
|
|
|
|
void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state);
|
|
|
|
void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
|
|
u8 local_port);
|
|
|
|
void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
|
|
struct sk_buff *skb, u8 local_port);
|
|
|
|
void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress,
|
|
u8 local_port, u8 message_type,
|
|
u8 domain_number, u16 sequence_id,
|
|
u64 timestamp);
|
|
|
|
#else
|
|
|
|
static inline struct mlxsw_sp_ptp_clock *
|
|
mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock)
|
|
{
|
|
}
|
|
|
|
static inline struct mlxsw_sp_ptp_state *
|
|
mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state)
|
|
{
|
|
}
|
|
|
|
static inline void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp,
|
|
struct sk_buff *skb, u8 local_port)
|
|
{
|
|
mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp);
|
|
}
|
|
|
|
static inline void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
|
|
struct sk_buff *skb, u8 local_port)
|
|
{
|
|
dev_kfree_skb_any(skb);
|
|
}
|
|
|
|
static inline void
|
|
mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress,
|
|
u8 local_port, u8 message_type,
|
|
u8 domain_number,
|
|
u16 sequence_id, u64 timestamp)
|
|
{
|
|
}
|
|
|
|
#endif
|
|
|
|
static inline struct mlxsw_sp_ptp_clock *
|
|
mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock)
|
|
{
|
|
}
|
|
|
|
static inline struct mlxsw_sp_ptp_state *
|
|
mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state)
|
|
{
|
|
}
|
|
|
|
static inline void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp,
|
|
struct sk_buff *skb, u8 local_port)
|
|
{
|
|
mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp);
|
|
}
|
|
|
|
static inline void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
|
|
struct sk_buff *skb, u8 local_port)
|
|
{
|
|
dev_kfree_skb_any(skb);
|
|
}
|
|
|
|
#endif
|