]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: usb: sr9700: remove code to drive nonexistent multicast filter
authorEthan Nelson-Moore <enelsonmoore@gmail.com>
Tue, 3 Feb 2026 01:39:09 +0000 (17:39 -0800)
committerSasha Levin <sashal@kernel.org>
Wed, 4 Mar 2026 12:20:32 +0000 (07:20 -0500)
[ Upstream commit 9a9424c756feee9ee6e717405a9d6fa7bacdef08 ]

Several registers referenced in this driver's source code do not
actually exist (they are not writable and read as zero in my testing).
They exist in this driver because it originated as a copy of the dm9601
driver. Notably, these include the multicast filter registers - this
causes the driver to not support multicast packets correctly. Remove
the multicast filter code and register definitions. Instead, set the
chip to receive all multicast filter packets when any multicast
addresses are in the list.

Reviewed-by: Simon Horman <horms@kernel.org> (from v1)
Signed-off-by: Ethan Nelson-Moore <enelsonmoore@gmail.com>
Link: https://patch.msgid.link/20260203013924.28582-1-enelsonmoore@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/usb/Kconfig
drivers/net/usb/sr9700.c
drivers/net/usb/sr9700.h

index 856e648d804e02642d156b97a4ce7a4df475e3a9..da0f6a138f4fc73aed1db1216fedb6ec7d9a9662 100644 (file)
@@ -319,7 +319,6 @@ config USB_NET_DM9601
 config USB_NET_SR9700
        tristate "CoreChip-sz SR9700 based USB 1.1 10/100 ethernet devices"
        depends on USB_USBNET
-       select CRC32
        help
          This option adds support for CoreChip-sz SR9700 based USB 1.1
          10/100 Ethernet adapters.
index 820c4c50697921c59c6466387c21e54bdb334ea9..a5d364fbc36391292a9657b2e46cbbdeb7675a78 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/ethtool.h>
 #include <linux/mii.h>
 #include <linux/usb.h>
-#include <linux/crc32.h>
 #include <linux/usb/usbnet.h>
 
 #include "sr9700.h"
@@ -265,31 +264,15 @@ static const struct ethtool_ops sr9700_ethtool_ops = {
 static void sr9700_set_multicast(struct net_device *netdev)
 {
        struct usbnet *dev = netdev_priv(netdev);
-       /* We use the 20 byte dev->data for our 8 byte filter buffer
-        * to avoid allocating memory that is tricky to free later
-        */
-       u8 *hashes = (u8 *)&dev->data;
        /* rx_ctl setting : enable, disable_long, disable_crc */
        u8 rx_ctl = RCR_RXEN | RCR_DIS_CRC | RCR_DIS_LONG;
 
-       memset(hashes, 0x00, SR_MCAST_SIZE);
-       /* broadcast address */
-       hashes[SR_MCAST_SIZE - 1] |= SR_MCAST_ADDR_FLAG;
-       if (netdev->flags & IFF_PROMISC) {
+       if (netdev->flags & IFF_PROMISC)
                rx_ctl |= RCR_PRMSC;
-       } else if (netdev->flags & IFF_ALLMULTI ||
-                  netdev_mc_count(netdev) > SR_MCAST_MAX) {
-               rx_ctl |= RCR_RUNT;
-       } else if (!netdev_mc_empty(netdev)) {
-               struct netdev_hw_addr *ha;
-
-               netdev_for_each_mc_addr(ha, netdev) {
-                       u32 crc = ether_crc(ETH_ALEN, ha->addr) >> 26;
-                       hashes[crc >> 3] |= 1 << (crc & 0x7);
-               }
-       }
+       else if (netdev->flags & IFF_ALLMULTI || !netdev_mc_empty(netdev))
+               /* The chip has no multicast filter */
+               rx_ctl |= RCR_ALL;
 
-       sr_write_async(dev, SR_MAR, SR_MCAST_SIZE, hashes);
        sr_write_reg_async(dev, SR_RCR, rx_ctl);
 }
 
index ea2b4de621c867770c15b69498a40546fd523883..c479908f7d823dd7482268b183ec6f90e637cefc 100644 (file)
 #define                WCR_LINKEN              (1 << 5)
 /* Physical Address Reg */
 #define        SR_PAR                  0x10    /* 0x10 ~ 0x15 6 bytes for PAR */
-/* Multicast Address Reg */
-#define        SR_MAR                  0x16    /* 0x16 ~ 0x1D 8 bytes for MAR */
-/* 0x1e unused */
+/* 0x16 --> 0x1E unused */
 /* Phy Reset Reg */
 #define        SR_PRR                  0x1F
 #define                PRR_PHY_RST             (1 << 0)
 /* parameters */
 #define        SR_SHARE_TIMEOUT        1000
 #define        SR_EEPROM_LEN           256
-#define        SR_MCAST_SIZE           8
-#define        SR_MCAST_ADDR_FLAG      0x80
-#define        SR_MCAST_MAX            64
 #define        SR_TX_OVERHEAD          2       /* 2bytes header */
 #define        SR_RX_OVERHEAD          7       /* 3bytes header + 4crc tail */