2011-11-16 09:46:48 -05:00
# ifndef TARGET_CORE_BACKEND_H
# define TARGET_CORE_BACKEND_H
# define TRANSPORT_PLUGIN_PHBA_PDEV 1
# define TRANSPORT_PLUGIN_VHBA_PDEV 2
# define TRANSPORT_PLUGIN_VHBA_VDEV 3
2014-11-27 13:59:20 -08:00
struct target_backend_cits {
struct config_item_type tb_dev_cit ;
2014-11-27 14:51:14 -08:00
struct config_item_type tb_dev_attrib_cit ;
2014-11-27 14:57:01 -08:00
struct config_item_type tb_dev_pr_cit ;
2014-11-27 15:01:12 -08:00
struct config_item_type tb_dev_wwn_cit ;
2014-11-27 15:06:23 -08:00
struct config_item_type tb_dev_alua_tg_pt_gps_cit ;
2014-11-27 15:09:32 -08:00
struct config_item_type tb_dev_stat_cit ;
2014-11-27 13:59:20 -08:00
} ;
2011-11-16 09:46:48 -05:00
struct se_subsystem_api {
struct list_head sub_api_list ;
char name [ 16 ] ;
2012-10-08 00:03:19 -04:00
char inquiry_prod [ 16 ] ;
char inquiry_rev [ 4 ] ;
2011-11-16 09:46:48 -05:00
struct module * owner ;
u8 transport_type ;
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 00: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 17:09:15 +02:00
void ( * transport_complete ) ( struct se_cmd * cmd ,
struct scatterlist * ,
unsigned char * ) ;
2012-05-20 11:59:14 -04:00
2012-11-06 12:24:09 -08:00
sense_reason_t ( * parse_cdb ) ( struct se_cmd * cmd ) ;
2011-11-16 09:46:48 -05:00
u32 ( * get_device_type ) ( struct se_device * ) ;
sector_t ( * get_blocks ) ( struct se_device * ) ;
2013-11-11 08:59:17 -08: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 00:25:06 -04:00
unsigned char * ( * get_sense_buffer ) ( struct se_cmd * ) ;
2013-01-29 22:10:06 -08:00
bool ( * get_write_cache ) ( struct se_device * ) ;
2013-12-23 20:28:13 +00:00
int ( * init_prot ) ( struct se_device * ) ;
int ( * format_prot ) ( struct se_device * ) ;
void ( * free_prot ) ( struct se_device * ) ;
2014-11-27 13:59:20 -08:00
struct target_backend_cits tb_cits ;
2011-11-16 09:46:48 -05:00
} ;
2012-10-07 10:55:50 -04:00
struct sbc_ops {
2013-08-19 23:57:30 -07:00
sense_reason_t ( * execute_rw ) ( struct se_cmd * cmd , struct scatterlist * ,
u32 , enum dma_data_direction ) ;
2012-11-06 12:24:09 -08:00
sense_reason_t ( * execute_sync_cache ) ( struct se_cmd * cmd ) ;
sense_reason_t ( * execute_write_same ) ( struct se_cmd * cmd ) ;
2012-11-07 20:01:10 -08:00
sense_reason_t ( * execute_write_same_unmap ) ( struct se_cmd * cmd ) ;
2012-11-06 12:24:09 -08:00
sense_reason_t ( * execute_unmap ) ( struct se_cmd * cmd ) ;
2012-06-17 18:40:52 -04:00
} ;
2011-11-16 09:46:48 -05:00
int transport_subsystem_register ( struct se_subsystem_api * ) ;
void transport_subsystem_release ( struct se_subsystem_api * ) ;
2012-04-23 11:35:33 -04:00
void target_complete_cmd ( struct se_cmd * , u8 ) ;
2014-06-10 11:07:47 -07:00
void target_complete_cmd_with_length ( struct se_cmd * , u8 , int ) ;
2011-11-16 09:46:48 -05:00
2012-11-06 12:24:09 -08: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 09:53:35 +01: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 11:59:14 -04:00
2012-11-06 12:24:09 -08:00
sense_reason_t sbc_parse_cdb ( struct se_cmd * cmd , struct sbc_ops * ops ) ;
2012-10-07 10: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 09:52:57 -08:00
sector_t sbc_get_write_same_sectors ( struct se_cmd * cmd ) ;
2013-02-25 14:03:46 +08:00
sense_reason_t sbc_execute_unmap ( struct se_cmd * cmd ,
sense_reason_t ( * do_unmap_fn ) ( struct se_cmd * cmd , void * priv ,
sector_t lba , sector_t nolb ) ,
void * priv ) ;
2014-04-02 14:19:09 -07:00
void sbc_dif_generate ( struct se_cmd * ) ;
2014-01-07 22:44:57 +00:00
sense_reason_t sbc_dif_verify_write ( struct se_cmd * , sector_t , unsigned int ,
unsigned int , struct scatterlist * , int ) ;
sense_reason_t sbc_dif_verify_read ( struct se_cmd * , sector_t , unsigned int ,
unsigned int , struct scatterlist * , int ) ;
2014-04-02 14:34:11 -07:00
sense_reason_t sbc_dif_read_strip ( struct se_cmd * ) ;
2012-10-07 10:55:53 -04:00
2011-11-16 09:46:48 -05: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 * ) ;
/* core helpers also used by command snooping in pscsi */
2012-01-16 16:57:08 -08:00
void * transport_kmap_data_sg ( struct se_cmd * ) ;
void transport_kunmap_data_sg ( struct se_cmd * ) ;
2013-08-22 11:58:43 -07:00
/* core helpers also used by xcopy during internal command setup */
int target_alloc_sgl ( struct scatterlist * * , unsigned int * , u32 , bool ) ;
sense_reason_t transport_generic_map_mem_to_cmd ( struct se_cmd * ,
struct scatterlist * , u32 , struct scatterlist * , u32 ) ;
2011-11-16 09:46:48 -05:00
2012-03-15 15:05:12 -04:00
void array_free ( void * array , int n ) ;
2014-11-27 13:59:20 -08:00
/* From target_core_configfs.c to setup default backend config_item_types */
void target_core_setup_sub_cits ( struct se_subsystem_api * ) ;
2014-11-27 19:15:48 -08:00
/* attribute helpers from target_core_device.c for backend drivers */
2015-03-19 14:30:13 +01:00
bool se_dev_check_wce ( struct se_device * ) ;
2014-11-27 19:15:48 -08:00
int se_dev_set_max_unmap_lba_count ( struct se_device * , u32 ) ;
int se_dev_set_max_unmap_block_desc_count ( struct se_device * , u32 ) ;
int se_dev_set_unmap_granularity ( struct se_device * , u32 ) ;
int se_dev_set_unmap_granularity_alignment ( struct se_device * , u32 ) ;
int se_dev_set_max_write_same_len ( struct se_device * , u32 ) ;
int se_dev_set_emulate_model_alias ( struct se_device * , int ) ;
int se_dev_set_emulate_dpo ( struct se_device * , int ) ;
int se_dev_set_emulate_fua_write ( struct se_device * , int ) ;
int se_dev_set_emulate_fua_read ( struct se_device * , int ) ;
int se_dev_set_emulate_write_cache ( struct se_device * , int ) ;
int se_dev_set_emulate_ua_intlck_ctrl ( struct se_device * , int ) ;
int se_dev_set_emulate_tas ( struct se_device * , int ) ;
int se_dev_set_emulate_tpu ( struct se_device * , int ) ;
int se_dev_set_emulate_tpws ( struct se_device * , int ) ;
int se_dev_set_emulate_caw ( struct se_device * , int ) ;
int se_dev_set_emulate_3pc ( struct se_device * , int ) ;
int se_dev_set_pi_prot_type ( struct se_device * , int ) ;
int se_dev_set_pi_prot_format ( struct se_device * , int ) ;
int se_dev_set_enforce_pr_isids ( struct se_device * , int ) ;
int se_dev_set_force_pr_aptpl ( struct se_device * , int ) ;
int se_dev_set_is_nonrot ( struct se_device * , int ) ;
int se_dev_set_emulate_rest_reord ( struct se_device * dev , int ) ;
int se_dev_set_queue_depth ( struct se_device * , u32 ) ;
int se_dev_set_max_sectors ( struct se_device * , u32 ) ;
int se_dev_set_optimal_sectors ( struct se_device * , u32 ) ;
int se_dev_set_block_size ( struct se_device * , u32 ) ;
2011-11-16 09:46:48 -05:00
# endif /* TARGET_CORE_BACKEND_H */