|
@@ -2055,19 +2055,23 @@ static int dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
|
|
|
/* MAX_SKB_FRAGS is equal or larger than our dpaa_SGT_MAX_ENTRIES;
|
|
|
* make sure we don't feed FMan with more fragments than it supports.
|
|
|
*/
|
|
|
- if (nonlinear &&
|
|
|
- likely(skb_shinfo(skb)->nr_frags < DPAA_SGT_MAX_ENTRIES)) {
|
|
|
- /* Just create a S/G fd based on the skb */
|
|
|
- err = skb_to_sg_fd(priv, skb, &fd);
|
|
|
- percpu_priv->tx_frag_skbuffs++;
|
|
|
- } else {
|
|
|
+ if (unlikely(nonlinear &&
|
|
|
+ (skb_shinfo(skb)->nr_frags >= DPAA_SGT_MAX_ENTRIES))) {
|
|
|
/* If the egress skb contains more fragments than we support
|
|
|
* we have no choice but to linearize it ourselves.
|
|
|
*/
|
|
|
- if (unlikely(nonlinear) && __skb_linearize(skb))
|
|
|
+ if (__skb_linearize(skb))
|
|
|
goto enomem;
|
|
|
|
|
|
- /* Finally, create a contig FD from this skb */
|
|
|
+ nonlinear = skb_is_nonlinear(skb);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nonlinear) {
|
|
|
+ /* Just create a S/G fd based on the skb */
|
|
|
+ err = skb_to_sg_fd(priv, skb, &fd);
|
|
|
+ percpu_priv->tx_frag_skbuffs++;
|
|
|
+ } else {
|
|
|
+ /* Create a contig FD from this skb */
|
|
|
err = skb_to_contig_fd(priv, skb, &fd, &offset);
|
|
|
}
|
|
|
if (unlikely(err < 0))
|