Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/cxgb/cxgb_sge.c
Show First 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | |||||
#include <dev/pci/pcivar.h> | #include <dev/pci/pcivar.h> | ||||
#include <vm/vm.h> | #include <vm/vm.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
#include <cxgb_include.h> | #include <cxgb_include.h> | ||||
#include <sys/mvec.h> | #include <sys/mvec.h> | ||||
/* | |||||
gnn: Is there a reason these are not extern in a header file? | |||||
* Internal mbuf(9) knowledge. | |||||
*/ | |||||
uma_zone_t m_getzone(int); | |||||
void m_cljset(struct mbuf *m, void *cl, int type); | |||||
int txq_fills = 0; | int txq_fills = 0; | ||||
int multiq_tx_enable = 1; | int multiq_tx_enable = 1; | ||||
#ifdef TCP_OFFLOAD | #ifdef TCP_OFFLOAD | ||||
CTASSERT(NUM_CPL_HANDLERS >= NUM_CPL_CMDS); | CTASSERT(NUM_CPL_HANDLERS >= NUM_CPL_CMDS); | ||||
#endif | #endif | ||||
extern struct sysctl_oid_list sysctl__hw_cxgb_children; | extern struct sysctl_oid_list sysctl__hw_cxgb_children; | ||||
▲ Show 20 Lines • Show All 620 Lines • ▼ Show 20 Lines | refill_fl(adapter_t *sc, struct sge_fl *q, int n) | ||||
int err; | int err; | ||||
cb_arg.error = 0; | cb_arg.error = 0; | ||||
while (n--) { | while (n--) { | ||||
/* | /* | ||||
* We allocate an uninitialized mbuf + cluster, mbuf is | * We allocate an uninitialized mbuf + cluster, mbuf is | ||||
* initialized after rx. | * initialized after rx. | ||||
*/ | */ | ||||
if (q->zone == zone_pack) { | if (q->type == EXT_CLUSTER) { | ||||
if ((m = m_getcl(M_NOWAIT, MT_NOINIT, M_PKTHDR)) == NULL) | if ((m = m_getcl(M_NOWAIT, MT_NOINIT, M_PKTHDR)) == NULL) | ||||
break; | break; | ||||
cl = m->m_ext.ext_buf; | cl = m->m_ext.ext_buf; | ||||
} else { | } else { | ||||
if ((cl = m_cljget(NULL, M_NOWAIT, q->buf_size)) == NULL) | if ((cl = m_cljget(NULL, M_NOWAIT, q->buf_size)) == NULL) | ||||
break; | break; | ||||
if ((m = m_gethdr(M_NOWAIT, MT_NOINIT)) == NULL) { | if ((m = m_gethdr(M_NOWAIT, MT_NOINIT)) == NULL) { | ||||
uma_zfree(q->zone, cl); | uma_zfree(q->zone, cl); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
if ((sd->flags & RX_SW_DESC_MAP_CREATED) == 0) { | if ((sd->flags & RX_SW_DESC_MAP_CREATED) == 0) { | ||||
if ((err = bus_dmamap_create(q->entry_tag, 0, &sd->map))) { | if ((err = bus_dmamap_create(q->entry_tag, 0, &sd->map))) { | ||||
log(LOG_WARNING, "bus_dmamap_create failed %d\n", err); | log(LOG_WARNING, "bus_dmamap_create failed %d\n", err); | ||||
uma_zfree(q->zone, cl); | uma_zfree(q->zone, cl); | ||||
goto done; | goto done; | ||||
} | } | ||||
sd->flags |= RX_SW_DESC_MAP_CREATED; | sd->flags |= RX_SW_DESC_MAP_CREATED; | ||||
} | } | ||||
#if !defined(__i386__) && !defined(__amd64__) | #if !defined(__i386__) && !defined(__amd64__) | ||||
err = bus_dmamap_load(q->entry_tag, sd->map, | err = bus_dmamap_load(q->entry_tag, sd->map, | ||||
cl, q->buf_size, refill_fl_cb, &cb_arg, 0); | cl, q->buf_size, refill_fl_cb, &cb_arg, 0); | ||||
if (err != 0 || cb_arg.error) { | if (err != 0 || cb_arg.error) { | ||||
if (q->zone != zone_pack) | if (q->type != EXT_CLUSTER) | ||||
uma_zfree(q->zone, cl); | uma_zfree(q->zone, cl); | ||||
m_free(m); | m_free(m); | ||||
goto done; | goto done; | ||||
} | } | ||||
#else | #else | ||||
cb_arg.seg.ds_addr = pmap_kextract((vm_offset_t)cl); | cb_arg.seg.ds_addr = pmap_kextract((vm_offset_t)cl); | ||||
#endif | #endif | ||||
sd->flags |= RX_SW_DESC_INUSE; | sd->flags |= RX_SW_DESC_INUSE; | ||||
Show All 39 Lines | free_rx_bufs(adapter_t *sc, struct sge_fl *q) | ||||
u_int cidx = q->cidx; | u_int cidx = q->cidx; | ||||
while (q->credits--) { | while (q->credits--) { | ||||
struct rx_sw_desc *d = &q->sdesc[cidx]; | struct rx_sw_desc *d = &q->sdesc[cidx]; | ||||
if (d->flags & RX_SW_DESC_INUSE) { | if (d->flags & RX_SW_DESC_INUSE) { | ||||
bus_dmamap_unload(q->entry_tag, d->map); | bus_dmamap_unload(q->entry_tag, d->map); | ||||
bus_dmamap_destroy(q->entry_tag, d->map); | bus_dmamap_destroy(q->entry_tag, d->map); | ||||
if (q->zone == zone_pack) { | if (q->type == EXT_CLUSTER) { | ||||
m_init(d->m, zone_pack, MCLBYTES, | m_init(d->m, M_NOWAIT, MT_DATA, M_EXT); | ||||
M_NOWAIT, MT_DATA, M_EXT); | uma_zfree(q->zone, d->m); | ||||
uma_zfree(zone_pack, d->m); | |||||
} else { | } else { | ||||
m_init(d->m, zone_mbuf, MLEN, | m_init(d->m, M_NOWAIT, MT_DATA, 0); | ||||
M_NOWAIT, MT_DATA, 0); | m_free(d->m); | ||||
uma_zfree(zone_mbuf, d->m); | |||||
uma_zfree(q->zone, d->rxsd_cl); | uma_zfree(q->zone, d->rxsd_cl); | ||||
} | } | ||||
} | } | ||||
d->rxsd_cl = NULL; | d->rxsd_cl = NULL; | ||||
d->m = NULL; | d->m = NULL; | ||||
if (++cidx == q->size) | if (++cidx == q->size) | ||||
cidx = 0; | cidx = 0; | ||||
▲ Show 20 Lines • Show All 1,692 Lines • ▼ Show 20 Lines | #endif | ||||
q->rspq.gen = 1; | q->rspq.gen = 1; | ||||
q->rspq.cidx = 0; | q->rspq.cidx = 0; | ||||
q->rspq.size = p->rspq_size; | q->rspq.size = p->rspq_size; | ||||
q->txq[TXQ_ETH].stop_thres = nports * | q->txq[TXQ_ETH].stop_thres = nports * | ||||
flits_to_desc(sgl_len(TX_MAX_SEGS + 1) + 3); | flits_to_desc(sgl_len(TX_MAX_SEGS + 1) + 3); | ||||
q->fl[0].buf_size = MCLBYTES; | q->fl[0].buf_size = MCLBYTES; | ||||
q->fl[0].zone = zone_pack; | q->fl[0].zone = m_getzone(q->fl[0].buf_size); | ||||
q->fl[0].type = EXT_PACKET; | q->fl[0].type = m_gettype(q->fl[0].buf_size); | ||||
if (p->jumbo_buf_size == MJUM16BYTES) { | |||||
q->fl[1].zone = zone_jumbo16; | |||||
q->fl[1].type = EXT_JUMBO16; | |||||
} else if (p->jumbo_buf_size == MJUM9BYTES) { | |||||
q->fl[1].zone = zone_jumbo9; | |||||
q->fl[1].type = EXT_JUMBO9; | |||||
} else if (p->jumbo_buf_size == MJUMPAGESIZE) { | |||||
q->fl[1].zone = zone_jumbop; | |||||
q->fl[1].type = EXT_JUMBOP; | |||||
} else { | |||||
KASSERT(0, ("can't deal with jumbo_buf_size %d.", p->jumbo_buf_size)); | |||||
ret = EDOOFUS; | |||||
goto err; | |||||
} | |||||
q->fl[1].buf_size = p->jumbo_buf_size; | q->fl[1].buf_size = p->jumbo_buf_size; | ||||
q->fl[1].zone = m_getzone(q->fl[1].buf_size); | |||||
q->fl[1].type = m_gettype(q->fl[1].buf_size); | |||||
/* Allocate and setup the lro_ctrl structure */ | /* Allocate and setup the lro_ctrl structure */ | ||||
q->lro.enabled = !!(pi->ifp->if_capenable & IFCAP_LRO); | q->lro.enabled = !!(pi->ifp->if_capenable & IFCAP_LRO); | ||||
#if defined(INET6) || defined(INET) | #if defined(INET6) || defined(INET) | ||||
ret = tcp_lro_init(&q->lro.ctrl); | ret = tcp_lro_init(&q->lro.ctrl); | ||||
if (ret) { | if (ret) { | ||||
printf("error %d from tcp_lro_init\n", ret); | printf("error %d from tcp_lro_init\n", ret); | ||||
goto err; | goto err; | ||||
▲ Show 20 Lines • Show All 181 Lines • ▼ Show 20 Lines | get_packet(adapter_t *adap, unsigned int drop_thres, struct sge_qset *qs, | ||||
skip_recycle: | skip_recycle: | ||||
bus_dmamap_unload(fl->entry_tag, sd->map); | bus_dmamap_unload(fl->entry_tag, sd->map); | ||||
cl = sd->rxsd_cl; | cl = sd->rxsd_cl; | ||||
m = sd->m; | m = sd->m; | ||||
if ((sopeop == RSPQ_SOP_EOP) || | if ((sopeop == RSPQ_SOP_EOP) || | ||||
(sopeop == RSPQ_SOP)) | (sopeop == RSPQ_SOP)) | ||||
flags |= M_PKTHDR; | flags |= M_PKTHDR; | ||||
m_init(m, fl->zone, fl->buf_size, M_NOWAIT, MT_DATA, flags); | m_init(m, M_NOWAIT, MT_DATA, flags); | ||||
if (fl->zone == zone_pack) { | if (fl->type == EXT_CLUSTER) { | ||||
/* | /* | ||||
* restore clobbered data pointer | * restore clobbered data pointer | ||||
*/ | */ | ||||
m->m_data = m->m_ext.ext_buf; | m->m_data = m->m_ext.ext_buf; | ||||
} else { | } else { | ||||
m_cljset(m, cl, fl->type); | m_cljset(m, cl, fl->type); | ||||
} | } | ||||
m->m_len = len; | m->m_len = len; | ||||
▲ Show 20 Lines • Show All 975 Lines • Show Last 20 Lines |
Is there a reason these are not extern in a header file?