#include "lm5710.h"
#include "command.h"
static void dbg_zero_all_attn(lm_device_t *pdev)
{
volatile struct host_def_status_block *def_sb = NULL;
DbgMessage(pdev, INFORMi, "dbg_zero_all_attn() inside!\n");
def_sb = lm_get_default_status_block(pdev);
DbgBreakIf(!def_sb);
def_sb->atten_status_block.attn_bits = 0;
def_sb->atten_status_block.attn_bits_ack = 0;
pdev->vars.aeu_mask_attn_func = 0x303;
pdev->vars.attn_state = 0;
}
static void dbg_assert_attn_lines(lm_device_t *pdev, u16_t lines_to_assert)
{
volatile struct host_def_status_block *def_sb = NULL;
DbgMessage1(pdev, INFORMi, "dbg_assert_attn_lines() inside! lines_to_assert:0x%x\n", lines_to_assert);
def_sb = lm_get_default_status_block(pdev);
DbgBreakIf(!def_sb);
DbgBreakIf(mm_le32_to_cpu(def_sb->atten_status_block.attn_bits) & lines_to_assert);
def_sb->atten_status_block.attn_bits |= mm_cpu_to_le32(lines_to_assert);
}
static void dbg_deassert_attn_lines(lm_device_t *pdev, u16_t lines_to_deassert)
{
volatile struct host_def_status_block *def_sb = NULL;
DbgMessage1(pdev, INFORMi, "dbg_deassert_attn_lines() inside! lines_to_deassert:0x%x\n", lines_to_deassert);
def_sb = lm_get_default_status_block(pdev);
DbgBreakIf(!def_sb);
DbgBreakIf(~mm_le32_to_cpu(def_sb->atten_status_block.attn_bits) & lines_to_deassert);
def_sb->atten_status_block.attn_bits ^= mm_cpu_to_le32(lines_to_deassert);
}
static void dbg_ack_assert_attn_lines(lm_device_t *pdev, u16_t assert_lines_to_ack)
{
volatile struct host_def_status_block *def_sb = NULL;
DbgMessage1(pdev, INFORMi, "dbg_ack_assert_attn_lines() inside! assert_lines_to_ack:0x%x\n", assert_lines_to_ack);
def_sb = lm_get_default_status_block(pdev);
DbgBreakIf(!def_sb);
DbgBreakIf(mm_le32_to_cpu(def_sb->atten_status_block.attn_bits_ack) & assert_lines_to_ack);
def_sb->atten_status_block.attn_bits_ack ^= mm_cpu_to_le32(assert_lines_to_ack);
}
static void dbg_change_sb_index(lm_device_t *pdev, u8_t rss_id)
{
volatile struct host_status_block *rss_sb = NULL;
volatile struct host_def_status_block *def_sb = NULL;
DbgBreakIf(!pdev || rss_id > MAX_RSS_CHAINS);
DbgMessage(pdev, INFORMi, "dbg_change_sb_index() inside!\n");
if(rss_id == DEF_STATUS_BLOCK_INDEX)
{
def_sb = lm_get_default_status_block(pdev);
DbgBreakIf(!def_sb);
def_sb->c_def_status_block.status_block_index = mm_cpu_to_le16(mm_le16_to_cpu(def_sb->c_def_status_block.status_block_index) + 1);
def_sb->u_def_status_block.status_block_index = mm_cpu_to_le16(mm_le16_to_cpu(def_sb->u_def_status_block.status_block_index) + 1);
def_sb->x_def_status_block.status_block_index = mm_cpu_to_le16(mm_le16_to_cpu(def_sb->x_def_status_block.status_block_index) + 1);
def_sb->t_def_status_block.status_block_index = mm_cpu_to_le16(mm_le16_to_cpu(def_sb->t_def_status_block.status_block_index) + 1);
def_sb->atten_status_block.attn_bits_index = mm_cpu_to_le16(mm_le16_to_cpu(def_sb->atten_status_block.attn_bits_index) + 1);
DbgMessage6(pdev, INFORMi, "dbg_change_sb_index():sb#%d indices are now: c_def_prod_idx:%d, u_def_prod_idx:%d, x_def_prod_idx:%d, t_def_prod_idx:%d\n",
rss_id,
mm_le16_to_cpu(def_sb->c_def_status_block.status_block_index),
mm_le16_to_cpu(def_sb->u_def_status_block.status_block_index),
mm_le16_to_cpu(def_sb->x_def_status_block.status_block_index),
mm_le16_to_cpu(def_sb->t_def_status_block.status_block_index),
mm_le16_to_cpu(def_sb->atten_status_block.attn_bits_index));
}
else
{
rss_sb = lm_get_status_block(pdev, rss_id);
DbgBreakIf(!rss_sb);
rss_sb->c_status_block.status_block_index = mm_cpu_to_le16(mm_le16_to_cpu(rss_sb->c_status_block.status_block_index) + 1);
rss_sb->u_status_block.status_block_index = mm_cpu_to_le16(mm_le16_to_cpu(rss_sb->u_status_block.status_block_index) + 1);
DbgMessage3(pdev, INFORMi, "dbg_change_sb_index():sb#%d indices are now: c_rss_prod_idx:%d, u_rss_prod_idx:%d\n",
rss_id,
mm_le16_to_cpu(rss_sb->c_status_block.status_block_index),
mm_le16_to_cpu(rss_sb->u_status_block.status_block_index));
}
}
static void dbg_def_sb_dpc(lm_device_t *pdev)
{
u8_t is_updated = 0;
u32_t cnt = 0;
u32_t total_activ_to_ack = 0;
u32_t cnt_acks = 0;
u32_t activity_flg = 0;
u16_t lcl_attn_bits = 0;
u16_t lcl_attn_ack = 0;
u16_t asserted_proc_grps = 0;
u16_t deasserted_proc_grps = 0;
u32_t dpc_loop_cnt = 1;
DbgBreakIf(!pdev);
DbgMessage(pdev, INFORMi, "dbg_def_sb_dpc(): inside!\n");
if ((is_updated = lm_is_def_sb_updated(pdev)) == 0)
{
DbgMessage(pdev, INFORMi, "dbg_def_sb_dpc(): no change in status index so get out!\n");
lm_int_ack_sb(pdev, DEF_STATUS_BLOCK_INDEX, TSTORM_ID, DEF_SB_INDEX_OF_TSTORM(pdev), IGU_INT_ENABLE, 0);
return;
}
for(cnt = 0; cnt < dpc_loop_cnt; cnt++)
{
lm_update_hc_indices(pdev, DEF_STATUS_BLOCK_INDEX, &activity_flg);
DbgBreakIf(!(activity_flg & LM_DEF_EVENT_MASK));
total_activ_to_ack |= activity_flg;
if (activity_flg & LM_DEF_ATTN_ACTIVE)
{
lcl_attn_bits = 0;
lcl_attn_ack = 0;
lm_get_attn_info(pdev, &lcl_attn_bits, &lcl_attn_ack);
GET_ATTN_CHNG_GROUPS(pdev, lcl_attn_bits, lcl_attn_ack, &asserted_proc_grps, &deasserted_proc_grps);
DbgMessage2(pdev, INFORMi, "dbg_def_sb_dpc(): asserted_proc_grps:0x%x, deasserted_proc_grps:0x%x\n", asserted_proc_grps, deasserted_proc_grps);
if (asserted_proc_grps)
lm_handle_assertion_processing(pdev, asserted_proc_grps);
if (deasserted_proc_grps)
lm_handle_deassertion_processing(pdev, deasserted_proc_grps);
}
if (activity_flg & LM_DEF_USTORM_ACTIVE)
{
}
if (activity_flg & LM_DEF_CSTORM_ACTIVE)
{
}
activity_flg = 0;
if ((is_updated = lm_is_def_sb_updated(pdev)) == 0)
{
break;
}
}
cnt_acks = count_bits(total_activ_to_ack);
DbgMessage2(pdev, INFORMi, "um_bdrv_def_dpc(): cnt_acks:%d, total_activ_to_ack:0x%x\n", cnt_acks, total_activ_to_ack);
if (total_activ_to_ack & LM_DEF_ATTN_ACTIVE)
lm_int_ack_sb(pdev, DEF_STATUS_BLOCK_INDEX, ATTENTION_ID, DEF_SB_INDEX_OF_ATTN(pdev), --cnt_acks ? IGU_INT_NOP : IGU_INT_ENABLE, 1);
if (total_activ_to_ack & LM_DEF_USTORM_ACTIVE)
lm_int_ack_sb(pdev, DEF_STATUS_BLOCK_INDEX, USTORM_ID, DEF_SB_INDEX_OF_USTORM(pdev), --cnt_acks ? IGU_INT_NOP : IGU_INT_ENABLE, 1);
if (total_activ_to_ack & LM_DEF_CSTORM_ACTIVE)
lm_int_ack_sb(pdev, DEF_STATUS_BLOCK_INDEX, CSTORM_ID, DEF_SB_INDEX_OF_CSTORM(pdev), --cnt_acks ? IGU_INT_NOP : IGU_INT_ENABLE, 1);
if (total_activ_to_ack & LM_DEF_XSTORM_ACTIVE)
lm_int_ack_sb(pdev, DEF_STATUS_BLOCK_INDEX, XSTORM_ID, DEF_SB_INDEX_OF_XSTORM(pdev), --cnt_acks ? IGU_INT_NOP : IGU_INT_ENABLE, 1);
if (total_activ_to_ack & LM_DEF_TSTORM_ACTIVE)
lm_int_ack_sb(pdev, DEF_STATUS_BLOCK_INDEX, TSTORM_ID, DEF_SB_INDEX_OF_TSTORM(pdev), --cnt_acks ? IGU_INT_NOP : IGU_INT_ENABLE, 1);
DbgMessage(pdev, INFORMi, "dbg_def_sb_dpc(): FINISH _______________________________________________\n");
}
static void dbg_sb_dpc(lm_device_t *pdev, u8_t rss_id)
{
u8_t is_updated = 0;
u32_t activity_flg = 0;
u32_t total_activ_to_ack = 0;
u32_t cnt_acks = 0;
u32_t cnt = 0;
u32_t dpc_loop_cnt = 1;
DbgBreakIf(!pdev);
DbgBreakIf(rss_id >= MAX_RSS_CHAINS);
DbgMessage1(pdev, INFORMi, "dbg_sb_dpc(): handling RSS status block #%d\n", rss_id);
if ((is_updated = lm_is_sb_updated(pdev, rss_id)) == 0)
{
DbgMessage(pdev, INFORMi, "handle_sb(): no change is status index so get out!\n");
lm_int_ack_sb(pdev, rss_id, CSTORM_ID, SB_INDEX_OF_CSTORM(pdev,rss_id), IGU_INT_ENABLE, 0);
return;
}
for(cnt = 0; cnt < dpc_loop_cnt; cnt++)
{
lm_update_hc_indices(pdev, rss_id, &activity_flg);
DbgBreakIf(!(activity_flg & LM_NON_DEF_EVENT_MASK));
total_activ_to_ack |= activity_flg;
if (activity_flg & LM_NON_DEF_USTORM_ACTIVE)
{
if (lm_is_rx_completion(pdev, rss_id))
{
}
}
if (activity_flg & LM_NON_DEF_CSTORM_ACTIVE)
{
if (lm_is_tx_completion(pdev, rss_id))
{
}
}
activity_flg = 0;
if ((is_updated = lm_is_sb_updated(pdev, rss_id)) == 0)
{
break;
}
}
cnt_acks = count_bits(total_activ_to_ack);
DbgMessage2(pdev, INFORMi, "dbg_sb_dpc(): cnt_acks:%d, total_activ_to_ack:0x%x\n", cnt_acks, total_activ_to_ack);
if (total_activ_to_ack & LM_NON_DEF_USTORM_ACTIVE)
lm_int_ack_sb(pdev, rss_id, USTORM_ID, SB_INDEX_OF_USTORM(pdev,rss_id), --cnt_acks ? IGU_INT_NOP : IGU_INT_ENABLE, 1);
if (total_activ_to_ack & LM_NON_DEF_CSTORM_ACTIVE)
lm_int_ack_sb(pdev, rss_id, CSTORM_ID, SB_INDEX_OF_CSTORM(pdev,rss_id), --cnt_acks ? IGU_INT_NOP : IGU_INT_ENABLE, 1);
lm_sq_post_pending(pdev);
DbgMessage(pdev, INFORMi, "handle_sb(): FINISH _______________________________________________\n");
}
static u8_t dbg_isr(lm_device_t *pdev, u32_t intr_status)
{
u8_t intr_recognized;
u8_t rss_id = 0;
intr_recognized = FALSE;
DbgBreakIf(!pdev);
DbgMessage(pdev, INFORMi, "dbg_isr() inside!\n");
if (!intr_status)
{
return intr_recognized;
}
while(intr_status)
{
if(intr_status & 1)
{
if (rss_id == 0)
{
dbg_def_sb_dpc(pdev);
}
else
{
dbg_sb_dpc(pdev, rss_id - 1);
}
}
intr_status >>= 1;
rss_id++;
}
intr_recognized = TRUE;
DbgMessage1(pdev, INFORMi, "dbg_isr(): intr_recognized is:%s\n", intr_recognized ? "TRUE" : "FALSE");
return intr_recognized;
}
void dbg_sb_ints_test_suite(lm_device_t *pdev)
{
u8_t index;
volatile struct host_def_status_block *def_sb = NULL;
def_sb = lm_get_default_status_block(pdev);
print_sb_info(pdev);
dbg_def_sb_dpc(pdev);
for(index = 0; index < MAX_RSS_CHAINS; index++)
{
dbg_sb_dpc(pdev, index);
}
for(index = 0; index <= MAX_RSS_CHAINS; index++)
{
if((index % 2) || (index == MAX_RSS_CHAINS))
{
dbg_change_sb_index(pdev, index);
}
}
dbg_assert_attn_lines(pdev, 0x3);
dbg_isr(pdev, 0x15555);
dbg_ack_assert_attn_lines(pdev, 0x3);
dbg_deassert_attn_lines(pdev, 0x3);
def_sb->atten_status_block.attn_bits_index = mm_cpu_to_le16(mm_le16_to_cpu(def_sb->atten_status_block.attn_bits_index) + 1) ;
dbg_isr(pdev, 0x1);
dbg_zero_all_attn(pdev);
dbg_assert_attn_lines(pdev, 0x3);
dbg_ack_assert_attn_lines(pdev, 0x3);
def_sb->atten_status_block.attn_bits_index = mm_cpu_to_le16(mm_le16_to_cpu(def_sb->atten_status_block.attn_bits_index) + 1);
dbg_isr(pdev, 0x1);
}