linux/include/scsi/scsi_dh.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * Header file for SCSI device handler infrastructure.
   4 *
   5 * Modified version of patches posted by Mike Christie <michaelc@cs.wisc.edu>
   6 *
   7 * Copyright IBM Corporation, 2007
   8 *      Authors:
   9 *               Chandra Seetharaman <sekharan@us.ibm.com>
  10 *               Mike Anderson <andmike@linux.vnet.ibm.com>
  11 */
  12
  13#include <scsi/scsi_device.h>
  14
  15enum {
  16        SCSI_DH_OK = 0,
  17        /*
  18         * device errors
  19         */
  20        SCSI_DH_DEV_FAILED,     /* generic device error */
  21        SCSI_DH_DEV_TEMP_BUSY,
  22        SCSI_DH_DEV_UNSUPP,     /* device handler not supported */
  23        SCSI_DH_DEVICE_MAX,     /* max device blkerr definition */
  24
  25        /*
  26         * transport errors
  27         */
  28        SCSI_DH_NOTCONN = SCSI_DH_DEVICE_MAX + 1,
  29        SCSI_DH_CONN_FAILURE,
  30        SCSI_DH_TRANSPORT_MAX,  /* max transport blkerr definition */
  31
  32        /*
  33         * driver and generic errors
  34         */
  35        SCSI_DH_IO = SCSI_DH_TRANSPORT_MAX + 1, /* generic error */
  36        SCSI_DH_INVALID_IO,
  37        SCSI_DH_RETRY,          /* retry the req, but not immediately */
  38        SCSI_DH_IMM_RETRY,      /* immediately retry the req */
  39        SCSI_DH_TIMED_OUT,
  40        SCSI_DH_RES_TEMP_UNAVAIL,
  41        SCSI_DH_DEV_OFFLINED,
  42        SCSI_DH_NOMEM,
  43        SCSI_DH_NOSYS,
  44        SCSI_DH_DRIVER_MAX,
  45};
  46
  47typedef void (*activate_complete)(void *, int);
  48struct scsi_device_handler {
  49        /* Used by the infrastructure */
  50        struct list_head list; /* list of scsi_device_handlers */
  51
  52        /* Filled by the hardware handler */
  53        struct module *module;
  54        const char *name;
  55        enum scsi_disposition (*check_sense)(struct scsi_device *,
  56                                             struct scsi_sense_hdr *);
  57        int (*attach)(struct scsi_device *);
  58        void (*detach)(struct scsi_device *);
  59        int (*activate)(struct scsi_device *, activate_complete, void *);
  60        blk_status_t (*prep_fn)(struct scsi_device *, struct request *);
  61        int (*set_params)(struct scsi_device *, const char *);
  62        void (*rescan)(struct scsi_device *);
  63};
  64
  65#ifdef CONFIG_SCSI_DH
  66extern int scsi_dh_activate(struct request_queue *, activate_complete, void *);
  67extern int scsi_dh_attach(struct request_queue *, const char *);
  68extern const char *scsi_dh_attached_handler_name(struct request_queue *, gfp_t);
  69extern int scsi_dh_set_params(struct request_queue *, const char *);
  70#else
  71static inline int scsi_dh_activate(struct request_queue *req,
  72                                        activate_complete fn, void *data)
  73{
  74        fn(data, 0);
  75        return 0;
  76}
  77static inline int scsi_dh_attach(struct request_queue *req, const char *name)
  78{
  79        return SCSI_DH_NOSYS;
  80}
  81static inline const char *scsi_dh_attached_handler_name(struct request_queue *q,
  82                                                        gfp_t gfp)
  83{
  84        return NULL;
  85}
  86static inline int scsi_dh_set_params(struct request_queue *req, const char *params)
  87{
  88        return -SCSI_DH_NOSYS;
  89}
  90#endif
  91