162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */ 262306a36Sopenharmony_ci/* Copyright (c) 2015 - 2020 Intel Corporation */ 362306a36Sopenharmony_ci#ifndef IRDMA_PUDA_H 462306a36Sopenharmony_ci#define IRDMA_PUDA_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#define IRDMA_IEQ_MPA_FRAMING 6 762306a36Sopenharmony_ci#define IRDMA_TCP_OFFSET 40 862306a36Sopenharmony_ci#define IRDMA_IPV4_PAD 20 962306a36Sopenharmony_ci#define IRDMA_MRK_BLK_SZ 512 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cienum puda_rsrc_type { 1262306a36Sopenharmony_ci IRDMA_PUDA_RSRC_TYPE_ILQ = 1, 1362306a36Sopenharmony_ci IRDMA_PUDA_RSRC_TYPE_IEQ, 1462306a36Sopenharmony_ci IRDMA_PUDA_RSRC_TYPE_MAX, /* Must be last entry */ 1562306a36Sopenharmony_ci}; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cienum puda_rsrc_complete { 1862306a36Sopenharmony_ci PUDA_CQ_CREATED = 1, 1962306a36Sopenharmony_ci PUDA_QP_CREATED, 2062306a36Sopenharmony_ci PUDA_TX_COMPLETE, 2162306a36Sopenharmony_ci PUDA_RX_COMPLETE, 2262306a36Sopenharmony_ci PUDA_HASH_CRC_COMPLETE, 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct irdma_sc_dev; 2662306a36Sopenharmony_cistruct irdma_sc_qp; 2762306a36Sopenharmony_cistruct irdma_sc_cq; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistruct irdma_puda_cmpl_info { 3062306a36Sopenharmony_ci struct irdma_qp_uk *qp; 3162306a36Sopenharmony_ci u8 q_type; 3262306a36Sopenharmony_ci u8 l3proto; 3362306a36Sopenharmony_ci u8 l4proto; 3462306a36Sopenharmony_ci u16 vlan; 3562306a36Sopenharmony_ci u32 payload_len; 3662306a36Sopenharmony_ci u32 compl_error; /* No_err=0, else major and minor err code */ 3762306a36Sopenharmony_ci u32 qp_id; 3862306a36Sopenharmony_ci u32 wqe_idx; 3962306a36Sopenharmony_ci bool ipv4:1; 4062306a36Sopenharmony_ci bool smac_valid:1; 4162306a36Sopenharmony_ci bool vlan_valid:1; 4262306a36Sopenharmony_ci u8 smac[ETH_ALEN]; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct irdma_puda_send_info { 4662306a36Sopenharmony_ci u64 paddr; /* Physical address */ 4762306a36Sopenharmony_ci u32 len; 4862306a36Sopenharmony_ci u32 ah_id; 4962306a36Sopenharmony_ci u8 tcplen; 5062306a36Sopenharmony_ci u8 maclen; 5162306a36Sopenharmony_ci bool ipv4:1; 5262306a36Sopenharmony_ci bool do_lpb:1; 5362306a36Sopenharmony_ci void *scratch; 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistruct irdma_puda_buf { 5762306a36Sopenharmony_ci struct list_head list; /* MUST be first entry */ 5862306a36Sopenharmony_ci struct irdma_dma_mem mem; /* DMA memory for the buffer */ 5962306a36Sopenharmony_ci struct irdma_puda_buf *next; /* for alloclist in rsrc struct */ 6062306a36Sopenharmony_ci struct irdma_virt_mem buf_mem; /* Buffer memory for this buffer */ 6162306a36Sopenharmony_ci void *scratch; 6262306a36Sopenharmony_ci u8 *iph; 6362306a36Sopenharmony_ci u8 *tcph; 6462306a36Sopenharmony_ci u8 *data; 6562306a36Sopenharmony_ci u16 datalen; 6662306a36Sopenharmony_ci u16 vlan_id; 6762306a36Sopenharmony_ci u8 tcphlen; /* tcp length in bytes */ 6862306a36Sopenharmony_ci u8 maclen; /* mac length in bytes */ 6962306a36Sopenharmony_ci u32 totallen; /* machlen+iphlen+tcphlen+datalen */ 7062306a36Sopenharmony_ci refcount_t refcount; 7162306a36Sopenharmony_ci u8 hdrlen; 7262306a36Sopenharmony_ci bool ipv4:1; 7362306a36Sopenharmony_ci bool vlan_valid:1; 7462306a36Sopenharmony_ci bool do_lpb:1; /* Loopback buffer */ 7562306a36Sopenharmony_ci bool smac_valid:1; 7662306a36Sopenharmony_ci u32 seqnum; 7762306a36Sopenharmony_ci u32 ah_id; 7862306a36Sopenharmony_ci u8 smac[ETH_ALEN]; 7962306a36Sopenharmony_ci struct irdma_sc_vsi *vsi; 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistruct irdma_puda_rsrc_info { 8362306a36Sopenharmony_ci void (*receive)(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf); 8462306a36Sopenharmony_ci void (*xmit_complete)(struct irdma_sc_vsi *vsi, void *sqwrid); 8562306a36Sopenharmony_ci enum puda_rsrc_type type; /* ILQ or IEQ */ 8662306a36Sopenharmony_ci u32 count; 8762306a36Sopenharmony_ci u32 pd_id; 8862306a36Sopenharmony_ci u32 cq_id; 8962306a36Sopenharmony_ci u32 qp_id; 9062306a36Sopenharmony_ci u32 sq_size; 9162306a36Sopenharmony_ci u32 rq_size; 9262306a36Sopenharmony_ci u32 tx_buf_cnt; /* total bufs allocated will be rq_size + tx_buf_cnt */ 9362306a36Sopenharmony_ci u16 buf_size; 9462306a36Sopenharmony_ci u8 stats_idx; 9562306a36Sopenharmony_ci bool stats_idx_valid:1; 9662306a36Sopenharmony_ci int abi_ver; 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistruct irdma_puda_rsrc { 10062306a36Sopenharmony_ci struct irdma_sc_cq cq; 10162306a36Sopenharmony_ci struct irdma_sc_qp qp; 10262306a36Sopenharmony_ci struct irdma_sc_pd sc_pd; 10362306a36Sopenharmony_ci struct irdma_sc_dev *dev; 10462306a36Sopenharmony_ci struct irdma_sc_vsi *vsi; 10562306a36Sopenharmony_ci struct irdma_dma_mem cqmem; 10662306a36Sopenharmony_ci struct irdma_dma_mem qpmem; 10762306a36Sopenharmony_ci struct irdma_virt_mem ilq_mem; 10862306a36Sopenharmony_ci enum puda_rsrc_complete cmpl; 10962306a36Sopenharmony_ci enum puda_rsrc_type type; 11062306a36Sopenharmony_ci u16 buf_size; /*buf must be max datalen + tcpip hdr + mac */ 11162306a36Sopenharmony_ci u32 cq_id; 11262306a36Sopenharmony_ci u32 qp_id; 11362306a36Sopenharmony_ci u32 sq_size; 11462306a36Sopenharmony_ci u32 rq_size; 11562306a36Sopenharmony_ci u32 cq_size; 11662306a36Sopenharmony_ci struct irdma_sq_uk_wr_trk_info *sq_wrtrk_array; 11762306a36Sopenharmony_ci u64 *rq_wrid_array; 11862306a36Sopenharmony_ci u32 compl_rxwqe_idx; 11962306a36Sopenharmony_ci u32 rx_wqe_idx; 12062306a36Sopenharmony_ci u32 rxq_invalid_cnt; 12162306a36Sopenharmony_ci u32 tx_wqe_avail_cnt; 12262306a36Sopenharmony_ci struct shash_desc *hash_desc; 12362306a36Sopenharmony_ci struct list_head txpend; 12462306a36Sopenharmony_ci struct list_head bufpool; /* free buffers pool list for recv and xmit */ 12562306a36Sopenharmony_ci u32 alloc_buf_count; 12662306a36Sopenharmony_ci u32 avail_buf_count; /* snapshot of currently available buffers */ 12762306a36Sopenharmony_ci spinlock_t bufpool_lock; 12862306a36Sopenharmony_ci struct irdma_puda_buf *alloclist; 12962306a36Sopenharmony_ci void (*receive)(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf); 13062306a36Sopenharmony_ci void (*xmit_complete)(struct irdma_sc_vsi *vsi, void *sqwrid); 13162306a36Sopenharmony_ci /* puda stats */ 13262306a36Sopenharmony_ci u64 stats_buf_alloc_fail; 13362306a36Sopenharmony_ci u64 stats_pkt_rcvd; 13462306a36Sopenharmony_ci u64 stats_pkt_sent; 13562306a36Sopenharmony_ci u64 stats_rcvd_pkt_err; 13662306a36Sopenharmony_ci u64 stats_sent_pkt_q; 13762306a36Sopenharmony_ci u64 stats_bad_qp_id; 13862306a36Sopenharmony_ci /* IEQ stats */ 13962306a36Sopenharmony_ci u64 fpdu_processed; 14062306a36Sopenharmony_ci u64 bad_seq_num; 14162306a36Sopenharmony_ci u64 crc_err; 14262306a36Sopenharmony_ci u64 pmode_count; 14362306a36Sopenharmony_ci u64 partials_handled; 14462306a36Sopenharmony_ci u8 stats_idx; 14562306a36Sopenharmony_ci bool check_crc:1; 14662306a36Sopenharmony_ci bool stats_idx_valid:1; 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistruct irdma_puda_buf *irdma_puda_get_bufpool(struct irdma_puda_rsrc *rsrc); 15062306a36Sopenharmony_civoid irdma_puda_ret_bufpool(struct irdma_puda_rsrc *rsrc, 15162306a36Sopenharmony_ci struct irdma_puda_buf *buf); 15262306a36Sopenharmony_civoid irdma_puda_send_buf(struct irdma_puda_rsrc *rsrc, 15362306a36Sopenharmony_ci struct irdma_puda_buf *buf); 15462306a36Sopenharmony_ciint irdma_puda_send(struct irdma_sc_qp *qp, struct irdma_puda_send_info *info); 15562306a36Sopenharmony_ciint irdma_puda_create_rsrc(struct irdma_sc_vsi *vsi, 15662306a36Sopenharmony_ci struct irdma_puda_rsrc_info *info); 15762306a36Sopenharmony_civoid irdma_puda_dele_rsrc(struct irdma_sc_vsi *vsi, enum puda_rsrc_type type, 15862306a36Sopenharmony_ci bool reset); 15962306a36Sopenharmony_ciint irdma_puda_poll_cmpl(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq, 16062306a36Sopenharmony_ci u32 *compl_err); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistruct irdma_sc_qp *irdma_ieq_get_qp(struct irdma_sc_dev *dev, 16362306a36Sopenharmony_ci struct irdma_puda_buf *buf); 16462306a36Sopenharmony_ciint irdma_puda_get_tcpip_info(struct irdma_puda_cmpl_info *info, 16562306a36Sopenharmony_ci struct irdma_puda_buf *buf); 16662306a36Sopenharmony_ciint irdma_ieq_check_mpacrc(struct shash_desc *desc, void *addr, u32 len, u32 val); 16762306a36Sopenharmony_ciint irdma_init_hash_desc(struct shash_desc **desc); 16862306a36Sopenharmony_civoid irdma_ieq_mpa_crc_ae(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp); 16962306a36Sopenharmony_civoid irdma_free_hash_desc(struct shash_desc *desc); 17062306a36Sopenharmony_civoid irdma_ieq_update_tcpip_info(struct irdma_puda_buf *buf, u16 len, u32 seqnum); 17162306a36Sopenharmony_ciint irdma_cqp_qp_create_cmd(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp); 17262306a36Sopenharmony_ciint irdma_cqp_cq_create_cmd(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq); 17362306a36Sopenharmony_ciint irdma_cqp_qp_destroy_cmd(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp); 17462306a36Sopenharmony_civoid irdma_cqp_cq_destroy_cmd(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq); 17562306a36Sopenharmony_civoid irdma_puda_ieq_get_ah_info(struct irdma_sc_qp *qp, 17662306a36Sopenharmony_ci struct irdma_ah_info *ah_info); 17762306a36Sopenharmony_ciint irdma_puda_create_ah(struct irdma_sc_dev *dev, 17862306a36Sopenharmony_ci struct irdma_ah_info *ah_info, bool wait, 17962306a36Sopenharmony_ci enum puda_rsrc_type type, void *cb_param, 18062306a36Sopenharmony_ci struct irdma_sc_ah **ah); 18162306a36Sopenharmony_civoid irdma_puda_free_ah(struct irdma_sc_dev *dev, struct irdma_sc_ah *ah); 18262306a36Sopenharmony_civoid irdma_ieq_process_fpdus(struct irdma_sc_qp *qp, 18362306a36Sopenharmony_ci struct irdma_puda_rsrc *ieq); 18462306a36Sopenharmony_civoid irdma_ieq_cleanup_qp(struct irdma_puda_rsrc *ieq, struct irdma_sc_qp *qp); 18562306a36Sopenharmony_ci#endif /*IRDMA_PROTOS_H */ 186