Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f436baf3 authored by Michal Kalderon's avatar Michal Kalderon Committed by David S. Miller
Browse files

qed: Fix iWARP out of order flow



Out of order flow is not working for iWARP.
This patch got cut out from initial series that added out
of order support for iWARP.

Make out of order code common for iWARP and iSCSI.
Add new configuration option CONFIG_QED_OOO. Set by
qedr and qedi Kconfigs.

Fixes: d1abfd0b ("qed: Add iWARP out of order support")

Signed-off-by: default avatarMichal Kalderon <Michal.Kalderon@cavium.com>
Signed-off-by: default avatarManish Rangankar <Manish.Rangankar@cavium.com>
Signed-off-by: default avatarAriel Elior <Ariel.Elior@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 30d240df
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ config INFINIBAND_QEDR
	tristate "QLogic RoCE driver"
	depends on 64BIT && QEDE
	select QED_LL2
	select QED_OOO
	select QED_RDMA
	---help---
	  This driver provides low-level InfiniBand over Ethernet
+3 −0
Original line number Diff line number Diff line
@@ -117,4 +117,7 @@ config QED_ISCSI
config QED_FCOE
	bool

config QED_OOO
	bool

endif # NET_VENDOR_QLOGIC
+2 −1
Original line number Diff line number Diff line
@@ -6,5 +6,6 @@ qed-y := qed_cxt.o qed_dev.o qed_hw.o qed_init_fw_funcs.o qed_init_ops.o \
qed-$(CONFIG_QED_SRIOV) += qed_sriov.o qed_vf.o
qed-$(CONFIG_QED_LL2) += qed_ll2.o
qed-$(CONFIG_QED_RDMA) += qed_roce.o qed_rdma.o qed_iwarp.o
qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o qed_ooo.o
qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o
qed-$(CONFIG_QED_FCOE) += qed_fcoe.o
qed-$(CONFIG_QED_OOO) += qed_ooo.o
+6 −1
Original line number Diff line number Diff line
@@ -1410,13 +1410,18 @@ int qed_iwarp_alloc(struct qed_hwfn *p_hwfn)
	INIT_LIST_HEAD(&p_hwfn->p_rdma_info->iwarp.ep_free_list);
	spin_lock_init(&p_hwfn->p_rdma_info->iwarp.iw_lock);

	return qed_iwarp_prealloc_ep(p_hwfn, true);
	rc = qed_iwarp_prealloc_ep(p_hwfn, true);
	if (rc)
		return rc;

	return qed_ooo_alloc(p_hwfn);
}

void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn)
{
	struct qed_iwarp_info *iwarp_info = &p_hwfn->p_rdma_info->iwarp;

	qed_ooo_free(p_hwfn);
	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->tcp_cid_map, 1);
	kfree(iwarp_info->mpa_bufs);
	kfree(iwarp_info->partial_fpdus);
+13 −3
Original line number Diff line number Diff line
@@ -103,18 +103,28 @@ int qed_ooo_alloc(struct qed_hwfn *p_hwfn)
{
	u16 max_num_archipelagos = 0, cid_base;
	struct qed_ooo_info *p_ooo_info;
	enum protocol_type proto;
	u16 max_num_isles = 0;
	u32 i;

	if (p_hwfn->hw_info.personality != QED_PCI_ISCSI) {
	switch (p_hwfn->hw_info.personality) {
	case QED_PCI_ISCSI:
		proto = PROTOCOLID_ISCSI;
		break;
	case QED_PCI_ETH_RDMA:
	case QED_PCI_ETH_IWARP:
		proto = PROTOCOLID_IWARP;
		break;
	default:
		DP_NOTICE(p_hwfn,
			  "Failed to allocate qed_ooo_info: unknown personality\n");
		return -EINVAL;
	}

	max_num_archipelagos = p_hwfn->pf_params.iscsi_pf_params.num_cons;
	max_num_archipelagos = (u16)qed_cxt_get_proto_cid_count(p_hwfn, proto,
								NULL);
	max_num_isles = QED_MAX_NUM_ISLES + max_num_archipelagos;
	cid_base = (u16)qed_cxt_get_proto_cid_start(p_hwfn, PROTOCOLID_ISCSI);
	cid_base = (u16)qed_cxt_get_proto_cid_start(p_hwfn, proto);

	if (!max_num_archipelagos) {
		DP_NOTICE(p_hwfn,
Loading