cxgb_sge.c (170076) | cxgb_sge.c (170654) |
---|---|
1/************************************************************************** 2 3Copyright (c) 2007, Chelsio Inc. 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are met: 8 --- 14 unchanged lines hidden (view full) --- 23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26POSSIBILITY OF SUCH DAMAGE. 27 28***************************************************************************/ 29 30#include <sys/cdefs.h> | 1/************************************************************************** 2 3Copyright (c) 2007, Chelsio Inc. 4All rights reserved. 5 6Redistribution and use in source and binary forms, with or without 7modification, are permitted provided that the following conditions are met: 8 --- 14 unchanged lines hidden (view full) --- 23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26POSSIBILITY OF SUCH DAMAGE. 27 28***************************************************************************/ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_sge.c 170076 2007-05-28 22:57:27Z kmacy $"); | 31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_sge.c 170654 2007-06-13 05:36:00Z kmacy $"); |
32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/kernel.h> 36#include <sys/module.h> 37#include <sys/bus.h> 38#include <sys/conf.h> 39#include <machine/bus.h> --- 262 unchanged lines hidden (view full) --- 302 */ 303 if (sopeop == RSPQ_NSOP_NEOP || sopeop == RSPQ_SOP) 304 return; 305 306 len = G_RSPD_LEN(ntohl(resp->len_cq)); 307 switch (sopeop) { 308 case RSPQ_SOP_EOP: 309 m->m_len = m->m_pkthdr.len = len; | 32 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/kernel.h> 36#include <sys/module.h> 37#include <sys/bus.h> 38#include <sys/conf.h> 39#include <machine/bus.h> --- 262 unchanged lines hidden (view full) --- 302 */ 303 if (sopeop == RSPQ_NSOP_NEOP || sopeop == RSPQ_SOP) 304 return; 305 306 len = G_RSPD_LEN(ntohl(resp->len_cq)); 307 switch (sopeop) { 308 case RSPQ_SOP_EOP: 309 m->m_len = m->m_pkthdr.len = len; |
310 memcpy(m->m_data, resp->imm_data, len); | 310 memcpy(mtod(m, uint8_t *), resp->imm_data, len); |
311 break; 312 case RSPQ_EOP: 313 memcpy(cl, resp->imm_data, len); 314 m_iovappend(m, cl, MSIZE, len, 0); 315 break; 316 } 317} 318 --- 342 unchanged lines hidden (view full) --- 661 662 t3_slow_intr_handler(sc); 663} 664 665static void 666sge_timer_cb(void *arg) 667{ 668 adapter_t *sc = arg; | 311 break; 312 case RSPQ_EOP: 313 memcpy(cl, resp->imm_data, len); 314 m_iovappend(m, cl, MSIZE, len, 0); 315 break; 316 } 317} 318 --- 342 unchanged lines hidden (view full) --- 661 662 t3_slow_intr_handler(sc); 663} 664 665static void 666sge_timer_cb(void *arg) 667{ 668 adapter_t *sc = arg; |
669 struct port_info *p; |
|
669 struct sge_qset *qs; 670 struct sge_txq *txq; 671 int i, j; 672 int reclaim_eth, reclaim_ofl, refill_rx; 673 674 for (i = 0; i < sc->params.nports; i++) 675 for (j = 0; j < sc->port[i].nqsets; j++) { 676 qs = &sc->sge.qs[i + j]; 677 txq = &qs->txq[0]; 678 reclaim_eth = txq[TXQ_ETH].processed - txq[TXQ_ETH].cleaned; 679 reclaim_ofl = txq[TXQ_OFLD].processed - txq[TXQ_OFLD].cleaned; 680 refill_rx = ((qs->fl[0].credits < qs->fl[0].size) || 681 (qs->fl[1].credits < qs->fl[1].size)); 682 if (reclaim_eth || reclaim_ofl || refill_rx) { | 670 struct sge_qset *qs; 671 struct sge_txq *txq; 672 int i, j; 673 int reclaim_eth, reclaim_ofl, refill_rx; 674 675 for (i = 0; i < sc->params.nports; i++) 676 for (j = 0; j < sc->port[i].nqsets; j++) { 677 qs = &sc->sge.qs[i + j]; 678 txq = &qs->txq[0]; 679 reclaim_eth = txq[TXQ_ETH].processed - txq[TXQ_ETH].cleaned; 680 reclaim_ofl = txq[TXQ_OFLD].processed - txq[TXQ_OFLD].cleaned; 681 refill_rx = ((qs->fl[0].credits < qs->fl[0].size) || 682 (qs->fl[1].credits < qs->fl[1].size)); 683 if (reclaim_eth || reclaim_ofl || refill_rx) { |
683 taskqueue_enqueue(sc->tq, &sc->timer_reclaim_task); 684 goto done; | 684 p = &sc->port[i]; 685 taskqueue_enqueue(p->tq, &p->timer_reclaim_task); 686 break; |
685 } 686 } | 687 } 688 } |
687done: | |
688 callout_reset(&sc->sge_timer_ch, TX_RECLAIM_PERIOD, sge_timer_cb, sc); 689} 690 691/* 692 * This is meant to be a catch-all function to keep sge state private 693 * to sge.c 694 * 695 */ 696int | 689 callout_reset(&sc->sge_timer_ch, TX_RECLAIM_PERIOD, sge_timer_cb, sc); 690} 691 692/* 693 * This is meant to be a catch-all function to keep sge state private 694 * to sge.c 695 * 696 */ 697int |
697t3_sge_init_sw(adapter_t *sc) | 698t3_sge_init_adapter(adapter_t *sc) |
698{ | 699{ |
699 | |
700 callout_init(&sc->sge_timer_ch, CALLOUT_MPSAFE); 701 callout_reset(&sc->sge_timer_ch, TX_RECLAIM_PERIOD, sge_timer_cb, sc); | 700 callout_init(&sc->sge_timer_ch, CALLOUT_MPSAFE); 701 callout_reset(&sc->sge_timer_ch, TX_RECLAIM_PERIOD, sge_timer_cb, sc); |
702 TASK_INIT(&sc->timer_reclaim_task, 0, sge_timer_reclaim, sc); | |
703 TASK_INIT(&sc->slow_intr_task, 0, sge_slow_intr_handler, sc); 704 return (0); 705} 706 | 702 TASK_INIT(&sc->slow_intr_task, 0, sge_slow_intr_handler, sc); 703 return (0); 704} 705 |
706int 707t3_sge_init_port(struct port_info *p) 708{ 709 TASK_INIT(&p->timer_reclaim_task, 0, sge_timer_reclaim, p); 710} 711 |
|
707void 708t3_sge_deinit_sw(adapter_t *sc) 709{ | 712void 713t3_sge_deinit_sw(adapter_t *sc) 714{ |
715 int i; 716 |
|
710 callout_drain(&sc->sge_timer_ch); | 717 callout_drain(&sc->sge_timer_ch); |
711 if (sc->tq) { 712 taskqueue_drain(sc->tq, &sc->timer_reclaim_task); | 718 if (sc->tq) |
713 taskqueue_drain(sc->tq, &sc->slow_intr_task); | 719 taskqueue_drain(sc->tq, &sc->slow_intr_task); |
714 } | 720 for (i = 0; i < sc->params.nports; i++) 721 if (sc->port[i].tq != NULL) 722 taskqueue_drain(sc->port[i].tq, &sc->port[i].timer_reclaim_task); |
715} 716 717/** 718 * refill_rspq - replenish an SGE response queue 719 * @adapter: the adapter 720 * @q: the response queue to replenish 721 * @credits: how many new responses to make available 722 * --- 8 unchanged lines hidden (view full) --- 731 t3_write_reg(sc, A_SG_RSPQ_CREDIT_RETURN, 732 V_RSPQ(q->cntxt_id) | V_CREDITS(credits)); 733} 734 735 736static void 737sge_timer_reclaim(void *arg, int ncount) 738{ | 723} 724 725/** 726 * refill_rspq - replenish an SGE response queue 727 * @adapter: the adapter 728 * @q: the response queue to replenish 729 * @credits: how many new responses to make available 730 * --- 8 unchanged lines hidden (view full) --- 739 t3_write_reg(sc, A_SG_RSPQ_CREDIT_RETURN, 740 V_RSPQ(q->cntxt_id) | V_CREDITS(credits)); 741} 742 743 744static void 745sge_timer_reclaim(void *arg, int ncount) 746{ |
739 adapter_t *sc = arg; 740 int i, nqsets = 0; | 747 struct port_info *p = arg; 748 int i, nqsets = p->nqsets; 749 adapter_t *sc = p->adapter; |
741 struct sge_qset *qs; 742 struct sge_txq *txq; 743 struct mtx *lock; 744 struct mbuf *m_vec[TX_CLEAN_MAX_DESC]; 745 int n, reclaimable; | 750 struct sge_qset *qs; 751 struct sge_txq *txq; 752 struct mtx *lock; 753 struct mbuf *m_vec[TX_CLEAN_MAX_DESC]; 754 int n, reclaimable; |
746 /* 747 * XXX assuming these quantities are allowed to change during operation 748 */ 749 for (i = 0; i < sc->params.nports; i++) 750 nqsets += sc->port[i].nqsets; | |
751 752 for (i = 0; i < nqsets; i++) { 753 qs = &sc->sge.qs[i]; 754 txq = &qs->txq[TXQ_ETH]; 755 reclaimable = desc_reclaimable(txq); 756 if (reclaimable > 0) { | 755 756 for (i = 0; i < nqsets; i++) { 757 qs = &sc->sge.qs[i]; 758 txq = &qs->txq[TXQ_ETH]; 759 reclaimable = desc_reclaimable(txq); 760 if (reclaimable > 0) { |
757 mtx_lock(&txq->lock); | 761 mtx_lock(&txq->lock); |
758 n = reclaim_completed_tx(sc, txq, TX_CLEAN_MAX_DESC, m_vec); 759 mtx_unlock(&txq->lock); 760 | 762 n = reclaim_completed_tx(sc, txq, TX_CLEAN_MAX_DESC, m_vec); 763 mtx_unlock(&txq->lock); 764 |
761 for (i = 0; i < n; i++) { | 765 for (i = 0; i < n; i++) |
762 m_freem_vec(m_vec[i]); | 766 m_freem_vec(m_vec[i]); |
763 } 764 if (qs->port->ifp->if_drv_flags & IFF_DRV_OACTIVE && | 767 768 if (p->ifp->if_drv_flags & IFF_DRV_OACTIVE && |
765 txq->size - txq->in_use >= TX_START_MAX_DESC) { | 769 txq->size - txq->in_use >= TX_START_MAX_DESC) { |
766 qs->port->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 767 taskqueue_enqueue(qs->port->tq, &qs->port->start_task); | 770 p->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 771 taskqueue_enqueue(p->tq, &p->start_task); |
768 } | 772 } |
769 } 770 | 773 } 774 |
771 txq = &qs->txq[TXQ_OFLD]; 772 reclaimable = desc_reclaimable(txq); 773 if (reclaimable > 0) { 774 mtx_lock(&txq->lock); 775 n = reclaim_completed_tx(sc, txq, TX_CLEAN_MAX_DESC, m_vec); 776 mtx_unlock(&txq->lock); 777 | 775 txq = &qs->txq[TXQ_OFLD]; 776 reclaimable = desc_reclaimable(txq); 777 if (reclaimable > 0) { 778 mtx_lock(&txq->lock); 779 n = reclaim_completed_tx(sc, txq, TX_CLEAN_MAX_DESC, m_vec); 780 mtx_unlock(&txq->lock); 781 |
778 for (i = 0; i < n; i++) { | 782 for (i = 0; i < n; i++) |
779 m_freem_vec(m_vec[i]); | 783 m_freem_vec(m_vec[i]); |
780 } | |
781 } 782 783 lock = (sc->flags & USING_MSIX) ? &qs->rspq.lock : 784 &sc->sge.qs[0].rspq.lock; 785 786 if (mtx_trylock(lock)) { 787 /* XXX currently assume that we are *NOT* polling */ 788 uint32_t status = t3_read_reg(sc, A_SG_RSPQ_FL_STATUS); --- 355 unchanged lines hidden (view full) --- 1144 txd->flit[2] = 0; 1145 cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT_LSO); 1146 hdr->cntrl = htonl(cntrl); 1147 1148 if (__predict_false(m0->m_len < TCPPKTHDRSIZE)) { 1149 pkthdr = &tmp[0]; 1150 m_copydata(m0, 0, TCPPKTHDRSIZE, pkthdr); 1151 } else { | 784 } 785 786 lock = (sc->flags & USING_MSIX) ? &qs->rspq.lock : 787 &sc->sge.qs[0].rspq.lock; 788 789 if (mtx_trylock(lock)) { 790 /* XXX currently assume that we are *NOT* polling */ 791 uint32_t status = t3_read_reg(sc, A_SG_RSPQ_FL_STATUS); --- 355 unchanged lines hidden (view full) --- 1147 txd->flit[2] = 0; 1148 cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT_LSO); 1149 hdr->cntrl = htonl(cntrl); 1150 1151 if (__predict_false(m0->m_len < TCPPKTHDRSIZE)) { 1152 pkthdr = &tmp[0]; 1153 m_copydata(m0, 0, TCPPKTHDRSIZE, pkthdr); 1154 } else { |
1152 pkthdr = m0->m_data; | 1155 pkthdr = mtod(m0, uint8_t *); |
1153 } 1154 1155 if (__predict_false(m0->m_flags & M_VLANTAG)) { 1156 eth_type = CPL_ETH_II_VLAN; 1157 ip = (struct ip *)(pkthdr + ETHER_HDR_LEN + 1158 ETHER_VLAN_ENCAP_LEN); 1159 } else { 1160 eth_type = CPL_ETH_II; --- 12 unchanged lines hidden (view full) --- 1173 cpl->cntrl = htonl(cntrl); 1174 1175 if (mlen <= WR_LEN - sizeof(*cpl)) { 1176 txq_prod(txq, 1, &txqs); 1177 txq->sdesc[txqs.pidx].m = m0; 1178 m_set_priority(m0, txqs.pidx); 1179 1180 if (m0->m_len == m0->m_pkthdr.len) | 1156 } 1157 1158 if (__predict_false(m0->m_flags & M_VLANTAG)) { 1159 eth_type = CPL_ETH_II_VLAN; 1160 ip = (struct ip *)(pkthdr + ETHER_HDR_LEN + 1161 ETHER_VLAN_ENCAP_LEN); 1162 } else { 1163 eth_type = CPL_ETH_II; --- 12 unchanged lines hidden (view full) --- 1176 cpl->cntrl = htonl(cntrl); 1177 1178 if (mlen <= WR_LEN - sizeof(*cpl)) { 1179 txq_prod(txq, 1, &txqs); 1180 txq->sdesc[txqs.pidx].m = m0; 1181 m_set_priority(m0, txqs.pidx); 1182 1183 if (m0->m_len == m0->m_pkthdr.len) |
1181 memcpy(&txd->flit[2], m0->m_data, mlen); | 1184 memcpy(&txd->flit[2], mtod(m0, uint8_t *), mlen); |
1182 else 1183 m_copydata(m0, 0, mlen, (caddr_t)&txd->flit[2]); 1184 1185 flits = (mlen + 7) / 8 + 2; 1186 cpl->wr.wr_hi = htonl(V_WR_BCNTLFLT(mlen & 7) | 1187 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | 1188 F_WR_SOP | F_WR_EOP | txqs.compl); 1189 wmb(); --- 148 unchanged lines hidden (view full) --- 1338 * Send a packet through an SGE control Tx queue. Packets sent through 1339 * a control queue must fit entirely as immediate data in a single Tx 1340 * descriptor and have no page fragments. 1341 */ 1342static int 1343ctrl_xmit(adapter_t *adap, struct sge_txq *q, struct mbuf *m) 1344{ 1345 int ret; | 1185 else 1186 m_copydata(m0, 0, mlen, (caddr_t)&txd->flit[2]); 1187 1188 flits = (mlen + 7) / 8 + 2; 1189 cpl->wr.wr_hi = htonl(V_WR_BCNTLFLT(mlen & 7) | 1190 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | 1191 F_WR_SOP | F_WR_EOP | txqs.compl); 1192 wmb(); --- 148 unchanged lines hidden (view full) --- 1341 * Send a packet through an SGE control Tx queue. Packets sent through 1342 * a control queue must fit entirely as immediate data in a single Tx 1343 * descriptor and have no page fragments. 1344 */ 1345static int 1346ctrl_xmit(adapter_t *adap, struct sge_txq *q, struct mbuf *m) 1347{ 1348 int ret; |
1346 struct work_request_hdr *wrp = (struct work_request_hdr *)m->m_data; | 1349 struct work_request_hdr *wrp = mtod(m, struct work_request_hdr *); |
1347 1348 if (__predict_false(!immediate(m))) { 1349 m_freem(m); 1350 return 0; 1351 } 1352 1353 wrp->wr_hi |= htonl(F_WR_SOP | F_WR_EOP); 1354 wrp->wr_lo = htonl(V_WR_TID(q->token)); --- 187 unchanged lines hidden (view full) --- 1542 * if they are still running. 1543 */ 1544void 1545t3_sge_stop(adapter_t *sc) 1546{ 1547 int i; 1548 t3_set_reg_field(sc, A_SG_CONTROL, F_GLOBALENABLE, 0); 1549 | 1350 1351 if (__predict_false(!immediate(m))) { 1352 m_freem(m); 1353 return 0; 1354 } 1355 1356 wrp->wr_hi |= htonl(F_WR_SOP | F_WR_EOP); 1357 wrp->wr_lo = htonl(V_WR_TID(q->token)); --- 187 unchanged lines hidden (view full) --- 1545 * if they are still running. 1546 */ 1547void 1548t3_sge_stop(adapter_t *sc) 1549{ 1550 int i; 1551 t3_set_reg_field(sc, A_SG_CONTROL, F_GLOBALENABLE, 0); 1552 |
1553 if (sc->tq == NULL) 1554 return; 1555 |
|
1550 for (i = 0; i < SGE_QSETS; ++i) { 1551 struct sge_qset *qs = &sc->sge.qs[i]; 1552 1553 taskqueue_drain(sc->tq, &qs->txq[TXQ_OFLD].qresume_tsk); 1554 taskqueue_drain(sc->tq, &qs->txq[TXQ_CTRL].qresume_tsk); 1555 } 1556} 1557 --- 542 unchanged lines hidden (view full) --- 2100 t3_free_qset(sc, q); 2101 2102 return (ret); 2103} 2104 2105void 2106t3_rx_eth(struct port_info *pi, struct sge_rspq *rq, struct mbuf *m, int ethpad) 2107{ | 1556 for (i = 0; i < SGE_QSETS; ++i) { 1557 struct sge_qset *qs = &sc->sge.qs[i]; 1558 1559 taskqueue_drain(sc->tq, &qs->txq[TXQ_OFLD].qresume_tsk); 1560 taskqueue_drain(sc->tq, &qs->txq[TXQ_CTRL].qresume_tsk); 1561 } 1562} 1563 --- 542 unchanged lines hidden (view full) --- 2106 t3_free_qset(sc, q); 2107 2108 return (ret); 2109} 2110 2111void 2112t3_rx_eth(struct port_info *pi, struct sge_rspq *rq, struct mbuf *m, int ethpad) 2113{ |
2108 struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(m->m_data + ethpad); | 2114 struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(mtod(m, uint8_t *) + ethpad); |
2109 struct ifnet *ifp = pi->ifp; 2110 | 2115 struct ifnet *ifp = pi->ifp; 2116 |
2111 DPRINTF("rx_eth m=%p m->m_data=%p p->iff=%d\n", m, m->m_data, cpl->iff); | 2117 DPRINTF("rx_eth m=%p m->m_data=%p p->iff=%d\n", m, mtod(m, uint8_t *), cpl->iff); |
2112 if (&pi->adapter->port[cpl->iff] != pi) | 2118 if (&pi->adapter->port[cpl->iff] != pi) |
2113 panic("bad port index %d m->m_data=%p\n", cpl->iff, m->m_data); | 2119 panic("bad port index %d m->m_data=%p\n", cpl->iff, mtod(m, uint8_t *)); |
2114 2115 if ((ifp->if_capenable & IFCAP_RXCSUM) && !cpl->fragment && 2116 cpl->csum_valid && cpl->csum == 0xffff) { 2117 m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID); 2118 rspq_to_qset(rq)->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; 2119 m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID|CSUM_DATA_VALID|CSUM_PSEUDO_HDR); 2120 m->m_pkthdr.csum_data = 0xffff; 2121 } 2122 /* 2123 * XXX need to add VLAN support for 6.x 2124 */ 2125#ifdef VLAN_SUPPORTED 2126 if (__predict_false(cpl->vlan_valid)) { 2127 m->m_pkthdr.ether_vtag = ntohs(cpl->vlan); 2128 m->m_flags |= M_VLANTAG; 2129 } 2130#endif 2131 2132 m->m_pkthdr.rcvif = ifp; | 2120 2121 if ((ifp->if_capenable & IFCAP_RXCSUM) && !cpl->fragment && 2122 cpl->csum_valid && cpl->csum == 0xffff) { 2123 m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID); 2124 rspq_to_qset(rq)->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++; 2125 m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID|CSUM_DATA_VALID|CSUM_PSEUDO_HDR); 2126 m->m_pkthdr.csum_data = 0xffff; 2127 } 2128 /* 2129 * XXX need to add VLAN support for 6.x 2130 */ 2131#ifdef VLAN_SUPPORTED 2132 if (__predict_false(cpl->vlan_valid)) { 2133 m->m_pkthdr.ether_vtag = ntohs(cpl->vlan); 2134 m->m_flags |= M_VLANTAG; 2135 } 2136#endif 2137 2138 m->m_pkthdr.rcvif = ifp; |
2133 m->m_pkthdr.header = m->m_data + sizeof(*cpl) + ethpad; | 2139 m->m_pkthdr.header = mtod(m, uint8_t *) + sizeof(*cpl) + ethpad; |
2134 m_explode(m); 2135 /* 2136 * adjust after conversion to mbuf chain 2137 */ 2138 m_adj(m, sizeof(*cpl) + ethpad); 2139 2140 (*ifp->if_input)(ifp, m); 2141} --- 68 unchanged lines hidden (view full) --- 2210 2211done: 2212 if (++fl->cidx == fl->size) 2213 fl->cidx = 0; 2214 2215 return (ret); 2216} 2217 | 2140 m_explode(m); 2141 /* 2142 * adjust after conversion to mbuf chain 2143 */ 2144 m_adj(m, sizeof(*cpl) + ethpad); 2145 2146 (*ifp->if_input)(ifp, m); 2147} --- 68 unchanged lines hidden (view full) --- 2216 2217done: 2218 if (++fl->cidx == fl->size) 2219 fl->cidx = 0; 2220 2221 return (ret); 2222} 2223 |
2218 | |
2219/** 2220 * handle_rsp_cntrl_info - handles control information in a response 2221 * @qs: the queue set corresponding to the response 2222 * @flags: the response control flags 2223 * 2224 * Handles the control information of an SGE response, such as GTS 2225 * indications and completion credits for the queue set's Tx queues. 2226 * HW coalesces credits, we don't do any extra SW coalescing. --- 7 unchanged lines hidden (view full) --- 2234 if (flags & F_RSPD_TXQ0_GTS) 2235 clear_bit(TXQ_RUNNING, &qs->txq[TXQ_ETH].flags); 2236#endif 2237 credits = G_RSPD_TXQ0_CR(flags); 2238 if (credits) { 2239 qs->txq[TXQ_ETH].processed += credits; 2240 if (desc_reclaimable(&qs->txq[TXQ_ETH]) > TX_START_MAX_DESC) 2241 taskqueue_enqueue(qs->port->adapter->tq, | 2224/** 2225 * handle_rsp_cntrl_info - handles control information in a response 2226 * @qs: the queue set corresponding to the response 2227 * @flags: the response control flags 2228 * 2229 * Handles the control information of an SGE response, such as GTS 2230 * indications and completion credits for the queue set's Tx queues. 2231 * HW coalesces credits, we don't do any extra SW coalescing. --- 7 unchanged lines hidden (view full) --- 2239 if (flags & F_RSPD_TXQ0_GTS) 2240 clear_bit(TXQ_RUNNING, &qs->txq[TXQ_ETH].flags); 2241#endif 2242 credits = G_RSPD_TXQ0_CR(flags); 2243 if (credits) { 2244 qs->txq[TXQ_ETH].processed += credits; 2245 if (desc_reclaimable(&qs->txq[TXQ_ETH]) > TX_START_MAX_DESC) 2246 taskqueue_enqueue(qs->port->adapter->tq, |
2242 &qs->port->adapter->timer_reclaim_task); | 2247 &qs->port->timer_reclaim_task); |
2243 } 2244 2245 credits = G_RSPD_TXQ2_CR(flags); 2246 if (credits) 2247 qs->txq[TXQ_CTRL].processed += credits; 2248 2249# if USE_GTS 2250 if (flags & F_RSPD_TXQ1_GTS) --- 105 unchanged lines hidden (view full) --- 2356 2357 prefetch(r); 2358 if (++rspq->credits >= (rspq->size / 4)) { 2359 refill_rspq(adap, rspq, rspq->credits); 2360 rspq->credits = 0; 2361 } 2362 2363 if (eop) { | 2248 } 2249 2250 credits = G_RSPD_TXQ2_CR(flags); 2251 if (credits) 2252 qs->txq[TXQ_CTRL].processed += credits; 2253 2254# if USE_GTS 2255 if (flags & F_RSPD_TXQ1_GTS) --- 105 unchanged lines hidden (view full) --- 2361 2362 prefetch(r); 2363 if (++rspq->credits >= (rspq->size / 4)) { 2364 refill_rspq(adap, rspq, rspq->credits); 2365 rspq->credits = 0; 2366 } 2367 2368 if (eop) { |
2364 prefetch(rspq->m->m_data); 2365 prefetch(rspq->m->m_data + L1_CACHE_BYTES); | 2369 prefetch(mtod(rspq->m, uint8_t *)); 2370 prefetch(mtod(rspq->m, uint8_t *) + L1_CACHE_BYTES); |
2366 2367 if (eth) { 2368 t3_rx_eth_lro(adap, rspq, rspq->m, ethpad, 2369 rss_hash, rss_csum, lro); 2370 2371 rspq->m = NULL; 2372 } else { 2373 rspq->m->m_pkthdr.csum_data = rss_csum; --- 9 unchanged lines hidden (view full) --- 2383 taskqueue_enqueue(adap->tq, &adap->timer_reclaim_task); 2384#else 2385 __refill_fl(adap, &qs->fl[0]); 2386 __refill_fl(adap, &qs->fl[1]); 2387#endif 2388 } 2389 --budget_left; 2390 } | 2371 2372 if (eth) { 2373 t3_rx_eth_lro(adap, rspq, rspq->m, ethpad, 2374 rss_hash, rss_csum, lro); 2375 2376 rspq->m = NULL; 2377 } else { 2378 rspq->m->m_pkthdr.csum_data = rss_csum; --- 9 unchanged lines hidden (view full) --- 2388 taskqueue_enqueue(adap->tq, &adap->timer_reclaim_task); 2389#else 2390 __refill_fl(adap, &qs->fl[0]); 2391 __refill_fl(adap, &qs->fl[1]); 2392#endif 2393 } 2394 --budget_left; 2395 } |
2391 | |
2392 2393 deliver_partial_bundle(&adap->tdev, rspq, offload_mbufs, ngathered); 2394 t3_lro_flush(adap, qs, &qs->lro); 2395 2396 if (sleeping) 2397 check_ring_db(adap, qs, sleeping); 2398 2399 smp_mb(); /* commit Tx queue processed updates */ --- 115 unchanged lines hidden (view full) --- 2515#ifndef LRO_WORKING 2516 return (0); 2517#endif 2518 2519 sc = arg1; 2520 enabled = sc->sge.qs[0].lro.enabled; 2521 err = sysctl_handle_int(oidp, &enabled, arg2, req); 2522 | 2396 2397 deliver_partial_bundle(&adap->tdev, rspq, offload_mbufs, ngathered); 2398 t3_lro_flush(adap, qs, &qs->lro); 2399 2400 if (sleeping) 2401 check_ring_db(adap, qs, sleeping); 2402 2403 smp_mb(); /* commit Tx queue processed updates */ --- 115 unchanged lines hidden (view full) --- 2519#ifndef LRO_WORKING 2520 return (0); 2521#endif 2522 2523 sc = arg1; 2524 enabled = sc->sge.qs[0].lro.enabled; 2525 err = sysctl_handle_int(oidp, &enabled, arg2, req); 2526 |
2523 if (err != 0) { | 2527 if (err != 0) |
2524 return (err); | 2528 return (err); |
2525 } | |
2526 if (enabled == sc->sge.qs[0].lro.enabled) 2527 return (0); 2528 2529 for (i = 0; i < sc->params.nports; i++) 2530 for (j = 0; j < sc->port[i].nqsets; j++) 2531 nqsets++; 2532 | 2529 if (enabled == sc->sge.qs[0].lro.enabled) 2530 return (0); 2531 2532 for (i = 0; i < sc->params.nports; i++) 2533 for (j = 0; j < sc->port[i].nqsets; j++) 2534 nqsets++; 2535 |
2533 for (i = 0; i < nqsets; i++) { | 2536 for (i = 0; i < nqsets; i++) |
2534 sc->sge.qs[i].lro.enabled = enabled; | 2537 sc->sge.qs[i].lro.enabled = enabled; |
2535 } | |
2536 2537 return (0); 2538} 2539 2540static int 2541t3_set_coalesce_nsecs(SYSCTL_HANDLER_ARGS) 2542{ 2543 adapter_t *sc = arg1; --- 122 unchanged lines hidden --- | 2538 2539 return (0); 2540} 2541 2542static int 2543t3_set_coalesce_nsecs(SYSCTL_HANDLER_ARGS) 2544{ 2545 adapter_t *sc = arg1; --- 122 unchanged lines hidden --- |