39 #if !defined(__OCS_SCSI_H__)
40 #define __OCS_SCSI_H__
47 #define OCS_SCSI_CMD_DIR_IN (1U << 0)
48 #define OCS_SCSI_CMD_DIR_OUT (1U << 1)
49 #define OCS_SCSI_CMD_SIMPLE (1U << 2)
50 #define OCS_SCSI_CMD_HEAD_OF_QUEUE (1U << 3)
51 #define OCS_SCSI_CMD_ORDERED (1U << 4)
52 #define OCS_SCSI_CMD_UNTAGGED (1U << 5)
53 #define OCS_SCSI_CMD_ACA (1U << 6)
54 #define OCS_SCSI_FIRST_BURST_ERR (1U << 7)
55 #define OCS_SCSI_FIRST_BURST_ABORTED (1U << 8)
58 #define OCS_SCSI_LAST_DATAPHASE (1U << 0)
59 #define OCS_SCSI_NO_AUTO_RESPONSE (1U << 1)
60 #define OCS_SCSI_LOW_LATENCY (1U << 2)
62 #define OCS_SCSI_MAX_CDB_LEN 128
63 #define OCS_SCSI_SNS_BUF_VALID(sense) ((sense) && (0x70 == (((const uint8_t *)(sense))[0] & 0x70)))
65 #define OCS_SCSI_WQ_STEERING_SHIFT (16)
66 #define OCS_SCSI_WQ_STEERING_MASK (0xf << OCS_SCSI_WQ_STEERING_SHIFT)
67 #define OCS_SCSI_WQ_STEERING_CLASS (0 << OCS_SCSI_WQ_STEERING_SHIFT)
68 #define OCS_SCSI_WQ_STEERING_REQUEST (1 << OCS_SCSI_WQ_STEERING_SHIFT)
69 #define OCS_SCSI_WQ_STEERING_CPU (2 << OCS_SCSI_WQ_STEERING_SHIFT)
71 #define OCS_SCSI_WQ_CLASS_SHIFT (20)
72 #define OCS_SCSI_WQ_CLASS_MASK (0xf << OCS_SCSI_WQ_CLASS_SHIFT)
73 #define OCS_SCSI_WQ_CLASS(x) ((x & OCS_SCSI_WQ_CLASS_MASK) << OCS_SCSI_WQ_CLASS_SHIFT)
75 #define OCS_SCSI_WQ_CLASS_LOW_LATENCY (1)
130 uint32_t flags,
void *arg);
133 #define OCS_SCSI_IO_CMPL (1U << 0)
134 #define OCS_SCSI_IO_CMPL_RSP_SENT (1U << 1)
135 #define OCS_SCSI_IO_ABORTED (1U << 2)
198 #define OCS_SCSI_DIF_OPER_PASS_THRU OCS_SCSI_DIF_OPER_IN_CRC_OUT_CRC
199 #define OCS_SCSI_DIF_OPER_STRIP OCS_SCSI_DIF_OPER_IN_CRC_OUT_NODIF
200 #define OCS_SCSI_DIF_OPER_INSERT OCS_SCSI_DIF_OPER_IN_NODIF_OUT_CRC
218 typedef struct ocs_scsi_sgl_s {
243 disable_app_ref_ffff:1,
249 #define OCS_SCSI_CALL_COMPLETE 0 // All work is done
250 #define OCS_SCSI_CALL_ASYNC 1 // Work will be completed asynchronously
267 uint32_t s_id, uint32_t d_id, uint32_t ox_id));
289 extern int32_t
ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags);
291 ocs_dma_t first_burst_buffers[], uint32_t first_burst_bytes);
351 extern int32_t
ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun,
void *cdb, uint32_t cdb_len,
354 extern int32_t
ocs_scsi_send_wr_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun,
void *cdb, uint32_t cdb_len,
359 ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst,
361 extern int32_t
ocs_scsi_send_tmf(ocs_node_t *node, ocs_io_t *io, ocs_io_t *io_to_abort, uint32_t lun,
381 uint32_t max_addrlen,
void **dif_vaddr);
392 #endif // __OCS_SCSI_H__
int32_t ocs_scsi_host_update_supported_speed(ocs_t *ocs)
int32_t ocs_scsi_tgt_port_online(ocs_t *ocs)
ocs_sport_t * ocs_sport_get_instance(ocs_domain_t *domain, uint32_t index)
Return a SLI port object, given an instance index.
void ocs_scsi_tgt_vport_node_shutdown(ocs_sport_t *sport)
int32_t ocs_scsi_tgt_io_exit(ocs_io_t *io)
Un-initialize SCSI IO.
int32_t ocs_scsi_recv_tmf(ocs_io_t *tmfio, uint32_t lun, ocs_scsi_tmf_cmd_e cmd, ocs_io_t *abortio, uint32_t flags)
Receive a TMF command IO.
int32_t ocs_scsi_tgt_del_device(ocs_t *ocs)
Tears down the target members of the ocs structure.
int32_t ocs_scsi_tgt_new_device(ocs_t *ocs)
Initializes any target fields on the ocs structure.
int32_t ocs_scsi_tgt_driver_init(void)
Driver-wide initialization for the target-server.
int32_t ocs_scsi_del_target(ocs_node_t *node, ocs_scsi_del_target_reason_e reason)
Delete a SCSI target node.
int32_t ocs_scsi_ini_driver_init(int32_t initiator)
Initialize initiator client.
int32_t ocs_scsi_tgt_io_init(ocs_io_t *io)
Initialize SCSI IO.
uint32_t ocs_scsi_tgt_io_state(ocs_io_t *io)
Set SCST IO state.
T10 DIF information passed to the transport.
ocs_domain_t * ocs_domain_get_instance(ocs_t *ocs, uint32_t index)
Return a pointer to the domain, given the instance index.
ocs_scsi_dif_oper_e
T10 DIF operations.
void ocs_scsi_tgt_count_sessions(ocs_t *ocs, uint64_t wwpn)
int32_t ocs_scsi_tgt_driver_exit(void)
Driver-wide clean-up for the target-server.
ocs_scsi_dif_blk_size_e
T10 DIF block sizes.
int32_t ocs_scsi_ini_new_device(ocs_t *ocs)
Initializes any initiator fields on the ocs structure.
int32_t ocs_scsi_tgt_new_sport(ocs_sport_t *sport)
Accept a new SLI Port notification.
uint32_t sense_data_length
void ocs_scsi_tgt_del_domain(ocs_domain_t *domain)
Accept a domain lost notification.
generic scatter-gather list structure
int32_t(* ocs_scsi_rsp_io_cb_t)(ocs_io_t *io, ocs_scsi_io_status_e status, ocs_scsi_cmd_resp_t *rsp, uint32_t flags, void *arg)
int32_t ocs_scsi_del_initiator(ocs_node_t *node, ocs_scsi_del_initiator_reason_e reason)
Delete a SCSI initiator node.
void ocs_scsi_io_free(ocs_io_t *io)
Free a SCSI IO context.
int32_t ocs_scsi_ini_io_exit(ocs_io_t *io)
Uninitialize SCSI IO.
int32_t ocs_scsi_send_wr_io_first_burst(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, uint32_t first_burst, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator write IO.
ocs_scsi_del_initiator_reason_e
int32_t ocs_scsi_ini_io_init(ocs_io_t *io)
Initialize SCSI IO.
int32_t ocs_scsi_recv_wr_data(ocs_io_t *io, uint32_t flags, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint64_t wire_len, ocs_scsi_io_cb_t cb, void *arg)
void ocs_get_os_version_and_name(ocs_t *ocs, void *os_ver_name_str, size_t size)
void ocs_scsi_tgt_del_sport(ocs_sport_t *sport)
Accept a SLI Port gone notification.
void ocs_scsi_io_alloc_disable(ocs_node_t *node)
Disable IO allocation.
int32_t ocs_scsi_new_target(ocs_node_t *node)
receive notification of a new SCSI target node
int32_t ocs_scsi_send_rd_data(ocs_io_t *io, uint32_t flags, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint64_t wire_len, ocs_scsi_io_cb_t cb, void *arg)
int32_t ocs_scsi_get_block_vaddr(ocs_io_t *io, uint64_t blocknumber, ocs_scsi_vaddr_len_t addrlen[], uint32_t max_addrlen, void **dif_vaddr)
Return address of data and DIF data given a block in the target.
int32_t ocs_scsi_ini_new_domain(ocs_domain_t *domain)
accept new domain notification
void ocs_scsi_update_first_burst_transferred(ocs_io_t *io, uint32_t transferred)
Update transferred count.
void ocs_scsi_ini_del_sport(ocs_sport_t *sport)
ocs_scsi_dif_blk_size_e blk_size
void ocs_scsi_register_bounce(ocs_t *ocs, void(*fctn)(void(*fctn)(void *arg), void *arg, uint32_t s_id, uint32_t d_id, uint32_t ox_id))
Register bounce callback for multi-threading.
ocs_io_t * ocs_io_get_instance(ocs_t *ocs, uint32_t index)
Return IO context given the instance index.
uint32_t response_data_length
int32_t ocs_scsi_tgt_new_domain(ocs_domain_t *domain)
Accept a new domain notification.
int32_t ocs_scsi_send_rd_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator read IO.
int32_t ocs_scsi_new_initiator(ocs_node_t *node)
Receive notification of a new SCSI initiator node.
int32_t ocs_scsi_host_ml_registered(ocs_t *ocs)
int32_t(* ocs_scsi_io_cb_t)(ocs_io_t *io, ocs_scsi_io_status_e status, uint32_t flags, void *arg)
int32_t ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags)
int32_t ocs_scsi_ini_new_sport(ocs_sport_t *sport)
ocs_scsi_del_target_reason_e
void ocs_scsi_io_alloc_enable(ocs_node_t *node)
Enable IO allocation.
void ocs_scsi_tgt_cancel_io(ocs_t *ocs)
int32_t ocs_scsi_send_nodata_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator SCSI command with no data.
ocs_scsi_property_e
property names for ocs_scsi_get_property() functions
int32_t ocs_scsi_ini_driver_exit(int32_t initiator)
initiator client exit
void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
int32_t ocs_scsi_send_tmf(ocs_node_t *node, ocs_io_t *io, ocs_io_t *io_to_abort, uint32_t lun, ocs_scsi_tmf_cmd_e tmf, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator task management operation.
int32_t ocs_scsi_tgt_abort_io(ocs_io_t *io, bool send_abts, ocs_scsi_io_cb_t cb, void *arg)
Abort a target IO.
int32_t ocs_scsi_send_wr_io(ocs_node_t *node, ocs_io_t *io, uint32_t lun, void *cdb, uint32_t cdb_len, ocs_scsi_dif_info_t *dif_info, ocs_scsi_sgl_t *sgl, uint32_t sgl_count, uint32_t wire_len, ocs_scsi_rsp_io_cb_t cb, void *arg)
Initiate initiator write IO.
void ocs_scsi_ini_del_domain(ocs_domain_t *domain)
accept domain lost notification
int32_t ocs_scsi_ini_del_device(ocs_t *ocs)
Tears down target members of ocs structure.
uint16_t scsi_status_qualifier
int32_t ocs_scsi_send_resp(ocs_io_t *io, uint32_t flags, ocs_scsi_cmd_resp_t *rsp, ocs_scsi_io_cb_t cb, void *arg)
Send response data.
void ocs_scsi_tgt_sess_del_wait(ocs_sport_t *sport)
int32_t ocs_scsi_validate_initiator(ocs_node_t *node)
Validate a new initiator.
void ocs_scsi_del_initiator_complete(ocs_node_t *node)
Notify that delete initiator is complete.
uint32_t response_wire_length
void ocs_scsi_get_host_name(ocs_t *ocs, void *host_name, size_t size)
int32_t ocs_scsi_send_tmf_resp(ocs_io_t *io, ocs_scsi_tmf_resp_e rspcode, uint8_t addl_rsp_info[3], ocs_scsi_io_cb_t cb, void *arg)
Send TMF response data.
ocs_io_t * ocs_scsi_io_alloc(ocs_node_t *node, ocs_scsi_io_role_e role)
Allocate a SCSI IO context.
int32_t ocs_scsi_recv_cmd_first_burst(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags, ocs_dma_t first_burst_buffers[], uint32_t first_burst_bytes)
Receive an FCP SCSI command with the first burst data.
void * ocs_scsi_get_property_ptr(ocs_t *ocs, ocs_scsi_property_e prop)
Return a property pointer.
void ocs_get_os_host_name(ocs_t *ocs, void *os_ver_name_str, size_t size)
void ocs_scsi_del_target_complete(ocs_node_t *node)
Notify that delete target is complete.
ocs_scsi_dif_oper_e dif_oper
int32_t ocs_scsi_io_alloc_enabled(ocs_node_t *node)
Get state of IO allocation.
uint32_t ocs_scsi_get_property(ocs_t *ocs, ocs_scsi_property_e prop)
Return SCSI API integer valued property.
void ocs_scsi_io_complete(ocs_io_t *io)
Notify the base driver that the IO is complete.
void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)