Lines Matching refs:ds
17 static unsigned int dsa_switch_fastest_ageing_time(struct dsa_switch *ds, in dsa_switch_fastest_ageing_time() argument
22 for (i = 0; i < ds->num_ports; ++i) { in dsa_switch_fastest_ageing_time()
23 struct dsa_port *dp = &ds->ports[i]; in dsa_switch_fastest_ageing_time()
32 static int dsa_switch_ageing_time(struct dsa_switch *ds, in dsa_switch_ageing_time() argument
39 if (ds->ageing_time_min && ageing_time < ds->ageing_time_min) in dsa_switch_ageing_time()
41 if (ds->ageing_time_max && ageing_time > ds->ageing_time_max) in dsa_switch_ageing_time()
47 ageing_time = dsa_switch_fastest_ageing_time(ds, ageing_time); in dsa_switch_ageing_time()
49 if (ds->ops->set_ageing_time) in dsa_switch_ageing_time()
50 return ds->ops->set_ageing_time(ds, ageing_time); in dsa_switch_ageing_time()
55 static int dsa_switch_bridge_join(struct dsa_switch *ds, in dsa_switch_bridge_join() argument
58 if (ds->index == info->sw_index && ds->ops->port_bridge_join) in dsa_switch_bridge_join()
59 return ds->ops->port_bridge_join(ds, info->port, info->br); in dsa_switch_bridge_join()
61 if (ds->index != info->sw_index && ds->ops->crosschip_bridge_join) in dsa_switch_bridge_join()
62 return ds->ops->crosschip_bridge_join(ds, info->sw_index, in dsa_switch_bridge_join()
68 static int dsa_switch_bridge_leave(struct dsa_switch *ds, in dsa_switch_bridge_leave() argument
74 if (ds->index == info->sw_index && ds->ops->port_bridge_leave) in dsa_switch_bridge_leave()
75 ds->ops->port_bridge_leave(ds, info->port, info->br); in dsa_switch_bridge_leave()
77 if (ds->index != info->sw_index && ds->ops->crosschip_bridge_leave) in dsa_switch_bridge_leave()
78 ds->ops->crosschip_bridge_leave(ds, info->sw_index, info->port, in dsa_switch_bridge_leave()
88 if (unset_vlan_filtering && ds->vlan_filtering_is_global) { in dsa_switch_bridge_leave()
89 for (i = 0; i < ds->num_ports; i++) { in dsa_switch_bridge_leave()
92 if (dsa_to_port(ds, i)->bridge_dev == info->br) { in dsa_switch_bridge_leave()
101 err = dsa_port_vlan_filtering(&ds->ports[info->port], in dsa_switch_bridge_leave()
109 static int dsa_switch_fdb_add(struct dsa_switch *ds, in dsa_switch_fdb_add() argument
112 int port = dsa_towards_port(ds, info->sw_index, info->port); in dsa_switch_fdb_add()
114 if (!ds->ops->port_fdb_add) in dsa_switch_fdb_add()
117 return ds->ops->port_fdb_add(ds, port, info->addr, info->vid); in dsa_switch_fdb_add()
120 static int dsa_switch_fdb_del(struct dsa_switch *ds, in dsa_switch_fdb_del() argument
123 int port = dsa_towards_port(ds, info->sw_index, info->port); in dsa_switch_fdb_del()
125 if (!ds->ops->port_fdb_del) in dsa_switch_fdb_del()
128 return ds->ops->port_fdb_del(ds, port, info->addr, info->vid); in dsa_switch_fdb_del()
131 static bool dsa_switch_mdb_match(struct dsa_switch *ds, int port, in dsa_switch_mdb_match() argument
134 if (ds->index == info->sw_index && port == info->port) in dsa_switch_mdb_match()
137 if (dsa_is_dsa_port(ds, port)) in dsa_switch_mdb_match()
143 static int dsa_switch_mdb_prepare(struct dsa_switch *ds, in dsa_switch_mdb_prepare() argument
148 if (!ds->ops->port_mdb_prepare || !ds->ops->port_mdb_add) in dsa_switch_mdb_prepare()
151 for (port = 0; port < ds->num_ports; port++) { in dsa_switch_mdb_prepare()
152 if (dsa_switch_mdb_match(ds, port, info)) { in dsa_switch_mdb_prepare()
153 err = ds->ops->port_mdb_prepare(ds, port, info->mdb); in dsa_switch_mdb_prepare()
162 static int dsa_switch_mdb_add(struct dsa_switch *ds, in dsa_switch_mdb_add() argument
168 return dsa_switch_mdb_prepare(ds, info); in dsa_switch_mdb_add()
170 if (!ds->ops->port_mdb_add) in dsa_switch_mdb_add()
173 for (port = 0; port < ds->num_ports; port++) in dsa_switch_mdb_add()
174 if (dsa_switch_mdb_match(ds, port, info)) in dsa_switch_mdb_add()
175 ds->ops->port_mdb_add(ds, port, info->mdb); in dsa_switch_mdb_add()
180 static int dsa_switch_mdb_del(struct dsa_switch *ds, in dsa_switch_mdb_del() argument
183 if (!ds->ops->port_mdb_del) in dsa_switch_mdb_del()
186 if (ds->index == info->sw_index) in dsa_switch_mdb_del()
187 return ds->ops->port_mdb_del(ds, info->port, info->mdb); in dsa_switch_mdb_del()
207 static int dsa_port_vlan_check(struct dsa_switch *ds, int port, in dsa_port_vlan_check() argument
210 const struct dsa_port *dp = dsa_to_port(ds, port); in dsa_port_vlan_check()
229 static bool dsa_switch_vlan_match(struct dsa_switch *ds, int port, in dsa_switch_vlan_match() argument
232 if (ds->index == info->sw_index && port == info->port) in dsa_switch_vlan_match()
235 if (dsa_is_dsa_port(ds, port)) in dsa_switch_vlan_match()
241 static int dsa_switch_vlan_prepare(struct dsa_switch *ds, in dsa_switch_vlan_prepare() argument
246 if (!ds->ops->port_vlan_prepare || !ds->ops->port_vlan_add) in dsa_switch_vlan_prepare()
249 for (port = 0; port < ds->num_ports; port++) { in dsa_switch_vlan_prepare()
250 if (dsa_switch_vlan_match(ds, port, info)) { in dsa_switch_vlan_prepare()
251 err = dsa_port_vlan_check(ds, port, info->vlan); in dsa_switch_vlan_prepare()
255 err = ds->ops->port_vlan_prepare(ds, port, info->vlan); in dsa_switch_vlan_prepare()
264 static int dsa_switch_vlan_add(struct dsa_switch *ds, in dsa_switch_vlan_add() argument
270 return dsa_switch_vlan_prepare(ds, info); in dsa_switch_vlan_add()
272 if (!ds->ops->port_vlan_add) in dsa_switch_vlan_add()
275 for (port = 0; port < ds->num_ports; port++) in dsa_switch_vlan_add()
276 if (dsa_switch_vlan_match(ds, port, info)) in dsa_switch_vlan_add()
277 ds->ops->port_vlan_add(ds, port, info->vlan); in dsa_switch_vlan_add()
282 static int dsa_switch_vlan_del(struct dsa_switch *ds, in dsa_switch_vlan_del() argument
285 if (!ds->ops->port_vlan_del) in dsa_switch_vlan_del()
288 if (ds->index == info->sw_index) in dsa_switch_vlan_del()
289 return ds->ops->port_vlan_del(ds, info->port, info->vlan); in dsa_switch_vlan_del()
300 struct dsa_switch *ds = container_of(nb, struct dsa_switch, nb); in dsa_switch_event() local
305 err = dsa_switch_ageing_time(ds, info); in dsa_switch_event()
308 err = dsa_switch_bridge_join(ds, info); in dsa_switch_event()
311 err = dsa_switch_bridge_leave(ds, info); in dsa_switch_event()
314 err = dsa_switch_fdb_add(ds, info); in dsa_switch_event()
317 err = dsa_switch_fdb_del(ds, info); in dsa_switch_event()
320 err = dsa_switch_mdb_add(ds, info); in dsa_switch_event()
323 err = dsa_switch_mdb_del(ds, info); in dsa_switch_event()
326 err = dsa_switch_vlan_add(ds, info); in dsa_switch_event()
329 err = dsa_switch_vlan_del(ds, info); in dsa_switch_event()
341 dev_dbg(ds->dev, "breaking chain for DSA event %lu (%d)\n", in dsa_switch_event()
347 int dsa_switch_register_notifier(struct dsa_switch *ds) in dsa_switch_register_notifier() argument
349 ds->nb.notifier_call = dsa_switch_event; in dsa_switch_register_notifier()
351 return raw_notifier_chain_register(&ds->dst->nh, &ds->nb); in dsa_switch_register_notifier()
354 void dsa_switch_unregister_notifier(struct dsa_switch *ds) in dsa_switch_unregister_notifier() argument
358 err = raw_notifier_chain_unregister(&ds->dst->nh, &ds->nb); in dsa_switch_unregister_notifier()
360 dev_err(ds->dev, "failed to unregister notifier (%d)\n", err); in dsa_switch_unregister_notifier()