diff options
| author | Florian Fainelli <f.fainelli@gmail.com> | 2019-04-22 12:46:44 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-04-23 01:20:15 -0400 |
| commit | 7e6e185c74dd8a8dc539300c079adc6bc27045d6 (patch) | |
| tree | 1ab1178d53df8fcf9d8b8823f80647bc46e91922 /drivers/net/ethernet/broadcom | |
| parent | 697cd36cda32966bc605bfcf132b0cac4bcd9480 (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.c | 56 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.h | 10 |
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 | ||
| 119 | static 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 */ |
| 129 | static void bcm_sysport_set_rx_csum(struct net_device *dev, | 120 | static 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 */ | ||
| 520 | struct 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.*/ |
| 536 | struct bcm_sysport_pkt_counters { | 530 | struct bcm_sysport_pkt_counters { |
| @@ -718,7 +712,6 @@ struct bcm_sysport_net_dim { | |||
| 718 | struct bcm_sysport_tx_ring { | 712 | struct 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 */ |
