Changeset View
Changeset View
Standalone View
Standalone View
sys/net/iflib.c
Show First 20 Lines • Show All 1,383 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
_iflib_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int err) | _iflib_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int err) | ||||
{ | { | ||||
if (err) | if (err) | ||||
return; | return; | ||||
*(bus_addr_t *) arg = segs[0].ds_addr; | *(bus_addr_t *) arg = segs[0].ds_addr; | ||||
} | } | ||||
#define DMA_WIDTH_TO_BUS_LOWADDR(width) \ | |||||
(((width) == 0) || (width) == flsl(BUS_SPACE_MAXADDR) ? \ | |||||
BUS_SPACE_MAXADDR : (1ULL << (width)) - 1ULL) | |||||
int | int | ||||
iflib_dma_alloc_align(if_ctx_t ctx, int size, int align, iflib_dma_info_t dma, int mapflags) | iflib_dma_alloc_align(if_ctx_t ctx, int size, int align, iflib_dma_info_t dma, int mapflags) | ||||
{ | { | ||||
int err; | int err; | ||||
device_t dev = ctx->ifc_dev; | device_t dev = ctx->ifc_dev; | ||||
bus_addr_t lowaddr; | |||||
lowaddr = DMA_WIDTH_TO_BUS_LOWADDR(ctx->ifc_softc_ctx.isc_dma_width); | |||||
err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ | err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ | ||||
align, 0, /* alignment, bounds */ | align, 0, /* alignment, bounds */ | ||||
BUS_SPACE_MAXADDR, /* lowaddr */ | lowaddr, /* lowaddr */ | ||||
BUS_SPACE_MAXADDR, /* highaddr */ | BUS_SPACE_MAXADDR, /* highaddr */ | ||||
NULL, NULL, /* filter, filterarg */ | NULL, NULL, /* filter, filterarg */ | ||||
size, /* maxsize */ | size, /* maxsize */ | ||||
1, /* nsegments */ | 1, /* nsegments */ | ||||
size, /* maxsegsize */ | size, /* maxsegsize */ | ||||
BUS_DMA_ALLOCNOW, /* flags */ | BUS_DMA_ALLOCNOW, /* flags */ | ||||
NULL, /* lockfunc */ | NULL, /* lockfunc */ | ||||
NULL, /* lockarg */ | NULL, /* lockarg */ | ||||
▲ Show 20 Lines • Show All 234 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
iflib_txsd_alloc(iflib_txq_t txq) | iflib_txsd_alloc(iflib_txq_t txq) | ||||
{ | { | ||||
if_ctx_t ctx = txq->ift_ctx; | if_ctx_t ctx = txq->ift_ctx; | ||||
if_shared_ctx_t sctx = ctx->ifc_sctx; | if_shared_ctx_t sctx = ctx->ifc_sctx; | ||||
if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; | if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; | ||||
device_t dev = ctx->ifc_dev; | device_t dev = ctx->ifc_dev; | ||||
bus_size_t tsomaxsize; | bus_size_t tsomaxsize; | ||||
bus_addr_t lowaddr; | |||||
int err, nsegments, ntsosegments; | int err, nsegments, ntsosegments; | ||||
bool tso; | bool tso; | ||||
nsegments = scctx->isc_tx_nsegments; | nsegments = scctx->isc_tx_nsegments; | ||||
ntsosegments = scctx->isc_tx_tso_segments_max; | ntsosegments = scctx->isc_tx_tso_segments_max; | ||||
tsomaxsize = scctx->isc_tx_tso_size_max; | tsomaxsize = scctx->isc_tx_tso_size_max; | ||||
if (if_getcapabilities(ctx->ifc_ifp) & IFCAP_VLAN_MTU) | if (if_getcapabilities(ctx->ifc_ifp) & IFCAP_VLAN_MTU) | ||||
tsomaxsize += sizeof(struct ether_vlan_header); | tsomaxsize += sizeof(struct ether_vlan_header); | ||||
MPASS(scctx->isc_ntxd[0] > 0); | MPASS(scctx->isc_ntxd[0] > 0); | ||||
MPASS(scctx->isc_ntxd[txq->ift_br_offset] > 0); | MPASS(scctx->isc_ntxd[txq->ift_br_offset] > 0); | ||||
MPASS(nsegments > 0); | MPASS(nsegments > 0); | ||||
if (if_getcapabilities(ctx->ifc_ifp) & IFCAP_TSO) { | if (if_getcapabilities(ctx->ifc_ifp) & IFCAP_TSO) { | ||||
MPASS(ntsosegments > 0); | MPASS(ntsosegments > 0); | ||||
MPASS(sctx->isc_tso_maxsize >= tsomaxsize); | MPASS(sctx->isc_tso_maxsize >= tsomaxsize); | ||||
} | } | ||||
lowaddr = DMA_WIDTH_TO_BUS_LOWADDR(scctx->isc_dma_width); | |||||
/* | /* | ||||
* Set up DMA tags for TX buffers. | * Set up DMA tags for TX buffers. | ||||
*/ | */ | ||||
if ((err = bus_dma_tag_create(bus_get_dma_tag(dev), | if ((err = bus_dma_tag_create(bus_get_dma_tag(dev), | ||||
1, 0, /* alignment, bounds */ | 1, 0, /* alignment, bounds */ | ||||
BUS_SPACE_MAXADDR, /* lowaddr */ | lowaddr, /* lowaddr */ | ||||
BUS_SPACE_MAXADDR, /* highaddr */ | BUS_SPACE_MAXADDR, /* highaddr */ | ||||
NULL, NULL, /* filter, filterarg */ | NULL, NULL, /* filter, filterarg */ | ||||
sctx->isc_tx_maxsize, /* maxsize */ | sctx->isc_tx_maxsize, /* maxsize */ | ||||
nsegments, /* nsegments */ | nsegments, /* nsegments */ | ||||
sctx->isc_tx_maxsegsize, /* maxsegsize */ | sctx->isc_tx_maxsegsize, /* maxsegsize */ | ||||
0, /* flags */ | 0, /* flags */ | ||||
NULL, /* lockfunc */ | NULL, /* lockfunc */ | ||||
NULL, /* lockfuncarg */ | NULL, /* lockfuncarg */ | ||||
&txq->ift_buf_tag))) { | &txq->ift_buf_tag))) { | ||||
device_printf(dev,"Unable to allocate TX DMA tag: %d\n", err); | device_printf(dev,"Unable to allocate TX DMA tag: %d\n", err); | ||||
device_printf(dev,"maxsize: %ju nsegments: %d maxsegsize: %ju\n", | device_printf(dev,"maxsize: %ju nsegments: %d maxsegsize: %ju\n", | ||||
(uintmax_t)sctx->isc_tx_maxsize, nsegments, (uintmax_t)sctx->isc_tx_maxsegsize); | (uintmax_t)sctx->isc_tx_maxsize, nsegments, (uintmax_t)sctx->isc_tx_maxsegsize); | ||||
goto fail; | goto fail; | ||||
} | } | ||||
tso = (if_getcapabilities(ctx->ifc_ifp) & IFCAP_TSO) != 0; | tso = (if_getcapabilities(ctx->ifc_ifp) & IFCAP_TSO) != 0; | ||||
if (tso && (err = bus_dma_tag_create(bus_get_dma_tag(dev), | if (tso && (err = bus_dma_tag_create(bus_get_dma_tag(dev), | ||||
1, 0, /* alignment, bounds */ | 1, 0, /* alignment, bounds */ | ||||
BUS_SPACE_MAXADDR, /* lowaddr */ | lowaddr, /* lowaddr */ | ||||
BUS_SPACE_MAXADDR, /* highaddr */ | BUS_SPACE_MAXADDR, /* highaddr */ | ||||
NULL, NULL, /* filter, filterarg */ | NULL, NULL, /* filter, filterarg */ | ||||
tsomaxsize, /* maxsize */ | tsomaxsize, /* maxsize */ | ||||
ntsosegments, /* nsegments */ | ntsosegments, /* nsegments */ | ||||
sctx->isc_tso_maxsegsize,/* maxsegsize */ | sctx->isc_tso_maxsegsize,/* maxsegsize */ | ||||
0, /* flags */ | 0, /* flags */ | ||||
NULL, /* lockfunc */ | NULL, /* lockfunc */ | ||||
NULL, /* lockfuncarg */ | NULL, /* lockfuncarg */ | ||||
▲ Show 20 Lines • Show All 185 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
iflib_rxsd_alloc(iflib_rxq_t rxq) | iflib_rxsd_alloc(iflib_rxq_t rxq) | ||||
{ | { | ||||
if_ctx_t ctx = rxq->ifr_ctx; | if_ctx_t ctx = rxq->ifr_ctx; | ||||
if_shared_ctx_t sctx = ctx->ifc_sctx; | if_shared_ctx_t sctx = ctx->ifc_sctx; | ||||
if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; | if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; | ||||
device_t dev = ctx->ifc_dev; | device_t dev = ctx->ifc_dev; | ||||
iflib_fl_t fl; | iflib_fl_t fl; | ||||
bus_addr_t lowaddr; | |||||
int err; | int err; | ||||
MPASS(scctx->isc_nrxd[0] > 0); | MPASS(scctx->isc_nrxd[0] > 0); | ||||
MPASS(scctx->isc_nrxd[rxq->ifr_fl_offset] > 0); | MPASS(scctx->isc_nrxd[rxq->ifr_fl_offset] > 0); | ||||
lowaddr = DMA_WIDTH_TO_BUS_LOWADDR(scctx->isc_dma_width); | |||||
fl = rxq->ifr_fl; | fl = rxq->ifr_fl; | ||||
for (int i = 0; i < rxq->ifr_nfl; i++, fl++) { | for (int i = 0; i < rxq->ifr_nfl; i++, fl++) { | ||||
fl->ifl_size = scctx->isc_nrxd[rxq->ifr_fl_offset]; /* this isn't necessarily the same */ | fl->ifl_size = scctx->isc_nrxd[rxq->ifr_fl_offset]; /* this isn't necessarily the same */ | ||||
/* Set up DMA tag for RX buffers. */ | /* Set up DMA tag for RX buffers. */ | ||||
err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ | err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ | ||||
1, 0, /* alignment, bounds */ | 1, 0, /* alignment, bounds */ | ||||
BUS_SPACE_MAXADDR, /* lowaddr */ | lowaddr, /* lowaddr */ | ||||
BUS_SPACE_MAXADDR, /* highaddr */ | BUS_SPACE_MAXADDR, /* highaddr */ | ||||
NULL, NULL, /* filter, filterarg */ | NULL, NULL, /* filter, filterarg */ | ||||
sctx->isc_rx_maxsize, /* maxsize */ | sctx->isc_rx_maxsize, /* maxsize */ | ||||
sctx->isc_rx_nsegments, /* nsegments */ | sctx->isc_rx_nsegments, /* nsegments */ | ||||
sctx->isc_rx_maxsegsize, /* maxsegsize */ | sctx->isc_rx_maxsegsize, /* maxsegsize */ | ||||
0, /* flags */ | 0, /* flags */ | ||||
NULL, /* lockfunc */ | NULL, /* lockfunc */ | ||||
NULL, /* lockarg */ | NULL, /* lockarg */ | ||||
▲ Show 20 Lines • Show All 2,830 Lines • ▼ Show 20 Lines | iflib_device_register(device_t dev, void *sc, if_shared_ctx_t sctx, if_ctx_t *ctxp) | ||||
iflib_reset_qvalues(ctx); | iflib_reset_qvalues(ctx); | ||||
CTX_LOCK(ctx); | CTX_LOCK(ctx); | ||||
if ((err = IFDI_ATTACH_PRE(ctx)) != 0) { | if ((err = IFDI_ATTACH_PRE(ctx)) != 0) { | ||||
device_printf(dev, "IFDI_ATTACH_PRE failed %d\n", err); | device_printf(dev, "IFDI_ATTACH_PRE failed %d\n", err); | ||||
goto fail_unlock; | goto fail_unlock; | ||||
} | } | ||||
_iflib_pre_assert(scctx); | _iflib_pre_assert(scctx); | ||||
ctx->ifc_txrx = *scctx->isc_txrx; | ctx->ifc_txrx = *scctx->isc_txrx; | ||||
MPASS(scctx->isc_dma_width <= flsl(BUS_SPACE_MAXADDR)); | |||||
if (sctx->isc_flags & IFLIB_DRIVER_MEDIA) | if (sctx->isc_flags & IFLIB_DRIVER_MEDIA) | ||||
ctx->ifc_mediap = scctx->isc_media; | ctx->ifc_mediap = scctx->isc_media; | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
if (scctx->isc_capabilities & IFCAP_TXCSUM) | if (scctx->isc_capabilities & IFCAP_TXCSUM) | ||||
MPASS(scctx->isc_tx_csum_flags); | MPASS(scctx->isc_tx_csum_flags); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 2,234 Lines • Show Last 20 Lines |