summaryrefslogtreecommitdiffstats
path: root/sys/dev/cxgbe/t4_sge.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/cxgbe/t4_sge.c')
-rw-r--r--sys/dev/cxgbe/t4_sge.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c
index 05f0779..5440528 100644
--- a/sys/dev/cxgbe/t4_sge.c
+++ b/sys/dev/cxgbe/t4_sge.c
@@ -142,6 +142,8 @@ static int handle_sge_egr_update(struct adapter *,
static int ctrl_tx(struct adapter *, struct sge_ctrlq *, struct mbuf *);
+extern void filter_rpl(struct adapter *, const struct cpl_set_tcb_rpl *);
+
/*
* Called on MOD_LOAD and fills up fl_buf_info[].
*/
@@ -499,11 +501,8 @@ t4_intr_fwd(void *arg)
iq_next(iq);
}
- if (ndesc_total > 0) {
- t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
- V_CIDXINC(ndesc_pending) | V_INGRESSQID((u32)iq->cntxt_id) |
- V_SEINTARM(iq->intr_params));
- }
+ t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_CIDXINC(ndesc_pending) |
+ V_INGRESSQID((u32)iq->cntxt_id) | V_SEINTARM(iq->intr_params));
atomic_cmpset_32(&iq->state, IQS_BUSY, IQS_IDLE);
}
@@ -583,7 +582,9 @@ t4_evt_rx(void *arg)
case CPL_SGE_EGR_UPDATE:
handle_sge_egr_update(sc, (const void *)(rss + 1));
break;
-
+ case CPL_SET_TCB_RPL:
+ filter_rpl(sc, (const void *) (rss + 1));
+ break;
default:
device_printf(sc->dev,
"can't handle CPL opcode %d.", rss->opcode);
@@ -601,13 +602,16 @@ t4_evt_rx(void *arg)
iq_next(iq);
}
- if (ndesc_total > 0) {
- t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
- V_CIDXINC(ndesc_pending) | V_INGRESSQID(iq->cntxt_id) |
- V_SEINTARM(iq->intr_params));
- }
+ t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS), V_CIDXINC(ndesc_pending) |
+ V_INGRESSQID(iq->cntxt_id) | V_SEINTARM(iq->intr_params));
}
+#ifdef T4_PKT_TIMESTAMP
+#define RX_COPY_THRESHOLD (MINCLSIZE - 8)
+#else
+#define RX_COPY_THRESHOLD MINCLSIZE
+#endif
+
void
t4_eth_rx(void *arg)
{
@@ -671,7 +675,22 @@ t4_eth_rx(void *arg)
BUS_DMASYNC_POSTREAD);
m_init(m0, NULL, 0, M_NOWAIT, MT_DATA, M_PKTHDR);
- if (len < MINCLSIZE) {
+
+#ifdef T4_PKT_TIMESTAMP
+ *mtod(m0, uint64_t *) =
+ be64toh(ctrl->u.last_flit & 0xfffffffffffffff);
+ m0->m_data += 8;
+
+ /*
+ * 60 bit timestamp value is *(uint64_t *)m0->m_pktdat. Note
+ * that it is in the leading free-space (see M_LEADINGSPACE) in
+ * the mbuf. The kernel can clobber it during a pullup,
+ * m_copymdata, etc. You need to make sure that the mbuf
+ * reaches you unmolested if you care about the timestamp.
+ */
+#endif
+
+ if (len < RX_COPY_THRESHOLD) {
/* copy data to mbuf, buffer will be recycled */
bcopy(sd->cl, mtod(m0, caddr_t), len);
m0->m_len = len;
OpenPOWER on IntegriCloud