Changeset 44741


Ignore:
Timestamp:
2015-03-13T09:38:08+01:00 (3 years ago)
Author:
blogic
Message:

ralink: support change tx/rx ring size

Signed-off-by: michael lee <igvtee@…>

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

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_ethtool.c

    r44349 r44741  
    132132} 
    133133 
     134static int fe_set_ringparam(struct net_device *dev, 
     135                struct ethtool_ringparam *ring) 
     136{ 
     137        struct fe_priv *priv = netdev_priv(dev); 
     138 
     139        if ((ring->tx_pending < 2) || 
     140                        (ring->rx_pending < 2) || 
     141                        (ring->rx_pending > MAX_DMA_DESC) || 
     142                        (ring->tx_pending > MAX_DMA_DESC)) 
     143                return -EINVAL; 
     144 
     145        dev->netdev_ops->ndo_stop(dev); 
     146 
     147        priv->tx_ring_size = BIT(fls(ring->tx_pending) - 1); 
     148        priv->rx_ring_size = BIT(fls(ring->rx_pending) - 1); 
     149 
     150        dev->netdev_ops->ndo_open(dev); 
     151 
     152        return 0; 
     153} 
     154 
    134155static void fe_get_ringparam(struct net_device *dev, 
    135156                struct ethtool_ringparam *ring) 
    136157{ 
     158        struct fe_priv *priv = netdev_priv(dev); 
     159 
    137160        ring->rx_max_pending = MAX_DMA_DESC; 
    138161        ring->tx_max_pending = MAX_DMA_DESC; 
    139         ring->rx_pending = NUM_DMA_DESC; 
    140         ring->tx_pending = NUM_DMA_DESC; 
     162        ring->rx_pending = priv->rx_ring_size; 
     163        ring->tx_pending = priv->tx_ring_size; 
    141164} 
    142165 
     
    195218        .nway_reset             = fe_nway_reset, 
    196219        .get_link               = fe_get_link, 
     220        .set_ringparam          = fe_set_ringparam, 
    197221        .get_ringparam          = fe_get_ringparam, 
    198222}; 
  • trunk/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c

    r44740 r44741  
    5757#define TX_DMA_DESP2_DEF        (TX_DMA_LS0 | TX_DMA_DONE) 
    5858#define TX_DMA_DESP4_DEF        (TX_DMA_QN(3) | TX_DMA_PN(1)) 
    59 #define NEXT_TX_DESP_IDX(X)     (((X) + 1) & (NUM_DMA_DESC - 1)) 
    60 #define NEXT_RX_DESP_IDX(X)     (((X) + 1) & (NUM_DMA_DESC - 1)) 
     59#define NEXT_TX_DESP_IDX(X)     (((X) + 1) & (priv->tx_ring_size - 1)) 
     60#define NEXT_RX_DESP_IDX(X)     (((X) + 1) & (priv->rx_ring_size - 1)) 
    6161 
    6262#define SYSC_REG_RSTCTRL        0x34 
     
    205205 
    206206        if (priv->rx_data) { 
    207                 for (i = 0; i < NUM_DMA_DESC; i++) 
     207                for (i = 0; i < priv->rx_ring_size; i++) 
    208208                        if (priv->rx_data[i]) { 
    209209                                if (priv->rx_dma && priv->rx_dma[i].rxd1) 
     
    221221        if (priv->rx_dma) { 
    222222                dma_free_coherent(&priv->netdev->dev, 
    223                                 NUM_DMA_DESC * sizeof(*priv->rx_dma), 
     223                                priv->rx_ring_size * sizeof(*priv->rx_dma), 
    224224                                priv->rx_dma, 
    225225                                priv->rx_phys); 
     
    233233        int i, pad; 
    234234 
    235         priv->rx_data = kcalloc(NUM_DMA_DESC, sizeof(*priv->rx_data), 
     235        priv->rx_data = kcalloc(priv->rx_ring_size, sizeof(*priv->rx_data), 
    236236                        GFP_KERNEL); 
    237237        if (!priv->rx_data) 
    238238                goto no_rx_mem; 
    239239 
    240         for (i = 0; i < NUM_DMA_DESC; i++) { 
     240        for (i = 0; i < priv->rx_ring_size; i++) { 
    241241                priv->rx_data[i] = netdev_alloc_frag(priv->frag_size); 
    242242                if (!priv->rx_data[i]) 
     
    245245 
    246246        priv->rx_dma = dma_alloc_coherent(&netdev->dev, 
    247                         NUM_DMA_DESC * sizeof(*priv->rx_dma), 
     247                        priv->rx_ring_size * sizeof(*priv->rx_dma), 
    248248                        &priv->rx_phys, 
    249249                        GFP_ATOMIC | __GFP_ZERO); 
     
    255255        else 
    256256                pad = NET_IP_ALIGN; 
    257         for (i = 0; i < NUM_DMA_DESC; i++) { 
     257        for (i = 0; i < priv->rx_ring_size; i++) { 
    258258                dma_addr_t dma_addr = dma_map_single(&netdev->dev, 
    259259                                priv->rx_data[i] + NET_SKB_PAD + pad, 
     
    272272 
    273273        fe_reg_w32(priv->rx_phys, FE_REG_RX_BASE_PTR0); 
    274         fe_reg_w32(NUM_DMA_DESC, FE_REG_RX_MAX_CNT0); 
    275         fe_reg_w32((NUM_DMA_DESC - 1), FE_REG_RX_CALC_IDX0); 
     274        fe_reg_w32(priv->rx_ring_size, FE_REG_RX_MAX_CNT0); 
     275        fe_reg_w32((priv->rx_ring_size - 1), FE_REG_RX_CALC_IDX0); 
    276276        fe_reg_w32(FE_PST_DRX_IDX0, FE_REG_PDMA_RST_CFG); 
    277277 
     
    313313 
    314314        if (priv->tx_buf) { 
    315                 for (i = 0; i < NUM_DMA_DESC; i++) 
     315                for (i = 0; i < priv->tx_ring_size; i++) 
    316316                        fe_txd_unmap(&priv->netdev->dev, &priv->tx_buf[i]); 
    317317                kfree(priv->tx_buf); 
     
    321321        if (priv->tx_dma) { 
    322322                dma_free_coherent(&priv->netdev->dev, 
    323                                 NUM_DMA_DESC * sizeof(*priv->tx_dma), 
     323                                priv->tx_ring_size * sizeof(*priv->tx_dma), 
    324324                                priv->tx_dma, 
    325325                                priv->tx_phys); 
     
    334334        priv->tx_free_idx = 0; 
    335335 
    336         priv->tx_buf = kcalloc(NUM_DMA_DESC, sizeof(*priv->tx_buf), 
     336        priv->tx_buf = kcalloc(priv->tx_ring_size, sizeof(*priv->tx_buf), 
    337337                        GFP_KERNEL); 
    338338        if (!priv->tx_buf) 
     
    340340 
    341341        priv->tx_dma = dma_alloc_coherent(&priv->netdev->dev, 
    342                         NUM_DMA_DESC * sizeof(*priv->tx_dma), 
     342                        priv->tx_ring_size * sizeof(*priv->tx_dma), 
    343343                        &priv->tx_phys, 
    344344                        GFP_ATOMIC | __GFP_ZERO); 
     
    346346                goto no_tx_mem; 
    347347 
    348         for (i = 0; i < NUM_DMA_DESC; i++) { 
     348        for (i = 0; i < priv->tx_ring_size; i++) { 
    349349                if (priv->soc->tx_dma) { 
    350350                        priv->soc->tx_dma(&priv->tx_dma[i]); 
     
    355355 
    356356        fe_reg_w32(priv->tx_phys, FE_REG_TX_BASE_PTR0); 
    357         fe_reg_w32(NUM_DMA_DESC, FE_REG_TX_MAX_CNT0); 
     357        fe_reg_w32(priv->tx_ring_size, FE_REG_TX_MAX_CNT0); 
    358358        fe_reg_w32(0, FE_REG_TX_CTX_IDX0); 
    359359        fe_reg_w32(FE_PST_DTX_IDX0, FE_REG_PDMA_RST_CFG); 
     
    703703static inline u32 fe_empty_txd(struct fe_priv *priv, u32 tx_fill_idx) 
    704704{ 
    705         return (u32)(NUM_DMA_DESC - ((tx_fill_idx - priv->tx_free_idx) & 
    706                                 (NUM_DMA_DESC - 1))); 
     705        return (u32)(priv->tx_ring_size - ((tx_fill_idx - priv->tx_free_idx) & 
     706                                (priv->tx_ring_size - 1))); 
    707707} 
    708708 
     
    14821482        priv->frag_size = fe_max_frag_size(ETH_DATA_LEN); 
    14831483        priv->rx_buf_size = fe_max_buf_size(priv->frag_size); 
    1484         if (priv->frag_size > PAGE_SIZE) { 
    1485                 dev_err(&pdev->dev, "error frag size.\n"); 
    1486                 err = -EINVAL; 
    1487                 goto err_free_dev; 
    1488         } 
     1484        priv->tx_ring_size = priv->rx_ring_size = NUM_DMA_DESC; 
    14891485        INIT_WORK(&priv->pending_work, fe_pending_work); 
    14901486 
    14911487        napi_weight = 32; 
    1492         if (priv->flags & FE_FLAG_NAPI_WEIGHT) 
    1493                 napi_weight = 64; 
     1488        if (priv->flags & FE_FLAG_NAPI_WEIGHT) { 
     1489                napi_weight *= 2; 
     1490                priv->tx_ring_size *= 2; 
     1491                priv->rx_ring_size *= 2; 
     1492        } 
    14941493        netif_napi_add(netdev, &priv->rx_napi, fe_poll, napi_weight); 
    14951494        fe_set_ethtool_ops(netdev); 
  • trunk/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.h

    r44740 r44741  
    6262 
    6363/* power of 2 to let NEXT_TX_DESP_IDX work */ 
    64 #ifdef CONFIG_SOC_MT7621 
    65 #define NUM_DMA_DESC            (1 << 9) 
    66 #else 
    6764#define NUM_DMA_DESC            (1 << 7) 
    68 #endif 
    6965#define MAX_DMA_DESC            0xfff 
    7066 
     
    494490        struct work_struct              pending_work; 
    495491        DECLARE_BITMAP(pending_flags, FE_FLAG_MAX); 
     492        u16                             tx_ring_size; 
     493        u16                             rx_ring_size; 
    496494}; 
    497495 
Note: See TracChangeset for help on using the changeset viewer.