aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2019-04-22 12:46:44 -0400
committerDavid S. Miller <davem@davemloft.net>2019-04-23 01:20:15 -0400
commit7e6e185c74dd8a8dc539300c079adc6bc27045d6 (patch)
tree1ab1178d53df8fcf9d8b8823f80647bc46e91922 /drivers/net/ethernet/broadcom
parent697cd36cda32966bc605bfcf132b0cac4bcd9480 (diff)
net: systemport: Remove need for DMA descriptor
All we do is write the length/status and address bits to a DMA descriptor only to write its contents into on-chip registers right after, eliminate this unnecessary step. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.c56
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.h10
2 files changed, 8 insertions, 58 deletions
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index dfe46dacf5cf..4e87a303f83e 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -116,15 +116,6 @@ static inline void dma_desc_set_addr(struct bcm_sysport_priv *priv,
116 writel_relaxed(lower_32_bits(addr), d + DESC_ADDR_LO); 116 writel_relaxed(lower_32_bits(addr), d + DESC_ADDR_LO);
117} 117}
118 118
119static inline void tdma_port_write_desc_addr(struct bcm_sysport_priv *priv,
120 struct dma_desc *desc,
121 unsigned int port)
122{
123 /* Ports are latched, so write upper address first */
124 tdma_writel(priv, desc->addr_status_len, TDMA_WRITE_PORT_HI(port));
125 tdma_writel(priv, desc->addr_lo, TDMA_WRITE_PORT_LO(port));
126}
127
128/* Ethtool operations */ 119/* Ethtool operations */
129static void bcm_sysport_set_rx_csum(struct net_device *dev, 120static void bcm_sysport_set_rx_csum(struct net_device *dev,
130 netdev_features_t wanted) 121 netdev_features_t wanted)
@@ -1291,11 +1282,10 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb,
1291 struct bcm_sysport_tx_ring *ring; 1282 struct bcm_sysport_tx_ring *ring;
1292 struct bcm_sysport_cb *cb; 1283 struct bcm_sysport_cb *cb;
1293 struct netdev_queue *txq; 1284 struct netdev_queue *txq;
1294 struct dma_desc *desc; 1285 u32 len_status, addr_lo;
1295 unsigned int skb_len; 1286 unsigned int skb_len;
1296 unsigned long flags; 1287 unsigned long flags;
1297 dma_addr_t mapping; 1288 dma_addr_t mapping;
1298 u32 len_status;
1299 u16 queue; 1289 u16 queue;
1300 int ret; 1290 int ret;
1301 1291
@@ -1338,10 +1328,7 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb,
1338 dma_unmap_addr_set(cb, dma_addr, mapping); 1328 dma_unmap_addr_set(cb, dma_addr, mapping);
1339 dma_unmap_len_set(cb, dma_len, skb_len); 1329 dma_unmap_len_set(cb, dma_len, skb_len);
1340 1330
1341 /* Fetch a descriptor entry from our pool */ 1331 addr_lo = lower_32_bits(mapping);
1342 desc = ring->desc_cpu;
1343
1344 desc->addr_lo = lower_32_bits(mapping);
1345 len_status = upper_32_bits(mapping) & DESC_ADDR_HI_MASK; 1332 len_status = upper_32_bits(mapping) & DESC_ADDR_HI_MASK;
1346 len_status |= (skb_len << DESC_LEN_SHIFT); 1333 len_status |= (skb_len << DESC_LEN_SHIFT);
1347 len_status |= (DESC_SOP | DESC_EOP | TX_STATUS_APP_CRC) << 1334 len_status |= (DESC_SOP | DESC_EOP | TX_STATUS_APP_CRC) <<
@@ -1354,16 +1341,9 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb,
1354 ring->curr_desc = 0; 1341 ring->curr_desc = 0;
1355 ring->desc_count--; 1342 ring->desc_count--;
1356 1343
1357 /* Ensure write completion of the descriptor status/length 1344 /* Ports are latched, so write upper address first */
1358 * in DRAM before the System Port WRITE_PORT register latches 1345 tdma_writel(priv, len_status, TDMA_WRITE_PORT_HI(ring->index));
1359 * the value 1346 tdma_writel(priv, addr_lo, TDMA_WRITE_PORT_LO(ring->index));
1360 */
1361 wmb();
1362 desc->addr_status_len = len_status;
1363 wmb();
1364
1365 /* Write this descriptor address to the RING write port */
1366 tdma_port_write_desc_addr(priv, desc, ring->index);
1367 1347
1368 /* Check ring space and update SW control flow */ 1348 /* Check ring space and update SW control flow */
1369 if (ring->desc_count == 0) 1349 if (ring->desc_count == 0)
@@ -1489,28 +1469,14 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv,
1489 unsigned int index) 1469 unsigned int index)
1490{ 1470{
1491 struct bcm_sysport_tx_ring *ring = &priv->tx_rings[index]; 1471 struct bcm_sysport_tx_ring *ring = &priv->tx_rings[index];
1492 struct device *kdev = &priv->pdev->dev;
1493 size_t size; 1472 size_t size;
1494 void *p;
1495 u32 reg; 1473 u32 reg;
1496 1474
1497 /* Simple descriptors partitioning for now */ 1475 /* Simple descriptors partitioning for now */
1498 size = 256; 1476 size = 256;
1499 1477
1500 /* We just need one DMA descriptor which is DMA-able, since writing to
1501 * the port will allocate a new descriptor in its internal linked-list
1502 */
1503 p = dma_alloc_coherent(kdev, sizeof(struct dma_desc), &ring->desc_dma,
1504 GFP_KERNEL);
1505 if (!p) {
1506 netif_err(priv, hw, priv->netdev, "DMA alloc failed\n");
1507 return -ENOMEM;
1508 }
1509
1510 ring->cbs = kcalloc(size, sizeof(struct bcm_sysport_cb), GFP_KERNEL); 1478 ring->cbs = kcalloc(size, sizeof(struct bcm_sysport_cb), GFP_KERNEL);
1511 if (!ring->cbs) { 1479 if (!ring->cbs) {
1512 dma_free_coherent(kdev, sizeof(struct dma_desc),
1513 ring->desc_cpu, ring->desc_dma);
1514 netif_err(priv, hw, priv->netdev, "CB allocation failed\n"); 1480 netif_err(priv, hw, priv->netdev, "CB allocation failed\n");
1515 return -ENOMEM; 1481 return -ENOMEM;
1516 } 1482 }
@@ -1523,7 +1489,6 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv,
1523 ring->size = size; 1489 ring->size = size;
1524 ring->clean_index = 0; 1490 ring->clean_index = 0;
1525 ring->alloc_size = ring->size; 1491 ring->alloc_size = ring->size;
1526 ring->desc_cpu = p;
1527 ring->desc_count = ring->size; 1492 ring->desc_count = ring->size;
1528 ring->curr_desc = 0; 1493 ring->curr_desc = 0;
1529 1494
@@ -1578,8 +1543,8 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv,
1578 napi_enable(&ring->napi); 1543 napi_enable(&ring->napi);
1579 1544
1580 netif_dbg(priv, hw, priv->netdev, 1545 netif_dbg(priv, hw, priv->netdev,
1581 "TDMA cfg, size=%d, desc_cpu=%p switch q=%d,port=%d\n", 1546 "TDMA cfg, size=%d, switch q=%d,port=%d\n",
1582 ring->size, ring->desc_cpu, ring->switch_queue, 1547 ring->size, ring->switch_queue,
1583 ring->switch_port); 1548 ring->switch_port);
1584 1549
1585 return 0; 1550 return 0;
@@ -1589,7 +1554,6 @@ static void bcm_sysport_fini_tx_ring(struct bcm_sysport_priv *priv,
1589 unsigned int index) 1554 unsigned int index)
1590{ 1555{
1591 struct bcm_sysport_tx_ring *ring = &priv->tx_rings[index]; 1556 struct bcm_sysport_tx_ring *ring = &priv->tx_rings[index];
1592 struct device *kdev = &priv->pdev->dev;
1593 u32 reg; 1557 u32 reg;
1594 1558
1595 /* Caller should stop the TDMA engine */ 1559 /* Caller should stop the TDMA engine */
@@ -1611,12 +1575,6 @@ static void bcm_sysport_fini_tx_ring(struct bcm_sysport_priv *priv,
1611 1575
1612 kfree(ring->cbs); 1576 kfree(ring->cbs);
1613 ring->cbs = NULL; 1577 ring->cbs = NULL;
1614
1615 if (ring->desc_dma) {
1616 dma_free_coherent(kdev, sizeof(struct dma_desc),
1617 ring->desc_cpu, ring->desc_dma);
1618 ring->desc_dma = 0;
1619 }
1620 ring->size = 0; 1578 ring->size = 0;
1621 ring->alloc_size = 0; 1579 ring->alloc_size = 0;
1622 1580
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h
index 0b192fea9c5d..6f3141c86436 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.h
+++ b/drivers/net/ethernet/broadcom/bcmsysport.h
@@ -516,12 +516,6 @@ struct bcm_rsb {
516 516
517#define TDMA_DEBUG 0x64c 517#define TDMA_DEBUG 0x64c
518 518
519/* Transmit/Receive descriptor */
520struct dma_desc {
521 u32 addr_status_len;
522 u32 addr_lo;
523};
524
525/* Number of Receive hardware descriptor words */ 519/* Number of Receive hardware descriptor words */
526#define SP_NUM_HW_RX_DESC_WORDS 1024 520#define SP_NUM_HW_RX_DESC_WORDS 1024
527#define SP_LT_NUM_HW_RX_DESC_WORDS 256 521#define SP_LT_NUM_HW_RX_DESC_WORDS 256
@@ -530,7 +524,7 @@ struct dma_desc {
530#define SP_NUM_TX_DESC 1536 524#define SP_NUM_TX_DESC 1536
531#define SP_LT_NUM_TX_DESC 256 525#define SP_LT_NUM_TX_DESC 256
532 526
533#define WORDS_PER_DESC (sizeof(struct dma_desc) / sizeof(u32)) 527#define WORDS_PER_DESC 2
534 528
535/* Rx/Tx common counter group.*/ 529/* Rx/Tx common counter group.*/
536struct bcm_sysport_pkt_counters { 530struct bcm_sysport_pkt_counters {
@@ -718,7 +712,6 @@ struct bcm_sysport_net_dim {
718struct bcm_sysport_tx_ring { 712struct bcm_sysport_tx_ring {
719 spinlock_t lock; /* Ring lock for tx reclaim/xmit */ 713 spinlock_t lock; /* Ring lock for tx reclaim/xmit */
720 struct napi_struct napi; /* NAPI per tx queue */ 714 struct napi_struct napi; /* NAPI per tx queue */
721 dma_addr_t desc_dma; /* DMA cookie */
722 unsigned int index; /* Ring index */ 715 unsigned int index; /* Ring index */
723 unsigned int size; /* Ring current size */ 716 unsigned int size; /* Ring current size */
724 unsigned int alloc_size; /* Ring one-time allocated size */ 717 unsigned int alloc_size; /* Ring one-time allocated size */
@@ -727,7 +720,6 @@ struct bcm_sysport_tx_ring {
727 unsigned int c_index; /* Last consumer index */ 720 unsigned int c_index; /* Last consumer index */
728 unsigned int clean_index; /* Current clean index */ 721 unsigned int clean_index; /* Current clean index */
729 struct bcm_sysport_cb *cbs; /* Transmit control blocks */ 722 struct bcm_sysport_cb *cbs; /* Transmit control blocks */
730 struct dma_desc *desc_cpu; /* CPU view of the descriptor */
731 struct bcm_sysport_priv *priv; /* private context backpointer */ 723 struct bcm_sysport_priv *priv; /* private context backpointer */
732 unsigned long packets; /* packets statistics */ 724 unsigned long packets; /* packets statistics */
733 unsigned long bytes; /* bytes statistics */ 725 unsigned long bytes; /* bytes statistics */