Lines Matching +full:rx +full:- +full:ctrl
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2015-2016 Freescale Semiconductor, Inc.
14 * HIF Rx interface function
15 * Reads the rx descriptor from the current location (rx_to_read).
16 * - If the descriptor has a valid data/pkt, then get the data pointer
17 * - check for the input rx phy number
18 * - increment the rx data pointer by pkt_head_room_size
19 * - decrement the data length by pkt_head_room_size
20 * - handover the packet to caller.
22 * @param[out] pkt_ptr - Pointer to store rx packet
23 * @param[out] phy_port - Pointer to store recv phy port
25 * @return -1 if no packet, else return length of packet.
35 bd = rx_desc->rx_base + rx_desc->rx_to_read; in pfe_recv()
37 if (readl(&bd->ctrl) & BD_CTRL_DESC_EN) in pfe_recv()
38 return len; /* No pending Rx packet */ in pfe_recv()
41 len = readl(&bd->ctrl) & 0xFFFF; in pfe_recv()
43 hif_header = (struct hif_header_s *)DDR_PFE_TO_VIRT(readl(&bd->data)); in pfe_recv()
48 hif_header, len, hif_header->port_no, readl(&bd->status)); in pfe_recv()
64 *phy_port = hif_header->port_no; in pfe_recv()
65 len -= sizeof(struct hif_header_s); in pfe_recv()
71 * HIF function to check the Rx done
72 * This function will check the rx done indication of the current rx_to_read
81 debug("%s:rx_base: %p, rx_to_read: %d\n", __func__, rx_desc->rx_base, in pfe_eth_free_pkt()
82 rx_desc->rx_to_read); in pfe_eth_free_pkt()
84 bd = rx_desc->rx_base + rx_desc->rx_to_read; in pfe_eth_free_pkt()
88 | BD_CTRL_DIR), &bd->ctrl); in pfe_eth_free_pkt()
89 writel(0, &bd->status); in pfe_eth_free_pkt()
91 debug("Rx Done : status: %08x, ctrl: %08x\n", readl(&bd->status), in pfe_eth_free_pkt()
92 readl(&bd->ctrl)); in pfe_eth_free_pkt()
96 * In idle state (ie., no rx pkt), BDP will not fetch in pfe_eth_free_pkt()
102 rx_desc->rx_to_read = (rx_desc->rx_to_read + 1) in pfe_eth_free_pkt()
103 & (rx_desc->rx_ring_size - 1); in pfe_eth_free_pkt()
105 debug("Rx next pkt location: %d\n", rx_desc->rx_to_read); in pfe_eth_free_pkt()
113 * - No interrupt indication on tx completion.
114 * - Data is copied to tx buffers before tx descriptor is updated
121 * @return -1 if tx Q is full, else returns the tx location where the pkt is
132 data, length, tx_desc->tx_base, tx_desc->tx_to_send); in pfe_send()
134 bd = tx_desc->tx_base + tx_desc->tx_to_send; in pfe_send()
136 /* check queue-full condition */ in pfe_send()
137 if (readl(&bd->ctrl) & BD_CTRL_DESC_EN) in pfe_send()
138 return -1; in pfe_send()
144 tx_buf_va = (void *)DDR_PFE_TO_VIRT(readl(&bd->data)); in pfe_send()
146 readl(&bd->data)); in pfe_send()
169 debug("Tx Done: status: %08x, ctrl: %08x\n", readl(&bd->status), in pfe_send()
170 readl(&bd->ctrl)); in pfe_send()
174 &bd->ctrl); in pfe_send()
175 writel(0, &bd->status); in pfe_send()
181 return tx_desc->tx_to_send; in pfe_send()
190 * @return -1 if TX ownership bit is not cleared by hw.
198 debug("%s:tx_base: %p, tx_to_send: %d\n", __func__, tx_desc->tx_base, in pfe_tx_done()
199 tx_desc->tx_to_send); in pfe_tx_done()
201 bd = tx_desc->tx_base + tx_desc->tx_to_send; in pfe_tx_done()
203 /* check queue-full condition */ in pfe_tx_done()
204 if (readl(&bd->ctrl) & BD_CTRL_DESC_EN) in pfe_tx_done()
205 return -1; in pfe_tx_done()
208 writel(0, &bd->ctrl); in pfe_tx_done()
209 writel(0, &bd->status); in pfe_tx_done()
211 debug("Tx Done : status: %08x, ctrl: %08x\n", readl(&bd->status), in pfe_tx_done()
212 readl(&bd->ctrl)); in pfe_tx_done()
215 tx_desc->tx_to_send = (tx_desc->tx_to_send + 1) in pfe_tx_done()
216 & (tx_desc->tx_ring_size - 1); in pfe_tx_done()
218 debug("Tx next pkt location: %d\n", tx_desc->tx_to_send); in pfe_tx_done()
224 * Helper function to dump Rx descriptors.
233 printf("%s: HIF Rx desc no init\n", __func__); in hif_rx_desc_dump()
238 bd_va = rx_desc->rx_base; in hif_rx_desc_dump()
240 debug("HIF rx desc: base_va: %p, base_pa: %08x\n", rx_desc->rx_base, in hif_rx_desc_dump()
241 rx_desc->rx_base_pa); in hif_rx_desc_dump()
242 for (i = 0; i < rx_desc->rx_ring_size; i++) { in hif_rx_desc_dump()
243 debug("status: %08x, ctrl: %08x, data: %08x, next: 0x%08x\n", in hif_rx_desc_dump()
244 readl(&bd_va->status), in hif_rx_desc_dump()
245 readl(&bd_va->ctrl), in hif_rx_desc_dump()
246 readl(&bd_va->data), in hif_rx_desc_dump()
247 readl(&bd_va->next)); in hif_rx_desc_dump()
253 * This function mark all Rx descriptors as LAST_BD.
262 printf("%s: HIF Rx desc not initialized\n", __func__); in hif_rx_desc_disable()
267 bd_va = rx_desc->rx_base; in hif_rx_desc_disable()
269 for (i = 0; i < rx_desc->rx_ring_size; i++) { in hif_rx_desc_disable()
270 writel(readl(&bd_va->ctrl) | BD_CTRL_LAST_BD, &bd_va->ctrl); in hif_rx_desc_disable()
276 * HIF Rx Desc initialization function.
280 u32 ctrl; in hif_rx_desc_init() local
289 printf("%s: HIF Rx desc re-init request\n", __func__); in hif_rx_desc_init()
296 return -ENOMEM; in hif_rx_desc_init()
300 /* init: Rx ring buffer */ in hif_rx_desc_init()
301 rx_desc->rx_ring_size = HIF_RX_DESC_NT; in hif_rx_desc_init()
304 bd_va = (struct buf_desc *)(pfe_addr->ddr_pfe_baseaddr in hif_rx_desc_init()
306 bd_pa = (struct buf_desc *)(pfe_addr->ddr_pfe_phys_baseaddr in hif_rx_desc_init()
309 rx_desc->rx_base = bd_va; in hif_rx_desc_init()
310 rx_desc->rx_base_pa = (unsigned long)bd_pa; in hif_rx_desc_init()
312 rx_buf_pa = pfe_addr->ddr_pfe_phys_baseaddr + HIF_RX_PKT_DDR_BASEADDR; in hif_rx_desc_init()
314 debug("%s: Rx desc base: %p, base_pa: %08x, desc_count: %d\n", in hif_rx_desc_init()
315 __func__, rx_desc->rx_base, rx_desc->rx_base_pa, in hif_rx_desc_init()
316 rx_desc->rx_ring_size); in hif_rx_desc_init()
318 memset(bd_va, 0, sizeof(struct buf_desc) * rx_desc->rx_ring_size); in hif_rx_desc_init()
320 ctrl = (MAX_FRAME_SIZE | BD_CTRL_DESC_EN | BD_CTRL_DIR | BD_CTRL_LIFM); in hif_rx_desc_init()
322 for (i = 0; i < rx_desc->rx_ring_size; i++) { in hif_rx_desc_init()
323 writel((unsigned long)(bd_pa + 1), &bd_va->next); in hif_rx_desc_init()
324 writel(ctrl, &bd_va->ctrl); in hif_rx_desc_init()
325 writel(rx_buf_pa + (i * MAX_FRAME_SIZE), &bd_va->data); in hif_rx_desc_init()
329 --bd_va; in hif_rx_desc_init()
330 writel((u32)rx_desc->rx_base_pa, &bd_va->next); in hif_rx_desc_init()
332 writel(rx_desc->rx_base_pa, HIF_RX_BDP_ADDR); in hif_rx_desc_init()
355 bd_va = tx_desc->tx_base; in hif_tx_desc_dump()
357 debug("HIF tx desc: base_va: %p, base_pa: %08x\n", tx_desc->tx_base, in hif_tx_desc_dump()
358 tx_desc->tx_base_pa); in hif_tx_desc_dump()
360 for (i = 0; i < tx_desc->tx_ring_size; i++) in hif_tx_desc_dump()
377 printf("%s: HIF Tx desc re-init request\n", __func__); in hif_tx_desc_init()
385 return -ENOMEM; in hif_tx_desc_init()
390 tx_desc->tx_ring_size = HIF_TX_DESC_NT; in hif_tx_desc_init()
393 bd_va = (struct buf_desc *)(pfe_addr->ddr_pfe_baseaddr in hif_tx_desc_init()
395 bd_pa = (struct buf_desc *)(pfe_addr->ddr_pfe_phys_baseaddr in hif_tx_desc_init()
398 tx_desc->tx_base_pa = (unsigned long)bd_pa; in hif_tx_desc_init()
399 tx_desc->tx_base = bd_va; in hif_tx_desc_init()
402 __func__, tx_desc->tx_base, tx_desc->tx_base_pa, in hif_tx_desc_init()
403 tx_desc->tx_ring_size); in hif_tx_desc_init()
405 memset(bd_va, 0, sizeof(struct buf_desc) * tx_desc->tx_ring_size); in hif_tx_desc_init()
407 tx_buf_pa = pfe_addr->ddr_pfe_phys_baseaddr + HIF_TX_PKT_DDR_BASEADDR; in hif_tx_desc_init()
409 for (i = 0; i < tx_desc->tx_ring_size; i++) { in hif_tx_desc_init()
410 writel((unsigned long)(bd_pa + 1), &bd_va->next); in hif_tx_desc_init()
411 writel(tx_buf_pa + (i * MAX_FRAME_SIZE), &bd_va->data); in hif_tx_desc_init()
415 --bd_va; in hif_tx_desc_init()
416 writel((u32)tx_desc->tx_base_pa, &bd_va->next); in hif_tx_desc_init()
418 writel(tx_desc->tx_base_pa, HIF_TX_BDP_ADDR); in hif_tx_desc_init()
431 .route_table_baseaddr = pfe_addr->ddr_pfe_phys_baseaddr + in pfe_class_init()
447 .llm_base_addr = pfe_addr->ddr_pfe_phys_baseaddr in pfe_tmu_init()
470 .baseaddr = pfe_addr->ddr_pfe_phys_baseaddr + BMU2_DDR_BASEADDR, in pfe_bmu_init()
484 * - egpi1, egpi2, egpi3, hgpi
547 * - Firmware loading (CLASS-PE and TMU-PE)
548 * - BMU1 and BMU2 init
549 * - GEMAC init
550 * - GPI init
551 * - CLASS-PE init
552 * - TMU-PE init
553 * - HIF tx and rx descriptors init
595 * - Initializes pfe_lib
596 * - pfe hw init
597 * - fw loading and enables PEs
598 * - should be executed once.
614 * - out of reset + disabled + configured. in pfe_drv_init()
625 * - stops PEs
626 * - frees tx/rx descriptor resources
627 * - should be called once.