Commit 5f184269 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

netdev: expose DPLL pin handle for netdevice



In case netdevice represents a SyncE port, the user needs to understand
the connection between netdevice and associated DPLL pin. There might me
multiple netdevices pointing to the same pin, in case of VF/SF
implementation.

Add a IFLA Netlink attribute to nest the DPLL pin handle, similar to
how it is implemented for devlink port. Add a struct dpll_pin pointer
to netdev and protect access to it by RTNL. Expose netdev_dpll_pin_set()
and netdev_dpll_pin_clear() helpers to the drivers so they can set/clear
the DPLL pin relationship to netdev.

Note that during the lifetime of struct dpll_pin the pin handle does not
change. Therefore it is save to access it lockless. It is drivers
responsibility to call netdev_dpll_pin_clear() before dpll_pin_put().

Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarArkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
Signed-off-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9d71b54b
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -47,6 +47,18 @@ dpll_msg_add_dev_parent_handle(struct sk_buff *msg, u32 id)
	return 0;
}

/**
 * dpll_msg_pin_handle_size - get size of pin handle attribute for given pin
 * @pin: pin pointer
 *
 * Return: byte size of pin handle attribute for given pin.
 */
size_t dpll_msg_pin_handle_size(struct dpll_pin *pin)
{
	return pin ? nla_total_size(4) : 0; /* DPLL_A_PIN_ID */
}
EXPORT_SYMBOL_GPL(dpll_msg_pin_handle_size);

/**
 * dpll_msg_add_pin_handle - attach pin handle attribute to a given message
 * @msg: pointer to sk_buff message to attach a pin handle
@@ -56,8 +68,7 @@ dpll_msg_add_dev_parent_handle(struct sk_buff *msg, u32 id)
 * * 0 - success
 * * -EMSGSIZE - no space in message to attach pin handle
 */
static int
dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
{
	if (!pin)
		return 0;
@@ -65,6 +76,7 @@ dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
		return -EMSGSIZE;
	return 0;
}
EXPORT_SYMBOL_GPL(dpll_msg_add_pin_handle);

static int
dpll_msg_add_mode(struct sk_buff *msg, struct dpll_device *dpll,
+15 −0
Original line number Diff line number Diff line
@@ -101,6 +101,21 @@ struct dpll_pin_properties {
	struct dpll_pin_frequency *freq_supported;
};

#if IS_ENABLED(CONFIG_DPLL)
size_t dpll_msg_pin_handle_size(struct dpll_pin *pin);
int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin);
#else
static inline size_t dpll_msg_pin_handle_size(struct dpll_pin *pin)
{
	return 0;
}

static inline int dpll_msg_add_pin_handle(struct sk_buff *msg, struct dpll_pin *pin)
{
	return 0;
}
#endif

struct dpll_device *
dpll_device_get(u64 clock_id, u32 dev_driver_id, struct module *module);

+21 −0
Original line number Diff line number Diff line
@@ -79,6 +79,8 @@ struct xdp_buff;
struct xdp_frame;
struct xdp_metadata_ops;
struct xdp_md;
/* DPLL specific */
struct dpll_pin;

typedef u32 xdp_features_t;

@@ -2049,6 +2051,9 @@ enum netdev_ml_priv_type {
 *			SET_NETDEV_DEVLINK_PORT macro. This pointer is static
 *			during the time netdevice is registered.
 *
 *	@dpll_pin: Pointer to the SyncE source pin of a DPLL subsystem,
 *		   where the clock is recovered.
 *
 *	FIXME: cleanup struct net_device such that network protocol info
 *	moves out.
 */
@@ -2405,6 +2410,10 @@ struct net_device {
	struct rtnl_hw_stats64	*offload_xstats_l3;

	struct devlink_port	*devlink_port;

#if IS_ENABLED(CONFIG_DPLL)
	struct dpll_pin		*dpll_pin;
#endif
};
#define to_net_dev(d) container_of(d, struct net_device, dev)

@@ -3940,6 +3949,18 @@ int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name);
int dev_get_port_parent_id(struct net_device *dev,
			   struct netdev_phys_item_id *ppid, bool recurse);
bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b);
void netdev_dpll_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin);
void netdev_dpll_pin_clear(struct net_device *dev);

static inline struct dpll_pin *netdev_dpll_pin(const struct net_device *dev)
{
#if IS_ENABLED(CONFIG_DPLL)
	return dev->dpll_pin;
#else
	return NULL;
#endif
}

struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *dev, bool *again);
struct sk_buff *dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
				    struct netdev_queue *txq, int *ret);
+1 −1
Original line number Diff line number Diff line
@@ -376,7 +376,7 @@ enum {

	IFLA_GSO_IPV4_MAX_SIZE,
	IFLA_GRO_IPV4_MAX_SIZE,

	IFLA_DPLL_PIN,
	__IFLA_MAX
};

+22 −0
Original line number Diff line number Diff line
@@ -9023,6 +9023,28 @@ bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b)
}
EXPORT_SYMBOL(netdev_port_same_parent_id);

static void netdev_dpll_pin_assign(struct net_device *dev, struct dpll_pin *dpll_pin)
{
#if IS_ENABLED(CONFIG_DPLL)
	rtnl_lock();
	dev->dpll_pin = dpll_pin;
	rtnl_unlock();
#endif
}

void netdev_dpll_pin_set(struct net_device *dev, struct dpll_pin *dpll_pin)
{
	WARN_ON(!dpll_pin);
	netdev_dpll_pin_assign(dev, dpll_pin);
}
EXPORT_SYMBOL(netdev_dpll_pin_set);

void netdev_dpll_pin_clear(struct net_device *dev)
{
	netdev_dpll_pin_assign(dev, NULL);
}
EXPORT_SYMBOL(netdev_dpll_pin_clear);

/**
 *	dev_change_proto_down - set carrier according to proto_down.
 *
Loading