summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorRajan Gupta <rajan.gupta@freescale.com>2013-05-25 01:29:48 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-05-28 18:59:51 (GMT)
commitc8a2d92fef102e1c03155d6554023b7a58781b28 (patch)
treebe3f774600678cc9fc6681402de63ea031040784 /drivers/net
parenta07349fdfe45486050fbebebb54d002561f8a709 (diff)
downloadlinux-fsl-qoriq-c8a2d92fef102e1c03155d6554023b7a58781b28.tar.xz
gianfar: asf: optimizations for ASF IPsec forwarding
Patch optimizes the skb clean up for packets processed by ASF IPsec by using gfar_asf_reclaim_skb() instead of skb_recycle(). Patch also re-cycles the SKB after DMA to eTsec, instead of recycling it when the TX BD is used next time. Change-Id: Iaa396ee2ac89a1ee8b5e8434870481f18674a6d9 Signed-off-by: Rajan Gupta <rajan.gupta@freescale.com> Reviewed-on: http://git.am.freescale.net:8181/2713 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Manoil Claudiu-B08782 <claudiu.manoil@freescale.com> Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/freescale/gianfar.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index f68940b..a53231c 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -2561,7 +2561,6 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
int i, rq = 0, do_tstamp = 0;
u32 bufaddr;
#ifdef CONFIG_RX_TX_BUFF_XCHG
- struct sk_buff *new_skb;
int skb_curtx = 0;
#else
unsigned long flags;
@@ -2660,10 +2659,6 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* BD is free to be used by s/w */
/* Free skb for this BD if not recycled */
- if (tx_queue->tx_skbuff[skb_curtx]) {
- gfar_recycle_skb(priv, tx_queue->tx_skbuff[skb_curtx]);
- tx_queue->tx_skbuff[skb_curtx] = NULL;
- }
txbdp->lstatus &= BD_LFLAG(TXBD_WRAP);
skb_curtx = (skb_curtx + 1)
@@ -2853,8 +2848,8 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
#ifdef CONFIG_RX_TX_BUFF_XCHG
if ((skb->owner != RT_PKT_ID) ||
(!skb_is_recycleable(skb, DEFAULT_RX_BUFFER_SIZE + RXBUF_ALIGNMENT))) {
- tx_queue->tx_skbuff[skb_curtx] = skb;
skb->new_skb = NULL;
+ gfar_recycle_skb(priv, skb);
} else {
#ifdef CONFIG_AS_FASTPATH
if (skb->pkt_type == PACKET_FASTROUTE)
@@ -2885,7 +2880,6 @@ int gfar_fast_xmit(struct sk_buff *skb, struct net_device *dev)
u32 lstatus;
int rq = 0;
#ifdef CONFIG_RX_TX_BUFF_XCHG
- struct sk_buff *new_skb;
int skb_curtx = 0;
#else
unsigned long flags;
@@ -2934,11 +2928,6 @@ int gfar_fast_xmit(struct sk_buff *skb, struct net_device *dev)
/* BD is free to be used by s/w */
/* Free skb for this BD if not recycled */
- if (tx_queue->tx_skbuff[skb_curtx]) {
- gfar_recycle_skb(priv, tx_queue->tx_skbuff[skb_curtx]);
- tx_queue->tx_skbuff[skb_curtx] = NULL;
- }
-
txbdp->lstatus &= BD_LFLAG(TXBD_WRAP);
#endif
/* Update transmit stats */
@@ -3027,8 +3016,8 @@ int gfar_fast_xmit(struct sk_buff *skb, struct net_device *dev)
#ifdef CONFIG_RX_TX_BUFF_XCHG
if ((skb->owner != RT_PKT_ID) ||
(!skb_is_recycleable(skb, DEFAULT_RX_BUFFER_SIZE + RXBUF_ALIGNMENT))) {
- tx_queue->tx_skbuff[skb_curtx] = skb;
skb->new_skb = NULL;
+ gfar_recycle_skb(priv, skb);
} else {
gfar_asf_reclaim_skb(skb);
gfar_align_skb(skb);
@@ -3245,6 +3234,11 @@ static void gfar_recycle_skb(struct gfar_private *priv, struct sk_buff *skb)
if (likely(skb_queue_len(&local->recycle_q) < GFAR_RECYCLE_MAX)) {
local->recycle_cnt++;
+#ifdef CONFIG_AS_FASTPATH
+ if (skb->pkt_type == PACKET_FASTROUTE)
+ gfar_asf_reclaim_skb(skb);
+ else
+#endif
skb_recycle(skb);
gfar_align_skb(skb);