[net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121
Anatolij Gustschin
agust at denx.de
Thu Feb 18 08:31:04 EST 2010
On Wed, 17 Feb 2010 16:17:16 +0100
Eric Dumazet <eric.dumazet at gmail.com> wrote:
> Le mercredi 17 février 2010 à 15:55 +0100, Anatolij Gustschin a écrit :
...
> > +static struct sk_buff *tx_skb_align_workaround(struct net_device *dev,
> > + struct sk_buff *skb)
> > +{
> > + struct sk_buff *new_skb;
> > + struct fs_enet_private *fep = netdev_priv(dev);
> > +
> > + /* Alloc new skb */
> > + new_skb = dev_alloc_skb(ENET_RX_FRSIZE + 4);
>
>
> ENET_RX_FRSIZE looks strange in TX path
>
> Why not using skb->len + 4 instead of ENET_RX_FRSIZE + 4 ?
I will fix it.
> > + if (!new_skb) {
> > + dev_warn(fep->dev, "Memory squeeze, dropping tx packet.\n");
>
> I am just wondering if this is ratelimited ?
Right, it should be ratelimited, will fix it, too.
...
> > static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
> > {
> > struct fs_enet_private *fep = netdev_priv(dev);
> > @@ -588,6 +619,19 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
> > u16 sc;
> > unsigned long flags;
> >
> > +#ifdef CONFIG_FS_ENET_MPC5121_FEC
> > + if (((unsigned long)skb->data) & 0x3) {
> > + skb = tx_skb_align_workaround(dev, skb);
> > + if (!skb) {
> > + /*
> > + * We have lost packet due to memory allocation error
> > + * in tx_skb_align_workaround(). Hopefully original
> > + * skb is still valid, so try transmit it later.
> > + */
>
> Could you define 'try to transmit later' ?
> Who is responsible to trigger this event ?
The function returns NETDEV_TX_BUSY here, skb is not
consumed and will be requeued by sch_direct_xmit(), so
it is scheduled for resending later.
Thanks,
Anatolij
More information about the Linuxppc-dev
mailing list