43 #define DEFAULT_SAVED_DUMP_SIZE (4*1024*1024)
66 uint32_t rq_busy_list_cnt;
68 for (i = 0; i < q_count; i ++, q ++) {
104 ocs_unlock(&q->
lock);
115 ocs_addr32_hi(q->
dma.phys),
116 ocs_addr32_lo(q->
dma.phys));
146 for (wq_index = 0; wq_index < hal->
config.
n_wq; wq_index++) {
147 if (hal->
wq[wq_index].
index > 0) {
148 snprintf(wq_name,
sizeof(wq_name),
"wq-%d", wq_index);
176 for (cq_index = 0; cq_index < hal->
config.
n_cq; cq_index++) {
177 if (hal->
cq[cq_index].
index > 0) {
178 snprintf(cq_name,
sizeof(cq_name),
"cq-%d", cq_index);
208 default: q_desc =
"unknown";
break;
247 default: p =
"<unknown>";
break;
260 default: p =
"<unknown>";
break;
307 #if defined(OCS_DEBUG_QUEUE_HISTORY)
315 ocs_ddump_queue_history(
ocs_textbuf_t *textbuf, ocs_hal_q_hist_t *q_hist)
323 if (q_hist->q_hist == NULL) {
335 ocs_lock(&q_hist->q_hist_lock);
336 x = ocs_queue_history_prev_index(q_hist->q_hist_index);
339 ocs_q_hist_ftr_t ftr;
344 ftr.word = q_hist->q_hist[x];
355 ocs_queue_history_type_name(ftr.s.type));
357 if (ocs_queue_history_timestamp_enabled()) {
359 x = ocs_queue_history_prev_index(x);
360 tsc_value = ((q_hist->q_hist[x]) & 0x00000000FFFFFFFFull);
361 x = ocs_queue_history_prev_index(x);
362 tsc_value |= (((uint64_t)q_hist->q_hist[x] << 32) & 0xFFFFFFFF00000000ull);
366 if (ocs_queue_history_q_info_enabled()) {
367 if (ftr.s.type == OCS_Q_HIST_TYPE_CQE_RQ ||
368 ftr.s.type == OCS_Q_HIST_TYPE_CQE_RQ ||
369 ftr.s.type == OCS_Q_HIST_TYPE_CQE_TCP_ACK ||
370 ftr.s.type == OCS_Q_HIST_TYPE_CQE_INI_IO ||
371 ftr.s.type == OCS_Q_HIST_TYPE_CQE_TGT_IO ||
372 ftr.s.type == OCS_Q_HIST_TYPE_CQE_CMDINV ||
373 ftr.s.type == OCS_Q_HIST_TYPE_CQE_ASYNC ||
374 ftr.s.type == OCS_Q_HIST_TYPE_CQE_MQ ||
375 ftr.s.type == OCS_Q_HIST_TYPE_CQE_CNXINV ||
376 ftr.s.type == OCS_Q_HIST_TYPE_CQE_T_DDIGEST ||
377 ftr.s.type == OCS_Q_HIST_TYPE_CQE_TX_DIF ||
378 ftr.s.type == OCS_Q_HIST_TYPE_WQE) {
379 x = ocs_queue_history_prev_index(x);
381 ((q_hist->q_hist[x] >> 16) & 0xFFFF),
382 ((q_hist->q_hist[x] >> 0) & 0xFFFF));
387 if ((mask & 1) && (x != q_hist->q_hist_index)){
389 x = ocs_queue_history_prev_index(x);
391 i, q_hist->q_hist[x]);
393 mask = (mask >> 1UL);
398 x = ocs_queue_history_prev_index(x);
399 }
while (x != ocs_queue_history_prev_index(q_hist->q_hist_index));
400 ocs_unlock(&q_hist->q_hist_lock);
424 ocs_t *ocs = hal->
os;
425 uint32_t cmd_busy_cnt = 0;
426 uint32_t cmd_pending_cnt = 0;
427 uint32_t cmd_async_cnt = 0;
428 uint32_t io_free_cnt = 0;
429 uint32_t io_tgt_write_quarantine_cnt;
430 uint32_t io_ini_read_quarantine_cnt;
481 ocs_ddump_value(textbuf,
"MBOX_cmd_pending_cnt",
"%d", cmd_pending_cnt);
497 ocs_ddump_value(textbuf,
"io_tgt_write_quarantine_cnt",
"%d", io_tgt_write_quarantine_cnt);
498 ocs_ddump_value(textbuf,
"io_ini_read_quarantine_cnt",
"%d", io_ini_read_quarantine_cnt);
535 uint32_t active_io_cnt = 0;
536 uint32_t aborted_io_cnt = 0;
541 ocs_lock(&cxn->active_ios_lock);
548 ocs_unlock(&cxn->active_ios_lock);
553 ocs_ddump_value(textbuf,
"max_wr_xfer_size",
"%d", cxn->max_wr_xfer_size);
561 ocs_ddump_value(textbuf,
"session_instance",
"%d", cxn->session->instance_index);
566 ocs_ddump_value(textbuf,
"nop_abort_counter",
"%d", ocs_atomic_read(&cxn->nop_abort_counter));
586 ocs_domain_t *domain;
592 if (iscsi->
hal != NULL &&
641 ocs_ddump_value(textbuf,
"enable_sgl_chaining",
"%d", ocs->enable_sgl_chaining);
642 ocs_ddump_value(textbuf,
"enable_immediate_data",
"%d", ocs->enable_immediate_data);
643 ocs_ddump_value(textbuf,
"enable_hdr_digest",
"%d", ocs->enable_hdr_digest);
644 ocs_ddump_value(textbuf,
"enable_data_digest",
"%d", ocs->enable_data_digest);
645 ocs_ddump_value(textbuf,
"enable_jumbo_frame",
"%d", ocs->enable_jumbo_frame);
647 ocs_ddump_value(textbuf,
"post_sgl_config",
"%d", ocs->post_sgl_config);
653 ocs_ddump_value(textbuf,
"tcp_window_size",
"%d", ocs->tcp_window_size);
654 ocs_ddump_value(textbuf,
"tcp_window_scale",
"%d", ocs->tcp_window_scale);
657 ocs_ddump_value(textbuf,
"io_alloc_failed_count",
"%d", ocs_atomic_read(&ocs->io_alloc_failed_count));
658 ocs_ddump_value(textbuf,
"io_active_count",
"%d", ocs_atomic_read(&ocs->io_active_count));
659 ocs_ddump_value(textbuf,
"io_pending_count",
"%d", ocs_atomic_read(&ocs->io_pending_count));
660 ocs_ddump_value(textbuf,
"io_total_alloc",
"%d", ocs_atomic_read(&ocs->io_total_alloc));
661 ocs_ddump_value(textbuf,
"io_total_free",
"%d", ocs_atomic_read(&ocs->io_total_free));
662 ocs_ddump_value(textbuf,
"io_total_pending",
"%d", ocs_atomic_read(&ocs->io_total_pending));
663 ocs_ddump_value(textbuf,
"io_pending_recursing",
"%d", ocs_atomic_read(&ocs->io_pending_recursing));
665 #if defined(ENABLE_LOCK_DEBUG)
668 ocs_lock(&ocs->ocs_os.locklist_lock); {
680 } ocs_unlock(&ocs->ocs_os.locklist_lock);
698 #if !defined(OCS_DEBUG_QUEUE_HISTORY)
705 ocs_ddump_queue_history(textbuf, &ocs->hal.q_hist);
736 ocs_log_test(ocs,
"Saved ddump already exists\n");
741 ocs_log_err(ocs,
"Saved ddump not allocated\n");
745 ocs_log_debug(ocs,
"Saving ddump\n");
746 ocs_ddump(ocs, &ocs->ddump_saved, flags, qentries);
810 ocs_log_test(ocs,
"no saved ddump found\n");
831 ocs_log_debug(ocs,
"saved ddump cleared\n");
835 ocs_log_test(ocs,
"no saved ddump found\n");
841 #if !defined(OCS_EXPORT)
842 #define OCS_EXPORT(...)
int ocs_ddump(ocs_t *ocs, ocs_textbuf_t *textbuf, uint32_t flags, uint32_t qentries)
Initiate ddump.
static void ocs_sport_unlock(ocs_sport_t *sport)
uint16_t frg_num_field_mask
Structure to track RQ buffers submitted to the chip.
int32_t ocs_textbuf_get_length(ocs_textbuf_t *textbuf)
#define OCS_DDUMP_FLAGS_WQES
static void ocs_ddump_cxn(ocs_textbuf_t *textbuf, ocs_cxn_t *cxn)
Generate node ddump data.
uint16_t frg_num_field_offset
ocs_t * ocs_get_instance(uint32_t index)
Returns a pointer to the ocs structure given the instance index.
static void ocs_ddump_sli(ocs_textbuf_t *textbuf, sli4_t *sli4)
Generate SLI4 ddump.
void ocs_ddump_queue_entries(ocs_textbuf_t *textbuf, void *q_addr, uint32_t size, uint32_t length, int32_t index, uint32_t qentries)
Generate driver dump for queue.
uint32_t max_qentries[SLI_QTYPE_MAX]
uint32_t chain_sge_init_0
static void ocs_sport_lock(ocs_sport_t *sport)
struct sli4_queue_t::@33::@35 wq
void ocs_ddump_endfile(ocs_textbuf_t *textbuf)
Generate driver dump end of file information.
static void * ocs_list_get_head(ocs_list_t *list)
Return the first item in the list.
struct sli4_queue_t::@33::@34 flag
uint8_t fw_on_flash_version[32]
int32_t ocs_textbuf_get_written(ocs_textbuf_t *textbuf)
uint8_t * ocs_textbuf_get_buffer(ocs_textbuf_t *textbuf)
int ocs_ddump_domain(ocs_textbuf_t *textbuf, ocs_domain_t *domain)
Generate domain ddump.
struct sli4_t::@37 features
uint32_t sge_supported_length
#define OCS_DDUMP_FLAGS_RQES
int32_t ocs_ddump_ramlog(ocs_textbuf_t *textbuf, ocs_ramlog_t *ramlog)
Perform ramlog buffer driver dump.
void ocs_ddump_section(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section start data.
int32_t ocs_save_ddump(ocs_t *ocs, uint32_t flags, uint32_t qentries)
Capture and save ddump.
union sli4_queue_t::@33 u
uint32_t io_tgt_write_quarantine_cnt
uint32_t sli_reg_read(sli4_t *sli, sli4_regname_e reg)
Read the given SLI register.
#define OCS_DDUMP_FLAGS_EQES
ocs_list_t rq_list_busy[OCS_HAL_MAX_NUM_RQ]
int32_t ocs_clear_saved_ddump(ocs_t *ocs)
Clear saved ddump.
sli4_queue_t rq[OCS_HAL_MAX_NUM_RQ]
sli4_queue_t eq[OCS_HAL_MAX_NUM_EQ]
void ocs_ddump_sessions(ocs_textbuf_t *textbuf, ocs_iscsi_t *iscsi)
Generate node ddump data.
uint16_t sgl_idx_field_mask
void ocs_scsi_ini_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
Generate driver dump data for debugging.
int32_t ocs_save_ddump_all(uint32_t flags, uint32_t qentries, uint32_t alloc_flag)
Capture and save ddump for all OCS instances.
uint16_t sgl_idx_field_offset
sli4_asic_type_e asic_type
uint8_t use_v1_multi_protocol
static void ocs_ddump_hal(ocs_textbuf_t *textbuf, ocs_hal_t *hal, uint32_t ddump_flags, uint32_t qentries)
Generate HAL ddump.
static void ocs_ddump_cq(ocs_textbuf_t *textbuf, ocs_hal_t *hal, uint32_t qentries)
Dump iSCSI CQs.
#define DEFAULT_SAVED_DUMP_SIZE
static void ocs_ddump_cxns(ocs_textbuf_t *textbuf, ocs_iscsi_t *iscsi)
Generate node ddump data.
int32_t ocs_get_saved_ddump(ocs_t *ocs, ocs_textbuf_t *textbuf)
Get saved ddump.
void ocs_ddump_endsection(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section end data.
struct sli4_t::@38 config
uint8_t is_hal_initialized
static void ocs_ddump_sli_q_fields(ocs_textbuf_t *textbuf, sli4_t *sli4, sli4_qtype_e qtype)
Generate SLI4 ddump.
void ocs_ddump_startfile(ocs_textbuf_t *textbuf)
Generate driver dump start of file information.
static void ocs_ddump_wq(ocs_textbuf_t *textbuf, ocs_hal_t *hal, uint32_t qentries)
Dump iSCSI WQs.
static void ocs_ddump_sli4_queue(ocs_textbuf_t *textbuf, ocs_hal_t *hal, const char *name, sli4_queue_t *q, uint32_t q_count, uint32_t qentries)
Generate sli4 queue ddump.
This structure is used to track the SLI4 queues.
void ocs_scsi_tgt_ddump(ocs_textbuf_t *textbuf, ocs_scsi_ddump_type_e type, void *obj)
ocs_hal_workaround_t workaround
static void * ocs_list_next(ocs_list_t *list, void *item)
Get the next item on the list.
void ocs_textbuf_printf(ocs_textbuf_t *textbuf, const char *fmt,...)
Helper function to dump message.
static void ocs_domain_lock(ocs_domain_t *domain)
void ocs_textbuf_buffer(ocs_textbuf_t *textbuf, uint8_t *buffer, uint32_t buffer_length)
void ocs_textbuf_reset(ocs_textbuf_t *textbuf)
#define ocs_assert(cond,...)
uint16_t num_sges_per_icd
struct ocs_hal_t::@19 config
uint16_t max_qcount[SLI_QTYPE_MAX]
int32_t ocs_textbuf_alloc(ocs_t *ocs, ocs_textbuf_t *textbuf, uint32_t length)
uint32_t ocs_textbuf_initialized(ocs_textbuf_t *textbuf)
uint32_t icd_num_per_page
#define ocs_list_foreach(list, item)
Iterate a linked list.
uint32_t chain_sge_init_1
uint32_t io_ini_read_quarantine_cnt
#define OCS_DDUMP_FLAGS_CQES
uint8_t sgl_chaining_capable
ocs_atomic_t io_alloc_failed_count
void ocs_ddump_value(ocs_textbuf_t *textbuf, const char *name, const char *fmt,...)
Generate driver dump data for a given value.
static void ocs_domain_unlock(ocs_domain_t *domain)
#define OCS_DDUMP_FLAGS_MQES