OpenCloudOS-Kernel/drivers/net/ethernet
Florian Fainelli 8b8e6e7824 net: systemport: Add global locking for descriptor lifecycle
The descriptor list is a shared resource across all of the transmit queues, and
the locking mechanism used today only protects concurrency across a given
transmit queue between the transmit and reclaiming. This creates an opportunity
for the SYSTEMPORT hardware to work on corrupted descriptors if we have
multiple producers at once which is the case when using multiple transmit
queues.

This was particularly noticeable when using multiple flows/transmit queues and
it showed up in interesting ways in that UDP packets would get a correct UDP
header checksum being calculated over an incorrect packet length. Similarly TCP
packets would get an equally correct checksum computed by the hardware over an
incorrect packet length.

The SYSTEMPORT hardware maintains an internal descriptor list that it re-arranges
when the driver produces a new descriptor anytime it writes to the
WRITE_PORT_{HI,LO} registers, there is however some delay in the hardware to
re-organize its descriptors and it is possible that concurrent TX queues
eventually break this internal allocation scheme to the point where the
length/status part of the descriptor gets used for an incorrect data buffer.

The fix is to impose a global serialization for all TX queues in the short
section where we are writing to the WRITE_PORT_{HI,LO} registers which solves
the corruption even with multiple concurrent TX queues being used.

Fixes: 80105befdb ("net: systemport: add Broadcom SYSTEMPORT Ethernet MAC driver")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20211215202450.4086240-1-f.fainelli@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2021-12-16 08:15:31 -08:00
..
3com ethernet: replace netdev->dev_addr 16bit writes 2021-10-14 09:22:27 -07:00
8390 ethernet: 8390: remove direct netdev->dev_addr writes 2021-10-09 11:46:57 +01:00
actions ethernet: constify references to netdev->dev_addr in drivers 2021-10-14 09:22:11 -07:00
adaptec ethernet: adaptec: use eth_hw_addr_set() 2021-10-16 08:53:45 +01:00
aeroflex ethernet: aeroflex: use eth_hw_addr_set() 2021-10-16 08:53:45 +01:00
agere ethernet: use eth_hw_addr_set() instead of ether_addr_copy() 2021-10-02 14:18:25 +01:00
alacritech ethernet: constify references to netdev->dev_addr in drivers 2021-10-14 09:22:11 -07:00
allwinner ethernet: use of_get_ethdev_address() 2021-10-07 13:39:51 +01:00
alteon ethernet: alteon: use eth_hw_addr_set() 2021-10-16 08:53:46 +01:00
altera net: altera: set a couple error code in probe() 2021-12-03 14:23:11 +00:00
amazon ethernet: use eth_hw_addr_set() instead of ether_addr_copy() 2021-10-02 14:18:25 +01:00
amd Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-11-01 20:05:14 -07:00
apm ethernet: constify references to netdev->dev_addr in drivers 2021-10-14 09:22:11 -07:00
apple ethernet: replace netdev->dev_addr assignment loops 2021-10-14 09:22:25 -07:00
aquantia ethernet: aquantia: Try MAC address from device tree 2021-12-02 12:06:03 +00:00
arc Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-10-14 16:50:14 -07:00
asix net: ax88796c: do not receive data in pointer 2021-11-22 14:32:05 +00:00
atheros net: convert users of bitmap_foo() to linkmode_foo() 2021-10-24 13:58:52 +01:00
broadcom net: systemport: Add global locking for descriptor lifecycle 2021-12-16 08:15:31 -08:00
brocade ethernet: Remove redundant 'flush_workqueue()' calls 2021-10-10 11:33:15 +01:00
cadence net: macb: Fix mdio child node detection 2021-10-27 17:12:18 -07:00
calxeda ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
cavium net: liquidio: Make use of the helper macro kthread_run() 2021-10-22 11:10:10 -07:00
chelsio net: chelsio: cxgb4vf: Fix an error code in cxgb4vf_pci_probe() 2021-11-23 12:15:53 +00:00
cirrus ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
cisco ethernet: enic: use eth_hw_addr_set() 2021-10-16 08:53:46 +01:00
cortina ethernet: make use of eth_hw_addr_random() where appropriate 2021-10-14 09:22:15 -07:00
davicom ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
dec net: ethernet: dec: tulip: de4x5: fix possible array overflows in type3_infoblock() 2021-11-18 12:03:17 +00:00
dlink ethernet: replace netdev->dev_addr 16bit writes 2021-10-14 09:22:27 -07:00
emulex ethernet: constify references to netdev->dev_addr in drivers 2021-10-14 09:22:11 -07:00
ezchip ethernet: use of_get_ethdev_address() 2021-10-07 13:39:51 +01:00
faraday ethernet: make more use of device_get_ethdev_address() 2021-10-07 13:39:51 +01:00
freescale dpaa2-eth: fix ethtool statistics 2021-12-15 17:48:54 -08:00
fujitsu ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
google gve: fix for null pointer dereference. 2021-12-07 20:57:17 -08:00
hisilicon net: hns3: fix race condition in debugfs 2021-12-12 16:20:50 +00:00
huawei treewide: Add missing includes masked by cgroup -> bpf dependency 2021-12-03 10:58:13 -08:00
i825xx ethernet: replace netdev->dev_addr assignment loops 2021-10-14 09:22:25 -07:00
ibm ibmvnic: drop bad optimization in reuse_tx_pools() 2021-12-02 12:09:19 +00:00
intel ixgbe: set X550 MDIO speed before talking to PHY 2021-12-15 11:24:39 -08:00
litex litex_liteeth: Fix a double free in the remove function 2021-11-07 21:51:17 +00:00
marvell net: mvpp2: fix XDP rx queues registering 2021-12-08 18:29:37 -08:00
mediatek ethernet: constify references to netdev->dev_addr in drivers 2021-10-14 09:22:11 -07:00
mellanox mlxsw: spectrum_router: Consolidate MAC profiles when possible 2021-12-14 12:56:10 +00:00
micrel ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
microchip lan743x: fix deadlock in lan743x_phy_link_status_change() 2021-11-24 18:19:58 -08:00
microsoft net: mana: Fix memory leak in mana_hwc_create_wq 2021-12-09 07:58:41 -08:00
moxa ethernet: use eth_hw_addr_set() for dev->addr_len cases 2021-10-05 13:16:48 +01:00
mscc net: mscc: ocelot: fix missing unlock on error in ocelot_hwstamp_set() 2021-11-29 20:20:34 -08:00
myricom ethernet: replace netdev->dev_addr assignment loops 2021-10-14 09:22:25 -07:00
natsemi natsemi: xtensa: fix section mismatch warnings 2021-11-30 18:13:37 -08:00
neterion Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-10-14 16:50:14 -07:00
netronome nfp: Fix memory leak in nfp_cpp_area_cache_add() 2021-12-09 07:53:33 -08:00
ni nixge: fix mac address error handling again 2021-11-22 15:05:48 +00:00
nvidia ethernet: forcedeth: remove direct netdev->dev_addr writes 2021-10-09 11:46:56 +01:00
nxp Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-10-28 10:43:58 -07:00
oki-semi ethernet: use eth_hw_addr_set() for dev->addr_len cases 2021-10-05 13:16:48 +01:00
packetengines ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
pasemi ethernet: manually convert memcpy(dev_addr,..., sizeof(addr)) 2021-10-14 09:22:19 -07:00
pensando net: convert users of bitmap_foo() to linkmode_foo() 2021-10-24 13:58:52 +01:00
qlogic net/qla3xxx: fix an error code in ql_adapter_up() 2021-12-07 10:37:10 -08:00
qualcomm ethernet: make use of eth_hw_addr_random() where appropriate 2021-10-14 09:22:15 -07:00
rdc ethernet: replace netdev->dev_addr 16bit writes 2021-10-14 09:22:27 -07:00
realtek r8169: fix incorrect mac address assignment 2021-11-23 12:12:37 +00:00
renesas ethernet: renesas: use eth_hw_addr_set() 2021-10-19 12:41:47 +01:00
rocker ethernet: rocker: use eth_hw_addr_set() 2021-10-19 12:41:47 +01:00
samsung ethernet: sxgbe: use eth_hw_addr_set() 2021-10-19 12:41:48 +01:00
seeq ethernet: use eth_hw_addr_set() for dev->addr_len cases 2021-10-05 13:16:48 +01:00
sfc sfc_ef100: potential dereference of null pointer 2021-12-16 10:55:32 +00:00
sgi ethernet: use eth_hw_addr_set() for dev->addr_len cases 2021-10-05 13:16:48 +01:00
silan ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
sis ethernet: sis900: fix indentation 2021-11-12 20:13:28 -08:00
smsc ethernet: smsc: use eth_hw_addr_set() 2021-10-19 12:41:48 +01:00
socionext ethernet: netsec: use eth_hw_addr_set() 2021-10-20 11:41:01 +01:00
stmicro net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup 2021-12-16 10:47:48 +00:00
sun ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
synopsys ethernet: constify references to netdev->dev_addr in drivers 2021-10-14 09:22:11 -07:00
tehuti ethernet: tehuti: use eth_hw_addr_set() 2021-10-20 11:41:01 +01:00
ti net: ethernet: ti: add missing of_node_put before return 2021-12-13 14:54:54 +00:00
toshiba ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
tundra
via ethernet: via-velocity: use eth_hw_addr_set() 2021-10-20 11:41:01 +01:00
wiznet net: w5100: Make w5100_remove() return void 2021-10-18 12:59:12 +01:00
xilinx net: convert users of bitmap_foo() to linkmode_foo() 2021-10-24 13:58:52 +01:00
xircom ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
xscale net: ethernet: ixp4xx: Make use of dma_pool_zalloc() instead of dma_pool_alloc/memset() 2021-10-19 13:24:26 +01:00
Kconfig net: ax88796c: ASIX AX88796C SPI Ethernet Adapter Driver 2021-10-21 16:28:41 -07:00
Makefile net: ax88796c: ASIX AX88796C SPI Ethernet Adapter Driver 2021-10-21 16:28:41 -07:00
dnet.c ethernet: manually convert memcpy(dev_addr,..., sizeof(addr)) 2021-10-14 09:22:19 -07:00
dnet.h
ec_bhf.c ethernet: ec_bhf: use eth_hw_addr_set() 2021-10-16 08:53:46 +01:00
ethoc.c ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
fealnx.c ethernet: use eth_hw_addr_set() in unmaintained drivers 2021-10-18 13:20:38 +01:00
jme.c ethernet: use eth_hw_addr_set() for dev->addr_len cases 2021-10-05 13:16:48 +01:00
jme.h
korina.c ethernet: use of_get_ethdev_address() 2021-10-07 13:39:51 +01:00
lantiq_etop.c net: ethernet: lantiq_etop: fix build errors/warnings 2021-11-15 14:08:52 +00:00
lantiq_xrx200.c net: lantiq_xrx200: Hardcode the burst length value 2021-10-29 12:15:35 +01:00