Skip to content

Commit 7f39642

Browse files
committed
HSD #15012771709: net: stmmac: Add option for VLAN filter fail queue enable
This option allows packet that fail VLAN filter to be routed to specific Rx queue when receive all is also set. When this option is enabled: - Enable VFFQ only when entering promiscuous mode, because receive all will pass up all rx packets that failed address filtering (similar to promiscuous mode). - VLAN-promiscuous mode is never entered to allow rx packet to fail VLAN filters and get routed to selected VFFQ Rx queue. Signed-off-by: Boon Khai Ng <[email protected]>
1 parent dd90c39 commit 7f39642

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@
8585
#define XGMAC_RXQ_CTRL3 0x000000ac
8686
#define XGMAC_PSRQ(x) GENMASK((x) * 8 + 7, (x) * 8)
8787
#define XGMAC_PSRQ_SHIFT(x) ((x) * 8)
88+
#define XGMAC_RXQ_CTRL4 0x00000094
89+
/* VFFQ mask might vary and depending on how many RX Q enabled */
90+
#define XGMAC_RXQCTRL_VFFQ_MASK GENMASK(19, 17);
91+
#define XGMAC_RXQCTRL_VFFQ_SHIFT 17
92+
#define XGMAC_RXQCTRL_VFFQE BIT(16)
8893
#define XGMAC_INT_STATUS 0x000000b0
8994
#define XGMAC_LPIIS BIT(5)
9095
#define XGMAC_PMTIS BIT(4)

drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,7 @@ static void dwxgmac2_set_filter(struct mac_device_info *hw,
659659
{
660660
void __iomem *ioaddr = (void __iomem *)dev->base_addr;
661661
u32 value = readl(ioaddr + XGMAC_PACKET_FILTER);
662+
u32 value_ctrl = 0;
662663
int mcbitslog2 = hw->mcast_bits_log2;
663664
u32 mc_filter[8];
664665
int i;
@@ -669,8 +670,17 @@ static void dwxgmac2_set_filter(struct mac_device_info *hw,
669670
memset(mc_filter, 0, sizeof(mc_filter));
670671

671672
if (dev->flags & IFF_PROMISC) {
672-
value |= XGMAC_FILTER_PR;
673-
value |= XGMAC_FILTER_PCF;
673+
if (hw->vlan_fail_q_en) {
674+
value_ctrl = readl(ioaddr + XGMAC_RXQ_CTRL4);
675+
value_ctrl &= ~XGMAC_RXQCTRL_VFFQ_MASK;
676+
value_ctrl |= XGMAC_RXQCTRL_VFFQE |
677+
(hw->vlan_fail_q << XGMAC_RXQCTRL_VFFQ_SHIFT);
678+
writel(value_ctrl, ioaddr + XGMAC_RXQ_CTRL4);
679+
value |= XGMAC_FILTER_PR | XGMAC_FILTER_RA;
680+
} else {
681+
value |= XGMAC_FILTER_PR | XGMAC_FILTER_PCF;
682+
}
683+
674684
} else if ((dev->flags & IFF_ALLMULTI) ||
675685
(netdev_mc_count(dev) > hw->multicast_filter_bins)) {
676686
value |= XGMAC_FILTER_PM;
@@ -715,7 +725,7 @@ static void dwxgmac2_set_filter(struct mac_device_info *hw,
715725

716726
writel(value, ioaddr + XGMAC_PACKET_FILTER);
717727

718-
if (dev->flags & IFF_PROMISC) {
728+
if (dev->flags & IFF_PROMISC && !hw->vlan_fail_q_en) {
719729
if (!hw->promisc) {
720730
hw->promisc = 1;
721731
dwxgmac2_vlan_promisc_enable(dev, hw);

drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,13 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
543543
dev_info(&pdev->dev, "RX VLAN HW Stripping\n");
544544
plat->use_hw_vlan = true;
545545
}
546+
547+
/*VLAN filter failed queue state */
548+
if (of_property_read_bool(np, "snps,vlan-fail-q-en")) {
549+
dev_info(&pdev->dev, "VLAN filter failed queue\n");
550+
plat->vlan_fail_q_en = true;
551+
plat->vlan_fail_q = plat->rx_queues_to_use - 1;
552+
}
546553
}
547554

548555
dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),

0 commit comments

Comments
 (0)