Changeset 30731


Ignore:
Timestamp:
2012-02-26T11:54:10+01:00 (6 years ago)
Author:
juhosg
Message:

ramips: raeth: add tx_info structure

This helps to reduce code size on TX path:

add/remove: 0/0 grow/shrink: 1/4 up/down: 56/-92 (-36)
function old new delta
ramips_eth_open 1048 1104 +56
ramips_eth_tx_housekeeping 156 148 -8
ramips_ring_free 224 212 -12
ramips_eth_stop 420 400 -20
ramips_eth_hard_start_xmit 480 428 -52

Location:
trunk/target/linux/ramips/files/drivers/net/ethernet/ramips
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ramips/files/drivers/net/ethernet/ramips/ramips_eth.h

    r30681 r30731  
    214214} __packed __aligned(4); 
    215215 
     216struct raeth_tx_info { 
     217        struct ramips_tx_dma    *tx_desc; 
     218        struct sk_buff          *tx_skb; 
     219}; 
     220 
    216221struct raeth_int_stats { 
    217222        unsigned long           rx_delayed; 
     
    248253        dma_addr_t              rx_dma[NUM_RX_DESC]; 
    249254 
     255        struct raeth_tx_info    *tx_info; 
    250256        dma_addr_t              tx_desc_dma; 
    251257        struct tasklet_struct   tx_housekeeping_tasklet; 
    252258        struct ramips_tx_dma    *tx; 
    253         struct sk_buff          *tx_skb[NUM_TX_DESC]; 
    254259 
    255260        unsigned int            skb_free_idx; 
  • trunk/target/linux/ramips/files/drivers/net/ethernet/ramips/ramips_main.c

    r30713 r30731  
    109109        int i; 
    110110 
     111        memset(re->tx_info, 0, NUM_TX_DESC * sizeof(struct raeth_tx_info)); 
     112 
    111113        len = NUM_TX_DESC * sizeof(struct ramips_tx_dma); 
    112114        memset(re->tx, 0, len); 
    113115 
    114116        for (i = 0; i < NUM_TX_DESC; i++) { 
     117                struct raeth_tx_info *txi; 
    115118                struct ramips_tx_dma *txd; 
    116119 
     
    119122                txd->txd2 = TX_DMA_LSO | TX_DMA_DONE; 
    120123 
    121                 if (re->tx_skb[i] != NULL) { 
     124                txi = &re->tx_info[i]; 
     125                txi->tx_desc = txd; 
     126                if (txi->tx_skb != NULL) { 
    122127                        netdev_warn(re->netdev, 
    123128                                    "dirty skb for TX desc %d\n", i); 
    124                         re->tx_skb[i] = NULL; 
     129                        txi->tx_skb = NULL; 
    125130                } 
    126131        } 
     
    154159                                         MAX_RX_LENGTH, DMA_FROM_DEVICE); 
    155160 
    156         for (i = 0; i < NUM_TX_DESC; i++) 
    157                 if (re->tx_skb[i]) { 
    158                         dev_kfree_skb_any(re->tx_skb[i]); 
    159                         re->tx_skb[i] = NULL; 
     161        for (i = 0; i < NUM_TX_DESC; i++) { 
     162                struct raeth_tx_info *txi; 
     163 
     164                txi = &re->tx_info[i]; 
     165                if (txi->tx_skb) { 
     166                        dev_kfree_skb_any(txi->tx_skb); 
     167                        txi->tx_skb = NULL; 
    160168                } 
     169        } 
    161170} 
    162171 
     
    560569                                  re->tx_desc_dma); 
    561570        } 
     571 
     572        kfree(re->tx_info); 
    562573} 
    563574 
     
    568579        int err = -ENOMEM; 
    569580        int i; 
     581 
     582        re->tx_info = kzalloc(NUM_TX_DESC * sizeof(struct raeth_tx_info), 
     583                              GFP_ATOMIC); 
     584        if (!re->tx_info) 
     585                goto err_cleanup; 
    570586 
    571587        /* allocate tx ring */ 
     
    618634{ 
    619635        struct raeth_priv *re = netdev_priv(dev); 
     636        struct raeth_tx_info *txi, *txi_next; 
     637        struct ramips_tx_dma *txd, *txd_next; 
    620638        unsigned long tx; 
    621639        unsigned int tx_next; 
     
    642660        tx_next = (tx + 1) % NUM_TX_DESC; 
    643661 
    644         if ((re->tx_skb[tx]) || (re->tx_skb[tx_next]) || 
    645             !(re->tx[tx].txd2 & TX_DMA_DONE) || 
    646             !(re->tx[tx_next].txd2 & TX_DMA_DONE)) 
     662        txi = &re->tx_info[tx]; 
     663        txd = txi->tx_desc; 
     664        txi_next = &re->tx_info[tx_next]; 
     665        txd_next = txi_next->tx_desc; 
     666 
     667        if ((txi->tx_skb) || (txi_next->tx_skb) || 
     668            !(txd->txd2 & TX_DMA_DONE) || 
     669            !(txd_next->txd2 & TX_DMA_DONE)) 
    647670                goto out; 
    648671 
    649         re->tx[tx].txd1 = (unsigned int) mapped_addr; 
    650         re->tx[tx].txd2 &= ~(TX_DMA_PLEN0_MASK | TX_DMA_DONE); 
    651         re->tx[tx].txd2 |= TX_DMA_PLEN0(skb->len); 
     672        txi->tx_skb = skb; 
     673 
     674        txd->txd1 = (unsigned int) mapped_addr; 
     675        wmb(); 
     676        txd->txd2 = TX_DMA_LSO | TX_DMA_PLEN0(skb->len); 
    652677        dev->stats.tx_packets++; 
    653678        dev->stats.tx_bytes += skb->len; 
    654         re->tx_skb[tx] = skb; 
    655         wmb(); 
    656679        ramips_fe_wr(tx_next, RAMIPS_TX_CTX_IDX0); 
    657680        spin_unlock(&re->page_lock); 
     
    731754 
    732755        spin_lock(&re->page_lock); 
    733         while ((re->tx[re->skb_free_idx].txd2 & TX_DMA_DONE) && 
    734                (re->tx_skb[re->skb_free_idx])) { 
    735                 dev_kfree_skb_irq(re->tx_skb[re->skb_free_idx]); 
    736                 re->tx_skb[re->skb_free_idx] = 0; 
     756        while (1) { 
     757                struct raeth_tx_info *txi; 
     758                struct ramips_tx_dma *txd; 
     759 
     760                txi = &re->tx_info[re->skb_free_idx]; 
     761                txd = txi->tx_desc; 
     762 
     763                if (!(txd->txd2 & TX_DMA_DONE) || !(txi->tx_skb)) 
     764                        break; 
     765 
     766                dev_kfree_skb_irq(txi->tx_skb); 
     767                txi->tx_skb = NULL; 
    737768                re->skb_free_idx++; 
    738769                if (re->skb_free_idx >= NUM_TX_DESC) 
Note: See TracChangeset for help on using the changeset viewer.