Skip to content

Commit

Permalink
net: lpc_eth: free skbs in start_xmit
Browse files Browse the repository at this point in the history
Transmitted skbs can be freed immediately in lpc_eth_hard_start_xmit()
instead of at TX completion, since driver copies the frames in DMA area.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Tested-by: Roland Stigge <stigge@antcom.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Jun 17, 2012
1 parent 79504d7 commit a7e2eaa
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions drivers/net/ethernet/nxp/lpc_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ struct netdata_local {
spinlock_t lock;
void __iomem *net_base;
u32 msg_enable;
struct sk_buff *skb[ENET_TX_DESC];
unsigned int skblen[ENET_TX_DESC];
unsigned int last_tx_idx;
unsigned int num_used_tx_buffs;
struct mii_bus *mii_bus;
Expand Down Expand Up @@ -903,12 +903,11 @@ static int lpc_mii_init(struct netdata_local *pldat)
static void __lpc_handle_xmit(struct net_device *ndev)
{
struct netdata_local *pldat = netdev_priv(ndev);
struct sk_buff *skb;
u32 txcidx, *ptxstat, txstat;

txcidx = readl(LPC_ENET_TXCONSUMEINDEX(pldat->net_base));
while (pldat->last_tx_idx != txcidx) {
skb = pldat->skb[pldat->last_tx_idx];
unsigned int skblen = pldat->skblen[pldat->last_tx_idx];

/* A buffer is available, get buffer status */
ptxstat = &pldat->tx_stat_v[pldat->last_tx_idx];
Expand Down Expand Up @@ -945,9 +944,8 @@ static void __lpc_handle_xmit(struct net_device *ndev)
} else {
/* Update stats */
ndev->stats.tx_packets++;
ndev->stats.tx_bytes += skb->len;
ndev->stats.tx_bytes += skblen;
}
dev_kfree_skb_irq(skb);

txcidx = readl(LPC_ENET_TXCONSUMEINDEX(pldat->net_base));
}
Expand Down Expand Up @@ -1132,7 +1130,7 @@ static int lpc_eth_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev)
memcpy(pldat->tx_buff_v + txidx * ENET_MAXF_SIZE, skb->data, len);

/* Save the buffer and increment the buffer counter */
pldat->skb[txidx] = skb;
pldat->skblen[txidx] = len;
pldat->num_used_tx_buffs++;

/* Start transmit */
Expand All @@ -1147,6 +1145,7 @@ static int lpc_eth_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev)

spin_unlock_irq(&pldat->lock);

dev_kfree_skb(skb);
return NETDEV_TX_OK;
}

Expand Down

0 comments on commit a7e2eaa

Please sign in to comment.