Lines Matching full:smi
2 /* Realtek SMI library helpers for the RTL8366x variants
14 #include "realtek-smi-core.h"
16 int rtl8366_mc_is_used(struct realtek_smi *smi, int mc_index, int *used) in rtl8366_mc_is_used() argument
22 for (i = 0; i < smi->num_ports; i++) { in rtl8366_mc_is_used()
25 ret = smi->ops->get_mc_index(smi, i, &index); in rtl8366_mc_is_used()
41 * @smi: the Realtek SMI device instance
47 static int rtl8366_obtain_mc(struct realtek_smi *smi, int vid, in rtl8366_obtain_mc() argument
55 for (i = 0; i < smi->num_vlan_mc; i++) { in rtl8366_obtain_mc()
56 ret = smi->ops->get_vlan_mc(smi, i, vlanmc); in rtl8366_obtain_mc()
58 dev_err(smi->dev, "error searching for VLAN MC %d for VID %d\n", in rtl8366_obtain_mc()
68 for (i = 0; i < smi->num_vlan_mc; i++) { in rtl8366_obtain_mc()
69 ret = smi->ops->get_vlan_mc(smi, i, vlanmc); in rtl8366_obtain_mc()
71 dev_err(smi->dev, "error searching for VLAN MC %d for VID %d\n", in rtl8366_obtain_mc()
78 ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k); in rtl8366_obtain_mc()
80 dev_err(smi->dev, "error looking for 4K VLAN MC %d for VID %d\n", in rtl8366_obtain_mc()
89 ret = smi->ops->set_vlan_mc(smi, i, vlanmc); in rtl8366_obtain_mc()
91 dev_err(smi->dev, "unable to set/update VLAN MC %d for VID %d\n", in rtl8366_obtain_mc()
96 dev_dbg(smi->dev, "created new MC at index %d for VID %d\n", in rtl8366_obtain_mc()
103 for (i = 0; i < smi->num_vlan_mc; i++) { in rtl8366_obtain_mc()
106 ret = rtl8366_mc_is_used(smi, i, &used); in rtl8366_obtain_mc()
112 ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k); in rtl8366_obtain_mc()
120 ret = smi->ops->set_vlan_mc(smi, i, vlanmc); in rtl8366_obtain_mc()
122 dev_err(smi->dev, "unable to set/update VLAN MC %d for VID %d\n", in rtl8366_obtain_mc()
126 dev_dbg(smi->dev, "recycled MC at index %i for VID %d\n", in rtl8366_obtain_mc()
132 dev_err(smi->dev, "all VLAN member configurations are in use\n"); in rtl8366_obtain_mc()
136 int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member, in rtl8366_set_vlan() argument
144 if (!smi->ops->is_vlan_valid(smi, vid)) in rtl8366_set_vlan()
147 dev_dbg(smi->dev, in rtl8366_set_vlan()
152 ret = smi->ops->get_vlan_4k(smi, vid, &vlan4k); in rtl8366_set_vlan()
159 ret = smi->ops->set_vlan_4k(smi, &vlan4k); in rtl8366_set_vlan()
163 dev_dbg(smi->dev, in rtl8366_set_vlan()
168 ret = rtl8366_obtain_mc(smi, vid, &vlanmc); in rtl8366_set_vlan()
179 ret = smi->ops->set_vlan_mc(smi, mc, &vlanmc); in rtl8366_set_vlan()
181 dev_err(smi->dev, "failed to commit changes to VLAN MC index %d for VID %d\n", in rtl8366_set_vlan()
184 dev_dbg(smi->dev, in rtl8366_set_vlan()
192 int rtl8366_set_pvid(struct realtek_smi *smi, unsigned int port, in rtl8366_set_pvid() argument
199 if (!smi->ops->is_vlan_valid(smi, vid)) in rtl8366_set_pvid()
203 ret = rtl8366_obtain_mc(smi, vid, &vlanmc); in rtl8366_set_pvid()
208 ret = smi->ops->set_mc_index(smi, port, mc); in rtl8366_set_pvid()
210 dev_err(smi->dev, "set PVID: failed to set MC index %d for port %d\n", in rtl8366_set_pvid()
215 dev_dbg(smi->dev, "set PVID: the PVID for port %d set to %d using existing MC index %d\n", in rtl8366_set_pvid()
222 int rtl8366_enable_vlan4k(struct realtek_smi *smi, bool enable) in rtl8366_enable_vlan4k() argument
232 ret = smi->ops->enable_vlan(smi, true); in rtl8366_enable_vlan4k()
236 smi->vlan_enabled = true; in rtl8366_enable_vlan4k()
239 ret = smi->ops->enable_vlan4k(smi, enable); in rtl8366_enable_vlan4k()
243 smi->vlan4k_enabled = enable; in rtl8366_enable_vlan4k()
248 int rtl8366_enable_vlan(struct realtek_smi *smi, bool enable) in rtl8366_enable_vlan() argument
252 ret = smi->ops->enable_vlan(smi, enable); in rtl8366_enable_vlan()
256 smi->vlan_enabled = enable; in rtl8366_enable_vlan()
262 smi->vlan4k_enabled = false; in rtl8366_enable_vlan()
263 ret = smi->ops->enable_vlan4k(smi, false); in rtl8366_enable_vlan()
270 int rtl8366_reset_vlan(struct realtek_smi *smi) in rtl8366_reset_vlan() argument
276 rtl8366_enable_vlan(smi, false); in rtl8366_reset_vlan()
277 rtl8366_enable_vlan4k(smi, false); in rtl8366_reset_vlan()
285 for (i = 0; i < smi->num_vlan_mc; i++) { in rtl8366_reset_vlan()
286 ret = smi->ops->set_vlan_mc(smi, i, &vlanmc); in rtl8366_reset_vlan()
295 int rtl8366_init_vlan(struct realtek_smi *smi) in rtl8366_init_vlan() argument
300 ret = rtl8366_reset_vlan(smi); in rtl8366_init_vlan()
307 for (port = 0; port < smi->num_ports; port++) { in rtl8366_init_vlan()
310 if (port == smi->cpu_port) in rtl8366_init_vlan()
314 mask = GENMASK((int)smi->num_ports - 1, 0); in rtl8366_init_vlan()
319 mask = BIT(port) | BIT(smi->cpu_port); in rtl8366_init_vlan()
326 dev_info(smi->dev, "VLAN%d port mask for port %d, %08x\n", in rtl8366_init_vlan()
328 ret = rtl8366_set_vlan(smi, (port + 1), mask, mask, 0); in rtl8366_init_vlan()
332 dev_info(smi->dev, "VLAN%d port %d, PVID set to %d\n", in rtl8366_init_vlan()
334 ret = rtl8366_set_pvid(smi, port, (port + 1)); in rtl8366_init_vlan()
339 return rtl8366_enable_vlan(smi, true); in rtl8366_init_vlan()
346 struct realtek_smi *smi = ds->priv; in rtl8366_vlan_filtering() local
351 if (!smi->ops->is_vlan_valid(smi, port + 1)) in rtl8366_vlan_filtering()
354 dev_info(smi->dev, "%s filtering on port %d\n", in rtl8366_vlan_filtering()
362 ret = smi->ops->get_vlan_4k(smi, port + 1, &vlan4k); in rtl8366_vlan_filtering()
367 ret = rtl8366_set_vlan(smi, port + 1, in rtl8366_vlan_filtering()
384 struct realtek_smi *smi = ds->priv; in rtl8366_vlan_add() local
389 if (!smi->ops->is_vlan_valid(smi, vlan->vid)) { in rtl8366_vlan_add()
398 ret = rtl8366_enable_vlan4k(smi, true); in rtl8366_vlan_add()
404 dev_info(smi->dev, "add VLAN %d on port %d, %s, %s\n", in rtl8366_vlan_add()
409 dev_err(smi->dev, "port is DSA or CPU port\n"); in rtl8366_vlan_add()
416 ret = rtl8366_set_vlan(smi, vlan->vid, member, untag, 0); in rtl8366_vlan_add()
418 dev_err(smi->dev, "failed to set up VLAN %04x", vlan->vid); in rtl8366_vlan_add()
425 ret = rtl8366_set_pvid(smi, port, vlan->vid); in rtl8366_vlan_add()
427 dev_err(smi->dev, "failed to set PVID on port %d to VLAN %04x", in rtl8366_vlan_add()
439 struct realtek_smi *smi = ds->priv; in rtl8366_vlan_del() local
442 dev_info(smi->dev, "del VLAN %04x on port %d\n", vlan->vid, port); in rtl8366_vlan_del()
444 for (i = 0; i < smi->num_vlan_mc; i++) { in rtl8366_vlan_del()
447 ret = smi->ops->get_vlan_mc(smi, i, &vlanmc); in rtl8366_vlan_del()
465 ret = smi->ops->set_vlan_mc(smi, i, &vlanmc); in rtl8366_vlan_del()
467 dev_err(smi->dev, in rtl8366_vlan_del()
483 struct realtek_smi *smi = ds->priv; in rtl8366_get_strings() local
487 if (port >= smi->num_ports) in rtl8366_get_strings()
490 for (i = 0; i < smi->num_mib_counters; i++) { in rtl8366_get_strings()
491 mib = &smi->mib_counters[i]; in rtl8366_get_strings()
500 struct realtek_smi *smi = ds->priv; in rtl8366_get_sset_count() local
505 if (port >= smi->num_ports) in rtl8366_get_sset_count()
508 return smi->num_mib_counters; in rtl8366_get_sset_count()
514 struct realtek_smi *smi = ds->priv; in rtl8366_get_ethtool_stats() local
518 if (port >= smi->num_ports) in rtl8366_get_ethtool_stats()
521 for (i = 0; i < smi->num_mib_counters; i++) { in rtl8366_get_ethtool_stats()
525 mib = &smi->mib_counters[i]; in rtl8366_get_ethtool_stats()
526 ret = smi->ops->get_mib_counter(smi, port, mib, &mibvalue); in rtl8366_get_ethtool_stats()
528 dev_err(smi->dev, "error reading MIB counter %s\n", in rtl8366_get_ethtool_stats()