2011-11-16 09:46:48 -05:00
# ifndef TARGET_CORE_BACKEND_H
# define TARGET_CORE_BACKEND_H
2016-11-14 15:47:14 -08:00
# include <linux/types.h>
2017-05-23 16:48:27 -07:00
# include <asm/unaligned.h>
2016-11-14 15:47:14 -08:00
# include <target/target_core_base.h>
2017-03-01 23:13:24 -06: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-21 20:40:50 -05:00
# define TRANSPORT_FLAG_PASSTHROUGH_PGR 0x4
2011-11-16 09:46:48 -05:00
2016-11-14 15:47:14 -08:00
struct request_queue ;
struct scatterlist ;
2015-05-10 18:14:56 +02:00
struct target_backend_ops {
2011-11-16 09:46:48 -05:00
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 ;
2015-05-19 14:44:41 -07:00
u8 transport_flags ;
2011-11-16 09:46:48 -05: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 00:03:19 -04:00
struct se_device * ( * alloc_device ) ( struct se_hba * , const char * ) ;
int ( * configure_device ) ( struct se_device * ) ;
2017-06-23 01:18:12 -05:00
void ( * destroy_device ) ( struct se_device * ) ;
2012-10-08 00:03:19 -04:00
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-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
2015-05-10 18:14:56 +02:00
struct configfs_attribute * * tb_dev_attrib_attrs ;
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 ) ;
2015-06-19 15:10:59 +02:00
sense_reason_t ( * execute_unmap ) ( struct se_cmd * cmd ,
sector_t lba , sector_t nolb ) ;
2012-06-17 18:40:52 -04:00
} ;
2015-05-10 18:14:56 +02:00
int transport_backend_register ( const struct target_backend_ops * ) ;
void target_backend_unregister ( const struct target_backend_ops * ) ;
2011-11-16 09:46:48 -05:00
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
2017-05-31 15:52:39 -05:00
void transport_copy_sense_to_cmd ( struct se_cmd * , unsigned char * ) ;
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 ) ;
2014-04-02 14:19:09 -07: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-07 22:44:57 +00: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 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 * ) ;
2015-05-10 18:14:57 +02:00
extern struct configfs_attribute * sbc_attrib_attrs [ ] ;
extern struct configfs_attribute * passthrough_attrib_attrs [ ] ;
2011-11-16 09:46:48 -05:00
/* 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 */
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
2015-03-22 20:42:19 -07:00
bool target_lun_is_rdonly ( struct se_cmd * ) ;
2015-05-19 14:44:40 -07:00
sense_reason_t passthrough_parse_cdb ( struct se_cmd * cmd ,
sense_reason_t ( * exec_cmd ) ( struct se_cmd * cmd ) ) ;
2014-11-27 19:15:48 -08:00
2017-06-23 01:18:14 -05:00
struct se_device * target_find_device ( int id , bool do_depend ) ;
2015-07-16 10:28:05 +03:00
bool target_sense_desc_format ( struct se_device * dev ) ;
2016-01-18 14:09:27 -06: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-02 20:12:37 -05:00
struct request_queue * q ) ;
2015-07-16 10:28:05 +03:00
2017-05-23 16:48:27 -07:00
/* Only use get_unaligned_be24() if reading p - 1 is allowed. */
static inline uint32_t get_unaligned_be24 ( const uint8_t * const p )
{
return get_unaligned_be32 ( p - 1 ) & 0xffffffU ;
}
2011-11-16 09:46:48 -05:00
# endif /* TARGET_CORE_BACKEND_H */