diff options
Diffstat (limited to 'drivers/net/ethernet/stmicro/stmmac/stmmac_main.c')
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 32 | 
1 files changed, 14 insertions, 18 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 650d75b73e0b..7b90ecd3a55e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -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);  | 
