Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
0004  *          Horst Hummel <Horst.Hummel@de.ibm.com>
0005  *          Martin Schwidefsky <schwidefsky@de.ibm.com>
0006  * Bugreports.to..: <Linux390@de.ibm.com>
0007  * Copyright IBM Corp. 1999, 2009
0008  */
0009 
0010 #ifndef DASD_INT_H
0011 #define DASD_INT_H
0012 
0013 /* we keep old device allocation scheme; IOW, minors are still in 0..255 */
0014 #define DASD_PER_MAJOR (1U << (MINORBITS - DASD_PARTN_BITS))
0015 #define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
0016 
0017 /*
0018  * States a dasd device can have:
0019  *   new: the dasd_device structure is allocated.
0020  *   known: the discipline for the device is identified.
0021  *   basic: the device can do basic i/o.
0022  *   unfmt: the device could not be analyzed (format is unknown).
0023  *   ready: partition detection is done and the device is can do block io.
0024  *   online: the device accepts requests from the block device queue.
0025  *
0026  * Things to do for startup state transitions:
0027  *   new -> known: find discipline for the device and create devfs entries.
0028  *   known -> basic: request irq line for the device.
0029  *   basic -> ready: do the initial analysis, e.g. format detection,
0030  *                   do block device setup and detect partitions.
0031  *   ready -> online: schedule the device tasklet.
0032  * Things to do for shutdown state transitions:
0033  *   online -> ready: just set the new device state.
0034  *   ready -> basic: flush requests from the block device layer, clear
0035  *                   partition information and reset format information.
0036  *   basic -> known: terminate all requests and free irq.
0037  *   known -> new: remove devfs entries and forget discipline.
0038  */
0039 
0040 #define DASD_STATE_NEW    0
0041 #define DASD_STATE_KNOWN  1
0042 #define DASD_STATE_BASIC  2
0043 #define DASD_STATE_UNFMT  3
0044 #define DASD_STATE_READY  4
0045 #define DASD_STATE_ONLINE 5
0046 
0047 #include <linux/module.h>
0048 #include <linux/wait.h>
0049 #include <linux/blkdev.h>
0050 #include <linux/hdreg.h>
0051 #include <linux/interrupt.h>
0052 #include <linux/log2.h>
0053 #include <asm/ccwdev.h>
0054 #include <linux/workqueue.h>
0055 #include <asm/debug.h>
0056 #include <asm/dasd.h>
0057 #include <asm/idals.h>
0058 #include <linux/bitops.h>
0059 #include <linux/blk-mq.h>
0060 
0061 /* DASD discipline magic */
0062 #define DASD_ECKD_MAGIC 0xC5C3D2C4
0063 #define DASD_DIAG_MAGIC 0xC4C9C1C7
0064 #define DASD_FBA_MAGIC 0xC6C2C140
0065 
0066 /*
0067  * SECTION: Type definitions
0068  */
0069 struct dasd_device;
0070 struct dasd_block;
0071 
0072 /* BIT DEFINITIONS FOR SENSE DATA */
0073 #define DASD_SENSE_BIT_0 0x80
0074 #define DASD_SENSE_BIT_1 0x40
0075 #define DASD_SENSE_BIT_2 0x20
0076 #define DASD_SENSE_BIT_3 0x10
0077 
0078 /* BIT DEFINITIONS FOR SIM SENSE */
0079 #define DASD_SIM_SENSE 0x0F
0080 #define DASD_SIM_MSG_TO_OP 0x03
0081 #define DASD_SIM_LOG 0x0C
0082 
0083 /* lock class for nested cdev lock */
0084 #define CDEV_NESTED_FIRST 1
0085 #define CDEV_NESTED_SECOND 2
0086 
0087 /*
0088  * SECTION: MACROs for klogd and s390 debug feature (dbf)
0089  */
0090 #define DBF_DEV_EVENT(d_level, d_device, d_str, d_data...) \
0091 do { \
0092     debug_sprintf_event(d_device->debug_area, \
0093                 d_level, \
0094                 d_str "\n", \
0095                 d_data); \
0096 } while(0)
0097 
0098 #define DBF_EVENT(d_level, d_str, d_data...)\
0099 do { \
0100     debug_sprintf_event(dasd_debug_area, \
0101                 d_level,\
0102                 d_str "\n", \
0103                 d_data); \
0104 } while(0)
0105 
0106 #define DBF_EVENT_DEVID(d_level, d_cdev, d_str, d_data...)  \
0107 do { \
0108     struct ccw_dev_id __dev_id;         \
0109     ccw_device_get_id(d_cdev, &__dev_id);       \
0110     debug_sprintf_event(dasd_debug_area,        \
0111                 d_level,                    \
0112                 "0.%x.%04x " d_str "\n",            \
0113                 __dev_id.ssid, __dev_id.devno, d_data); \
0114 } while (0)
0115 
0116 /* limit size for an errorstring */
0117 #define ERRORLENGTH 30
0118 
0119 /* definition of dbf debug levels */
0120 #define DBF_EMERG   0   /* system is unusable           */
0121 #define DBF_ALERT   1   /* action must be taken immediately */
0122 #define DBF_CRIT    2   /* critical conditions          */
0123 #define DBF_ERR     3   /* error conditions         */
0124 #define DBF_WARNING 4   /* warning conditions           */
0125 #define DBF_NOTICE  5   /* normal but significant condition */
0126 #define DBF_INFO    6   /* informational            */
0127 #define DBF_DEBUG   6   /* debug-level messages         */
0128 
0129 /* messages to be written via klogd and dbf */
0130 #define DEV_MESSAGE(d_loglevel,d_device,d_string,d_args...)\
0131 do { \
0132     printk(d_loglevel PRINTK_HEADER " %s: " d_string "\n", \
0133            dev_name(&d_device->cdev->dev), d_args); \
0134     DBF_DEV_EVENT(DBF_ALERT, d_device, d_string, d_args); \
0135 } while(0)
0136 
0137 #define MESSAGE(d_loglevel,d_string,d_args...)\
0138 do { \
0139     printk(d_loglevel PRINTK_HEADER " " d_string "\n", d_args); \
0140     DBF_EVENT(DBF_ALERT, d_string, d_args); \
0141 } while(0)
0142 
0143 /* messages to be written via klogd only */
0144 #define DEV_MESSAGE_LOG(d_loglevel,d_device,d_string,d_args...)\
0145 do { \
0146     printk(d_loglevel PRINTK_HEADER " %s: " d_string "\n", \
0147            dev_name(&d_device->cdev->dev), d_args); \
0148 } while(0)
0149 
0150 #define MESSAGE_LOG(d_loglevel,d_string,d_args...)\
0151 do { \
0152     printk(d_loglevel PRINTK_HEADER " " d_string "\n", d_args); \
0153 } while(0)
0154 
0155 /* Macro to calculate number of blocks per page */
0156 #define BLOCKS_PER_PAGE(blksize) (PAGE_SIZE / blksize)
0157 
0158 struct dasd_ccw_req {
0159     unsigned int magic;     /* Eye catcher */
0160     int intrc;          /* internal error, e.g. from start_IO */
0161     struct list_head devlist;   /* for dasd_device request queue */
0162     struct list_head blocklist; /* for dasd_block request queue */
0163     struct dasd_block *block;   /* the originating block device */
0164     struct dasd_device *memdev; /* the device used to allocate this */
0165     struct dasd_device *startdev;   /* device the request is started on */
0166     struct dasd_device *basedev;    /* base device if no block->base */
0167     void *cpaddr;           /* address of ccw or tcw */
0168     short retries;          /* A retry counter */
0169     unsigned char cpmode;       /* 0 = cmd mode, 1 = itcw */
0170     char status;            /* status of this request */
0171     char lpm;           /* logical path mask */
0172     unsigned long flags;            /* flags of this request */
0173     struct dasd_queue *dq;
0174     unsigned long starttime;    /* jiffies time of request start */
0175     unsigned long expires;      /* expiration period in jiffies */
0176     void *data;         /* pointer to data area */
0177     struct irb irb;         /* device status in case of an error */
0178     struct dasd_ccw_req *refers;    /* ERP-chain queueing. */
0179     void *function;         /* originating ERP action */
0180     void *mem_chunk;
0181 
0182     unsigned long buildclk;     /* TOD-clock of request generation */
0183     unsigned long startclk;     /* TOD-clock of request start */
0184     unsigned long stopclk;      /* TOD-clock of request interrupt */
0185     unsigned long endclk;       /* TOD-clock of request termination */
0186 
0187     void (*callback)(struct dasd_ccw_req *, void *data);
0188     void *callback_data;
0189     unsigned int proc_bytes;    /* bytes for partial completion */
0190     unsigned int trkcount;      /* count formatted tracks */
0191 };
0192 
0193 /*
0194  * dasd_ccw_req -> status can be:
0195  */
0196 #define DASD_CQR_FILLED     0x00    /* request is ready to be processed */
0197 #define DASD_CQR_DONE       0x01    /* request is completed successfully */
0198 #define DASD_CQR_NEED_ERP   0x02    /* request needs recovery action */
0199 #define DASD_CQR_IN_ERP     0x03    /* request is in recovery */
0200 #define DASD_CQR_FAILED     0x04    /* request is finally failed */
0201 #define DASD_CQR_TERMINATED 0x05    /* request was stopped by driver */
0202 
0203 #define DASD_CQR_QUEUED     0x80    /* request is queued to be processed */
0204 #define DASD_CQR_IN_IO      0x81    /* request is currently in IO */
0205 #define DASD_CQR_ERROR      0x82    /* request is completed with error */
0206 #define DASD_CQR_CLEAR_PENDING  0x83    /* request is clear pending */
0207 #define DASD_CQR_CLEARED    0x84    /* request was cleared */
0208 #define DASD_CQR_SUCCESS    0x85    /* request was successful */
0209 
0210 /* default expiration time*/
0211 #define DASD_EXPIRES      300
0212 #define DASD_EXPIRES_MAX  40000000
0213 #define DASD_RETRIES      256
0214 #define DASD_RETRIES_MAX  32768
0215 
0216 /* per dasd_ccw_req flags */
0217 #define DASD_CQR_FLAGS_USE_ERP   0  /* use ERP for this request */
0218 #define DASD_CQR_FLAGS_FAILFAST  1  /* FAILFAST */
0219 #define DASD_CQR_VERIFY_PATH     2  /* path verification request */
0220 #define DASD_CQR_ALLOW_SLOCK     3  /* Try this request even when lock was
0221                      * stolen. Should not be combined with
0222                      * DASD_CQR_FLAGS_USE_ERP
0223                      */
0224 /*
0225  * The following flags are used to suppress output of certain errors.
0226  */
0227 #define DASD_CQR_SUPPRESS_NRF   4   /* Suppress 'No Record Found' error */
0228 #define DASD_CQR_SUPPRESS_FP    5   /* Suppress 'File Protected' error*/
0229 #define DASD_CQR_SUPPRESS_IL    6   /* Suppress 'Incorrect Length' error */
0230 #define DASD_CQR_SUPPRESS_CR    7   /* Suppress 'Command Reject' error */
0231 
0232 #define DASD_REQ_PER_DEV 4
0233 
0234 /* Signature for error recovery functions. */
0235 typedef struct dasd_ccw_req *(*dasd_erp_fn_t) (struct dasd_ccw_req *);
0236 
0237 /*
0238  * A single CQR can only contain a maximum of 255 CCWs. It is limited by
0239  * the locate record and locate record extended count value which can only hold
0240  * 1 Byte max.
0241  */
0242 #define DASD_CQR_MAX_CCW 255
0243 
0244 /*
0245  * Unique identifier for dasd device.
0246  */
0247 #define UA_NOT_CONFIGURED  0x00
0248 #define UA_BASE_DEVICE     0x01
0249 #define UA_BASE_PAV_ALIAS  0x02
0250 #define UA_HYPER_PAV_ALIAS 0x03
0251 
0252 struct dasd_uid {
0253     __u8 type;
0254     char vendor[4];
0255     char serial[15];
0256     __u16 ssid;
0257     __u8 real_unit_addr;
0258     __u8 base_unit_addr;
0259     char vduit[33];
0260 };
0261 
0262 /*
0263  * the struct dasd_discipline is
0264  * sth like a table of virtual functions, if you think of dasd_eckd
0265  * inheriting dasd...
0266  * no, currently we are not planning to reimplement the driver in C++
0267  */
0268 struct dasd_discipline {
0269     struct module *owner;
0270     char ebcname[8];    /* a name used for tagging and printks */
0271     char name[8];       /* a name used for tagging and printks */
0272 
0273     struct list_head list;  /* used for list of disciplines */
0274 
0275     /*
0276      * Device recognition functions. check_device is used to verify
0277      * the sense data and the information returned by read device
0278      * characteristics. It returns 0 if the discipline can be used
0279      * for the device in question. uncheck_device is called during
0280      * device shutdown to deregister a device from its discipline.
0281      */
0282     int (*check_device) (struct dasd_device *);
0283     void (*uncheck_device) (struct dasd_device *);
0284 
0285     /*
0286      * do_analysis is used in the step from device state "basic" to
0287      * state "accept". It returns 0 if the device can be made ready,
0288      * it returns -EMEDIUMTYPE if the device can't be made ready or
0289      * -EAGAIN if do_analysis started a ccw that needs to complete
0290      * before the analysis may be repeated.
0291      */
0292     int (*do_analysis) (struct dasd_block *);
0293 
0294     /*
0295      * This function is called, when new paths become available.
0296      * Disciplins may use this callback to do necessary setup work,
0297      * e.g. verify that new path is compatible with the current
0298      * configuration.
0299      */
0300     int (*pe_handler)(struct dasd_device *, __u8, __u8);
0301 
0302     /*
0303      * Last things to do when a device is set online, and first things
0304      * when it is set offline.
0305      */
0306     int (*basic_to_ready) (struct dasd_device *);
0307     int (*online_to_ready) (struct dasd_device *);
0308     int (*basic_to_known)(struct dasd_device *);
0309 
0310     /*
0311      * Initialize block layer request queue.
0312      */
0313     void (*setup_blk_queue)(struct dasd_block *);
0314     /* (struct dasd_device *);
0315      * Device operation functions. build_cp creates a ccw chain for
0316      * a block device request, start_io starts the request and
0317      * term_IO cancels it (e.g. in case of a timeout). format_device
0318      * formats the device and check_device_format compares the format of
0319      * a device with the expected format_data.
0320      * handle_terminated_request allows to examine a cqr and prepare
0321      * it for retry.
0322      */
0323     struct dasd_ccw_req *(*build_cp) (struct dasd_device *,
0324                       struct dasd_block *,
0325                       struct request *);
0326     int (*start_IO) (struct dasd_ccw_req *);
0327     int (*term_IO) (struct dasd_ccw_req *);
0328     void (*handle_terminated_request) (struct dasd_ccw_req *);
0329     int (*format_device) (struct dasd_device *,
0330                   struct format_data_t *, int);
0331     int (*check_device_format)(struct dasd_device *,
0332                    struct format_check_t *, int);
0333     int (*free_cp) (struct dasd_ccw_req *, struct request *);
0334 
0335     /*
0336      * Error recovery functions. examine_error() returns a value that
0337      * indicates what to do for an error condition. If examine_error()
0338      * returns 'dasd_era_recover' erp_action() is called to create a
0339      * special error recovery ccw. erp_postaction() is called after
0340      * an error recovery ccw has finished its execution. dump_sense
0341      * is called for every error condition to print the sense data
0342      * to the console.
0343      */
0344     dasd_erp_fn_t(*erp_action) (struct dasd_ccw_req *);
0345     dasd_erp_fn_t(*erp_postaction) (struct dasd_ccw_req *);
0346     void (*dump_sense) (struct dasd_device *, struct dasd_ccw_req *,
0347                 struct irb *);
0348     void (*dump_sense_dbf) (struct dasd_device *, struct irb *, char *);
0349     void (*check_for_device_change) (struct dasd_device *,
0350                      struct dasd_ccw_req *,
0351                      struct irb *);
0352 
0353         /* i/o control functions. */
0354     int (*fill_geometry) (struct dasd_block *, struct hd_geometry *);
0355     int (*fill_info) (struct dasd_device *, struct dasd_information2_t *);
0356     int (*ioctl) (struct dasd_block *, unsigned int, void __user *);
0357 
0358     /* reload device after state change */
0359     int (*reload) (struct dasd_device *);
0360 
0361     int (*get_uid) (struct dasd_device *, struct dasd_uid *);
0362     void (*kick_validate) (struct dasd_device *);
0363     int (*check_attention)(struct dasd_device *, __u8);
0364     int (*host_access_count)(struct dasd_device *);
0365     int (*hosts_print)(struct dasd_device *, struct seq_file *);
0366     void (*handle_hpf_error)(struct dasd_device *, struct irb *);
0367     void (*disable_hpf)(struct dasd_device *);
0368     int (*hpf_enabled)(struct dasd_device *);
0369     void (*reset_path)(struct dasd_device *, __u8);
0370 
0371     /*
0372      * Extent Space Efficient (ESE) relevant functions
0373      */
0374     int (*is_ese)(struct dasd_device *);
0375     /* Capacity */
0376     int (*space_allocated)(struct dasd_device *);
0377     int (*space_configured)(struct dasd_device *);
0378     int (*logical_capacity)(struct dasd_device *);
0379     int (*release_space)(struct dasd_device *, struct format_data_t *);
0380     /* Extent Pool */
0381     int (*ext_pool_id)(struct dasd_device *);
0382     int (*ext_size)(struct dasd_device *);
0383     int (*ext_pool_cap_at_warnlevel)(struct dasd_device *);
0384     int (*ext_pool_warn_thrshld)(struct dasd_device *);
0385     int (*ext_pool_oos)(struct dasd_device *);
0386     int (*ext_pool_exhaust)(struct dasd_device *, struct dasd_ccw_req *);
0387     struct dasd_ccw_req *(*ese_format)(struct dasd_device *,
0388                        struct dasd_ccw_req *, struct irb *);
0389     int (*ese_read)(struct dasd_ccw_req *, struct irb *);
0390 };
0391 
0392 extern struct dasd_discipline *dasd_diag_discipline_pointer;
0393 
0394 /*
0395  * Notification numbers for extended error reporting notifications:
0396  * The DASD_EER_DISABLE notification is sent before a dasd_device (and it's
0397  * eer pointer) is freed. The error reporting module needs to do all necessary
0398  * cleanup steps.
0399  * The DASD_EER_TRIGGER notification sends the actual error reports (triggers).
0400  */
0401 #define DASD_EER_DISABLE 0
0402 #define DASD_EER_TRIGGER 1
0403 
0404 /* Trigger IDs for extended error reporting DASD_EER_TRIGGER notification */
0405 #define DASD_EER_FATALERROR  1
0406 #define DASD_EER_NOPATH      2
0407 #define DASD_EER_STATECHANGE 3
0408 #define DASD_EER_PPRCSUSPEND 4
0409 #define DASD_EER_NOSPC       5
0410 
0411 /* DASD path handling */
0412 
0413 #define DASD_PATH_OPERATIONAL  1
0414 #define DASD_PATH_TBV          2
0415 #define DASD_PATH_PP           3
0416 #define DASD_PATH_NPP          4
0417 #define DASD_PATH_MISCABLED    5
0418 #define DASD_PATH_NOHPF        6
0419 #define DASD_PATH_CUIR         7
0420 #define DASD_PATH_IFCC         8
0421 #define DASD_PATH_FCSEC        9
0422 
0423 #define DASD_THRHLD_MAX     4294967295U
0424 #define DASD_INTERVAL_MAX   4294967295U
0425 
0426 /* FC Endpoint Security Capabilities */
0427 #define DASD_FC_SECURITY_UNSUP      0
0428 #define DASD_FC_SECURITY_AUTH       1
0429 #define DASD_FC_SECURITY_ENC_FCSP2  2
0430 #define DASD_FC_SECURITY_ENC_ERAS   3
0431 
0432 #define DASD_FC_SECURITY_ENC_STR    "Encryption"
0433 static const struct {
0434     u8 value;
0435     char *name;
0436 } dasd_path_fcs_mnemonics[] = {
0437     { DASD_FC_SECURITY_UNSUP,   "Unsupported" },
0438     { DASD_FC_SECURITY_AUTH,    "Authentication" },
0439     { DASD_FC_SECURITY_ENC_FCSP2,   DASD_FC_SECURITY_ENC_STR },
0440     { DASD_FC_SECURITY_ENC_ERAS,    DASD_FC_SECURITY_ENC_STR },
0441 };
0442 
0443 static inline char *dasd_path_get_fcs_str(int val)
0444 {
0445     int i;
0446 
0447     for (i = 0; i < ARRAY_SIZE(dasd_path_fcs_mnemonics); i++) {
0448         if (dasd_path_fcs_mnemonics[i].value == val)
0449             return dasd_path_fcs_mnemonics[i].name;
0450     }
0451 
0452     return dasd_path_fcs_mnemonics[0].name;
0453 }
0454 
0455 struct dasd_path {
0456     unsigned long flags;
0457     u8 cssid;
0458     u8 ssid;
0459     u8 chpid;
0460     struct dasd_conf_data *conf_data;
0461     atomic_t error_count;
0462     unsigned long errorclk;
0463     u8 fc_security;
0464     struct kobject kobj;
0465     bool in_sysfs;
0466 };
0467 
0468 #define to_dasd_path(path) container_of(path, struct dasd_path, kobj)
0469 
0470 static inline void dasd_path_release(struct kobject *kobj)
0471 {
0472 /* Memory for the dasd_path kobject is freed when dasd_free_device() is called */
0473 }
0474 
0475 
0476 struct dasd_profile_info {
0477     /* legacy part of profile data, as in dasd_profile_info_t */
0478     unsigned int dasd_io_reqs;   /* number of requests processed */
0479     unsigned int dasd_io_sects;  /* number of sectors processed */
0480     unsigned int dasd_io_secs[32];   /* histogram of request's sizes */
0481     unsigned int dasd_io_times[32];  /* histogram of requests's times */
0482     unsigned int dasd_io_timps[32];  /* h. of requests's times per sector */
0483     unsigned int dasd_io_time1[32];  /* hist. of time from build to start */
0484     unsigned int dasd_io_time2[32];  /* hist. of time from start to irq */
0485     unsigned int dasd_io_time2ps[32]; /* hist. of time from start to irq */
0486     unsigned int dasd_io_time3[32];  /* hist. of time from irq to end */
0487     unsigned int dasd_io_nr_req[32]; /* hist. of # of requests in chanq */
0488 
0489     /* new data */
0490     struct timespec64 starttod;    /* time of start or last reset */
0491     unsigned int dasd_io_alias;    /* requests using an alias */
0492     unsigned int dasd_io_tpm;      /* requests using transport mode */
0493     unsigned int dasd_read_reqs;       /* total number of read  requests */
0494     unsigned int dasd_read_sects;      /* total number read sectors */
0495     unsigned int dasd_read_alias;      /* read request using an alias */
0496     unsigned int dasd_read_tpm;    /* read requests in transport mode */
0497     unsigned int dasd_read_secs[32];   /* histogram of request's sizes */
0498     unsigned int dasd_read_times[32];  /* histogram of requests's times */
0499     unsigned int dasd_read_time1[32];  /* hist. time from build to start */
0500     unsigned int dasd_read_time2[32];  /* hist. of time from start to irq */
0501     unsigned int dasd_read_time3[32];  /* hist. of time from irq to end */
0502     unsigned int dasd_read_nr_req[32]; /* hist. of # of requests in chanq */
0503     unsigned long dasd_sum_times;      /* sum of request times */
0504     unsigned long dasd_sum_time_str;   /* sum of time from build to start */
0505     unsigned long dasd_sum_time_irq;   /* sum of time from start to irq */
0506     unsigned long dasd_sum_time_end;   /* sum of time from irq to end */
0507 };
0508 
0509 struct dasd_profile {
0510     struct dentry *dentry;
0511     struct dasd_profile_info *data;
0512     spinlock_t lock;
0513 };
0514 
0515 struct dasd_format_entry {
0516     struct list_head list;
0517     sector_t track;
0518 };
0519 
0520 struct dasd_device {
0521     /* Block device stuff. */
0522     struct dasd_block *block;
0523 
0524         unsigned int devindex;
0525     unsigned long flags;       /* per device flags */
0526     unsigned short features;   /* copy of devmap-features (read-only!) */
0527 
0528     /* extended error reporting stuff (eer) */
0529     struct dasd_ccw_req *eer_cqr;
0530 
0531     /* Device discipline stuff. */
0532     struct dasd_discipline *discipline;
0533     struct dasd_discipline *base_discipline;
0534     void *private;
0535     struct dasd_path path[8];
0536     __u8 opm;
0537 
0538     /* Device state and target state. */
0539     int state, target;
0540     struct mutex state_mutex;
0541     int stopped;        /* device (ccw_device_start) was stopped */
0542 
0543     /* reference count. */
0544         atomic_t ref_count;
0545 
0546     /* ccw queue and memory for static ccw/erp buffers. */
0547     struct list_head ccw_queue;
0548     spinlock_t mem_lock;
0549     void *ccw_mem;
0550     void *erp_mem;
0551     void *ese_mem;
0552     struct list_head ccw_chunks;
0553     struct list_head erp_chunks;
0554     struct list_head ese_chunks;
0555 
0556     atomic_t tasklet_scheduled;
0557         struct tasklet_struct tasklet;
0558     struct work_struct kick_work;
0559     struct work_struct reload_device;
0560     struct work_struct kick_validate;
0561     struct work_struct suc_work;
0562     struct work_struct requeue_requests;
0563     struct timer_list timer;
0564 
0565     debug_info_t *debug_area;
0566 
0567     struct ccw_device *cdev;
0568 
0569     /* hook for alias management */
0570     struct list_head alias_list;
0571 
0572     /* default expiration time in s */
0573     unsigned long default_expires;
0574     unsigned long default_retries;
0575 
0576     unsigned long blk_timeout;
0577 
0578     unsigned long path_thrhld;
0579     unsigned long path_interval;
0580 
0581     struct dentry *debugfs_dentry;
0582     struct dentry *hosts_dentry;
0583     struct dasd_profile profile;
0584     struct dasd_format_entry format_entry;
0585     struct kset *paths_info;
0586 };
0587 
0588 struct dasd_block {
0589     /* Block device stuff. */
0590     struct gendisk *gdp;
0591     struct request_queue *request_queue;
0592     spinlock_t request_queue_lock;
0593     struct blk_mq_tag_set tag_set;
0594     struct block_device *bdev;
0595     atomic_t open_count;
0596 
0597     unsigned long blocks;      /* size of volume in blocks */
0598     unsigned int bp_block;     /* bytes per block */
0599     unsigned int s2b_shift;    /* log2 (bp_block/512) */
0600 
0601     struct dasd_device *base;
0602     struct list_head ccw_queue;
0603     spinlock_t queue_lock;
0604 
0605     atomic_t tasklet_scheduled;
0606     struct tasklet_struct tasklet;
0607     struct timer_list timer;
0608 
0609     struct dentry *debugfs_dentry;
0610     struct dasd_profile profile;
0611 
0612     struct list_head format_list;
0613     spinlock_t format_lock;
0614     atomic_t trkcount;
0615 };
0616 
0617 struct dasd_attention_data {
0618     struct dasd_device *device;
0619     __u8 lpum;
0620 };
0621 
0622 struct dasd_queue {
0623     spinlock_t lock;
0624 };
0625 
0626 /* reasons why device (ccw_device_start) was stopped */
0627 #define DASD_STOPPED_NOT_ACC 1         /* not accessible */
0628 #define DASD_STOPPED_QUIESCE 2         /* Quiesced */
0629 #define DASD_STOPPED_PENDING 4         /* long busy */
0630 #define DASD_STOPPED_DC_WAIT 8         /* disconnected, wait */
0631 #define DASD_STOPPED_SU      16        /* summary unit check handling */
0632 #define DASD_STOPPED_NOSPC   128       /* no space left */
0633 
0634 /* per device flags */
0635 #define DASD_FLAG_OFFLINE   3   /* device is in offline processing */
0636 #define DASD_FLAG_EER_SNSS  4   /* A SNSS is required */
0637 #define DASD_FLAG_EER_IN_USE    5   /* A SNSS request is running */
0638 #define DASD_FLAG_DEVICE_RO 6   /* The device itself is read-only. Don't
0639                      * confuse this with the user specified
0640                      * read-only feature.
0641                      */
0642 #define DASD_FLAG_IS_RESERVED   7   /* The device is reserved */
0643 #define DASD_FLAG_LOCK_STOLEN   8   /* The device lock was stolen */
0644 #define DASD_FLAG_SUSPENDED 9   /* The device was suspended */
0645 #define DASD_FLAG_SAFE_OFFLINE  10  /* safe offline processing requested*/
0646 #define DASD_FLAG_SAFE_OFFLINE_RUNNING  11  /* safe offline running */
0647 #define DASD_FLAG_ABORTALL  12  /* Abort all noretry requests */
0648 #define DASD_FLAG_PATH_VERIFY   13  /* Path verification worker running */
0649 #define DASD_FLAG_SUC       14  /* unhandled summary unit check */
0650 
0651 #define DASD_SLEEPON_START_TAG  ((void *) 1)
0652 #define DASD_SLEEPON_END_TAG    ((void *) 2)
0653 
0654 void dasd_put_device_wake(struct dasd_device *);
0655 
0656 /*
0657  * Reference count inliners
0658  */
0659 static inline void
0660 dasd_get_device(struct dasd_device *device)
0661 {
0662     atomic_inc(&device->ref_count);
0663 }
0664 
0665 static inline void
0666 dasd_put_device(struct dasd_device *device)
0667 {
0668     if (atomic_dec_return(&device->ref_count) == 0)
0669         dasd_put_device_wake(device);
0670 }
0671 
0672 /*
0673  * The static memory in ccw_mem and erp_mem is managed by a sorted
0674  * list of free memory chunks.
0675  */
0676 struct dasd_mchunk
0677 {
0678     struct list_head list;
0679     unsigned long size;
0680 } __attribute__ ((aligned(8)));
0681 
0682 static inline void
0683 dasd_init_chunklist(struct list_head *chunk_list, void *mem,
0684             unsigned long size)
0685 {
0686     struct dasd_mchunk *chunk;
0687 
0688     INIT_LIST_HEAD(chunk_list);
0689     chunk = (struct dasd_mchunk *) mem;
0690     chunk->size = size - sizeof(struct dasd_mchunk);
0691     list_add(&chunk->list, chunk_list);
0692 }
0693 
0694 static inline void *
0695 dasd_alloc_chunk(struct list_head *chunk_list, unsigned long size)
0696 {
0697     struct dasd_mchunk *chunk, *tmp;
0698 
0699     size = (size + 7L) & -8L;
0700     list_for_each_entry(chunk, chunk_list, list) {
0701         if (chunk->size < size)
0702             continue;
0703         if (chunk->size > size + sizeof(struct dasd_mchunk)) {
0704             char *endaddr = (char *) (chunk + 1) + chunk->size;
0705             tmp = (struct dasd_mchunk *) (endaddr - size) - 1;
0706             tmp->size = size;
0707             chunk->size -= size + sizeof(struct dasd_mchunk);
0708             chunk = tmp;
0709         } else
0710             list_del(&chunk->list);
0711         return (void *) (chunk + 1);
0712     }
0713     return NULL;
0714 }
0715 
0716 static inline void
0717 dasd_free_chunk(struct list_head *chunk_list, void *mem)
0718 {
0719     struct dasd_mchunk *chunk, *tmp;
0720     struct list_head *p, *left;
0721 
0722     chunk = (struct dasd_mchunk *)
0723         ((char *) mem - sizeof(struct dasd_mchunk));
0724     /* Find out the left neighbour in chunk_list. */
0725     left = chunk_list;
0726     list_for_each(p, chunk_list) {
0727         if (list_entry(p, struct dasd_mchunk, list) > chunk)
0728             break;
0729         left = p;
0730     }
0731     /* Try to merge with right neighbour = next element from left. */
0732     if (left->next != chunk_list) {
0733         tmp = list_entry(left->next, struct dasd_mchunk, list);
0734         if ((char *) (chunk + 1) + chunk->size == (char *) tmp) {
0735             list_del(&tmp->list);
0736             chunk->size += tmp->size + sizeof(struct dasd_mchunk);
0737         }
0738     }
0739     /* Try to merge with left neighbour. */
0740     if (left != chunk_list) {
0741         tmp = list_entry(left, struct dasd_mchunk, list);
0742         if ((char *) (tmp + 1) + tmp->size == (char *) chunk) {
0743             tmp->size += chunk->size + sizeof(struct dasd_mchunk);
0744             return;
0745         }
0746     }
0747     __list_add(&chunk->list, left, left->next);
0748 }
0749 
0750 /*
0751  * Check if bsize is in { 512, 1024, 2048, 4096 }
0752  */
0753 static inline int
0754 dasd_check_blocksize(int bsize)
0755 {
0756     if (bsize < 512 || bsize > 4096 || !is_power_of_2(bsize))
0757         return -EMEDIUMTYPE;
0758     return 0;
0759 }
0760 
0761 /*
0762  * return the callback data of the original request in case there are
0763  * ERP requests build on top of it
0764  */
0765 static inline void *dasd_get_callback_data(struct dasd_ccw_req *cqr)
0766 {
0767     while (cqr->refers)
0768         cqr = cqr->refers;
0769 
0770     return cqr->callback_data;
0771 }
0772 
0773 /* externals in dasd.c */
0774 #define DASD_PROFILE_OFF     0
0775 #define DASD_PROFILE_ON      1
0776 #define DASD_PROFILE_GLOBAL_ONLY 2
0777 
0778 extern debug_info_t *dasd_debug_area;
0779 extern struct dasd_profile dasd_global_profile;
0780 extern unsigned int dasd_global_profile_level;
0781 extern const struct block_device_operations dasd_device_operations;
0782 
0783 extern struct kmem_cache *dasd_page_cache;
0784 
0785 struct dasd_ccw_req *
0786 dasd_smalloc_request(int, int, int, struct dasd_device *, struct dasd_ccw_req *);
0787 struct dasd_ccw_req *dasd_fmalloc_request(int, int, int, struct dasd_device *);
0788 void dasd_sfree_request(struct dasd_ccw_req *, struct dasd_device *);
0789 void dasd_ffree_request(struct dasd_ccw_req *, struct dasd_device *);
0790 void dasd_wakeup_cb(struct dasd_ccw_req *, void *);
0791 
0792 struct dasd_device *dasd_alloc_device(void);
0793 void dasd_free_device(struct dasd_device *);
0794 
0795 struct dasd_block *dasd_alloc_block(void);
0796 void dasd_free_block(struct dasd_block *);
0797 
0798 enum blk_eh_timer_return dasd_times_out(struct request *req);
0799 
0800 void dasd_enable_device(struct dasd_device *);
0801 void dasd_set_target_state(struct dasd_device *, int);
0802 void dasd_kick_device(struct dasd_device *);
0803 void dasd_reload_device(struct dasd_device *);
0804 void dasd_schedule_requeue(struct dasd_device *);
0805 
0806 void dasd_add_request_head(struct dasd_ccw_req *);
0807 void dasd_add_request_tail(struct dasd_ccw_req *);
0808 int  dasd_start_IO(struct dasd_ccw_req *);
0809 int  dasd_term_IO(struct dasd_ccw_req *);
0810 void dasd_schedule_device_bh(struct dasd_device *);
0811 void dasd_schedule_block_bh(struct dasd_block *);
0812 int  dasd_sleep_on(struct dasd_ccw_req *);
0813 int  dasd_sleep_on_queue(struct list_head *);
0814 int  dasd_sleep_on_immediatly(struct dasd_ccw_req *);
0815 int  dasd_sleep_on_queue_interruptible(struct list_head *);
0816 int  dasd_sleep_on_interruptible(struct dasd_ccw_req *);
0817 void dasd_device_set_timer(struct dasd_device *, int);
0818 void dasd_device_clear_timer(struct dasd_device *);
0819 void dasd_block_set_timer(struct dasd_block *, int);
0820 void dasd_block_clear_timer(struct dasd_block *);
0821 int  dasd_cancel_req(struct dasd_ccw_req *);
0822 int dasd_flush_device_queue(struct dasd_device *);
0823 int dasd_generic_probe(struct ccw_device *);
0824 void dasd_generic_free_discipline(struct dasd_device *);
0825 void dasd_generic_remove (struct ccw_device *cdev);
0826 int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *);
0827 int dasd_generic_set_offline (struct ccw_device *cdev);
0828 int dasd_generic_notify(struct ccw_device *, int);
0829 int dasd_generic_last_path_gone(struct dasd_device *);
0830 int dasd_generic_path_operational(struct dasd_device *);
0831 void dasd_generic_shutdown(struct ccw_device *);
0832 
0833 void dasd_generic_handle_state_change(struct dasd_device *);
0834 enum uc_todo dasd_generic_uc_handler(struct ccw_device *, struct irb *);
0835 void dasd_generic_path_event(struct ccw_device *, int *);
0836 int dasd_generic_verify_path(struct dasd_device *, __u8);
0837 void dasd_generic_space_exhaust(struct dasd_device *, struct dasd_ccw_req *);
0838 void dasd_generic_space_avail(struct dasd_device *);
0839 
0840 int dasd_generic_read_dev_chars(struct dasd_device *, int, void *, int);
0841 char *dasd_get_sense(struct irb *);
0842 
0843 void dasd_device_set_stop_bits(struct dasd_device *, int);
0844 void dasd_device_remove_stop_bits(struct dasd_device *, int);
0845 
0846 int dasd_device_is_ro(struct dasd_device *);
0847 
0848 void dasd_profile_reset(struct dasd_profile *);
0849 int dasd_profile_on(struct dasd_profile *);
0850 void dasd_profile_off(struct dasd_profile *);
0851 char *dasd_get_user_string(const char __user *, size_t);
0852 
0853 /* externals in dasd_devmap.c */
0854 extern int dasd_max_devindex;
0855 extern int dasd_probeonly;
0856 extern int dasd_autodetect;
0857 extern int dasd_nopav;
0858 extern int dasd_nofcx;
0859 
0860 int dasd_devmap_init(void);
0861 void dasd_devmap_exit(void);
0862 
0863 struct dasd_device *dasd_create_device(struct ccw_device *);
0864 void dasd_delete_device(struct dasd_device *);
0865 
0866 int dasd_get_feature(struct ccw_device *, int);
0867 int dasd_set_feature(struct ccw_device *, int, int);
0868 
0869 extern const struct attribute_group *dasd_dev_groups[];
0870 void dasd_path_create_kobj(struct dasd_device *, int);
0871 void dasd_path_create_kobjects(struct dasd_device *);
0872 void dasd_path_remove_kobjects(struct dasd_device *);
0873 
0874 struct dasd_device *dasd_device_from_cdev(struct ccw_device *);
0875 struct dasd_device *dasd_device_from_cdev_locked(struct ccw_device *);
0876 struct dasd_device *dasd_device_from_devindex(int);
0877 
0878 void dasd_add_link_to_gendisk(struct gendisk *, struct dasd_device *);
0879 struct dasd_device *dasd_device_from_gendisk(struct gendisk *);
0880 
0881 int dasd_parse(void) __init;
0882 int dasd_busid_known(const char *);
0883 
0884 /* externals in dasd_gendisk.c */
0885 int  dasd_gendisk_init(void);
0886 void dasd_gendisk_exit(void);
0887 int dasd_gendisk_alloc(struct dasd_block *);
0888 void dasd_gendisk_free(struct dasd_block *);
0889 int dasd_scan_partitions(struct dasd_block *);
0890 void dasd_destroy_partitions(struct dasd_block *);
0891 
0892 /* externals in dasd_ioctl.c */
0893 int dasd_ioctl(struct block_device *, fmode_t, unsigned int, unsigned long);
0894 int dasd_set_read_only(struct block_device *bdev, bool ro);
0895 
0896 /* externals in dasd_proc.c */
0897 int dasd_proc_init(void);
0898 void dasd_proc_exit(void);
0899 
0900 /* externals in dasd_erp.c */
0901 struct dasd_ccw_req *dasd_default_erp_action(struct dasd_ccw_req *);
0902 struct dasd_ccw_req *dasd_default_erp_postaction(struct dasd_ccw_req *);
0903 struct dasd_ccw_req *dasd_alloc_erp_request(unsigned int, int, int,
0904                         struct dasd_device *);
0905 void dasd_free_erp_request(struct dasd_ccw_req *, struct dasd_device *);
0906 void dasd_log_sense(struct dasd_ccw_req *, struct irb *);
0907 void dasd_log_sense_dbf(struct dasd_ccw_req *cqr, struct irb *irb);
0908 
0909 /* externals in dasd_3990_erp.c */
0910 struct dasd_ccw_req *dasd_3990_erp_action(struct dasd_ccw_req *);
0911 void dasd_3990_erp_handle_sim(struct dasd_device *, char *);
0912 
0913 /* externals in dasd_eer.c */
0914 #ifdef CONFIG_DASD_EER
0915 int dasd_eer_init(void);
0916 void dasd_eer_exit(void);
0917 int dasd_eer_enable(struct dasd_device *);
0918 void dasd_eer_disable(struct dasd_device *);
0919 void dasd_eer_write(struct dasd_device *, struct dasd_ccw_req *cqr,
0920             unsigned int id);
0921 void dasd_eer_snss(struct dasd_device *);
0922 
0923 static inline int dasd_eer_enabled(struct dasd_device *device)
0924 {
0925     return device->eer_cqr != NULL;
0926 }
0927 #else
0928 #define dasd_eer_init()     (0)
0929 #define dasd_eer_exit()     do { } while (0)
0930 #define dasd_eer_enable(d)  (0)
0931 #define dasd_eer_disable(d) do { } while (0)
0932 #define dasd_eer_write(d,c,i)   do { } while (0)
0933 #define dasd_eer_snss(d)    do { } while (0)
0934 #define dasd_eer_enabled(d) (0)
0935 #endif  /* CONFIG_DASD_ERR */
0936 
0937 
0938 /* DASD path handling functions */
0939 
0940 /*
0941  * helper functions to modify bit masks for a given channel path for a device
0942  */
0943 static inline int dasd_path_is_operational(struct dasd_device *device, int chp)
0944 {
0945     return test_bit(DASD_PATH_OPERATIONAL, &device->path[chp].flags);
0946 }
0947 
0948 static inline int dasd_path_need_verify(struct dasd_device *device, int chp)
0949 {
0950     return test_bit(DASD_PATH_TBV, &device->path[chp].flags);
0951 }
0952 
0953 static inline void dasd_path_verify(struct dasd_device *device, int chp)
0954 {
0955     __set_bit(DASD_PATH_TBV, &device->path[chp].flags);
0956 }
0957 
0958 static inline void dasd_path_clear_verify(struct dasd_device *device, int chp)
0959 {
0960     __clear_bit(DASD_PATH_TBV, &device->path[chp].flags);
0961 }
0962 
0963 static inline void dasd_path_clear_all_verify(struct dasd_device *device)
0964 {
0965     int chp;
0966 
0967     for (chp = 0; chp < 8; chp++)
0968         dasd_path_clear_verify(device, chp);
0969 }
0970 
0971 static inline void dasd_path_fcsec(struct dasd_device *device, int chp)
0972 {
0973     __set_bit(DASD_PATH_FCSEC, &device->path[chp].flags);
0974 }
0975 
0976 static inline void dasd_path_clear_fcsec(struct dasd_device *device, int chp)
0977 {
0978     __clear_bit(DASD_PATH_FCSEC, &device->path[chp].flags);
0979 }
0980 
0981 static inline int dasd_path_need_fcsec(struct dasd_device *device, int chp)
0982 {
0983     return test_bit(DASD_PATH_FCSEC, &device->path[chp].flags);
0984 }
0985 
0986 static inline void dasd_path_clear_all_fcsec(struct dasd_device *device)
0987 {
0988     int chp;
0989 
0990     for (chp = 0; chp < 8; chp++)
0991         dasd_path_clear_fcsec(device, chp);
0992 }
0993 
0994 static inline void dasd_path_operational(struct dasd_device *device, int chp)
0995 {
0996     __set_bit(DASD_PATH_OPERATIONAL, &device->path[chp].flags);
0997     device->opm |= (0x80 >> chp);
0998 }
0999 
1000 static inline void dasd_path_nonpreferred(struct dasd_device *device, int chp)
1001 {
1002     __set_bit(DASD_PATH_NPP, &device->path[chp].flags);
1003 }
1004 
1005 static inline int dasd_path_is_nonpreferred(struct dasd_device *device, int chp)
1006 {
1007     return test_bit(DASD_PATH_NPP, &device->path[chp].flags);
1008 }
1009 
1010 static inline void dasd_path_clear_nonpreferred(struct dasd_device *device,
1011                         int chp)
1012 {
1013     __clear_bit(DASD_PATH_NPP, &device->path[chp].flags);
1014 }
1015 
1016 static inline void dasd_path_preferred(struct dasd_device *device, int chp)
1017 {
1018     __set_bit(DASD_PATH_PP, &device->path[chp].flags);
1019 }
1020 
1021 static inline int dasd_path_is_preferred(struct dasd_device *device, int chp)
1022 {
1023     return test_bit(DASD_PATH_PP, &device->path[chp].flags);
1024 }
1025 
1026 static inline void dasd_path_clear_preferred(struct dasd_device *device,
1027                          int chp)
1028 {
1029     __clear_bit(DASD_PATH_PP, &device->path[chp].flags);
1030 }
1031 
1032 static inline void dasd_path_clear_oper(struct dasd_device *device, int chp)
1033 {
1034     __clear_bit(DASD_PATH_OPERATIONAL, &device->path[chp].flags);
1035     device->opm &= ~(0x80 >> chp);
1036 }
1037 
1038 static inline void dasd_path_clear_cable(struct dasd_device *device, int chp)
1039 {
1040     __clear_bit(DASD_PATH_MISCABLED, &device->path[chp].flags);
1041 }
1042 
1043 static inline void dasd_path_cuir(struct dasd_device *device, int chp)
1044 {
1045     __set_bit(DASD_PATH_CUIR, &device->path[chp].flags);
1046 }
1047 
1048 static inline int dasd_path_is_cuir(struct dasd_device *device, int chp)
1049 {
1050     return test_bit(DASD_PATH_CUIR, &device->path[chp].flags);
1051 }
1052 
1053 static inline void dasd_path_clear_cuir(struct dasd_device *device, int chp)
1054 {
1055     __clear_bit(DASD_PATH_CUIR, &device->path[chp].flags);
1056 }
1057 
1058 static inline void dasd_path_ifcc(struct dasd_device *device, int chp)
1059 {
1060     set_bit(DASD_PATH_IFCC, &device->path[chp].flags);
1061 }
1062 
1063 static inline int dasd_path_is_ifcc(struct dasd_device *device, int chp)
1064 {
1065     return test_bit(DASD_PATH_IFCC, &device->path[chp].flags);
1066 }
1067 
1068 static inline void dasd_path_clear_ifcc(struct dasd_device *device, int chp)
1069 {
1070     clear_bit(DASD_PATH_IFCC, &device->path[chp].flags);
1071 }
1072 
1073 static inline void dasd_path_clear_nohpf(struct dasd_device *device, int chp)
1074 {
1075     __clear_bit(DASD_PATH_NOHPF, &device->path[chp].flags);
1076 }
1077 
1078 static inline void dasd_path_miscabled(struct dasd_device *device, int chp)
1079 {
1080     __set_bit(DASD_PATH_MISCABLED, &device->path[chp].flags);
1081 }
1082 
1083 static inline int dasd_path_is_miscabled(struct dasd_device *device, int chp)
1084 {
1085     return test_bit(DASD_PATH_MISCABLED, &device->path[chp].flags);
1086 }
1087 
1088 static inline void dasd_path_nohpf(struct dasd_device *device, int chp)
1089 {
1090     __set_bit(DASD_PATH_NOHPF, &device->path[chp].flags);
1091 }
1092 
1093 static inline int dasd_path_is_nohpf(struct dasd_device *device, int chp)
1094 {
1095     return test_bit(DASD_PATH_NOHPF, &device->path[chp].flags);
1096 }
1097 
1098 /*
1099  * get functions for path masks
1100  * will return a path masks for the given device
1101  */
1102 
1103 static inline __u8 dasd_path_get_opm(struct dasd_device *device)
1104 {
1105     return device->opm;
1106 }
1107 
1108 static inline __u8 dasd_path_get_tbvpm(struct dasd_device *device)
1109 {
1110     int chp;
1111     __u8 tbvpm = 0x00;
1112 
1113     for (chp = 0; chp < 8; chp++)
1114         if (dasd_path_need_verify(device, chp))
1115             tbvpm |= 0x80 >> chp;
1116     return tbvpm;
1117 }
1118 
1119 static inline int dasd_path_get_fcsecpm(struct dasd_device *device)
1120 {
1121     int chp;
1122 
1123     for (chp = 0; chp < 8; chp++)
1124         if (dasd_path_need_fcsec(device, chp))
1125             return 1;
1126 
1127     return 0;
1128 }
1129 
1130 static inline __u8 dasd_path_get_nppm(struct dasd_device *device)
1131 {
1132     int chp;
1133     __u8 npm = 0x00;
1134 
1135     for (chp = 0; chp < 8; chp++) {
1136         if (dasd_path_is_nonpreferred(device, chp))
1137             npm |= 0x80 >> chp;
1138     }
1139     return npm;
1140 }
1141 
1142 static inline __u8 dasd_path_get_ppm(struct dasd_device *device)
1143 {
1144     int chp;
1145     __u8 ppm = 0x00;
1146 
1147     for (chp = 0; chp < 8; chp++)
1148         if (dasd_path_is_preferred(device, chp))
1149             ppm |= 0x80 >> chp;
1150     return ppm;
1151 }
1152 
1153 static inline __u8 dasd_path_get_cablepm(struct dasd_device *device)
1154 {
1155     int chp;
1156     __u8 cablepm = 0x00;
1157 
1158     for (chp = 0; chp < 8; chp++)
1159         if (dasd_path_is_miscabled(device, chp))
1160             cablepm |= 0x80 >> chp;
1161     return cablepm;
1162 }
1163 
1164 static inline __u8 dasd_path_get_cuirpm(struct dasd_device *device)
1165 {
1166     int chp;
1167     __u8 cuirpm = 0x00;
1168 
1169     for (chp = 0; chp < 8; chp++)
1170         if (dasd_path_is_cuir(device, chp))
1171             cuirpm |= 0x80 >> chp;
1172     return cuirpm;
1173 }
1174 
1175 static inline __u8 dasd_path_get_ifccpm(struct dasd_device *device)
1176 {
1177     int chp;
1178     __u8 ifccpm = 0x00;
1179 
1180     for (chp = 0; chp < 8; chp++)
1181         if (dasd_path_is_ifcc(device, chp))
1182             ifccpm |= 0x80 >> chp;
1183     return ifccpm;
1184 }
1185 
1186 static inline __u8 dasd_path_get_hpfpm(struct dasd_device *device)
1187 {
1188     int chp;
1189     __u8 hpfpm = 0x00;
1190 
1191     for (chp = 0; chp < 8; chp++)
1192         if (dasd_path_is_nohpf(device, chp))
1193             hpfpm |= 0x80 >> chp;
1194     return hpfpm;
1195 }
1196 
1197 static inline u8 dasd_path_get_fcs_path(struct dasd_device *device, int chp)
1198 {
1199     return device->path[chp].fc_security;
1200 }
1201 
1202 static inline int dasd_path_get_fcs_device(struct dasd_device *device)
1203 {
1204     u8 fc_sec = 0;
1205     int chp;
1206 
1207     for (chp = 0; chp < 8; chp++) {
1208         if (device->opm & (0x80 >> chp)) {
1209             fc_sec = device->path[chp].fc_security;
1210             break;
1211         }
1212     }
1213     for (; chp < 8; chp++) {
1214         if (device->opm & (0x80 >> chp))
1215             if (device->path[chp].fc_security != fc_sec)
1216                 return -EINVAL;
1217     }
1218 
1219     return fc_sec;
1220 }
1221 
1222 /*
1223  * add functions for path masks
1224  * the existing path mask will be extended by the given path mask
1225  */
1226 static inline void dasd_path_add_tbvpm(struct dasd_device *device, __u8 pm)
1227 {
1228     int chp;
1229 
1230     for (chp = 0; chp < 8; chp++)
1231         if (pm & (0x80 >> chp))
1232             dasd_path_verify(device, chp);
1233 }
1234 
1235 static inline __u8 dasd_path_get_notoperpm(struct dasd_device *device)
1236 {
1237     int chp;
1238     __u8 nopm = 0x00;
1239 
1240     for (chp = 0; chp < 8; chp++)
1241         if (dasd_path_is_nohpf(device, chp) ||
1242             dasd_path_is_ifcc(device, chp) ||
1243             dasd_path_is_cuir(device, chp) ||
1244             dasd_path_is_miscabled(device, chp))
1245             nopm |= 0x80 >> chp;
1246     return nopm;
1247 }
1248 
1249 static inline void dasd_path_add_opm(struct dasd_device *device, __u8 pm)
1250 {
1251     int chp;
1252 
1253     for (chp = 0; chp < 8; chp++)
1254         if (pm & (0x80 >> chp)) {
1255             dasd_path_operational(device, chp);
1256             /*
1257              * if the path is used
1258              * it should not be in one of the negative lists
1259              */
1260             dasd_path_clear_nohpf(device, chp);
1261             dasd_path_clear_cuir(device, chp);
1262             dasd_path_clear_cable(device, chp);
1263             dasd_path_clear_ifcc(device, chp);
1264         }
1265 }
1266 
1267 static inline void dasd_path_add_cablepm(struct dasd_device *device, __u8 pm)
1268 {
1269     int chp;
1270 
1271     for (chp = 0; chp < 8; chp++)
1272         if (pm & (0x80 >> chp))
1273             dasd_path_miscabled(device, chp);
1274 }
1275 
1276 static inline void dasd_path_add_cuirpm(struct dasd_device *device, __u8 pm)
1277 {
1278     int chp;
1279 
1280     for (chp = 0; chp < 8; chp++)
1281         if (pm & (0x80 >> chp))
1282             dasd_path_cuir(device, chp);
1283 }
1284 
1285 static inline void dasd_path_add_ifccpm(struct dasd_device *device, __u8 pm)
1286 {
1287     int chp;
1288 
1289     for (chp = 0; chp < 8; chp++)
1290         if (pm & (0x80 >> chp))
1291             dasd_path_ifcc(device, chp);
1292 }
1293 
1294 static inline void dasd_path_add_nppm(struct dasd_device *device, __u8 pm)
1295 {
1296     int chp;
1297 
1298     for (chp = 0; chp < 8; chp++)
1299         if (pm & (0x80 >> chp))
1300             dasd_path_nonpreferred(device, chp);
1301 }
1302 
1303 static inline void dasd_path_add_nohpfpm(struct dasd_device *device, __u8 pm)
1304 {
1305     int chp;
1306 
1307     for (chp = 0; chp < 8; chp++)
1308         if (pm & (0x80 >> chp))
1309             dasd_path_nohpf(device, chp);
1310 }
1311 
1312 static inline void dasd_path_add_ppm(struct dasd_device *device, __u8 pm)
1313 {
1314     int chp;
1315 
1316     for (chp = 0; chp < 8; chp++)
1317         if (pm & (0x80 >> chp))
1318             dasd_path_preferred(device, chp);
1319 }
1320 
1321 static inline void dasd_path_add_fcsecpm(struct dasd_device *device, __u8 pm)
1322 {
1323     int chp;
1324 
1325     for (chp = 0; chp < 8; chp++)
1326         if (pm & (0x80 >> chp))
1327             dasd_path_fcsec(device, chp);
1328 }
1329 
1330 /*
1331  * set functions for path masks
1332  * the existing path mask will be replaced by the given path mask
1333  */
1334 static inline void dasd_path_set_tbvpm(struct dasd_device *device, __u8 pm)
1335 {
1336     int chp;
1337 
1338     for (chp = 0; chp < 8; chp++)
1339         if (pm & (0x80 >> chp))
1340             dasd_path_verify(device, chp);
1341         else
1342             dasd_path_clear_verify(device, chp);
1343 }
1344 
1345 static inline void dasd_path_set_opm(struct dasd_device *device, __u8 pm)
1346 {
1347     int chp;
1348 
1349     for (chp = 0; chp < 8; chp++) {
1350         dasd_path_clear_oper(device, chp);
1351         if (pm & (0x80 >> chp)) {
1352             dasd_path_operational(device, chp);
1353             /*
1354              * if the path is used
1355              * it should not be in one of the negative lists
1356              */
1357             dasd_path_clear_nohpf(device, chp);
1358             dasd_path_clear_cuir(device, chp);
1359             dasd_path_clear_cable(device, chp);
1360             dasd_path_clear_ifcc(device, chp);
1361         }
1362     }
1363 }
1364 
1365 /*
1366  * remove functions for path masks
1367  * the existing path mask will be cleared with the given path mask
1368  */
1369 static inline void dasd_path_remove_opm(struct dasd_device *device, __u8 pm)
1370 {
1371     int chp;
1372 
1373     for (chp = 0; chp < 8; chp++) {
1374         if (pm & (0x80 >> chp))
1375             dasd_path_clear_oper(device, chp);
1376     }
1377 }
1378 
1379 /*
1380  * add the newly available path to the to be verified pm and remove it from
1381  * normal operation until it is verified
1382  */
1383 static inline void dasd_path_available(struct dasd_device *device, int chp)
1384 {
1385     dasd_path_clear_oper(device, chp);
1386     dasd_path_verify(device, chp);
1387 }
1388 
1389 static inline void dasd_path_notoper(struct dasd_device *device, int chp)
1390 {
1391     dasd_path_clear_oper(device, chp);
1392     dasd_path_clear_preferred(device, chp);
1393     dasd_path_clear_nonpreferred(device, chp);
1394 }
1395 
1396 static inline void dasd_path_fcsec_update(struct dasd_device *device, int chp)
1397 {
1398     dasd_path_fcsec(device, chp);
1399 }
1400 
1401 /*
1402  * remove all paths from normal operation
1403  */
1404 static inline void dasd_path_no_path(struct dasd_device *device)
1405 {
1406     int chp;
1407 
1408     for (chp = 0; chp < 8; chp++)
1409         dasd_path_notoper(device, chp);
1410 
1411     dasd_path_clear_all_verify(device);
1412 }
1413 
1414 /* end - path handling */
1415 
1416 #endif              /* DASD_H */