X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Fbnxt_rxr.c;h=ee1acb1969637f6ae90b3dfeaaf782d7ac14654a;hb=dd8384a4f5dd7e04cd3bc7ded0f0a6d9c79d25b4;hp=a657150d156d1f0cd4c33cf131ee11ca025e5e7d;hpb=d256c73c11229c0a7eae32a7e0baaa7a457000e1;p=dpdk.git diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c index a657150d15..ee1acb1969 100644 --- a/drivers/net/bnxt/bnxt_rxr.c +++ b/drivers/net/bnxt/bnxt_rxr.c @@ -409,7 +409,7 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1, uint32_t cfa_code; uint32_t meta_fmt; uint32_t meta; - uint32_t eem = 0; + bool gfid = false; uint32_t mark_id; uint32_t flags2; int rc; @@ -417,53 +417,70 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1, cfa_code = rte_le_to_cpu_16(rxcmp1->cfa_code); flags2 = rte_le_to_cpu_32(rxcmp1->flags2); meta = rte_le_to_cpu_32(rxcmp1->metadata); - if (meta) { - meta >>= BNXT_RX_META_CFA_CODE_SHIFT; - /* The flags field holds extra bits of info from [6:4] - * which indicate if the flow is in TCAM or EM or EEM + /* + * The flags field holds extra bits of info from [6:4] + * which indicate if the flow is in TCAM or EM or EEM + */ + meta_fmt = (flags2 & BNXT_CFA_META_FMT_MASK) >> + BNXT_CFA_META_FMT_SHFT; + + switch (meta_fmt) { + case 0: + /* Not an LFID or GFID, a flush cmd. */ + goto skip_mark; + case 4: + case 5: + /* + * EM/TCAM case + * Assume that EM doesn't support Mark due to GFID + * collisions with EEM. Simply return without setting the mark + * in the mbuf. */ - meta_fmt = (flags2 & BNXT_CFA_META_FMT_MASK) >> - BNXT_CFA_META_FMT_SHFT; - /* meta_fmt == 4 => 'b100 => 'b10x => EM. - * meta_fmt == 5 => 'b101 => 'b10x => EM + VLAN - * meta_fmt == 6 => 'b110 => 'b11x => EEM - * meta_fmt == 7 => 'b111 => 'b11x => EEM + VLAN. + if (BNXT_CFA_META_EM_TEST(meta)) + goto skip_mark; + /* + * It is a TCAM entry, so it is an LFID. The TCAM IDX and Mode + * can also be determined by decoding the meta_data. We are not + * using these for now. */ - meta_fmt >>= BNXT_CFA_META_FMT_EM_EEM_SHFT; - - eem = meta_fmt == BNXT_CFA_META_FMT_EEM; + break; + case 6: + case 7: + /* EEM Case, only using gfid in EEM for now. */ + gfid = true; - /* For EEM flows, The first part of cfa_code is 16 bits. + /* + * For EEM flows, The first part of cfa_code is 16 bits. * The second part is embedded in the * metadata field from bit 19 onwards. The driver needs to * ignore the first 19 bits of metadata and use the next 12 * bits as higher 12 bits of cfa_code. */ - if (eem) - cfa_code |= meta << BNXT_CFA_CODE_META_SHIFT; + meta >>= BNXT_RX_META_CFA_CODE_SHIFT; + cfa_code |= meta << BNXT_CFA_CODE_META_SHIFT; + break; + default: + /* For other values, the cfa_code is assumed to be an LFID. */ + break; } if (cfa_code) { - mbuf->hash.fdir.hi = 0; - mbuf->hash.fdir.id = 0; - if (eem) - rc = ulp_mark_db_mark_get(&bp->ulp_ctx, true, - cfa_code, &mark_id); - else - rc = ulp_mark_db_mark_get(&bp->ulp_ctx, false, - cfa_code, &mark_id); - /* If the above fails, simply return and don't add the mark to - * mbuf - */ - if (rc) + rc = ulp_mark_db_mark_get(bp->ulp_ctx, gfid, + cfa_code, &mark_id); + if (!rc) { + /* Got the mark, write it to the mbuf and return */ + mbuf->hash.fdir.hi = mark_id; + mbuf->udata64 = (cfa_code & 0xffffffffull) << 32; + mbuf->hash.fdir.id = rxcmp1->cfa_code; + mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID; return; - - mbuf->hash.fdir.hi = mark_id; - mbuf->udata64 = (cfa_code & 0xffffffffull) << 32; - mbuf->hash.fdir.id = rxcmp1->cfa_code; - mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID; + } } + +skip_mark: + mbuf->hash.fdir.hi = 0; + mbuf->hash.fdir.id = 0; } void bnxt_set_mark_in_mbuf(struct bnxt *bp, @@ -597,7 +614,7 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt, mbuf->ol_flags |= PKT_RX_RSS_HASH; } - if (bp->truflow) + if (BNXT_TRUFLOW_EN(bp)) bnxt_ulp_set_mark_in_mbuf(rxq->bp, rxcmp1, mbuf); else bnxt_set_mark_in_mbuf(rxq->bp, rxcmp1, mbuf); @@ -970,9 +987,9 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq) rxq->queue_id, i, ring->ring_size); break; } - rxr->rx_prod = prod; - prod = RING_NEXT(rxr->rx_ring_struct, prod); } + rxr->rx_prod = prod; + prod = RING_NEXT(rxr->rx_ring_struct, prod); } ring = rxr->ag_ring_struct; @@ -988,9 +1005,9 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq) rxq->queue_id, i, ring->ring_size); break; } - rxr->ag_prod = prod; - prod = RING_NEXT(rxr->ag_ring_struct, prod); } + rxr->ag_prod = prod; + prod = RING_NEXT(rxr->ag_ring_struct, prod); } PMD_DRV_LOG(DEBUG, "AGG Done!\n");