linux/drivers/net/ethernet/qlogic/qed/qed_iwarp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
   2/* QLogic qed NIC Driver
   3 * Copyright (c) 2015-2017  QLogic Corporation
   4 * Copyright (c) 2019-2020 Marvell International Ltd.
   5 */
   6
   7#ifndef _QED_IWARP_H
   8#define _QED_IWARP_H
   9
  10enum qed_iwarp_qp_state {
  11        QED_IWARP_QP_STATE_IDLE,
  12        QED_IWARP_QP_STATE_RTS,
  13        QED_IWARP_QP_STATE_TERMINATE,
  14        QED_IWARP_QP_STATE_CLOSING,
  15        QED_IWARP_QP_STATE_ERROR,
  16};
  17
  18enum qed_iwarp_qp_state qed_roce2iwarp_state(enum qed_roce_qp_state state);
  19
  20#define QED_IWARP_PREALLOC_CNT  (256)
  21
  22#define QED_IWARP_LL2_SYN_TX_SIZE       (128)
  23#define QED_IWARP_LL2_SYN_RX_SIZE       (256)
  24
  25#define QED_IWARP_LL2_OOO_DEF_TX_SIZE   (256)
  26#define QED_IWARP_MAX_OOO               (16)
  27#define QED_IWARP_LL2_OOO_MAX_RX_SIZE   (16384)
  28
  29#define QED_IWARP_HANDLE_INVAL          (0xff)
  30
  31struct qed_iwarp_ll2_buff {
  32        struct qed_iwarp_ll2_buff *piggy_buf;
  33        void *data;
  34        dma_addr_t data_phys_addr;
  35        u32 buff_size;
  36};
  37
  38struct qed_iwarp_ll2_mpa_buf {
  39        struct list_head list_entry;
  40        struct qed_iwarp_ll2_buff *ll2_buf;
  41        struct unaligned_opaque_data data;
  42        u16 tcp_payload_len;
  43        u8 placement_offset;
  44};
  45
  46/* In some cases a fpdu will arrive with only one byte of the header, in this
  47 * case the fpdu_length will be partial (contain only higher byte and
  48 * incomplete bytes will contain the invalid value
  49 */
  50#define QED_IWARP_INVALID_INCOMPLETE_BYTES 0xffff
  51
  52struct qed_iwarp_fpdu {
  53        struct qed_iwarp_ll2_buff *mpa_buf;
  54        void *mpa_frag_virt;
  55        dma_addr_t mpa_frag;
  56        dma_addr_t pkt_hdr;
  57        u16 mpa_frag_len;
  58        u16 fpdu_length;
  59        u16 incomplete_bytes;
  60        u8 pkt_hdr_size;
  61};
  62
  63struct qed_iwarp_info {
  64        struct list_head listen_list;   /* qed_iwarp_listener */
  65        struct list_head ep_list;       /* qed_iwarp_ep */
  66        struct list_head ep_free_list;  /* pre-allocated ep's */
  67        struct list_head mpa_buf_list;  /* list of mpa_bufs */
  68        struct list_head mpa_buf_pending_list;
  69        spinlock_t iw_lock;     /* for iwarp resources */
  70        spinlock_t qp_lock;     /* for teardown races */
  71        u32 rcv_wnd_scale;
  72        u16 rcv_wnd_size;
  73        u16 max_mtu;
  74        u8 mac_addr[ETH_ALEN];
  75        u8 crc_needed;
  76        u8 tcp_flags;
  77        u8 ll2_syn_handle;
  78        u8 ll2_ooo_handle;
  79        u8 ll2_mpa_handle;
  80        u8 peer2peer;
  81        enum mpa_negotiation_mode mpa_rev;
  82        enum mpa_rtr_type rtr_type;
  83        struct qed_iwarp_fpdu *partial_fpdus;
  84        struct qed_iwarp_ll2_mpa_buf *mpa_bufs;
  85        u8 *mpa_intermediate_buf;
  86        u16 max_num_partial_fpdus;
  87};
  88
  89enum qed_iwarp_ep_state {
  90        QED_IWARP_EP_INIT,
  91        QED_IWARP_EP_MPA_REQ_RCVD,
  92        QED_IWARP_EP_MPA_OFFLOADED,
  93        QED_IWARP_EP_ESTABLISHED,
  94        QED_IWARP_EP_CLOSED
  95};
  96
  97union async_output {
  98        struct iwarp_eqe_data_mpa_async_completion mpa_response;
  99        struct iwarp_eqe_data_tcp_async_completion mpa_request;
 100};
 101
 102#define QED_MAX_PRIV_DATA_LEN (512)
 103struct qed_iwarp_ep_memory {
 104        u8 in_pdata[QED_MAX_PRIV_DATA_LEN];
 105        u8 out_pdata[QED_MAX_PRIV_DATA_LEN];
 106        union async_output async_output;
 107};
 108
 109/* Endpoint structure represents a TCP connection. This connection can be
 110 * associated with a QP or not (in which case QP==NULL)
 111 */
 112struct qed_iwarp_ep {
 113        struct list_head list_entry;
 114        struct qed_rdma_qp *qp;
 115        struct qed_iwarp_ep_memory *ep_buffer_virt;
 116        dma_addr_t ep_buffer_phys;
 117        enum qed_iwarp_ep_state state;
 118        int sig;
 119        struct qed_iwarp_cm_info cm_info;
 120        enum tcp_connect_mode connect_mode;
 121        enum mpa_rtr_type rtr_type;
 122        enum mpa_negotiation_mode mpa_rev;
 123        u32 tcp_cid;
 124        u32 cid;
 125        u16 mss;
 126        u8 remote_mac_addr[6];
 127        u8 local_mac_addr[6];
 128        bool mpa_reply_processed;
 129
 130        /* For Passive side - syn packet related data */
 131        u16 syn_ip_payload_length;
 132        struct qed_iwarp_ll2_buff *syn;
 133        dma_addr_t syn_phy_addr;
 134
 135        /* The event_cb function is called for asynchrounous events associated
 136         * with the ep. It is initialized at different entry points depending
 137         * on whether the ep is the tcp connection active side or passive side
 138         * The cb_context is passed to the event_cb function.
 139         */
 140        iwarp_event_handler event_cb;
 141        void *cb_context;
 142};
 143
 144struct qed_iwarp_listener {
 145        struct list_head list_entry;
 146
 147        /* The event_cb function is called for connection requests.
 148         * The cb_context is passed to the event_cb function.
 149         */
 150        iwarp_event_handler event_cb;
 151        void *cb_context;
 152        u32 max_backlog;
 153        u32 ip_addr[4];
 154        u16 port;
 155        u16 vlan;
 156        u8 ip_version;
 157};
 158
 159int qed_iwarp_alloc(struct qed_hwfn *p_hwfn);
 160
 161int qed_iwarp_setup(struct qed_hwfn *p_hwfn,
 162                    struct qed_rdma_start_in_params *params);
 163
 164void qed_iwarp_init_fw_ramrod(struct qed_hwfn *p_hwfn,
 165                              struct iwarp_init_func_ramrod_data *p_ramrod);
 166
 167int qed_iwarp_stop(struct qed_hwfn *p_hwfn);
 168
 169void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn);
 170
 171void qed_iwarp_init_devinfo(struct qed_hwfn *p_hwfn);
 172
 173void qed_iwarp_init_hw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt);
 174
 175int qed_iwarp_create_qp(struct qed_hwfn *p_hwfn,
 176                        struct qed_rdma_qp *qp,
 177                        struct qed_rdma_create_qp_out_params *out_params);
 178
 179int qed_iwarp_modify_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp,
 180                        enum qed_iwarp_qp_state new_state, bool internal);
 181
 182int qed_iwarp_destroy_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp);
 183
 184int qed_iwarp_fw_destroy(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp);
 185
 186void qed_iwarp_query_qp(struct qed_rdma_qp *qp,
 187                        struct qed_rdma_query_qp_out_params *out_params);
 188
 189int
 190qed_iwarp_connect(void *rdma_cxt,
 191                  struct qed_iwarp_connect_in *iparams,
 192                  struct qed_iwarp_connect_out *oparams);
 193
 194int
 195qed_iwarp_create_listen(void *rdma_cxt,
 196                        struct qed_iwarp_listen_in *iparams,
 197                        struct qed_iwarp_listen_out *oparams);
 198
 199int qed_iwarp_accept(void *rdma_cxt, struct qed_iwarp_accept_in *iparams);
 200
 201int qed_iwarp_reject(void *rdma_cxt, struct qed_iwarp_reject_in *iparams);
 202int qed_iwarp_destroy_listen(void *rdma_cxt, void *handle);
 203
 204int qed_iwarp_send_rtr(void *rdma_cxt, struct qed_iwarp_send_rtr_in *iparams);
 205
 206#endif
 207