summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorRajan Gupta <rajan.gupta@freescale.com>2013-04-23 23:41:11 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-04-24 21:35:53 (GMT)
commita3d892e8b1a2c72ec238dde6e94bd8170e1c3552 (patch)
tree91e09f63dd79f6886e06125f7334dedae506da80 /drivers/net
parentd3852529d3adbf7284ec28ff4c15132a7d832334 (diff)
downloadlinux-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.c28
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 {