⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iph5526.c

📁 h内核
💻 C
📖 第 1 页 / 共 5 页
字号:
						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 + -