net: systemport: Implement RX coalescing control knobs
authorFlorian Fainelli <f.fainelli@gmail.com>
Mon, 11 May 2015 22:12:42 +0000 (15:12 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 May 2015 03:08:46 +0000 (23:08 -0400)
Similarly to the TX path, allow the RX path to be configured with both
'rx-frames' and 'rx-usecs' coalescing parameters.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bcmsysport.c
drivers/net/ethernet/broadcom/bcmsysport.h

index 29d5750a5738252469f75d8c69e1ec3f9461b0b8..084a50a555de57af781a7f786ee6c6a911765de2 100644 (file)
@@ -467,6 +467,11 @@ static int bcm_sysport_get_coalesce(struct net_device *dev,
        ec->tx_coalesce_usecs = (reg >> RING_TIMEOUT_SHIFT) * 8192 / 1000;
        ec->tx_max_coalesced_frames = reg & RING_INTR_THRESH_MASK;
 
+       reg = rdma_readl(priv, RDMA_MBDONE_INTR);
+
+       ec->rx_coalesce_usecs = (reg >> RDMA_TIMEOUT_SHIFT) * 8192 / 1000;
+       ec->rx_max_coalesced_frames = reg & RDMA_INTR_THRESH_MASK;
+
        return 0;
 }
 
@@ -477,16 +482,18 @@ static int bcm_sysport_set_coalesce(struct net_device *dev,
        unsigned int i;
        u32 reg;
 
-       /* Base system clock is 125Mhz, TDMA timeout is this reference clock
-        * divided by 1024, which yield roughly 8.192 us, our maximum value
-        * has to fit in the RING_TIMEOUT_MASK (16 bits).
+       /* Base system clock is 125Mhz, DMA timeout is this reference clock
+        * divided by 1024, which yield roughly 8.192 us, our maximum value has
+        * to fit in the RING_TIMEOUT_MASK (16 bits).
         */
        if (ec->tx_max_coalesced_frames > RING_INTR_THRESH_MASK ||
-           ec->tx_coalesce_usecs > (RING_TIMEOUT_MASK * 8) + 1)
+           ec->tx_coalesce_usecs > (RING_TIMEOUT_MASK * 8) + 1 ||
+           ec->rx_max_coalesced_frames > RDMA_INTR_THRESH_MASK ||
+           ec->rx_coalesce_usecs > (RDMA_TIMEOUT_MASK * 8) + 1)
                return -EINVAL;
 
-       if (ec->tx_coalesce_usecs == 0 &&
-           ec->tx_max_coalesced_frames == 0)
+       if ((ec->tx_coalesce_usecs == 0 && ec->tx_max_coalesced_frames == 0) ||
+           (ec->rx_coalesce_usecs == 0 && ec->rx_max_coalesced_frames == 0))
                return -EINVAL;
 
        for (i = 0; i < dev->num_tx_queues; i++) {
@@ -499,6 +506,14 @@ static int bcm_sysport_set_coalesce(struct net_device *dev,
                tdma_writel(priv, reg, TDMA_DESC_RING_INTR_CONTROL(i));
        }
 
+       reg = rdma_readl(priv, RDMA_MBDONE_INTR);
+       reg &= ~(RDMA_INTR_THRESH_MASK |
+                RDMA_TIMEOUT_MASK << RDMA_TIMEOUT_SHIFT);
+       reg |= ec->rx_max_coalesced_frames;
+       reg |= DIV_ROUND_UP(ec->rx_coalesce_usecs * 1000, 8192) <<
+                           RDMA_TIMEOUT_SHIFT;
+       rdma_writel(priv, reg, RDMA_MBDONE_INTR);
+
        return 0;
 }
 
index e2c043eabbf39d165644312aba5bbecb4f07fcf8..42a4b4a0bc148f5e508e94bab58ee512ed74d128 100644 (file)
@@ -292,7 +292,7 @@ struct bcm_rsb {
 #define RDMA_END_ADDR_LO               0x102c
 
 #define RDMA_MBDONE_INTR               0x1030
-#define  RDMA_INTR_THRESH_MASK         0xff
+#define  RDMA_INTR_THRESH_MASK         0x1ff
 #define  RDMA_TIMEOUT_SHIFT            16
 #define  RDMA_TIMEOUT_MASK             0xffff