0001
0002
0003
0004 #ifndef _QED_NVMETCP_H
0005 #define _QED_NVMETCP_H
0006
0007 #include <linux/types.h>
0008 #include <linux/list.h>
0009 #include <linux/slab.h>
0010 #include <linux/spinlock.h>
0011 #include <linux/qed/tcp_common.h>
0012 #include <linux/qed/qed_nvmetcp_if.h>
0013 #include <linux/qed/qed_chain.h>
0014 #include "qed.h"
0015 #include "qed_hsi.h"
0016 #include "qed_mcp.h"
0017 #include "qed_sp.h"
0018
0019 #define QED_NVMETCP_FW_CQ_SIZE (4 * 1024)
0020
0021
0022 #define QED_TCP_FLOW_LABEL 0
0023 #define QED_TCP_TWO_MSL_TIMER 4000
0024 #define QED_TCP_HALF_WAY_CLOSE_TIMEOUT 10
0025 #define QED_TCP_MAX_FIN_RT 2
0026 #define QED_TCP_SWS_TIMER 5000
0027
0028 struct qed_nvmetcp_info {
0029 spinlock_t lock;
0030 struct list_head free_list;
0031 u16 max_num_outstanding_tasks;
0032 void *event_context;
0033 nvmetcp_event_cb_t event_cb;
0034 };
0035
0036 struct qed_hash_nvmetcp_con {
0037 struct hlist_node node;
0038 struct qed_nvmetcp_conn *con;
0039 };
0040
0041 struct qed_nvmetcp_conn {
0042 struct list_head list_entry;
0043 bool free_on_delete;
0044 u16 conn_id;
0045 u32 icid;
0046 u32 fw_cid;
0047 u8 layer_code;
0048 u8 offl_flags;
0049 u8 connect_mode;
0050 dma_addr_t sq_pbl_addr;
0051 struct qed_chain r2tq;
0052 struct qed_chain xhq;
0053 struct qed_chain uhq;
0054 u8 local_mac[6];
0055 u8 remote_mac[6];
0056 u8 ip_version;
0057 u8 ka_max_probe_cnt;
0058 u16 vlan_id;
0059 u16 tcp_flags;
0060 u32 remote_ip[4];
0061 u32 local_ip[4];
0062 u32 flow_label;
0063 u32 ka_timeout;
0064 u32 ka_interval;
0065 u32 max_rt_time;
0066 u8 ttl;
0067 u8 tos_or_tc;
0068 u16 remote_port;
0069 u16 local_port;
0070 u16 mss;
0071 u8 rcv_wnd_scale;
0072 u32 rcv_wnd;
0073 u32 cwnd;
0074 u8 update_flag;
0075 u8 default_cq;
0076 u8 abortive_dsconnect;
0077 u32 max_seq_size;
0078 u32 max_recv_pdu_length;
0079 u32 max_send_pdu_length;
0080 u32 first_seq_length;
0081 u16 physical_q0;
0082 u16 physical_q1;
0083 u16 nvmetcp_cccid_max_range;
0084 dma_addr_t nvmetcp_cccid_itid_table_addr;
0085 };
0086
0087 #if IS_ENABLED(CONFIG_QED_NVMETCP)
0088 int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn);
0089 void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn);
0090 void qed_nvmetcp_free(struct qed_hwfn *p_hwfn);
0091
0092 #else
0093 static inline int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn)
0094 {
0095 return -EINVAL;
0096 }
0097
0098 static inline void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn) {}
0099 static inline void qed_nvmetcp_free(struct qed_hwfn *p_hwfn) {}
0100
0101 #endif
0102
0103 #endif