diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2008-04-02 10:11:11 -0700 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-04-16 20:41:35 -0400 |
commit | 26a17b7bbb36a8552d531bc1ad08472fb5aa3007 (patch) | |
tree | 3a1041cb4661f313fbba5e276f3d0eeef36d28d4 | |
parent | 9c28eaea90aef8db20004d29f924ad3059d9704e (diff) | |
download | op-kernel-dev-26a17b7bbb36a8552d531bc1ad08472fb5aa3007.zip op-kernel-dev-26a17b7bbb36a8552d531bc1ad08472fb5aa3007.tar.gz |
sc92031: start transmit return value bugfix
Any negative return value from start_xmit is interpreted as NETDEV_TX_LOCK
which is not what this driver wants. It should return 0 (NETDEV_TX_OK)
when it consumes a packet.
Also, use skb_padto() as the generic way to pad small frames.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r-- | drivers/net/sc92031.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/net/sc92031.c b/drivers/net/sc92031.c index af0422d..841bfa7 100644 --- a/drivers/net/sc92031.c +++ b/drivers/net/sc92031.c @@ -947,16 +947,16 @@ static struct net_device_stats *sc92031_get_stats(struct net_device *dev) static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev) { - int err = 0; struct sc92031_priv *priv = netdev_priv(dev); void __iomem *port_base = priv->port_base; - unsigned len; unsigned entry; u32 tx_status; + if (skb_padto(skb, ETH_ZLEN)) + return NETDEV_TX_OK; + if (unlikely(skb->len > TX_BUF_SIZE)) { - err = -EMSGSIZE; dev->stats.tx_dropped++; goto out; } @@ -964,7 +964,6 @@ static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev) spin_lock(&priv->lock); if (unlikely(!netif_carrier_ok(dev))) { - err = -ENOLINK; dev->stats.tx_dropped++; goto out_unlock; } @@ -976,11 +975,6 @@ static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev) skb_copy_and_csum_dev(skb, priv->tx_bufs + entry * TX_BUF_SIZE); len = skb->len; - if (unlikely(len < ETH_ZLEN)) { - memset(priv->tx_bufs + entry * TX_BUF_SIZE + len, - 0, ETH_ZLEN - len); - len = ETH_ZLEN; - } wmb(); @@ -1007,7 +1001,7 @@ out_unlock: out: dev_kfree_skb(skb); - return err; + return NETDEV_TX_OK; } static int sc92031_open(struct net_device *dev) |