All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Lunn <andrew@lunn.ch>
To: Kurt Kanzenbach <kurt@linutronix.de>
Cc: Vivien Didelot <vivien.didelot@gmail.com>,
	Florian Fainelli <f.fainelli@gmail.com>,
	"David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	netdev@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
	devicetree@vger.kernel.org,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Richard Cochran <richardcochran@gmail.com>,
	Kamil Alkhouri <kamil.alkhouri@hs-offenburg.de>,
	ilias.apalodimas@linaro.org
Subject: Re: [RFC PATCH 2/9] net: dsa: Add DSA driver for Hirschmann Hellcreek switches
Date: Thu, 18 Jun 2020 17:22:47 +0200	[thread overview]
Message-ID: <20200618152247.GF240559@lunn.ch> (raw)
In-Reply-To: <20200618064029.32168-3-kurt@linutronix.de>

> +static void __hellcreek_select_port(struct hellcreek *hellcreek, int port)

Hi Kurt

In general, please can you drop all these __ prefixes. They are useful
when you have for example hellcreek_select_port() takes a lock and
then calls _hellcreek_select_port(), but here, there is no need for
them.

> +static int hellcreek_detect(struct hellcreek *hellcreek)
> +{
> +	u8 tgd_maj, tgd_min;
> +	u16 id, rel_low, rel_high, date_low, date_high, tgd_ver;
> +	u32 rel, date;

Reverse Christmas tree please. Here and everywhere else.

> +
> +	id	  = hellcreek_read(hellcreek, HR_MODID_C);
> +	rel_low	  = hellcreek_read(hellcreek, HR_REL_L_C);
> +	rel_high  = hellcreek_read(hellcreek, HR_REL_H_C);
> +	date_low  = hellcreek_read(hellcreek, HR_BLD_L_C);
> +	date_high = hellcreek_read(hellcreek, HR_BLD_H_C);
> +	tgd_ver   = hellcreek_read(hellcreek, TR_TGDVER);
> +
> +	if (id != HELLCREEK_MODULE_ID)
> +		return -ENODEV;
> +
> +	rel	= rel_low | (rel_high << 16);
> +	date	= date_low | (date_high << 16);
> +	tgd_maj = (tgd_ver & TR_TGDVER_REV_MAJ_MASK) >> TR_TGDVER_REV_MAJ_SHIFT;
> +	tgd_min = (tgd_ver & TR_TGDVER_REV_MIN_MASK) >> TR_TGDVER_REV_MIN_SHIFT;
> +
> +	dev_info(hellcreek->dev, "Module ID=%02x Release=%04x Date=%04x TGD Version=%02x.%02x\n",
> +		 id, rel, date, tgd_maj, tgd_min);
> +
> +	return 0;
> +}

> +static int hellcreek_port_enable(struct dsa_switch *ds, int port,
> +				 struct phy_device *phy)
> +{
> +	struct hellcreek *hellcreek = ds->priv;
> +	struct hellcreek_port *hellcreek_port = &hellcreek->ports[port];
> +	unsigned long flags;
> +	u16 val;
> +
> +	if (port >= NUM_PORTS)
> +		return -EINVAL;
> +
> +	dev_info(hellcreek->dev, "Enable port %d\n", port);

dev_dbg().

+
> +	spin_lock_irqsave(&hellcreek->reg_lock, flags);

I've not seen any interrupt handling code in the driver, and there is
no mention of an interrupt in the DT binding. Do you really need
_irqsave spin locks?

> +
> +	__hellcreek_select_port(hellcreek, port);
> +	val = hellcreek_port->ptcfg;
> +	val |= HR_PTCFG_ADMIN_EN;
> +	hellcreek_write(hellcreek, val, HR_PTCFG);
> +	hellcreek_port->ptcfg = val;
> +
> +	spin_unlock_irqrestore(&hellcreek->reg_lock, flags);
> +
> +	return 0;
> +}
> +
> +static void hellcreek_port_disable(struct dsa_switch *ds, int port)
> +{
> +	struct hellcreek *hellcreek = ds->priv;
> +	struct hellcreek_port *hellcreek_port = &hellcreek->ports[port];
> +	unsigned long flags;
> +	u16 val;
> +
> +	if (port >= NUM_PORTS)
> +		return;

I don't think this test is actually needed, here or in any of the
other callbacks. If it does happen, it means we have a core bug we
should fix.

> +
> +	dev_info(hellcreek->dev, "Disable port %d\n", port);

dev_dbg()

> +	spin_lock_irqsave(&hellcreek->reg_lock, flags);
> +
> +	__hellcreek_select_port(hellcreek, port);
> +	val = hellcreek_port->ptcfg;
> +	val &= ~HR_PTCFG_ADMIN_EN;
> +	hellcreek_write(hellcreek, val, HR_PTCFG);
> +	hellcreek_port->ptcfg = val;
> +
> +	spin_unlock_irqrestore(&hellcreek->reg_lock, flags);
> +}
> +

> +static void hellcreek_get_ethtool_stats(struct dsa_switch *ds, int port,
> +					uint64_t *data)
> +{
> +	struct hellcreek *hellcreek = ds->priv;
> +	struct hellcreek_port *hellcreek_port = &hellcreek->ports[port];
> +	unsigned long flags;
> +	int i;
> +
> +	if (port >= NUM_PORTS)
> +		return;
> +
> +	spin_lock_irqsave(&hellcreek->reg_lock, flags);
> +	for (i = 0; i < ARRAY_SIZE(hellcreek_counter); ++i) {
> +		const struct hellcreek_counter *counter = &hellcreek_counter[i];
> +		u8 offset = counter->offset + port * 64;
> +		u16 high, low;
> +		u64 value = 0;
> +
> +		__hellcreek_select_counter(hellcreek, offset);
> +
> +		high  = hellcreek_read(hellcreek, HR_CRDH);
> +		low   = hellcreek_read(hellcreek, HR_CRDL);
> +		value = (high << 16) | low;

Is there some sort of snapshot happening here? Or do you need to read
high again, to make sure it has not incremented when low was being
read?

> +
> +		hellcreek_port->counter_values[i] += value;
> +		data[i] = hellcreek_port->counter_values[i];
> +	}
> +	spin_unlock_irqrestore(&hellcreek->reg_lock, flags);
> +}
> +
> +static int hellcreek_vlan_prepare(struct dsa_switch *ds, int port,
> +				  const struct switchdev_obj_port_vlan *vlan)
> +{
> +	struct hellcreek *hellcreek = ds->priv;
> +
> +	/* Nothing todo */
> +	dev_info(hellcreek->dev, "VLAN prepare for port %d\n", port);

dev_dbg()

> +
> +	return 0;
> +}
> +

> +static void hellcreek_vlan_add(struct dsa_switch *ds, int port,
> +			       const struct switchdev_obj_port_vlan *vlan)
> +{
> +	struct hellcreek *hellcreek = ds->priv;
> +	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
> +	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
> +	unsigned long flags;
> +	u16 vid;
> +
> +	if (port >= NUM_PORTS || vlan->vid_end >= 4096)

Again, if vlan->vid_end >= 4096 is true, there is a core bug which
needs fixing.

> +		return;
> +
> +	dev_info(hellcreek->dev, "Add VLANs (%d -- %d) on port %d, %s, %s\n",
> +		 vlan->vid_begin, vlan->vid_end, port,
> +		 untagged ? "untagged" : "tagged",
> +		 pvid ? "PVID" : "no PVID");

Please go thought the driver and consider all you dev_info()
statements. Should they be dev_dbg()?

	    Andrew

  reply	other threads:[~2020-06-18 15:22 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-18  6:40 [RFC PATCH 0/9] Hirschmann Hellcreek DSA driver Kurt Kanzenbach
2020-06-18  6:40 ` [RFC PATCH 1/9] net: dsa: Add tag handling for Hirschmann Hellcreek switches Kurt Kanzenbach
2020-06-18 13:42   ` Andrew Lunn
2020-06-18  6:40 ` [RFC PATCH 2/9] net: dsa: Add DSA driver " Kurt Kanzenbach
2020-06-18 15:22   ` Andrew Lunn [this message]
2020-06-19  8:12     ` Kurt Kanzenbach
2020-06-18  6:40 ` [RFC PATCH 3/9] net: dsa: hellcreek: Add PTP clock support Kurt Kanzenbach
2020-06-18 15:46   ` Jakub Kicinski
2020-06-19  8:13     ` Kurt Kanzenbach
2020-06-18 17:23   ` Andrew Lunn
2020-06-19  8:26     ` Kurt Kanzenbach
2020-06-19 13:40       ` Andrew Lunn
2020-06-22 11:52         ` Kurt Kanzenbach
2020-06-24 13:03   ` Richard Cochran
2020-06-25  7:08     ` Kurt Kanzenbach
2020-06-18  6:40 ` [RFC PATCH 4/9] net: dsa: hellcreek: Add support for hardware timestamping Kurt Kanzenbach
2020-06-18  6:40 ` [RFC PATCH 5/9] net: dsa: hellcreek: Add TAPRIO offloading support Kurt Kanzenbach
2020-06-18  6:40 ` [RFC PATCH 6/9] net: dsa: hellcreek: Add debugging mechanisms Kurt Kanzenbach
2020-06-18 17:34   ` Andrew Lunn
2020-06-19  8:36     ` Kurt Kanzenbach
2020-06-19 13:42       ` Andrew Lunn
2020-06-22 12:32         ` Kurt Kanzenbach
2020-06-22 13:55           ` Andrew Lunn
2020-06-23  6:07             ` Kurt Kanzenbach
2020-06-22 14:14           ` Vladimir Oltean
2020-06-23  6:04             ` Kurt Kanzenbach
2020-06-18  6:40 ` [RFC PATCH 7/9] net: dsa: hellcreek: Add PTP status LEDs Kurt Kanzenbach
2020-06-18 17:46   ` Andrew Lunn
2020-06-19  8:45     ` Kurt Kanzenbach
2020-06-19 13:52       ` Andrew Lunn
2020-06-18  6:40 ` [RFC PATCH 8/9] dt-bindings: Add vendor prefix for Hirschmann Kurt Kanzenbach
2020-06-18  6:40 ` [RFC PATCH 9/9] dt-bindings: net: dsa: Add documentation for Hellcreek switches Kurt Kanzenbach
2020-06-18 13:47   ` Andrew Lunn
2020-06-19  8:47     ` Kurt Kanzenbach
2020-06-19 13:56       ` Andrew Lunn
2020-06-22 12:02         ` Kurt Kanzenbach
2020-06-22 13:49           ` Andrew Lunn
2020-06-23  6:09             ` Kurt Kanzenbach
2020-06-18 17:40   ` Florian Fainelli
2020-06-19  8:48     ` Kurt Kanzenbach
2020-06-22 12:05       ` Kurt Kanzenbach
2020-06-26 17:11         ` Florian Fainelli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200618152247.GF240559@lunn.ch \
    --to=andrew@lunn.ch \
    --cc=bigeasy@linutronix.de \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=f.fainelli@gmail.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=kamil.alkhouri@hs-offenburg.de \
    --cc=kuba@kernel.org \
    --cc=kurt@linutronix.de \
    --cc=netdev@vger.kernel.org \
    --cc=richardcochran@gmail.com \
    --cc=robh+dt@kernel.org \
    --cc=vivien.didelot@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.