|
@@ -2038,13 +2038,20 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
|
|
|
struct sge *s = &q->adap->sge;
|
|
|
int cpl_trace_pkt = is_t4(q->adap->params.chip) ?
|
|
|
CPL_TRACE_PKT : CPL_TRACE_PKT_T5;
|
|
|
+ u16 err_vec;
|
|
|
struct port_info *pi;
|
|
|
|
|
|
if (unlikely(*(u8 *)rsp == cpl_trace_pkt))
|
|
|
return handle_trace_pkt(q->adap, si);
|
|
|
|
|
|
pkt = (const struct cpl_rx_pkt *)rsp;
|
|
|
- csum_ok = pkt->csum_calc && !pkt->err_vec &&
|
|
|
+ /* Compressed error vector is enabled for T6 only */
|
|
|
+ if (q->adap->params.tp.rx_pkt_encap)
|
|
|
+ err_vec = T6_COMPR_RXERR_VEC_G(be16_to_cpu(pkt->err_vec));
|
|
|
+ else
|
|
|
+ err_vec = be16_to_cpu(pkt->err_vec);
|
|
|
+
|
|
|
+ csum_ok = pkt->csum_calc && !err_vec &&
|
|
|
(q->netdev->features & NETIF_F_RXCSUM);
|
|
|
if ((pkt->l2info & htonl(RXF_TCP_F)) &&
|
|
|
!(cxgb_poll_busy_polling(q)) &&
|
|
@@ -2092,7 +2099,12 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
|
|
|
if (!(pkt->l2info & cpu_to_be32(CPL_RX_PKT_FLAGS))) {
|
|
|
if ((pkt->l2info & cpu_to_be32(RXF_FCOE_F)) &&
|
|
|
(pi->fcoe.flags & CXGB_FCOE_ENABLED)) {
|
|
|
- if (!(pkt->err_vec & cpu_to_be16(RXERR_CSUM_F)))
|
|
|
+ if (q->adap->params.tp.rx_pkt_encap)
|
|
|
+ csum_ok = err_vec &
|
|
|
+ T6_COMPR_RXERR_SUM_F;
|
|
|
+ else
|
|
|
+ csum_ok = err_vec & RXERR_CSUM_F;
|
|
|
+ if (!csum_ok)
|
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
}
|
|
|
}
|