Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Florian Fainelli and committed by
David S. Miller
baf387a8 3d2f6d41

+9 -11
+9 -9
drivers/net/ethernet/broadcom/bcmsysport.c
··· 549 549 } 550 550 551 551 dma_unmap_addr_set(cb, dma_addr, mapping); 552 - dma_desc_set_addr(priv, priv->rx_bd_assign_ptr, 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); 552 + dma_desc_set_addr(priv, cb->bd_addr, mapping); 558 553 559 554 netif_dbg(priv, rx_status, ndev, "RX refill\n"); 560 555 ··· 563 568 unsigned int i; 564 569 565 570 for (i = 0; i < priv->num_rx_bds; i++) { 566 - cb = &priv->rx_cbs[priv->rx_bd_assign_index]; 571 + cb = &priv->rx_cbs[i]; 567 572 if (cb->skb) 568 573 continue; 569 574 ··· 1325 1330 1326 1331 static int bcm_sysport_init_rx_ring(struct bcm_sysport_priv *priv) 1327 1332 { 1333 + struct bcm_sysport_cb *cb; 1328 1334 u32 reg; 1329 1335 int ret; 1336 + int i; 1330 1337 1331 1338 /* Initialize SW view of the RX ring */ 1332 1339 priv->num_rx_bds = NUM_RX_DESC; 1333 1340 priv->rx_bds = priv->base + SYS_PORT_RDMA_OFFSET; 1334 - priv->rx_bd_assign_ptr = priv->rx_bds; 1335 - priv->rx_bd_assign_index = 0; 1336 1341 priv->rx_c_index = 0; 1337 1342 priv->rx_read_ptr = 0; 1338 1343 priv->rx_cbs = kcalloc(priv->num_rx_bds, sizeof(struct bcm_sysport_cb), ··· 1340 1345 if (!priv->rx_cbs) { 1341 1346 netif_err(priv, hw, priv->netdev, "CB allocation failed\n"); 1342 1347 return -ENOMEM; 1348 + } 1349 + 1350 + for (i = 0; i < priv->num_rx_bds; i++) { 1351 + cb = priv->rx_cbs + i; 1352 + cb->bd_addr = priv->rx_bds + i * DESC_SIZE; 1343 1353 } 1344 1354 1345 1355 ret = bcm_sysport_alloc_rx_bufs(priv);
-2
drivers/net/ethernet/broadcom/bcmsysport.h
··· 663 663 664 664 /* Receive queue */ 665 665 void __iomem *rx_bds; 666 - void __iomem *rx_bd_assign_ptr; 667 - unsigned int rx_bd_assign_index; 668 666 struct bcm_sysport_cb *rx_cbs; 669 667 unsigned int num_rx_bds; 670 668 unsigned int rx_read_ptr;