int ef_vi_free(ef_vi* ep, ef_driver_handle fd) { int rc; if( ep->vi_io_mmap_ptr != NULL ) { rc = ci_resource_munmap(fd, ep->vi_io_mmap_ptr, ep->vi_io_mmap_bytes); if( rc < 0 ) { LOGV(ef_log("%s: ci_resource_munmap %d", __FUNCTION__, rc)); return rc; } } if( ep->vi_mem_mmap_ptr != NULL ) { /* TODO: support variable sized DMAQ and evq */ rc = ci_resource_munmap(fd, ep->vi_mem_mmap_ptr, ep->vi_mem_mmap_bytes); if( rc < 0 ) { LOGVV(ef_log("%s: ci_resource_munmap iobuffer %d", __FUNCTION__, rc)); return rc; } } free(ep->ep_state); EF_VI_DEBUG(memset(ep, 0, sizeof(*ep))); LOGVVV(ef_log("%s: DONE", __FUNCTION__)); return 0; }
static void ef10_tx_event_ts_enabled(ef_vi* evq, const ef_vi_event* ev, ef_event** evs, int* evs_len) { EF_VI_ASSERT(evq->vi_flags & EF_VI_TX_TIMESTAMPS); /* When TX timestamping is enabled, we get three events for * every transmit. A TX completion and two timestamp events. * We ignore the completion and store the first timestamp in * the per TXQ state. On the second timestamp we retrieve the * first one and construct a EF_EVENT_TYPE_TX_WITH_TIMESTAMP * event to send to the user. */ if(QWORD_GET_U(ESF_DZ_TX_SOFT1, *ev) == TX_TIMESTAMP_EVENT_TX_EV_COMPLETION) { /* TX completion event. Ignored */ } else if(QWORD_GET_U(ESF_DZ_TX_SOFT1, *ev) == TX_TIMESTAMP_EVENT_TX_EV_TSTAMP_LO) { ef_vi_txq_state* qs = &evq->ep_state->txq; EF_VI_DEBUG( EF_VI_BUG_ON(qs->ts_nsec != EF_VI_TX_TIMESTAMP_TS_NSEC_INVALID) ); qs->ts_nsec = (((((uint64_t)timestamp_extract(*ev)) * 1000000000UL) >> 29) << 2) | evq->ep_state->evq.sync_flags; }
int ef_pd_free(ef_pd* pd, ef_driver_handle pd_dh) { free(pd->pd_intf_name); if( pd->pd_cluster_sock != -1 ) { return ef_pd_cluster_free(pd, pd_dh); } else { EF_VI_DEBUG(memset(pd, 0, sizeof(*pd))); return 0; } }