diff options
| author | Guenter Roeck <linux@roeck-us.net> | 2014-10-29 13:45:01 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-10-30 14:54:11 -0400 |
| commit | 6793abb4e8491b1d673ccfd09e1a73d1ff8b9386 (patch) | |
| tree | c6a2a1c1a626016fe80f212969cf6f62063c346d /net/dsa | |
| parent | 87e5f66b3723b2d912b565bf7100e5121f302cbf (diff) | |
net: dsa: Add support for switch EEPROM access
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa')
| -rw-r--r-- | net/dsa/dsa.c | 4 | ||||
| -rw-r--r-- | net/dsa/slave.c | 41 |
2 files changed, 45 insertions, 0 deletions
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 5edbbca89f1f..b51ef592f0a2 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c | |||
| @@ -575,6 +575,7 @@ static int dsa_of_probe(struct platform_device *pdev) | |||
| 575 | const char *port_name; | 575 | const char *port_name; |
| 576 | int chip_index, port_index; | 576 | int chip_index, port_index; |
| 577 | const unsigned int *sw_addr, *port_reg; | 577 | const unsigned int *sw_addr, *port_reg; |
| 578 | u32 eeprom_len; | ||
| 578 | int ret; | 579 | int ret; |
| 579 | 580 | ||
| 580 | mdio = of_parse_phandle(np, "dsa,mii-bus", 0); | 581 | mdio = of_parse_phandle(np, "dsa,mii-bus", 0); |
| @@ -626,6 +627,9 @@ static int dsa_of_probe(struct platform_device *pdev) | |||
| 626 | if (cd->sw_addr > PHY_MAX_ADDR) | 627 | if (cd->sw_addr > PHY_MAX_ADDR) |
| 627 | continue; | 628 | continue; |
| 628 | 629 | ||
| 630 | if (!of_property_read_u32(np, "eeprom-length", &eeprom_len)) | ||
| 631 | cd->eeprom_len = eeprom_len; | ||
| 632 | |||
| 629 | for_each_available_child_of_node(child, port) { | 633 | for_each_available_child_of_node(child, port) { |
| 630 | port_reg = of_get_property(port, "reg", NULL); | 634 | port_reg = of_get_property(port, "reg", NULL); |
| 631 | if (!port_reg) | 635 | if (!port_reg) |
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 6d1817449c36..ff2fbe79bc57 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) | |||
| 271 | return -EOPNOTSUPP; | 271 | return -EOPNOTSUPP; |
| 272 | } | 272 | } |
| 273 | 273 | ||
| 274 | static int dsa_slave_get_eeprom_len(struct net_device *dev) | ||
| 275 | { | ||
| 276 | struct dsa_slave_priv *p = netdev_priv(dev); | ||
| 277 | struct dsa_switch *ds = p->parent; | ||
| 278 | |||
| 279 | if (ds->pd->eeprom_len) | ||
| 280 | return ds->pd->eeprom_len; | ||
| 281 | |||
| 282 | if (ds->drv->get_eeprom_len) | ||
| 283 | return ds->drv->get_eeprom_len(ds); | ||
| 284 | |||
| 285 | return 0; | ||
| 286 | } | ||
| 287 | |||
| 288 | static int dsa_slave_get_eeprom(struct net_device *dev, | ||
| 289 | struct ethtool_eeprom *eeprom, u8 *data) | ||
| 290 | { | ||
| 291 | struct dsa_slave_priv *p = netdev_priv(dev); | ||
| 292 | struct dsa_switch *ds = p->parent; | ||
| 293 | |||
| 294 | if (ds->drv->get_eeprom) | ||
| 295 | return ds->drv->get_eeprom(ds, eeprom, data); | ||
| 296 | |||
| 297 | return -EOPNOTSUPP; | ||
| 298 | } | ||
| 299 | |||
| 300 | static int dsa_slave_set_eeprom(struct net_device *dev, | ||
| 301 | struct ethtool_eeprom *eeprom, u8 *data) | ||
| 302 | { | ||
| 303 | struct dsa_slave_priv *p = netdev_priv(dev); | ||
| 304 | struct dsa_switch *ds = p->parent; | ||
| 305 | |||
| 306 | if (ds->drv->set_eeprom) | ||
| 307 | return ds->drv->set_eeprom(ds, eeprom, data); | ||
| 308 | |||
| 309 | return -EOPNOTSUPP; | ||
| 310 | } | ||
| 311 | |||
| 274 | static void dsa_slave_get_strings(struct net_device *dev, | 312 | static void dsa_slave_get_strings(struct net_device *dev, |
| 275 | uint32_t stringset, uint8_t *data) | 313 | uint32_t stringset, uint8_t *data) |
| 276 | { | 314 | { |
| @@ -387,6 +425,9 @@ static const struct ethtool_ops dsa_slave_ethtool_ops = { | |||
| 387 | .get_drvinfo = dsa_slave_get_drvinfo, | 425 | .get_drvinfo = dsa_slave_get_drvinfo, |
| 388 | .nway_reset = dsa_slave_nway_reset, | 426 | .nway_reset = dsa_slave_nway_reset, |
| 389 | .get_link = dsa_slave_get_link, | 427 | .get_link = dsa_slave_get_link, |
| 428 | .get_eeprom_len = dsa_slave_get_eeprom_len, | ||
| 429 | .get_eeprom = dsa_slave_get_eeprom, | ||
| 430 | .set_eeprom = dsa_slave_set_eeprom, | ||
| 390 | .get_strings = dsa_slave_get_strings, | 431 | .get_strings = dsa_slave_get_strings, |
| 391 | .get_ethtool_stats = dsa_slave_get_ethtool_stats, | 432 | .get_ethtool_stats = dsa_slave_get_ethtool_stats, |
| 392 | .get_sset_count = dsa_slave_get_sset_count, | 433 | .get_sset_count = dsa_slave_get_sset_count, |
