1a3a06db5SMustafa Ismail /* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */ 2a3a06db5SMustafa Ismail /* Copyright (c) 2015 - 2020 Intel Corporation */ 3a3a06db5SMustafa Ismail #ifndef IRDMA_PUDA_H 4a3a06db5SMustafa Ismail #define IRDMA_PUDA_H 5a3a06db5SMustafa Ismail 6a3a06db5SMustafa Ismail #define IRDMA_IEQ_MPA_FRAMING 6 7a3a06db5SMustafa Ismail #define IRDMA_TCP_OFFSET 40 8a3a06db5SMustafa Ismail #define IRDMA_IPV4_PAD 20 9a3a06db5SMustafa Ismail #define IRDMA_MRK_BLK_SZ 512 10a3a06db5SMustafa Ismail 11a3a06db5SMustafa Ismail enum puda_rsrc_type { 12a3a06db5SMustafa Ismail IRDMA_PUDA_RSRC_TYPE_ILQ = 1, 13a3a06db5SMustafa Ismail IRDMA_PUDA_RSRC_TYPE_IEQ, 14a3a06db5SMustafa Ismail IRDMA_PUDA_RSRC_TYPE_MAX, /* Must be last entry */ 15a3a06db5SMustafa Ismail }; 16a3a06db5SMustafa Ismail 17a3a06db5SMustafa Ismail enum puda_rsrc_complete { 18a3a06db5SMustafa Ismail PUDA_CQ_CREATED = 1, 19a3a06db5SMustafa Ismail PUDA_QP_CREATED, 20a3a06db5SMustafa Ismail PUDA_TX_COMPLETE, 21a3a06db5SMustafa Ismail PUDA_RX_COMPLETE, 22a3a06db5SMustafa Ismail PUDA_HASH_CRC_COMPLETE, 23a3a06db5SMustafa Ismail }; 24a3a06db5SMustafa Ismail 25a3a06db5SMustafa Ismail struct irdma_sc_dev; 26a3a06db5SMustafa Ismail struct irdma_sc_qp; 27a3a06db5SMustafa Ismail struct irdma_sc_cq; 28a3a06db5SMustafa Ismail 29a3a06db5SMustafa Ismail struct irdma_puda_cmpl_info { 30a3a06db5SMustafa Ismail struct irdma_qp_uk *qp; 31a3a06db5SMustafa Ismail u8 q_type; 32a3a06db5SMustafa Ismail u8 l3proto; 33a3a06db5SMustafa Ismail u8 l4proto; 34a3a06db5SMustafa Ismail u16 vlan; 35a3a06db5SMustafa Ismail u32 payload_len; 36a3a06db5SMustafa Ismail u32 compl_error; /* No_err=0, else major and minor err code */ 37a3a06db5SMustafa Ismail u32 qp_id; 38a3a06db5SMustafa Ismail u32 wqe_idx; 39a3a06db5SMustafa Ismail bool ipv4:1; 40a3a06db5SMustafa Ismail bool smac_valid:1; 41a3a06db5SMustafa Ismail bool vlan_valid:1; 42a3a06db5SMustafa Ismail u8 smac[ETH_ALEN]; 43a3a06db5SMustafa Ismail }; 44a3a06db5SMustafa Ismail 45a3a06db5SMustafa Ismail struct irdma_puda_send_info { 46a3a06db5SMustafa Ismail u64 paddr; /* Physical address */ 47a3a06db5SMustafa Ismail u32 len; 48a3a06db5SMustafa Ismail u32 ah_id; 49a3a06db5SMustafa Ismail u8 tcplen; 50a3a06db5SMustafa Ismail u8 maclen; 51a3a06db5SMustafa Ismail bool ipv4:1; 52a3a06db5SMustafa Ismail bool do_lpb:1; 53a3a06db5SMustafa Ismail void *scratch; 54a3a06db5SMustafa Ismail }; 55a3a06db5SMustafa Ismail 56a3a06db5SMustafa Ismail struct irdma_puda_buf { 57a3a06db5SMustafa Ismail struct list_head list; /* MUST be first entry */ 58a3a06db5SMustafa Ismail struct irdma_dma_mem mem; /* DMA memory for the buffer */ 59a3a06db5SMustafa Ismail struct irdma_puda_buf *next; /* for alloclist in rsrc struct */ 60a3a06db5SMustafa Ismail struct irdma_virt_mem buf_mem; /* Buffer memory for this buffer */ 61a3a06db5SMustafa Ismail void *scratch; 62a3a06db5SMustafa Ismail u8 *iph; 63a3a06db5SMustafa Ismail u8 *tcph; 64a3a06db5SMustafa Ismail u8 *data; 65a3a06db5SMustafa Ismail u16 datalen; 66a3a06db5SMustafa Ismail u16 vlan_id; 67a3a06db5SMustafa Ismail u8 tcphlen; /* tcp length in bytes */ 68a3a06db5SMustafa Ismail u8 maclen; /* mac length in bytes */ 69a3a06db5SMustafa Ismail u32 totallen; /* machlen+iphlen+tcphlen+datalen */ 70a3a06db5SMustafa Ismail refcount_t refcount; 71a3a06db5SMustafa Ismail u8 hdrlen; 72a3a06db5SMustafa Ismail bool ipv4:1; 73a3a06db5SMustafa Ismail bool vlan_valid:1; 74a3a06db5SMustafa Ismail bool do_lpb:1; /* Loopback buffer */ 75a3a06db5SMustafa Ismail bool smac_valid:1; 76a3a06db5SMustafa Ismail u32 seqnum; 77a3a06db5SMustafa Ismail u32 ah_id; 78a3a06db5SMustafa Ismail u8 smac[ETH_ALEN]; 79a3a06db5SMustafa Ismail struct irdma_sc_vsi *vsi; 80a3a06db5SMustafa Ismail }; 81a3a06db5SMustafa Ismail 82a3a06db5SMustafa Ismail struct irdma_puda_rsrc_info { 83a3a06db5SMustafa Ismail void (*receive)(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf); 84a3a06db5SMustafa Ismail void (*xmit_complete)(struct irdma_sc_vsi *vsi, void *sqwrid); 85a3a06db5SMustafa Ismail enum puda_rsrc_type type; /* ILQ or IEQ */ 86a3a06db5SMustafa Ismail u32 count; 87a3a06db5SMustafa Ismail u32 pd_id; 88a3a06db5SMustafa Ismail u32 cq_id; 89a3a06db5SMustafa Ismail u32 qp_id; 90a3a06db5SMustafa Ismail u32 sq_size; 91a3a06db5SMustafa Ismail u32 rq_size; 92a3a06db5SMustafa Ismail u32 tx_buf_cnt; /* total bufs allocated will be rq_size + tx_buf_cnt */ 93a3a06db5SMustafa Ismail u16 buf_size; 94a3a06db5SMustafa Ismail u8 stats_idx; 95a3a06db5SMustafa Ismail bool stats_idx_valid:1; 96a3a06db5SMustafa Ismail int abi_ver; 97a3a06db5SMustafa Ismail }; 98a3a06db5SMustafa Ismail 99a3a06db5SMustafa Ismail struct irdma_puda_rsrc { 100a3a06db5SMustafa Ismail struct irdma_sc_cq cq; 101a3a06db5SMustafa Ismail struct irdma_sc_qp qp; 102a3a06db5SMustafa Ismail struct irdma_sc_pd sc_pd; 103a3a06db5SMustafa Ismail struct irdma_sc_dev *dev; 104a3a06db5SMustafa Ismail struct irdma_sc_vsi *vsi; 105a3a06db5SMustafa Ismail struct irdma_dma_mem cqmem; 106a3a06db5SMustafa Ismail struct irdma_dma_mem qpmem; 107a3a06db5SMustafa Ismail struct irdma_virt_mem ilq_mem; 108a3a06db5SMustafa Ismail enum puda_rsrc_complete cmpl; 109a3a06db5SMustafa Ismail enum puda_rsrc_type type; 110a3a06db5SMustafa Ismail u16 buf_size; /*buf must be max datalen + tcpip hdr + mac */ 111a3a06db5SMustafa Ismail u32 cq_id; 112a3a06db5SMustafa Ismail u32 qp_id; 113a3a06db5SMustafa Ismail u32 sq_size; 114a3a06db5SMustafa Ismail u32 rq_size; 115a3a06db5SMustafa Ismail u32 cq_size; 116a3a06db5SMustafa Ismail struct irdma_sq_uk_wr_trk_info *sq_wrtrk_array; 117a3a06db5SMustafa Ismail u64 *rq_wrid_array; 118a3a06db5SMustafa Ismail u32 compl_rxwqe_idx; 119a3a06db5SMustafa Ismail u32 rx_wqe_idx; 120a3a06db5SMustafa Ismail u32 rxq_invalid_cnt; 121a3a06db5SMustafa Ismail u32 tx_wqe_avail_cnt; 122a3a06db5SMustafa Ismail struct shash_desc *hash_desc; 123a3a06db5SMustafa Ismail struct list_head txpend; 124a3a06db5SMustafa Ismail struct list_head bufpool; /* free buffers pool list for recv and xmit */ 125a3a06db5SMustafa Ismail u32 alloc_buf_count; 126a3a06db5SMustafa Ismail u32 avail_buf_count; /* snapshot of currently available buffers */ 127a3a06db5SMustafa Ismail spinlock_t bufpool_lock; 128a3a06db5SMustafa Ismail struct irdma_puda_buf *alloclist; 129a3a06db5SMustafa Ismail void (*receive)(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf); 130a3a06db5SMustafa Ismail void (*xmit_complete)(struct irdma_sc_vsi *vsi, void *sqwrid); 131a3a06db5SMustafa Ismail /* puda stats */ 132a3a06db5SMustafa Ismail u64 stats_buf_alloc_fail; 133a3a06db5SMustafa Ismail u64 stats_pkt_rcvd; 134a3a06db5SMustafa Ismail u64 stats_pkt_sent; 135a3a06db5SMustafa Ismail u64 stats_rcvd_pkt_err; 136a3a06db5SMustafa Ismail u64 stats_sent_pkt_q; 137a3a06db5SMustafa Ismail u64 stats_bad_qp_id; 138a3a06db5SMustafa Ismail /* IEQ stats */ 139a3a06db5SMustafa Ismail u64 fpdu_processed; 140a3a06db5SMustafa Ismail u64 bad_seq_num; 141a3a06db5SMustafa Ismail u64 crc_err; 142a3a06db5SMustafa Ismail u64 pmode_count; 143a3a06db5SMustafa Ismail u64 partials_handled; 144a3a06db5SMustafa Ismail u8 stats_idx; 145a3a06db5SMustafa Ismail bool check_crc:1; 146a3a06db5SMustafa Ismail bool stats_idx_valid:1; 147a3a06db5SMustafa Ismail }; 148a3a06db5SMustafa Ismail 149a3a06db5SMustafa Ismail struct irdma_puda_buf *irdma_puda_get_bufpool(struct irdma_puda_rsrc *rsrc); 150a3a06db5SMustafa Ismail void irdma_puda_ret_bufpool(struct irdma_puda_rsrc *rsrc, 151a3a06db5SMustafa Ismail struct irdma_puda_buf *buf); 152a3a06db5SMustafa Ismail void irdma_puda_send_buf(struct irdma_puda_rsrc *rsrc, 153a3a06db5SMustafa Ismail struct irdma_puda_buf *buf); 154*2c4b14eaSShiraz Saleem int irdma_puda_send(struct irdma_sc_qp *qp, struct irdma_puda_send_info *info); 155*2c4b14eaSShiraz Saleem int irdma_puda_create_rsrc(struct irdma_sc_vsi *vsi, 156a3a06db5SMustafa Ismail struct irdma_puda_rsrc_info *info); 157a3a06db5SMustafa Ismail void irdma_puda_dele_rsrc(struct irdma_sc_vsi *vsi, enum puda_rsrc_type type, 158a3a06db5SMustafa Ismail bool reset); 159*2c4b14eaSShiraz Saleem int irdma_puda_poll_cmpl(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq, 160a3a06db5SMustafa Ismail u32 *compl_err); 161a3a06db5SMustafa Ismail 162a3a06db5SMustafa Ismail struct irdma_sc_qp *irdma_ieq_get_qp(struct irdma_sc_dev *dev, 163a3a06db5SMustafa Ismail struct irdma_puda_buf *buf); 164*2c4b14eaSShiraz Saleem int irdma_puda_get_tcpip_info(struct irdma_puda_cmpl_info *info, 165a3a06db5SMustafa Ismail struct irdma_puda_buf *buf); 166*2c4b14eaSShiraz Saleem int irdma_ieq_check_mpacrc(struct shash_desc *desc, void *addr, u32 len, u32 val); 167*2c4b14eaSShiraz Saleem int irdma_init_hash_desc(struct shash_desc **desc); 168a3a06db5SMustafa Ismail void irdma_ieq_mpa_crc_ae(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp); 169a3a06db5SMustafa Ismail void irdma_free_hash_desc(struct shash_desc *desc); 170*2c4b14eaSShiraz Saleem void irdma_ieq_update_tcpip_info(struct irdma_puda_buf *buf, u16 len, u32 seqnum); 171*2c4b14eaSShiraz Saleem int irdma_cqp_qp_create_cmd(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp); 172*2c4b14eaSShiraz Saleem int irdma_cqp_cq_create_cmd(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq); 173*2c4b14eaSShiraz Saleem int irdma_cqp_qp_destroy_cmd(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp); 174a3a06db5SMustafa Ismail void irdma_cqp_cq_destroy_cmd(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq); 175a3a06db5SMustafa Ismail void irdma_puda_ieq_get_ah_info(struct irdma_sc_qp *qp, 176a3a06db5SMustafa Ismail struct irdma_ah_info *ah_info); 177*2c4b14eaSShiraz Saleem int irdma_puda_create_ah(struct irdma_sc_dev *dev, 178*2c4b14eaSShiraz Saleem struct irdma_ah_info *ah_info, bool wait, 179*2c4b14eaSShiraz Saleem enum puda_rsrc_type type, void *cb_param, 180a3a06db5SMustafa Ismail struct irdma_sc_ah **ah); 181a3a06db5SMustafa Ismail void irdma_puda_free_ah(struct irdma_sc_dev *dev, struct irdma_sc_ah *ah); 182a3a06db5SMustafa Ismail void irdma_ieq_process_fpdus(struct irdma_sc_qp *qp, 183a3a06db5SMustafa Ismail struct irdma_puda_rsrc *ieq); 184a3a06db5SMustafa Ismail void irdma_ieq_cleanup_qp(struct irdma_puda_rsrc *ieq, struct irdma_sc_qp *qp); 185a3a06db5SMustafa Ismail #endif /*IRDMA_PROTOS_H */ 186