1 #ifndef TARGET_CORE_BACKEND_H
2 #define TARGET_CORE_BACKEND_H
4 #define TRANSPORT_FLAG_PASSTHROUGH 1
6 struct target_backend_cits
{
7 struct config_item_type tb_dev_cit
;
8 struct config_item_type tb_dev_attrib_cit
;
9 struct config_item_type tb_dev_pr_cit
;
10 struct config_item_type tb_dev_wwn_cit
;
11 struct config_item_type tb_dev_alua_tg_pt_gps_cit
;
12 struct config_item_type tb_dev_stat_cit
;
15 struct se_subsystem_api
{
16 struct list_head sub_api_list
;
19 char inquiry_prod
[16];
25 int (*attach_hba
)(struct se_hba
*, u32
);
26 void (*detach_hba
)(struct se_hba
*);
27 int (*pmode_enable_hba
)(struct se_hba
*, unsigned long);
29 struct se_device
*(*alloc_device
)(struct se_hba
*, const char *);
30 int (*configure_device
)(struct se_device
*);
31 void (*free_device
)(struct se_device
*device
);
33 ssize_t (*set_configfs_dev_params
)(struct se_device
*,
34 const char *, ssize_t
);
35 ssize_t (*show_configfs_dev_params
)(struct se_device
*, char *);
37 void (*transport_complete
)(struct se_cmd
*cmd
,
41 sense_reason_t (*parse_cdb
)(struct se_cmd
*cmd
);
42 u32 (*get_device_type
)(struct se_device
*);
43 sector_t (*get_blocks
)(struct se_device
*);
44 sector_t (*get_alignment_offset_lbas
)(struct se_device
*);
45 /* lbppbe = logical blocks per physical block exponent. see SBC-3 */
46 unsigned int (*get_lbppbe
)(struct se_device
*);
47 unsigned int (*get_io_min
)(struct se_device
*);
48 unsigned int (*get_io_opt
)(struct se_device
*);
49 unsigned char *(*get_sense_buffer
)(struct se_cmd
*);
50 bool (*get_write_cache
)(struct se_device
*);
51 int (*init_prot
)(struct se_device
*);
52 int (*format_prot
)(struct se_device
*);
53 void (*free_prot
)(struct se_device
*);
55 struct target_backend_cits tb_cits
;
59 sense_reason_t (*execute_rw
)(struct se_cmd
*cmd
, struct scatterlist
*,
60 u32
, enum dma_data_direction
);
61 sense_reason_t (*execute_sync_cache
)(struct se_cmd
*cmd
);
62 sense_reason_t (*execute_write_same
)(struct se_cmd
*cmd
);
63 sense_reason_t (*execute_write_same_unmap
)(struct se_cmd
*cmd
);
64 sense_reason_t (*execute_unmap
)(struct se_cmd
*cmd
);
67 int transport_subsystem_register(struct se_subsystem_api
*);
68 void transport_subsystem_release(struct se_subsystem_api
*);
70 void target_complete_cmd(struct se_cmd
*, u8
);
71 void target_complete_cmd_with_length(struct se_cmd
*, u8
, int);
73 sense_reason_t
spc_parse_cdb(struct se_cmd
*cmd
, unsigned int *size
);
74 sense_reason_t
spc_emulate_report_luns(struct se_cmd
*cmd
);
75 sense_reason_t
spc_emulate_inquiry_std(struct se_cmd
*, unsigned char *);
76 sense_reason_t
spc_emulate_evpd_83(struct se_cmd
*, unsigned char *);
78 sense_reason_t
sbc_parse_cdb(struct se_cmd
*cmd
, struct sbc_ops
*ops
);
79 u32
sbc_get_device_rev(struct se_device
*dev
);
80 u32
sbc_get_device_type(struct se_device
*dev
);
81 sector_t
sbc_get_write_same_sectors(struct se_cmd
*cmd
);
82 sense_reason_t
sbc_execute_unmap(struct se_cmd
*cmd
,
83 sense_reason_t (*do_unmap_fn
)(struct se_cmd
*cmd
, void *priv
,
84 sector_t lba
, sector_t nolb
),
86 void sbc_dif_generate(struct se_cmd
*);
87 sense_reason_t
sbc_dif_verify_write(struct se_cmd
*, sector_t
, unsigned int,
88 unsigned int, struct scatterlist
*, int);
89 sense_reason_t
sbc_dif_verify_read(struct se_cmd
*, sector_t
, unsigned int,
90 unsigned int, struct scatterlist
*, int);
91 sense_reason_t
sbc_dif_read_strip(struct se_cmd
*);
93 void transport_set_vpd_proto_id(struct t10_vpd
*, unsigned char *);
94 int transport_set_vpd_assoc(struct t10_vpd
*, unsigned char *);
95 int transport_set_vpd_ident_type(struct t10_vpd
*, unsigned char *);
96 int transport_set_vpd_ident(struct t10_vpd
*, unsigned char *);
98 /* core helpers also used by command snooping in pscsi */
99 void *transport_kmap_data_sg(struct se_cmd
*);
100 void transport_kunmap_data_sg(struct se_cmd
*);
101 /* core helpers also used by xcopy during internal command setup */
102 int target_alloc_sgl(struct scatterlist
**, unsigned int *, u32
, bool);
103 sense_reason_t
transport_generic_map_mem_to_cmd(struct se_cmd
*,
104 struct scatterlist
*, u32
, struct scatterlist
*, u32
);
106 void array_free(void *array
, int n
);
108 /* From target_core_configfs.c to setup default backend config_item_types */
109 void target_core_setup_sub_cits(struct se_subsystem_api
*);
111 /* attribute helpers from target_core_device.c for backend drivers */
112 bool se_dev_check_wce(struct se_device
*);
113 int se_dev_set_max_unmap_lba_count(struct se_device
*, u32
);
114 int se_dev_set_max_unmap_block_desc_count(struct se_device
*, u32
);
115 int se_dev_set_unmap_granularity(struct se_device
*, u32
);
116 int se_dev_set_unmap_granularity_alignment(struct se_device
*, u32
);
117 int se_dev_set_max_write_same_len(struct se_device
*, u32
);
118 int se_dev_set_emulate_model_alias(struct se_device
*, int);
119 int se_dev_set_emulate_dpo(struct se_device
*, int);
120 int se_dev_set_emulate_fua_write(struct se_device
*, int);
121 int se_dev_set_emulate_fua_read(struct se_device
*, int);
122 int se_dev_set_emulate_write_cache(struct se_device
*, int);
123 int se_dev_set_emulate_ua_intlck_ctrl(struct se_device
*, int);
124 int se_dev_set_emulate_tas(struct se_device
*, int);
125 int se_dev_set_emulate_tpu(struct se_device
*, int);
126 int se_dev_set_emulate_tpws(struct se_device
*, int);
127 int se_dev_set_emulate_caw(struct se_device
*, int);
128 int se_dev_set_emulate_3pc(struct se_device
*, int);
129 int se_dev_set_pi_prot_type(struct se_device
*, int);
130 int se_dev_set_pi_prot_format(struct se_device
*, int);
131 int se_dev_set_enforce_pr_isids(struct se_device
*, int);
132 int se_dev_set_force_pr_aptpl(struct se_device
*, int);
133 int se_dev_set_is_nonrot(struct se_device
*, int);
134 int se_dev_set_emulate_rest_reord(struct se_device
*dev
, int);
135 int se_dev_set_queue_depth(struct se_device
*, u32
);
136 int se_dev_set_max_sectors(struct se_device
*, u32
);
137 int se_dev_set_optimal_sectors(struct se_device
*, u32
);
138 int se_dev_set_block_size(struct se_device
*, u32
);
139 sense_reason_t
passthrough_parse_cdb(struct se_cmd
*cmd
,
140 sense_reason_t (*exec_cmd
)(struct se_cmd
*cmd
));
142 #endif /* TARGET_CORE_BACKEND_H */