| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ |
| /* Copyright 2021 Marvell. All rights reserved. */ |
| |
| #ifndef _QED_NVMETCP_H |
| #define _QED_NVMETCP_H |
| |
| #include <linux/types.h> |
| #include <linux/list.h> |
| #include <linux/slab.h> |
| #include <linux/spinlock.h> |
| #include <linux/qed/tcp_common.h> |
| #include <linux/qed/qed_nvmetcp_if.h> |
| #include <linux/qed/qed_chain.h> |
| #include "qed.h" |
| #include "qed_hsi.h" |
| #include "qed_mcp.h" |
| #include "qed_sp.h" |
| |
| #define QED_NVMETCP_FW_CQ_SIZE (4 * 1024) |
| |
| /* tcp parameters */ |
| #define QED_TCP_FLOW_LABEL 0 |
| #define QED_TCP_TWO_MSL_TIMER 4000 |
| #define QED_TCP_HALF_WAY_CLOSE_TIMEOUT 10 |
| #define QED_TCP_MAX_FIN_RT 2 |
| #define QED_TCP_SWS_TIMER 5000 |
| |
| struct qed_nvmetcp_info { |
| spinlock_t lock; /* Connection resources. */ |
| struct list_head free_list; |
| u16 max_num_outstanding_tasks; |
| void *event_context; |
| nvmetcp_event_cb_t event_cb; |
| }; |
| |
| struct qed_hash_nvmetcp_con { |
| struct hlist_node node; |
| struct qed_nvmetcp_conn *con; |
| }; |
| |
| struct qed_nvmetcp_conn { |
| struct list_head list_entry; |
| bool free_on_delete; |
| u16 conn_id; |
| u32 icid; |
| u32 fw_cid; |
| u8 layer_code; |
| u8 offl_flags; |
| u8 connect_mode; |
| dma_addr_t sq_pbl_addr; |
| struct qed_chain r2tq; |
| struct qed_chain xhq; |
| struct qed_chain uhq; |
| u8 local_mac[6]; |
| u8 remote_mac[6]; |
| u8 ip_version; |
| u8 ka_max_probe_cnt; |
| u16 vlan_id; |
| u16 tcp_flags; |
| u32 remote_ip[4]; |
| u32 local_ip[4]; |
| u32 flow_label; |
| u32 ka_timeout; |
| u32 ka_interval; |
| u32 max_rt_time; |
| u8 ttl; |
| u8 tos_or_tc; |
| u16 remote_port; |
| u16 local_port; |
| u16 mss; |
| u8 rcv_wnd_scale; |
| u32 rcv_wnd; |
| u32 cwnd; |
| u8 update_flag; |
| u8 default_cq; |
| u8 abortive_dsconnect; |
| u32 max_seq_size; |
| u32 max_recv_pdu_length; |
| u32 max_send_pdu_length; |
| u32 first_seq_length; |
| u16 physical_q0; |
| u16 physical_q1; |
| u16 nvmetcp_cccid_max_range; |
| dma_addr_t nvmetcp_cccid_itid_table_addr; |
| }; |
| |
| #if IS_ENABLED(CONFIG_QED_NVMETCP) |
| int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn); |
| void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn); |
| void qed_nvmetcp_free(struct qed_hwfn *p_hwfn); |
| |
| #else /* IS_ENABLED(CONFIG_QED_NVMETCP) */ |
| static inline int qed_nvmetcp_alloc(struct qed_hwfn *p_hwfn) |
| { |
| return -EINVAL; |
| } |
| |
| static inline void qed_nvmetcp_setup(struct qed_hwfn *p_hwfn) {} |
| static inline void qed_nvmetcp_free(struct qed_hwfn *p_hwfn) {} |
| |
| #endif /* IS_ENABLED(CONFIG_QED_NVMETCP) */ |
| |
| #endif |