brintos

brintos / linux-shallow public Read only

0
0
Text · 11.3 KiB · 6c76129 Raw
354 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * zfcp device driver4 *5 * Global definitions for the zfcp device driver.6 *7 * Copyright IBM Corp. 2002, 20208 */9 10#ifndef ZFCP_DEF_H11#define ZFCP_DEF_H12 13/*************************** INCLUDES *****************************************/14 15#include <linux/init.h>16#include <linux/moduleparam.h>17#include <linux/major.h>18#include <linux/blkdev.h>19#include <linux/delay.h>20#include <linux/timer.h>21#include <linux/slab.h>22#include <linux/mempool.h>23#include <linux/syscalls.h>24#include <linux/scatterlist.h>25#include <linux/ioctl.h>26#include <scsi/fc/fc_fs.h>27#include <scsi/fc/fc_gs.h>28#include <scsi/scsi.h>29#include <scsi/scsi_tcq.h>30#include <scsi/scsi_cmnd.h>31#include <scsi/scsi_device.h>32#include <scsi/scsi_host.h>33#include <scsi/scsi_transport.h>34#include <scsi/scsi_transport_fc.h>35#include <scsi/scsi_bsg_fc.h>36#include <asm/ccwdev.h>37#include <asm/debug.h>38#include <asm/ebcdic.h>39#include <asm/sysinfo.h>40#include "zfcp_fsf.h"41#include "zfcp_fc.h"42#include "zfcp_qdio.h"43 44/********************* FSF SPECIFIC DEFINES *********************************/45 46/* ATTENTION: value must not be used by hardware */47#define FSF_QTCB_UNSOLICITED_STATUS		0x630548 49/*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/50 51/*52 * Note, the leftmost 12 status bits (3 nibbles) are common among adapter, port53 * and unit. This is a mask for bitwise 'and' with status values.54 */55#define ZFCP_COMMON_FLAGS			0xfff0000056 57/* common status bits */58#define ZFCP_STATUS_COMMON_RUNNING		0x4000000059#define ZFCP_STATUS_COMMON_ERP_FAILED		0x2000000060#define ZFCP_STATUS_COMMON_UNBLOCKED		0x1000000061#define ZFCP_STATUS_COMMON_OPEN                 0x0400000062#define ZFCP_STATUS_COMMON_ERP_INUSE		0x0100000063#define ZFCP_STATUS_COMMON_ACCESS_DENIED	0x0080000064#define ZFCP_STATUS_COMMON_ACCESS_BOXED		0x0040000065#define ZFCP_STATUS_COMMON_NOESC		0x0020000066 67/* adapter status */68#define ZFCP_STATUS_ADAPTER_MB_ACT		0x0000000169#define ZFCP_STATUS_ADAPTER_QDIOUP		0x0000000270#define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED	0x0000000471#define ZFCP_STATUS_ADAPTER_XCONFIG_OK		0x0000000872#define ZFCP_STATUS_ADAPTER_HOST_CON_INIT	0x0000001073#define ZFCP_STATUS_ADAPTER_ERP_PENDING		0x0000010074#define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED	0x0000020075#define ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED	0x0000040076 77/* remote port status */78#define ZFCP_STATUS_PORT_PHYS_OPEN		0x0000000179#define ZFCP_STATUS_PORT_LINK_TEST		0x0000000280 81/* FSF request status (this does not have a common part) */82#define ZFCP_STATUS_FSFREQ_ERROR		0x0000000883#define ZFCP_STATUS_FSFREQ_CLEANUP		0x0000001084#define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED	0x0000004085#define ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED       0x0000008086#define ZFCP_STATUS_FSFREQ_TMFUNCFAILED         0x0000020087#define ZFCP_STATUS_FSFREQ_DISMISSED            0x0000100088#define ZFCP_STATUS_FSFREQ_XDATAINCOMPLETE	0x0002000089 90/************************* STRUCTURE DEFINITIONS *****************************/91 92/**93 * enum zfcp_erp_act_type - Type of ERP action object.94 * @ZFCP_ERP_ACTION_REOPEN_LUN: LUN recovery.95 * @ZFCP_ERP_ACTION_REOPEN_PORT: Port recovery.96 * @ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: Forced port recovery.97 * @ZFCP_ERP_ACTION_REOPEN_ADAPTER: Adapter recovery.98 *99 * Values must fit into u8 because of code dependencies:100 * zfcp_dbf_rec_trig(), &zfcp_dbf_rec_trigger.want, &zfcp_dbf_rec_trigger.need;101 * zfcp_dbf_rec_run_lvl(), zfcp_dbf_rec_run(), &zfcp_dbf_rec_running.rec_action.102 */103enum zfcp_erp_act_type {104	ZFCP_ERP_ACTION_REOPEN_LUN	   = 1,105	ZFCP_ERP_ACTION_REOPEN_PORT	   = 2,106	ZFCP_ERP_ACTION_REOPEN_PORT_FORCED = 3,107	ZFCP_ERP_ACTION_REOPEN_ADAPTER	   = 4,108};109 110/*111 * Values must fit into u16 because of code dependencies:112 * zfcp_dbf_rec_run_lvl(), zfcp_dbf_rec_run(), zfcp_dbf_rec_run_wka(),113 * &zfcp_dbf_rec_running.rec_step.114 */115enum zfcp_erp_steps {116	ZFCP_ERP_STEP_UNINITIALIZED	= 0x0000,117	ZFCP_ERP_STEP_PHYS_PORT_CLOSING	= 0x0010,118	ZFCP_ERP_STEP_PORT_CLOSING	= 0x0100,119	ZFCP_ERP_STEP_PORT_OPENING	= 0x0800,120	ZFCP_ERP_STEP_LUN_CLOSING	= 0x1000,121	ZFCP_ERP_STEP_LUN_OPENING	= 0x2000,122};123 124struct zfcp_erp_action {125	struct list_head list;126	enum zfcp_erp_act_type type;  /* requested action code */127	struct zfcp_adapter *adapter; /* device which should be recovered */128	struct zfcp_port *port;129	struct scsi_device *sdev;130	u32		status;	      /* recovery status */131	enum zfcp_erp_steps	step;	/* active step of this erp action */132	u64			fsf_req_id;133	struct timer_list timer;134};135 136/* holds various memory pools of an adapter */137struct zfcp_adapter_mempool {138	mempool_t *erp_req;139	mempool_t *gid_pn_req;140	mempool_t *scsi_req;141	mempool_t *scsi_abort;142	mempool_t *status_read_req;143	mempool_t *sr_data;144	mempool_t *gid_pn;145	mempool_t *qtcb_pool;146};147 148struct zfcp_adapter {149	struct kref		ref;150	u64			peer_wwnn;	   /* P2P peer WWNN */151	u64			peer_wwpn;	   /* P2P peer WWPN */152	u32			peer_d_id;	   /* P2P peer D_ID */153	struct ccw_device       *ccw_device;	   /* S/390 ccw device */154	struct zfcp_qdio	*qdio;155	u32			hydra_version;	   /* Hydra version */156	u32			fsf_lic_version;157	u32			adapter_features;  /* FCP channel features */158	u32			connection_features; /* host connection features */159	u32			hardware_version;  /* of FCP channel */160	u32			fc_security_algorithms; /* of FCP channel */161	u32			fc_security_algorithms_old; /* of FCP channel */162	u16			timer_ticks;       /* time int for a tick */163	struct Scsi_Host	*scsi_host;	   /* Pointer to mid-layer */164	struct list_head	port_list;	   /* remote port list */165	rwlock_t		port_list_lock;    /* port list lock */166	u64			req_no;		   /* unique FSF req number */167	struct zfcp_reqlist	*req_list;168	u32			fsf_req_seq_no;	   /* FSF cmnd seq number */169	rwlock_t		abort_lock;        /* Protects against SCSI170						      stack abort/command171						      completion races */172	atomic_t		stat_miss;	   /* # missing status reads*/173	unsigned int		stat_read_buf_num;174	struct work_struct	stat_work;175	atomic_t		status;	           /* status of this adapter */176	struct list_head	erp_ready_head;	   /* error recovery for this177						      adapter/devices */178	wait_queue_head_t	erp_ready_wq;179	struct list_head	erp_running_head;180	rwlock_t		erp_lock;181	wait_queue_head_t	erp_done_wqh;182	struct zfcp_erp_action	erp_action;	   /* pending error recovery */183	atomic_t		erp_counter;184	u32			erp_total_count;   /* total nr of enqueued erp185						      actions */186	u32			erp_low_mem_count; /* nr of erp actions waiting187						      for memory */188	struct task_struct	*erp_thread;189	struct zfcp_fc_wka_ports *gs;		   /* generic services */190	struct zfcp_dbf		*dbf;		   /* debug traces */191	struct zfcp_adapter_mempool	pool;      /* Adapter memory pools */192	struct fc_host_statistics *fc_stats;193	struct fsf_qtcb_bottom_port *stats_reset_data;194	unsigned long		stats_reset;195	struct delayed_work	scan_work;196	struct work_struct	ns_up_work;197	struct service_level	service_level;198	struct workqueue_struct	*work_queue;199	struct device_dma_parameters dma_parms;200	struct zfcp_fc_events events;201	unsigned long		next_port_scan;202	struct zfcp_diag_adapter	*diagnostics;203	struct work_struct	version_change_lost_work;204};205 206struct zfcp_port {207	struct device          dev;208	struct fc_rport        *rport;         /* rport of fc transport class */209	struct list_head       list;	       /* list of remote ports */210	struct zfcp_adapter    *adapter;       /* adapter used to access port */211	struct list_head	unit_list;	/* head of logical unit list */212	rwlock_t		unit_list_lock; /* unit list lock */213	atomic_t		units;	       /* zfcp_unit count */214	atomic_t	       status;	       /* status of this remote port */215	u64		       wwnn;	       /* WWNN if known */216	u64		       wwpn;	       /* WWPN */217	u32		       d_id;	       /* D_ID */218	u32		       handle;	       /* handle assigned by FSF */219	struct zfcp_erp_action erp_action;     /* pending error recovery */220	atomic_t	       erp_counter;221	u32                    maxframe_size;222	u32                    supported_classes;223	u32                    connection_info;224	u32                    connection_info_old;225	struct work_struct     gid_pn_work;226	struct work_struct     test_link_work;227	struct work_struct     rport_work;228	enum { RPORT_NONE, RPORT_ADD, RPORT_DEL }  rport_task;229	unsigned int		starget_id;230};231 232struct zfcp_latency_record {233	u32 min;234	u32 max;235	u64 sum;236};237 238struct zfcp_latency_cont {239	struct zfcp_latency_record channel;240	struct zfcp_latency_record fabric;241	u64 counter;242};243 244struct zfcp_latencies {245	struct zfcp_latency_cont read;246	struct zfcp_latency_cont write;247	struct zfcp_latency_cont cmd;248	spinlock_t lock;249};250 251/**252 * struct zfcp_unit - LUN configured via zfcp sysfs253 * @dev: struct device for sysfs representation and reference counting254 * @list: entry in LUN/unit list per zfcp_port255 * @port: reference to zfcp_port where this LUN is configured256 * @fcp_lun: 64 bit LUN value257 * @scsi_work: for running scsi_scan_target258 *259 * This is the representation of a LUN that has been configured for260 * usage. The main data here is the 64 bit LUN value, data for261 * running I/O and recovery is in struct zfcp_scsi_dev.262 */263struct zfcp_unit {264	struct device		dev;265	struct list_head	list;266	struct zfcp_port	*port;267	u64			fcp_lun;268	struct work_struct	scsi_work;269};270 271/**272 * struct zfcp_scsi_dev - zfcp data per SCSI device273 * @status: zfcp internal status flags274 * @lun_handle: handle from "open lun" for issuing FSF requests275 * @erp_action: zfcp erp data for opening and recovering this LUN276 * @erp_counter: zfcp erp counter for this LUN277 * @latencies: FSF channel and fabric latencies278 * @port: zfcp_port where this LUN belongs to279 */280struct zfcp_scsi_dev {281	atomic_t		status;282	u32			lun_handle;283	struct zfcp_erp_action	erp_action;284	atomic_t		erp_counter;285	struct zfcp_latencies	latencies;286	struct zfcp_port	*port;287};288 289/**290 * sdev_to_zfcp - Access zfcp LUN data for SCSI device291 * @sdev: scsi_device where to get the zfcp_scsi_dev pointer292 */293static inline struct zfcp_scsi_dev *sdev_to_zfcp(struct scsi_device *sdev)294{295	return scsi_transport_device_data(sdev);296}297 298/**299 * zfcp_scsi_dev_lun - Return SCSI device LUN as 64 bit FCP LUN300 * @sdev: SCSI device where to get the LUN from301 */302static inline u64 zfcp_scsi_dev_lun(struct scsi_device *sdev)303{304	u64 fcp_lun;305 306	int_to_scsilun(sdev->lun, (struct scsi_lun *)&fcp_lun);307	return fcp_lun;308}309 310/**311 * struct zfcp_fsf_req - basic FSF request structure312 * @list: list of FSF requests313 * @req_id: unique request ID314 * @adapter: adapter this request belongs to315 * @qdio_req: qdio queue related values316 * @completion: used to signal the completion of the request317 * @status: status of the request318 * @qtcb: associated QTCB319 * @data: private data320 * @timer: timer data of this request321 * @erp_action: reference to erp action if request issued on behalf of ERP322 * @pool: reference to memory pool if used for this request323 * @issued: time when request was send (STCK)324 * @handler: handler which should be called to process response325 */326struct zfcp_fsf_req {327	struct list_head	list;328	u64			req_id;329	struct zfcp_adapter	*adapter;330	struct zfcp_qdio_req	qdio_req;331	struct completion	completion;332	u32			status;333	struct fsf_qtcb		*qtcb;334	void			*data;335	struct timer_list	timer;336	struct zfcp_erp_action	*erp_action;337	mempool_t		*pool;338	unsigned long long	issued;339	void			(*handler)(struct zfcp_fsf_req *);340};341 342static inline343int zfcp_adapter_multi_buffer_active(struct zfcp_adapter *adapter)344{345	return atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_MB_ACT;346}347 348static inline bool zfcp_fsf_req_is_status_read_buffer(struct zfcp_fsf_req *req)349{350	return req->qtcb == NULL;351}352 353#endif /* ZFCP_DEF_H */354