mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-26 11:40:24 +02:00
Merge branch 'net-stmmac-fixes-for-stmmac-tx-vlan-insert-and-est'
Rohan G Thomas says:
====================
net: stmmac: Fixes for stmmac Tx VLAN insert and EST
This patchset includes following fixes for stmmac Tx VLAN insert and
EST implementations:
1. Disable STAG insertion offloading, as DWMAC IPs doesn't support
offload of STAG for double VLAN packets and CTAG for single VLAN
packets when using the same register configuration. The current
configuration in the driver is undocumented and is adding an
additional 802.1Q tag with VLAN ID 0 for double VLAN packets.
2. Consider Tx VLAN offload tag length for maxSDU estimation.
3. Fix GCL bounds check
====================
Link: https://patch.msgid.link/20251028-qbv-fixes-v4-0-26481c7634e3@altera.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -4089,18 +4089,11 @@ static int stmmac_release(struct net_device *dev)
|
||||
static bool stmmac_vlan_insert(struct stmmac_priv *priv, struct sk_buff *skb,
|
||||
struct stmmac_tx_queue *tx_q)
|
||||
{
|
||||
u16 tag = 0x0, inner_tag = 0x0;
|
||||
u32 inner_type = 0x0;
|
||||
struct dma_desc *p;
|
||||
u16 tag = 0x0;
|
||||
|
||||
if (!priv->dma_cap.vlins)
|
||||
if (!priv->dma_cap.vlins || !skb_vlan_tag_present(skb))
|
||||
return false;
|
||||
if (!skb_vlan_tag_present(skb))
|
||||
return false;
|
||||
if (skb->vlan_proto == htons(ETH_P_8021AD)) {
|
||||
inner_tag = skb_vlan_tag_get(skb);
|
||||
inner_type = STMMAC_VLAN_INSERT;
|
||||
}
|
||||
|
||||
tag = skb_vlan_tag_get(skb);
|
||||
|
||||
@@ -4109,7 +4102,7 @@ static bool stmmac_vlan_insert(struct stmmac_priv *priv, struct sk_buff *skb,
|
||||
else
|
||||
p = &tx_q->dma_tx[tx_q->cur_tx];
|
||||
|
||||
if (stmmac_set_desc_vlan_tag(priv, p, tag, inner_tag, inner_type))
|
||||
if (stmmac_set_desc_vlan_tag(priv, p, tag, 0x0, 0x0))
|
||||
return false;
|
||||
|
||||
stmmac_set_tx_owner(priv, p);
|
||||
@@ -4507,6 +4500,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
bool has_vlan, set_ic;
|
||||
int entry, first_tx;
|
||||
dma_addr_t des;
|
||||
u32 sdu_len;
|
||||
|
||||
tx_q = &priv->dma_conf.tx_queue[queue];
|
||||
txq_stats = &priv->xstats.txq_stats[queue];
|
||||
@@ -4524,10 +4518,15 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
}
|
||||
|
||||
if (priv->est && priv->est->enable &&
|
||||
priv->est->max_sdu[queue] &&
|
||||
skb->len > priv->est->max_sdu[queue]){
|
||||
priv->xstats.max_sdu_txq_drop[queue]++;
|
||||
goto max_sdu_err;
|
||||
priv->est->max_sdu[queue]) {
|
||||
sdu_len = skb->len;
|
||||
/* Add VLAN tag length if VLAN tag insertion offload is requested */
|
||||
if (priv->dma_cap.vlins && skb_vlan_tag_present(skb))
|
||||
sdu_len += VLAN_HLEN;
|
||||
if (sdu_len > priv->est->max_sdu[queue]) {
|
||||
priv->xstats.max_sdu_txq_drop[queue]++;
|
||||
goto max_sdu_err;
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(stmmac_tx_avail(priv, queue) < nfrags + 1)) {
|
||||
@@ -7573,11 +7572,8 @@ int stmmac_dvr_probe(struct device *device,
|
||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||
ndev->features |= NETIF_F_HW_VLAN_STAG_FILTER;
|
||||
}
|
||||
if (priv->dma_cap.vlins) {
|
||||
if (priv->dma_cap.vlins)
|
||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_TX;
|
||||
if (priv->dma_cap.dvlan)
|
||||
ndev->features |= NETIF_F_HW_VLAN_STAG_TX;
|
||||
}
|
||||
#endif
|
||||
priv->msg_enable = netif_msg_init(debug, default_msg_level);
|
||||
|
||||
|
||||
@@ -981,7 +981,7 @@ static int tc_taprio_configure(struct stmmac_priv *priv,
|
||||
if (qopt->cmd == TAPRIO_CMD_DESTROY)
|
||||
goto disable;
|
||||
|
||||
if (qopt->num_entries >= dep)
|
||||
if (qopt->num_entries > dep)
|
||||
return -EINVAL;
|
||||
if (!qopt->cycle_time)
|
||||
return -ERANGE;
|
||||
@@ -1012,7 +1012,7 @@ static int tc_taprio_configure(struct stmmac_priv *priv,
|
||||
s64 delta_ns = qopt->entries[i].interval;
|
||||
u32 gates = qopt->entries[i].gate_mask;
|
||||
|
||||
if (delta_ns > GENMASK(wid, 0))
|
||||
if (delta_ns > GENMASK(wid - 1, 0))
|
||||
return -ERANGE;
|
||||
if (gates > GENMASK(31 - wid, 0))
|
||||
return -ERANGE;
|
||||
|
||||
@@ -212,7 +212,7 @@ static void vlan_enable(struct mac_device_info *hw, u32 type)
|
||||
|
||||
value = readl(ioaddr + VLAN_INCL);
|
||||
value |= VLAN_VLTI;
|
||||
value |= VLAN_CSVL; /* Only use SVLAN */
|
||||
value &= ~VLAN_CSVL; /* Only use CVLAN */
|
||||
value &= ~VLAN_VLC;
|
||||
value |= (type << VLAN_VLC_SHIFT) & VLAN_VLC;
|
||||
writel(value, ioaddr + VLAN_INCL);
|
||||
|
||||
Reference in New Issue
Block a user