Lines Matching +full:frame +full:- +full:buffer

1 /*-
97 * @group dTSEC Frame Info routines.
104 if (sc->sc_fi_zone != NULL) in dtsec_rm_fi_pool_free()
105 uma_zdestroy(sc->sc_fi_zone); in dtsec_rm_fi_pool_free()
112 snprintf(sc->sc_fi_zname, sizeof(sc->sc_fi_zname), "%s: Frame Info", in dtsec_rm_fi_pool_init()
113 device_get_nameunit(sc->sc_dev)); in dtsec_rm_fi_pool_init()
115 sc->sc_fi_zone = uma_zcreate(sc->sc_fi_zname, in dtsec_rm_fi_pool_init()
127 fi = uma_zalloc(sc->sc_fi_zone, M_NOWAIT); in dtsec_rm_fi_alloc()
136 uma_zfree(sc->sc_fi_zone, fi); in dtsec_rm_fi_free()
155 params.baseAddr = sc->sc_fm_base + sc->sc_port_rx_hw_id; in dtsec_rm_fm_port_rx_init()
156 params.h_Fm = sc->sc_fmh; in dtsec_rm_fm_port_rx_init()
157 params.portType = dtsec_fm_port_rx_type(sc->sc_eth_dev_type); in dtsec_rm_fm_port_rx_init()
158 params.portId = sc->sc_eth_id; in dtsec_rm_fm_port_rx_init()
165 rx_params->errFqid = sc->sc_rx_fqid; in dtsec_rm_fm_port_rx_init()
166 rx_params->dfltFqid = sc->sc_rx_fqid; in dtsec_rm_fm_port_rx_init()
167 rx_params->liodnOffset = 0; in dtsec_rm_fm_port_rx_init()
169 pool_params = &rx_params->extBufPools; in dtsec_rm_fm_port_rx_init()
170 pool_params->numOfPoolsUsed = DTSEC_BPOOLS_USED; in dtsec_rm_fm_port_rx_init()
171 pool_params->extBufPool->id = sc->sc_rx_bpid; in dtsec_rm_fm_port_rx_init()
172 pool_params->extBufPool->size = FM_PORT_BUFFER_SIZE; in dtsec_rm_fm_port_rx_init()
174 sc->sc_rxph = FM_PORT_Config(&params); in dtsec_rm_fm_port_rx_init()
175 if (sc->sc_rxph == NULL) { in dtsec_rm_fm_port_rx_init()
176 device_printf(sc->sc_dev, "couldn't configure FM Port RX.\n"); in dtsec_rm_fm_port_rx_init()
180 error = FM_PORT_Init(sc->sc_rxph); in dtsec_rm_fm_port_rx_init()
182 device_printf(sc->sc_dev, "couldn't initialize FM Port RX.\n"); in dtsec_rm_fm_port_rx_init()
183 FM_PORT_Free(sc->sc_rxph); in dtsec_rm_fm_port_rx_init()
188 device_printf(sc->sc_dev, "RX hw port 0x%02x initialized.\n", in dtsec_rm_fm_port_rx_init()
189 sc->sc_port_rx_hw_id); in dtsec_rm_fm_port_rx_init()
203 params.baseAddr = sc->sc_fm_base + sc->sc_port_tx_hw_id; in dtsec_rm_fm_port_tx_init()
204 params.h_Fm = sc->sc_fmh; in dtsec_rm_fm_port_tx_init()
205 params.portType = dtsec_fm_port_tx_type(sc->sc_eth_dev_type); in dtsec_rm_fm_port_tx_init()
206 params.portId = sc->sc_eth_id; in dtsec_rm_fm_port_tx_init()
213 tx_params->errFqid = sc->sc_tx_conf_fqid; in dtsec_rm_fm_port_tx_init()
214 tx_params->dfltFqid = sc->sc_tx_conf_fqid; in dtsec_rm_fm_port_tx_init()
215 tx_params->qmChannel = sc->sc_port_tx_qman_chan; in dtsec_rm_fm_port_tx_init()
217 tx_params->opLiodnOffset = 0; in dtsec_rm_fm_port_tx_init()
220 sc->sc_txph = FM_PORT_Config(&params); in dtsec_rm_fm_port_tx_init()
221 if (sc->sc_txph == NULL) { in dtsec_rm_fm_port_tx_init()
222 device_printf(sc->sc_dev, "couldn't configure FM Port TX.\n"); in dtsec_rm_fm_port_tx_init()
226 error = FM_PORT_Init(sc->sc_txph); in dtsec_rm_fm_port_tx_init()
228 device_printf(sc->sc_dev, "couldn't initialize FM Port TX.\n"); in dtsec_rm_fm_port_tx_init()
229 FM_PORT_Free(sc->sc_txph); in dtsec_rm_fm_port_tx_init()
234 device_printf(sc->sc_dev, "TX hw port 0x%02x initialized.\n", in dtsec_rm_fm_port_tx_init()
235 sc->sc_port_tx_hw_id); in dtsec_rm_fm_port_tx_init()
243 * @group dTSEC buffer pools routines.
247 dtsec_rm_pool_rx_put_buffer(t_Handle h_BufferPool, uint8_t *buffer, in dtsec_rm_pool_rx_put_buffer() argument
253 uma_zfree(sc->sc_rx_zone, buffer); in dtsec_rm_pool_rx_put_buffer()
262 uint8_t *buffer; in dtsec_rm_pool_rx_get_buffer() local
265 buffer = uma_zalloc(sc->sc_rx_zone, M_NOWAIT); in dtsec_rm_pool_rx_get_buffer()
267 return (buffer); in dtsec_rm_pool_rx_get_buffer()
282 count = bman_count(sc->sc_rx_pool); in dtsec_rm_pool_rx_depleted()
286 bman_pool_fill(sc->sc_rx_pool, DTSEC_RM_POOL_RX_HIGH_MARK); in dtsec_rm_pool_rx_depleted()
294 if (sc->sc_rx_pool != NULL) in dtsec_rm_pool_rx_free()
295 bman_pool_destroy(sc->sc_rx_pool); in dtsec_rm_pool_rx_free()
297 if (sc->sc_rx_zone != NULL) in dtsec_rm_pool_rx_free()
298 uma_zdestroy(sc->sc_rx_zone); in dtsec_rm_pool_rx_free()
308 snprintf(sc->sc_rx_zname, sizeof(sc->sc_rx_zname), "%s: RX Buffers", in dtsec_rm_pool_rx_init()
309 device_get_nameunit(sc->sc_dev)); in dtsec_rm_pool_rx_init()
311 sc->sc_rx_zone = uma_zcreate(sc->sc_rx_zname, FM_PORT_BUFFER_SIZE, NULL, in dtsec_rm_pool_rx_init()
312 NULL, NULL, NULL, FM_PORT_BUFFER_SIZE - 1, 0); in dtsec_rm_pool_rx_init()
314 sc->sc_rx_pool = bman_pool_create(&sc->sc_rx_bpid, FM_PORT_BUFFER_SIZE, in dtsec_rm_pool_rx_init()
319 if (sc->sc_rx_pool == NULL) { in dtsec_rm_pool_rx_init()
320 device_printf(sc->sc_dev, "NULL rx pool somehow\n"); in dtsec_rm_pool_rx_init()
331 * @group dTSEC Frame Queue Range routines.
338 void *buffer; in dtsec_rm_fqr_mext_free() local
340 buffer = m->m_ext.ext_arg1; in dtsec_rm_fqr_mext_free()
341 sc = m->m_ext.ext_arg2; in dtsec_rm_fqr_mext_free()
342 if (bman_count(sc->sc_rx_pool) <= DTSEC_RM_POOL_RX_MAX_SIZE) in dtsec_rm_fqr_mext_free()
343 bman_put_buffer(sc->sc_rx_pool, buffer); in dtsec_rm_fqr_mext_free()
345 dtsec_rm_pool_rx_put_buffer(sc, buffer, NULL); in dtsec_rm_fqr_mext_free()
350 uint32_t fqid_off, t_DpaaFD *frame) in dtsec_rm_fqr_rx_callback() argument
359 frame_va = DPAA_FD_GET_ADDR(frame); in dtsec_rm_fqr_rx_callback()
360 KASSERT(DPAA_FD_GET_FORMAT(frame) == e_DPAA_FD_FORMAT_TYPE_SHORT_SBSF, in dtsec_rm_fqr_rx_callback()
361 ("%s(): Got unsupported frame format 0x%02X!", __func__, in dtsec_rm_fqr_rx_callback()
362 DPAA_FD_GET_FORMAT(frame))); in dtsec_rm_fqr_rx_callback()
364 KASSERT(DPAA_FD_GET_OFFSET(frame) == 0, in dtsec_rm_fqr_rx_callback()
367 if (DPAA_FD_GET_STATUS(frame) != 0) { in dtsec_rm_fqr_rx_callback()
368 device_printf(sc->sc_dev, "RX error: 0x%08X\n", in dtsec_rm_fqr_rx_callback()
369 DPAA_FD_GET_STATUS(frame)); in dtsec_rm_fqr_rx_callback()
381 m->m_pkthdr.rcvif = sc->sc_ifnet; in dtsec_rm_fqr_rx_callback()
382 m->m_len = DPAA_FD_GET_LENGTH(frame); in dtsec_rm_fqr_rx_callback()
385 if_input(sc->sc_ifnet, m); in dtsec_rm_fqr_rx_callback()
390 bman_put_buffer(sc->sc_rx_pool, frame_va); in dtsec_rm_fqr_rx_callback()
399 uint32_t fqid_off, t_DpaaFD *frame) in dtsec_rm_fqr_tx_confirm_callback() argument
408 if (DPAA_FD_GET_STATUS(frame) != 0) in dtsec_rm_fqr_tx_confirm_callback()
409 device_printf(sc->sc_dev, "TX error: 0x%08X\n", in dtsec_rm_fqr_tx_confirm_callback()
410 DPAA_FD_GET_STATUS(frame)); in dtsec_rm_fqr_tx_confirm_callback()
414 * of scatter-gather table. in dtsec_rm_fqr_tx_confirm_callback()
416 sgt0 = DPAA_FD_GET_ADDR(frame); in dtsec_rm_fqr_tx_confirm_callback()
419 /* Free transmitted frame */ in dtsec_rm_fqr_tx_confirm_callback()
420 m_freem(fi->fi_mbuf); in dtsec_rm_fqr_tx_confirm_callback()
423 qlen = qman_fqr_get_counter(sc->sc_tx_conf_fqr, 0, in dtsec_rm_fqr_tx_confirm_callback()
429 if (sc->sc_tx_fqr_full) { in dtsec_rm_fqr_tx_confirm_callback()
430 sc->sc_tx_fqr_full = 0; in dtsec_rm_fqr_tx_confirm_callback()
444 if (sc->sc_rx_fqr) in dtsec_rm_fqr_rx_free()
445 qman_fqr_free(sc->sc_rx_fqr); in dtsec_rm_fqr_rx_free()
454 /* Default Frame Queue */ in dtsec_rm_fqr_rx_init()
458 device_printf(sc->sc_dev, "could not create default RX queue" in dtsec_rm_fqr_rx_init()
463 sc->sc_rx_fqr = fqr; in dtsec_rm_fqr_rx_init()
464 sc->sc_rx_fqid = qman_fqr_get_base_fqid(fqr); in dtsec_rm_fqr_rx_init()
468 device_printf(sc->sc_dev, "could not register RX callback\n"); in dtsec_rm_fqr_rx_init()
480 if (sc->sc_tx_fqr) in dtsec_rm_fqr_tx_free()
481 qman_fqr_free(sc->sc_tx_fqr); in dtsec_rm_fqr_tx_free()
483 if (sc->sc_tx_conf_fqr) in dtsec_rm_fqr_tx_free()
484 qman_fqr_free(sc->sc_tx_conf_fqr); in dtsec_rm_fqr_tx_free()
493 /* TX Frame Queue */ in dtsec_rm_fqr_tx_init()
494 fqr = qman_fqr_create(1, sc->sc_port_tx_qman_chan, in dtsec_rm_fqr_tx_init()
497 device_printf(sc->sc_dev, "could not create default TX queue" in dtsec_rm_fqr_tx_init()
502 sc->sc_tx_fqr = fqr; in dtsec_rm_fqr_tx_init()
504 /* TX Confirmation Frame Queue */ in dtsec_rm_fqr_tx_init()
509 device_printf(sc->sc_dev, "could not create TX confirmation " in dtsec_rm_fqr_tx_init()
515 sc->sc_tx_conf_fqr = fqr; in dtsec_rm_fqr_tx_init()
516 sc->sc_tx_conf_fqid = qman_fqr_get_base_fqid(fqr); in dtsec_rm_fqr_tx_init()
520 device_printf(sc->sc_dev, "could not register TX confirmation " in dtsec_rm_fqr_tx_init()
548 if ((sc->sc_mii->mii_media_status & IFM_ACTIVE) == 0) in dtsec_rm_if_start_locked()
551 if ((if_getdrvflags(sc->sc_ifnet) & IFF_DRV_RUNNING) != IFF_DRV_RUNNING) in dtsec_rm_if_start_locked()
554 while (!if_sendq_empty(sc->sc_ifnet)) { in dtsec_rm_if_start_locked()
556 qlen = qman_fqr_get_counter(sc->sc_tx_fqr, 0, in dtsec_rm_if_start_locked()
560 sc->sc_tx_fqr_full = 1; in dtsec_rm_if_start_locked()
568 m0 = if_dequeue(sc->sc_ifnet); in dtsec_rm_if_start_locked()
578 fi->fi_mbuf = m0; in dtsec_rm_if_start_locked()
580 if (m->m_len == 0) in dtsec_rm_if_start_locked()
584 * First entry in scatter-gather table is used to keep in dtsec_rm_if_start_locked()
585 * pointer to frame info structure. in dtsec_rm_if_start_locked()
587 DPAA_SGTE_SET_ADDR(&fi->fi_sgt[i], (void *)fi); in dtsec_rm_if_start_locked()
588 DPAA_SGTE_SET_LENGTH(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
590 DPAA_SGTE_SET_EXTENSION(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
591 DPAA_SGTE_SET_FINAL(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
592 DPAA_SGTE_SET_BPID(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
593 DPAA_SGTE_SET_OFFSET(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
596 dsize = m->m_len; in dtsec_rm_if_start_locked()
597 vaddr = (vm_offset_t)m->m_data; in dtsec_rm_if_start_locked()
599 ssize = PAGE_SIZE - (vaddr & PAGE_MASK); in dtsec_rm_if_start_locked()
600 if (m->m_len < ssize) in dtsec_rm_if_start_locked()
601 ssize = m->m_len; in dtsec_rm_if_start_locked()
603 DPAA_SGTE_SET_ADDR(&fi->fi_sgt[i], in dtsec_rm_if_start_locked()
605 DPAA_SGTE_SET_LENGTH(&fi->fi_sgt[i], ssize); in dtsec_rm_if_start_locked()
607 DPAA_SGTE_SET_EXTENSION(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
608 DPAA_SGTE_SET_FINAL(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
609 DPAA_SGTE_SET_BPID(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
610 DPAA_SGTE_SET_OFFSET(&fi->fi_sgt[i], 0); in dtsec_rm_if_start_locked()
612 dsize -= ssize; in dtsec_rm_if_start_locked()
621 m = m->m_next; in dtsec_rm_if_start_locked()
631 DPAA_SGTE_SET_FINAL(&fi->fi_sgt[i-1], 1); in dtsec_rm_if_start_locked()
633 DPAA_FD_SET_ADDR(&fd, fi->fi_sgt); in dtsec_rm_if_start_locked()
644 if (qman_fqr_enqueue(sc->sc_tx_fqr, 0, &fd) != E_OK) { in dtsec_rm_if_start_locked()