IB/hfi1: Set PbcInsertHcrc for TID RDMA packets
All TID RDMA packets are in KDETH packet format and therefore the PbcInsertHcrc must be set properly before sending the packet to hardware. Otherwise, the packets will be dropped by the receiver. By default, HCRC is not inserted for 9B packets without KDETH, and this patch adds that back for TID RDMA packets. Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Kaike Wan <kaike.wan@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
742a3826cf
commit
6b6cf9357f
@ -308,7 +308,7 @@ static inline opcode_handler qp_ok(struct hfi1_packet *packet)
|
|||||||
static u64 hfi1_fault_tx(struct rvt_qp *qp, u8 opcode, u64 pbc)
|
static u64 hfi1_fault_tx(struct rvt_qp *qp, u8 opcode, u64 pbc)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_FAULT_INJECTION
|
#ifdef CONFIG_FAULT_INJECTION
|
||||||
if ((opcode & IB_OPCODE_MSP) == IB_OPCODE_MSP)
|
if ((opcode & IB_OPCODE_MSP) == IB_OPCODE_MSP) {
|
||||||
/*
|
/*
|
||||||
* In order to drop non-IB traffic we
|
* In order to drop non-IB traffic we
|
||||||
* set PbcInsertHrc to NONE (0x2).
|
* set PbcInsertHrc to NONE (0x2).
|
||||||
@ -319,8 +319,9 @@ static u64 hfi1_fault_tx(struct rvt_qp *qp, u8 opcode, u64 pbc)
|
|||||||
* packet will not be delivered to the
|
* packet will not be delivered to the
|
||||||
* correct context.
|
* correct context.
|
||||||
*/
|
*/
|
||||||
|
pbc &= ~PBC_INSERT_HCRC_SMASK;
|
||||||
pbc |= (u64)PBC_IHCRC_NONE << PBC_INSERT_HCRC_SHIFT;
|
pbc |= (u64)PBC_IHCRC_NONE << PBC_INSERT_HCRC_SHIFT;
|
||||||
else
|
} else {
|
||||||
/*
|
/*
|
||||||
* In order to drop regular verbs
|
* In order to drop regular verbs
|
||||||
* traffic we set the PbcTestEbp
|
* traffic we set the PbcTestEbp
|
||||||
@ -330,6 +331,7 @@ static u64 hfi1_fault_tx(struct rvt_qp *qp, u8 opcode, u64 pbc)
|
|||||||
* triggered and will be dropped.
|
* triggered and will be dropped.
|
||||||
*/
|
*/
|
||||||
pbc |= PBC_TEST_EBP;
|
pbc |= PBC_TEST_EBP;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return pbc;
|
return pbc;
|
||||||
}
|
}
|
||||||
@ -683,6 +685,15 @@ bail_txadd:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u64 update_hcrc(u8 opcode, u64 pbc)
|
||||||
|
{
|
||||||
|
if ((opcode & IB_OPCODE_TID_RDMA) == IB_OPCODE_TID_RDMA) {
|
||||||
|
pbc &= ~PBC_INSERT_HCRC_SMASK;
|
||||||
|
pbc |= (u64)PBC_IHCRC_LKDETH << PBC_INSERT_HCRC_SHIFT;
|
||||||
|
}
|
||||||
|
return pbc;
|
||||||
|
}
|
||||||
|
|
||||||
int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
|
int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
|
||||||
u64 pbc)
|
u64 pbc)
|
||||||
{
|
{
|
||||||
@ -728,6 +739,9 @@ int hfi1_verbs_send_dma(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
|
|||||||
qp->srate_mbps,
|
qp->srate_mbps,
|
||||||
vl,
|
vl,
|
||||||
plen);
|
plen);
|
||||||
|
|
||||||
|
/* Update HCRC based on packet opcode */
|
||||||
|
pbc = update_hcrc(ps->opcode, pbc);
|
||||||
}
|
}
|
||||||
tx->wqe = qp->s_wqe;
|
tx->wqe = qp->s_wqe;
|
||||||
ret = build_verbs_tx_desc(tx->sde, len, tx, ahg_info, pbc);
|
ret = build_verbs_tx_desc(tx->sde, len, tx, ahg_info, pbc);
|
||||||
@ -876,6 +890,9 @@ int hfi1_verbs_send_pio(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
|
|||||||
if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode)))
|
if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode)))
|
||||||
pbc = hfi1_fault_tx(qp, ps->opcode, pbc);
|
pbc = hfi1_fault_tx(qp, ps->opcode, pbc);
|
||||||
pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen);
|
pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen);
|
||||||
|
|
||||||
|
/* Update HCRC based on packet opcode */
|
||||||
|
pbc = update_hcrc(ps->opcode, pbc);
|
||||||
}
|
}
|
||||||
if (cb)
|
if (cb)
|
||||||
iowait_pio_inc(&priv->s_iowait);
|
iowait_pio_inc(&priv->s_iowait);
|
||||||
|
Loading…
Reference in New Issue
Block a user