| From 41c339eeb130cc3965e899bd043b92323af95fba Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 2 Feb 2026 17:39:09 -0800 |
| Subject: net: usb: sr9700: remove code to drive nonexistent multicast filter |
| |
| From: Ethan Nelson-Moore <enelsonmoore@gmail.com> |
| |
| [ 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 | 1 - |
| drivers/net/usb/sr9700.c | 25 ++++--------------------- |
| drivers/net/usb/sr9700.h | 7 +------ |
| 3 files changed, 5 insertions(+), 28 deletions(-) |
| |
| diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig |
| index 867ff2ee8ecf3..e1ec0c6b33429 100644 |
| --- a/drivers/net/usb/Kconfig |
| +++ b/drivers/net/usb/Kconfig |
| @@ -318,7 +318,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. |
| diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c |
| index 4d860d5bbcd73..9dbce3232d7c2 100644 |
| --- a/drivers/net/usb/sr9700.c |
| +++ b/drivers/net/usb/sr9700.c |
| @@ -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" |
| @@ -264,31 +263,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); |
| } |
| |
| diff --git a/drivers/net/usb/sr9700.h b/drivers/net/usb/sr9700.h |
| index ea2b4de621c86..c479908f7d823 100644 |
| --- a/drivers/net/usb/sr9700.h |
| +++ b/drivers/net/usb/sr9700.h |
| @@ -104,9 +104,7 @@ |
| #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) |
| @@ -161,9 +159,6 @@ |
| /* 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 */ |
| |
| -- |
| 2.51.0 |
| |