2011-11-16 18:46:48 +04:00
# ifndef TARGET_CORE_BACKEND_H
# define TARGET_CORE_BACKEND_H
2016-11-15 02:47:14 +03:00
# include <linux/types.h>
# include <target/target_core_base.h>
2017-03-02 08:13:24 +03:00
# define TRANSPORT_FLAG_PASSTHROUGH 0x1
/*
* ALUA commands , state checks and setup operations are handled by the
* backend module .
*/
# define TRANSPORT_FLAG_PASSTHROUGH_ALUA 0x2
2017-04-22 04:40:50 +03:00
# define TRANSPORT_FLAG_PASSTHROUGH_PGR 0x4
2011-11-16 18:46:48 +04:00
2016-11-15 02:47:14 +03:00
struct request_queue ;
struct scatterlist ;
2015-05-10 19:14:56 +03:00
struct target_backend_ops {
2011-11-16 18:46:48 +04:00
char name [ 16 ] ;
2012-10-08 08:03:19 +04:00
char inquiry_prod [ 16 ] ;
char inquiry_rev [ 4 ] ;
2011-11-16 18:46:48 +04:00
struct module * owner ;
2015-05-20 00:44:41 +03:00
u8 transport_flags ;
2011-11-16 18:46:48 +04:00
int ( * attach_hba ) ( struct se_hba * , u32 ) ;
void ( * detach_hba ) ( struct se_hba * ) ;
int ( * pmode_enable_hba ) ( struct se_hba * , unsigned long ) ;
2012-10-08 08:03:19 +04:00
struct se_device * ( * alloc_device ) ( struct se_hba * , const char * ) ;
int ( * configure_device ) ( struct se_device * ) ;
void ( * free_device ) ( struct se_device * device ) ;
ssize_t ( * set_configfs_dev_params ) ( struct se_device * ,
const char * , ssize_t ) ;
ssize_t ( * show_configfs_dev_params ) ( struct se_device * , char * ) ;
2012-09-05 19:09:15 +04:00
void ( * transport_complete ) ( struct se_cmd * cmd ,
struct scatterlist * ,
unsigned char * ) ;
2012-05-20 19:59:14 +04:00
2012-11-07 00:24:09 +04:00
sense_reason_t ( * parse_cdb ) ( struct se_cmd * cmd ) ;
2011-11-16 18:46:48 +04:00
u32 ( * get_device_type ) ( struct se_device * ) ;
sector_t ( * get_blocks ) ( struct se_device * ) ;
2013-11-11 20:59:17 +04:00
sector_t ( * get_alignment_offset_lbas ) ( struct se_device * ) ;
/* lbppbe = logical blocks per physical block exponent. see SBC-3 */
unsigned int ( * get_lbppbe ) ( struct se_device * ) ;
unsigned int ( * get_io_min ) ( struct se_device * ) ;
unsigned int ( * get_io_opt ) ( struct se_device * ) ;
2012-04-24 08:25:06 +04:00
unsigned char * ( * get_sense_buffer ) ( struct se_cmd * ) ;
2013-01-30 10:10:06 +04:00
bool ( * get_write_cache ) ( struct se_device * ) ;
2013-12-24 00:28:13 +04:00
int ( * init_prot ) ( struct se_device * ) ;
int ( * format_prot ) ( struct se_device * ) ;
void ( * free_prot ) ( struct se_device * ) ;
2014-11-28 00:59:20 +03:00
2015-05-10 19:14:56 +03:00
struct configfs_attribute * * tb_dev_attrib_attrs ;
2011-11-16 18:46:48 +04:00
} ;
2012-10-07 18:55:50 +04:00
struct sbc_ops {
2013-08-20 10:57:30 +04:00
sense_reason_t ( * execute_rw ) ( struct se_cmd * cmd , struct scatterlist * ,
u32 , enum dma_data_direction ) ;
2012-11-07 00:24:09 +04:00
sense_reason_t ( * execute_sync_cache ) ( struct se_cmd * cmd ) ;
sense_reason_t ( * execute_write_same ) ( struct se_cmd * cmd ) ;
2015-06-19 16:10:59 +03:00
sense_reason_t ( * execute_unmap ) ( struct se_cmd * cmd ,
sector_t lba , sector_t nolb ) ;
2012-06-18 02:40:52 +04:00
} ;
2015-05-10 19:14:56 +03:00
int transport_backend_register ( const struct target_backend_ops * ) ;
void target_backend_unregister ( const struct target_backend_ops * ) ;
2011-11-16 18:46:48 +04:00
2012-04-23 19:35:33 +04:00
void target_complete_cmd ( struct se_cmd * , u8 ) ;
2014-06-10 22:07:47 +04:00
void target_complete_cmd_with_length ( struct se_cmd * , u8 , int ) ;
2011-11-16 18:46:48 +04:00
2012-11-07 00:24:09 +04:00
sense_reason_t spc_parse_cdb ( struct se_cmd * cmd , unsigned int * size ) ;
sense_reason_t spc_emulate_report_luns ( struct se_cmd * cmd ) ;
2012-12-17 12:53:35 +04:00
sense_reason_t spc_emulate_inquiry_std ( struct se_cmd * , unsigned char * ) ;
sense_reason_t spc_emulate_evpd_83 ( struct se_cmd * , unsigned char * ) ;
2012-05-20 19:59:14 +04:00
2012-11-07 00:24:09 +04:00
sense_reason_t sbc_parse_cdb ( struct se_cmd * cmd , struct sbc_ops * ops ) ;
2012-10-07 18:55:53 +04:00
u32 sbc_get_device_rev ( struct se_device * dev ) ;
u32 sbc_get_device_type ( struct se_device * dev ) ;
2013-02-22 21:52:57 +04:00
sector_t sbc_get_write_same_sectors ( struct se_cmd * cmd ) ;
2014-04-03 01:19:09 +04:00
void sbc_dif_generate ( struct se_cmd * ) ;
2015-04-19 20:27:19 +03:00
sense_reason_t sbc_dif_verify ( struct se_cmd * , sector_t , unsigned int ,
2014-01-08 02:44:57 +04:00
unsigned int , struct scatterlist * , int ) ;
2015-04-19 20:27:19 +03:00
void sbc_dif_copy_prot ( struct se_cmd * , unsigned int , bool ,
struct scatterlist * , int ) ;
2011-11-16 18:46:48 +04:00
void transport_set_vpd_proto_id ( struct t10_vpd * , unsigned char * ) ;
int transport_set_vpd_assoc ( struct t10_vpd * , unsigned char * ) ;
int transport_set_vpd_ident_type ( struct t10_vpd * , unsigned char * ) ;
int transport_set_vpd_ident ( struct t10_vpd * , unsigned char * ) ;
2015-05-10 19:14:57 +03:00
extern struct configfs_attribute * sbc_attrib_attrs [ ] ;
extern struct configfs_attribute * passthrough_attrib_attrs [ ] ;
2011-11-16 18:46:48 +04:00
/* core helpers also used by command snooping in pscsi */
2012-01-17 04:57:08 +04:00
void * transport_kmap_data_sg ( struct se_cmd * ) ;
void transport_kunmap_data_sg ( struct se_cmd * ) ;
2013-08-22 22:58:43 +04:00
/* core helpers also used by xcopy during internal command setup */
sense_reason_t transport_generic_map_mem_to_cmd ( struct se_cmd * ,
struct scatterlist * , u32 , struct scatterlist * , u32 ) ;
2011-11-16 18:46:48 +04:00
2015-03-23 06:42:19 +03:00
bool target_lun_is_rdonly ( struct se_cmd * ) ;
2015-05-20 00:44:40 +03:00
sense_reason_t passthrough_parse_cdb ( struct se_cmd * cmd ,
sense_reason_t ( * exec_cmd ) ( struct se_cmd * cmd ) ) ;
2014-11-28 06:15:48 +03:00
2015-07-16 10:28:05 +03:00
bool target_sense_desc_format ( struct se_device * dev ) ;
2016-01-18 23:09:27 +03:00
sector_t target_to_linux_sector ( struct se_device * dev , sector_t lb ) ;
bool target_configure_unmap_from_queue ( struct se_dev_attrib * attrib ,
2016-06-03 04:12:37 +03:00
struct request_queue * q ) ;
2015-07-16 10:28:05 +03:00
2011-11-16 18:46:48 +04:00
# endif /* TARGET_CORE_BACKEND_H */