Changeset 9333


Ignore:
Timestamp:
2007-10-16T14:53:22+02:00 (9 years ago)
Author:
ejka
Message:

Fix tx error handling (#2552). Make rx ring size actually configurable through
ethtool

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar7/files/drivers/net/cpmac.c

    r9282 r9333  
    461461        struct cpmac_priv *priv = netdev_priv(dev); 
    462462 
    463         if (unlikely(skb_padto(skb, ETH_ZLEN))) { 
    464                 if (netif_msg_tx_err(priv) && net_ratelimit()) 
    465                         printk(KERN_WARNING 
    466                                "%s: tx: padding failed, dropping\n", dev->name); 
    467                 spin_lock(&priv->lock); 
    468                 dev->stats.tx_dropped++; 
    469                 spin_unlock(&priv->lock); 
    470                 return -ENOMEM; 
    471         } 
     463        if (unlikely(skb_padto(skb, ETH_ZLEN))) 
     464                return NETDEV_TX_OK; 
    472465 
    473466        len = max(skb->len, ETH_ZLEN); 
     
    482475        if (unlikely(desc->dataflags & CPMAC_OWN)) { 
    483476                if (netif_msg_tx_err(priv) && net_ratelimit()) 
    484                         printk(KERN_WARNING "%s: tx dma ring full, dropping\n", 
     477                        printk(KERN_WARNING "%s: tx dma ring full\n", 
    485478                               dev->name); 
    486                 spin_lock(&priv->lock); 
    487                 dev->stats.tx_dropped++; 
    488                 spin_unlock(&priv->lock); 
    489                 dev_kfree_skb_any(skb); 
    490                 return -ENOMEM; 
     479                return NETDEV_TX_BUSY; 
    491480        } 
    492481 
     
    510499        cpmac_write(priv->regs, CPMAC_TX_PTR(queue), (u32)desc->mapping); 
    511500 
    512         return 0; 
     501        return NETDEV_TX_OK; 
    513502} 
    514503 
     
    647636        if (unlikely(!priv->desc_ring)) 
    648637                return; 
    649         for (i = 0; i < CPMAC_QUEUES; i++) 
     638        for (i = 0; i < CPMAC_QUEUES; i++) { 
     639                priv->desc_ring[i].dataflags = 0; 
    650640                if (priv->desc_ring[i].skb) { 
    651641                        dev_kfree_skb_any(priv->desc_ring[i].skb); 
     
    653643                            netif_wake_subqueue(dev, i); 
    654644                } 
     645        } 
    655646} 
    656647 
     
    728719        for (i = 0; i < CPMAC_QUEUES; i++) 
    729720                if (priv->desc_ring[i].skb) { 
     721                        priv->desc_ring[i].dataflags = 0; 
    730722                        dev_kfree_skb_any(priv->desc_ring[i].skb); 
    731723                        netif_wake_subqueue(dev, i); 
     
    733725                } 
    734726#else 
     727        priv->desc_ring[0].dataflags = 0; 
    735728        if (priv->desc_ring[0].skb) 
    736729                dev_kfree_skb_any(priv->desc_ring[0].skb); 
     
    795788        struct cpmac_priv *priv = netdev_priv(dev); 
    796789 
    797         if (dev->flags && IFF_UP) 
     790        if (netif_running(dev)) 
    798791                return -EBUSY; 
    799792        priv->ring_size = ring->rx_pending; 
Note: See TracChangeset for help on using the changeset viewer.