--- zzzz-none-000/linux-4.1.52/net/bridge/br_if.c 2018-05-28 02:26:45.000000000 +0000 +++ bcm63-7530ax-731/linux-4.1.52/net/bridge/br_if.c 2022-03-02 11:37:13.000000000 +0000 @@ -27,6 +27,11 @@ #include "br_private.h" +#if defined(CONFIG_BCM_KF_RUNNER) && (defined(CONFIG_BCM_RDPA_BRIDGE) || defined(CONFIG_BCM_RDPA_BRIDGE_MODULE)) +#include "br_fp.h" +#include "br_fp_hooks.h" +#endif + /* * Determine initial path cost based on speed. * using recommendations from 802.1d standard @@ -245,9 +250,12 @@ spin_unlock_bh(&br->lock); br_ifinfo_notify(RTM_DELLINK, p); - list_del_rcu(&p->list); +#if defined(CONFIG_BCM_KF_INTF_BRG) && defined(CONFIG_BCM_INTF_BRG_ENABLED) + br_port_num_dec(br, p); +#endif /* CONFIG_BCM_KF_INTF_BRG && CONFIG_BCM_INTF_BRG_ENABLED */ + nbp_vlan_flush(p); br_fdb_delete_by_port(br, p, 1); nbp_update_port_count(br); @@ -333,9 +341,19 @@ p->flags = BR_LEARNING | BR_FLOOD; br_init_port(p); br_set_state(p, BR_STATE_DISABLED); + +#if defined(CONFIG_BCM_KF_BRIDGE_MAC_FDB_LIMIT) && defined(CONFIG_BCM_BRIDGE_MAC_FDB_LIMIT) + p->min_port_fdb_entries = 0; + p->max_port_fdb_entries = 0; + p->num_port_fdb_entries = 0; +#endif + br_stp_port_timer_init(p); br_multicast_add_port(p); +#if defined(CONFIG_BCM_KF_BRIDGE_STP) + br_stp_notify_state_port(p); +#endif return p; } @@ -493,6 +511,12 @@ if (err) goto err5; +#if defined(CONFIG_BCM_KF_RUNNER) && (defined(CONFIG_BCM_RDPA_BRIDGE) || defined(CONFIG_BCM_RDPA_BRIDGE_MODULE)) + err = br_fp_hook(BR_FP_PORT_ADD, br, dev); + if (err) + goto err6; +#endif + dev_disable_lro(dev); list_add_rcu(&p->list, &br->port_list); @@ -501,6 +525,10 @@ netdev_update_features(br->dev); +#if defined(CONFIG_BCM_KF_INTF_BRG) && defined(CONFIG_BCM_INTF_BRG_ENABLED) + br_port_num_inc(br, p); +#endif /* CONFIG_BCM_KF_INTF_BRG && CONFIG_BCM_INTF_BRG_ENABLED */ + if (br->dev->needed_headroom < dev->needed_headroom) br->dev->needed_headroom = dev->needed_headroom; @@ -529,6 +557,11 @@ return 0; +#if defined(CONFIG_BCM_KF_RUNNER) && (defined(CONFIG_BCM_RDPA_BRIDGE) || defined(CONFIG_BCM_RDPA_BRIDGE_MODULE)) +err6: + netdev_upper_dev_unlink(dev, br->dev); +#endif + err5: dev->priv_flags &= ~IFF_BRIDGE_PORT; netdev_rx_handler_unregister(dev); @@ -557,6 +590,15 @@ if (!p || p->br != br) return -EINVAL; +#if defined(CONFIG_BCM_KF_BRIDGE_MAC_FDB_LIMIT) && defined(CONFIG_BCM_BRIDGE_MAC_FDB_LIMIT) + /* Disable min limit per port in advance */ + (void)br_set_fdb_limit(br, p, 1, 1, 0); +#endif + +#if defined(CONFIG_BCM_KF_RUNNER) && (defined(CONFIG_BCM_RDPA_BRIDGE) || defined(CONFIG_BCM_RDPA_BRIDGE_MODULE)) + br_fp_hook(BR_FP_PORT_REMOVE, br, dev); +#endif + /* Since more than one interface can be attached to a bridge, * there still maybe an alternate path for netconsole to use; * therefore there is no reason for a NETDEV_RELEASE event.