Re: [PATCH v5 2/2] Ethernet driver for the WIZnet W5100 chip

From: Eric Dumazet
Date: Fri Mar 30 2012 - 05:23:59 EST


Le vendredi 30 mars 2012 Ã 13:00 +0600, Mike Sinkovsky a Ãcrit :
> Tested and used in production with Blackfin BF531 embedded processor.
>
> Signed-off-by: Mike Sinkovsky <msink@xxxxxxxxxxxxx>
> ---

> +
> +static int w5100_start_tx(struct sk_buff *skb, struct net_device *ndev)
> +{
> + struct w5100_priv *priv = netdev_priv(ndev);
> + u16 offset;
> +
> + if (w5100_read16(priv, W5100_S0_TX_FSR) < skb->len) {

There is a race here.

Interrupt came come right here before you set the stop_queue()


> + netif_stop_queue(ndev);

So Here I suggest adding a test again

if (w5100_read16(priv, W5100_S0_TX_FSR) >= skb->len)
netif_wake_queue(ndev);
else
return NETDEV_TX_BUSY;

> + return NETDEV_TX_BUSY;
> + }
> +
> + offset = w5100_read16(priv, W5100_S0_TX_WR);
> + w5100_writebuf(priv, offset, skb->data, skb->len);
> + w5100_write16(priv, W5100_S0_TX_WR, offset + skb->len);
> + w5100_command(priv, S0_CR_SEND);
> + ndev->stats.tx_bytes += skb->len;
> + ndev->stats.tx_packets++;
> + dev_kfree_skb(skb);
> +
> + return NETDEV_TX_OK;
> +}
> +



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/