static inline void disable_ddp(struct adapter *sc, struct toepcb *toep) { KASSERT((toep->ddp_flags & (DDP_ON | DDP_SC_REQ)) == DDP_ON, ("%s: toep %p has bad ddp_flags 0x%x", __func__, toep, toep->ddp_flags)); CTR3(KTR_CXGBE, "%s: tid %u (time %u)", __func__, toep->tid, time_uptime); toep->ddp_flags |= DDP_SC_REQ; t4_set_tcb_field(sc, toep, 1, W_TCB_T_FLAGS, V_TF_RCV_COALESCE_ENABLE(1), V_TF_RCV_COALESCE_ENABLE(1)); t4_set_tcb_field(sc, toep, 1, W_TCB_RX_DDP_FLAGS, V_TF_DDP_OFF(1), V_TF_DDP_OFF(1)); }
/* * Reposts the kernel DDP buffer after it has been previously become full and * invalidated. We just need to reset the offset and adjust the DDP flags. * Conveniently, we can set the flags and the offset with a single message. * Note that this function does not set the buffer length. Again conveniently * our kernel buffer is of fixed size. If the length needs to be changed it * needs to be done separately. */ static void t3_repost_kbuf(struct toepcb *toep, unsigned int bufidx, int modulate, int activate, int nonblock) { struct ddp_state *p = &toep->tp_ddp_state; unsigned long flags; #if 0 SOCKBUF_LOCK_ASSERT(&so->so_rcv); #endif p->buf_state[bufidx].cur_offset = p->kbuf[bufidx]->dgl_offset; p->buf_state[bufidx].flags = p->kbuf_noinval ? DDP_BF_NOINVAL : 0; p->buf_state[bufidx].gl = p->kbuf[bufidx]; p->cur_buf = bufidx; p->kbuf_idx = bufidx; flags = select_ddp_flags(toep, bufidx, nonblock, 0); if (!bufidx) t3_setup_ddpbufs(toep, 0, 0, 0, 0, flags | V_TF_DDP_PSH_NO_INVALIDATE0(p->kbuf_noinval) | V_TF_DDP_PSH_NO_INVALIDATE1(p->kbuf_noinval) | V_TF_DDP_BUF0_VALID(1), V_TF_DDP_BUF0_FLUSH(1) | V_TF_DDP_PSH_NO_INVALIDATE0(1) | V_TF_DDP_PSH_NO_INVALIDATE1(1) | V_TF_DDP_OFF(1) | V_TF_DDP_BUF0_VALID(1) | V_TF_DDP_ACTIVE_BUF(activate), modulate); else t3_setup_ddpbufs(toep, 0, 0, 0, 0, flags | V_TF_DDP_PSH_NO_INVALIDATE0(p->kbuf_noinval) | V_TF_DDP_PSH_NO_INVALIDATE1(p->kbuf_noinval) | V_TF_DDP_BUF1_VALID(1) | V_TF_DDP_ACTIVE_BUF(activate), V_TF_DDP_BUF1_FLUSH(1) | V_TF_DDP_PSH_NO_INVALIDATE0(1) | V_TF_DDP_PSH_NO_INVALIDATE1(1) | V_TF_DDP_OFF(1) | V_TF_DDP_BUF1_VALID(1) | V_TF_DDP_ACTIVE_BUF(1), modulate); }
void enable_ddp(struct adapter *sc, struct toepcb *toep) { KASSERT((toep->ddp_flags & (DDP_ON | DDP_OK | DDP_SC_REQ)) == DDP_OK, ("%s: toep %p has bad ddp_flags 0x%x", __func__, toep, toep->ddp_flags)); CTR3(KTR_CXGBE, "%s: tid %u (time %u)", __func__, toep->tid, time_uptime); toep->ddp_flags |= DDP_SC_REQ; t4_set_tcb_field(sc, toep, 1, W_TCB_RX_DDP_FLAGS, V_TF_DDP_OFF(1) | V_TF_DDP_INDICATE_OUT(1) | V_TF_DDP_BUF0_INDICATE(1) | V_TF_DDP_BUF1_INDICATE(1) | V_TF_DDP_BUF0_VALID(1) | V_TF_DDP_BUF1_VALID(1), V_TF_DDP_BUF0_INDICATE(1) | V_TF_DDP_BUF1_INDICATE(1)); t4_set_tcb_field(sc, toep, 1, W_TCB_T_FLAGS, V_TF_RCV_COALESCE_ENABLE(1), 0); }