Lines Matching full:sw
93 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw, in prestera_port_find_by_hwid() argument
98 read_lock(&sw->port_list_lock); in prestera_port_find_by_hwid()
99 list_for_each_entry(tmp, &sw->port_list, list) { in prestera_port_find_by_hwid()
105 read_unlock(&sw->port_list_lock); in prestera_port_find_by_hwid()
110 struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id) in prestera_find_port() argument
114 read_lock(&sw->port_list_lock); in prestera_find_port()
115 list_for_each_entry(tmp, &sw->port_list, list) { in prestera_find_port()
121 read_unlock(&sw->port_list_lock); in prestera_find_port()
131 return port ? port->sw : NULL; in prestera_switch_get()
372 struct prestera_switch *sw = port->sw; in prestera_port_sfp_bind() local
378 if (!sw->np) in prestera_port_sfp_bind()
381 of_node_get(sw->np); in prestera_port_sfp_bind()
382 ports = of_find_node_by_name(sw->np, "ports"); in prestera_port_sfp_bind()
389 dev_err(sw->dev->dev, in prestera_port_sfp_bind()
459 if (memcmp(port->sw->base_mac, addr, ETH_ALEN - 1)) in prestera_is_valid_mac_addr()
592 write_lock(&port->sw->port_list_lock); in prestera_port_list_add()
593 list_add(&port->list, &port->sw->port_list); in prestera_port_list_add()
594 write_unlock(&port->sw->port_list_lock); in prestera_port_list_add()
599 write_lock(&port->sw->port_list_lock); in prestera_port_list_del()
601 write_unlock(&port->sw->port_list_lock); in prestera_port_list_del()
604 static int prestera_port_create(struct prestera_switch *sw, u32 id) in prestera_port_create() argument
622 port->sw = sw; in prestera_port_create()
629 dev_err(prestera_dev(sw), "Failed to get port(%u) info\n", id); in prestera_port_create()
641 SET_NETDEV_DEV(dev, sw->dev->dev); in prestera_port_create()
647 dev->mtu = min_t(unsigned int, sw->mtu_max, PRESTERA_MTU_DEFAULT); in prestera_port_create()
648 dev->min_mtu = sw->mtu_min; in prestera_port_create()
649 dev->max_mtu = sw->mtu_max; in prestera_port_create()
653 dev_err(prestera_dev(sw), "Failed to set port(%u) mtu(%d)\n", in prestera_port_create()
663 eth_hw_addr_gen(dev, sw->base_mac, port->fp_id); in prestera_port_create()
667 if (memcmp(dev->dev_addr, sw->base_mac, ETH_ALEN - 1)) { in prestera_port_create()
668 dev_warn(prestera_dev(sw), "Port MAC address wraps for port(%u)\n", id); in prestera_port_create()
669 dev_addr_mod(dev, 0, sw->base_mac, ETH_ALEN - 1); in prestera_port_create()
674 dev_err(prestera_dev(sw), "Failed to set port(%u) mac addr\n", id); in prestera_port_create()
680 dev_err(prestera_dev(sw), "Failed to get port(%u) caps\n", id); in prestera_port_create()
703 dev_err(prestera_dev(sw), in prestera_port_create()
717 dev_err(prestera_dev(sw), in prestera_port_create()
765 static void prestera_destroy_ports(struct prestera_switch *sw) in prestera_destroy_ports() argument
769 list_for_each_entry_safe(port, tmp, &sw->port_list, list) in prestera_destroy_ports()
773 static int prestera_create_ports(struct prestera_switch *sw) in prestera_create_ports() argument
779 for (port_idx = 0; port_idx < sw->port_count; port_idx++) { in prestera_create_ports()
780 err = prestera_port_create(sw, port_idx); in prestera_create_ports()
788 list_for_each_entry_safe(port, tmp, &sw->port_list, list) { in prestera_create_ports()
796 static void prestera_port_handle_event(struct prestera_switch *sw, in prestera_port_handle_event() argument
806 port = prestera_find_port(sw, pevt->port_id); in prestera_port_handle_event()
844 static int prestera_event_handlers_register(struct prestera_switch *sw) in prestera_event_handlers_register() argument
846 return prestera_hw_event_handler_register(sw, PRESTERA_EVENT_TYPE_PORT, in prestera_event_handlers_register()
851 static void prestera_event_handlers_unregister(struct prestera_switch *sw) in prestera_event_handlers_unregister() argument
853 prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_PORT, in prestera_event_handlers_unregister()
857 static int prestera_switch_set_base_mac_addr(struct prestera_switch *sw) in prestera_switch_set_base_mac_addr() argument
861 if (sw->np) in prestera_switch_set_base_mac_addr()
862 ret = of_get_mac_address(sw->np, sw->base_mac); in prestera_switch_set_base_mac_addr()
863 if (!is_valid_ether_addr(sw->base_mac) || ret) { in prestera_switch_set_base_mac_addr()
864 eth_random_addr(sw->base_mac); in prestera_switch_set_base_mac_addr()
865 dev_info(prestera_dev(sw), "using random base mac address\n"); in prestera_switch_set_base_mac_addr()
868 return prestera_hw_switch_mac_set(sw, sw->base_mac); in prestera_switch_set_base_mac_addr()
871 struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id) in prestera_lag_by_id() argument
873 return id < sw->lag_max ? &sw->lags[id] : NULL; in prestera_lag_by_id()
876 static struct prestera_lag *prestera_lag_by_dev(struct prestera_switch *sw, in prestera_lag_by_dev() argument
882 for (id = 0; id < sw->lag_max; id++) { in prestera_lag_by_dev()
883 lag = &sw->lags[id]; in prestera_lag_by_dev()
891 int prestera_lag_id(struct prestera_switch *sw, in prestera_lag_id() argument
898 for (id = 0; id < sw->lag_max; id++) { in prestera_lag_id()
899 lag = prestera_lag_by_id(sw, id); in prestera_lag_id()
915 static struct prestera_lag *prestera_lag_create(struct prestera_switch *sw, in prestera_lag_create() argument
921 for (id = 0; id < sw->lag_max; id++) { in prestera_lag_create()
922 lag = &sw->lags[id]; in prestera_lag_create()
934 static void prestera_lag_destroy(struct prestera_switch *sw, in prestera_lag_destroy() argument
945 struct prestera_switch *sw = port->sw; in prestera_lag_port_add() local
949 lag = prestera_lag_by_dev(sw, lag_dev); in prestera_lag_port_add()
951 lag = prestera_lag_create(sw, lag_dev); in prestera_lag_port_add()
956 if (lag->member_count >= sw->lag_member_max) in prestera_lag_port_add()
962 prestera_lag_destroy(sw, lag); in prestera_lag_port_add()
975 struct prestera_switch *sw = port->sw; in prestera_lag_port_del() local
999 prestera_lag_destroy(sw, lag); in prestera_lag_port_del()
1014 static int prestera_lag_init(struct prestera_switch *sw) in prestera_lag_init() argument
1018 sw->lags = kcalloc(sw->lag_max, sizeof(*sw->lags), GFP_KERNEL); in prestera_lag_init()
1019 if (!sw->lags) in prestera_lag_init()
1022 for (id = 0; id < sw->lag_max; id++) in prestera_lag_init()
1023 sw->lags[id].lag_id = id; in prestera_lag_init()
1028 static void prestera_lag_fini(struct prestera_switch *sw) in prestera_lag_fini() argument
1032 for (idx = 0; idx < sw->lag_max; idx++) in prestera_lag_fini()
1033 WARN_ON(sw->lags[idx].member_count); in prestera_lag_fini()
1035 kfree(sw->lags); in prestera_lag_fini()
1207 prestera_mdb_entry_create(struct prestera_switch *sw, in prestera_mdb_entry_create() argument
1217 flood_domain = prestera_flood_domain_create(sw); in prestera_mdb_entry_create()
1221 mdb_entry->sw = sw; in prestera_mdb_entry_create()
1247 prestera_flood_domain_create(struct prestera_switch *sw) in prestera_flood_domain_create() argument
1255 domain->sw = sw; in prestera_flood_domain_create()
1350 static int prestera_netdev_event_handler_register(struct prestera_switch *sw) in prestera_netdev_event_handler_register() argument
1352 sw->netdev_nb.notifier_call = prestera_netdev_event_handler; in prestera_netdev_event_handler_register()
1354 return register_netdevice_notifier(&sw->netdev_nb); in prestera_netdev_event_handler_register()
1357 static void prestera_netdev_event_handler_unregister(struct prestera_switch *sw) in prestera_netdev_event_handler_unregister() argument
1359 unregister_netdevice_notifier(&sw->netdev_nb); in prestera_netdev_event_handler_unregister()
1362 static int prestera_switch_init(struct prestera_switch *sw) in prestera_switch_init() argument
1366 sw->np = sw->dev->dev->of_node; in prestera_switch_init()
1368 err = prestera_hw_switch_init(sw); in prestera_switch_init()
1370 dev_err(prestera_dev(sw), "Failed to init Switch device\n"); in prestera_switch_init()
1374 rwlock_init(&sw->port_list_lock); in prestera_switch_init()
1375 INIT_LIST_HEAD(&sw->port_list); in prestera_switch_init()
1377 err = prestera_switch_set_base_mac_addr(sw); in prestera_switch_init()
1381 err = prestera_netdev_event_handler_register(sw); in prestera_switch_init()
1385 err = prestera_router_init(sw); in prestera_switch_init()
1389 err = prestera_switchdev_init(sw); in prestera_switch_init()
1393 err = prestera_rxtx_switch_init(sw); in prestera_switch_init()
1397 err = prestera_event_handlers_register(sw); in prestera_switch_init()
1401 err = prestera_counter_init(sw); in prestera_switch_init()
1405 err = prestera_acl_init(sw); in prestera_switch_init()
1409 err = prestera_span_init(sw); in prestera_switch_init()
1413 err = prestera_devlink_traps_register(sw); in prestera_switch_init()
1417 err = prestera_lag_init(sw); in prestera_switch_init()
1421 err = prestera_create_ports(sw); in prestera_switch_init()
1425 prestera_devlink_register(sw); in prestera_switch_init()
1429 prestera_lag_fini(sw); in prestera_switch_init()
1431 prestera_devlink_traps_unregister(sw); in prestera_switch_init()
1433 prestera_span_fini(sw); in prestera_switch_init()
1435 prestera_acl_fini(sw); in prestera_switch_init()
1437 prestera_counter_fini(sw); in prestera_switch_init()
1439 prestera_event_handlers_unregister(sw); in prestera_switch_init()
1441 prestera_rxtx_switch_fini(sw); in prestera_switch_init()
1443 prestera_switchdev_fini(sw); in prestera_switch_init()
1445 prestera_router_fini(sw); in prestera_switch_init()
1447 prestera_netdev_event_handler_unregister(sw); in prestera_switch_init()
1448 prestera_hw_switch_fini(sw); in prestera_switch_init()
1453 static void prestera_switch_fini(struct prestera_switch *sw) in prestera_switch_fini() argument
1455 prestera_devlink_unregister(sw); in prestera_switch_fini()
1456 prestera_destroy_ports(sw); in prestera_switch_fini()
1457 prestera_lag_fini(sw); in prestera_switch_fini()
1458 prestera_devlink_traps_unregister(sw); in prestera_switch_fini()
1459 prestera_span_fini(sw); in prestera_switch_fini()
1460 prestera_acl_fini(sw); in prestera_switch_fini()
1461 prestera_counter_fini(sw); in prestera_switch_fini()
1462 prestera_event_handlers_unregister(sw); in prestera_switch_fini()
1463 prestera_rxtx_switch_fini(sw); in prestera_switch_fini()
1464 prestera_switchdev_fini(sw); in prestera_switch_fini()
1465 prestera_router_fini(sw); in prestera_switch_fini()
1466 prestera_netdev_event_handler_unregister(sw); in prestera_switch_fini()
1467 prestera_hw_switch_fini(sw); in prestera_switch_fini()
1468 of_node_put(sw->np); in prestera_switch_fini()
1473 struct prestera_switch *sw; in prestera_device_register() local
1476 sw = prestera_devlink_alloc(dev); in prestera_device_register()
1477 if (!sw) in prestera_device_register()
1480 dev->priv = sw; in prestera_device_register()
1481 sw->dev = dev; in prestera_device_register()
1483 err = prestera_switch_init(sw); in prestera_device_register()
1485 prestera_devlink_free(sw); in prestera_device_register()
1495 struct prestera_switch *sw = dev->priv; in prestera_device_unregister() local
1497 prestera_switch_fini(sw); in prestera_device_unregister()
1498 prestera_devlink_free(sw); in prestera_device_unregister()