lkml.org 
[lkml]   [2019]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next 04/15] net: sgi: ioc3-eth: use defines for constants dealing with desc rings
    Date
    Descriptor ring sizes of the IOC3 are more or less fixed size. To
    make clearer where there is a relation to ring sizes use defines.

    Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
    Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
    ---
    drivers/net/ethernet/sgi/ioc3-eth.c | 42 +++++++++++++++++++++----------------
    1 file changed, 24 insertions(+), 18 deletions(-)

    diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
    index e81e5bb37ac6..c875640926d6 100644
    --- a/drivers/net/ethernet/sgi/ioc3-eth.c
    +++ b/drivers/net/ethernet/sgi/ioc3-eth.c
    @@ -61,10 +61,16 @@
    #include <asm/sn/ioc3.h>
    #include <asm/pci/bridge.h>

    -/* 64 RX buffers. This is tunable in the range of 16 <= x < 512. The
    - * value must be a power of two.
    +/* Number of RX buffers. This is tunable in the range of 16 <= x < 512.
    + * The value must be a power of two.
    */
    -#define RX_BUFFS 64
    +#define RX_BUFFS 64
    +#define RX_RING_ENTRIES 512 /* fixed in hardware */
    +#define RX_RING_MASK (RX_RING_ENTRIES - 1)
    +
    +/* 128 TX buffers (not tunable) */
    +#define TX_RING_ENTRIES 128
    +#define TX_RING_MASK (TX_RING_ENTRIES - 1)

    #define ETCSR_FD ((17 << ETCSR_IPGR2_SHIFT) | (11 << ETCSR_IPGR1_SHIFT) | 21)
    #define ETCSR_HD ((21 << ETCSR_IPGR2_SHIFT) | (21 << ETCSR_IPGR1_SHIFT) | 21)
    @@ -76,8 +82,8 @@ struct ioc3_private {
    u32 *ssram;
    unsigned long *rxr; /* pointer to receiver ring */
    struct ioc3_etxd *txr;
    - struct sk_buff *rx_skbs[512];
    - struct sk_buff *tx_skbs[128];
    + struct sk_buff *rx_skbs[RX_RING_ENTRIES];
    + struct sk_buff *tx_skbs[TX_RING_ENTRIES];
    int rx_ci; /* RX consumer index */
    int rx_pi; /* RX producer index */
    int tx_ci; /* TX consumer index */
    @@ -573,10 +579,10 @@ static inline void ioc3_rx(struct net_device *dev)
    ip->rx_skbs[n_entry] = new_skb;
    rxr[n_entry] = cpu_to_be64(ioc3_map(rxb, 1));
    rxb->w0 = 0; /* Clear valid flag */
    - n_entry = (n_entry + 1) & 511; /* Update erpir */
    + n_entry = (n_entry + 1) & RX_RING_MASK; /* Update erpir */

    /* Now go on to the next ring entry. */
    - rx_entry = (rx_entry + 1) & 511;
    + rx_entry = (rx_entry + 1) & RX_RING_MASK;
    skb = ip->rx_skbs[rx_entry];
    rxb = (struct ioc3_erxbuf *)(skb->data - RX_OFFSET);
    w0 = be32_to_cpu(rxb->w0);
    @@ -598,7 +604,7 @@ static inline void ioc3_tx(struct net_device *dev)
    spin_lock(&ip->ioc3_lock);
    etcir = readl(&regs->etcir);

    - tx_entry = (etcir >> 7) & 127;
    + tx_entry = (etcir >> 7) & TX_RING_MASK;
    o_entry = ip->tx_ci;
    packets = 0;
    bytes = 0;
    @@ -610,17 +616,17 @@ static inline void ioc3_tx(struct net_device *dev)
    dev_consume_skb_irq(skb);
    ip->tx_skbs[o_entry] = NULL;

    - o_entry = (o_entry + 1) & 127; /* Next */
    + o_entry = (o_entry + 1) & TX_RING_MASK; /* Next */

    etcir = readl(&regs->etcir); /* More pkts sent? */
    - tx_entry = (etcir >> 7) & 127;
    + tx_entry = (etcir >> 7) & TX_RING_MASK;
    }

    dev->stats.tx_packets += packets;
    dev->stats.tx_bytes += bytes;
    ip->txqlen -= packets;

    - if (ip->txqlen < 128)
    + if (netif_queue_stopped(dev) && ip->txqlen < TX_RING_ENTRIES)
    netif_wake_queue(dev);

    ip->tx_ci = o_entry;
    @@ -765,10 +771,10 @@ static inline void ioc3_clean_rx_ring(struct ioc3_private *ip)
    ip->rx_skbs[ip->rx_pi] = ip->rx_skbs[ip->rx_ci];
    ip->rxr[ip->rx_pi++] = ip->rxr[ip->rx_ci++];
    }
    - ip->rx_pi &= 511;
    - ip->rx_ci &= 511;
    + ip->rx_pi &= RX_RING_MASK;
    + ip->rx_ci &= RX_RING_MASK;

    - for (i = ip->rx_ci; i != ip->rx_pi; i = (i + 1) & 511) {
    + for (i = ip->rx_ci; i != ip->rx_pi; i = (i + 1) & RX_RING_MASK) {
    skb = ip->rx_skbs[i];
    rxb = (struct ioc3_erxbuf *)(skb->data - RX_OFFSET);
    rxb->w0 = 0;
    @@ -780,7 +786,7 @@ static inline void ioc3_clean_tx_ring(struct ioc3_private *ip)
    struct sk_buff *skb;
    int i;

    - for (i = 0; i < 128; i++) {
    + for (i = 0; i < TX_RING_ENTRIES; i++) {
    skb = ip->tx_skbs[i];
    if (skb) {
    ip->tx_skbs[i] = NULL;
    @@ -812,7 +818,7 @@ static void ioc3_free_rings(struct ioc3_private *ip)
    if (skb)
    dev_kfree_skb_any(skb);

    - n_entry = (n_entry + 1) & 511;
    + n_entry = (n_entry + 1) & RX_RING_MASK;
    }
    free_page((unsigned long)ip->rxr);
    ip->rxr = NULL;
    @@ -1425,13 +1431,13 @@ static netdev_tx_t ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev)
    mb(); /* make sure all descriptor changes are visible */

    ip->tx_skbs[produce] = skb; /* Remember skb */
    - produce = (produce + 1) & 127;
    + produce = (produce + 1) & TX_RING_MASK;
    ip->tx_pi = produce;
    writel(produce << 7, &ip->regs->etpir); /* Fire ... */

    ip->txqlen++;

    - if (ip->txqlen >= 127)
    + if (ip->txqlen >= (TX_RING_ENTRIES - 1))
    netif_stop_queue(dev);

    spin_unlock_irq(&ip->ioc3_lock);
    --
    2.13.7
    \
     
     \ /
      Last update: 2019-08-28 16:05    [W:4.193 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site