qed: Fix iWARP out of order flow
authorMichal Kalderon <Michal.Kalderon@cavium.com>
Tue, 17 Oct 2017 07:23:25 +0000 (10:23 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Oct 2017 11:46:43 +0000 (12:46 +0100)
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: d1abfd0b4ee2 ("qed: Add iWARP out of order support")
Signed-off-by: Michal Kalderon <Michal.Kalderon@cavium.com>
Signed-off-by: Manish Rangankar <Manish.Rangankar@cavium.com>
Signed-off-by: Ariel Elior <Ariel.Elior@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/infiniband/hw/qedr/Kconfig
drivers/net/ethernet/qlogic/Kconfig
drivers/net/ethernet/qlogic/qed/Makefile
drivers/net/ethernet/qlogic/qed/qed_iwarp.c
drivers/net/ethernet/qlogic/qed/qed_ooo.c
drivers/net/ethernet/qlogic/qed/qed_ooo.h
drivers/scsi/qedi/Kconfig

index 6c9f3923e8382cdc25e913283f6fe6e539fbcaf5..60e867d80b880a24284a5ac45fc0e1ce41cfbb52 100644 (file)
@@ -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
index c2e24afbaeb284c6564c1f46f4f40a9564663780..26ddf092e3ecb9f73ed63cac7b71ee17161452c3 100644 (file)
@@ -117,4 +117,7 @@ config QED_ISCSI
 config QED_FCOE
        bool
 
+config QED_OOO
+       bool
+
 endif # NET_VENDOR_QLOGIC
index 82dd47068e1861bdbc368eeb625294f036b8b651..c3c599950574b86b8b2885fca276082f263e3a87 100644 (file)
@@ -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
index b2b1f87864ef6f556e08b9a45ce8a0b9c17db6d1..409041eab189f35a230158cc3275f27479d36572 100644 (file)
@@ -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);
index 0006365301113900f5bed2d0f2be0603ab4fc509..6172354b451c1f72c887d8124fd4915c26084eed 100644 (file)
@@ -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,
index e8ed40b848f546ed373c94df3307f3c24b76d5ba..49c4e75b15b10c485c24c0f7b68e47b1b935b3e3 100644 (file)
@@ -83,7 +83,7 @@ struct qed_ooo_info {
        u16 cid_base;
 };
 
-#if IS_ENABLED(CONFIG_QED_ISCSI)
+#if IS_ENABLED(CONFIG_QED_OOO)
 void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn,
                                struct qed_ooo_info *p_ooo_info,
                                struct ooo_opaque *p_cqe);
index 2ff753ce6e27a49a9e395c52057998b508c3e66f..d1db92d24889333b387127228875b88236ede2a4 100644 (file)
@@ -4,6 +4,7 @@ config QEDI
        depends on QED
        select SCSI_ISCSI_ATTRS
        select QED_LL2
+       select QED_OOO
        select QED_ISCSI
        select ISCSI_BOOT_SYSFS
        ---help---