44 #if defined(OCS_INCLUDE_DEBUG)
106 sli_skh_iscsi_cqe_t_cnxinv
177 if (sgl_dif != NULL) {
242 uint32_t exp_xfer_len,
253 ocs_memset(buf, 0, size);
255 req->
lun = lun & 0xffff;
256 req->
dsp = (exp_xfer_len > 0 ? 1 : 0);
266 if (dif_info == NULL) {
291 sgl_dif = (n_sge > 3 ? &sgl[3] : NULL);
292 sgl_data = (n_sge > 4 ? &sgl[4] : NULL);
294 sgl_data = (n_sge > 3 ? &sgl[3] : NULL);
329 ocs_memset(buf, 0, size);
332 req->
lun = lun & 0xffff;
365 uint32_t exp_xfer_len,
372 ocs_memset(buf, 0, size);
375 req->
dsp = (exp_xfer_len > 0 ? 1 : 0);
383 if (exp_xfer_len > 0 && payload1 != NULL) {
386 req->
s0l = (payload2 == NULL ? 1 : 0);
388 req->
sge0_length = (payload2 != NULL ? payload1->size : exp_xfer_len);
391 if (exp_xfer_len > 0 && payload1 != NULL && payload2 != NULL) {
426 uint32_t exp_xfer_len,
437 ocs_memset(buf, 0, size);
440 req->
lun = lun & 0xffff;
447 if (dif_info == NULL) {
472 sgl_dif = (n_sge > 3 ? &sgl[3] : NULL);
473 sgl_data = (n_sge > 4 ? &sgl[4] : NULL);
475 sgl_data = (n_sge > 3 ? &sgl[3] : NULL);
503 ocs_memset(buf, 0, size);
549 uint32_t exp_xfer_len,
550 uint32_t exp_data_sn,
553 uint16_t ref_icd_index,
562 ocs_memset(buf, 0, size);
565 req->
lun = lun & 0xffff;
575 if (dif_info == NULL) {
582 sgl_dif = (n_sge > 1 ? &sgl[1] : NULL);
583 sgl_data = (n_sge > 2 ? &sgl[2] : NULL);
585 sgl_data = (n_sge > 1 ? &sgl[1] : NULL);
591 for (i=0; i<n_sge; i++) {
636 uint32_t exp_xfer_len,
638 uint16_t ref_icd_index,
640 uint8_t piggy_back_status,
647 ocs_memset(buf, 0, size);
650 req->
lun = lun & 0xffff;
651 req->
dsp = (exp_xfer_len > 0 ? 1 : 0);
669 if (dif_info == NULL) {
686 sgl_dif = (n_sge > 1 ? &sgl[1] : NULL);
687 sgl_data = (n_sge > 2 ? &sgl[2] : NULL);
689 sgl_data = (n_sge > 1 ? &sgl[1] : NULL);
720 uint32_t exp_xfer_len,
725 ocs_memset(buf, 0, size);
728 req->
lun = lun & 0xffff;
729 req->
dsp = (exp_xfer_len > 0 ? 1 : 0);
737 if (exp_xfer_len > 0 && payload1 != NULL) {
740 req->
s0l = (payload2 == NULL ? 1 : 0);
741 req->
sge0_length = (payload2 != NULL ? payload1->size : exp_xfer_len);
744 if (exp_xfer_len > 0 && payload1 != NULL && payload2 != NULL) {
779 uint32_t exp_xfer_len,
784 ocs_memset(buf, 0, size);
787 req->
dsp = (exp_xfer_len ? 1 : 0);
788 req->
dm = (set_dm ? 1 : 0);
796 if (exp_xfer_len > 0 && payload1 != NULL) {
799 req->
s0l = (payload2 == NULL ? 1 : 0);
800 req->
sge0_length = (payload2 != NULL ? payload1->size : exp_xfer_len);
803 if (exp_xfer_len > 0 && payload1 != NULL && payload2 != NULL) {
827 uint8_t response = 0;
856 ocs_log_test(sli4->
os,
"WQ Error: status 0x%02x\n", i_sol->
code);
893 q->
u.
wq.wqe_free_cnt--;
895 last_wqe_posted = q->
u.
wq.last_wqe_posted;
911 uint32_t *dword = hal_io->
bhs.virt;
914 dword[5] = ocs_htobe32(hal_io->
ttt);
918 uint32_t *dword = hal_io->
bhs.virt;
921 dword[4] = ocs_htobe32(hal_io->
itt);
923 ocs_cxn_t *node = hal_io->
node;
924 ocs_dma_t *dma = &node->login_hdr_mem;
931 if (dma->virt != NULL) {
932 uint8_t *byte = dma->virt;
933 uint32_t *dword = dma->virt;
938 if (dword[4] != 0xFFFFFFFF) {
940 dword[4] = ocs_htobe32(hal_io->
itt);
949 if (last_wqe_posted != NULL) {
953 #if defined(OCS_INCLUDE_DEBUG)
957 snprintf(desc,
sizeof(desc),
"%s entry %d", q->
name, ctx->
wrb_index);
962 ocs_memcpy(ctx->
qe, entry, q->
size);
965 q->
u.
wq.last_wqe_posted = ctx->
qe;
967 ocs_dma_sync(&q->
dma, OCS_DMASYNC_PREWRITE);
977 ocs_unlock(&q->
lock);
1004 while (NULL != ctx) {
1005 if (ctx->
io == io) {
1022 ocs_unlock(&q->
lock);
1049 ocs_log_test(sli4->
os,
"WQ Error: status 0x%02x\n", t_sol->
code);
1082 ocs_log_test(sli4->
os,
"WQ Error: status 0x%02x\n", msg->
code);
1119 ocs_log_test(sli4->
os,
"WQ Error: status 0x%02x\n", msg->
code);
1149 ocs_log_test(sli4->
os,
"WQ Error: status 0x%02x\n", msg->
code);
1246 uint32_t cmd_off = 0;
1247 uint32_t payload_size;
1281 ocs_log_crit(sli4->
os,
"bootstrap mailbox write fail (GET_SLI4_PARAMETERS)\n");
1285 ocs_log_test(sli4->
os,
"COMMON_GET_SLI4_PARAMETERS bad status %#x\n",
1317 ocs_log_test(sli4->
os,
"bad GET_SLI4_PARAMETERS write\n");
uint32_t uint32_t icd_index
This structure contains the type and associated fields for a CQE completion.
uint32_t piggy_back_status
#define ISCSI_CQE_CODE_MAX
uint8_t t10_dif_separate_capable
sli4_wqe_context_t * wq_ctx
uint16_t frg_num_field_mask
Used to decode T_SOL_DATA_DIGEST CQEs.
This structure contains the fields in a T_DATA_DIGEST completion.
uint32_t chain_sge_init_0
int32_t cqe_handler_t(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
uint32_t status_or_response
uint32_t uint32_t sge1_addr_high
uint16_t frg_num_field_offset
WQE used to for INITIATOR_TMF WQE.
uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t rqe_count_method
uint8_t data_pdu_in_order
uint32_t uint32_t uint32_t first_burst
int32_t sli_cmd_mailbox_queue_entry(sli4_t *sli4, void *buf, size_t size, uint64_t tag, uint32_t length, ocs_dma_t *dma)
Write a MQE header in the provided buffer.
#define SLI4_WQE_INI_READ
mailbox queue Element header
uint32_t sge_supported_length
uint32_t max_qentries[SLI_QTYPE_MAX]
This structure contains the fields in a DMSG completion.
uint32_t frg_num_field_offset
static int32_t sli_skh_iscsi_cqe_t_cnxinv(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
uint32_t chain_sge_init_0
static int32_t sli_skh_wqe_unassisted(sli4_t *sli4, void *buf, size_t size, uint8_t set_dm, uint8_t incr_statsn, uint8_t is_login, ocs_dma_t *bhs, ocs_dma_t *payload1, ocs_dma_t *payload2, uint32_t exp_xfer_len, uint16_t icd_index)
Write an DM_CMD_WQE work queue entry.
Used to decode T_SOL CQEs.
uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t wqe_count_mask
Used to decode DPDU CQEs.
static int32_t sli_skh_wqe_ini_read(sli4_t *sli4, void *buf, size_t size, uint16_t lun, uint32_t exp_xfer_len, uint32_t cmdsn, uint16_t icd_index, ocs_hal_dif_info_t *dif_info, sli4_sge_t *sgl, uint32_t n_sge)
write an INITIATOR_READ WQE work queue entry.
T10 DIF information passed to the transport.
struct sli4_queue_t::@33::@35 wq
cqe_handler_t * ini_skh_cqe_handlers[ISCSI_CQE_CODE_MAX+1]
static void * ocs_list_get_head(ocs_list_t *list)
Return the first item in the list.
uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t mqe_count_mask
uint32_t partial_data_length
#define ISCSI_CQE_CODE_RESIDUAL_UNDERRUN
Used to decode DMSG CQEs.
union sli4_qentry_fields_t::@32 msg
uint32_t uint32_t uint32_t uint32_t immediate_data
uint32_t uint32_t uint32_t uint32_t data_digest_enable
#define SLI4_SGE_DIF_OP_IN_CRC_OUT_NODIF
static int32_t sli_skh_iscsi_cqe_tx_dif_error(sli4_t *sli4, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
uint32_t data_pdu_inorder
static uint32_t sli_convert_mask_to_count(uint32_t method, uint32_t mask)
COMMON_GET_SLI4_PARAMETERS.
sli4_qentry_fields_tx_dif_error_t tx_dif_err
#define SLI4_WQE_UNASSISTED
cqe_handler_t * tgt_skh_cqe_handlers[ISCSI_CQE_CODE_MAX+1]
WQE used to for INITIATOR_WRITE_COMMAND WQE (data from ini->Tgt)
uint32_t uint32_t mkaddr_addr_high
#define SLI4_SGE_TYPE_DISEED
#define SLI4_SGE_TYPE_DIF
uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t wqe_count_method
#define ISCSI_CQE_CODE_HOST_CXN_INVL_WITH_PDU
struct sli4_t::@37 features
uint32_t sge_supported_length
#define SLI4_WQE_TGT_DATAIN
uint32_t uint32_t sge1_addr_high
sli4_qentry_fields_tsol_t tsol
#define ISCSI_CQE_CODE_TCP_RECV_RST
static int32_t sli_skh_iscsi_cqe_i_t_dpdu(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
WQE used to for INITIATOR_READ WQE (data from ini->Tgt)
Used to decode CNXINV CQEs.
uint32_t piggy_back_status
uint32_t uint32_t uint32_t uint32_t header_digest_enable
#define SLI4_SGE_DIF_OP_IN_CRC_OUT_CRC
#define SLI4_SGE_DIF_OP_IN_NODIF_OUT_CRC
#define ISCSI_CQE_CODE_HOST_CXN_INVALIDATION
uint32_t uint32_t uint32_t uint32_t uint32_t statsn
uint32_t def_buf_addr_high
static int32_t sli_skh_iscsi_cqe_t_sol(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
union sli4_queue_t::@33 u
uint32_t frg_num_field_size
uint32_t def_buf_addr_low
static int32_t sli_skh_queue_iscsi_wq_write(sli4_t *sli4, sli4_queue_t *q, uint8_t *entry, void *io)
Write an QWE entry to the queue object.
uint32_t uint32_t sgl_icd_index
#define SLI4_SUBSYSTEM_COMMON
sli4_qentry_fields_dpdu_t dpdu
void ocs_dump32(uint32_t mask, ocs_os_handle_t os, const char *label, void *buf, uint32_t buf_length)
Dump 32 bit hex/ascii data.
static int32_t sli_skh_wqe_ini_write(sli4_t *sli4, void *buf, size_t size, uint16_t lun, uint32_t exp_xfer_len, uint32_t cmdsn, uint16_t icd_index, ocs_hal_dif_info_t *dif_info, sli4_sge_t *sgl, uint32_t n_sge)
write an INITIATOR_WRITE_COMMAND WQE work queue entry
uint16_t sgl_idx_field_mask
sli_wqe_handlers_t sli_skh_iscsi_wqe_handlers
uint32_t uint32_t uint32_t uint32_t eqe_count_mask
uint16_t sgl_idx_field_offset
uint32_t disable_app_ffff
uint32_t uint32_t icd_index
uint32_t uint32_t sge1_addr_high
uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t mqe_count_method
uint32_t chain_sge_init_1
static int32_t sli_skh_queue_iscsi_wqe_invalidate(sli4_t *sli4, sli4_queue_t *q, void *io, uint8_t is_for_tm)
Writes a 1 to the invalidate bit of the WQE.
static int32_t sli_skh_iscsi_cqe_t_sol_data_digest(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
uint32_t uint32_t uint32_t uint32_t uint32_t cqe_count_method
uint32_t uint32_t max_send_dsl
sli4_qentry_fields_isol_t isol
static int32_t sli_skh_wqe_tgt_sts(sli4_t *sli4, void *buf, size_t size, ocs_dma_t *bhs, uint16_t lun, uint32_t exp_xfer_len, uint32_t exp_data_sn, uint32_t itt, uint16_t icd_index, uint16_t ref_icd_index, ocs_hal_dif_info_t *dif_info, uint32_t r2t_offset, sli4_sge_t *sgl, uint32_t n_sge)
Write an TGT_STS_WQE work queue entry.
sli4_qentry_fields_tcmdinv_t tcmdinv
This structure is used to track the WQEs for iSCSI.
uint32_t def_buf_addr_high
This structure contains the fields in a T_DATA_DIGEST completion.
WQE used to for TGT_DATAIN WQE (data from Tgt->Ini)
This structure contains the fields in a CNXINV completion.
#define ISCSI_CQE_CODE_RESIDUAL_OVERRUN
uint32_t uint32_t uint32_t uint32_t max_r2t
uint32_t data_seq_inorder
sli4_qentry_fields_cnxinv_t cnxinv
Used to decode I_SOL CQEs.
int32_t(* wqe_update_context)(sli4_t *sli4, void *buf, size_t size, ocs_hal_target_login_options_t *lgn_options, uint32_t statsn)
int32_t sli_skh_get_sli4_parameters(sli4_t *sli4)
Issue the GET_SLI4_PARAMETERS IOCTL and populate the results.
static int32_t sli_skh_wqe_tgt_sos(sli4_t *sli4, void *buf, size_t size, ocs_dma_t *bhs, ocs_dma_t *payload1, ocs_dma_t *payload2, uint16_t lun, uint8_t dm, uint32_t exp_xfer_len, uint16_t icd_index)
Write an TGT_SOS_WQE work queue entry.
uint32_t uint32_t uint32_t eqe_count_method
uint32_t def_buf_addr_low
sli4_qentry_fields_data_digest_t data_digest
struct sli4_t::@38 config
static int32_t sli_skh_iscsi_cqe_i_sol(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
Used to decode T_SOL_DATA_DIGEST CQEs.
uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t cqe_count_mask
uint8_t data_sequence_in_order
static void ocs_list_add_tail(ocs_list_t *list, void *item)
Add an item to the tail of the list.
uint32_t auto_incr_ref_tag
ocs_hal_dif_oper_e dif_oper
static int32_t sli_skh_iscsi_cqe_i_t_dmsg(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
This structure is used to track the SLI4 queues.
static int32_t sli_skh_wqe_dif(void *buf, ocs_hal_dif_info_t *dif_info, sli4_sge_t *sgl0, sli4_sge_t *sgl_dif)
Write an DIF WQE work queue entry.
WQE used to for INITIATOR_NOP_OUT WQE (data from ini->Tgt)
#define ocs_list_remove_head(list)
Remove and return an item from the head of the list.
uint32_t buffer_address_low
Used to decode CMNDINV CQEs.
uint32_t sgl_idx_field_size
WQE used to for TGT_SOS WQE (Tgt Response)
uint32_t sgl_idx_field_offset
static void * ocs_list_next(ocs_list_t *list, void *item)
Get the next item on the list.
#define SLI4_WQE_INI_WRITE
uint8_t error_recovery_level
static int32_t sli_skh_iscsi_cqe_t_cmdinv(sli4_t *, uint8_t *cqe, sli4_qentry_fields_t *fields)
Parse an iSCSI work queue CQ entry.
uint32_t uint32_t icd_index
#define ISCSI_CQE_CODE_NORMAL
WQE used to transmit a PDU without any modificiation (TGT_DM_CMD)
uint32_t uint32_t wqe_index
sli4_qentry_fields_dmsg_t dmsg
#define SLI4_OPC_COMMON_GET_SLI4_PARAMETERS
This structure contains the fields in a DPDU completion.
static int32_t sli_skh_cmd_common_get_sli4_parameters(sli4_t *sli4, void *buf, size_t size)
Write a COMMON_GET_SLI4_PARAMETERS command to the provided buffer.
uint32_t uint32_t uint32_t uint32_t error_recovery_level
uint32_t buffer_address_high
static int32_t sli_skh_wqe_update_context(sli4_t *sli4, void *buf, size_t size, ocs_hal_target_login_options_t *lgn_options, uint32_t statsn)
Write an CONTEXT_UPDATE_WQE work queue entry.
int32_t sli_bmbx_command(sli4_t *sli4)
Submit a command to the bootstrap mailbox and check the status.
#define ISCSI_CQE_CODE_TCP_RECV_FIN
#define ocs_assert(cond,...)
Scatter-Gather Entry (SGE)
static int32_t sli_skh_wqe_ini_tmf(sli4_t *sli4, void *buf, size_t size, uint16_t lun, uint32_t cmdsn, uint16_t icd_index, sli4_sge_t *sgl, uint32_t n_sge)
Write an INITIATOR_TMF WQE work queue entry.
uint32_t uint32_t uint32_t uint32_t initial_r2t
uint32_t uint32_t sge1_addr_high
uint32_t piggy_back_status
#define SLI4_SGE_TYPE_SKIP
Generic Command Request header.
uint32_t uint32_t sge1_addr_high
uint32_t chain_sge_init_1
uint32_t uint32_t sge1_addr_high
uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t uint32_t rqe_count_mask
ocs_hal_dif_blk_size_e blk_size
WQE used to for TGT_STS WQE (data from ini->Tgt)
uint8_t sgl_chaining_capable
uint32_t disable_app_ref_ffff
static int32_t sli_skh_wqe_ini_nop(sli4_t *sli4, void *buf, size_t size, uint8_t dm, uint32_t cmdsn, ocs_dma_t *bhs, ocs_dma_t *payload1, ocs_dma_t *payload2, uint32_t exp_xfer_len, uint16_t icd_index)
Write an INITIATOR_NOP_OUT_COMMAND WQE work queue entry.
uint8_t t10_dif_inline_capable
#define SLI4_WQ_DOORBELL(n, x, i)
#define SLI4_WQE_CONTEXT_UPDATE
ocs_session_login_options_t session_options
uint32_t uint32_t data_seg_len
This structure contains the fields in a CMNDINV completion.
#define OCS_DEBUG_ENABLE_WQ_DUMP
static int32_t sli_skh_wqe_tgt_datain(sli4_t *sli4, void *buf, size_t size, ocs_dma_t *bhs, uint16_t lun, uint8_t dm, uint8_t underrun, uint8_t overrun, uint32_t exp_xfer_len, uint16_t icd_index, uint16_t ref_icd_index, uint32_t data_sn, uint8_t piggy_back_status, ocs_hal_dif_info_t *dif_info, sli4_sge_t *sgl, uint32_t n_sge)
Write an TGT_DATAIN_WQE work queue entry.
WQE used to Update a connection context.