[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20170919174511.GJ5788@mtr-leonro.local>
Date: Tue, 19 Sep 2017 20:45:11 +0300
From: Leon Romanovsky <leon@...nel.org>
To: Michal Kalderon <Michal.Kalderon@...ium.com>
Cc: davem@...emloft.net, netdev@...r.kernel.org,
linux-rdma@...r.kernel.org, dledford@...hat.com,
Ariel Elior <Ariel.Elior@...ium.com>
Subject: Re: [PATCH net-next 2/4] qed: Add iWARP out of order support
On Tue, Sep 19, 2017 at 08:26:17PM +0300, Michal Kalderon wrote:
> iWARP requires OOO support which is already provided by the ll2
> interface (until now was used only for iSCSI offload).
> The changes mostly include opening a ll2 dedicated connection for
> OOO and notifiying the FW about the handle id.
>
> Signed-off-by: Michal Kalderon <Michal.Kalderon@...ium.com>
> Signed-off-by: Ariel Elior <Ariel.Elior@...ium.com>
> ---
> drivers/net/ethernet/qlogic/qed/qed_iwarp.c | 44 +++++++++++++++++++++++++++++
> drivers/net/ethernet/qlogic/qed/qed_iwarp.h | 11 +++++++-
> drivers/net/ethernet/qlogic/qed/qed_rdma.c | 7 +++--
> 3 files changed, 59 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
> index 9d989c9..568e985 100644
> --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
> +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
> @@ -41,6 +41,7 @@
> #include "qed_rdma.h"
> #include "qed_reg_addr.h"
> #include "qed_sp.h"
> +#include "qed_ooo.h"
>
> #define QED_IWARP_ORD_DEFAULT 32
> #define QED_IWARP_IRD_DEFAULT 32
> @@ -119,6 +120,13 @@ static void qed_iwarp_cid_cleaned(struct qed_hwfn *p_hwfn, u32 cid)
> spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
> }
>
> +void qed_iwarp_init_fw_ramrod(struct qed_hwfn *p_hwfn,
> + struct iwarp_init_func_params *p_ramrod)
> +{
> + p_ramrod->ll2_ooo_q_index = RESC_START(p_hwfn, QED_LL2_QUEUE) +
> + p_hwfn->p_rdma_info->iwarp.ll2_ooo_handle;
> +}
> +
> static int qed_iwarp_alloc_cid(struct qed_hwfn *p_hwfn, u32 *cid)
> {
> int rc;
> @@ -1876,6 +1884,16 @@ static int qed_iwarp_ll2_stop(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
> iwarp_info->ll2_syn_handle = QED_IWARP_HANDLE_INVAL;
> }
>
> + if (iwarp_info->ll2_ooo_handle != QED_IWARP_HANDLE_INVAL) {
> + rc = qed_ll2_terminate_connection(p_hwfn,
> + iwarp_info->ll2_ooo_handle);
> + if (rc)
> + DP_INFO(p_hwfn, "Failed to terminate ooo connection\n");
What exactly will you do with this knowledge? Anyway you are not
interested in return values of qed_ll2_terminate_connection function in
this place and other places too.
Why don't you handle EAGAIN returned from the qed_ll2_terminate_connection()?
Thanks
> +
> + qed_ll2_release_connection(p_hwfn, iwarp_info->ll2_ooo_handle);
> + iwarp_info->ll2_ooo_handle = QED_IWARP_HANDLE_INVAL;
> + }
> +
> qed_llh_remove_mac_filter(p_hwfn,
> p_ptt, p_hwfn->p_rdma_info->iwarp.mac_addr);
> return rc;
> @@ -1927,10 +1945,12 @@ static int qed_iwarp_ll2_stop(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
> struct qed_iwarp_info *iwarp_info;
> struct qed_ll2_acquire_data data;
> struct qed_ll2_cbs cbs;
> + u16 n_ooo_bufs;
> int rc = 0;
>
> iwarp_info = &p_hwfn->p_rdma_info->iwarp;
> iwarp_info->ll2_syn_handle = QED_IWARP_HANDLE_INVAL;
> + iwarp_info->ll2_ooo_handle = QED_IWARP_HANDLE_INVAL;
>
> iwarp_info->max_mtu = params->max_mtu;
>
> @@ -1978,6 +1998,29 @@ static int qed_iwarp_ll2_stop(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
> if (rc)
> goto err;
>
> + /* Start OOO connection */
> + data.input.conn_type = QED_LL2_TYPE_OOO;
> + data.input.mtu = params->max_mtu;
> +
> + n_ooo_bufs = (QED_IWARP_MAX_OOO * QED_IWARP_RCV_WND_SIZE_DEF) /
> + iwarp_info->max_mtu;
> + n_ooo_bufs = min_t(u32, n_ooo_bufs, QED_IWARP_LL2_OOO_MAX_RX_SIZE);
> +
> + data.input.rx_num_desc = n_ooo_bufs;
> + data.input.rx_num_ooo_buffers = n_ooo_bufs;
> +
> + data.input.tx_max_bds_per_packet = 1; /* will never be fragmented */
> + data.input.tx_num_desc = QED_IWARP_LL2_OOO_DEF_TX_SIZE;
> + data.p_connection_handle = &iwarp_info->ll2_ooo_handle;
> +
> + rc = qed_ll2_acquire_connection(p_hwfn, &data);
> + if (rc)
> + goto err;
> +
> + rc = qed_ll2_establish_connection(p_hwfn, iwarp_info->ll2_ooo_handle);
> + if (rc)
> + goto err;
> +
> return rc;
> err:
> qed_iwarp_ll2_stop(p_hwfn, p_ptt);
> @@ -2014,6 +2057,7 @@ int qed_iwarp_setup(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
>
> qed_spq_register_async_cb(p_hwfn, PROTOCOLID_IWARP,
> qed_iwarp_async_event);
> + qed_ooo_setup(p_hwfn);
>
> return qed_iwarp_ll2_start(p_hwfn, params, p_ptt);
> }
> diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.h b/drivers/net/ethernet/qlogic/qed/qed_iwarp.h
> index 148ef3c..9e2bfde 100644
> --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.h
> +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.h
> @@ -47,7 +47,12 @@ enum qed_iwarp_qp_state {
> #define QED_IWARP_LL2_SYN_TX_SIZE (128)
> #define QED_IWARP_LL2_SYN_RX_SIZE (256)
> #define QED_IWARP_MAX_SYN_PKT_SIZE (128)
> -#define QED_IWARP_HANDLE_INVAL (0xff)
> +
> +#define QED_IWARP_LL2_OOO_DEF_TX_SIZE (256)
> +#define QED_IWARP_MAX_OOO (16)
> +#define QED_IWARP_LL2_OOO_MAX_RX_SIZE (16384)
> +
> +#define QED_IWARP_HANDLE_INVAL (0xff)
>
> struct qed_iwarp_ll2_buff {
> void *data;
> @@ -67,6 +72,7 @@ struct qed_iwarp_info {
> u8 crc_needed;
> u8 tcp_flags;
> u8 ll2_syn_handle;
> + u8 ll2_ooo_handle;
> u8 peer2peer;
> enum mpa_negotiation_mode mpa_rev;
> enum mpa_rtr_type rtr_type;
> @@ -147,6 +153,9 @@ struct qed_iwarp_listener {
> int qed_iwarp_setup(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
> struct qed_rdma_start_in_params *params);
>
> +void qed_iwarp_init_fw_ramrod(struct qed_hwfn *p_hwfn,
> + struct iwarp_init_func_params *p_ramrod);
> +
> int qed_iwarp_stop(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt);
>
> void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn);
> diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
> index 06715f7..4f46f28 100644
> --- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c
> +++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
> @@ -551,10 +551,13 @@ static int qed_rdma_start_fw(struct qed_hwfn *p_hwfn,
> if (rc)
> return rc;
>
> - if (QED_IS_IWARP_PERSONALITY(p_hwfn))
> + if (QED_IS_IWARP_PERSONALITY(p_hwfn)) {
> + qed_iwarp_init_fw_ramrod(p_hwfn,
> + &p_ent->ramrod.iwarp_init_func.iwarp);
> p_ramrod = &p_ent->ramrod.iwarp_init_func.rdma;
> - else
> + } else {
> p_ramrod = &p_ent->ramrod.roce_init_func.rdma;
> + }
>
> p_params_header = &p_ramrod->params_header;
> p_params_header->cnq_start_offset = (u8)RESC_START(p_hwfn,
> --
> 1.8.3.1
>
Download attachment "signature.asc" of type "application/pgp-signature" (834 bytes)
Powered by blists - more mailing lists