Changeset 22676 for branches/backfire


Ignore:
Timestamp:
2010-08-16T21:23:48+02:00 (6 years ago)
Author:
nbd
Message:

ar71xx: merge ethernet driver performance fixes from trunk

Location:
branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_ar8216.c

    r20677 r22676  
    4040        } 
    4141 
    42         skb_put(skb, pktlen); 
    4342        skb_pull(skb, AR8216_HEADER_LEN); 
    4443        return 0; 
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

    r22076 r22676  
    193193} 
    194194 
     195static int ag71xx_rx_reserve(struct ag71xx *ag) 
     196{ 
     197        int reserve = 0; 
     198 
     199        if (ag71xx_get_pdata(ag)->is_ar724x) { 
     200                if (!ag71xx_has_ar8216(ag)) 
     201                        reserve = 2; 
     202 
     203                if (ag->phy_dev) 
     204                        reserve += 4 - (ag->phy_dev->pkt_align % 4); 
     205 
     206                reserve %= 4; 
     207        } 
     208 
     209        return reserve + AG71XX_RX_PKT_RESERVE; 
     210} 
     211 
     212 
    195213static int ag71xx_ring_rx_init(struct ag71xx *ag) 
    196214{ 
    197215        struct ag71xx_ring *ring = &ag->rx_ring; 
     216        unsigned int reserve = ag71xx_rx_reserve(ag); 
    198217        unsigned int i; 
    199218        int ret; 
     
    213232                dma_addr_t dma_addr; 
    214233 
    215                 skb = dev_alloc_skb(AG71XX_RX_PKT_SIZE + AG71XX_RX_PKT_RESERVE); 
     234                skb = dev_alloc_skb(AG71XX_RX_PKT_SIZE + reserve); 
    216235                if (!skb) { 
    217236                        ret = -ENOMEM; 
     
    220239 
    221240                skb->dev = ag->dev; 
    222                 skb_reserve(skb, AG71XX_RX_PKT_RESERVE); 
     241                skb_reserve(skb, reserve); 
    223242 
    224243                dma_addr = dma_map_single(&ag->dev->dev, skb->data, 
     
    243262{ 
    244263        struct ag71xx_ring *ring = &ag->rx_ring; 
     264        unsigned int reserve = ag71xx_rx_reserve(ag); 
    245265        unsigned int count; 
    246266 
     
    255275                        struct sk_buff *skb; 
    256276 
    257                         skb = dev_alloc_skb(AG71XX_RX_PKT_SIZE + 
    258                                             AG71XX_RX_PKT_RESERVE); 
     277                        skb = dev_alloc_skb(AG71XX_RX_PKT_SIZE + reserve); 
    259278                        if (skb == NULL) 
    260279                                break; 
    261280 
    262                         skb_reserve(skb, AG71XX_RX_PKT_RESERVE); 
     281                        skb_reserve(skb, reserve); 
    263282                        skb->dev = ag->dev; 
    264283 
     
    770789} 
    771790 
    772 static int ag71xx_rx_copy_skb(struct ag71xx *ag, struct sk_buff **pskb, 
    773                               int pktlen) 
    774 { 
    775         struct sk_buff *copy_skb; 
    776  
    777         if (ag->phy_dev && (ag->phy_dev->pkt_align % 4) == 2) 
    778                 goto keep; 
    779  
    780         copy_skb = netdev_alloc_skb(ag->dev, pktlen + NET_IP_ALIGN); 
    781         if (!copy_skb) 
    782                 return -ENOMEM; 
    783  
    784         skb_reserve(copy_skb, NET_IP_ALIGN); 
    785         skb_copy_from_linear_data(*pskb, copy_skb->data, pktlen); 
    786         skb_put(copy_skb, pktlen); 
    787  
    788         dev_kfree_skb_any(*pskb); 
    789         *pskb = copy_skb; 
    790  
    791         return 0; 
    792  
    793  keep: 
    794         skb_put(*pskb, pktlen); 
    795         return 0; 
    796 } 
    797  
    798791static int ag71xx_rx_packets(struct ag71xx *ag, int limit) 
    799792{ 
     
    833826                dev->stats.rx_bytes += pktlen; 
    834827 
     828                skb_put(skb, pktlen); 
    835829                if (ag71xx_has_ar8216(ag)) 
    836830                        err = ag71xx_remove_ar8216_header(ag, skb, pktlen); 
    837                 else 
    838                         err = ag71xx_rx_copy_skb(ag, &skb, pktlen); 
    839831 
    840832                if (err) { 
Note: See TracChangeset for help on using the changeset viewer.