From nobody Tue Apr 7 09:18:44 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2C493B28D for ; Sat, 14 Mar 2026 18:29:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773512991; cv=none; b=eEbOKT8Q0SqXkXBD9gDwEGvnili6afrgt5r1ugf3lVrffei+0LcVJ2+3MmQlqWifTjst5eb2g54TgEHFR8mNsTa2djh06Q72N9HxPhzLaaTGwhwJsbNLif2VbwZ30m6qWzWQcHSNMjGpRNFuNrbRzcDx/WWm+DiJIFY6xSLZgI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773512991; c=relaxed/simple; bh=1tG9qcJg/ScoAbc2s3rBPup6tclQThm8ZNIWVQwHMpc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m3osnsN2BQOUAUbypWYX4UjIT+hCPLX1hL9bBaPVWl0xzTgv2RYdwUqAugeOrc1hV3LCXpSP6sW/X3/wGP9tIUJdjRi4wyPA4SrrYEB3U/3zhQshmNEXls8GSI0BjDVHaCHBrj8fgls5CMeErDU0ZG6hu5hAa5/8IU2WDPYljXM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=b0/7fHcx; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="b0/7fHcx" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2ae4e538abdso36154105ad.3 for ; Sat, 14 Mar 2026 11:29:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773512988; x=1774117788; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+JSH/0/b9giaRQVQnVF9Hnbf5bM9rYVcnC9nwZ0R2/U=; b=b0/7fHcxe40SglyAJpzqO/8MW0rbtz36KdXFN9hn8IZMIH71iVumPVuhdmWBAr8r/R EYtlVNQwLsO6QePN8Wm82otF2dEHFj7S4LBHrIYCrnAjta3EfDniIs3+vWAIoCLIeZjk SB/lLcZC5NZx++H4HjSRkQSEzlbnzstxT3e1mGQ+AhAbcWBxtkKDSAEa7fdJG6N8zYkR oQvySAVyozI4jSDx0gVzxhnwpAhBjlm2CFH/71laegsy/SgK7Hvf+bkVECUPesXozosi gLaRvvngod35hpDBkkepVzzX45BZ6bme9ttA/0UHgLsVVTgDPokQ/L8JCshxEZAQaVv7 hL7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773512988; x=1774117788; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+JSH/0/b9giaRQVQnVF9Hnbf5bM9rYVcnC9nwZ0R2/U=; b=N3maWBvvQfzMgUz1QruTaE6EULFOenQgQpojE7g0kViJo3iUZAPX+kHJJoPwiBF/Ij 8zoleGXnBtUxGy8+a0DW8zgrxj6iWHWjk4bdc8xyhSecBStc2+ESNs7adspYrHdzodRO DmqnfzB1gJ+r148ay8fuaOPJBCiFiWq1H/5DPVYpxIbXA/utRf2IvyB0morwuGE07JY/ fd33yqCS/drhGJIcpypR0rO1LG9f4mPuj9ka2FFBsmtaU77GF71fLL9Qkq6yFvpabmQC vGdIOe2LCv1ru4X8c2ZPEI2tqWMnw+9klZbRO7aafij/M7ix1K87urZSZ4MbILbfbN2J v/3g== X-Forwarded-Encrypted: i=1; AJvYcCU8LpvfeVA7xPtvypZ8VkMrt5s/ug4zTI4faQSfZ4dvF66foTM4bBeqgonWhaBma3DvHuSnhop2/deeS9Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyNb9ufVlAzU+TIkpDrzE2X05wXH3q305NBn3faIulhVeRxGv2u 2HUrAdEEy+gqnXHQuiguwDA3CopHJx9DgaSnEDXWMiiDTqPkSrQsSBX6 X-Gm-Gg: ATEYQzwpl6OtaMBfLF8/3ljJhlbpD1b0EzN7OBpQ9vgxPu1Ns9iHYhvZJ3uLviwI8iv f11J4cOQq8GVzWBa9LL49D45502Z6hYYS4lv2F8JV4SZ6/DeSlqMxZKRT+OWsGr1GMlcrk4Txhp 1ilaR28IkJLPvE3q0l8RYQA3p3RDKfAO8Ze1ppPrQC5XoguUqqmlZqvq1gKiw3t3Zgs7sa7dbb/ TTzZfG6jmzigvU5bScUvhZWBu78KX1FYc56LC5Az5ag9q6W88GnduZw5qDzVbZQkvJQw/A8K0gY X4jDbDGMaIPfc4Aft6G9yKOnDJPO7YheoiJO1dY2LLQixRALaFr9nNjqtrAxmnGcmeXplFdE6xj xi55TmMicMI7Zafmkw+uXR/O2DiPcLI6weguttlbgkjanlk55LiCGAu+zcsmnEx+lkQ0LrTHIdF 97YyTL3FuH0mWmvPesuvKO50uVKKvRPb5LKz3K3lLdxUcMyxj3J1VbFy0FwKbwxBFSP0HlCLoxL Lgtwg== X-Received: by 2002:a17:903:90f:b0:2ae:59d3:27f8 with SMTP id d9443c01a7336-2aeca999738mr72086855ad.19.1773512988217; Sat, 14 Mar 2026 11:29:48 -0700 (PDT) Received: from localhost.localdomain ([122.168.66.151]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece62c581sm77673525ad.33.2026.03.14.11.29.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Mar 2026 11:29:47 -0700 (PDT) From: I Viswanath To: stfomichev@gmail.com, horms@kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, kuba@kernel.org, davem@davemloft.net, eperezma@redhat.com, xuanzhuo@linux.alibaba.com, jasowang@redhat.com, mst@redhat.com, przemyslaw.kitszel@intel.com, anthony.l.nguyen@intel.com, jacob.e.keller@intel.com, ronak.doshi@broadcom.com, pcnet32@frontier.com Cc: bcm-kernel-feedback-list@broadcom.com, netdev@vger.kernel.org, virtualization@lists.linux.dev, intel-wired-lan@lists.osuosl.org, linux-kernel@vger.kernel.org, I Viswanath Subject: [PATCH net-next v9 7/7] pcnet32: Implement ndo_set_rx_mode_async callback Date: Sat, 14 Mar 2026 23:58:09 +0530 Message-ID: <20260314182809.362808-8-viswanathiyyappan@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260314182809.362808-1-viswanathiyyappan@gmail.com> References: <20260314182809.362808-1-viswanathiyyappan@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement the ndo_set_rx_mode_async callback and update the driver to use the snapshot/commit model for RX mode update. Signed-off-by: I Viswanath Reviewed-by: Aleksandr Loktionov --- =20 There are no calls to netif_set_rx_mode in pcnet32 =20 drivers/net/ethernet/amd/pcnet32.c | 65 ++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/= pcnet32.c index 911808ab13a7..d5ad96985d68 100644 --- a/drivers/net/ethernet/amd/pcnet32.c +++ b/drivers/net/ethernet/amd/pcnet32.c @@ -314,8 +314,9 @@ static void pcnet32_tx_timeout(struct net_device *dev, = unsigned int txqueue); static irqreturn_t pcnet32_interrupt(int, void *); static int pcnet32_close(struct net_device *); static struct net_device_stats *pcnet32_get_stats(struct net_device *); -static void pcnet32_load_multicast(struct net_device *dev); +static void pcnet32_load_multicast(struct net_device *dev, bool is_open); static void pcnet32_set_multicast_list(struct net_device *); +static void pcnet32_set_multicast_list_async(struct net_device *); static int pcnet32_ioctl(struct net_device *, struct ifreq *, int); static void pcnet32_watchdog(struct timer_list *); static int mdio_read(struct net_device *dev, int phy_id, int reg_num); @@ -1580,6 +1581,7 @@ static const struct net_device_ops pcnet32_netdev_ops= =3D { .ndo_tx_timeout =3D pcnet32_tx_timeout, .ndo_get_stats =3D pcnet32_get_stats, .ndo_set_rx_mode =3D pcnet32_set_multicast_list, + .ndo_set_rx_mode_async =3D pcnet32_set_multicast_list_async, .ndo_eth_ioctl =3D pcnet32_ioctl, .ndo_set_mac_address =3D eth_mac_addr, .ndo_validate_addr =3D eth_validate_addr, @@ -2260,7 +2262,7 @@ static int pcnet32_open(struct net_device *dev) =20 lp->init_block->mode =3D cpu_to_le16((lp->options & PCNET32_PORT_PORTSEL) << 7); - pcnet32_load_multicast(dev); + pcnet32_load_multicast(dev, true); =20 if (pcnet32_init_ring(dev)) { rc =3D -ENOMEM; @@ -2676,18 +2678,26 @@ static struct net_device_stats *pcnet32_get_stats(s= truct net_device *dev) } =20 /* taken from the sunlance driver, which it took from the depca driver */ -static void pcnet32_load_multicast(struct net_device *dev) +static void pcnet32_load_multicast(struct net_device *dev, bool is_open) { struct pcnet32_private *lp =3D netdev_priv(dev); volatile struct pcnet32_init_block *ib =3D lp->init_block; volatile __le16 *mcast_table =3D (__le16 *)ib->filter; struct netdev_hw_addr *ha; + char *ha_addr; + bool allmulti; unsigned long ioaddr =3D dev->base_addr; - int i; + int i, ni; u32 crc; =20 + if (is_open) + allmulti =3D dev->flags & IFF_ALLMULTI; + else + allmulti =3D netif_get_rx_mode_cfg(dev, + NETIF_RX_MODE_CFG_ALLMULTI); + /* set all multicast bits */ - if (dev->flags & IFF_ALLMULTI) { + if (allmulti) { ib->filter[0] =3D cpu_to_le32(~0U); ib->filter[1] =3D cpu_to_le32(~0U); lp->a->write_csr(ioaddr, PCNET32_MC_FILTER, 0xffff); @@ -2701,20 +2711,41 @@ static void pcnet32_load_multicast(struct net_devic= e *dev) ib->filter[1] =3D 0; =20 /* Add addresses */ - netdev_for_each_mc_addr(ha, dev) { - crc =3D ether_crc_le(6, ha->addr); - crc =3D crc >> 26; - mcast_table[crc >> 4] |=3D cpu_to_le16(1 << (crc & 0xf)); + if (is_open) { + netdev_for_each_mc_addr(ha, dev) { + crc =3D ether_crc_le(6, ha->addr); + crc =3D crc >> 26; + mcast_table[crc >> 4] |=3D cpu_to_le16(1 << (crc & 0xf)); + } + } else { + netif_rx_mode_for_each_mc_addr(ha_addr, dev, ni) { + crc =3D ether_crc_le(6, ha_addr); + crc =3D crc >> 26; + mcast_table[crc >> 4] |=3D cpu_to_le16(1 << (crc & 0xf)); + } } + for (i =3D 0; i < 4; i++) lp->a->write_csr(ioaddr, PCNET32_MC_FILTER + i, le16_to_cpu(mcast_table[i])); } =20 +static void pcnet32_set_multicast_list(struct net_device *dev) +{ + bool allmulti =3D !!(dev->flags & IFF_ALLMULTI); + bool promisc =3D !!(dev->flags & IFF_PROMISC); + + netif_set_rx_mode_flag(dev, NETIF_RX_MODE_UC_SKIP, true); + netif_set_rx_mode_flag(dev, NETIF_RX_MODE_MC_SKIP, promisc | allmulti); + + netif_set_rx_mode_cfg(dev, NETIF_RX_MODE_CFG_ALLMULTI, allmulti); + netif_set_rx_mode_cfg(dev, NETIF_RX_MODE_CFG_PROMISC, promisc); +} + /* * Set or clear the multicast filter for this adaptor. */ -static void pcnet32_set_multicast_list(struct net_device *dev) +static void pcnet32_set_multicast_list_async(struct net_device *dev) { unsigned long ioaddr =3D dev->base_addr, flags; struct pcnet32_private *lp =3D netdev_priv(dev); @@ -2723,7 +2754,7 @@ static void pcnet32_set_multicast_list(struct net_dev= ice *dev) spin_lock_irqsave(&lp->lock, flags); suspended =3D pcnet32_suspend(dev, &flags, 0); csr15 =3D lp->a->read_csr(ioaddr, CSR15); - if (dev->flags & IFF_PROMISC) { + if (netif_get_rx_mode_cfg(dev, NETIF_RX_MODE_CFG_PROMISC)) { /* Log any net taps. */ netif_info(lp, hw, dev, "Promiscuous mode enabled\n"); lp->init_block->mode =3D @@ -2734,7 +2765,7 @@ static void pcnet32_set_multicast_list(struct net_dev= ice *dev) lp->init_block->mode =3D cpu_to_le16((lp->options & PCNET32_PORT_PORTSEL) << 7); lp->a->write_csr(ioaddr, CSR15, csr15 & 0x7fff); - pcnet32_load_multicast(dev); + pcnet32_load_multicast(dev, false); } =20 if (suspended) { @@ -2922,6 +2953,7 @@ static int __maybe_unused pcnet32_pm_suspend(struct d= evice *device_d) pcnet32_close(dev); } =20 + netif_disable_async_ops(dev); return 0; } =20 @@ -2929,6 +2961,7 @@ static int __maybe_unused pcnet32_pm_resume(struct de= vice *device_d) { struct net_device *dev =3D dev_get_drvdata(device_d); =20 + netif_enable_async_ops(dev); if (netif_running(dev)) { pcnet32_open(dev); netif_device_attach(dev); @@ -2937,6 +2970,13 @@ static int __maybe_unused pcnet32_pm_resume(struct d= evice *device_d) return 0; } =20 +static void pcnet32_shutdown(struct pci_dev *pdev) +{ + struct net_device *dev =3D pci_get_drvdata(pdev); + + netif_disable_async_ops(dev); +} + static void pcnet32_remove_one(struct pci_dev *pdev) { struct net_device *dev =3D pci_get_drvdata(pdev); @@ -2964,6 +3004,7 @@ static struct pci_driver pcnet32_driver =3D { .driver =3D { .pm =3D &pcnet32_pm_ops, }, + .shutdown =3D pcnet32_shutdown, }; =20 /* An additional parameter that may be passed in... */ --=20 2.47.3