Lines Matching defs:ring
345 /* RDMA/TDMA ring registers and accessors
409 unsigned int ring,
413 (DMA_RING_SIZE * ring) +
418 unsigned int ring, u32 val,
422 (DMA_RING_SIZE * ring) +
427 unsigned int ring,
431 (DMA_RING_SIZE * ring) +
436 unsigned int ring, u32 val,
440 (DMA_RING_SIZE * ring) +
672 * We'll map them to ring 0, but don't enable the filter
818 struct bcmgenet_rx_ring *ring;
831 ring = &priv->rx_rings[i];
832 ec->use_adaptive_rx_coalesce |= ring->dim.use_dim;
834 ring = &priv->rx_rings[DESC_INDEX];
835 ec->use_adaptive_rx_coalesce |= ring->dim.use_dim;
840 static void bcmgenet_set_rx_coalesce(struct bcmgenet_rx_ring *ring,
843 struct bcmgenet_priv *priv = ring->priv;
844 unsigned int i = ring->index;
855 static void bcmgenet_set_ring_rx_coalesce(struct bcmgenet_rx_ring *ring,
861 ring->rx_coalesce_usecs = ec->rx_coalesce_usecs;
862 ring->rx_max_coalesced_frames = ec->rx_max_coalesced_frames;
863 usecs = ring->rx_coalesce_usecs;
864 pkts = ring->rx_max_coalesced_frames;
866 if (ec->use_adaptive_rx_coalesce && !ring->dim.use_dim) {
867 moder = net_dim_get_def_rx_moderation(ring->dim.dim.mode);
872 ring->dim.use_dim = ec->use_adaptive_rx_coalesce;
873 bcmgenet_set_rx_coalesce(ring, usecs, pkts);
899 * transmitted, or when the ring is empty.
1731 struct bcmgenet_tx_ring *ring)
1735 tx_cb_ptr = ring->cbs;
1736 tx_cb_ptr += ring->write_ptr - ring->cb_ptr;
1739 if (ring->write_ptr == ring->end_ptr)
1740 ring->write_ptr = ring->cb_ptr;
1742 ring->write_ptr++;
1748 struct bcmgenet_tx_ring *ring)
1752 tx_cb_ptr = ring->cbs;
1753 tx_cb_ptr += ring->write_ptr - ring->cb_ptr;
1756 if (ring->write_ptr == ring->cb_ptr)
1757 ring->write_ptr = ring->end_ptr;
1759 ring->write_ptr--;
1764 static inline void bcmgenet_rx_ring16_int_disable(struct bcmgenet_rx_ring *ring)
1766 bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_RXDMA_DONE,
1770 static inline void bcmgenet_rx_ring16_int_enable(struct bcmgenet_rx_ring *ring)
1772 bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_RXDMA_DONE,
1776 static inline void bcmgenet_rx_ring_int_disable(struct bcmgenet_rx_ring *ring)
1778 bcmgenet_intrl2_1_writel(ring->priv,
1779 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index),
1783 static inline void bcmgenet_rx_ring_int_enable(struct bcmgenet_rx_ring *ring)
1785 bcmgenet_intrl2_1_writel(ring->priv,
1786 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index),
1790 static inline void bcmgenet_tx_ring16_int_disable(struct bcmgenet_tx_ring *ring)
1792 bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_TXDMA_DONE,
1796 static inline void bcmgenet_tx_ring16_int_enable(struct bcmgenet_tx_ring *ring)
1798 bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_TXDMA_DONE,
1802 static inline void bcmgenet_tx_ring_int_enable(struct bcmgenet_tx_ring *ring)
1804 bcmgenet_intrl2_1_writel(ring->priv, 1 << ring->index,
1808 static inline void bcmgenet_tx_ring_int_disable(struct bcmgenet_tx_ring *ring)
1810 bcmgenet_intrl2_1_writel(ring->priv, 1 << ring->index,
1871 struct bcmgenet_tx_ring *ring)
1882 if (ring->index == DESC_INDEX)
1886 bcmgenet_intrl2_1_writel(priv, (1 << ring->index),
1890 c_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_CONS_INDEX)
1892 txbds_ready = (c_index - ring->c_index) & DMA_C_INDEX_MASK;
1895 "%s ring=%d old_c_index=%u c_index=%u txbds_ready=%u\n",
1896 __func__, ring->index, ring->c_index, c_index, txbds_ready);
1901 &priv->tx_cbs[ring->clean_ptr]);
1909 if (likely(ring->clean_ptr < ring->end_ptr))
1910 ring->clean_ptr++;
1912 ring->clean_ptr = ring->cb_ptr;
1915 ring->free_bds += txbds_processed;
1916 ring->c_index = c_index;
1918 ring->packets += pkts_compl;
1919 ring->bytes += bytes_compl;
1921 netdev_tx_completed_queue(netdev_get_tx_queue(dev, ring->queue),
1928 struct bcmgenet_tx_ring *ring)
1932 spin_lock_bh(&ring->lock);
1933 released = __bcmgenet_tx_reclaim(dev, ring);
1934 spin_unlock_bh(&ring->lock);
1941 struct bcmgenet_tx_ring *ring =
1946 spin_lock(&ring->lock);
1947 work_done = __bcmgenet_tx_reclaim(ring->priv->dev, ring);
1948 if (ring->free_bds > (MAX_SKB_FRAGS + 1)) {
1949 txq = netdev_get_tx_queue(ring->priv->dev, ring->queue);
1952 spin_unlock(&ring->lock);
1956 ring->int_enable(ring);
2049 struct bcmgenet_tx_ring *ring = NULL;
2063 * queue_mapping = 1, goes to ring 0. (highest priority queue
2064 * queue_mapping = 2, goes to ring 1.
2065 * queue_mapping = 3, goes to ring 2.
2066 * queue_mapping = 4, goes to ring 3.
2073 ring = &priv->tx_rings[index];
2074 txq = netdev_get_tx_queue(dev, ring->queue);
2078 spin_lock(&ring->lock);
2079 if (ring->free_bds <= (nr_frags + 1)) {
2099 tx_cb_ptr = bcmgenet_get_txcb(priv, ring);
2154 ring->free_bds -= nr_frags + 1;
2155 ring->prod_index += nr_frags + 1;
2156 ring->prod_index &= DMA_P_INDEX_MASK;
2160 if (ring->free_bds <= (MAX_SKB_FRAGS + 1))
2165 bcmgenet_tdma_ring_writel(priv, ring->index,
2166 ring->prod_index, TDMA_PROD_INDEX);
2168 spin_unlock(&ring->lock);
2174 bcmgenet_put_txcb(priv, ring);
2178 tx_cb_ptr = bcmgenet_put_txcb(priv, ring);
2215 /* Grab the current Rx skb from the ring and DMA-unmap it */
2218 /* Put the new Rx skb on the ring */
2231 static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring,
2234 struct bcmgenet_priv *priv = ring->priv;
2247 if (ring->index == DESC_INDEX) {
2251 mask = 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index);
2257 p_index = bcmgenet_rdma_ring_readl(priv, ring->index, RDMA_PROD_INDEX);
2261 if (discards > ring->old_discards) {
2262 discards = discards - ring->old_discards;
2263 ring->errors += discards;
2264 ring->old_discards += discards;
2267 if (ring->old_discards >= 0xC000) {
2268 ring->old_discards = 0;
2269 bcmgenet_rdma_ring_writel(priv, ring->index, 0,
2275 rxpkttoprocess = (p_index - ring->c_index) & DMA_C_INDEX_MASK;
2285 cb = &priv->rx_cbs[ring->read_ptr];
2289 ring->dropped++;
2311 __func__, p_index, ring->c_index,
2312 ring->read_ptr, dma_length_status);
2325 ring->errors++;
2366 ring->packets++;
2367 ring->bytes += len;
2372 napi_gro_receive(&ring->napi, skb);
2377 if (likely(ring->read_ptr < ring->end_ptr))
2378 ring->read_ptr++;
2380 ring->read_ptr = ring->cb_ptr;
2382 ring->c_index = (ring->c_index + 1) & DMA_C_INDEX_MASK;
2383 bcmgenet_rdma_ring_writel(priv, ring->index, ring->c_index, RDMA_CONS_INDEX);
2386 ring->dim.bytes = bytes_processed;
2387 ring->dim.packets = rxpktprocessed;
2395 struct bcmgenet_rx_ring *ring = container_of(napi,
2400 work_done = bcmgenet_desc_rx(ring, budget);
2404 ring->int_enable(ring);
2407 if (ring->dim.use_dim) {
2408 dim_update_sample(ring->dim.event_ctr, ring->dim.packets,
2409 ring->dim.bytes, &dim_sample);
2410 net_dim(&ring->dim.dim, dim_sample);
2421 struct bcmgenet_rx_ring *ring =
2426 bcmgenet_set_rx_coalesce(ring, cur_profile.usec, cur_profile.pkts);
2432 struct bcmgenet_rx_ring *ring)
2441 for (i = 0; i < ring->size; i++) {
2442 cb = ring->cbs + i;
2595 static void bcmgenet_init_dim(struct bcmgenet_rx_ring *ring,
2598 struct bcmgenet_net_dim *dim = &ring->dim;
2607 static void bcmgenet_init_rx_coalesce(struct bcmgenet_rx_ring *ring)
2609 struct bcmgenet_net_dim *dim = &ring->dim;
2613 usecs = ring->rx_coalesce_usecs;
2614 pkts = ring->rx_max_coalesced_frames;
2623 bcmgenet_set_rx_coalesce(ring, usecs, pkts);
2626 /* Initialize a Tx ring along with corresponding hardware registers */
2631 struct bcmgenet_tx_ring *ring = &priv->tx_rings[index];
2635 spin_lock_init(&ring->lock);
2636 ring->priv = priv;
2637 ring->index = index;
2639 ring->queue = 0;
2640 ring->int_enable = bcmgenet_tx_ring16_int_enable;
2641 ring->int_disable = bcmgenet_tx_ring16_int_disable;
2643 ring->queue = index + 1;
2644 ring->int_enable = bcmgenet_tx_ring_int_enable;
2645 ring->int_disable = bcmgenet_tx_ring_int_disable;
2647 ring->cbs = priv->tx_cbs + start_ptr;
2648 ring->size = size;
2649 ring->clean_ptr = start_ptr;
2650 ring->c_index = 0;
2651 ring->free_bds = size;
2652 ring->write_ptr = start_ptr;
2653 ring->cb_ptr = start_ptr;
2654 ring->end_ptr = end_ptr - 1;
2655 ring->prod_index = 0;
2657 /* Set flow period for ring != 16 */
2682 netif_napi_add_tx(priv->dev, &ring->napi, bcmgenet_tx_poll);
2685 /* Initialize a RDMA ring */
2690 struct bcmgenet_rx_ring *ring = &priv->rx_rings[index];
2694 ring->priv = priv;
2695 ring->index = index;
2697 ring->int_enable = bcmgenet_rx_ring16_int_enable;
2698 ring->int_disable = bcmgenet_rx_ring16_int_disable;
2700 ring->int_enable = bcmgenet_rx_ring_int_enable;
2701 ring->int_disable = bcmgenet_rx_ring_int_disable;
2703 ring->cbs = priv->rx_cbs + start_ptr;
2704 ring->size = size;
2705 ring->c_index = 0;
2706 ring->read_ptr = start_ptr;
2707 ring->cb_ptr = start_ptr;
2708 ring->end_ptr = end_ptr - 1;
2710 ret = bcmgenet_alloc_rx_buffers(priv, ring);
2714 bcmgenet_init_dim(ring, bcmgenet_dim_work);
2715 bcmgenet_init_rx_coalesce(ring);
2718 netif_napi_add(priv->dev, &ring->napi, bcmgenet_rx_poll);
2746 struct bcmgenet_tx_ring *ring;
2749 ring = &priv->tx_rings[i];
2750 napi_enable(&ring->napi);
2751 ring->int_enable(ring);
2754 ring = &priv->tx_rings[DESC_INDEX];
2755 napi_enable(&ring->napi);
2756 ring->int_enable(ring);
2762 struct bcmgenet_tx_ring *ring;
2765 ring = &priv->tx_rings[i];
2766 napi_disable(&ring->napi);
2769 ring = &priv->tx_rings[DESC_INDEX];
2770 napi_disable(&ring->napi);
2776 struct bcmgenet_tx_ring *ring;
2779 ring = &priv->tx_rings[i];
2780 netif_napi_del(&ring->napi);
2783 ring = &priv->tx_rings[DESC_INDEX];
2784 netif_napi_del(&ring->napi);
2859 struct bcmgenet_rx_ring *ring;
2862 ring = &priv->rx_rings[i];
2863 napi_enable(&ring->napi);
2864 ring->int_enable(ring);
2867 ring = &priv->rx_rings[DESC_INDEX];
2868 napi_enable(&ring->napi);
2869 ring->int_enable(ring);
2875 struct bcmgenet_rx_ring *ring;
2878 ring = &priv->rx_rings[i];
2879 napi_disable(&ring->napi);
2880 cancel_work_sync(&ring->dim.dim.work);
2883 ring = &priv->rx_rings[DESC_INDEX];
2884 napi_disable(&ring->napi);
2885 cancel_work_sync(&ring->dim.dim.work);
2891 struct bcmgenet_rx_ring *ring;
2894 ring = &priv->rx_rings[i];
2895 netif_napi_del(&ring->napi);
2898 ring = &priv->rx_rings[DESC_INDEX];
2899 netif_napi_del(&ring->napi);
2954 /* Configure ring as descriptor ring and re-enable DMA if enabled */
3063 /* Initialize common Rx ring structures */
3076 /* Initialize common TX ring structures */
3400 /* Always enable ring 16 - descriptor ring */
3501 static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring)
3503 struct bcmgenet_priv *priv = ring->priv;
3512 txq = netdev_get_tx_queue(priv->dev, ring->queue);
3514 spin_lock(&ring->lock);
3515 if (ring->index == DESC_INDEX) {
3520 intmsk = 1 << ring->index;
3522 c_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_CONS_INDEX);
3523 p_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_PROD_INDEX);
3525 free_bds = ring->free_bds;
3526 spin_unlock(&ring->lock);
3535 ring->index, ring->queue,
3538 free_bds, ring->size,
3539 ring->prod_index, p_index & DMA_P_INDEX_MASK,
3540 ring->c_index, c_index & DMA_C_INDEX_MASK,
3541 ring->clean_ptr, ring->write_ptr,
3542 ring->cb_ptr, ring->end_ptr);
4138 * just the ring 16 descriptor based TX
4271 /* Always enable ring 16 - descriptor ring */