1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2 /* Copyright 2021 Marvell. All rights reserved. */ 3 4 #ifndef _QED_NVMETCP_H 5 #define _QED_NVMETCP_H 6 7 #include <linux/types.h> 8 #include <linux/list.h> 9 #include <linux/slab.h> 10 #include <linux/spinlock.h> 11 #include <linux/qed/tcp_common.h> 12 #include <linux/qed/qed_nvmetcp_if.h> 13 #include <linux/qed/qed_chain.h> 14 #include "qed.h" 15 #include "qed_hsi.h" 16 #include "qed_mcp.h" 17 #include "qed_sp.h" 18 19 #define QED_NVMETCP_FW_CQ_SIZE (4 * 1024) 20 21 /* tcp parameters */ 22 #define QED_TCP_FLOW_LABEL 0 23 #define QED_TCP_TWO_MSL_TIMER 4000 24 #define QED_TCP_HALF_WAY_CLOSE_TIMEOUT 10 25 #define QED_TCP_MAX_FIN_RT 2 26 #define QED_TCP_SWS_TIMER 5000 27 28 struct qed_nvmetcp_info { 29 spinlock_t lock; /* Connection resources. */ 30 struct list_head free_list; 31 u16 max_num_outstanding_tasks; 32 void *event_context; 33 nvmetcp_event_cb_t event_cb; 34 }; 35 36 struct qed_hash_nvmetcp_con { 37 struct hlist_node node; 38 struct qed_nvmetcp_conn *con; 39 }; 40 41 struct qed_nvmetcp_conn { 42 struct list_head list_entry; 43 bool free_on_delete; 44 u16 conn_id; 45 u32 icid; 46 u32 fw_cid; 47 u8 layer_code; 48 u8 offl_flags; 49 u8 connect_mode; 50 dma_addr_t sq_pbl_addr; 51 struct qed_chain r2tq; 52 struct qed_chain xhq; 53 struct qed_chain uhq; 54 u8 local_mac[6]; 55 u8 remote_mac[6]; 56 u8 ip_version; 57 u8 ka_max_probe_cnt; 58 u16 vlan_id; 59 u16 tcp_flags; 60 u32 remote_ip[4]; 61 u32 local_ip[4]; 62 u32 flow_label; 63 u32 ka_timeout; 64 u32 ka_interval; 65 u32 max_rt_time; 66 u8 ttl; 67 u8 tos_or_tc; 68 u16 remote_port; 69 u16 local_port; 70 u16 mss; 71 u8 rcv_wnd_scale; 72 u32 rcv_wnd; 73 u32 cwnd; 74 u8 update_flag; 75 u8 default_cq; 76 u8 abortive_dsconnect; 77 u32 max_seq_size; 78 u32 max_recv_pdu_length; 79 u32 max_send_pdu_length; 80 u32 first_seq_length; 81 u16 physical_q0; 82 u16 physical_q1; 83 u16 nvmetcp_cccid_max_range; 84 dma_addr_t nvmetcp_cccid_itid_table_addr; 85 }; 86 87 #if IS_ENABLED(CONFIG_QED_NVMETCP) 88 int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn); 89 void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn); 90 void qed_nvmetcp_free(struct qed_hwfn *p_hwfn); 91 92 #else /* IS_ENABLED(CONFIG_QED_NVMETCP) */ 93 static inline int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn) 94 { 95 return -EINVAL; 96 } 97 98 static inline void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn) {} 99 static inline void qed_nvmetcp_free(struct qed_hwfn *p_hwfn) {} 100 101 #endif /* IS_ENABLED(CONFIG_QED_NVMETCP) */ 102 103 #endif 104