cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

zfcp_def.h (11572B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * zfcp device driver
      4 *
      5 * Global definitions for the zfcp device driver.
      6 *
      7 * Copyright IBM Corp. 2002, 2020
      8 */
      9
     10#ifndef ZFCP_DEF_H
     11#define ZFCP_DEF_H
     12
     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		0x6305
     48
     49/*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/
     50
     51/*
     52 * Note, the leftmost 12 status bits (3 nibbles) are common among adapter, port
     53 * and unit. This is a mask for bitwise 'and' with status values.
     54 */
     55#define ZFCP_COMMON_FLAGS			0xfff00000
     56
     57/* common status bits */
     58#define ZFCP_STATUS_COMMON_RUNNING		0x40000000
     59#define ZFCP_STATUS_COMMON_ERP_FAILED		0x20000000
     60#define ZFCP_STATUS_COMMON_UNBLOCKED		0x10000000
     61#define ZFCP_STATUS_COMMON_OPEN                 0x04000000
     62#define ZFCP_STATUS_COMMON_ERP_INUSE		0x01000000
     63#define ZFCP_STATUS_COMMON_ACCESS_DENIED	0x00800000
     64#define ZFCP_STATUS_COMMON_ACCESS_BOXED		0x00400000
     65#define ZFCP_STATUS_COMMON_NOESC		0x00200000
     66
     67/* adapter status */
     68#define ZFCP_STATUS_ADAPTER_MB_ACT		0x00000001
     69#define ZFCP_STATUS_ADAPTER_QDIOUP		0x00000002
     70#define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED	0x00000004
     71#define ZFCP_STATUS_ADAPTER_XCONFIG_OK		0x00000008
     72#define ZFCP_STATUS_ADAPTER_HOST_CON_INIT	0x00000010
     73#define ZFCP_STATUS_ADAPTER_ERP_PENDING		0x00000100
     74#define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED	0x00000200
     75#define ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED	0x00000400
     76
     77/* remote port status */
     78#define ZFCP_STATUS_PORT_PHYS_OPEN		0x00000001
     79#define ZFCP_STATUS_PORT_LINK_TEST		0x00000002
     80
     81/* FSF request status (this does not have a common part) */
     82#define ZFCP_STATUS_FSFREQ_ERROR		0x00000008
     83#define ZFCP_STATUS_FSFREQ_CLEANUP		0x00000010
     84#define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED	0x00000040
     85#define ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED       0x00000080
     86#define ZFCP_STATUS_FSFREQ_TMFUNCFAILED         0x00000200
     87#define ZFCP_STATUS_FSFREQ_DISMISSED            0x00001000
     88#define ZFCP_STATUS_FSFREQ_XDATAINCOMPLETE	0x00020000
     89
     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	unsigned long		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	unsigned long		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 SCSI
    170						      stack abort/command
    171						      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 this
    177						      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 erp
    185						      actions */
    186	u32			erp_low_mem_count; /* nr of erp actions waiting
    187						      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 sysfs
    253 * @dev: struct device for sysfs representation and reference counting
    254 * @list: entry in LUN/unit list per zfcp_port
    255 * @port: reference to zfcp_port where this LUN is configured
    256 * @fcp_lun: 64 bit LUN value
    257 * @scsi_work: for running scsi_scan_target
    258 *
    259 * This is the representation of a LUN that has been configured for
    260 * usage. The main data here is the 64 bit LUN value, data for
    261 * 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 device
    273 * @status: zfcp internal status flags
    274 * @lun_handle: handle from "open lun" for issuing FSF requests
    275 * @erp_action: zfcp erp data for opening and recovering this LUN
    276 * @erp_counter: zfcp erp counter for this LUN
    277 * @latencies: FSF channel and fabric latencies
    278 * @port: zfcp_port where this LUN belongs to
    279 */
    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 device
    291 * @sdev: scsi_device where to get the zfcp_scsi_dev pointer
    292 */
    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 LUN
    300 * @sdev: SCSI device where to get the LUN from
    301 */
    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 structure
    312 * @list: list of FSF requests
    313 * @req_id: unique request ID
    314 * @adapter: adapter this request belongs to
    315 * @qdio_req: qdio queue related values
    316 * @completion: used to signal the completion of the request
    317 * @status: status of the request
    318 * @qtcb: associated QTCB
    319 * @data: private data
    320 * @timer: timer data of this request
    321 * @erp_action: reference to erp action if request issued on behalf of ERP
    322 * @pool: reference to memory pool if used for this request
    323 * @issued: time when request was send (STCK)
    324 * @handler: handler which should be called to process response
    325 */
    326struct zfcp_fsf_req {
    327	struct list_head	list;
    328	unsigned long		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 inline
    343int 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 */