mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
cxgbe(4): Consolidate all mk_set_tcb_field_ulp in one place.
MFC after: 1 week Sponsored by: Chelsio Communications
This commit is contained in:
parent
cca3506dc1
commit
64a00f877f
|
@ -963,4 +963,46 @@ port_top_speed(const struct port_info *pi)
|
||||||
return (fwcap_to_speed(pi->link_cfg.pcaps) / 1000);
|
return (fwcap_to_speed(pi->link_cfg.pcaps) / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SET_TCB_FIELD sent as a ULP command looks like this */
|
||||||
|
#define LEN__SET_TCB_FIELD_ULP (sizeof(struct ulp_txpkt) + \
|
||||||
|
sizeof(struct ulptx_idata) + sizeof(struct cpl_set_tcb_field_core))
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
mk_set_tcb_field_ulp(struct adapter *sc, void *cur, int tid, uint16_t word,
|
||||||
|
uint64_t mask, uint64_t val)
|
||||||
|
{
|
||||||
|
struct ulp_txpkt *ulpmc;
|
||||||
|
struct ulptx_idata *ulpsc;
|
||||||
|
struct cpl_set_tcb_field_core *req;
|
||||||
|
|
||||||
|
MPASS(((uintptr_t)cur & 7) == 0);
|
||||||
|
|
||||||
|
ulpmc = cur;
|
||||||
|
ulpmc->cmd_dest = htobe32(V_ULPTX_CMD(ULP_TX_PKT) |
|
||||||
|
V_ULP_TXPKT_DEST(ULP_TXPKT_DEST_TP));
|
||||||
|
ulpmc->len = htobe32(howmany(LEN__SET_TCB_FIELD_ULP, 16));
|
||||||
|
|
||||||
|
ulpsc = (struct ulptx_idata *)(ulpmc + 1);
|
||||||
|
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_IMM));
|
||||||
|
ulpsc->len = htobe32(sizeof(*req));
|
||||||
|
|
||||||
|
req = (struct cpl_set_tcb_field_core *)(ulpsc + 1);
|
||||||
|
OPCODE_TID(req) = htobe32(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid));
|
||||||
|
req->reply_ctrl = htobe16(F_NO_REPLY);
|
||||||
|
req->word_cookie = htobe16(V_WORD(word) | V_COOKIE(0));
|
||||||
|
req->mask = htobe64(mask);
|
||||||
|
req->val = htobe64(val);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ULP_TX is an 8B processor but the firmware transfers WRs in 16B
|
||||||
|
* chunks. The master command for set_tcb_field does not end at a 16B
|
||||||
|
* boundary so it needs to be padded with a no-op.
|
||||||
|
*/
|
||||||
|
MPASS((LEN__SET_TCB_FIELD_ULP & 0xf) != 0);
|
||||||
|
ulpsc = (struct ulptx_idata *)(req + 1);
|
||||||
|
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP));
|
||||||
|
ulpsc->len = htobe32(0);
|
||||||
|
|
||||||
|
return (ulpsc + 1);
|
||||||
|
}
|
||||||
#endif /* __CHELSIO_COMMON_H */
|
#endif /* __CHELSIO_COMMON_H */
|
||||||
|
|
|
@ -1698,40 +1698,6 @@ set_hashfilter(struct adapter *sc, struct t4_filter *t, uint64_t ftuple,
|
||||||
return (rc);
|
return (rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SET_TCB_FIELD sent as a ULP command looks like this */
|
|
||||||
#define LEN__SET_TCB_FIELD_ULP (sizeof(struct ulp_txpkt) + \
|
|
||||||
sizeof(struct ulptx_idata) + sizeof(struct cpl_set_tcb_field_core))
|
|
||||||
|
|
||||||
static void *
|
|
||||||
mk_set_tcb_field_ulp(struct ulp_txpkt *ulpmc, uint64_t word, uint64_t mask,
|
|
||||||
uint64_t val, uint32_t tid, uint32_t qid)
|
|
||||||
{
|
|
||||||
struct ulptx_idata *ulpsc;
|
|
||||||
struct cpl_set_tcb_field_core *req;
|
|
||||||
|
|
||||||
ulpmc->cmd_dest = htonl(V_ULPTX_CMD(ULP_TX_PKT) | V_ULP_TXPKT_DEST(0));
|
|
||||||
ulpmc->len = htobe32(howmany(LEN__SET_TCB_FIELD_ULP, 16));
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(ulpmc + 1);
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_IMM));
|
|
||||||
ulpsc->len = htobe32(sizeof(*req));
|
|
||||||
|
|
||||||
req = (struct cpl_set_tcb_field_core *)(ulpsc + 1);
|
|
||||||
OPCODE_TID(req) = htobe32(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid));
|
|
||||||
req->reply_ctrl = htobe16(V_NO_REPLY(1) | V_QUEUENO(qid));
|
|
||||||
req->word_cookie = htobe16(V_WORD(word) | V_COOKIE(0));
|
|
||||||
req->mask = htobe64(mask);
|
|
||||||
req->val = htobe64(val);
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(req + 1);
|
|
||||||
if (LEN__SET_TCB_FIELD_ULP % 16) {
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP));
|
|
||||||
ulpsc->len = htobe32(0);
|
|
||||||
return (ulpsc + 1);
|
|
||||||
}
|
|
||||||
return (ulpsc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ABORT_REQ sent as a ULP command looks like this */
|
/* ABORT_REQ sent as a ULP command looks like this */
|
||||||
#define LEN__ABORT_REQ_ULP (sizeof(struct ulp_txpkt) + \
|
#define LEN__ABORT_REQ_ULP (sizeof(struct ulp_txpkt) + \
|
||||||
sizeof(struct ulptx_idata) + sizeof(struct cpl_abort_req_core))
|
sizeof(struct ulptx_idata) + sizeof(struct cpl_abort_req_core))
|
||||||
|
@ -1807,14 +1773,15 @@ del_hashfilter_wrlen(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mk_del_hashfilter_wr(int tid, struct work_request_hdr *wrh, int wrlen, int qid)
|
mk_del_hashfilter_wr(struct adapter *sc, int tid, struct work_request_hdr *wrh,
|
||||||
|
int wrlen, int qid)
|
||||||
{
|
{
|
||||||
struct ulp_txpkt *ulpmc;
|
struct ulp_txpkt *ulpmc;
|
||||||
|
|
||||||
INIT_ULPTX_WRH(wrh, wrlen, 0, 0);
|
INIT_ULPTX_WRH(wrh, wrlen, 0, 0);
|
||||||
ulpmc = (struct ulp_txpkt *)(wrh + 1);
|
ulpmc = (struct ulp_txpkt *)(wrh + 1);
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, W_TCB_RSS_INFO,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, tid, W_TCB_RSS_INFO,
|
||||||
V_TCB_RSS_INFO(M_TCB_RSS_INFO), V_TCB_RSS_INFO(qid), tid, 0);
|
V_TCB_RSS_INFO(M_TCB_RSS_INFO), V_TCB_RSS_INFO(qid));
|
||||||
ulpmc = mk_abort_req_ulp(ulpmc, tid);
|
ulpmc = mk_abort_req_ulp(ulpmc, tid);
|
||||||
ulpmc = mk_abort_rpl_ulp(ulpmc, tid);
|
ulpmc = mk_abort_rpl_ulp(ulpmc, tid);
|
||||||
}
|
}
|
||||||
|
@ -1857,7 +1824,7 @@ del_hashfilter(struct adapter *sc, struct t4_filter *t)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
mk_del_hashfilter_wr(t->idx, wr, wrlen, sc->sge.fwq.abs_id);
|
mk_del_hashfilter_wr(sc, t->idx, wr, wrlen, sc->sge.fwq.abs_id);
|
||||||
f->locked = 1;
|
f->locked = 1;
|
||||||
f->pending = 1;
|
f->pending = 1;
|
||||||
commit_wrq_wr(&sc->sge.ctrlq[0], wr, &cookie);
|
commit_wrq_wr(&sc->sge.ctrlq[0], wr, &cookie);
|
||||||
|
|
|
@ -545,37 +545,6 @@ insert_ddp_data(struct toepcb *toep, uint32_t n)
|
||||||
#define LEN__RX_DATA_ACK_ULP (sizeof(struct ulp_txpkt) + \
|
#define LEN__RX_DATA_ACK_ULP (sizeof(struct ulp_txpkt) + \
|
||||||
sizeof(struct ulptx_idata) + sizeof(struct cpl_rx_data_ack_core))
|
sizeof(struct ulptx_idata) + sizeof(struct cpl_rx_data_ack_core))
|
||||||
|
|
||||||
static inline void *
|
|
||||||
mk_set_tcb_field_ulp(struct ulp_txpkt *ulpmc, struct toepcb *toep,
|
|
||||||
uint64_t word, uint64_t mask, uint64_t val)
|
|
||||||
{
|
|
||||||
struct ulptx_idata *ulpsc;
|
|
||||||
struct cpl_set_tcb_field_core *req;
|
|
||||||
|
|
||||||
ulpmc->cmd_dest = htonl(V_ULPTX_CMD(ULP_TX_PKT) | V_ULP_TXPKT_DEST(0));
|
|
||||||
ulpmc->len = htobe32(howmany(LEN__SET_TCB_FIELD_ULP, 16));
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(ulpmc + 1);
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_IMM));
|
|
||||||
ulpsc->len = htobe32(sizeof(*req));
|
|
||||||
|
|
||||||
req = (struct cpl_set_tcb_field_core *)(ulpsc + 1);
|
|
||||||
OPCODE_TID(req) = htobe32(MK_OPCODE_TID(CPL_SET_TCB_FIELD, toep->tid));
|
|
||||||
req->reply_ctrl = htobe16(V_NO_REPLY(1) |
|
|
||||||
V_QUEUENO(toep->ofld_rxq->iq.abs_id));
|
|
||||||
req->word_cookie = htobe16(V_WORD(word) | V_COOKIE(0));
|
|
||||||
req->mask = htobe64(mask);
|
|
||||||
req->val = htobe64(val);
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(req + 1);
|
|
||||||
if (LEN__SET_TCB_FIELD_ULP % 16) {
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP));
|
|
||||||
ulpsc->len = htobe32(0);
|
|
||||||
return (ulpsc + 1);
|
|
||||||
}
|
|
||||||
return (ulpsc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void *
|
static inline void *
|
||||||
mk_rx_data_ack_ulp(struct ulp_txpkt *ulpmc, struct toepcb *toep)
|
mk_rx_data_ack_ulp(struct ulp_txpkt *ulpmc, struct toepcb *toep)
|
||||||
{
|
{
|
||||||
|
@ -634,21 +603,21 @@ mk_update_tcb_for_ddp(struct adapter *sc, struct toepcb *toep, int db_idx,
|
||||||
ulpmc = (struct ulp_txpkt *)(wrh + 1);
|
ulpmc = (struct ulp_txpkt *)(wrh + 1);
|
||||||
|
|
||||||
/* Write the buffer's tag */
|
/* Write the buffer's tag */
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid,
|
||||||
W_TCB_RX_DDP_BUF0_TAG + db_idx,
|
W_TCB_RX_DDP_BUF0_TAG + db_idx,
|
||||||
V_TCB_RX_DDP_BUF0_TAG(M_TCB_RX_DDP_BUF0_TAG),
|
V_TCB_RX_DDP_BUF0_TAG(M_TCB_RX_DDP_BUF0_TAG),
|
||||||
V_TCB_RX_DDP_BUF0_TAG(prsv->prsv_tag));
|
V_TCB_RX_DDP_BUF0_TAG(prsv->prsv_tag));
|
||||||
|
|
||||||
/* Update the current offset in the DDP buffer and its total length */
|
/* Update the current offset in the DDP buffer and its total length */
|
||||||
if (db_idx == 0)
|
if (db_idx == 0)
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid,
|
||||||
W_TCB_RX_DDP_BUF0_OFFSET,
|
W_TCB_RX_DDP_BUF0_OFFSET,
|
||||||
V_TCB_RX_DDP_BUF0_OFFSET(M_TCB_RX_DDP_BUF0_OFFSET) |
|
V_TCB_RX_DDP_BUF0_OFFSET(M_TCB_RX_DDP_BUF0_OFFSET) |
|
||||||
V_TCB_RX_DDP_BUF0_LEN(M_TCB_RX_DDP_BUF0_LEN),
|
V_TCB_RX_DDP_BUF0_LEN(M_TCB_RX_DDP_BUF0_LEN),
|
||||||
V_TCB_RX_DDP_BUF0_OFFSET(offset) |
|
V_TCB_RX_DDP_BUF0_OFFSET(offset) |
|
||||||
V_TCB_RX_DDP_BUF0_LEN(len));
|
V_TCB_RX_DDP_BUF0_LEN(len));
|
||||||
else
|
else
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid,
|
||||||
W_TCB_RX_DDP_BUF1_OFFSET,
|
W_TCB_RX_DDP_BUF1_OFFSET,
|
||||||
V_TCB_RX_DDP_BUF1_OFFSET(M_TCB_RX_DDP_BUF1_OFFSET) |
|
V_TCB_RX_DDP_BUF1_OFFSET(M_TCB_RX_DDP_BUF1_OFFSET) |
|
||||||
V_TCB_RX_DDP_BUF1_LEN((u64)M_TCB_RX_DDP_BUF1_LEN << 32),
|
V_TCB_RX_DDP_BUF1_LEN((u64)M_TCB_RX_DDP_BUF1_LEN << 32),
|
||||||
|
@ -656,7 +625,7 @@ mk_update_tcb_for_ddp(struct adapter *sc, struct toepcb *toep, int db_idx,
|
||||||
V_TCB_RX_DDP_BUF1_LEN((u64)len << 32));
|
V_TCB_RX_DDP_BUF1_LEN((u64)len << 32));
|
||||||
|
|
||||||
/* Update DDP flags */
|
/* Update DDP flags */
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_RX_DDP_FLAGS,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_RX_DDP_FLAGS,
|
||||||
ddp_flags_mask, ddp_flags);
|
ddp_flags_mask, ddp_flags);
|
||||||
|
|
||||||
/* Gratuitous RX_DATA_ACK with RX_MODULATE set to speed up delivery. */
|
/* Gratuitous RX_DATA_ACK with RX_MODULATE set to speed up delivery. */
|
||||||
|
@ -1295,26 +1264,25 @@ set_ddp_ulp_mode(struct toepcb *toep)
|
||||||
* Words 26/27 are zero except for the DDP_OFF flag in
|
* Words 26/27 are zero except for the DDP_OFF flag in
|
||||||
* W_TCB_RX_DDP_FLAGS (27).
|
* W_TCB_RX_DDP_FLAGS (27).
|
||||||
*/
|
*/
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, 26,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, 26,
|
||||||
0xffffffffffffffff, (uint64_t)V_TF_DDP_OFF(1) << 32);
|
0xffffffffffffffff, (uint64_t)V_TF_DDP_OFF(1) << 32);
|
||||||
|
|
||||||
/* Words 28/29 are zero. */
|
/* Words 28/29 are zero. */
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, 28,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, 28,
|
||||||
0xffffffffffffffff, 0);
|
0xffffffffffffffff, 0);
|
||||||
|
|
||||||
/* Words 30/31 are zero. */
|
/* Words 30/31 are zero. */
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, 30,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, 30,
|
||||||
0xffffffffffffffff, 0);
|
0xffffffffffffffff, 0);
|
||||||
|
|
||||||
/* Set the ULP mode to ULP_MODE_TCPDDP. */
|
/* Set the ULP mode to ULP_MODE_TCPDDP. */
|
||||||
toep->params.ulp_mode = ULP_MODE_TCPDDP;
|
toep->params.ulp_mode = ULP_MODE_TCPDDP;
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_ULP_TYPE,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_ULP_TYPE,
|
||||||
V_TCB_ULP_TYPE(M_TCB_ULP_TYPE),
|
V_TCB_ULP_TYPE(M_TCB_ULP_TYPE), V_TCB_ULP_TYPE(ULP_MODE_TCPDDP));
|
||||||
V_TCB_ULP_TYPE(ULP_MODE_TCPDDP));
|
|
||||||
|
|
||||||
#ifdef USE_DDP_RX_FLOW_CONTROL
|
#ifdef USE_DDP_RX_FLOW_CONTROL
|
||||||
/* Set TF_RX_FLOW_CONTROL_DDP. */
|
/* Set TF_RX_FLOW_CONTROL_DDP. */
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_T_FLAGS,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_T_FLAGS,
|
||||||
V_TF_RX_FLOW_CONTROL_DDP(1), V_TF_RX_FLOW_CONTROL_DDP(1));
|
V_TF_RX_FLOW_CONTROL_DDP(1), V_TF_RX_FLOW_CONTROL_DDP(1));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1075,41 +1075,6 @@ do_rx_data_tls(const struct cpl_rx_data *cpl, struct toepcb *toep,
|
||||||
m_freem(m);
|
m_freem(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SET_TCB_FIELD sent as a ULP command looks like this */
|
|
||||||
#define LEN__SET_TCB_FIELD_ULP (sizeof(struct ulp_txpkt) + \
|
|
||||||
sizeof(struct ulptx_idata) + sizeof(struct cpl_set_tcb_field_core))
|
|
||||||
|
|
||||||
static inline void *
|
|
||||||
mk_set_tcb_field_ulp(struct ulp_txpkt *ulpmc, struct toepcb *toep,
|
|
||||||
uint64_t word, uint64_t mask, uint64_t val)
|
|
||||||
{
|
|
||||||
struct ulptx_idata *ulpsc;
|
|
||||||
struct cpl_set_tcb_field_core *req;
|
|
||||||
|
|
||||||
ulpmc->cmd_dest = htonl(V_ULPTX_CMD(ULP_TX_PKT) | V_ULP_TXPKT_DEST(0));
|
|
||||||
ulpmc->len = htobe32(howmany(LEN__SET_TCB_FIELD_ULP, 16));
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(ulpmc + 1);
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_IMM));
|
|
||||||
ulpsc->len = htobe32(sizeof(*req));
|
|
||||||
|
|
||||||
req = (struct cpl_set_tcb_field_core *)(ulpsc + 1);
|
|
||||||
OPCODE_TID(req) = htobe32(MK_OPCODE_TID(CPL_SET_TCB_FIELD, toep->tid));
|
|
||||||
req->reply_ctrl = htobe16(V_NO_REPLY(1) |
|
|
||||||
V_QUEUENO(toep->ofld_rxq->iq.abs_id));
|
|
||||||
req->word_cookie = htobe16(V_WORD(word) | V_COOKIE(0));
|
|
||||||
req->mask = htobe64(mask);
|
|
||||||
req->val = htobe64(val);
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(req + 1);
|
|
||||||
if (LEN__SET_TCB_FIELD_ULP % 16) {
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP));
|
|
||||||
ulpsc->len = htobe32(0);
|
|
||||||
return (ulpsc + 1);
|
|
||||||
}
|
|
||||||
return (ulpsc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send a work request setting multiple TCB fields to enable
|
* Send a work request setting multiple TCB fields to enable
|
||||||
* ULP_MODE_TLS.
|
* ULP_MODE_TLS.
|
||||||
|
@ -1164,7 +1129,7 @@ tls_update_tcb(struct adapter *sc, struct toepcb *toep, uint64_t seqno)
|
||||||
* decryption. Word 30 is zero and Word 31 contains
|
* decryption. Word 30 is zero and Word 31 contains
|
||||||
* the keyid.
|
* the keyid.
|
||||||
*/
|
*/
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, 26,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, 26,
|
||||||
0xffffffffffffffff, 0);
|
0xffffffffffffffff, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1173,15 +1138,15 @@ tls_update_tcb(struct adapter *sc, struct toepcb *toep, uint64_t seqno)
|
||||||
* units of 64 bytes.
|
* units of 64 bytes.
|
||||||
*/
|
*/
|
||||||
key_offset = toep->tls.rx_key_addr - sc->vres.key.start;
|
key_offset = toep->tls.rx_key_addr - sc->vres.key.start;
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, 30,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, 30,
|
||||||
0xffffffffffffffff,
|
0xffffffffffffffff,
|
||||||
(uint64_t)V_TCB_RX_TLS_KEY_TAG(key_offset / 64) << 32);
|
(uint64_t)V_TCB_RX_TLS_KEY_TAG(key_offset / 64) << 32);
|
||||||
|
|
||||||
CTR3(KTR_CXGBE, "%s: tid %d enable TLS seqno %lu", __func__,
|
CTR3(KTR_CXGBE, "%s: tid %d enable TLS seqno %lu", __func__,
|
||||||
toep->tid, seqno);
|
toep->tid, seqno);
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_TLS_SEQ,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_TLS_SEQ,
|
||||||
V_TCB_TLS_SEQ(M_TCB_TLS_SEQ), V_TCB_TLS_SEQ(seqno));
|
V_TCB_TLS_SEQ(M_TCB_TLS_SEQ), V_TCB_TLS_SEQ(seqno));
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_ULP_RAW,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_ULP_RAW,
|
||||||
V_TCB_ULP_RAW(M_TCB_ULP_RAW),
|
V_TCB_ULP_RAW(M_TCB_ULP_RAW),
|
||||||
V_TCB_ULP_RAW((V_TF_TLS_KEY_SIZE(3) | V_TF_TLS_CONTROL(1) |
|
V_TCB_ULP_RAW((V_TF_TLS_KEY_SIZE(3) | V_TF_TLS_CONTROL(1) |
|
||||||
V_TF_TLS_ACTIVE(1) | V_TF_TLS_ENABLE(1))));
|
V_TF_TLS_ACTIVE(1) | V_TF_TLS_ENABLE(1))));
|
||||||
|
@ -1191,12 +1156,11 @@ tls_update_tcb(struct adapter *sc, struct toepcb *toep, uint64_t seqno)
|
||||||
|
|
||||||
/* Set the ULP mode to ULP_MODE_TLS. */
|
/* Set the ULP mode to ULP_MODE_TLS. */
|
||||||
toep->params.ulp_mode = ULP_MODE_TLS;
|
toep->params.ulp_mode = ULP_MODE_TLS;
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_ULP_TYPE,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_ULP_TYPE,
|
||||||
V_TCB_ULP_TYPE(M_TCB_ULP_TYPE),
|
V_TCB_ULP_TYPE(M_TCB_ULP_TYPE), V_TCB_ULP_TYPE(ULP_MODE_TLS));
|
||||||
V_TCB_ULP_TYPE(ULP_MODE_TLS));
|
|
||||||
|
|
||||||
/* Clear TF_RX_QUIESCE. */
|
/* Clear TF_RX_QUIESCE. */
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_T_FLAGS,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_T_FLAGS,
|
||||||
V_TF_RX_QUIESCE(1), 0);
|
V_TF_RX_QUIESCE(1), 0);
|
||||||
|
|
||||||
t4_wrq_tx(sc, wr);
|
t4_wrq_tx(sc, wr);
|
||||||
|
|
|
@ -838,40 +838,6 @@ t4_alloc_tls_session(struct toedev *tod, struct tcpcb *tp,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* SET_TCB_FIELD sent as a ULP command looks like this */
|
|
||||||
#define LEN__SET_TCB_FIELD_ULP (sizeof(struct ulp_txpkt) + \
|
|
||||||
sizeof(struct ulptx_idata) + sizeof(struct cpl_set_tcb_field_core))
|
|
||||||
|
|
||||||
static void *
|
|
||||||
mk_set_tcb_field_ulp(struct ulp_txpkt *ulpmc, uint64_t word, uint64_t mask,
|
|
||||||
uint64_t val, uint32_t tid)
|
|
||||||
{
|
|
||||||
struct ulptx_idata *ulpsc;
|
|
||||||
struct cpl_set_tcb_field_core *req;
|
|
||||||
|
|
||||||
ulpmc->cmd_dest = htonl(V_ULPTX_CMD(ULP_TX_PKT) | V_ULP_TXPKT_DEST(0));
|
|
||||||
ulpmc->len = htobe32(howmany(LEN__SET_TCB_FIELD_ULP, 16));
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(ulpmc + 1);
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_IMM));
|
|
||||||
ulpsc->len = htobe32(sizeof(*req));
|
|
||||||
|
|
||||||
req = (struct cpl_set_tcb_field_core *)(ulpsc + 1);
|
|
||||||
OPCODE_TID(req) = htobe32(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid));
|
|
||||||
req->reply_ctrl = htobe16(V_NO_REPLY(1));
|
|
||||||
req->word_cookie = htobe16(V_WORD(word) | V_COOKIE(0));
|
|
||||||
req->mask = htobe64(mask);
|
|
||||||
req->val = htobe64(val);
|
|
||||||
|
|
||||||
ulpsc = (struct ulptx_idata *)(req + 1);
|
|
||||||
if (LEN__SET_TCB_FIELD_ULP % 16) {
|
|
||||||
ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP));
|
|
||||||
ulpsc->len = htobe32(0);
|
|
||||||
return (ulpsc + 1);
|
|
||||||
}
|
|
||||||
return (ulpsc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_mss_flowc_wr(struct adapter *sc, struct toepcb *toep)
|
send_mss_flowc_wr(struct adapter *sc, struct toepcb *toep)
|
||||||
{
|
{
|
||||||
|
@ -958,10 +924,10 @@ t4_pmtu_update(struct toedev *tod, struct tcpcb *tp, tcp_seq seq, int mtu)
|
||||||
}
|
}
|
||||||
INIT_ULPTX_WRH(wrh, len, 1, 0); /* atomic */
|
INIT_ULPTX_WRH(wrh, len, 1, 0); /* atomic */
|
||||||
ulpmc = (struct ulp_txpkt *)(wrh + 1);
|
ulpmc = (struct ulp_txpkt *)(wrh + 1);
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, W_TCB_T_MAXSEG,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_T_MAXSEG,
|
||||||
V_TCB_T_MAXSEG(M_TCB_T_MAXSEG), V_TCB_T_MAXSEG(idx), toep->tid);
|
V_TCB_T_MAXSEG(M_TCB_T_MAXSEG), V_TCB_T_MAXSEG(idx));
|
||||||
ulpmc = mk_set_tcb_field_ulp(ulpmc, W_TCB_TIMESTAMP,
|
ulpmc = mk_set_tcb_field_ulp(sc, ulpmc, toep->tid, W_TCB_TIMESTAMP,
|
||||||
V_TCB_TIMESTAMP(0x7FFFFULL << 11), 0, toep->tid);
|
V_TCB_TIMESTAMP(0x7FFFFULL << 11), 0);
|
||||||
commit_wrq_wr(toep->ctrlq, wrh, &cookie);
|
commit_wrq_wr(toep->ctrlq, wrh, &cookie);
|
||||||
|
|
||||||
/* Update the software toepcb and tcpcb. */
|
/* Update the software toepcb and tcpcb. */
|
||||||
|
|
Loading…
Reference in a new issue