diff options
author | Alok Makhariya <B46187@freescale.com> | 2014-03-28 13:50:49 (GMT) |
---|---|---|
committer | Jose Rivera <German.Rivera@freescale.com> | 2014-03-31 18:56:37 (GMT) |
commit | 9237cde03c249f82423f1a238cfb5a369efbbcfc (patch) | |
tree | fa1704789e1144d6ce0185e0d0e6490ae1056259 /drivers/net/ethernet/freescale/asf_gianfar.c | |
parent | e054a24a775f4c91925693bcfefb4b9396a37345 (diff) | |
download | linux-fsl-qoriq-9237cde03c249f82423f1a238cfb5a369efbbcfc.tar.xz |
asf_gianfar: adding selective skb cleanup for asf processed pkt
CQ ID : ENGR00304852
Signed-off-by: Alok Makhariya <B46187@freescale.com>
Change-Id: Ifa4463e3c1eda512d9f2504eba42c8358b11c1ff
Reviewed-on: http://git.am.freescale.net:8181/10485
Reviewed-by: Rajan Gupta <rajan.gupta@freescale.com>
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
Diffstat (limited to 'drivers/net/ethernet/freescale/asf_gianfar.c')
-rw-r--r-- | drivers/net/ethernet/freescale/asf_gianfar.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/drivers/net/ethernet/freescale/asf_gianfar.c b/drivers/net/ethernet/freescale/asf_gianfar.c index 75102b8..c982353 100644 --- a/drivers/net/ethernet/freescale/asf_gianfar.c +++ b/drivers/net/ethernet/freescale/asf_gianfar.c @@ -32,6 +32,26 @@ EXPORT_SYMBOL(devfp_rx_hook); devfp_hook_t devfp_tx_hook; EXPORT_SYMBOL(devfp_tx_hook); +static inline void gfar_asf_reclaim_skb(struct sk_buff *skb) +{ + /* Just reset the fields used in software DPA */ + skb->next = skb->prev = NULL; + skb->dev = NULL; + skb->len = 0; + skb->ip_summed = 0; + skb->transport_header = 0; + skb->mac_header = 0; + skb->network_header = 0; + skb->pkt_type = 0; + skb->mac_len = 0; + skb->protocol = 0; + skb->vlan_tci = 0; + skb->data = 0; + /* reset data and tail pointers */ + skb->data = skb->head + NET_SKB_PAD; + skb_reset_tail_pointer(skb); +} + static inline void gfar_recycle_skb(struct sk_buff *skb) { struct sk_buff_head *h = &__get_cpu_var(skb_recycle_list); @@ -42,7 +62,10 @@ static inline void gfar_recycle_skb(struct sk_buff *skb) skb->fclone == SKB_FCLONE_UNAVAILABLE && !skb_shared(skb) && skb_end_offset(skb) == skb_size) { - skb_recycle(skb); + if (skb->pkt_type == PACKET_FASTROUTE) + gfar_asf_reclaim_skb(skb); + else + skb_recycle(skb); gfar_align_skb(skb); @@ -360,7 +383,10 @@ int gfar_asf_start_xmit(struct sk_buff *skb, struct net_device *dev) skb->new_skb = NULL; gfar_recycle_skb(skb); } else { - skb_recycle(skb); + if (skb->pkt_type == PACKET_FASTROUTE) + gfar_asf_reclaim_skb(skb); + else + skb_recycle(skb); gfar_align_skb(skb); skb->new_skb = skb; } |