Changeset 43588


Ignore:
Timestamp:
2014-12-09T13:28:46+01:00 (3 years ago)
Author:
nbd
Message:

ar71xx: improve ethernet driver cache footprint by removing an unnecessary pointer

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h

    r42427 r43588  
    9191                void            *rx_buf; 
    9292        }; 
    93         struct ag71xx_desc      *desc; 
    9493        union { 
    9594                dma_addr_t      dma_addr; 
     
    202201{ 
    203202        return (desc->ctrl & DESC_EMPTY) != 0; 
     203} 
     204 
     205static inline struct ag71xx_desc * 
     206ag71xx_ring_desc(struct ag71xx_ring *ring, int idx) 
     207{ 
     208        return (struct ag71xx_desc *) &ring->descs_cpu[idx * ring->desc_size]; 
    204209} 
    205210 
  • trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_debugfs.c

    r39115 r43588  
    184184        for (i = 0; i < ring->size; i++) { 
    185185                struct ag71xx_buf *ab = &ring->buf[i]; 
     186                struct ag71xx_desc *desc = ag71xx_ring_desc(ring, i); 
    186187                u32 desc_dma = ((u32) ring->descs_dma) + i * ring->desc_size; 
    187188 
     
    193194                        (desc_hw == desc_dma) ? 'H' : ' ', 
    194195                        desc_dma, 
    195                         ab->desc->next, 
    196                         ab->desc->data, 
    197                         ab->desc->ctrl, 
    198                         (ab->desc->ctrl & DESC_EMPTY) ? 'E' : '*', 
     196                        desc->next, 
     197                        desc->data, 
     198                        desc->ctrl, 
     199                        (desc->ctrl & DESC_EMPTY) ? 'E' : '*', 
    199200                        ab->timestamp); 
    200201        } 
  • trunk/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c

    r43539 r43588  
    101101{ 
    102102        int err; 
    103         int i; 
    104103 
    105104        ring->desc_size = sizeof(struct ag71xx_desc); 
     
    125124        } 
    126125 
    127         for (i = 0; i < ring->size; i++) { 
    128                 int idx = i * ring->desc_size; 
    129                 ring->buf[i].desc = (struct ag71xx_desc *)&ring->descs_cpu[idx]; 
    130                 DBG("ag71xx: ring %p, desc %d at %p\n", 
    131                         ring, i, ring->buf[i].desc); 
    132         } 
    133  
    134126        return 0; 
    135127 
     
    145137 
    146138        while (ring->curr != ring->dirty) { 
     139                struct ag71xx_desc *desc; 
    147140                u32 i = ring->dirty % ring->size; 
    148141 
    149                 if (!ag71xx_desc_empty(ring->buf[i].desc)) { 
    150                         ring->buf[i].desc->ctrl = 0; 
     142                desc = ag71xx_ring_desc(ring, i); 
     143                if (!ag71xx_desc_empty(desc)) { 
     144                        desc->ctrl = 0; 
    151145                        dev->stats.tx_errors++; 
    152146                } 
     
    173167 
    174168        for (i = 0; i < ring->size; i++) { 
    175                 ring->buf[i].desc->next = (u32) (ring->descs_dma + 
     169                struct ag71xx_desc *desc = ag71xx_ring_desc(ring, i); 
     170 
     171                desc->next = (u32) (ring->descs_dma + 
    176172                        ring->desc_size * ((i + 1) % ring->size)); 
    177173 
    178                 ring->buf[i].desc->ctrl = DESC_EMPTY; 
     174                desc->ctrl = DESC_EMPTY; 
    179175                ring->buf[i].skb = NULL; 
    180176        } 
     
    223219                               int offset) 
    224220{ 
     221        struct ag71xx_ring *ring = &ag->rx_ring; 
     222        struct ag71xx_desc *desc = ag71xx_ring_desc(ring, buf - &ring->buf[0]); 
    225223        void *data; 
    226224 
     
    234232        buf->dma_addr = dma_map_single(&ag->dev->dev, data, ag->rx_buf_size, 
    235233                                       DMA_FROM_DEVICE); 
    236         buf->desc->data = (u32) buf->dma_addr + offset; 
     234        desc->data = (u32) buf->dma_addr + offset; 
    237235        return true; 
    238236} 
     
    247245        ret = 0; 
    248246        for (i = 0; i < ring->size; i++) { 
    249                 ring->buf[i].desc->next = (u32) (ring->descs_dma + 
     247                struct ag71xx_desc *desc = ag71xx_ring_desc(ring, i); 
     248 
     249                desc->next = (u32) (ring->descs_dma + 
    250250                        ring->desc_size * ((i + 1) % ring->size)); 
    251251 
    252252                DBG("ag71xx: RX desc at %p, next is %08x\n", 
    253                         ring->buf[i].desc, 
    254                         ring->buf[i].desc->next); 
     253                        desc, desc->next); 
    255254        } 
    256255 
    257256        for (i = 0; i < ring->size; i++) { 
     257                struct ag71xx_desc *desc = ag71xx_ring_desc(ring, i); 
     258 
    258259                if (!ag71xx_fill_rx_buf(ag, &ring->buf[i], offset)) { 
    259260                        ret = -ENOMEM; 
     
    261262                } 
    262263 
    263                 ring->buf[i].desc->ctrl = DESC_EMPTY; 
     264                desc->ctrl = DESC_EMPTY; 
    264265        } 
    265266 
     
    281282        count = 0; 
    282283        for (; ring->curr - ring->dirty > 0; ring->dirty++) { 
     284                struct ag71xx_desc *desc; 
    283285                unsigned int i; 
    284286 
    285287                i = ring->dirty % ring->size; 
     288                desc = ag71xx_ring_desc(ring, i); 
    286289 
    287290                if (!ring->buf[i].rx_buf && 
     
    289292                        break; 
    290293 
    291                 ring->buf[i].desc->ctrl = DESC_EMPTY; 
     294                desc->ctrl = DESC_EMPTY; 
    292295                count++; 
    293296        } 
     
    698701 
    699702                i = (ring->curr + ndesc) % ring->size; 
    700                 desc = ring->buf[i].desc; 
     703                desc = ag71xx_ring_desc(ring, i); 
    701704 
    702705                if (!ag71xx_desc_empty(desc)) 
     
    753756 
    754757        i = ring->curr % ring->size; 
    755         desc = ring->buf[i].desc; 
     758        desc = ag71xx_ring_desc(ring, i); 
    756759 
    757760        /* setup descriptor fields */ 
     
    908911        while (ring->dirty + n != ring->curr) { 
    909912                unsigned int i = (ring->dirty + n) % ring->size; 
    910                 struct ag71xx_desc *desc = ring->buf[i].desc; 
     913                struct ag71xx_desc *desc = ag71xx_ring_desc(ring, i); 
    911914                struct sk_buff *skb = ring->buf[i].skb; 
    912915 
     
    964967        while (done < limit) { 
    965968                unsigned int i = ring->curr % ring->size; 
    966                 struct ag71xx_desc *desc = ring->buf[i].desc; 
     969                struct ag71xx_desc *desc = ag71xx_ring_desc(ring, i); 
    967970                struct sk_buff *skb; 
    968971                int pktlen; 
Note: See TracChangeset for help on using the changeset viewer.