Lines Matching full:ds
19 static unsigned int dsa_switch_fastest_ageing_time(struct dsa_switch *ds, in dsa_switch_fastest_ageing_time() argument
24 for (i = 0; i < ds->num_ports; ++i) { in dsa_switch_fastest_ageing_time()
25 struct dsa_port *dp = &ds->ports[i]; in dsa_switch_fastest_ageing_time()
34 static int dsa_switch_ageing_time(struct dsa_switch *ds, in dsa_switch_ageing_time() argument
41 if (ds->ageing_time_min && ageing_time < ds->ageing_time_min) in dsa_switch_ageing_time()
43 if (ds->ageing_time_max && ageing_time > ds->ageing_time_max) in dsa_switch_ageing_time()
49 ageing_time = dsa_switch_fastest_ageing_time(ds, ageing_time); in dsa_switch_ageing_time()
51 if (ds->ops->set_ageing_time) in dsa_switch_ageing_time()
52 return ds->ops->set_ageing_time(ds, ageing_time); in dsa_switch_ageing_time()
57 static int dsa_switch_bridge_join(struct dsa_switch *ds, in dsa_switch_bridge_join() argument
60 if (ds->index == info->sw_index && ds->ops->port_bridge_join) in dsa_switch_bridge_join()
61 return ds->ops->port_bridge_join(ds, info->port, info->br); in dsa_switch_bridge_join()
63 if (ds->index != info->sw_index && ds->ops->crosschip_bridge_join) in dsa_switch_bridge_join()
64 return ds->ops->crosschip_bridge_join(ds, info->sw_index, in dsa_switch_bridge_join()
70 static int dsa_switch_bridge_leave(struct dsa_switch *ds, in dsa_switch_bridge_leave() argument
73 if (ds->index == info->sw_index && ds->ops->port_bridge_leave) in dsa_switch_bridge_leave()
74 ds->ops->port_bridge_leave(ds, info->port, info->br); in dsa_switch_bridge_leave()
76 if (ds->index != info->sw_index && ds->ops->crosschip_bridge_leave) in dsa_switch_bridge_leave()
77 ds->ops->crosschip_bridge_leave(ds, info->sw_index, info->port, in dsa_switch_bridge_leave()
83 static int dsa_switch_fdb_add(struct dsa_switch *ds, in dsa_switch_fdb_add() argument
86 int port = dsa_towards_port(ds, info->sw_index, info->port); in dsa_switch_fdb_add()
88 if (!ds->ops->port_fdb_add) in dsa_switch_fdb_add()
91 return ds->ops->port_fdb_add(ds, port, info->addr, info->vid); in dsa_switch_fdb_add()
94 static int dsa_switch_fdb_del(struct dsa_switch *ds, in dsa_switch_fdb_del() argument
97 int port = dsa_towards_port(ds, info->sw_index, info->port); in dsa_switch_fdb_del()
99 if (!ds->ops->port_fdb_del) in dsa_switch_fdb_del()
102 return ds->ops->port_fdb_del(ds, port, info->addr, info->vid); in dsa_switch_fdb_del()
106 dsa_switch_mdb_prepare_bitmap(struct dsa_switch *ds, in dsa_switch_mdb_prepare_bitmap() argument
112 if (!ds->ops->port_mdb_prepare || !ds->ops->port_mdb_add) in dsa_switch_mdb_prepare_bitmap()
115 for_each_set_bit(port, bitmap, ds->num_ports) { in dsa_switch_mdb_prepare_bitmap()
116 err = ds->ops->port_mdb_prepare(ds, port, mdb); in dsa_switch_mdb_prepare_bitmap()
124 static void dsa_switch_mdb_add_bitmap(struct dsa_switch *ds, in dsa_switch_mdb_add_bitmap() argument
130 if (!ds->ops->port_mdb_add) in dsa_switch_mdb_add_bitmap()
133 for_each_set_bit(port, bitmap, ds->num_ports) in dsa_switch_mdb_add_bitmap()
134 ds->ops->port_mdb_add(ds, port, mdb); in dsa_switch_mdb_add_bitmap()
137 static int dsa_switch_mdb_add(struct dsa_switch *ds, in dsa_switch_mdb_add() argument
145 bitmap_zero(ds->bitmap, ds->num_ports); in dsa_switch_mdb_add()
146 if (ds->index == info->sw_index) in dsa_switch_mdb_add()
147 set_bit(info->port, ds->bitmap); in dsa_switch_mdb_add()
148 for (port = 0; port < ds->num_ports; port++) in dsa_switch_mdb_add()
149 if (dsa_is_dsa_port(ds, port)) in dsa_switch_mdb_add()
150 set_bit(port, ds->bitmap); in dsa_switch_mdb_add()
153 return dsa_switch_mdb_prepare_bitmap(ds, mdb, ds->bitmap); in dsa_switch_mdb_add()
155 dsa_switch_mdb_add_bitmap(ds, mdb, ds->bitmap); in dsa_switch_mdb_add()
160 static int dsa_switch_mdb_del(struct dsa_switch *ds, in dsa_switch_mdb_del() argument
165 if (!ds->ops->port_mdb_del) in dsa_switch_mdb_del()
168 if (ds->index == info->sw_index) in dsa_switch_mdb_del()
169 return ds->ops->port_mdb_del(ds, info->port, mdb); in dsa_switch_mdb_del()
175 dsa_switch_vlan_prepare_bitmap(struct dsa_switch *ds, in dsa_switch_vlan_prepare_bitmap() argument
181 if (!ds->ops->port_vlan_prepare || !ds->ops->port_vlan_add) in dsa_switch_vlan_prepare_bitmap()
184 for_each_set_bit(port, bitmap, ds->num_ports) { in dsa_switch_vlan_prepare_bitmap()
185 err = ds->ops->port_vlan_prepare(ds, port, vlan); in dsa_switch_vlan_prepare_bitmap()
194 dsa_switch_vlan_add_bitmap(struct dsa_switch *ds, in dsa_switch_vlan_add_bitmap() argument
200 for_each_set_bit(port, bitmap, ds->num_ports) in dsa_switch_vlan_add_bitmap()
201 ds->ops->port_vlan_add(ds, port, vlan); in dsa_switch_vlan_add_bitmap()
204 static int dsa_switch_vlan_add(struct dsa_switch *ds, in dsa_switch_vlan_add() argument
212 bitmap_zero(ds->bitmap, ds->num_ports); in dsa_switch_vlan_add()
213 if (ds->index == info->sw_index) in dsa_switch_vlan_add()
214 set_bit(info->port, ds->bitmap); in dsa_switch_vlan_add()
215 for (port = 0; port < ds->num_ports; port++) in dsa_switch_vlan_add()
216 if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) in dsa_switch_vlan_add()
217 set_bit(port, ds->bitmap); in dsa_switch_vlan_add()
220 return dsa_switch_vlan_prepare_bitmap(ds, vlan, ds->bitmap); in dsa_switch_vlan_add()
222 dsa_switch_vlan_add_bitmap(ds, vlan, ds->bitmap); in dsa_switch_vlan_add()
227 static int dsa_switch_vlan_del(struct dsa_switch *ds, in dsa_switch_vlan_del() argument
232 if (!ds->ops->port_vlan_del) in dsa_switch_vlan_del()
235 if (ds->index == info->sw_index) in dsa_switch_vlan_del()
236 return ds->ops->port_vlan_del(ds, info->port, vlan); in dsa_switch_vlan_del()
244 struct dsa_switch *ds = container_of(nb, struct dsa_switch, nb); in dsa_switch_event() local
249 err = dsa_switch_ageing_time(ds, info); in dsa_switch_event()
252 err = dsa_switch_bridge_join(ds, info); in dsa_switch_event()
255 err = dsa_switch_bridge_leave(ds, info); in dsa_switch_event()
258 err = dsa_switch_fdb_add(ds, info); in dsa_switch_event()
261 err = dsa_switch_fdb_del(ds, info); in dsa_switch_event()
264 err = dsa_switch_mdb_add(ds, info); in dsa_switch_event()
267 err = dsa_switch_mdb_del(ds, info); in dsa_switch_event()
270 err = dsa_switch_vlan_add(ds, info); in dsa_switch_event()
273 err = dsa_switch_vlan_del(ds, info); in dsa_switch_event()
285 dev_dbg(ds->dev, "breaking chain for DSA event %lu (%d)\n", in dsa_switch_event()
291 int dsa_switch_register_notifier(struct dsa_switch *ds) in dsa_switch_register_notifier() argument
293 ds->nb.notifier_call = dsa_switch_event; in dsa_switch_register_notifier()
295 return raw_notifier_chain_register(&ds->dst->nh, &ds->nb); in dsa_switch_register_notifier()
298 void dsa_switch_unregister_notifier(struct dsa_switch *ds) in dsa_switch_unregister_notifier() argument
302 err = raw_notifier_chain_unregister(&ds->dst->nh, &ds->nb); in dsa_switch_unregister_notifier()
304 dev_err(ds->dev, "failed to unregister notifier (%d)\n", err); in dsa_switch_unregister_notifier()