summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2015-05-28 18:24:42 -0400
committerDavid S. Miller <davem@davemloft.net>2015-05-31 02:51:09 -0400
commitbaf387a8edaa4a55afeaf4f498d3891ddcb03fb7 (patch)
tree004fa2cfa90e25253e0f0a9986bb049820137ed0 /drivers/net
parent3d2f6d41d1588c975d16c5969726d018bba90794 (diff)
net: systemport: Pre-calculate and utilize cb->bd_addr
There is a 1:1 mapping between the software maintained control block in priv->rx_cbs and the buffer address in priv->rx_bds, such that there is no need to keep computing the buffer address when refiling a control block. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.c18
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.h2
2 files changed, 9 insertions, 11 deletions
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index 084a50a555de..267330ccd595 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -549,12 +549,7 @@ static int bcm_sysport_rx_refill(struct bcm_sysport_priv *priv,
549 } 549 }
550 550
551 dma_unmap_addr_set(cb, dma_addr, mapping); 551 dma_unmap_addr_set(cb, dma_addr, mapping);
552 dma_desc_set_addr(priv, priv->rx_bd_assign_ptr, mapping); 552 dma_desc_set_addr(priv, cb->bd_addr, mapping);
553
554 priv->rx_bd_assign_index++;
555 priv->rx_bd_assign_index &= (priv->num_rx_bds - 1);
556 priv->rx_bd_assign_ptr = priv->rx_bds +
557 (priv->rx_bd_assign_index * DESC_SIZE);
558 553
559 netif_dbg(priv, rx_status, ndev, "RX refill\n"); 554 netif_dbg(priv, rx_status, ndev, "RX refill\n");
560 555
@@ -568,7 +563,7 @@ static int bcm_sysport_alloc_rx_bufs(struct bcm_sysport_priv *priv)
568 unsigned int i; 563 unsigned int i;
569 564
570 for (i = 0; i < priv->num_rx_bds; i++) { 565 for (i = 0; i < priv->num_rx_bds; i++) {
571 cb = &priv->rx_cbs[priv->rx_bd_assign_index]; 566 cb = &priv->rx_cbs[i];
572 if (cb->skb) 567 if (cb->skb)
573 continue; 568 continue;
574 569
@@ -1330,14 +1325,14 @@ static inline int tdma_enable_set(struct bcm_sysport_priv *priv,
1330 1325
1331static int bcm_sysport_init_rx_ring(struct bcm_sysport_priv *priv) 1326static int bcm_sysport_init_rx_ring(struct bcm_sysport_priv *priv)
1332{ 1327{
1328 struct bcm_sysport_cb *cb;
1333 u32 reg; 1329 u32 reg;
1334 int ret; 1330 int ret;
1331 int i;
1335 1332
1336 /* Initialize SW view of the RX ring */ 1333 /* Initialize SW view of the RX ring */
1337 priv->num_rx_bds = NUM_RX_DESC; 1334 priv->num_rx_bds = NUM_RX_DESC;
1338 priv->rx_bds = priv->base + SYS_PORT_RDMA_OFFSET; 1335 priv->rx_bds = priv->base + SYS_PORT_RDMA_OFFSET;
1339 priv->rx_bd_assign_ptr = priv->rx_bds;
1340 priv->rx_bd_assign_index = 0;
1341 priv->rx_c_index = 0; 1336 priv->rx_c_index = 0;
1342 priv->rx_read_ptr = 0; 1337 priv->rx_read_ptr = 0;
1343 priv->rx_cbs = kcalloc(priv->num_rx_bds, sizeof(struct bcm_sysport_cb), 1338 priv->rx_cbs = kcalloc(priv->num_rx_bds, sizeof(struct bcm_sysport_cb),
@@ -1347,6 +1342,11 @@ static int bcm_sysport_init_rx_ring(struct bcm_sysport_priv *priv)
1347 return -ENOMEM; 1342 return -ENOMEM;
1348 } 1343 }
1349 1344
1345 for (i = 0; i < priv->num_rx_bds; i++) {
1346 cb = priv->rx_cbs + i;
1347 cb->bd_addr = priv->rx_bds + i * DESC_SIZE;
1348 }
1349
1350 ret = bcm_sysport_alloc_rx_bufs(priv); 1350 ret = bcm_sysport_alloc_rx_bufs(priv);
1351 if (ret) { 1351 if (ret) {
1352 netif_err(priv, hw, priv->netdev, "SKB allocation failed\n"); 1352 netif_err(priv, hw, priv->netdev, "SKB allocation failed\n");
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h
index 42a4b4a0bc14..f28bf545d7f4 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.h
+++ b/drivers/net/ethernet/broadcom/bcmsysport.h
@@ -663,8 +663,6 @@ struct bcm_sysport_priv {
663 663
664 /* Receive queue */ 664 /* Receive queue */
665 void __iomem *rx_bds; 665 void __iomem *rx_bds;
666 void __iomem *rx_bd_assign_ptr;
667 unsigned int rx_bd_assign_index;
668 struct bcm_sysport_cb *rx_cbs; 666 struct bcm_sysport_cb *rx_cbs;
669 unsigned int num_rx_bds; 667 unsigned int num_rx_bds;
670 unsigned int rx_read_ptr; 668 unsigned int rx_read_ptr;