Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: systemport: Add support for RDMA overflow statistic counter

RDMA overflows can happen if the Ethernet controller does not have
enough bandwidth allocated at the memory controller level, report RDMA
overflows and deal with saturation, similar to the RBUF overflow
counter.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20221028222141.3208429-1-f.fainelli@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Florian Fainelli and committed by
Jakub Kicinski
b98deb2f 37c84890

+22
+11
drivers/net/ethernet/broadcom/bcmsysport.c
··· 295 295 /* RBUF misc statistics */ 296 296 STAT_RBUF("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt, RBUF_OVFL_DISC_CNTR), 297 297 STAT_RBUF("rbuf_err_cnt", mib.rbuf_err_cnt, RBUF_ERR_PKT_CNTR), 298 + /* RDMA misc statistics */ 299 + STAT_RDMA("rdma_ovflow_cnt", mib.rdma_ovflow_cnt, RDMA_OVFL_DISC_CNTR), 298 300 STAT_MIB_SOFT("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), 299 301 STAT_MIB_SOFT("rx_dma_failed", mib.rx_dma_failed), 300 302 STAT_MIB_SOFT("tx_dma_failed", mib.tx_dma_failed), ··· 335 333 case BCM_SYSPORT_STAT_NETDEV64: 336 334 case BCM_SYSPORT_STAT_RXCHK: 337 335 case BCM_SYSPORT_STAT_RBUF: 336 + case BCM_SYSPORT_STAT_RDMA: 338 337 case BCM_SYSPORT_STAT_SOFT: 339 338 return true; 340 339 default: ··· 438 435 val = rbuf_readl(priv, s->reg_offset); 439 436 if (val == ~0) 440 437 rbuf_writel(priv, 0, s->reg_offset); 438 + break; 439 + case BCM_SYSPORT_STAT_RDMA: 440 + if (!priv->is_lite) 441 + continue; 442 + 443 + val = rdma_readl(priv, s->reg_offset); 444 + if (val == ~0) 445 + rdma_writel(priv, 0, s->reg_offset); 441 446 break; 442 447 } 443 448
+11
drivers/net/ethernet/broadcom/bcmsysport.h
··· 290 290 291 291 #define RDMA_WRITE_PTR_HI 0x1010 292 292 #define RDMA_WRITE_PTR_LO 0x1014 293 + #define RDMA_OVFL_DISC_CNTR 0x1018 293 294 #define RDMA_PROD_INDEX 0x1018 294 295 #define RDMA_PROD_INDEX_MASK 0xffff 295 296 ··· 566 565 u32 rxchk_other_pkt_disc; 567 566 u32 rbuf_ovflow_cnt; 568 567 u32 rbuf_err_cnt; 568 + u32 rdma_ovflow_cnt; 569 569 u32 alloc_rx_buff_failed; 570 570 u32 rx_dma_failed; 571 571 u32 tx_dma_failed; ··· 583 581 BCM_SYSPORT_STAT_RUNT, 584 582 BCM_SYSPORT_STAT_RXCHK, 585 583 BCM_SYSPORT_STAT_RBUF, 584 + BCM_SYSPORT_STAT_RDMA, 586 585 BCM_SYSPORT_STAT_SOFT, 587 586 }; 588 587 ··· 627 624 .stat_sizeof = sizeof(((struct bcm_sysport_priv *)0)->m), \ 628 625 .stat_offset = offsetof(struct bcm_sysport_priv, m), \ 629 626 .type = BCM_SYSPORT_STAT_RBUF, \ 627 + .reg_offset = ofs, \ 628 + } 629 + 630 + #define STAT_RDMA(str, m, ofs) { \ 631 + .stat_string = str, \ 632 + .stat_sizeof = sizeof(((struct bcm_sysport_priv *)0)->m), \ 633 + .stat_offset = offsetof(struct bcm_sysport_priv, m), \ 634 + .type = BCM_SYSPORT_STAT_RDMA, \ 630 635 .reg_offset = ofs, \ 631 636 } 632 637