162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/* Copyright 2014 Cisco Systems, Inc.  All rights reserved. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __SNIC_DISC_H
562306a36Sopenharmony_ci#define __SNIC_DISC_H
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "snic_fwint.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cienum snic_disc_state {
1062306a36Sopenharmony_ci	SNIC_DISC_NONE,
1162306a36Sopenharmony_ci	SNIC_DISC_INIT,
1262306a36Sopenharmony_ci	SNIC_DISC_PENDING,
1362306a36Sopenharmony_ci	SNIC_DISC_DONE
1462306a36Sopenharmony_ci};
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct snic;
1762306a36Sopenharmony_cistruct snic_disc {
1862306a36Sopenharmony_ci	struct list_head tgt_list;
1962306a36Sopenharmony_ci	enum snic_disc_state state;
2062306a36Sopenharmony_ci	struct mutex mutex;
2162306a36Sopenharmony_ci	u16	disc_id;
2262306a36Sopenharmony_ci	u8	req_cnt;
2362306a36Sopenharmony_ci	u32	nxt_tgt_id;
2462306a36Sopenharmony_ci	u32	rtgt_cnt;
2562306a36Sopenharmony_ci	u8	*rtgt_info;
2662306a36Sopenharmony_ci	struct delayed_work disc_timeout;
2762306a36Sopenharmony_ci	void (*cb)(struct snic *);
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define SNIC_TGT_NAM_LEN	16
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cienum snic_tgt_state {
3362306a36Sopenharmony_ci	SNIC_TGT_STAT_NONE,
3462306a36Sopenharmony_ci	SNIC_TGT_STAT_INIT,
3562306a36Sopenharmony_ci	SNIC_TGT_STAT_ONLINE,	/* Target is Online */
3662306a36Sopenharmony_ci	SNIC_TGT_STAT_OFFLINE,	/* Target is Offline */
3762306a36Sopenharmony_ci	SNIC_TGT_STAT_DEL,
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct snic_tgt_priv {
4162306a36Sopenharmony_ci	struct list_head list;
4262306a36Sopenharmony_ci	enum snic_tgt_type typ;
4362306a36Sopenharmony_ci	u16 disc_id;
4462306a36Sopenharmony_ci	char *name[SNIC_TGT_NAM_LEN];
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	union {
4762306a36Sopenharmony_ci		/*DAS Target specific info */
4862306a36Sopenharmony_ci		/*SAN Target specific info */
4962306a36Sopenharmony_ci		u8 dummmy;
5062306a36Sopenharmony_ci	} u;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* snic tgt flags */
5462306a36Sopenharmony_ci#define SNIC_TGT_SCAN_PENDING	0x01
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistruct snic_tgt {
5762306a36Sopenharmony_ci	struct list_head list;
5862306a36Sopenharmony_ci	u16	id;
5962306a36Sopenharmony_ci	u16	channel;
6062306a36Sopenharmony_ci	u32	flags;
6162306a36Sopenharmony_ci	u32	scsi_tgt_id;
6262306a36Sopenharmony_ci	enum snic_tgt_state state;
6362306a36Sopenharmony_ci	struct device dev;
6462306a36Sopenharmony_ci	struct work_struct scan_work;
6562306a36Sopenharmony_ci	struct work_struct del_work;
6662306a36Sopenharmony_ci	struct snic_tgt_priv tdata;
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistruct snic_fw_req;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_civoid snic_disc_init(struct snic_disc *);
7362306a36Sopenharmony_ciint snic_disc_start(struct snic *);
7462306a36Sopenharmony_civoid snic_disc_term(struct snic *);
7562306a36Sopenharmony_ciint snic_report_tgt_cmpl_handler(struct snic *, struct snic_fw_req *);
7662306a36Sopenharmony_ciint snic_tgtinfo_cmpl_handler(struct snic *snic, struct snic_fw_req *fwreq);
7762306a36Sopenharmony_civoid snic_process_report_tgts_rsp(struct work_struct *);
7862306a36Sopenharmony_civoid snic_handle_tgt_disc(struct work_struct *);
7962306a36Sopenharmony_civoid snic_handle_disc(struct work_struct *);
8062306a36Sopenharmony_civoid snic_tgt_dev_release(struct device *);
8162306a36Sopenharmony_civoid snic_tgt_del_all(struct snic *);
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#define dev_to_tgt(d) \
8462306a36Sopenharmony_ci	container_of(d, struct snic_tgt, dev)
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic inline int
8762306a36Sopenharmony_ciis_snic_target(struct device *dev)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	return dev->release == snic_tgt_dev_release;
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define starget_to_tgt(st)	\
9362306a36Sopenharmony_ci	(is_snic_target(((struct scsi_target *) st)->dev.parent) ? \
9462306a36Sopenharmony_ci		dev_to_tgt(st->dev.parent) : NULL)
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#define snic_tgt_to_shost(t)	\
9762306a36Sopenharmony_ci	dev_to_shost(t->dev.parent)
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline int
10062306a36Sopenharmony_cisnic_tgt_chkready(struct snic_tgt *tgt)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	if (tgt->state == SNIC_TGT_STAT_ONLINE)
10362306a36Sopenharmony_ci		return 0;
10462306a36Sopenharmony_ci	else
10562306a36Sopenharmony_ci		return DID_NO_CONNECT << 16;
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ciconst char *snic_tgt_state_to_str(int);
10962306a36Sopenharmony_ciint snic_tgt_scsi_abort_io(struct snic_tgt *);
11062306a36Sopenharmony_ci#endif /* end of  __SNIC_DISC_H */
111