// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* * Copyright(c) 2015 - 2019 Intel Corporation. */ #include <linux/net.h> #include <rdma/ib_smi.h> #include "hfi.h" #include "mad.h" #include "verbs_txreq.h" #include "trace_ibhdrs.h" #include "qp.h" /* We support only two types - 9B and 16B for now */ static const hfi1_make_req hfi1_make_ud_req_tbl[2] = …; /** * ud_loopback - handle send on loopback QPs * @sqp: the sending QP * @swqe: the send work request * * This is called from hfi1_make_ud_req() to forward a WQE addressed * to the same HFI. * Note that the receive interrupt handler may be calling hfi1_ud_rcv() * while this is being called. */ static void ud_loopback(struct rvt_qp *sqp, struct rvt_swqe *swqe) { … } static void hfi1_make_bth_deth(struct rvt_qp *qp, struct rvt_swqe *wqe, struct ib_other_headers *ohdr, u16 *pkey, u32 extra_bytes, bool bypass) { … } void hfi1_make_ud_req_9B(struct rvt_qp *qp, struct hfi1_pkt_state *ps, struct rvt_swqe *wqe) { … } void hfi1_make_ud_req_16B(struct rvt_qp *qp, struct hfi1_pkt_state *ps, struct rvt_swqe *wqe) { … } /** * hfi1_make_ud_req - construct a UD request packet * @qp: the QP * @ps: the current packet state * * Assume s_lock is held. * * Return 1 if constructed; otherwise, return 0. */ int hfi1_make_ud_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps) { … } /* * Hardware can't check this so we do it here. * * This is a slightly different algorithm than the standard pkey check. It * special cases the management keys and allows for 0x7fff and 0xffff to be in * the table at the same time. * * @returns the index found or -1 if not found */ int hfi1_lookup_pkey_idx(struct hfi1_ibport *ibp, u16 pkey) { … } void return_cnp_16B(struct hfi1_ibport *ibp, struct rvt_qp *qp, u32 remote_qpn, u16 pkey, u32 slid, u32 dlid, u8 sc5, const struct ib_grh *old_grh) { … } void return_cnp(struct hfi1_ibport *ibp, struct rvt_qp *qp, u32 remote_qpn, u16 pkey, u32 slid, u32 dlid, u8 sc5, const struct ib_grh *old_grh) { … } /* * opa_smp_check() - Do the regular pkey checking, and the additional * checks for SMPs specified in OPAv1 rev 1.0, 9/19/2016 update, section * 9.10.25 ("SMA Packet Checks"). * * Note that: * - Checks are done using the pkey directly from the packet's BTH, * and specifically _not_ the pkey that we attach to the completion, * which may be different. * - These checks are specifically for "non-local" SMPs (i.e., SMPs * which originated on another node). SMPs which are sent from, and * destined to this node are checked in opa_local_smp_check(). * * At the point where opa_smp_check() is called, we know: * - destination QP is QP0 * * opa_smp_check() returns 0 if all checks succeed, 1 otherwise. */ static int opa_smp_check(struct hfi1_ibport *ibp, u16 pkey, u8 sc5, struct rvt_qp *qp, u16 slid, struct opa_smp *smp) { … } /** * hfi1_ud_rcv - receive an incoming UD packet * @packet: the packet structure * * This is called from qp_rcv() to process an incoming UD packet * for the given QP. * Called at interrupt level. */ void hfi1_ud_rcv(struct hfi1_packet *packet) { … }