From: sashiko-bot@kernel.org
To: "Christian Marangi" <ansuelsmth@gmail.com>
Cc: conor+dt@kernel.org, devicetree@vger.kernel.org,
mfd@lists.linux.dev, robh@kernel.org, lee@kernel.org
Subject: Re: [PATCH net-next v19 09/10] net: dsa: mt7530: generalize and move common function to lib module
Date: Wed, 29 Jul 2026 17:16:39 +0000 [thread overview]
Message-ID: <20260729171639.602A31F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260728154846.1828945-10-ansuelsmth@gmail.com>
Thank you for your contribution! Sashiko AI review found 11 potential issue(s) to consider:
- [Critical] Negative array indexing (`fields[-1]`) in `mt7530_get_ethtool_stats` causes an out-of-bounds read and kernel panic.
- [High] Bridge port MAC learning logic evaluates to zero, permanently enabling learning.
- [High] FDB write operations store corrupted all-zero MAC addresses due to incorrect right-shifting and swapped bit ranges.
- [High] Semantic mismatch in the port matrix (`pm`) cache breaks port enablement and corrupts port control registers.
- [High] MIB counter `REG_FIELD_ID` definitions specify an invalid MSB of 32, triggering undefined behavior in GENMASK on 32-bit platforms.
- [High] A copy-paste error omits the hardware trap configuration for the `:03` MAC DA, bypassing IEEE 802.1Q filtering rules.
- [High] Replacing atomic register writes with field-specific RMWs preserves dirty hardware register states during VLAN 0 setup.
- [High] Unchecked regmap field reads leak uninitialized kernel stack memory to userspace and break hardware isolation policies.
- [Medium] TX and RX RMON packet size histograms are incorrectly swapped, reporting TX stats as RX and vice versa.
- [Medium] Multicast packet statistics are incorrectly discarded and never reported in `mt7530_read_port_stats64`.
- [Medium] MIB counters are not flushed during initialization because the driver writes `0` instead of `1` to the respective flush bits.
--
--- Patch [9]: [PATCH net-next v19 09/10] net: dsa: mt7530: generalize and move common function to lib module ---
commit 0ff2707d21a36354cbb42ab9fd85231c636ec13a
Author: Christian Marangi <ansuelsmth@gmail.com>
net: dsa: mt7530: generalize and move common function to lib module
In preparation of support of DSA Switch from Airoha, create a mt7530
library module and move there all the common function.
> diff --git a/drivers/net/dsa/mt7530-lib.c b/drivers/net/dsa/mt7530-lib.c
> new file mode 100644
> index 0000000000000..0ad5f11283e79
> --- /dev/null
> +++ b/drivers/net/dsa/mt7530-lib.c
> @@ -0,0 +1,1094 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +
> +#include <linux/device.h>
> +#include <linux/if_bridge.h>
> +#include <linux/module.h>
> +#include <linux/regmap.h>
> +#include <net/dsa.h>
> +
> +#include "mt7530-lib.h"
> +
> +void mt7530_lib_mib_reset(struct mt7530_lib_priv *priv)
> +{
> + regmap_field_write(priv->fields[MT7530_CCR_MIB_ENABLE], 0);
> + regmap_field_write(priv->fields[MT7530_CCR_RX_OCT_CNT_GOOD], 0);
> + regmap_field_write(priv->fields[MT7530_CCR_RX_OCT_CNT_BAD], 0);
> + regmap_field_write(priv->fields[MT7530_CCR_TX_OCT_CNT_GOOD], 0);
> + regmap_field_write(priv->fields[MT7530_CCR_TX_OCT_CNT_BAD], 0);
[Severity: Medium]
Does writing 0 here correctly trigger the flush?
The hardware typically requires these specific bits to be asserted (1) to
clear the counters, similar to the original CCR_MIB_FLUSH bitmask.
Writing 0 might leave the flush operation disabled, causing the hardware to
report leftover garbage across reboots.
[ ... ]
> +void mt7530_lib_trap_frames(struct mt7530_lib_priv *priv)
> +{
> + /* Trap 802.1X PAE frames and BPDUs to the CPU port(s) and egress
> + * them with the EG_TAG attribute set to disabled (system default)
> + * so that any VLAN tags in the frame are not modified by the
> + * switch egress VLAN tag processing. This preserves VLAN tags
> + * for reception on VLAN sub-interfaces.
> + */
> + regmap_field_write(priv->fields[MT7530_BPDU_EG_TAG],
> + MT7530_VLAN_EG_DISABLED);
[ ... ]
> + /* Trap frames with :03 and :0E MAC DAs to the CPU port(s) and
> + * egress them with EG_TAG disabled.
> + */
> + regmap_field_write(priv->fields[MT7530_R02_BPDU_FR], 1);
> + regmap_field_write(priv->fields[MT7530_R02_EG_TAG],
> + MT7530_VLAN_EG_DISABLED);
> + regmap_field_write(priv->fields[MT7530_R02_PORT_FW],
> + TO_CPU_FW_CPU_ONLY);
[Severity: High]
Is there a copy-paste error here?
The comment mentions trapping :03 and :0E MAC DAs, but the code modifies
MT7530_R02 instead of MT7530_R03.
This leaves the :03 frame trap unconfigured, potentially bypassing IEEE
802.1Q filtering rules.
> + regmap_field_write(priv->fields[MT7530_R0E_BPDU_FR], 1);
> + regmap_field_write(priv->fields[MT7530_R0E_EG_TAG],
> + MT7530_VLAN_EG_DISABLED);
> + regmap_field_write(priv->fields[MT7530_R0E_PORT_FW],
> + TO_CPU_FW_CPU_ONLY);
> +}
> +EXPORT_SYMBOL_GPL(mt7530_lib_trap_frames);
> +
> +static void mt7530_update_port_member(struct mt7530_lib_priv *priv, int port,
> + const struct net_device *bridge_dev,
> + bool join) __must_hold(priv->reg_mutex)
> +{
> + struct dsa_port *dp = dsa_to_port(priv->ds, port), *other_dp;
> + struct mt7530_port *p = &priv->ports[port], *other_p;
> + struct dsa_port *cpu_dp = dp->cpu_dp;
> + u32 port_bitmap = BIT(cpu_dp->index);
> + int other_port;
> + bool isolated;
> +
> + dsa_switch_for_each_user_port(other_dp, priv->ds) {
> + other_port = other_dp->index;
> + other_p = &priv->ports[other_port];
> +
> + if (dp == other_dp)
> + continue;
> +
> + /* Add/remove this port to/from the port matrix of the other
> + * ports in the same bridge. If the port is disabled, port
> + * matrix is kept and not being setup until the port becomes
> + * enabled.
> + */
> + if (!dsa_port_offloads_bridge_dev(other_dp, bridge_dev))
> + continue;
> +
> + isolated = p->isolated && other_p->isolated;
> +
> + if (join && !isolated) {
> + other_p->pm |= BIT(port);
> + port_bitmap |= BIT(other_port);
> + } else {
> + other_p->pm &= ~BIT(port);
> + }
> +
> + if (other_p->enable)
> + regmap_fields_write(priv->fields[MT7530_PCR_MATRIX],
> + other_port, other_p->pm);
[Severity: High]
Could this corrupt the port control registers?
The legacy mt7530_port_enable() function (which is still present) stores
pre-shifted values in pm (e.g., PCR_MATRIX(BIT(cpu_dp->index))).
Here, pm is treated as an unshifted bitmask and passed to
regmap_fields_write(), which shifts the entire value left by 16 bits.
This will shift the pre-shifted CPU port bit completely out of bounds
(overflowing to 0) and isolate the port from the CPU.
> + }
> +
> + /* Add/remove the all other ports to this port matrix. For !join
> + * (leaving the bridge), only the CPU port will remain in the port matrix
> + * of this port.
> + */
> + p->pm = port_bitmap;
> + if (priv->ports[port].enable)
> + regmap_fields_write(priv->fields[MT7530_PCR_MATRIX],
> + port, port_bitmap);
> +}
> +
> +void mt7530_lib_read_port_stats(struct regmap_field *low,
> + struct regmap_field *high,
> + int port, uint64_t *data)
> +{
> + u32 val;
> +
> + regmap_fields_read(low, port, &val);
> + *data = val;
[Severity: High]
What happens if the underlying MDIO bus read fails here?
The return value of regmap_fields_read() is not checked, meaning val could
remain uninitialized.
This would leak kernel stack memory to userspace via ethtool. Similarly, in
mt7530_hw_vlan_update() below, it uses uninitialized stack data to build port
masks, randomly altering VLAN memberships.
> +
> + if (high) {
> + regmap_fields_read(high, port, &val);
> + *data |= (u64)val << 32;
> + }
> +}
> +EXPORT_SYMBOL_GPL(mt7530_lib_read_port_stats);
[ ... ]
> +static void mt7530_lib_fdb_write(struct mt7530_lib_priv *priv, u16 vid,
> + u8 port_mask, const u8 *mac,
> + u8 aging, u8 type)
> +{
> + regmap_field_write(priv->fields[MT7530_ATWD_CVID], vid);
> + regmap_field_write(priv->fields[MT7530_ATWD_IVL], 1);
> + regmap_field_write(priv->fields[MT7530_ATWD_FID], FID_BRIDGED);
> + regmap_field_write(priv->fields[MT7530_ATWD_AGE_TIMER], aging);
> + regmap_field_write(priv->fields[MT7530_ATWD_PORT_MAP], port_mask);
> + /* STATIC_ENT indicate that entry is static wouldn't
> + * be aged out and STATIC_EMP specified as erasing an
> + * entry
> + */
> + regmap_field_write(priv->fields[MT7530_ATWD_ENT_STATUS], type);
> + regmap_field_write(priv->fields[MT7530_ATWD_MAC_BYTE_5],
> + mac[5] >> MAC_BYTE_5);
[Severity: High]
Will this result in all-zero MAC addresses being written to the FDB?
The mac array contains 8-bit u8 values. Right-shifting a u8 by MAC_BYTE_5
(which is 16) or MAC_BYTE_4 (which is 24) will always evaluate to 0.
Since regmap_field_write() automatically handles shifting values into their
proper field positions, it seems we should pass the raw mac[x] bytes without
shifting.
> + regmap_field_write(priv->fields[MT7530_ATWD_MAC_BYTE_4],
> + mac[4] >> MAC_BYTE_4);
> + regmap_field_write(priv->fields[MT7530_ATWD_MAC_BYTE_3],
> + mac[3] >> MAC_BYTE_3);
[ ... ]
> +int mt7530_lib_port_bridge_flags(struct mt7530_lib_priv *priv, int port,
> + struct switchdev_brport_flags flags,
> + struct netlink_ext_ack *extack)
> +{
> + struct dsa_switch *ds = priv->ds;
> +
> + if (flags.mask & BR_LEARNING)
> + regmap_fields_write(priv->fields[MT7530_PSC_SA_DIR],
> + port, flags.val & BR_LEARNING);
[Severity: High]
Does this write permanently enable MAC learning?
BR_LEARNING is BIT(5) (32). The MT7530_PSC_SA_DIR field is a 1-bit field at
bit 4.
When regmap_fields_write() shifts the value by 4 and masks it with 0x10,
(32 << 4) & 0x10 evaluates to 0.
Additionally, the SA_DIR bit disables learning when set to 1, so writing 0
ensures learning can never be disabled.
> +
> + if (flags.mask & BR_FLOOD)
> + regmap_field_update_bits(priv->fields[MT7530_UNU_FFP],
> + BIT(port),
> + flags.val & BR_FLOOD ? BIT(port) : 0);
[ ... ]
> +static void mt7530_hw_vlan_update(struct mt7530_lib_priv *priv, u16 vid,
> + struct mt7530_hw_vlan_entry *entry,
> + mt7530_vlan_op vlan_op)
> +{
> + u32 val;
> +
> + /* Fetch entry */
> + mt7530_vlan_cmd(priv, MT7530_VTCR_RD_VID, vid);
> +
> + regmap_field_read(priv->fields[MT7530_VAWD_PORT_MEM], &val);
> +
> + entry->old_members = val;
> +
> + /* Manipulate entry */
> + vlan_op(priv, entry);
> +
> + /* Flush result to hardware */
> + mt7530_vlan_cmd(priv, MT7530_VTCR_WR_VID, vid);
> +}
[ ... ]
> +int mt7530_lib_setup_vlan0(struct mt7530_lib_priv *priv)
> +{
> + regmap_field_write(priv->fields[MT7530_VAWD_IVL_MAC], 1);
> + regmap_field_write(priv->fields[MT7530_VAWD_EG_CON], 1);
[Severity: High]
Could this leave MT7530_VAWD1 in an inconsistent state?
The original code wrote directly to the MT7530_VAWD1 register, effectively
clearing unspecified bits like VTAG_EN.
Because VAWD1 is a data window that retains the state of the last accessed
VLAN entry, selectively modifying individual fields with read-modify-write
might leave VTAG_EN in an undefined state from a previous operation,
randomly tagging VLAN 0 frames.
> + regmap_field_write(priv->fields[MT7530_VAWD_PORT_MEM],
> + MT7530_ALL_MEMBERS);
> + regmap_field_write(priv->fields[MT7530_VAWD_FID],
> + FID_BRIDGED);
[ ... ]
> diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
> index 5f56a423b1475..b2d3c71e24e97 100644
> --- a/drivers/net/dsa/mt7530.c
> +++ b/drivers/net/dsa/mt7530.c
> @@ -24,10 +24,159 @@
> #include <net/pkt_cls.h>
>
> #include "mt7530.h"
> +#include "mt7530-lib.h"
>
> #define MT7530_STATS_POLL_INTERVAL (1 * HZ)
> #define MT7530_STATS_RATE_LIMIT (HZ / 10)
>
> +static const struct mt7530_reg_field mt753x_fields[] = {
> + { MT7530_BC_FFP, REG_FIELD(MT753X_MFC, 24, 31) },
> + { MT7530_UNM_FFP, REG_FIELD(MT753X_MFC, 16, 23) },
[ ... ]
> + { MT7530_ATWD_ENT_STATUS, REG_FIELD(MT7530_ATWD, 2, 3), },
> + { MT7530_ATWD_MAC_BYTE_5, REG_FIELD(MT7530_ATA2, 24, 31), },
> + { MT7530_ATWD_MAC_BYTE_4, REG_FIELD(MT7530_ATA2, 16, 23), },
[Severity: High]
Are the bit ranges for MAC_BYTE_4 and MAC_BYTE_5 swapped here?
The original definitions and typical byte ordering suggest MAC_BYTE_5 should
be bits 16-23 and MAC_BYTE_4 should be bits 24-31.
> + { MT7530_ATWD_MAC_BYTE_3, REG_FIELD(MT7530_ATA1, 0, 7), },
> + { MT7530_ATWD_MAC_BYTE_2, REG_FIELD(MT7530_ATA1, 8, 15), },
> + { MT7530_ATWD_MAC_BYTE_1, REG_FIELD(MT7530_ATA1, 16, 23), },
[ ... ]
> + { MT7530_GMACCR_MAX_RX_JUMBO, REG_FIELD(MT7530_GMACCR, 2, 5) },
> + { MT7530_GMACCR_MAX_RX_PKT_LEN, REG_FIELD(MT7530_GMACCR, 0, 1) },
> +
> + { MT7530_MIB_TX_DROP, REG_FIELD_ID(MT7530_PORT_MIB_TX_DROP, 0, 32, MT7530_NUM_PORTS, 0x100) },
> + { MT7530_MIB_TX_CRC_ERR, REG_FIELD_ID(MT7530_PORT_MIB_TX_CRC_ERR, 0, 32, MT7530_NUM_PORTS, 0x100) },
[Severity: High]
Does specifying 32 as the MSB here cause undefined behavior on 32-bit
platforms?
The REG_FIELD_ID macro takes inclusive bounds, so an MSB of 32 results in
GENMASK(32, 0).
On 32-bit architectures, this evaluates to a negative shift count
(~0UL << -1). Should the bound be 0, 31 instead?
> + { MT7530_MIB_TX_UNICAST, REG_FIELD_ID(MT7530_PORT_MIB_TX_UNICAST, 0, 32, MT7530_NUM_PORTS, 0x100) },
> + { MT7530_MIB_TX_MULTICAST, REG_FIELD_ID(MT7530_PORT_MIB_TX_MULTICAST, 0, 32, MT7530_NUM_PORTS, 0x100) },
> + { MT7530_MIB_TX_BROADCAST, REG_FIELD_ID(MT7530_PORT_MIB_TX_BROADCAST, 0, 32, MT7530_NUM_PORTS, 0x100) },
[ ... ]
> static struct mt753x_pcs *pcs_to_mt753x_pcs(struct phylink_pcs *pcs)
> {
> return container_of(pcs, struct mt753x_pcs, pcs);
> @@ -35,15 +184,15 @@ static struct mt753x_pcs *pcs_to_mt753x_pcs(struct phylink_pcs *pcs)
>
> /* String, offset, and register size in bytes if different from 4 bytes */
> static const struct mt7530_mib_desc mt7530_mib[] = {
> - MIB_DESC(1, MT7530_PORT_MIB_TX_DROP, "TxDrop"),
> - MIB_DESC(1, MT7530_PORT_MIB_TX_CRC_ERR, "TxCrcErr"),
> - MIB_DESC(1, MT7530_PORT_MIB_TX_COLLISION, "TxCollision"),
> - MIB_DESC(1, MT7530_PORT_MIB_RX_DROP, "RxDrop"),
> - MIB_DESC(1, MT7530_PORT_MIB_RX_FILTERING, "RxFiltering"),
> - MIB_DESC(1, MT7530_PORT_MIB_RX_CRC_ERR, "RxCrcErr"),
> - MIB_DESC(1, MT7530_PORT_MIB_RX_CTRL_DROP, "RxCtrlDrop"),
> - MIB_DESC(1, MT7530_PORT_MIB_RX_INGRESS_DROP, "RxIngressDrop"),
> - MIB_DESC(1, MT7530_PORT_MIB_RX_ARL_DROP, "RxArlDrop"),
> + MIB_DESC(MT7530_MIB_TX_DROP, -1, "TxDrop"),
> + MIB_DESC(MT7530_MIB_TX_CRC_ERR, -1, "TxCrcErr"),
[ ... ]
> @@ -744,34 +796,22 @@ mt7530_get_strings(struct dsa_switch *ds, int port, u32 stringset,
> ethtool_puts(&data, mt7530_mib[i].name);
> }
>
> -static void
> -mt7530_read_port_stats(struct mt7530_priv *priv, int port,
> - u32 offset, u8 size, uint64_t *data)
> -{
> - u32 val, reg = MT7530_PORT_MIB_COUNTER(port) + offset;
> -
> - val = mt7530_read(priv, reg);
> - *data = val;
> -
> - if (size == 2) {
> - val = mt7530_read(priv, reg + 4);
> - *data |= (u64)val << 32;
> - }
> -}
> -
> static void
> mt7530_get_ethtool_stats(struct dsa_switch *ds, int port,
> uint64_t *data)
> {
> struct mt7530_priv *priv = ds->priv;
> const struct mt7530_mib_desc *mib;
> + struct mt7530_lib_priv *lib_priv;
> int i;
>
> + lib_priv = &priv->lib_priv;
> for (i = 0; i < ARRAY_SIZE(mt7530_mib); i++) {
> mib = &mt7530_mib[i];
>
> - mt7530_read_port_stats(priv, port, mib->offset, mib->size,
> - data + i);
> + mt7530_lib_read_port_stats(lib_priv->fields[mib->field_low],
> + lib_priv->fields[mib->field_high],
> + port, data + i);
[Severity: Critical]
Will this cause an out-of-bounds read and kernel panic?
The MIB_DESC macro initializes field_high to -1 for 32-bit single-register
counters.
In mt7530_get_ethtool_stats(), this unconditionally accesses
lib_priv->fields[-1], which evaluates to the non-NULL struct regmap pointer.
Passing this invalid regmap_field pointer to mt7530_lib_read_port_stats()
will crash when regmap_fields_read() attempts to dereference it.
> }
> }
>
[ ... ]
> +static const struct mt7530_rmon_hist mt7530_rmon_hist_info = {
> + .ranges_fields = (unsigned int []){
> + MT7530_MIB_TX_PKT_SZ_64,
> + MT7530_MIB_TX_PKT_SZ_65_TO_127,
> + MT7530_MIB_TX_PKT_SZ_128_TO_255,
> + MT7530_MIB_TX_PKT_SZ_256_TO_511,
> + MT7530_MIB_TX_PKT_SZ_512_TO_1023,
> + MT7530_MIB_TX_PKT_SZ_1024_TO_MAX,
> + },
> + .ranges_tx_fields = (unsigned int []){
> + MT7530_MIB_RX_PKT_SZ_64,
> + MT7530_MIB_RX_PKT_SZ_65_TO_127,
> + MT7530_MIB_RX_PKT_SZ_128_TO_255,
> + MT7530_MIB_RX_PKT_SZ_256_TO_511,
> + MT7530_MIB_RX_PKT_SZ_512_TO_1023,
> + MT7530_MIB_RX_PKT_SZ_1024_TO_MAX,
> + },
[Severity: Medium]
Could these arrays be swapped?
The ranges_fields array is populated with TX macros, while ranges_tx_fields
uses RX macros.
When these are mapped later in mt7530_lib_get_rmon_stats(), it appears to
report TX stats as RX and vice versa.
> + .ranges = mt7530_rmon_ranges,
> + .num_ranges = ARRAY_SIZE(mt7530_rmon_ranges) - 1,
> +};
> +
> static void mt7530_get_rmon_stats(struct dsa_switch *ds, int port,
> struct ethtool_rmon_stats *rmon_stats,
> const struct ethtool_rmon_hist_range **ranges)
[ ... ]
> static void mt7530_read_port_stats64(struct mt7530_priv *priv, int port,
> struct rtnl_link_stats64 *storage)
> {
> + struct mt7530_lib_priv *lib_priv = &priv->lib_priv;
> uint64_t data;
>
> /* MIB counter doesn't provide a FramesTransmittedOK but instead
> @@ -903,38 +884,40 @@ static void mt7530_read_port_stats64(struct mt7530_priv *priv, int port,
> * To simulate a global frame counter, read Unicast and addition Multicast
> * and Broadcast later
> */
> - mt7530_read_port_stats(priv, port, MT7530_PORT_MIB_RX_UNICAST, 1,
> - &storage->rx_packets);
> - mt7530_read_port_stats(priv, port, MT7530_PORT_MIB_RX_MULTICAST, 1,
> - &storage->multicast);
> + mt7530_lib_read_port_stats(lib_priv->fields[MT7530_MIB_RX_UNICAST],
> + NULL, port, &storage->rx_packets);
> + mt7530_lib_read_port_stats(lib_priv->fields[MT7530_MIB_RX_MULTICAST],
> + NULL, port, &data);
> storage->rx_packets += storage->multicast;
[Severity: Medium]
Does this correctly track multicast packets?
The counter is read into the local variable data, but then the code adds
storage->multicast to rx_packets.
Since storage->multicast is never assigned the read value, it seems the
multicast packet count is lost.
> - mt7530_read_port_stats(priv, port, MT7530_PORT_MIB_RX_BROADCAST, 1,
> - &data);
> + mt7530_lib_read_port_stats(lib_priv->fields[MT7530_MIB_RX_BROADCAST],
> + NULL, port, &data);
> storage->rx_packets += data;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260728154846.1828945-1-ansuelsmth@gmail.com?part=9
next prev parent reply other threads:[~2026-07-29 17:16 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-28 15:48 [PATCH net-next v19 00/10] net: dsa: Add Airoha AN8855 support Christian Marangi
2026-07-28 15:48 ` [PATCH net-next v19 01/10] dt-bindings: net: dsa: Document support for Airoha AN8855 DSA Switch Christian Marangi
2026-07-29 6:22 ` Krzysztof Kozlowski
2026-07-29 17:16 ` sashiko-bot
2026-07-28 15:48 ` [PATCH net-next v19 02/10] dt-bindings: net: Document support for AN8855 Switch Internal PHY Christian Marangi
2026-07-29 17:16 ` sashiko-bot
2026-07-28 15:48 ` [PATCH net-next v19 03/10] dt-bindings: mfd: Document support for Airoha AN8855 Switch SoC Christian Marangi
2026-07-29 17:16 ` sashiko-bot
2026-07-28 15:48 ` [PATCH net-next v19 04/10] mfd: an8855: Add support for Airoha AN8855 Switch MFD Christian Marangi
2026-07-29 17:16 ` sashiko-bot
2026-07-28 15:48 ` [PATCH net-next v19 05/10] net: phy: Add Airoha AN8855 Internal Switch Gigabit PHY Christian Marangi
2026-07-29 17:16 ` sashiko-bot
2026-07-28 15:48 ` [PATCH net-next v19 06/10] net: dsa: tag_mtk: add Airoha variant usage of this TAG Christian Marangi
2026-07-29 17:16 ` sashiko-bot
2026-07-28 15:48 ` [PATCH net-next v19 07/10] MAINTAINERS: add myself as maintainer for Airoha AN8855 Switch Christian Marangi
2026-07-28 15:48 ` [PATCH net-next v19 08/10] net: dsa: mt7530: move MDIO bus locking into regmap Christian Marangi
2026-07-29 17:16 ` sashiko-bot
2026-07-28 15:48 ` [PATCH net-next v19 09/10] net: dsa: mt7530: generalize and move common function to lib module Christian Marangi
2026-07-29 17:16 ` sashiko-bot [this message]
2026-07-28 15:48 ` [PATCH net-next v19 10/10] net: dsa: Add Airoha AN8855 5-Port Gigabit DSA Switch driver Christian Marangi
2026-07-29 17:16 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260729171639.602A31F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=ansuelsmth@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=lee@kernel.org \
--cc=mfd@lists.linux.dev \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.