162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
462306a36Sopenharmony_ci * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef __EFC_ELS_H__
862306a36Sopenharmony_ci#define __EFC_ELS_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define EFC_STATUS_INVALID	INT_MAX
1162306a36Sopenharmony_ci#define EFC_ELS_IO_POOL_SZ	1024
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistruct efc_els_io_req {
1462306a36Sopenharmony_ci	struct list_head	list_entry;
1562306a36Sopenharmony_ci	struct kref		ref;
1662306a36Sopenharmony_ci	void			(*release)(struct kref *arg);
1762306a36Sopenharmony_ci	struct efc_node		*node;
1862306a36Sopenharmony_ci	void			*cb;
1962306a36Sopenharmony_ci	u32			els_retries_remaining;
2062306a36Sopenharmony_ci	bool			els_req_free;
2162306a36Sopenharmony_ci	struct timer_list       delay_timer;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	const char		*display_name;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	struct efc_disc_io	io;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_citypedef int(*efc_hw_srrs_cb_t)(void *arg, u32 length, int status,
2962306a36Sopenharmony_ci			       u32 ext_status);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_civoid _efc_els_io_free(struct kref *arg);
3262306a36Sopenharmony_cistruct efc_els_io_req *
3362306a36Sopenharmony_ciefc_els_io_alloc(struct efc_node *node, u32 reqlen);
3462306a36Sopenharmony_cistruct efc_els_io_req *
3562306a36Sopenharmony_ciefc_els_io_alloc_size(struct efc_node *node, u32 reqlen, u32 rsplen);
3662306a36Sopenharmony_civoid efc_els_io_free(struct efc_els_io_req *els);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/* ELS command send */
3962306a36Sopenharmony_citypedef void (*els_cb_t)(struct efc_node *node,
4062306a36Sopenharmony_ci			 struct efc_node_cb *cbdata, void *arg);
4162306a36Sopenharmony_ciint
4262306a36Sopenharmony_ciefc_send_plogi(struct efc_node *node);
4362306a36Sopenharmony_ciint
4462306a36Sopenharmony_ciefc_send_flogi(struct efc_node *node);
4562306a36Sopenharmony_ciint
4662306a36Sopenharmony_ciefc_send_fdisc(struct efc_node *node);
4762306a36Sopenharmony_ciint
4862306a36Sopenharmony_ciefc_send_prli(struct efc_node *node);
4962306a36Sopenharmony_ciint
5062306a36Sopenharmony_ciefc_send_prlo(struct efc_node *node);
5162306a36Sopenharmony_ciint
5262306a36Sopenharmony_ciefc_send_logo(struct efc_node *node);
5362306a36Sopenharmony_ciint
5462306a36Sopenharmony_ciefc_send_adisc(struct efc_node *node);
5562306a36Sopenharmony_ciint
5662306a36Sopenharmony_ciefc_send_pdisc(struct efc_node *node);
5762306a36Sopenharmony_ciint
5862306a36Sopenharmony_ciefc_send_scr(struct efc_node *node);
5962306a36Sopenharmony_ciint
6062306a36Sopenharmony_ciefc_ns_send_rftid(struct efc_node *node);
6162306a36Sopenharmony_ciint
6262306a36Sopenharmony_ciefc_ns_send_rffid(struct efc_node *node);
6362306a36Sopenharmony_ciint
6462306a36Sopenharmony_ciefc_ns_send_gidpt(struct efc_node *node);
6562306a36Sopenharmony_civoid
6662306a36Sopenharmony_ciefc_els_io_cleanup(struct efc_els_io_req *els, int evt, void *arg);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/* ELS acc send */
6962306a36Sopenharmony_ciint
7062306a36Sopenharmony_ciefc_send_ls_acc(struct efc_node *node, u32 ox_id);
7162306a36Sopenharmony_ciint
7262306a36Sopenharmony_ciefc_send_ls_rjt(struct efc_node *node, u32 ox_id, u32 reason_cod,
7362306a36Sopenharmony_ci		u32 reason_code_expl, u32 vendor_unique);
7462306a36Sopenharmony_ciint
7562306a36Sopenharmony_ciefc_send_flogi_p2p_acc(struct efc_node *node, u32 ox_id, u32 s_id);
7662306a36Sopenharmony_ciint
7762306a36Sopenharmony_ciefc_send_flogi_acc(struct efc_node *node, u32 ox_id, u32 is_fport);
7862306a36Sopenharmony_ciint
7962306a36Sopenharmony_ciefc_send_plogi_acc(struct efc_node *node, u32 ox_id);
8062306a36Sopenharmony_ciint
8162306a36Sopenharmony_ciefc_send_prli_acc(struct efc_node *node, u32 ox_id);
8262306a36Sopenharmony_ciint
8362306a36Sopenharmony_ciefc_send_logo_acc(struct efc_node *node, u32 ox_id);
8462306a36Sopenharmony_ciint
8562306a36Sopenharmony_ciefc_send_prlo_acc(struct efc_node *node, u32 ox_id);
8662306a36Sopenharmony_ciint
8762306a36Sopenharmony_ciefc_send_adisc_acc(struct efc_node *node, u32 ox_id);
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciint
9062306a36Sopenharmony_ciefc_bls_send_acc_hdr(struct efc *efc, struct efc_node *node,
9162306a36Sopenharmony_ci		     struct fc_frame_header *hdr);
9262306a36Sopenharmony_ciint
9362306a36Sopenharmony_ciefc_bls_send_rjt_hdr(struct efc_els_io_req *io, struct fc_frame_header *hdr);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ciint
9662306a36Sopenharmony_ciefc_els_io_list_empty(struct efc_node *node, struct list_head *list);
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/* CT */
9962306a36Sopenharmony_ciint
10062306a36Sopenharmony_ciefc_send_ct_rsp(struct efc *efc, struct efc_node *node, u16 ox_id,
10162306a36Sopenharmony_ci		struct fc_ct_hdr *ct_hdr, u32 cmd_rsp_code, u32 reason_code,
10262306a36Sopenharmony_ci		u32 reason_code_explanation);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciint
10562306a36Sopenharmony_ciefc_send_bls_acc(struct efc_node *node, struct fc_frame_header *hdr);
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#endif /* __EFC_ELS_H__ */
108