drivers/net/dsa/mxl862xx/mxl862xx-api.h | 225 +++++++- drivers/net/dsa/mxl862xx/mxl862xx-cmd.h | 20 +- drivers/net/dsa/mxl862xx/mxl862xx.c | 736 ++++++++++++++++++++++-- drivers/net/dsa/mxl862xx/mxl862xx.h | 99 ++++ drivers/net/dsa/yt921x.c | 13 - include/net/dsa.h | 16 + net/dsa/tag_mxl862xx.c | 3 + 7 files changed, 1041 insertions(+), 71 deletions(-)
As a next step to complete the mxl862xx DSA driver, add support for
offloading forwarding between bridged ports to the switch hardware.
This works pretty much without any big surprises, apart from two
subtleties:
* per-port control over flooding behavior has to be implemented by
(ab)using a 0-rate QoS meters as stopper in lack of any better
option.
* STP state transition unconditionally enables learning on a port
even if it was previously explicitely disabled (a firmware bug)
Note that as the driver is still lacking all VLAN features (which
are going to be added next), at this point some of the
bridge_vlan_aware.sh tests are failing after applying this series.
This is expected and cannot be avoided without implementing
port_vlan_filtering + port_vlan_add/del. And adding both bridge and
VLAN offloading at the same time would be too much for anyone to
review, so VLAN support is going to be submitted in a follow-up
series immediately after this series has been accepted.
All other relevant selftests (including bridge_vlan_unaware.sh) are
still passing.
Inspired by the comments received from Paolo Abeni as reply to v5
the driver now no longer caches bridge port membership in the
driver, but instead imports an existing helper from yt921x.c to dsa.h
in order to allow the driver to easily iterate over bridge members.
The mapping between DSA bridge num and firmware bridge ID is done
using a simple fixed-size array in mxl862xx_priv.
Changes since v8:
* eliminate all driver-cached portmaps as way to address concerns
raised by AI review regarding stale state after error on
.port_bridge_join which would prevent later freeing the firmware
refcounted bridge port. Rollback on error is not perfect in this
way (but it isn't in any other driver either), but at least the
DSA-assumed state is sync'ed to hardware at any later change
(such as other ports leaving the bridge)
* always apply host-flood setting to single-port bridge (do not
loose state)
* cancel any pending host_flood_work in probe error path
* fix missing p->learning reset when reverting port to standalone
on bridge leave
* remove mxl862xx_add_single_port_bridge(); fold bridge FID
allocation and mxl862xx_bridge_config_fwd() call into port_setup()
directly, and move standalone port state reset (portmap, learning,
flood_block) into mxl862xx_set_bridge_port() for the !dp->bridge
user-port path
* refactor mxl862xx_allocate_bridge() to return the allocated FID
directly, with a negative value indicating error
* document in commit message that MASK_VLAN_BASED_MAC_LEARNING is
intentionally absent as SVL is the firmware's reset default
* add comment noting that a FID leaked on port_setup() failure is
tolerable as the port transitions to unused and the pool accounts
for this
Changes since v7:
* add missing fields to kernel-doc for struct mxl862xx_priv
* const'ify some function parameters
Changes since v6:
* drop wrong addition of 'priv' pointer to struct dsa_bridge
-> use simple array to track firmware bridge to dsa bridge mapping
* move existing dsa_bridge_ports() helper from yt921x.c to dsa.h
* replace propesed dsa_bridge_for_each_member() by new
dsa_switch_for_each_bridge_member() taking (struct net_device *)
instead of (struct dsa_bridge *), aligned with the existing
helpers
* fix bridge allocation resource leak in case of
mxl862xx_sync_bridge_members() failing for the first port to join a
bridge
* zero-initialize struct mxl862xx_cfg in mxl862xx_set_ageing_time
* set initial=1 to always reset cursor at start when interating over
FDB in .fdb_dump
* hack zero-rate meter to truly always block
* use asynchronous worker for port_set_host_flood which runs from
atomic context and hence cannot sleep
* reorder function to minimize diffstat of planned follow-up
commits
Changes since v5:
* add new DSA helpers to interate over bridge members
* add driver-private pointer to struct dsa_bridge
* eliminate struct mxl862xx_bridge and driver-private bridge list,
store firmware bridge FID in new dsa_bridge->priv instead
* rework sync_bridge_members() to use dsa_bridge_for_each_member()
instead of for_each_set_bit() on driver-private portmap
* rework port_bridge_join/leave to use dsa_bridge.priv for first-
member detection and dsa_bridge_ports() for empty-bridge check
* derive active FID from dp->bridge->priv in set_bridge_port()
* simplify allocate_bridge()/free_bridge() to take struct dsa_bridge
pointer directly, drop kzalloc/kfree/list management
* simplify get_fid() to read db.bridge.priv directly
* remove mxl862xx_find_bridge()
* remove unnecessary default bridge config call in setup()
Changes since v4:
* move link-local check before dsa_strip_etype_header()
* introduce port_map helpers
* properly implement port_mdb_{add,del} operations
Changes since v3:
* add missing cpu_to_le32 in mxl862xx_bridge_config_fwd()
* use little-endian 32-bit type for (unused) age_timer API field
* better comment in port_set_host_flood() documenting architectural
limitation
* fix typo in comment "matche" should be "matches"
* few whitespace fixes
Changes since v2:
* refactor .port_bridge_join and .port_bridge_leave as requested
by Vladimir Oltean
* include linux/etherdevice.h which was missing and causing build
to fail (it accidentally slipped into a follow-up patch)
* remove left-over manual reset of learning state for port leaving
bridge
* remove unnecessary call to mxl862xx_port_fast_age() for port
leaving bridge
* add kernel-doc comments in mxl862xx.h instead of sporadic inline
comments covering only some of the struct members
* some other minor cosmetics (linebreaks, whitespace) here and there
Changes since v1:
* don't set dsa_default_offload_fwd_mark() on link-local frames
* fix kernel-doc comments in API header
* use bitfield helpers for compound tci field in fdb API
* add missing endian conversion for mxl862xx_stp_port_cfg.port_state
as well as mxl862xx_mac_table_read.tci (spotted by AI review)
* drop manually resetting port learning state on bridge<->standalone
transitions, DSA framework takes care of that
* don't abort updating bridge ports on error, return error at the end
* report error in mxl862xx_port_bridge_leave()
* create mxl862xx_get_fid() helper and use it in
mxl862xx_port_fdb_add() and mxl862xx_port_fdb_del()
* propagete error of callback function in mxl862xx_port_fdb_dump()
* manually mxl862xx_port_fast_age() in mxl862xx_port_stp_state_set()
to avoid FDB poisoning due to race condition
Daniel Golle (4):
net: dsa: move dsa_bridge_ports() helper to dsa.h
net: dsa: add bridge member iteration macro
dsa: tag_mxl862xx: set dsa_default_offload_fwd_mark()
net: dsa: mxl862xx: implement bridge offloading
drivers/net/dsa/mxl862xx/mxl862xx-api.h | 225 +++++++-
drivers/net/dsa/mxl862xx/mxl862xx-cmd.h | 20 +-
drivers/net/dsa/mxl862xx/mxl862xx.c | 736 ++++++++++++++++++++++--
drivers/net/dsa/mxl862xx/mxl862xx.h | 99 ++++
drivers/net/dsa/yt921x.c | 13 -
include/net/dsa.h | 16 +
net/dsa/tag_mxl862xx.c | 3 +
7 files changed, 1041 insertions(+), 71 deletions(-)
--
2.53.0
© 2016 - 2026 Red Hat, Inc.