Path: blob/master/include/target/target_core_transport.h
10814 views
#ifndef TARGET_CORE_TRANSPORT_H1#define TARGET_CORE_TRANSPORT_H23#define TARGET_CORE_VERSION TARGET_CORE_MOD_VERSION45/* Attempts before moving from SHORT to LONG */6#define PYX_TRANSPORT_WINDOW_CLOSED_THRESHOLD 37#define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_SHORT 3 /* In milliseconds */8#define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_LONG 10 /* In milliseconds */910#define PYX_TRANSPORT_STATUS_INTERVAL 5 /* In seconds */1112#define PYX_TRANSPORT_SENT_TO_TRANSPORT 013#define PYX_TRANSPORT_WRITE_PENDING 11415#define PYX_TRANSPORT_UNKNOWN_SAM_OPCODE -116#define PYX_TRANSPORT_HBA_QUEUE_FULL -217#define PYX_TRANSPORT_REQ_TOO_MANY_SECTORS -318#define PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES -419#define PYX_TRANSPORT_INVALID_CDB_FIELD -520#define PYX_TRANSPORT_INVALID_PARAMETER_LIST -621#define PYX_TRANSPORT_LU_COMM_FAILURE -722#define PYX_TRANSPORT_UNKNOWN_MODE_PAGE -823#define PYX_TRANSPORT_WRITE_PROTECTED -924#define PYX_TRANSPORT_TASK_TIMEOUT -1025#define PYX_TRANSPORT_RESERVATION_CONFLICT -1126#define PYX_TRANSPORT_ILLEGAL_REQUEST -1227#define PYX_TRANSPORT_USE_SENSE_REASON -132829#ifndef SAM_STAT_RESERVATION_CONFLICT30#define SAM_STAT_RESERVATION_CONFLICT 0x1831#endif3233#define TRANSPORT_PLUGIN_FREE 034#define TRANSPORT_PLUGIN_REGISTERED 13536#define TRANSPORT_PLUGIN_PHBA_PDEV 137#define TRANSPORT_PLUGIN_VHBA_PDEV 238#define TRANSPORT_PLUGIN_VHBA_VDEV 33940/* For SE OBJ Plugins, in seconds */41#define TRANSPORT_TIMEOUT_TUR 1042#define TRANSPORT_TIMEOUT_TYPE_DISK 6043#define TRANSPORT_TIMEOUT_TYPE_ROM 12044#define TRANSPORT_TIMEOUT_TYPE_TAPE 60045#define TRANSPORT_TIMEOUT_TYPE_OTHER 3004647/* For se_task->task_state_flags */48#define TSF_EXCEPTION_CLEARED 0x014950/*51* struct se_subsystem_dev->su_dev_flags52*/53#define SDF_FIRMWARE_VPD_UNIT_SERIAL 0x0000000154#define SDF_EMULATED_VPD_UNIT_SERIAL 0x0000000255#define SDF_USING_UDEV_PATH 0x0000000456#define SDF_USING_ALIAS 0x000000085758/*59* struct se_device->dev_flags60*/61#define DF_READ_ONLY 0x0000000162#define DF_SPC2_RESERVATIONS 0x0000000263#define DF_SPC2_RESERVATIONS_WITH_ISID 0x000000046465/* struct se_dev_attrib sanity values */66/* 10 Minutes */67#define DA_TASK_TIMEOUT_MAX 60068/* Default max_unmap_lba_count */69#define DA_MAX_UNMAP_LBA_COUNT 070/* Default max_unmap_block_desc_count */71#define DA_MAX_UNMAP_BLOCK_DESC_COUNT 072/* Default unmap_granularity */73#define DA_UNMAP_GRANULARITY_DEFAULT 074/* Default unmap_granularity_alignment */75#define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT 076/* Emulation for Direct Page Out */77#define DA_EMULATE_DPO 078/* Emulation for Forced Unit Access WRITEs */79#define DA_EMULATE_FUA_WRITE 180/* Emulation for Forced Unit Access READs */81#define DA_EMULATE_FUA_READ 082/* Emulation for WriteCache and SYNCHRONIZE_CACHE */83#define DA_EMULATE_WRITE_CACHE 084/* Emulation for UNIT ATTENTION Interlock Control */85#define DA_EMULATE_UA_INTLLCK_CTRL 086/* Emulation for TASK_ABORTED status (TAS) by default */87#define DA_EMULATE_TAS 188/* Emulation for Thin Provisioning UNMAP using block/blk-lib.c:blkdev_issue_discard() */89#define DA_EMULATE_TPU 090/*91* Emulation for Thin Provisioning WRITE_SAME w/ UNMAP=1 bit using92* block/blk-lib.c:blkdev_issue_discard()93*/94#define DA_EMULATE_TPWS 095/* No Emulation for PSCSI by default */96#define DA_EMULATE_RESERVATIONS 097/* No Emulation for PSCSI by default */98#define DA_EMULATE_ALUA 099/* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */100#define DA_ENFORCE_PR_ISIDS 1101#define DA_STATUS_MAX_SECTORS_MIN 16102#define DA_STATUS_MAX_SECTORS_MAX 8192103104#define SE_MODE_PAGE_BUF 512105106#define MOD_MAX_SECTORS(ms, bs) (ms % (PAGE_SIZE / bs))107108struct se_mem;109struct se_subsystem_api;110111extern struct kmem_cache *se_mem_cache;112113extern int init_se_global(void);114extern void release_se_global(void);115extern void init_scsi_index_table(void);116extern u32 scsi_get_new_index(scsi_index_t);117extern void transport_init_queue_obj(struct se_queue_obj *);118extern int transport_subsystem_check_init(void);119extern int transport_subsystem_register(struct se_subsystem_api *);120extern void transport_subsystem_release(struct se_subsystem_api *);121extern void transport_load_plugins(void);122extern struct se_session *transport_init_session(void);123extern void __transport_register_session(struct se_portal_group *,124struct se_node_acl *,125struct se_session *, void *);126extern void transport_register_session(struct se_portal_group *,127struct se_node_acl *,128struct se_session *, void *);129extern void transport_free_session(struct se_session *);130extern void transport_deregister_session_configfs(struct se_session *);131extern void transport_deregister_session(struct se_session *);132extern void transport_cmd_finish_abort(struct se_cmd *, int);133extern void transport_cmd_finish_abort_tmr(struct se_cmd *);134extern void transport_complete_sync_cache(struct se_cmd *, int);135extern void transport_complete_task(struct se_task *, int);136extern void transport_add_task_to_execute_queue(struct se_task *,137struct se_task *,138struct se_device *);139extern void transport_remove_task_from_execute_queue(struct se_task *,140struct se_device *);141unsigned char *transport_dump_cmd_direction(struct se_cmd *);142extern void transport_dump_dev_state(struct se_device *, char *, int *);143extern void transport_dump_dev_info(struct se_device *, struct se_lun *,144unsigned long long, char *, int *);145extern void transport_dump_vpd_proto_id(struct t10_vpd *,146unsigned char *, int);147extern void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);148extern int transport_dump_vpd_assoc(struct t10_vpd *,149unsigned char *, int);150extern int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);151extern int transport_dump_vpd_ident_type(struct t10_vpd *,152unsigned char *, int);153extern int transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *);154extern int transport_dump_vpd_ident(struct t10_vpd *,155unsigned char *, int);156extern int transport_set_vpd_ident(struct t10_vpd *, unsigned char *);157extern struct se_device *transport_add_device_to_core_hba(struct se_hba *,158struct se_subsystem_api *,159struct se_subsystem_dev *, u32,160void *, struct se_dev_limits *,161const char *, const char *);162extern void transport_device_setup_cmd(struct se_cmd *);163extern void transport_init_se_cmd(struct se_cmd *,164struct target_core_fabric_ops *,165struct se_session *, u32, int, int,166unsigned char *);167extern void transport_free_se_cmd(struct se_cmd *);168extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *);169extern int transport_generic_handle_cdb(struct se_cmd *);170extern int transport_generic_handle_cdb_map(struct se_cmd *);171extern int transport_generic_handle_data(struct se_cmd *);172extern void transport_new_cmd_failure(struct se_cmd *);173extern int transport_generic_handle_tmr(struct se_cmd *);174extern void transport_generic_free_cmd_intr(struct se_cmd *);175extern void __transport_stop_task_timer(struct se_task *, unsigned long *);176extern unsigned char transport_asciihex_to_binaryhex(unsigned char val[2]);177extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32,178struct scatterlist *, u32);179extern int transport_clear_lun_from_sessions(struct se_lun *);180extern int transport_check_aborted_status(struct se_cmd *, int);181extern int transport_send_check_condition_and_sense(struct se_cmd *, u8, int);182extern void transport_send_task_abort(struct se_cmd *);183extern void transport_release_cmd_to_pool(struct se_cmd *);184extern void transport_generic_free_cmd(struct se_cmd *, int, int, int);185extern void transport_generic_wait_for_cmds(struct se_cmd *, int);186extern u32 transport_calc_sg_num(struct se_task *, struct se_mem *, u32);187extern int transport_map_mem_to_sg(struct se_task *, struct list_head *,188void *, struct se_mem *,189struct se_mem **, u32 *, u32 *);190extern void transport_do_task_sg_chain(struct se_cmd *);191extern void transport_generic_process_write(struct se_cmd *);192extern int transport_generic_do_tmr(struct se_cmd *);193/* From target_core_alua.c */194extern int core_alua_check_nonop_delay(struct se_cmd *);195/* From target_core_cdb.c */196extern int transport_emulate_control_cdb(struct se_task *);197198/*199* Each se_transport_task_t can have N number of possible struct se_task's200* for the storage transport(s) to possibly execute.201* Used primarily for splitting up CDBs that exceed the physical storage202* HBA's maximum sector count per task.203*/204struct se_mem {205struct page *se_page;206u32 se_len;207u32 se_off;208struct list_head se_list;209} ____cacheline_aligned;210211/*212* Each type of disk transport supported MUST have a template defined213* within its .h file.214*/215struct se_subsystem_api {216/*217* The Name. :-)218*/219char name[16];220/*221* Transport Type.222*/223u8 transport_type;224/*225* struct module for struct se_hba references226*/227struct module *owner;228/*229* Used for global se_subsystem_api list_head230*/231struct list_head sub_api_list;232/*233* For SCF_SCSI_NON_DATA_CDB234*/235int (*cdb_none)(struct se_task *);236/*237* For SCF_SCSI_CONTROL_NONSG_IO_CDB238*/239int (*map_task_non_SG)(struct se_task *);240/*241* For SCF_SCSI_DATA_SG_IO_CDB and SCF_SCSI_CONTROL_SG_IO_CDB242*/243int (*map_task_SG)(struct se_task *);244/*245* attach_hba():246*/247int (*attach_hba)(struct se_hba *, u32);248/*249* detach_hba():250*/251void (*detach_hba)(struct se_hba *);252/*253* pmode_hba(): Used for TCM/pSCSI subsystem plugin HBA ->254* Linux/SCSI struct Scsi_Host passthrough255*/256int (*pmode_enable_hba)(struct se_hba *, unsigned long);257/*258* allocate_virtdevice():259*/260void *(*allocate_virtdevice)(struct se_hba *, const char *);261/*262* create_virtdevice(): Only for Virtual HBAs263*/264struct se_device *(*create_virtdevice)(struct se_hba *,265struct se_subsystem_dev *, void *);266/*267* free_device():268*/269void (*free_device)(void *);270271/*272* dpo_emulated():273*/274int (*dpo_emulated)(struct se_device *);275/*276* fua_write_emulated():277*/278int (*fua_write_emulated)(struct se_device *);279/*280* fua_read_emulated():281*/282int (*fua_read_emulated)(struct se_device *);283/*284* write_cache_emulated():285*/286int (*write_cache_emulated)(struct se_device *);287/*288* transport_complete():289*290* Use transport_generic_complete() for majority of DAS transport291* drivers. Provided out of convenience.292*/293int (*transport_complete)(struct se_task *task);294struct se_task *(*alloc_task)(struct se_cmd *);295/*296* do_task():297*/298int (*do_task)(struct se_task *);299/*300* Used by virtual subsystem plugins IBLOCK and FILEIO to emulate301* UNMAP and WRITE_SAME_* w/ UNMAP=1 <-> Linux/Block Discard302*/303int (*do_discard)(struct se_device *, sector_t, u32);304/*305* Used by virtual subsystem plugins IBLOCK and FILEIO to emulate306* SYNCHRONIZE_CACHE_* <-> Linux/Block blkdev_issue_flush()307*/308void (*do_sync_cache)(struct se_task *);309/*310* free_task():311*/312void (*free_task)(struct se_task *);313/*314* check_configfs_dev_params():315*/316ssize_t (*check_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *);317/*318* set_configfs_dev_params():319*/320ssize_t (*set_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *,321const char *, ssize_t);322/*323* show_configfs_dev_params():324*/325ssize_t (*show_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *,326char *);327/*328* get_cdb():329*/330unsigned char *(*get_cdb)(struct se_task *);331/*332* get_device_rev():333*/334u32 (*get_device_rev)(struct se_device *);335/*336* get_device_type():337*/338u32 (*get_device_type)(struct se_device *);339/*340* Get the sector_t from a subsystem backstore..341*/342sector_t (*get_blocks)(struct se_device *);343/*344* do_se_mem_map():345*/346int (*do_se_mem_map)(struct se_task *, struct list_head *, void *,347struct se_mem *, struct se_mem **, u32 *, u32 *);348/*349* get_sense_buffer():350*/351unsigned char *(*get_sense_buffer)(struct se_task *);352} ____cacheline_aligned;353354#define TRANSPORT(dev) ((dev)->transport)355#define HBA_TRANSPORT(hba) ((hba)->transport)356357extern struct se_global *se_global;358359#endif /* TARGET_CORE_TRANSPORT_H */360361362