Lines Matching full:sw

54 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,  in prestera_port_find_by_hwid()  argument
59 read_lock(&sw->port_list_lock); in prestera_port_find_by_hwid()
60 list_for_each_entry(port, &sw->port_list, list) { in prestera_port_find_by_hwid()
64 read_unlock(&sw->port_list_lock); in prestera_port_find_by_hwid()
69 struct prestera_port *prestera_find_port(struct prestera_switch *sw, u32 id) in prestera_find_port() argument
73 read_lock(&sw->port_list_lock); in prestera_find_port()
74 list_for_each_entry(port, &sw->port_list, list) { in prestera_find_port()
78 read_unlock(&sw->port_list_lock); in prestera_find_port()
120 if (memcmp(port->sw->base_mac, addr, ETH_ALEN - 1)) in prestera_is_valid_mac_addr()
277 write_lock(&port->sw->port_list_lock); in prestera_port_list_add()
278 list_add(&port->list, &port->sw->port_list); in prestera_port_list_add()
279 write_unlock(&port->sw->port_list_lock); in prestera_port_list_add()
284 write_lock(&port->sw->port_list_lock); in prestera_port_list_del()
286 write_unlock(&port->sw->port_list_lock); in prestera_port_list_del()
289 static int prestera_port_create(struct prestera_switch *sw, u32 id) in prestera_port_create() argument
306 port->sw = sw; in prestera_port_create()
311 dev_err(prestera_dev(sw), "Failed to get port(%u) info\n", id); in prestera_port_create()
325 dev->mtu = min_t(unsigned int, sw->mtu_max, PRESTERA_MTU_DEFAULT); in prestera_port_create()
326 dev->min_mtu = sw->mtu_min; in prestera_port_create()
327 dev->max_mtu = sw->mtu_max; in prestera_port_create()
331 dev_err(prestera_dev(sw), "Failed to set port(%u) mtu(%d)\n", in prestera_port_create()
344 memcpy(dev->dev_addr, sw->base_mac, dev->addr_len - 1); in prestera_port_create()
349 dev_err(prestera_dev(sw), "Failed to set port(%u) mac addr\n", id); in prestera_port_create()
355 dev_err(prestera_dev(sw), "Failed to get port(%u) caps\n", id); in prestera_port_create()
365 dev_err(prestera_dev(sw), "Failed to set port(%u) down\n", id); in prestera_port_create()
408 static void prestera_destroy_ports(struct prestera_switch *sw) in prestera_destroy_ports() argument
412 list_for_each_entry_safe(port, tmp, &sw->port_list, list) in prestera_destroy_ports()
416 static int prestera_create_ports(struct prestera_switch *sw) in prestera_create_ports() argument
422 for (port_idx = 0; port_idx < sw->port_count; port_idx++) { in prestera_create_ports()
423 err = prestera_port_create(sw, port_idx); in prestera_create_ports()
431 list_for_each_entry_safe(port, tmp, &sw->port_list, list) in prestera_create_ports()
437 static void prestera_port_handle_event(struct prestera_switch *sw, in prestera_port_handle_event() argument
443 port = prestera_find_port(sw, evt->port_evt.port_id); in prestera_port_handle_event()
463 static int prestera_event_handlers_register(struct prestera_switch *sw) in prestera_event_handlers_register() argument
465 return prestera_hw_event_handler_register(sw, PRESTERA_EVENT_TYPE_PORT, in prestera_event_handlers_register()
470 static void prestera_event_handlers_unregister(struct prestera_switch *sw) in prestera_event_handlers_unregister() argument
472 prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_PORT, in prestera_event_handlers_unregister()
476 static int prestera_switch_set_base_mac_addr(struct prestera_switch *sw) in prestera_switch_set_base_mac_addr() argument
485 ret = of_get_mac_address(base_mac_np, sw->base_mac); in prestera_switch_set_base_mac_addr()
487 eth_random_addr(sw->base_mac); in prestera_switch_set_base_mac_addr()
488 dev_info(prestera_dev(sw), "using random base mac address\n"); in prestera_switch_set_base_mac_addr()
492 return prestera_hw_switch_mac_set(sw, sw->base_mac); in prestera_switch_set_base_mac_addr()
495 struct prestera_lag *prestera_lag_by_id(struct prestera_switch *sw, u16 id) in prestera_lag_by_id() argument
497 return id < sw->lag_max ? &sw->lags[id] : NULL; in prestera_lag_by_id()
500 static struct prestera_lag *prestera_lag_by_dev(struct prestera_switch *sw, in prestera_lag_by_dev() argument
506 for (id = 0; id < sw->lag_max; id++) { in prestera_lag_by_dev()
507 lag = &sw->lags[id]; in prestera_lag_by_dev()
515 static struct prestera_lag *prestera_lag_create(struct prestera_switch *sw, in prestera_lag_create() argument
521 for (id = 0; id < sw->lag_max; id++) { in prestera_lag_create()
522 lag = &sw->lags[id]; in prestera_lag_create()
534 static void prestera_lag_destroy(struct prestera_switch *sw, in prestera_lag_destroy() argument
545 struct prestera_switch *sw = port->sw; in prestera_lag_port_add() local
549 lag = prestera_lag_by_dev(sw, lag_dev); in prestera_lag_port_add()
551 lag = prestera_lag_create(sw, lag_dev); in prestera_lag_port_add()
556 if (lag->member_count >= sw->lag_member_max) in prestera_lag_port_add()
562 prestera_lag_destroy(sw, lag); in prestera_lag_port_add()
575 struct prestera_switch *sw = port->sw; in prestera_lag_port_del() local
599 prestera_lag_destroy(sw, lag); in prestera_lag_port_del()
614 static int prestera_lag_init(struct prestera_switch *sw) in prestera_lag_init() argument
618 sw->lags = kcalloc(sw->lag_max, sizeof(*sw->lags), GFP_KERNEL); in prestera_lag_init()
619 if (!sw->lags) in prestera_lag_init()
622 for (id = 0; id < sw->lag_max; id++) in prestera_lag_init()
623 sw->lags[id].lag_id = id; in prestera_lag_init()
628 static void prestera_lag_fini(struct prestera_switch *sw) in prestera_lag_fini() argument
632 for (idx = 0; idx < sw->lag_max; idx++) in prestera_lag_fini()
633 WARN_ON(sw->lags[idx].member_count); in prestera_lag_fini()
635 kfree(sw->lags); in prestera_lag_fini()
801 static int prestera_netdev_event_handler_register(struct prestera_switch *sw) in prestera_netdev_event_handler_register() argument
803 sw->netdev_nb.notifier_call = prestera_netdev_event_handler; in prestera_netdev_event_handler_register()
805 return register_netdevice_notifier(&sw->netdev_nb); in prestera_netdev_event_handler_register()
808 static void prestera_netdev_event_handler_unregister(struct prestera_switch *sw) in prestera_netdev_event_handler_unregister() argument
810 unregister_netdevice_notifier(&sw->netdev_nb); in prestera_netdev_event_handler_unregister()
813 static int prestera_switch_init(struct prestera_switch *sw) in prestera_switch_init() argument
817 err = prestera_hw_switch_init(sw); in prestera_switch_init()
819 dev_err(prestera_dev(sw), "Failed to init Switch device\n"); in prestera_switch_init()
823 rwlock_init(&sw->port_list_lock); in prestera_switch_init()
824 INIT_LIST_HEAD(&sw->port_list); in prestera_switch_init()
826 err = prestera_switch_set_base_mac_addr(sw); in prestera_switch_init()
830 err = prestera_netdev_event_handler_register(sw); in prestera_switch_init()
834 err = prestera_switchdev_init(sw); in prestera_switch_init()
838 err = prestera_rxtx_switch_init(sw); in prestera_switch_init()
842 err = prestera_event_handlers_register(sw); in prestera_switch_init()
846 err = prestera_acl_init(sw); in prestera_switch_init()
850 err = prestera_span_init(sw); in prestera_switch_init()
854 err = prestera_devlink_register(sw); in prestera_switch_init()
858 err = prestera_lag_init(sw); in prestera_switch_init()
862 err = prestera_create_ports(sw); in prestera_switch_init()
869 prestera_lag_fini(sw); in prestera_switch_init()
871 prestera_devlink_unregister(sw); in prestera_switch_init()
873 prestera_span_fini(sw); in prestera_switch_init()
875 prestera_acl_fini(sw); in prestera_switch_init()
877 prestera_event_handlers_unregister(sw); in prestera_switch_init()
879 prestera_rxtx_switch_fini(sw); in prestera_switch_init()
881 prestera_switchdev_fini(sw); in prestera_switch_init()
883 prestera_netdev_event_handler_unregister(sw); in prestera_switch_init()
884 prestera_hw_switch_fini(sw); in prestera_switch_init()
889 static void prestera_switch_fini(struct prestera_switch *sw) in prestera_switch_fini() argument
891 prestera_destroy_ports(sw); in prestera_switch_fini()
892 prestera_lag_fini(sw); in prestera_switch_fini()
893 prestera_devlink_unregister(sw); in prestera_switch_fini()
894 prestera_span_fini(sw); in prestera_switch_fini()
895 prestera_acl_fini(sw); in prestera_switch_fini()
896 prestera_event_handlers_unregister(sw); in prestera_switch_fini()
897 prestera_rxtx_switch_fini(sw); in prestera_switch_fini()
898 prestera_switchdev_fini(sw); in prestera_switch_fini()
899 prestera_netdev_event_handler_unregister(sw); in prestera_switch_fini()
900 prestera_hw_switch_fini(sw); in prestera_switch_fini()
905 struct prestera_switch *sw; in prestera_device_register() local
908 sw = prestera_devlink_alloc(dev); in prestera_device_register()
909 if (!sw) in prestera_device_register()
912 dev->priv = sw; in prestera_device_register()
913 sw->dev = dev; in prestera_device_register()
915 err = prestera_switch_init(sw); in prestera_device_register()
917 prestera_devlink_free(sw); in prestera_device_register()
927 struct prestera_switch *sw = dev->priv; in prestera_device_unregister() local
929 prestera_switch_fini(sw); in prestera_device_unregister()
930 prestera_devlink_free(sw); in prestera_device_unregister()