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 --- |