t4_sge.c (219289) | t4_sge.c (219290) |
---|---|
1/*- 2 * Copyright (c) 2011 Chelsio Communications, Inc. 3 * All rights reserved. 4 * Written by: Navdeep Parhar <np@FreeBSD.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2011 Chelsio Communications, Inc. 3 * All rights reserved. 4 * Written by: Navdeep Parhar <np@FreeBSD.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> |
29__FBSDID("$FreeBSD: head/sys/dev/cxgbe/t4_sge.c 219289 2011-03-05 03:27:14Z np $"); | 29__FBSDID("$FreeBSD: head/sys/dev/cxgbe/t4_sge.c 219290 2011-03-05 03:42:03Z np $"); |
30 31#include "opt_inet.h" 32 33#include <sys/types.h> 34#include <sys/mbuf.h> 35#include <sys/socket.h> 36#include <sys/kernel.h> 37#include <sys/malloc.h> --- 78 unchanged lines hidden (view full) --- 116static inline bool is_new_response(const struct sge_iq *, struct rsp_ctrl **); 117static inline void iq_next(struct sge_iq *); 118static inline void ring_fl_db(struct adapter *, struct sge_fl *); 119static void refill_fl(struct sge_fl *, int); 120static int alloc_fl_sdesc(struct sge_fl *); 121static void free_fl_sdesc(struct sge_fl *); 122static int alloc_eq_maps(struct sge_eq *); 123static void free_eq_maps(struct sge_eq *); | 30 31#include "opt_inet.h" 32 33#include <sys/types.h> 34#include <sys/mbuf.h> 35#include <sys/socket.h> 36#include <sys/kernel.h> 37#include <sys/malloc.h> --- 78 unchanged lines hidden (view full) --- 116static inline bool is_new_response(const struct sge_iq *, struct rsp_ctrl **); 117static inline void iq_next(struct sge_iq *); 118static inline void ring_fl_db(struct adapter *, struct sge_fl *); 119static void refill_fl(struct sge_fl *, int); 120static int alloc_fl_sdesc(struct sge_fl *); 121static void free_fl_sdesc(struct sge_fl *); 122static int alloc_eq_maps(struct sge_eq *); 123static void free_eq_maps(struct sge_eq *); |
124static struct mbuf *get_fl_sdesc_data(struct sge_fl *, int, int); | |
125static void set_fl_tag_idx(struct sge_fl *, int); 126 127static int get_pkt_sgl(struct sge_txq *, struct mbuf **, struct sgl *, int); 128static int free_pkt_sgl(struct sge_txq *, struct sgl *); 129static int write_txpkt_wr(struct port_info *, struct sge_txq *, struct mbuf *, 130 struct sgl *); 131static int add_to_txpkts(struct port_info *, struct sge_txq *, struct txpkts *, 132 struct mbuf *, struct sgl *); --- 395 unchanged lines hidden (view full) --- 528 529void 530t4_intr_data(void *arg) 531{ 532 struct sge_rxq *rxq = arg; 533 struct sge_iq *iq = arg; 534 struct adapter *sc = iq->adapter; 535 struct rsp_ctrl *ctrl; | 124static void set_fl_tag_idx(struct sge_fl *, int); 125 126static int get_pkt_sgl(struct sge_txq *, struct mbuf **, struct sgl *, int); 127static int free_pkt_sgl(struct sge_txq *, struct sgl *); 128static int write_txpkt_wr(struct port_info *, struct sge_txq *, struct mbuf *, 129 struct sgl *); 130static int add_to_txpkts(struct port_info *, struct sge_txq *, struct txpkts *, 131 struct mbuf *, struct sgl *); --- 395 unchanged lines hidden (view full) --- 527 528void 529t4_intr_data(void *arg) 530{ 531 struct sge_rxq *rxq = arg; 532 struct sge_iq *iq = arg; 533 struct adapter *sc = iq->adapter; 534 struct rsp_ctrl *ctrl; |
536 struct sge_fl *fl = &rxq->fl; | |
537 struct ifnet *ifp = rxq->ifp; | 535 struct ifnet *ifp = rxq->ifp; |
536 struct sge_fl *fl = &rxq->fl; 537 struct fl_sdesc *sd = &fl->sdesc[fl->cidx], *sd_next; |
|
538 const struct rss_header *rss; 539 const struct cpl_rx_pkt *cpl; | 538 const struct rss_header *rss; 539 const struct cpl_rx_pkt *cpl; |
540 int ndescs = 0, rsp_type; | |
541 uint32_t len; | 540 uint32_t len; |
541 int ndescs = 0, i; |
|
542 struct mbuf *m0, *m; 543#ifdef INET 544 struct lro_ctrl *lro = &rxq->lro; 545 struct lro_entry *l; 546#endif 547 | 542 struct mbuf *m0, *m; 543#ifdef INET 544 struct lro_ctrl *lro = &rxq->lro; 545 struct lro_entry *l; 546#endif 547 |
548 prefetch(sd->m); 549 prefetch(sd->cl); 550 |
|
548 IQ_LOCK(iq); 549 iq->intr_next = iq->intr_params; 550 while (is_new_response(iq, &ctrl)) { 551 552 rmb(); 553 554 rss = (const void *)iq->cdesc; | 551 IQ_LOCK(iq); 552 iq->intr_next = iq->intr_params; 553 while (is_new_response(iq, &ctrl)) { 554 555 rmb(); 556 557 rss = (const void *)iq->cdesc; |
555 cpl = (const void *)(rss + 1); | 558 i = G_RSPD_TYPE(ctrl->u.type_gen); |
556 | 559 |
557 rsp_type = G_RSPD_TYPE(ctrl->u.type_gen); | 560 if (__predict_false(i == X_RSPD_TYPE_CPL)) { |
558 | 561 |
559 if (__predict_false(rsp_type == X_RSPD_TYPE_CPL)) { | |
560 /* Can't be anything except an egress update */ | 562 /* Can't be anything except an egress update */ |
561 handle_sge_egr_update(sc, (const void *)cpl); | 563 KASSERT(rss->opcode == CPL_SGE_EGR_UPDATE, 564 ("%s: unexpected CPL %x", __func__, rss->opcode)); 565 566 handle_sge_egr_update(sc, (const void *)(rss + 1)); |
562 goto nextdesc; 563 } | 567 goto nextdesc; 568 } |
569 KASSERT(i == X_RSPD_TYPE_FLBUF && rss->opcode == CPL_RX_PKT, 570 ("%s: unexpected CPL %x rsp %d", __func__, rss->opcode, i)); |
|
564 | 571 |
565 KASSERT(G_RSPD_TYPE(ctrl->u.type_gen) == X_RSPD_TYPE_FLBUF, 566 ("unexpected event on data ingress queue: %x", 567 G_RSPD_TYPE(ctrl->u.type_gen))); | 572 sd_next = sd + 1; 573 if (__predict_false(fl->cidx + 1 == fl->cap)) 574 sd_next = fl->sdesc; 575 prefetch(sd_next->m); 576 prefetch(sd_next->cl); |
568 | 577 |
569 len = be32toh(ctrl->pldbuflen_qid); | 578 cpl = (const void *)(rss + 1); |
570 | 579 |
571 KASSERT(len & F_RSPD_NEWBUF, 572 ("%s: T4 misconfigured to pack buffers.", __func__)); | 580 m0 = sd->m; 581 sd->m = NULL; /* consumed */ |
573 | 582 |
583 len = be32toh(ctrl->pldbuflen_qid); 584 if (__predict_false((len & F_RSPD_NEWBUF) == 0)) 585 panic("%s: cannot handle packed frames", __func__); |
|
574 len = G_RSPD_LEN(len); | 586 len = G_RSPD_LEN(len); |
575 m0 = get_fl_sdesc_data(fl, len, M_PKTHDR); 576 if (m0 == NULL) { 577 iq->intr_next = V_QINTR_TIMER_IDX(SGE_NTIMERS - 1); 578 break; | 587 588 bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, 589 BUS_DMASYNC_POSTREAD); 590 591 m_init(m0, zone_mbuf, MLEN, M_NOWAIT, MT_DATA, M_PKTHDR); 592 if (len < MINCLSIZE) { 593 /* copy data to mbuf, buffer will be recycled */ 594 bcopy(sd->cl, mtod(m0, caddr_t), len); 595 m0->m_len = len; 596 } else { 597 bus_dmamap_unload(fl->tag[sd->tag_idx], sd->map); 598 m_cljset(m0, sd->cl, FL_BUF_TYPE(sd->tag_idx)); 599 sd->cl = NULL; /* consumed */ 600 m0->m_len = min(len, FL_BUF_SIZE(sd->tag_idx)); |
579 } 580 581 len -= FL_PKTSHIFT; 582 m0->m_len -= FL_PKTSHIFT; 583 m0->m_data += FL_PKTSHIFT; 584 585 m0->m_pkthdr.len = len; 586 m0->m_pkthdr.rcvif = ifp; --- 12 unchanged lines hidden (view full) --- 599 } 600 601 if (cpl->vlan_ex) { 602 m0->m_pkthdr.ether_vtag = be16toh(cpl->vlan); 603 m0->m_flags |= M_VLANTAG; 604 rxq->vlan_extraction++; 605 } 606 | 601 } 602 603 len -= FL_PKTSHIFT; 604 m0->m_len -= FL_PKTSHIFT; 605 m0->m_data += FL_PKTSHIFT; 606 607 m0->m_pkthdr.len = len; 608 m0->m_pkthdr.rcvif = ifp; --- 12 unchanged lines hidden (view full) --- 621 } 622 623 if (cpl->vlan_ex) { 624 m0->m_pkthdr.ether_vtag = be16toh(cpl->vlan); 625 m0->m_flags |= M_VLANTAG; 626 rxq->vlan_extraction++; 627 } 628 |
629 i = 1; /* # of fl sdesc used */ 630 sd = sd_next; 631 if (__predict_false(++fl->cidx == fl->cap)) 632 fl->cidx = 0; 633 |
|
607 len -= m0->m_len; 608 m = m0; 609 while (len) { | 634 len -= m0->m_len; 635 m = m0; 636 while (len) { |
610 m->m_next = get_fl_sdesc_data(fl, len, 0); 611 if (m->m_next == NULL) 612 CXGBE_UNIMPLEMENTED("mbuf recovery"); | 637 i++; |
613 | 638 |
639 sd_next = sd + 1; 640 if (__predict_false(fl->cidx + 1 == fl->cap)) 641 sd_next = fl->sdesc; 642 prefetch(sd_next->m); 643 prefetch(sd_next->cl); 644 645 m->m_next = sd->m; 646 sd->m = NULL; /* consumed */ |
|
614 m = m->m_next; | 647 m = m->m_next; |
648 649 bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, 650 BUS_DMASYNC_POSTREAD); 651 652 m_init(m, zone_mbuf, MLEN, M_NOWAIT, MT_DATA, 0); 653 if (len <= MLEN) { 654 bcopy(sd->cl, mtod(m, caddr_t), len); 655 m->m_len = len; 656 } else { 657 bus_dmamap_unload(fl->tag[sd->tag_idx], 658 sd->map); 659 m_cljset(m, sd->cl, FL_BUF_TYPE(sd->tag_idx)); 660 sd->cl = NULL; /* consumed */ 661 m->m_len = min(len, FL_BUF_SIZE(sd->tag_idx)); 662 } 663 664 i++; 665 sd = sd_next; 666 if (__predict_false(++fl->cidx == fl->cap)) 667 fl->cidx = 0; 668 |
|
615 len -= m->m_len; 616 } | 669 len -= m->m_len; 670 } |
671 672 IQ_UNLOCK(iq); |
|
617#ifdef INET 618 if (cpl->l2info & htobe32(F_RXF_LRO) && 619 rxq->flags & RXQ_LRO_ENABLED && 620 tcp_lro_rx(lro, m0, 0) == 0) { 621 /* queued for LRO */ 622 } else 623#endif | 673#ifdef INET 674 if (cpl->l2info & htobe32(F_RXF_LRO) && 675 rxq->flags & RXQ_LRO_ENABLED && 676 tcp_lro_rx(lro, m0, 0) == 0) { 677 /* queued for LRO */ 678 } else 679#endif |
624 (*ifp->if_input)(ifp, m0); | 680 ifp->if_input(ifp, m0); 681 IQ_LOCK(iq); |
625 626 FL_LOCK(fl); | 682 683 FL_LOCK(fl); |
627 if (fl->needed >= 32) { | 684 fl->needed += i; 685 if (fl->needed >= 32) |
628 refill_fl(fl, 64); | 686 refill_fl(fl, 64); |
629 if (fl->pending >= 32) 630 ring_fl_db(sc, fl); 631 } | 687 if (fl->pending >= 32) 688 ring_fl_db(sc, fl); |
632 FL_UNLOCK(fl); 633 634nextdesc: ndescs++; 635 iq_next(iq); 636 637 if (ndescs > 32) { 638 t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), 639 V_CIDXINC(ndescs) | 640 V_INGRESSQID((u32)iq->cntxt_id) | 641 V_SEINTARM(V_QINTR_TIMER_IDX(X_TIMERREG_UPDATE_CIDX))); 642 ndescs = 0; 643 } 644 } | 689 FL_UNLOCK(fl); 690 691nextdesc: ndescs++; 692 iq_next(iq); 693 694 if (ndescs > 32) { 695 t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), 696 V_CIDXINC(ndescs) | 697 V_INGRESSQID((u32)iq->cntxt_id) | 698 V_SEINTARM(V_QINTR_TIMER_IDX(X_TIMERREG_UPDATE_CIDX))); 699 ndescs = 0; 700 } 701 } |
702 IQ_UNLOCK(iq); |
|
645 646#ifdef INET 647 while (!SLIST_EMPTY(&lro->lro_active)) { 648 l = SLIST_FIRST(&lro->lro_active); 649 SLIST_REMOVE_HEAD(&lro->lro_active, next); 650 tcp_lro_flush(lro, l); 651 } 652#endif 653 654 t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_CIDXINC(ndescs) | 655 V_INGRESSQID((u32)iq->cntxt_id) | V_SEINTARM(iq->intr_next)); 656 | 703 704#ifdef INET 705 while (!SLIST_EMPTY(&lro->lro_active)) { 706 l = SLIST_FIRST(&lro->lro_active); 707 SLIST_REMOVE_HEAD(&lro->lro_active, next); 708 tcp_lro_flush(lro, l); 709 } 710#endif 711 712 t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_CIDXINC(ndescs) | 713 V_INGRESSQID((u32)iq->cntxt_id) | V_SEINTARM(iq->intr_next)); 714 |
657 IQ_UNLOCK(iq); 658 | |
659 FL_LOCK(fl); | 715 FL_LOCK(fl); |
660 if (fl->needed) { 661 refill_fl(fl, -1); 662 if (fl->pending >= 8) 663 ring_fl_db(sc, fl); 664 } | 716 if (fl->needed >= 32) 717 refill_fl(fl, 128); 718 if (fl->pending >= 8) 719 ring_fl_db(sc, fl); |
665 FL_UNLOCK(fl); 666} 667 668/* Per-packet header in a coalesced tx WR, before the SGL starts (in flits) */ 669#define TXPKTS_PKT_HDR ((\ 670 sizeof(struct ulp_txpkt) + \ 671 sizeof(struct ulptx_idata) + \ 672 sizeof(struct cpl_tx_pkt_core) \ --- 523 unchanged lines hidden (view full) --- 1196 1197 children = SYSCTL_CHILDREN(pi->oid_rxq); 1198 1199 snprintf(name, sizeof(name), "%d", idx); 1200 oid = SYSCTL_ADD_NODE(&pi->ctx, children, OID_AUTO, name, CTLFLAG_RD, 1201 NULL, "rx queue"); 1202 children = SYSCTL_CHILDREN(oid); 1203 | 720 FL_UNLOCK(fl); 721} 722 723/* Per-packet header in a coalesced tx WR, before the SGL starts (in flits) */ 724#define TXPKTS_PKT_HDR ((\ 725 sizeof(struct ulp_txpkt) + \ 726 sizeof(struct ulptx_idata) + \ 727 sizeof(struct cpl_tx_pkt_core) \ --- 523 unchanged lines hidden (view full) --- 1251 1252 children = SYSCTL_CHILDREN(pi->oid_rxq); 1253 1254 snprintf(name, sizeof(name), "%d", idx); 1255 oid = SYSCTL_ADD_NODE(&pi->ctx, children, OID_AUTO, name, CTLFLAG_RD, 1256 NULL, "rx queue"); 1257 children = SYSCTL_CHILDREN(oid); 1258 |
1259#ifdef INET |
|
1204 SYSCTL_ADD_INT(&pi->ctx, children, OID_AUTO, "lro_queued", CTLFLAG_RD, 1205 &rxq->lro.lro_queued, 0, NULL); 1206 SYSCTL_ADD_INT(&pi->ctx, children, OID_AUTO, "lro_flushed", CTLFLAG_RD, 1207 &rxq->lro.lro_flushed, 0, NULL); | 1260 SYSCTL_ADD_INT(&pi->ctx, children, OID_AUTO, "lro_queued", CTLFLAG_RD, 1261 &rxq->lro.lro_queued, 0, NULL); 1262 SYSCTL_ADD_INT(&pi->ctx, children, OID_AUTO, "lro_flushed", CTLFLAG_RD, 1263 &rxq->lro.lro_flushed, 0, NULL); |
1264#endif |
|
1208 SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "rxcsum", CTLFLAG_RD, 1209 &rxq->rxcsum, "# of times hardware assisted with checksum"); 1210 SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "vlan_extraction", 1211 CTLFLAG_RD, &rxq->vlan_extraction, 1212 "# of times hardware extracted 802.1Q tag"); 1213 1214 return (rc); 1215} --- 271 unchanged lines hidden (view full) --- 1487 } 1488 1489 tag = fl->tag[sd->tag_idx]; 1490 1491 cl = m_cljget(NULL, M_NOWAIT, FL_BUF_SIZE(sd->tag_idx)); 1492 if (cl == NULL) 1493 break; 1494 | 1265 SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "rxcsum", CTLFLAG_RD, 1266 &rxq->rxcsum, "# of times hardware assisted with checksum"); 1267 SYSCTL_ADD_UQUAD(&pi->ctx, children, OID_AUTO, "vlan_extraction", 1268 CTLFLAG_RD, &rxq->vlan_extraction, 1269 "# of times hardware extracted 802.1Q tag"); 1270 1271 return (rc); 1272} --- 271 unchanged lines hidden (view full) --- 1544 } 1545 1546 tag = fl->tag[sd->tag_idx]; 1547 1548 cl = m_cljget(NULL, M_NOWAIT, FL_BUF_SIZE(sd->tag_idx)); 1549 if (cl == NULL) 1550 break; 1551 |
1495 rc = bus_dmamap_load(tag, sd->map, cl, 1496 FL_BUF_SIZE(sd->tag_idx), oneseg_dma_callback, 1497 &pa, 0); | 1552 rc = bus_dmamap_load(tag, sd->map, cl, FL_BUF_SIZE(sd->tag_idx), 1553 oneseg_dma_callback, &pa, 0); |
1498 if (rc != 0 || pa == 0) { 1499 fl->dmamap_failed++; 1500 uma_zfree(FL_BUF_ZONE(sd->tag_idx), cl); 1501 break; 1502 } 1503 1504 sd->cl = cl; 1505 *d++ = htobe64(pa | sd->tag_idx); 1506 1507#ifdef INVARIANTS 1508 sd->ba_tag = htobe64(pa | sd->tag_idx); 1509#endif 1510 | 1554 if (rc != 0 || pa == 0) { 1555 fl->dmamap_failed++; 1556 uma_zfree(FL_BUF_ZONE(sd->tag_idx), cl); 1557 break; 1558 } 1559 1560 sd->cl = cl; 1561 *d++ = htobe64(pa | sd->tag_idx); 1562 1563#ifdef INVARIANTS 1564 sd->ba_tag = htobe64(pa | sd->tag_idx); 1565#endif 1566 |
1511recycled: fl->pending++; | 1567recycled: 1568 /* sd->m is never recycled, should always be NULL */ 1569 KASSERT(sd->m == NULL, ("%s: stray mbuf", __func__)); 1570 1571 sd->m = m_gethdr(M_NOWAIT, MT_NOINIT); 1572 if (sd->m == NULL) 1573 break; 1574 1575 fl->pending++; |
1512 fl->needed--; 1513 sd++; 1514 if (++fl->pidx == fl->cap) { 1515 fl->pidx = 0; 1516 sd = fl->sdesc; 1517 d = fl->desc; 1518 } | 1576 fl->needed--; 1577 sd++; 1578 if (++fl->pidx == fl->cap) { 1579 fl->pidx = 0; 1580 sd = fl->sdesc; 1581 d = fl->desc; 1582 } |
1519 1520 /* No harm if gethdr fails, we'll retry after rx */ 1521 if (sd->m == NULL) 1522 sd->m = m_gethdr(M_NOWAIT, MT_NOINIT); | |
1523 } 1524} 1525 1526static int 1527alloc_fl_sdesc(struct sge_fl *fl) 1528{ 1529 struct fl_sdesc *sd; 1530 bus_dma_tag_t tag; --- 799 unchanged lines hidden (view full) --- 2330 return htobe64(sgl[i].ds_addr); 2331 case 2: 2332 return htobe64(sgl[i + 1].ds_addr); 2333 } 2334 2335 return (0); 2336} 2337 | 1583 } 1584} 1585 1586static int 1587alloc_fl_sdesc(struct sge_fl *fl) 1588{ 1589 struct fl_sdesc *sd; 1590 bus_dma_tag_t tag; --- 799 unchanged lines hidden (view full) --- 2390 return htobe64(sgl[i].ds_addr); 2391 case 2: 2392 return htobe64(sgl[i + 1].ds_addr); 2393 } 2394 2395 return (0); 2396} 2397 |
2338static struct mbuf * 2339get_fl_sdesc_data(struct sge_fl *fl, int len, int flags) 2340{ 2341 struct fl_sdesc *sd; 2342 struct mbuf *m; 2343 2344 sd = &fl->sdesc[fl->cidx]; 2345 FL_LOCK(fl); 2346 if (++fl->cidx == fl->cap) 2347 fl->cidx = 0; 2348 fl->needed++; 2349 FL_UNLOCK(fl); 2350 2351 m = sd->m; 2352 if (m == NULL) { 2353 m = m_gethdr(M_NOWAIT, MT_NOINIT); 2354 if (m == NULL) 2355 return (NULL); 2356 } 2357 sd->m = NULL; /* consumed */ 2358 2359 bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, BUS_DMASYNC_POSTREAD); 2360 m_init(m, zone_mbuf, MLEN, M_NOWAIT, MT_DATA, flags); 2361 if ((flags && len < MINCLSIZE) || (!flags && len <= MLEN)) 2362 bcopy(sd->cl, mtod(m, caddr_t), len); 2363 else { 2364 bus_dmamap_unload(fl->tag[sd->tag_idx], sd->map); 2365 m_cljset(m, sd->cl, FL_BUF_TYPE(sd->tag_idx)); 2366 sd->cl = NULL; /* consumed */ 2367 } 2368 2369 m->m_len = min(len, FL_BUF_SIZE(sd->tag_idx)); 2370 2371 return (m); 2372} 2373 | |
2374static void 2375set_fl_tag_idx(struct sge_fl *fl, int mtu) 2376{ 2377 int i; 2378 2379 FL_LOCK_ASSERT_OWNED(fl); 2380 2381 for (i = 0; i < FL_BUF_SIZES - 1; i++) { --- 22 unchanged lines hidden --- | 2398static void 2399set_fl_tag_idx(struct sge_fl *fl, int mtu) 2400{ 2401 int i; 2402 2403 FL_LOCK_ASSERT_OWNED(fl); 2404 2405 for (i = 0; i < FL_BUF_SIZES - 1; i++) { --- 22 unchanged lines hidden --- |