diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2015-05-28 18:24:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-05-31 02:51:09 -0400 |
commit | baf387a8edaa4a55afeaf4f498d3891ddcb03fb7 (patch) | |
tree | 004fa2cfa90e25253e0f0a9986bb049820137ed0 /drivers/net | |
parent | 3d2f6d41d1588c975d16c5969726d018bba90794 (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.c | 18 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.h | 2 |
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 | ||
1331 | static int bcm_sysport_init_rx_ring(struct bcm_sysport_priv *priv) | 1326 | static 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; |