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