2019-05-27 09:55:05 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2008-05-02 01:49:46 +04:00
/*
* Header file for SCSI device handler infrastruture .
*
* Modified version of patches posted by Mike Christie < michaelc @ cs . wisc . edu >
*
* Copyright IBM Corporation , 2007
* Authors :
* Chandra Seetharaman < sekharan @ us . ibm . com >
* Mike Anderson < andmike @ linux . vnet . ibm . com >
*/
# include <scsi/scsi_device.h>
enum {
SCSI_DH_OK = 0 ,
/*
* device errors
*/
SCSI_DH_DEV_FAILED , /* generic device error */
SCSI_DH_DEV_TEMP_BUSY ,
2008-07-18 03:53:03 +04:00
SCSI_DH_DEV_UNSUPP , /* device handler not supported */
2008-05-02 01:49:46 +04:00
SCSI_DH_DEVICE_MAX , /* max device blkerr definition */
/*
* transport errors
*/
SCSI_DH_NOTCONN = SCSI_DH_DEVICE_MAX + 1 ,
SCSI_DH_CONN_FAILURE ,
SCSI_DH_TRANSPORT_MAX , /* max transport blkerr definition */
/*
* driver and generic errors
*/
SCSI_DH_IO = SCSI_DH_TRANSPORT_MAX + 1 , /* generic error */
SCSI_DH_INVALID_IO ,
SCSI_DH_RETRY , /* retry the req, but not immediately */
SCSI_DH_IMM_RETRY , /* immediately retry the req */
SCSI_DH_TIMED_OUT ,
SCSI_DH_RES_TEMP_UNAVAIL ,
SCSI_DH_DEV_OFFLINED ,
2016-02-19 11:17:04 +03:00
SCSI_DH_NOMEM ,
2008-05-02 01:49:46 +04:00
SCSI_DH_NOSYS ,
SCSI_DH_DRIVER_MAX ,
} ;
2015-08-27 15:16:59 +03:00
typedef void ( * activate_complete ) ( void * , int ) ;
struct scsi_device_handler {
/* Used by the infrastructure */
struct list_head list ; /* list of scsi_device_handlers */
/* Filled by the hardware handler */
struct module * module ;
const char * name ;
int ( * check_sense ) ( struct scsi_device * , struct scsi_sense_hdr * ) ;
int ( * attach ) ( struct scsi_device * ) ;
void ( * detach ) ( struct scsi_device * ) ;
int ( * activate ) ( struct scsi_device * , activate_complete , void * ) ;
2018-11-09 16:42:40 +03:00
blk_status_t ( * prep_fn ) ( struct scsi_device * , struct request * ) ;
2015-08-27 15:16:59 +03:00
int ( * set_params ) ( struct scsi_device * , const char * ) ;
2016-02-19 11:17:16 +03:00
void ( * rescan ) ( struct scsi_device * ) ;
2015-08-27 15:16:59 +03:00
} ;
2015-08-27 15:16:57 +03:00
# ifdef CONFIG_SCSI_DH
2009-10-21 20:22:46 +04:00
extern int scsi_dh_activate ( struct request_queue * , activate_complete , void * ) ;
2008-07-18 04:49:02 +04:00
extern int scsi_dh_attach ( struct request_queue * , const char * ) ;
2012-06-26 22:32:03 +04:00
extern const char * scsi_dh_attached_handler_name ( struct request_queue * , gfp_t ) ;
2009-08-03 23:42:33 +04:00
extern int scsi_dh_set_params ( struct request_queue * , const char * ) ;
2008-05-24 05:16:40 +04:00
# else
2009-10-21 20:22:46 +04:00
static inline int scsi_dh_activate ( struct request_queue * req ,
activate_complete fn , void * data )
2008-05-24 05:16:40 +04:00
{
2009-10-21 20:22:46 +04:00
fn ( data , 0 ) ;
2008-05-24 05:16:40 +04:00
return 0 ;
}
2008-07-18 04:49:02 +04:00
static inline int scsi_dh_attach ( struct request_queue * req , const char * name )
{
return SCSI_DH_NOSYS ;
}
2012-06-26 22:32:03 +04:00
static inline const char * scsi_dh_attached_handler_name ( struct request_queue * q ,
gfp_t gfp )
{
return NULL ;
}
2009-08-03 23:42:33 +04:00
static inline int scsi_dh_set_params ( struct request_queue * req , const char * params )
{
return - SCSI_DH_NOSYS ;
}
2008-05-24 05:16:40 +04:00
# endif