Deleted Added
full compact
t4_netmap.c (306664) t4_netmap.c (309560)
1/*-
2 * Copyright (c) 2014 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) 2014 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: stable/11/sys/dev/cxgbe/t4_netmap.c 306664 2016-10-03 23:49:05Z jhb $");
29__FBSDID("$FreeBSD: stable/11/sys/dev/cxgbe/t4_netmap.c 309560 2016-12-05 20:43:25Z jhb $");
30
31#include "opt_inet.h"
32#include "opt_inet6.h"
33
34#ifdef DEV_NETMAP
35#include <sys/param.h>
36#include <sys/bus.h>
37#include <sys/eventhandler.h>

--- 96 unchanged lines hidden (view full) ---

134 F_FW_IQ_CMD_FL0CONGEN);
135 }
136 c.iqns_to_fl0congen |=
137 htobe32(V_FW_IQ_CMD_FL0HOSTFCMODE(X_HOSTFCMODE_NONE) |
138 F_FW_IQ_CMD_FL0FETCHRO | F_FW_IQ_CMD_FL0DATARO |
139 (fl_pad ? F_FW_IQ_CMD_FL0PADEN : 0) |
140 (black_hole == 2 ? F_FW_IQ_CMD_FL0PACKEN : 0));
141 c.fl0dcaen_to_fl0cidxfthresh =
30
31#include "opt_inet.h"
32#include "opt_inet6.h"
33
34#ifdef DEV_NETMAP
35#include <sys/param.h>
36#include <sys/bus.h>
37#include <sys/eventhandler.h>

--- 96 unchanged lines hidden (view full) ---

134 F_FW_IQ_CMD_FL0CONGEN);
135 }
136 c.iqns_to_fl0congen |=
137 htobe32(V_FW_IQ_CMD_FL0HOSTFCMODE(X_HOSTFCMODE_NONE) |
138 F_FW_IQ_CMD_FL0FETCHRO | F_FW_IQ_CMD_FL0DATARO |
139 (fl_pad ? F_FW_IQ_CMD_FL0PADEN : 0) |
140 (black_hole == 2 ? F_FW_IQ_CMD_FL0PACKEN : 0));
141 c.fl0dcaen_to_fl0cidxfthresh =
142 htobe16(V_FW_IQ_CMD_FL0FBMIN(X_FETCHBURSTMIN_128B) |
143 V_FW_IQ_CMD_FL0FBMAX(X_FETCHBURSTMAX_512B));
142 htobe16(V_FW_IQ_CMD_FL0FBMIN(chip_id(sc) <= CHELSIO_T5 ?
143 X_FETCHBURSTMIN_128B : X_FETCHBURSTMIN_64B) |
144 V_FW_IQ_CMD_FL0FBMAX(chip_id(sc) <= CHELSIO_T5 ?
145 X_FETCHBURSTMAX_512B : X_FETCHBURSTMAX_256B));
144 c.fl0size = htobe16(na->num_rx_desc / 8 + sp->spg_len / EQ_ESIZE);
145 c.fl0addr = htobe64(nm_rxq->fl_ba);
146
147 rc = -t4_wr_mbox(sc, sc->mbox, &c, sizeof(c), &c);
148 if (rc != 0) {
149 device_printf(sc->dev,
150 "failed to create netmap ingress queue: %d\n", rc);
151 return (rc);

--- 19 unchanged lines hidden (view full) ---

171 panic("%s: nm_rxq->fl_cntxt_id (%d) more than the max (%d)",
172 __func__, cntxt_id, sc->sge.neq - 1);
173 }
174 sc->sge.eqmap[cntxt_id] = (void *)nm_rxq;
175
176 nm_rxq->fl_db_val = V_QID(nm_rxq->fl_cntxt_id) |
177 sc->chip_params->sge_fl_db;
178
146 c.fl0size = htobe16(na->num_rx_desc / 8 + sp->spg_len / EQ_ESIZE);
147 c.fl0addr = htobe64(nm_rxq->fl_ba);
148
149 rc = -t4_wr_mbox(sc, sc->mbox, &c, sizeof(c), &c);
150 if (rc != 0) {
151 device_printf(sc->dev,
152 "failed to create netmap ingress queue: %d\n", rc);
153 return (rc);

--- 19 unchanged lines hidden (view full) ---

173 panic("%s: nm_rxq->fl_cntxt_id (%d) more than the max (%d)",
174 __func__, cntxt_id, sc->sge.neq - 1);
175 }
176 sc->sge.eqmap[cntxt_id] = (void *)nm_rxq;
177
178 nm_rxq->fl_db_val = V_QID(nm_rxq->fl_cntxt_id) |
179 sc->chip_params->sge_fl_db;
180
179 if (is_t5(sc) && cong >= 0) {
181 if (chip_id(sc) >= CHELSIO_T5 && cong >= 0) {
180 uint32_t param, val;
181
182 param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) |
183 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) |
184 V_FW_PARAMS_PARAM_YZ(nm_rxq->iq_cntxt_id);
185 param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) |
186 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) |
187 V_FW_PARAMS_PARAM_YZ(nm_rxq->iq_cntxt_id);

--- 688 unchanged lines hidden (view full) ---

876{
877
878 MPASS(vi->nnmrxq > 0);
879 MPASS(vi->ifp != NULL);
880
881 netmap_detach(vi->ifp);
882}
883
182 uint32_t param, val;
183
184 param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) |
185 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) |
186 V_FW_PARAMS_PARAM_YZ(nm_rxq->iq_cntxt_id);
187 param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) |
188 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) |
189 V_FW_PARAMS_PARAM_YZ(nm_rxq->iq_cntxt_id);

--- 688 unchanged lines hidden (view full) ---

878{
879
880 MPASS(vi->nnmrxq > 0);
881 MPASS(vi->ifp != NULL);
882
883 netmap_detach(vi->ifp);
884}
885
886static inline const void *
887unwrap_nm_fw6_msg(const struct cpl_fw6_msg *cpl)
888{
889
890 MPASS(cpl->type == FW_TYPE_RSSCPL || cpl->type == FW6_TYPE_RSSCPL);
891
892 /* data[0] is RSS header */
893 return (&cpl->data[1]);
894}
895
884static void
896static void
885handle_nm_fw6_msg(struct adapter *sc, struct ifnet *ifp,
886 const struct cpl_fw6_msg *cpl)
897handle_nm_sge_egr_update(struct adapter *sc, struct ifnet *ifp,
898 const struct cpl_sge_egr_update *egr)
887{
899{
888 const struct cpl_sge_egr_update *egr;
889 uint32_t oq;
890 struct sge_nm_txq *nm_txq;
891
900 uint32_t oq;
901 struct sge_nm_txq *nm_txq;
902
892 if (cpl->type != FW_TYPE_RSSCPL && cpl->type != FW6_TYPE_RSSCPL)
893 panic("%s: FW_TYPE 0x%x on nm_rxq.", __func__, cpl->type);
894
895 /* data[0] is RSS header */
896 egr = (const void *)&cpl->data[1];
897 oq = be32toh(egr->opcode_qid);
898 MPASS(G_CPL_OPCODE(oq) == CPL_SGE_EGR_UPDATE);
899 nm_txq = (void *)sc->sge.eqmap[G_EGR_QID(oq) - sc->sge.eq_start];
900
901 netmap_tx_irq(ifp, nm_txq->nid);
902}
903
904void
905t4_nm_intr(void *arg)
906{
907 struct sge_nm_rxq *nm_rxq = arg;
908 struct vi_info *vi = nm_rxq->vi;
909 struct adapter *sc = vi->pi->adapter;
910 struct ifnet *ifp = vi->ifp;
911 struct netmap_adapter *na = NA(ifp);
912 struct netmap_kring *kring = &na->rx_rings[nm_rxq->nid];
913 struct netmap_ring *ring = kring->ring;
914 struct iq_desc *d = &nm_rxq->iq_desc[nm_rxq->iq_cidx];
903 oq = be32toh(egr->opcode_qid);
904 MPASS(G_CPL_OPCODE(oq) == CPL_SGE_EGR_UPDATE);
905 nm_txq = (void *)sc->sge.eqmap[G_EGR_QID(oq) - sc->sge.eq_start];
906
907 netmap_tx_irq(ifp, nm_txq->nid);
908}
909
910void
911t4_nm_intr(void *arg)
912{
913 struct sge_nm_rxq *nm_rxq = arg;
914 struct vi_info *vi = nm_rxq->vi;
915 struct adapter *sc = vi->pi->adapter;
916 struct ifnet *ifp = vi->ifp;
917 struct netmap_adapter *na = NA(ifp);
918 struct netmap_kring *kring = &na->rx_rings[nm_rxq->nid];
919 struct netmap_ring *ring = kring->ring;
920 struct iq_desc *d = &nm_rxq->iq_desc[nm_rxq->iq_cidx];
921 const void *cpl;
915 uint32_t lq;
916 u_int n = 0, work = 0;
917 uint8_t opcode;
918 uint32_t fl_cidx = atomic_load_acq_32(&nm_rxq->fl_cidx);
919 u_int fl_credits = fl_cidx & 7;
920
921 while ((d->rsp.u.type_gen & F_RSPD_GEN) == nm_rxq->iq_gen) {
922
923 rmb();
924
925 lq = be32toh(d->rsp.pldbuflen_qid);
926 opcode = d->rss.opcode;
922 uint32_t lq;
923 u_int n = 0, work = 0;
924 uint8_t opcode;
925 uint32_t fl_cidx = atomic_load_acq_32(&nm_rxq->fl_cidx);
926 u_int fl_credits = fl_cidx & 7;
927
928 while ((d->rsp.u.type_gen & F_RSPD_GEN) == nm_rxq->iq_gen) {
929
930 rmb();
931
932 lq = be32toh(d->rsp.pldbuflen_qid);
933 opcode = d->rss.opcode;
934 cpl = &d->cpl[0];
927
928 switch (G_RSPD_TYPE(d->rsp.u.type_gen)) {
929 case X_RSPD_TYPE_FLBUF:
930 if (black_hole != 2) {
931 /* No buffer packing so new buf every time */
932 MPASS(lq & F_RSPD_NEWBUF);
933 }
934
935 /* fall through */
936
937 case X_RSPD_TYPE_CPL:
938 MPASS(opcode < NUM_CPL_CMDS);
939
940 switch (opcode) {
941 case CPL_FW4_MSG:
942 case CPL_FW6_MSG:
935
936 switch (G_RSPD_TYPE(d->rsp.u.type_gen)) {
937 case X_RSPD_TYPE_FLBUF:
938 if (black_hole != 2) {
939 /* No buffer packing so new buf every time */
940 MPASS(lq & F_RSPD_NEWBUF);
941 }
942
943 /* fall through */
944
945 case X_RSPD_TYPE_CPL:
946 MPASS(opcode < NUM_CPL_CMDS);
947
948 switch (opcode) {
949 case CPL_FW4_MSG:
950 case CPL_FW6_MSG:
943 handle_nm_fw6_msg(sc, ifp,
944 (const void *)&d->cpl[0]);
951 cpl = unwrap_nm_fw6_msg(cpl);
952 /* fall through */
953 case CPL_SGE_EGR_UPDATE:
954 handle_nm_sge_egr_update(sc, ifp, cpl);
945 break;
946 case CPL_RX_PKT:
947 ring->slot[fl_cidx].len = G_RSPD_LEN(lq) -
948 sc->params.sge.fl_pktshift;
949 ring->slot[fl_cidx].flags = kring->nkr_slot_flags;
950 fl_cidx += (lq & F_RSPD_NEWBUF) ? 1 : 0;
951 fl_credits += (lq & F_RSPD_NEWBUF) ? 1 : 0;
952 if (__predict_false(fl_cidx == nm_rxq->fl_sidx))

--- 59 unchanged lines hidden ---
955 break;
956 case CPL_RX_PKT:
957 ring->slot[fl_cidx].len = G_RSPD_LEN(lq) -
958 sc->params.sge.fl_pktshift;
959 ring->slot[fl_cidx].flags = kring->nkr_slot_flags;
960 fl_cidx += (lq & F_RSPD_NEWBUF) ? 1 : 0;
961 fl_credits += (lq & F_RSPD_NEWBUF) ? 1 : 0;
962 if (__predict_false(fl_cidx == nm_rxq->fl_sidx))

--- 59 unchanged lines hidden ---