📄 iph5526.c
字号:
tx_logo(fi, s_id, received_ox_id); break; case ELS_PRLI: DPRINTK1("ELS_PRLI received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) { tx_prli(fi, ELS_ACC, s_id, received_ox_id); mark_scsi_sid(fi, buff_addr, ADD_ENTRY); } else tx_logo(fi, s_id, received_ox_id); break; case ELS_PRLO: DPRINTK1("ELS_PRLO received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_OUT) || (login_state == NODE_NOT_PRESENT)) tx_logo(fi, s_id, received_ox_id); else if (login_state == NODE_LOGGED_IN) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else if (login_state == NODE_PROCESS_LOGGED_IN) { tx_prli(fi, ELS_ACC, s_id, received_ox_id); mark_scsi_sid(fi, buff_addr, DELETE_ENTRY); } break; case ELS_LS_RJT: els_type = remove_from_ox_id_list(fi, received_ox_id); DPRINTK1("ELS_LS_RJT received from D_ID 0x%x in response to %x", s_id, els_type); /* We should be chking the reason code. */ switch (els_type) { case ELS_ADISC: tx_logi(fi, ELS_PLOGI, s_id); break; } break; case ELS_LOGO: els_type = remove_from_ox_id_list(fi, received_ox_id); DPRINTK1("ELS_LOGO received from D_ID 0x%x in response to %x", s_id, els_type); remove_from_address_cache(fi, buff_addr, ELS_LOGO); tx_acc(fi, s_id, received_ox_id); if (els_type == ELS_ADISC) tx_logi(fi, ELS_PLOGI, s_id); break; case ELS_RSCN: DPRINTK1("ELS_RSCN received from D_ID 0x%x", s_id); tx_acc(fi, s_id, received_ox_id); remove_from_address_cache(fi, buff_addr, ELS_RSCN); break; case ELS_FARP_REQ: /* We do not support FARP. So, silently discard it */ DPRINTK1("ELS_FARP_REQ received from D_ID 0x%x", s_id); break; case ELS_ABTX: DPRINTK1("ELS_ABTX received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_FLOGI: DPRINTK1("ELS_FLOGI received from D_ID 0x%x", s_id); if (fi->g.ptp_up == TRUE) { /* The node could have come up as an N_Port * in a Loop! So,try initializing as an NL_port */ take_tachyon_offline(fi); /* write AL_TIME & E_D_TOV into the registers */ writel(TOV_VALUES, fi->t_r.ptr_fm_tov_reg); writel(LOOP_INIT_SOFT_ADDRESS, fi->t_r.ptr_fm_config_reg); DPRINTK1("FLOGI received, TACHYON initializing as L_Port...\n"); writel(INITIALIZE, fi->t_r.ptr_fm_control_reg); } else { if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); } break; case ELS_ADVC: DPRINTK1("ELS_ADVC received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_ECHO: DPRINTK1("ELS_ECHO received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_ESTC: DPRINTK1("ELS_ESTC received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_ESTS: DPRINTK1("ELS_ESTS received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RCS: DPRINTK1("ELS_RCS received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RES: DPRINTK1("ELS_RES received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RLS: DPRINTK1("ELS_RLS received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RRQ: DPRINTK1("ELS_RRQ received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RSS: DPRINTK1("ELS_RSS received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RTV: DPRINTK1("ELS_RTV received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RSI: DPRINTK1("ELS_RSI received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_TEST: /* No reply sequence */ DPRINTK1("ELS_TEST received from D_ID 0x%x", s_id); break; case ELS_RNC: DPRINTK1("ELS_RNC received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_RVCS: DPRINTK1("ELS_RVCS received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_TPLS: DPRINTK1("ELS_TPLS received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_GAID: DPRINTK1("ELS_GAID received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_FACT: DPRINTK1("ELS_FACT received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_FAN: /* Hmmm... You don't support FAN ??? */ DPRINTK1("ELS_FAN received from D_ID 0x%x", s_id); tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); break; case ELS_FDACT: DPRINTK1("ELS_FDACT received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_NACT: DPRINTK1("ELS_NACT received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_NDACT: DPRINTK1("ELS_NDACT received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_QoSR: DPRINTK1("ELS_QoSR received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; case ELS_FDISC: DPRINTK1("ELS_FDISC received from D_ID 0x%x", s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; default: DPRINTK1("ELS Frame %x received from D_ID 0x%x", class_of_frame, s_id); if ((login_state == NODE_LOGGED_IN) || (login_state == NODE_PROCESS_LOGGED_IN)) tx_ls_rjt(fi, s_id, received_ox_id, CMND_NOT_SUPP, NO_EXPLN); else tx_logo(fi, s_id, received_ox_id); break; } break; case TYPE_FC_SERVICES: fs_cmnd_code = (ntohl(*(buff_addr + 10)) & 0xFFFF0000) >>16; switch(fs_cmnd_code) { case FCS_ACC: els_type = remove_from_ox_id_list(fi, received_ox_id); DPRINTK1("FCS_ACC received from D_ID 0x%x in response to %x", s_id, els_type); if (els_type == FCS_GP_ID4) explore_fabric(fi, buff_addr); break; case FCS_REJECT: DPRINTK1("FCS_REJECT received from D_ID 0x%x in response to %x", s_id, els_type); break; } break; case TYPE_LLC_SNAP: rx_net_packet(fi, (u_char *)buff_addr, payload_size); break; default: T_MSG("Frame Type %x received from %x", type_of_frame, s_id); } /* provide Tachyon will another set of buffers */ if (offset == (NO_OF_ENTRIES - 1)) update_SFSBQ_indx(fi); LEAVE("handle_SFS_interrupt");}static void handle_FM_interrupt(struct fc_info *fi){u_int fm_status;u_int tachyon_status; ENTER("handle_FM_interrupt"); fm_status = readl(fi->t_r.ptr_fm_status_reg); tachyon_status = readl(fi->t_r.ptr_tach_status_reg); DPRINTK("FM_status = %x, Tachyon_status = %x", fm_status, tachyon_status); if (fm_status & LINK_DOWN) { T_MSG("Fibre Channel Link DOWN"); fm_status = readl(fi->t_r.ptr_fm_status_reg); del_timer(&fi->explore_timer); del_timer(&fi->nport_timer); del_timer(&fi->lport_timer); del_timer(&fi->display_cache_timer); fi->g.link_up = FALSE; if (fi->g.ptp_up == TRUE) fi->g.n_port_try = FALSE; fi->g.ptp_up = FALSE; fi->g.port_discovery = FALSE; fi->g.explore_fabric = FALSE; fi->g.perform_adisc = FALSE; /* Logout will all nodes */ if (fi->node_info_list) { struct fc_node_info *temp_list = fi->node_info_list; while(temp_list) { temp_list->login = LOGIN_ATTEMPTED; temp_list = temp_list->next; } fi->num_nodes = 0; } if ((fi->g.n_port_try == FALSE) && (fi->g.dont_init == FALSE)){ take_tachyon_offline(fi); /* write AL_TIME & E_D_TOV into the registers */ writel(TOV_VALUES, fi->t_r.ptr_fm_tov_reg); if ((fi->g.fabric_present == TRUE) && (fi->g.loop_up == TRUE)) { u_int al_pa = fi->g.my_id & 0xFF; writel((al_pa << 24) | LOOP_INIT_FABRIC_ADDRESS | LOOP_INIT_PREVIOUS_ADDRESS, fi->t_r.ptr_fm_config_reg); } else if (fi->g.loop_up == TRUE) { u_int al_pa = fi->g.my_id & 0xFF; writel((al_pa << 24) | LOOP_INIT_PREVIOUS_ADDRESS, fi->t_r.ptr_fm_config_reg); } else writel(LOOP_INIT_SOFT_ADDRESS, fi->t_r.ptr_fm_config_reg); fi->g.loop_up = FALSE; DPRINTK1("In LDWN TACHYON initializing as L_Port...\n"); writel(INITIALIZE, fi->t_r.ptr_fm_control_reg); } } if (fm_status & NON_PARTICIPATING) { T_MSG("Did not acquire an AL_PA. I am not participating"); } else if ((fm_status & LINK_UP) && ((fm_status & LINK_DOWN) == 0)) { T_MSG("Fibre Channel Link UP"); if ((fm_status & NON_PARTICIPATING) != TRUE) { fi->g.link_up = TRUE; if (tachyon_status & OSM_FROZEN) { reset_tachyon(fi, ERROR_RELEASE); reset_tachyon(fi, OCQ_RESET); } init_timer(&fi->explore_timer); init_timer(&fi->nport_timer); init_timer(&fi->lport_timer); init_timer(&fi->display_cache_timer); if ((fm_status & OLD_PORT) == 0) { fi->g.loop_up = TRUE; fi->g.ptp_up = FALSE; fi->g.my_id = readl(fi->t_r.ptr_fm_config_reg) >> 24; DPRINTK1("My AL_PA = %x", fi->g.my_id); fi->g.port_discovery = TRUE; fi->g.explore_fabric = FALSE; } else if (((fm_status & 0xF0) == OLD_PORT) && ((fm_status & 0x0F) == PORT_STATE_ACTIVE)) { fi->g.loop_up = FALSE; fi->g.my_id = 0x0; /* In a point-to-point configuration, we expect to be * connected to an F_Port. This driver does not yet support * a configuration where it is connected to another N_Port * directly. */ fi->g.explore_fabric = TRUE; fi->g.port_discovery = FALSE; if (fi->g.n_port_try == FALSE) { take_tachyon_offline(fi); /* write R_T_TOV & E_D_TOV into the registers */ writel(PTP_TOV_VALUES, fi->t_r.ptr_fm_tov_reg); writel(BB_CREDIT | NPORT, fi->t_r.ptr_fm_config_reg); fi->g.n_port_try = TRUE; DPRINTK1("In LUP TACHYON initializing as N_Port...\n"); writel(INITIALIZE, fi->t_r.ptr_fm_control_reg); } else { fi->g.ptp_up = TRUE; tx_logi(fi, ELS_FLOGI, F_PORT); } } fi->g.my_ddaa = 0x0; fi->g.fabric_present = FAL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -