X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=net%2Fdsa%2Fslave.c;h=5fc87ee539052eea4c6ec3335218074c9313f76f;hb=4ed70ce9f01c998999e48642a768d9013bee2c4f;hp=0917123790eaf09b001c97a733039185fdb0a800;hpb=31b7a57c9eb3d90c87b6c2b855720ec709d2f6be;p=sagit-ice-cold%2Fkernel_xiaomi_msm8998.git diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 0917123790ea..5fc87ee53905 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -421,21 +421,32 @@ static int dsa_slave_port_attr_get(struct net_device *dev, static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev) { struct dsa_slave_priv *p = netdev_priv(dev); + struct sk_buff *nskb; - return p->xmit(skb, dev); -} + dev->stats.tx_packets++; + dev->stats.tx_bytes += skb->len; -static netdev_tx_t dsa_slave_notag_xmit(struct sk_buff *skb, - struct net_device *dev) -{ - struct dsa_slave_priv *p = netdev_priv(dev); + /* Transmit function may have to reallocate the original SKB */ + nskb = p->xmit(skb, dev); + if (!nskb) + return NETDEV_TX_OK; - skb->dev = p->parent->dst->master_netdev; - dev_queue_xmit(skb); + /* Queue the SKB for transmission on the parent interface, but + * do not modify its EtherType + */ + nskb->dev = p->parent->dst->master_netdev; + dev_queue_xmit(nskb); return NETDEV_TX_OK; } +static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb, + struct net_device *dev) +{ + /* Just return the original SKB */ + return skb; +} + /* ethtool operations *******************************************************/ static int