ocelot.c (ed0a773bff5f2966c1c8b85e471a4d7a61f9dd62) ocelot.c (6921351359395a6c6ac72cd275a8393f399cecc7)
1// SPDX-License-Identifier: (GPL-2.0 OR MIT)
2/*
3 * Microsemi Ocelot Switch driver
4 *
5 * Copyright (c) 2017 Microsemi Corporation
6 */
7#include <linux/etherdevice.h>
8#include <linux/ethtool.h>

--- 458 unchanged lines hidden (view full) ---

467 SYS_ATOP, p);
468 ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG);
469}
470
471static int ocelot_port_open(struct net_device *dev)
472{
473 struct ocelot_port *port = netdev_priv(dev);
474 struct ocelot *ocelot = port->ocelot;
1// SPDX-License-Identifier: (GPL-2.0 OR MIT)
2/*
3 * Microsemi Ocelot Switch driver
4 *
5 * Copyright (c) 2017 Microsemi Corporation
6 */
7#include <linux/etherdevice.h>
8#include <linux/ethtool.h>

--- 458 unchanged lines hidden (view full) ---

467 SYS_ATOP, p);
468 ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG);
469}
470
471static int ocelot_port_open(struct net_device *dev)
472{
473 struct ocelot_port *port = netdev_priv(dev);
474 struct ocelot *ocelot = port->ocelot;
475 enum phy_mode phy_mode;
475 int err;
476
477 /* Enable receiving frames on the port, and activate auto-learning of
478 * MAC addresses.
479 */
480 ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_LEARNAUTO |
481 ANA_PORT_PORT_CFG_RECV_ENA |
482 ANA_PORT_PORT_CFG_PORTID_VAL(port->chip_port),
483 ANA_PORT_PORT_CFG, port->chip_port);
484
485 if (port->serdes) {
476 int err;
477
478 /* Enable receiving frames on the port, and activate auto-learning of
479 * MAC addresses.
480 */
481 ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_LEARNAUTO |
482 ANA_PORT_PORT_CFG_RECV_ENA |
483 ANA_PORT_PORT_CFG_PORTID_VAL(port->chip_port),
484 ANA_PORT_PORT_CFG, port->chip_port);
485
486 if (port->serdes) {
486 err = phy_set_mode_ext(port->serdes, PHY_MODE_ETHERNET,
487 port->phy_mode);
487 if (port->phy_mode == PHY_INTERFACE_MODE_SGMII)
488 phy_mode = PHY_MODE_SGMII;
489 else
490 phy_mode = PHY_MODE_QSGMII;
491
492 err = phy_set_mode(port->serdes, phy_mode);
488 if (err) {
489 netdev_err(dev, "Could not set mode of SerDes\n");
490 return err;
491 }
492 }
493
494 err = phy_connect_direct(dev, port->phy, &ocelot_port_adjust_link,
495 port->phy_mode);

--- 787 unchanged lines hidden (view full) ---

1283 addr[2] = mc->ports << 0;
1284 addr[1] = mc->ports << 8;
1285
1286 return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4);
1287}
1288
1289static int ocelot_port_obj_add(struct net_device *dev,
1290 const struct switchdev_obj *obj,
493 if (err) {
494 netdev_err(dev, "Could not set mode of SerDes\n");
495 return err;
496 }
497 }
498
499 err = phy_connect_direct(dev, port->phy, &ocelot_port_adjust_link,
500 port->phy_mode);

--- 787 unchanged lines hidden (view full) ---

1288 addr[2] = mc->ports << 0;
1289 addr[1] = mc->ports << 8;
1290
1291 return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4);
1292}
1293
1294static int ocelot_port_obj_add(struct net_device *dev,
1295 const struct switchdev_obj *obj,
1291 struct switchdev_trans *trans)
1296 struct switchdev_trans *trans,
1297 struct netlink_ext_ack *extack)
1292{
1293 int ret = 0;
1294
1295 switch (obj->id) {
1296 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1297 ret = ocelot_port_obj_add_vlan(dev,
1298 SWITCHDEV_OBJ_PORT_VLAN(obj),
1299 trans);

--- 27 unchanged lines hidden (view full) ---

1327 }
1328
1329 return ret;
1330}
1331
1332static const struct switchdev_ops ocelot_port_switchdev_ops = {
1333 .switchdev_port_attr_get = ocelot_port_attr_get,
1334 .switchdev_port_attr_set = ocelot_port_attr_set,
1298{
1299 int ret = 0;
1300
1301 switch (obj->id) {
1302 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1303 ret = ocelot_port_obj_add_vlan(dev,
1304 SWITCHDEV_OBJ_PORT_VLAN(obj),
1305 trans);

--- 27 unchanged lines hidden (view full) ---

1333 }
1334
1335 return ret;
1336}
1337
1338static const struct switchdev_ops ocelot_port_switchdev_ops = {
1339 .switchdev_port_attr_get = ocelot_port_attr_get,
1340 .switchdev_port_attr_set = ocelot_port_attr_set,
1335 .switchdev_port_obj_add = ocelot_port_obj_add,
1336 .switchdev_port_obj_del = ocelot_port_obj_del,
1337};
1338
1339static int ocelot_port_bridge_join(struct ocelot_port *ocelot_port,
1340 struct net_device *bridge)
1341{
1342 struct ocelot *ocelot = ocelot_port->ocelot;
1343
1344 if (!ocelot->bridge_mask) {

--- 240 unchanged lines hidden (view full) ---

1585 return notifier_from_errno(ret);
1586}
1587
1588struct notifier_block ocelot_netdevice_nb __read_mostly = {
1589 .notifier_call = ocelot_netdevice_event,
1590};
1591EXPORT_SYMBOL(ocelot_netdevice_nb);
1592
1341};
1342
1343static int ocelot_port_bridge_join(struct ocelot_port *ocelot_port,
1344 struct net_device *bridge)
1345{
1346 struct ocelot *ocelot = ocelot_port->ocelot;
1347
1348 if (!ocelot->bridge_mask) {

--- 240 unchanged lines hidden (view full) ---

1589 return notifier_from_errno(ret);
1590}
1591
1592struct notifier_block ocelot_netdevice_nb __read_mostly = {
1593 .notifier_call = ocelot_netdevice_event,
1594};
1595EXPORT_SYMBOL(ocelot_netdevice_nb);
1596
1597static int ocelot_switchdev_blocking_event(struct notifier_block *unused,
1598 unsigned long event, void *ptr)
1599{
1600 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1601 int err;
1602
1603 switch (event) {
1604 /* Blocking events. */
1605 case SWITCHDEV_PORT_OBJ_ADD:
1606 err = switchdev_handle_port_obj_add(dev, ptr,
1607 ocelot_netdevice_dev_check,
1608 ocelot_port_obj_add);
1609 return notifier_from_errno(err);
1610 case SWITCHDEV_PORT_OBJ_DEL:
1611 err = switchdev_handle_port_obj_del(dev, ptr,
1612 ocelot_netdevice_dev_check,
1613 ocelot_port_obj_del);
1614 return notifier_from_errno(err);
1615 }
1616
1617 return NOTIFY_DONE;
1618}
1619
1620struct notifier_block ocelot_switchdev_blocking_nb __read_mostly = {
1621 .notifier_call = ocelot_switchdev_blocking_event,
1622};
1623EXPORT_SYMBOL(ocelot_switchdev_blocking_nb);
1624
1593int ocelot_probe_port(struct ocelot *ocelot, u8 port,
1594 void __iomem *regs,
1595 struct phy_device *phy)
1596{
1597 struct ocelot_port *ocelot_port;
1598 struct net_device *dev;
1599 int err;
1600

--- 184 unchanged lines hidden ---
1625int ocelot_probe_port(struct ocelot *ocelot, u8 port,
1626 void __iomem *regs,
1627 struct phy_device *phy)
1628{
1629 struct ocelot_port *ocelot_port;
1630 struct net_device *dev;
1631 int err;
1632

--- 184 unchanged lines hidden ---