Changeset View
Changeset View
Standalone View
Standalone View
sys/net/iflib.c
Show First 20 Lines • Show All 702 Lines • ▼ Show 20 Lines | |||||
static uint32_t iflib_txq_can_drain(struct ifmp_ring *); | static uint32_t iflib_txq_can_drain(struct ifmp_ring *); | ||||
#ifdef ALTQ | #ifdef ALTQ | ||||
static void iflib_altq_if_start(if_t ifp); | static void iflib_altq_if_start(if_t ifp); | ||||
static int iflib_altq_if_transmit(if_t ifp, struct mbuf *m); | static int iflib_altq_if_transmit(if_t ifp, struct mbuf *m); | ||||
#endif | #endif | ||||
static int iflib_register(if_ctx_t); | static int iflib_register(if_ctx_t); | ||||
static void iflib_deregister(if_ctx_t); | static void iflib_deregister(if_ctx_t); | ||||
static void iflib_unregister_vlan_handlers(if_ctx_t ctx); | static void iflib_unregister_vlan_handlers(if_ctx_t ctx); | ||||
static uint16_t iflib_get_mbuf_size_for(unsigned int size); | |||||
static void iflib_init_locked(if_ctx_t ctx); | static void iflib_init_locked(if_ctx_t ctx); | ||||
static void iflib_add_device_sysctl_pre(if_ctx_t ctx); | static void iflib_add_device_sysctl_pre(if_ctx_t ctx); | ||||
static void iflib_add_device_sysctl_post(if_ctx_t ctx); | static void iflib_add_device_sysctl_post(if_ctx_t ctx); | ||||
static void iflib_ifmp_purge(iflib_txq_t txq); | static void iflib_ifmp_purge(iflib_txq_t txq); | ||||
static void _iflib_pre_assert(if_softc_ctx_t scctx); | static void _iflib_pre_assert(if_softc_ctx_t scctx); | ||||
static void iflib_if_init_locked(if_ctx_t ctx); | static void iflib_if_init_locked(if_ctx_t ctx); | ||||
static void iflib_free_intr_mem(if_ctx_t ctx); | static void iflib_free_intr_mem(if_ctx_t ctx); | ||||
#ifndef __NO_STRICT_ALIGNMENT | #ifndef __NO_STRICT_ALIGNMENT | ||||
▲ Show 20 Lines • Show All 1,437 Lines • ▼ Show 20 Lines | |||||
* Initialize a free list and its buffers. | * Initialize a free list and its buffers. | ||||
* | * | ||||
**********************************************************************/ | **********************************************************************/ | ||||
static int | static int | ||||
iflib_fl_setup(iflib_fl_t fl) | iflib_fl_setup(iflib_fl_t fl) | ||||
{ | { | ||||
iflib_rxq_t rxq = fl->ifl_rxq; | iflib_rxq_t rxq = fl->ifl_rxq; | ||||
if_ctx_t ctx = rxq->ifr_ctx; | if_ctx_t ctx = rxq->ifr_ctx; | ||||
if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; | |||||
int qidx; | |||||
bit_nclear(fl->ifl_rx_bitmap, 0, fl->ifl_size - 1); | bit_nclear(fl->ifl_rx_bitmap, 0, fl->ifl_size - 1); | ||||
/* | /* | ||||
** Free current RX buffer structs and their mbufs | ** Free current RX buffer structs and their mbufs | ||||
*/ | */ | ||||
iflib_fl_bufs_free(fl); | iflib_fl_bufs_free(fl); | ||||
/* Now replenish the mbufs */ | /* Now replenish the mbufs */ | ||||
MPASS(fl->ifl_credits == 0); | MPASS(fl->ifl_credits == 0); | ||||
qidx = rxq->ifr_fl_offset + fl->ifl_id; | |||||
if (scctx->isc_rxd_buf_size[qidx] != 0) | |||||
fl->ifl_buf_size = scctx->isc_rxd_buf_size[qidx]; | |||||
else | |||||
fl->ifl_buf_size = ctx->ifc_rx_mbuf_sz; | fl->ifl_buf_size = ctx->ifc_rx_mbuf_sz; | ||||
/* | |||||
* ifl_buf_size may be a driver-supplied value, so pull it up | |||||
* to the selected mbuf size. | |||||
*/ | |||||
fl->ifl_buf_size = iflib_get_mbuf_size_for(fl->ifl_buf_size); | |||||
if (fl->ifl_buf_size > ctx->ifc_max_fl_buf_size) | if (fl->ifl_buf_size > ctx->ifc_max_fl_buf_size) | ||||
ctx->ifc_max_fl_buf_size = fl->ifl_buf_size; | ctx->ifc_max_fl_buf_size = fl->ifl_buf_size; | ||||
fl->ifl_cltype = m_gettype(fl->ifl_buf_size); | fl->ifl_cltype = m_gettype(fl->ifl_buf_size); | ||||
fl->ifl_zone = m_getzone(fl->ifl_buf_size); | fl->ifl_zone = m_getzone(fl->ifl_buf_size); | ||||
/* avoid pre-allocating zillions of clusters to an idle card | /* avoid pre-allocating zillions of clusters to an idle card | ||||
* potentially speeding up attach | * potentially speeding up attach | ||||
▲ Show 20 Lines • Show All 115 Lines • ▼ Show 20 Lines | device_printf(ctx->ifc_dev, | ||||
txq->ift_id, TXQ_AVAIL(txq), txq->ift_pidx); | txq->ift_id, TXQ_AVAIL(txq), txq->ift_pidx); | ||||
STATE_LOCK(ctx); | STATE_LOCK(ctx); | ||||
if_setdrvflagbits(ctx->ifc_ifp, IFF_DRV_OACTIVE, IFF_DRV_RUNNING); | if_setdrvflagbits(ctx->ifc_ifp, IFF_DRV_OACTIVE, IFF_DRV_RUNNING); | ||||
ctx->ifc_flags |= (IFC_DO_WATCHDOG|IFC_DO_RESET); | ctx->ifc_flags |= (IFC_DO_WATCHDOG|IFC_DO_RESET); | ||||
iflib_admin_intr_deferred(ctx); | iflib_admin_intr_deferred(ctx); | ||||
STATE_UNLOCK(ctx); | STATE_UNLOCK(ctx); | ||||
} | } | ||||
static uint16_t | |||||
iflib_get_mbuf_size_for(unsigned int size) | |||||
{ | |||||
if (size <= MCLBYTES) | |||||
return (MCLBYTES); | |||||
else | |||||
return (MJUMPAGESIZE); | |||||
} | |||||
static void | static void | ||||
iflib_calc_rx_mbuf_sz(if_ctx_t ctx) | iflib_calc_rx_mbuf_sz(if_ctx_t ctx) | ||||
{ | { | ||||
if_softc_ctx_t sctx = &ctx->ifc_softc_ctx; | if_softc_ctx_t sctx = &ctx->ifc_softc_ctx; | ||||
/* | /* | ||||
* XXX don't set the max_frame_size to larger | * XXX don't set the max_frame_size to larger | ||||
* than the hardware can handle | * than the hardware can handle | ||||
*/ | */ | ||||
if (sctx->isc_max_frame_size <= MCLBYTES) | ctx->ifc_rx_mbuf_sz = | ||||
ctx->ifc_rx_mbuf_sz = MCLBYTES; | iflib_get_mbuf_size_for(sctx->isc_max_frame_size); | ||||
else | |||||
ctx->ifc_rx_mbuf_sz = MJUMPAGESIZE; | |||||
} | } | ||||
uint32_t | uint32_t | ||||
iflib_get_rx_mbuf_sz(if_ctx_t ctx) | iflib_get_rx_mbuf_sz(if_ctx_t ctx) | ||||
{ | { | ||||
return (ctx->ifc_rx_mbuf_sz); | return (ctx->ifc_rx_mbuf_sz); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 4,390 Lines • ▼ Show 20 Lines | for (j = 0, fl = rxq->ifr_fl; j < rxq->ifr_nfl; j++, fl++) { | ||||
CTLFLAG_RD, | CTLFLAG_RD, | ||||
&fl->ifl_pidx, 1, "Producer Index"); | &fl->ifl_pidx, 1, "Producer Index"); | ||||
SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, "cidx", | SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, "cidx", | ||||
CTLFLAG_RD, | CTLFLAG_RD, | ||||
&fl->ifl_cidx, 1, "Consumer Index"); | &fl->ifl_cidx, 1, "Consumer Index"); | ||||
SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, "credits", | SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, "credits", | ||||
CTLFLAG_RD, | CTLFLAG_RD, | ||||
&fl->ifl_credits, 1, "credits available"); | &fl->ifl_credits, 1, "credits available"); | ||||
SYSCTL_ADD_U16(ctx_list, fl_list, OID_AUTO, "buf_size", | |||||
CTLFLAG_RD, | |||||
&fl->ifl_buf_size, 1, "buffer size"); | |||||
#if MEMORY_LOGGING | #if MEMORY_LOGGING | ||||
SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, "fl_m_enqueued", | SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, "fl_m_enqueued", | ||||
CTLFLAG_RD, | CTLFLAG_RD, | ||||
&fl->ifl_m_enqueued, "mbufs allocated"); | &fl->ifl_m_enqueued, "mbufs allocated"); | ||||
SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, "fl_m_dequeued", | SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, "fl_m_dequeued", | ||||
CTLFLAG_RD, | CTLFLAG_RD, | ||||
&fl->ifl_m_dequeued, "mbufs freed"); | &fl->ifl_m_dequeued, "mbufs freed"); | ||||
SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, "fl_cl_enqueued", | SYSCTL_ADD_QUAD(ctx_list, fl_list, OID_AUTO, "fl_cl_enqueued", | ||||
▲ Show 20 Lines • Show All 135 Lines • Show Last 20 Lines |