Thread (37 messages) 37 messages, 4 authors, 2020-11-17

Re: [PATCH net-next v2 03/11] net: dsa: microchip: split ksz_common.h

From: Christian Eggers <ceggers@arri.de>
Date: 2020-11-16 09:56:59
Also in: linux-devicetree, lkml

On Friday, 13 November 2020, 17:56:34 CET, Christian Eggers wrote:
On Friday, 13 November 2020, 00:02:54 CET, Vladimir Oltean wrote:
quoted
On Thu, Nov 12, 2020 at 04:35:29PM +0100, Christian Eggers wrote:
quoted
Parts of ksz_common.h (struct ksz_device) will be required in
net/dsa/tag_ksz.c soon. So move the relevant parts into a new header
file.

Signed-off-by: Christian Eggers <ceggers@arri.de>
---
I had to skip ahead to see what you're going to use struct ksz_port and

struct ksz_device for. It looks like you need:
	struct ksz_port::tstamp_rx_latency_ns
	struct ksz_device::ptp_clock_lock
	struct ksz_device::ptp_clock_time

Not more.
I have tried to put these members into separate structs:

include/linux/dsa/ksz_common.h:
struct ksz_port_ptp_shared {
	u16 tstamp_rx_latency_ns;   /* rx delay from wire to tstamp unit */
};

struct ksz_device_ptp_shared {
	spinlock_t ptp_clock_lock; /* for ptp_clock_time */
	/* approximated current time, read once per second from hardware */
	struct timespec64 ptp_clock_time;
};

drivers/net/dsa/microchip/ksz_common.h:
...
#include <linux/dsa/ksz_common.h>
...
struct ksz_port {
...
#if IS_ENABLED(CONFIG_NET_DSA_MICROCHIP_KSZ9477_PTP)
	struct ksz_port_ptp_shared ptp_shared;	/* shared with tag_ksz.c */
	u16 tstamp_tx_latency_ns;	/* tx delay from tstamp unit to wire */
	struct hwtstamp_config tstamp_config;
	struct sk_buff *tstamp_tx_xdelay_skb;
	unsigned long tstamp_state;
#endif
};
...
struct ksz_device {
...
#if IS_ENABLED(CONFIG_NET_DSA_MICROCHIP_KSZ9477_PTP)
	struct ptp_clock *ptp_clock;
	struct ptp_clock_info ptp_caps;
	struct mutex ptp_mutex;
	struct ksz_device_ptp_shared ptp_shared;   /* shared with tag_ksz.c */
#endif
};

The problem with such technique is, that I still need to dereference
struct ksz_device in tag_ksz.c:

static void ksz9477_rcv_timestamp(struct sk_buff *skb, u8 *tag,
				  struct net_device *dev, unsigned int port)
{
...
	struct dsa_switch *ds = dev->dsa_ptr->ds;
	struct ksz_device *ksz = ds->priv;
	struct ksz_port *prt = &ksz->ports[port];
...
}

As struct dsa_switch::priv is already occupied by the pointer to
struct ksz_device, I see no way accessing the ptp specific device/port
information in tag_ksz.c.
quoted
Why don't you go the other way around, i.e. exporting some functions
from your driver, and calling them from the tagger?
Good question... But as for as I can see, there are a single tagger and
multiple device drivers (currently KSZ8795 and KSZ9477).

Moving the KSZ9477 specific stuff, which is required by the tagger, into the
KSZ9477 device driver, would make the tagger dependent on the driver(s).
Currently, no tagger seems to have this direction of dependency (at least I
cannot find this in net/dsa/Kconfig).

If I shall change this anyway, I would use #ifdefs within the tag_ksz driver
in order to avoid unnecessary dependencies to the KSZ9477 driver for the
case only KSZ8795 is selected.
quoted
You could even move
the entire ksz9477_tstamp_to_clock() into the driver as-is, as far as I
can see.
regards
Christian


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help