summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale/asf_gianfar.c
diff options
context:
space:
mode:
authorAlok Makhariya <B46187@freescale.com>2014-03-28 13:50:49 (GMT)
committerJose Rivera <German.Rivera@freescale.com>2014-03-31 18:56:37 (GMT)
commit9237cde03c249f82423f1a238cfb5a369efbbcfc (patch)
treefa1704789e1144d6ce0185e0d0e6490ae1056259 /drivers/net/ethernet/freescale/asf_gianfar.c
parente054a24a775f4c91925693bcfefb4b9396a37345 (diff)
downloadlinux-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.c30
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;
}