From: sashiko-bot@kernel.org
To: "Birger Koblitz" <mail@birger-koblitz.de>
Cc: linux-usb@vger.kernel.org
Subject: Re: [PATCH net-next v21 08/13] ax88179_178a: Add AX179A/AX279 multicast configuration
Date: Sun, 15 Nov 2026 10:51:55 +0000 [thread overview]
Message-ID: <sashiko-outbox-215421@kernel.org> (raw)
In-Reply-To: <20261114-ax88179a-v21-8-c2d34410bcbe@birger-koblitz.de>
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] net: usb: ax88179: unsynchronized AX_RX_CTL updates in
ax88179_set_multicast()
--
commit f349443476b08db9f2083703ec74ef889b46544c
Author: Birger Koblitz <mail@birger-koblitz.de>
ax88179_178a: Add AX179A/AX279 multicast configuration
This commit updates ax88179_set_multicast() to set AX_RX_CTL_DROPCRCERR
and conditionally set AX_RX_CTL_IPE based on data->ip_align, and wires it
up as .ndo_set_rx_mode in ax88179a_netdev_ops.
> diff --git a/drivers/net/usb/ax88179_lib.c b/drivers/net/usb/ax88179_lib.c
> index fa6423f51849e..f27b073e1bccb 100644
> --- a/drivers/net/usb/ax88179_lib.c
> +++ b/drivers/net/usb/ax88179_lib.c
> @@ -319,16 +319,21 @@ int ax88179_set_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8
> void ax88179_set_multicast(struct net_device *net)
> {
> struct usbnet *dev = netdev_priv(net);
> - struct ax88179_data *data = dev->driver_priv;
> u8 *m_filter = ((u8 *)dev->data);
> + struct ax88179_data *data;
> + u16 rxctl = 0;
> +
> + data = dev->driver_priv;
>
> - data->rxctl = (AX_RX_CTL_START | AX_RX_CTL_AB | AX_RX_CTL_IPE);
> + rxctl = (AX_RX_CTL_START | AX_RX_CTL_AB | AX_RX_CTL_DROPCRCERR);
> + if (data->ip_align)
> + rxctl |= AX_RX_CTL_IPE;
>
> if (net->flags & IFF_PROMISC) {
> - data->rxctl |= AX_RX_CTL_PRO;
> + rxctl |= AX_RX_CTL_PRO;
> } else if (net->flags & IFF_ALLMULTI ||
> netdev_mc_count(net) > AX_MAX_MCAST) {
> - data->rxctl |= AX_RX_CTL_AMALL;
> + rxctl |= AX_RX_CTL_AMALL;
> } else if (netdev_mc_empty(net)) {
> /* just broadcast and directed */
> } else {
> @@ -349,9 +354,10 @@ void ax88179_set_multicast(struct net_device *net)
> AX_MCAST_FLTSIZE, AX_MCAST_FLTSIZE,
> m_filter);
>
> - data->rxctl |= AX_RX_CTL_AM;
> + rxctl |= AX_RX_CTL_AM;
> }
>
> + WRITE_ONCE(data->rxctl, rxctl);
> ax88179_write_cmd_async(dev, AX_ACCESS_MAC, AX_RX_CTL,
> 2, 2, &data->rxctl);
> }
> diff --git a/drivers/net/usb/ax88179a_devices.c b/drivers/net/usb/ax88179a_devices.c
> index 4207d2cc2b865..a6b0a3f47118c 100644
> --- a/drivers/net/usb/ax88179a_devices.c
> +++ b/drivers/net/usb/ax88179a_devices.c
> @@ -678,6 +678,7 @@ static const struct net_device_ops ax88179a_netdev_ops = {
> .ndo_set_mac_address = ax88179_set_mac_addr,
> .ndo_validate_addr = eth_validate_addr,
> .ndo_eth_ioctl = ax88179a_mii_ioctl,
> + .ndo_set_rx_mode = ax88179_set_multicast,
> .ndo_set_features = ax88179a_set_features,
> .ndo_vlan_rx_add_vid = ax88179a_vlan_rx_add_vid,
> .ndo_vlan_rx_kill_vid = ax88179a_vlan_rx_kill_vid,
[Severity: Medium]
Can ax88179_set_multicast() race with ax88179a_mac_link_up() when writing
AX_RX_CTL?
ax88179_set_multicast() runs in BH context under netif_addr_lock_bh(),
while phylink runs ax88179a_mac_link_up() in process context without any
shared lock:
drivers/net/usb/ax88179a_devices.c:ax88179a_mac_link_up() {
/* Stop RX/TX for link configuration */
ax88179_write_u16(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, AX_RX_CTL_STOP);
...
mutex_lock(&ax179_data->medium_status_mutex);
if (dev->net->mtu > 1500)
mode |= AX_MEDIUM_JUMBO_EN;
ax88179_write_u16(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE, 2, mode);
ax88179_write_u16(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, READ_ONCE(ax179_data->rxctl));
mutex_unlock(&ax179_data->medium_status_mutex);
}
WRITE_ONCE() and READ_ONCE() only protect the in-memory ax179_data->rxctl
load and store, not the USB control transfers to AX_RX_CTL:
CPU0 (kworker) CPU1 (<softirq>)
ax88179a_mac_link_up()
val = READ_ONCE(ax179_data->rxctl)
ax88179_set_multicast()
WRITE_ONCE(data->rxctl, rxctl)
ax88179_write_cmd_async(..., AX_RX_CTL, ...)
usb_submit_urb()
ax88179_write_u16(..., AX_RX_CTL, val)
usb_control_msg() <-- overwrites AX_RX_CTL with stale val
This leaves the hardware AX_RX_CTL filter out of sync with data->rxctl
when RX mode updates (such as IPv6 MLD joins during interface bring-up)
overlap with link resolution. In addition, if ax88179_set_multicast()
runs while ax88179a_mac_link_up() is between writing AX_RX_CTL_STOP and
restoring AX_RX_CTL at the end of link setup, its asynchronous write sets
AX_RX_CTL_START and re-enables RX in the middle of MAC and bulk-in queue
reconfiguration.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261114-ax88179a-v21-0-c2d34410bcbe@birger-koblitz.de?part=8
next prev parent reply other threads:[~2026-11-15 10:51 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-14 10:50 [PATCH net-next v21 00/13] ax88179_178a: Add support for AX88179A-based chips Birger Koblitz
2026-11-14 10:50 ` [PATCH net-next v21 01/13] phylink: Add phylink_mac_interrupt Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:50 ` [PATCH net-next v21 02/13] phylib: Add support for PHYs with broken forced mode Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:50 ` [PATCH net-next v21 03/13] ax88179_178a: Split driver into library and device specific code Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 04/13] ax88179_178a: Add HW support for AX179A-based chips Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 05/13] ax88179_178a: Add EEE configuration support for AX88179A MACs Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 06/13] ax88179_178a: Add EEE configuration support for AX88179A PHYs Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 07/13] ax88179_178a: Add VLAN offload support for AX88179A Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 08/13] ax88179_178a: Add AX179A/AX279 multicast configuration Birger Koblitz
2026-11-15 10:51 ` sashiko-bot [this message]
2026-11-14 10:51 ` [PATCH net-next v21 09/13] ax88179_178a: Add Suspend/resume support for AX88179A/772D/279 Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 10/13] ax88179_178a: Add ethtool get_drvinfo Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 11/13] ax88179_178a: Update driver name and information Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 12/13] ax88179_178a: Add support for AX88179A/772D/279 EEPROM access Birger Koblitz
2026-11-15 10:51 ` sashiko-bot
2026-11-14 10:51 ` [PATCH net-next v21 13/13] ax88796b: Add support for AX88772D, AX88179A and AX88279 Birger Koblitz
2026-11-15 10:51 ` 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=sashiko-outbox-215421@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mail@birger-koblitz.de \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox