Commit | Line | Data |
---|---|---|
c4795fb2 CH |
1 | #ifndef TARGET_CORE_BACKEND_H |
2 | #define TARGET_CORE_BACKEND_H | |
3 | ||
a3541703 | 4 | #define TRANSPORT_FLAG_PASSTHROUGH 1 |
c4795fb2 | 5 | |
73112edc NB |
6 | struct target_backend_cits { |
7 | struct config_item_type tb_dev_cit; | |
f79a897e | 8 | struct config_item_type tb_dev_attrib_cit; |
91e2e39b | 9 | struct config_item_type tb_dev_pr_cit; |
f8d389c6 | 10 | struct config_item_type tb_dev_wwn_cit; |
72aca57b | 11 | struct config_item_type tb_dev_alua_tg_pt_gps_cit; |
d23ab570 | 12 | struct config_item_type tb_dev_stat_cit; |
73112edc NB |
13 | }; |
14 | ||
c4795fb2 CH |
15 | struct se_subsystem_api { |
16 | struct list_head sub_api_list; | |
17 | ||
18 | char name[16]; | |
0fd97ccf CH |
19 | char inquiry_prod[16]; |
20 | char inquiry_rev[4]; | |
c4795fb2 CH |
21 | struct module *owner; |
22 | ||
a3541703 | 23 | u8 transport_flags; |
c4795fb2 | 24 | |
c4795fb2 CH |
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); | |
0fd97ccf CH |
28 | |
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); | |
32 | ||
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 *); | |
36 | ||
d5829eac PB |
37 | void (*transport_complete)(struct se_cmd *cmd, |
38 | struct scatterlist *, | |
39 | unsigned char *); | |
d6e0175c | 40 | |
de103c93 | 41 | sense_reason_t (*parse_cdb)(struct se_cmd *cmd); |
c4795fb2 CH |
42 | u32 (*get_device_type)(struct se_device *); |
43 | sector_t (*get_blocks)(struct se_device *); | |
7f7caf6a AG |
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 *); | |
5787cacd | 49 | unsigned char *(*get_sense_buffer)(struct se_cmd *); |
d0c8b259 | 50 | bool (*get_write_cache)(struct se_device *); |
ce65e5b9 NB |
51 | int (*init_prot)(struct se_device *); |
52 | int (*format_prot)(struct se_device *); | |
53 | void (*free_prot)(struct se_device *); | |
73112edc NB |
54 | |
55 | struct target_backend_cits tb_cits; | |
c4795fb2 CH |
56 | }; |
57 | ||
9e999a6c | 58 | struct sbc_ops { |
a82a9538 NB |
59 | sense_reason_t (*execute_rw)(struct se_cmd *cmd, struct scatterlist *, |
60 | u32, enum dma_data_direction); | |
de103c93 CH |
61 | sense_reason_t (*execute_sync_cache)(struct se_cmd *cmd); |
62 | sense_reason_t (*execute_write_same)(struct se_cmd *cmd); | |
cd063bef | 63 | sense_reason_t (*execute_write_same_unmap)(struct se_cmd *cmd); |
de103c93 | 64 | sense_reason_t (*execute_unmap)(struct se_cmd *cmd); |
0c2ad7d1 CH |
65 | }; |
66 | ||
c4795fb2 CH |
67 | int transport_subsystem_register(struct se_subsystem_api *); |
68 | void transport_subsystem_release(struct se_subsystem_api *); | |
69 | ||
6bb35e00 | 70 | void target_complete_cmd(struct se_cmd *, u8); |
2426bd45 | 71 | void target_complete_cmd_with_length(struct se_cmd *, u8, int); |
c4795fb2 | 72 | |
de103c93 CH |
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); | |
0dfa1c5d HR |
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 *); | |
d6e0175c | 77 | |
de103c93 | 78 | sense_reason_t sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops); |
6f23ac8a CH |
79 | u32 sbc_get_device_rev(struct se_device *dev); |
80 | u32 sbc_get_device_type(struct se_device *dev); | |
972b29c8 | 81 | sector_t sbc_get_write_same_sectors(struct se_cmd *cmd); |
86d71829 AH |
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), | |
85 | void *priv); | |
66a3d5bc | 86 | void sbc_dif_generate(struct se_cmd *); |
41861fa8 NB |
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); | |
395ccb25 | 91 | sense_reason_t sbc_dif_read_strip(struct se_cmd *); |
6f23ac8a | 92 | |
c4795fb2 CH |
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 *); | |
97 | ||
98 | /* core helpers also used by command snooping in pscsi */ | |
4949314c AG |
99 | void *transport_kmap_data_sg(struct se_cmd *); |
100 | void transport_kunmap_data_sg(struct se_cmd *); | |
c5ff8d6b NB |
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); | |
c4795fb2 | 105 | |
4a5a75f3 JE |
106 | void array_free(void *array, int n); |
107 | ||
73112edc NB |
108 | /* From target_core_configfs.c to setup default backend config_item_types */ |
109 | void target_core_setup_sub_cits(struct se_subsystem_api *); | |
110 | ||
d30cd123 | 111 | /* attribute helpers from target_core_device.c for backend drivers */ |
9bc6548f | 112 | bool se_dev_check_wce(struct se_device *); |
d30cd123 NB |
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); | |
d30cd123 NB |
137 | int se_dev_set_optimal_sectors(struct se_device *, u32); |
138 | int se_dev_set_block_size(struct se_device *, u32); | |
7bfea53b AG |
139 | sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd, |
140 | sense_reason_t (*exec_cmd)(struct se_cmd *cmd)); | |
d30cd123 | 141 | |
c4795fb2 | 142 | #endif /* TARGET_CORE_BACKEND_H */ |