All of lore.kernel.org
 help / color / mirror / Atom feed
From: Guenter Roeck <linux@roeck-us.net>
To: netdev@vger.kernel.org
Cc: "David S. Miller" <davem@davemloft.net>,
	Florian Fainelli <f.fainelli@gmail.com>,
	Andrew Lunn <andrew@lunn.ch>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v3 09/15] net: dsa: Add support for switch EEPROM access
Date: Tue, 28 Oct 2014 09:49:55 -0700	[thread overview]
Message-ID: <20141028164955.GA3220@roeck-us.net> (raw)
In-Reply-To: <1414342365-27191-10-git-send-email-linux@roeck-us.net>

On some chips it is possible to access the switch eeprom.
Add infrastructure support for it.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Fix bug seen if devicetree is enabled; eeprom-length property is
  attached to switch devicetree node, not to dsa node.
v2:
- Add support for configuring switch EEPROM size through platform data
  or devicetree data
- Do not compare new pointers against NULL
- Check if get_eeprom pointer is set before calling it

 include/net/dsa.h | 10 ++++++++++
 net/dsa/dsa.c     |  4 ++++
 net/dsa/slave.c   | 41 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+)

diff --git a/include/net/dsa.h b/include/net/dsa.h
index 55e75e7..37856a2 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -38,6 +38,9 @@ struct dsa_chip_data {
 	struct device	*host_dev;
 	int		sw_addr;
 
+	/* set to size of eeprom if supported by the switch */
+	int		eeprom_len;
+
 	/* Device tree node pointer for this specific switch chip
 	 * used during switch setup in case additional properties
 	 * and resources needs to be used
@@ -258,6 +261,13 @@ struct dsa_switch_driver {
 	int	(*set_temp_limit)(struct dsa_switch *ds, int temp);
 	int	(*get_temp_alarm)(struct dsa_switch *ds, bool *alarm);
 #endif
+
+	/* EEPROM access */
+	int	(*get_eeprom_len)(struct dsa_switch *ds);
+	int	(*get_eeprom)(struct dsa_switch *ds,
+			      struct ethtool_eeprom *eeprom, u8 *data);
+	int	(*set_eeprom)(struct dsa_switch *ds,
+			      struct ethtool_eeprom *eeprom, u8 *data);
 };
 
 void register_switch_driver(struct dsa_switch_driver *type);
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 5edbbca..b51ef592 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -575,6 +575,7 @@ static int dsa_of_probe(struct platform_device *pdev)
 	const char *port_name;
 	int chip_index, port_index;
 	const unsigned int *sw_addr, *port_reg;
+	u32 eeprom_len;
 	int ret;
 
 	mdio = of_parse_phandle(np, "dsa,mii-bus", 0);
@@ -626,6 +627,9 @@ static int dsa_of_probe(struct platform_device *pdev)
 		if (cd->sw_addr > PHY_MAX_ADDR)
 			continue;
 
+		if (!of_property_read_u32(np, "eeprom-length", &eeprom_len))
+			cd->eeprom_len = eeprom_len;
+
 		for_each_available_child_of_node(child, port) {
 			port_reg = of_get_property(port, "reg", NULL);
 			if (!port_reg)
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 6d18174..ff2fbe7 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -271,6 +271,44 @@ static u32 dsa_slave_get_link(struct net_device *dev)
 	return -EOPNOTSUPP;
 }
 
+static int dsa_slave_get_eeprom_len(struct net_device *dev)
+{
+	struct dsa_slave_priv *p = netdev_priv(dev);
+	struct dsa_switch *ds = p->parent;
+
+	if (ds->pd->eeprom_len)
+		return ds->pd->eeprom_len;
+
+	if (ds->drv->get_eeprom_len)
+		return ds->drv->get_eeprom_len(ds);
+
+	return 0;
+}
+
+static int dsa_slave_get_eeprom(struct net_device *dev,
+				struct ethtool_eeprom *eeprom, u8 *data)
+{
+	struct dsa_slave_priv *p = netdev_priv(dev);
+	struct dsa_switch *ds = p->parent;
+
+	if (ds->drv->get_eeprom)
+		return ds->drv->get_eeprom(ds, eeprom, data);
+
+	return -EOPNOTSUPP;
+}
+
+static int dsa_slave_set_eeprom(struct net_device *dev,
+				struct ethtool_eeprom *eeprom, u8 *data)
+{
+	struct dsa_slave_priv *p = netdev_priv(dev);
+	struct dsa_switch *ds = p->parent;
+
+	if (ds->drv->set_eeprom)
+		return ds->drv->set_eeprom(ds, eeprom, data);
+
+	return -EOPNOTSUPP;
+}
+
 static void dsa_slave_get_strings(struct net_device *dev,
 				  uint32_t stringset, uint8_t *data)
 {
@@ -387,6 +425,9 @@ static const struct ethtool_ops dsa_slave_ethtool_ops = {
 	.get_drvinfo		= dsa_slave_get_drvinfo,
 	.nway_reset		= dsa_slave_nway_reset,
 	.get_link		= dsa_slave_get_link,
+	.get_eeprom_len		= dsa_slave_get_eeprom_len,
+	.get_eeprom		= dsa_slave_get_eeprom,
+	.set_eeprom		= dsa_slave_set_eeprom,
 	.get_strings		= dsa_slave_get_strings,
 	.get_ethtool_stats	= dsa_slave_get_ethtool_stats,
 	.get_sset_count		= dsa_slave_get_sset_count,
-- 
1.9.1


  parent reply	other threads:[~2014-10-28 17:00 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-26 16:52 [PATCH v2 00/15] net: dsa: Fixes and enhancements Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 01/15] net: dsa: Don't set skb->protocol on outgoing tagged packets Guenter Roeck
2014-10-28 19:19   ` Florian Fainelli
2014-10-28 19:23     ` Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 02/15] net: dsa: Report known silicon revisions for Marvell 88E6060 Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 03/15] net: dsa: Report known silicon revisions for Marvell 88E6131 Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 04/15] net: dsa: Add support for Marvell 88E6352 Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 05/15] net: dsa/mv88e6352: Add support for MV88E6176 Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 06/15] net: dsa: Add support for reporting switch chip temperatures Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 07/15] net: dsa/mv88e6352: Report chip temperature Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 08/15] net: dsa/mv88e6123_61_65: " Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 09/15] net: dsa: Add support for switch EEPROM access Guenter Roeck
2014-10-27  2:41   ` Andrew Lunn
2014-10-27  3:56     ` Guenter Roeck
2014-10-27  8:50       ` Richard Cochran
2014-10-27 13:22         ` Guenter Roeck
2014-10-27 13:59       ` Andrew Lunn
2014-10-27 15:42         ` Guenter Roeck
2014-10-28 13:31   ` Guenter Roeck
2014-10-28 16:49   ` Guenter Roeck [this message]
2014-10-28 18:19     ` [PATCH v3 " David Miller
2014-10-28 19:21       ` Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 10/15] dsa: Add new optional devicetree property to describe EEPROM size Guenter Roeck
2014-10-28 16:50   ` [PATCH v3 " Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 11/15] net: dsa/mv88e6352: Implement EEPROM access functions Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 12/15] net: dsa: Add support for reading switch registers with ethtool Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 13/15] net: dsa/mv88e6123_61_65: Add support for reading switch registers Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 14/15] net: dsa/mv88e6352: " Guenter Roeck
2014-10-26 16:52 ` [PATCH v2 15/15] net: dsa: Provide additional RMON statistics Guenter Roeck
  -- strict thread matches above, loose matches on Subject: below --
2014-10-29 17:44 [PATCH v3 00/15] net: dsa: Fixes and enhancements Guenter Roeck
2014-10-29 17:45 ` [PATCH v3 09/15] net: dsa: Add support for switch EEPROM access Guenter Roeck
2014-10-30 21:11   ` Andrew Lunn
2014-10-30 22:39     ` Guenter Roeck
2014-10-31  1:00       ` Guenter Roeck
2014-10-31  2:40         ` Andrew Lunn
2014-10-31  2:53           ` Guenter Roeck
2014-10-31  3:43             ` David Miller

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=20141028164955.GA3220@roeck-us.net \
    --to=linux@roeck-us.net \
    --cc=andrew@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=f.fainelli@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    /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.