diff options
author | Rajan Gupta <rajan.gupta@freescale.com> | 2013-04-23 23:41:11 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-04-24 21:35:53 (GMT) |
commit | a3d892e8b1a2c72ec238dde6e94bd8170e1c3552 (patch) | |
tree | 91e09f63dd79f6886e06125f7334dedae506da80 /drivers/net | |
parent | d3852529d3adbf7284ec28ff4c15132a7d832334 (diff) | |
download | linux-fsl-qoriq-a3d892e8b1a2c72ec238dde6e94bd8170e1c3552.tar.xz |
gianfar: asf: Adding selective cleanup of skb fields for ASF processed pkts
ASF uses only few skb fields, this patch adds a asf specific skb-reclaim function
to reset only ASF used SKB fields.
Change-Id: Ia96d887fc2e28fd28402fb412f77ce786da8c8a6
Signed-off-by: Rajan Gupta <rajan.gupta@freescale.com>
Reviewed-on: http://git.am.freescale.net:8181/2060
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/freescale/gianfar.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 24e3cd7..ca3fa0a 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c @@ -2448,6 +2448,29 @@ static inline struct txbd8 *next_txbd(struct txbd8 *bdp, struct txbd8 *base, return skip_txbd(bdp, 1, base, ring_size); } +#ifdef CONFIG_AS_FASTPATH +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 = NULL; + skb->mac_header = NULL; + skb->network_header = NULL; + 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); + +} +#endif /* This is called by the kernel when a frame is ready for transmission. * It is pointed to by the dev->hard_start_xmit function pointer */ @@ -2565,6 +2588,11 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) if (tx_queue->tx_skbuff[skb_curtx]) { if (skb_is_recycleable(tx_queue->tx_skbuff[skb_curtx], DEFAULT_RX_BUFFER_SIZE + RXBUF_ALIGNMENT)) { +#ifdef CONFIG_AS_FASTPATH + if (tx_queue->tx_skbuff[skb_curtx]->pkt_type == PACKET_FASTROUTE) + gfar_asf_reclaim_skb(tx_queue->tx_skbuff[skb_curtx]); + else +#endif skb_recycle(tx_queue->tx_skbuff[skb_curtx]); gfar_align_skb(tx_queue->tx_skbuff[skb_curtx]); } else { |