qla_attr.c

来自「linux 内核源代码」· C语言 代码 · 共 1,253 行 · 第 1/3 页

C
1,253
字号
{	scsi_qla_host_t *ha = shost_priv(shost);	uint32_t speed = 0;	switch (ha->link_data_rate) {	case PORT_SPEED_1GB:		speed = 1;		break;	case PORT_SPEED_2GB:		speed = 2;		break;	case PORT_SPEED_4GB:		speed = 4;		break;	}	fc_host_speed(shost) = speed;}static voidqla2x00_get_host_port_type(struct Scsi_Host *shost){	scsi_qla_host_t *ha = shost_priv(shost);	uint32_t port_type = FC_PORTTYPE_UNKNOWN;	switch (ha->current_topology) {	case ISP_CFG_NL:		port_type = FC_PORTTYPE_LPORT;		break;	case ISP_CFG_FL:		port_type = FC_PORTTYPE_NLPORT;		break;	case ISP_CFG_N:		port_type = FC_PORTTYPE_PTP;		break;	case ISP_CFG_F:		port_type = FC_PORTTYPE_NPORT;		break;	}	fc_host_port_type(shost) = port_type;}static voidqla2x00_get_starget_node_name(struct scsi_target *starget){	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);	scsi_qla_host_t *ha = shost_priv(host);	fc_port_t *fcport;	u64 node_name = 0;	list_for_each_entry(fcport, &ha->fcports, list) {		if (starget->id == fcport->os_target_id) {			node_name = wwn_to_u64(fcport->node_name);			break;		}	}	fc_starget_node_name(starget) = node_name;}static voidqla2x00_get_starget_port_name(struct scsi_target *starget){	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);	scsi_qla_host_t *ha = shost_priv(host);	fc_port_t *fcport;	u64 port_name = 0;	list_for_each_entry(fcport, &ha->fcports, list) {		if (starget->id == fcport->os_target_id) {			port_name = wwn_to_u64(fcport->port_name);			break;		}	}	fc_starget_port_name(starget) = port_name;}static voidqla2x00_get_starget_port_id(struct scsi_target *starget){	struct Scsi_Host *host = dev_to_shost(starget->dev.parent);	scsi_qla_host_t *ha = shost_priv(host);	fc_port_t *fcport;	uint32_t port_id = ~0U;	list_for_each_entry(fcport, &ha->fcports, list) {		if (starget->id == fcport->os_target_id) {			port_id = fcport->d_id.b.domain << 16 |			    fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;			break;		}	}	fc_starget_port_id(starget) = port_id;}static voidqla2x00_get_rport_loss_tmo(struct fc_rport *rport){	struct Scsi_Host *host = rport_to_shost(rport);	scsi_qla_host_t *ha = shost_priv(host);	rport->dev_loss_tmo = ha->port_down_retry_count + 5;}static voidqla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout){	struct Scsi_Host *host = rport_to_shost(rport);	scsi_qla_host_t *ha = shost_priv(host);	if (timeout)		ha->port_down_retry_count = timeout;	else		ha->port_down_retry_count = 1;	rport->dev_loss_tmo = ha->port_down_retry_count + 5;}static intqla2x00_issue_lip(struct Scsi_Host *shost){	scsi_qla_host_t *ha = shost_priv(shost);	set_bit(LOOP_RESET_NEEDED, &ha->dpc_flags);	return 0;}static struct fc_host_statistics *qla2x00_get_fc_host_stats(struct Scsi_Host *shost){	scsi_qla_host_t *ha = shost_priv(shost);	int rval;	uint16_t mb_stat[1];	link_stat_t stat_buf;	struct fc_host_statistics *pfc_host_stat;	rval = QLA_FUNCTION_FAILED;	pfc_host_stat = &ha->fc_host_stat;	memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics));	if (IS_FWI2_CAPABLE(ha)) {		rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf,		    sizeof(stat_buf) / 4, mb_stat);	} else if (atomic_read(&ha->loop_state) == LOOP_READY &&		    !test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) &&		    !test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) &&		    !ha->dpc_active) {		/* Must be in a 'READY' state for statistics retrieval. */		rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf,		    mb_stat);	}	if (rval != QLA_SUCCESS)		goto done;	pfc_host_stat->link_failure_count = stat_buf.link_fail_cnt;	pfc_host_stat->loss_of_sync_count = stat_buf.loss_sync_cnt;	pfc_host_stat->loss_of_signal_count = stat_buf.loss_sig_cnt;	pfc_host_stat->prim_seq_protocol_err_count = stat_buf.prim_seq_err_cnt;	pfc_host_stat->invalid_tx_word_count = stat_buf.inval_xmit_word_cnt;	pfc_host_stat->invalid_crc_count = stat_buf.inval_crc_cnt;done:	return pfc_host_stat;}static voidqla2x00_get_host_symbolic_name(struct Scsi_Host *shost){	scsi_qla_host_t *ha = shost_priv(shost);	qla2x00_get_sym_node_name(ha, fc_host_symbolic_name(shost));}static voidqla2x00_set_host_system_hostname(struct Scsi_Host *shost){	scsi_qla_host_t *ha = shost_priv(shost);	set_bit(REGISTER_FDMI_NEEDED, &ha->dpc_flags);}static voidqla2x00_get_host_fabric_name(struct Scsi_Host *shost){	scsi_qla_host_t *ha = shost_priv(shost);	u64 node_name;	if (ha->device_flags & SWITCH_FOUND)		node_name = wwn_to_u64(ha->fabric_node_name);	else		node_name = wwn_to_u64(ha->node_name);	fc_host_fabric_name(shost) = node_name;}static voidqla2x00_get_host_port_state(struct Scsi_Host *shost){	scsi_qla_host_t *ha = shost_priv(shost);	if (!ha->flags.online)		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;	else if (atomic_read(&ha->loop_state) == LOOP_TIMEOUT)		fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;	else		fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;}static intqla24xx_vport_create(struct fc_vport *fc_vport, bool disable){	int	ret = 0;	scsi_qla_host_t *ha = shost_priv(fc_vport->shost);	scsi_qla_host_t *vha;	ret = qla24xx_vport_create_req_sanity_check(fc_vport);	if (ret) {		DEBUG15(printk("qla24xx_vport_create_req_sanity_check failed, "		    "status %x\n", ret));		return (ret);	}	vha = qla24xx_create_vhost(fc_vport);	if (vha == NULL) {		DEBUG15(printk ("qla24xx_create_vhost failed, vha = %p\n",		    vha));		return FC_VPORT_FAILED;	}	if (disable) {		atomic_set(&vha->vp_state, VP_OFFLINE);		fc_vport_set_state(fc_vport, FC_VPORT_DISABLED);	} else		atomic_set(&vha->vp_state, VP_FAILED);	/* ready to create vport */	qla_printk(KERN_INFO, vha, "VP entry id %d assigned.\n", vha->vp_idx);	/* initialized vport states */	atomic_set(&vha->loop_state, LOOP_DOWN);	vha->vp_err_state=  VP_ERR_PORTDWN;	vha->vp_prev_err_state=  VP_ERR_UNKWN;	/* Check if physical ha port is Up */	if (atomic_read(&ha->loop_state) == LOOP_DOWN ||	    atomic_read(&ha->loop_state) == LOOP_DEAD) {		/* Don't retry or attempt login of this virtual port */		DEBUG15(printk ("scsi(%ld): pport loop_state is not UP.\n",		    vha->host_no));		atomic_set(&vha->loop_state, LOOP_DEAD);		if (!disable)			fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN);	}	if (scsi_add_host(vha->host, &fc_vport->dev)) {		DEBUG15(printk("scsi(%ld): scsi_add_host failure for VP[%d].\n",			vha->host_no, vha->vp_idx));		goto vport_create_failed_2;	}	/* initialize attributes */	fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);	fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name);	fc_host_supported_classes(vha->host) =		fc_host_supported_classes(ha->host);	fc_host_supported_speeds(vha->host) =		fc_host_supported_speeds(ha->host);	qla24xx_vport_disable(fc_vport, disable);	return 0;vport_create_failed_2:	qla24xx_disable_vp(vha);	qla24xx_deallocate_vp_id(vha);	kfree(vha->port_name);	kfree(vha->node_name);	scsi_host_put(vha->host);	return FC_VPORT_FAILED;}intqla24xx_vport_delete(struct fc_vport *fc_vport){	scsi_qla_host_t *ha = shost_priv(fc_vport->shost);	scsi_qla_host_t *vha = fc_vport->dd_data;	qla24xx_disable_vp(vha);	qla24xx_deallocate_vp_id(vha);	down(&ha->vport_sem);	ha->cur_vport_count--;	clear_bit(vha->vp_idx, (unsigned long *)ha->vp_idx_map);	up(&ha->vport_sem);	kfree(vha->node_name);	kfree(vha->port_name);	if (vha->timer_active) {		qla2x00_vp_stop_timer(vha);		DEBUG15(printk ("scsi(%ld): timer for the vport[%d] = %p "		    "has stopped\n",		    vha->host_no, vha->vp_idx, vha));        }	fc_remove_host(vha->host);	scsi_remove_host(vha->host);	scsi_host_put(vha->host);	return 0;}intqla24xx_vport_disable(struct fc_vport *fc_vport, bool disable){	scsi_qla_host_t *vha = fc_vport->dd_data;	if (disable)		qla24xx_disable_vp(vha);	else		qla24xx_enable_vp(vha);	return 0;}struct fc_function_template qla2xxx_transport_functions = {	.show_host_node_name = 1,	.show_host_port_name = 1,	.show_host_supported_classes = 1,	.get_host_port_id = qla2x00_get_host_port_id,	.show_host_port_id = 1,	.get_host_speed = qla2x00_get_host_speed,	.show_host_speed = 1,	.get_host_port_type = qla2x00_get_host_port_type,	.show_host_port_type = 1,	.get_host_symbolic_name = qla2x00_get_host_symbolic_name,	.show_host_symbolic_name = 1,	.set_host_system_hostname = qla2x00_set_host_system_hostname,	.show_host_system_hostname = 1,	.get_host_fabric_name = qla2x00_get_host_fabric_name,	.show_host_fabric_name = 1,	.get_host_port_state = qla2x00_get_host_port_state,	.show_host_port_state = 1,	.dd_fcrport_size = sizeof(struct fc_port *),	.show_rport_supported_classes = 1,	.get_starget_node_name = qla2x00_get_starget_node_name,	.show_starget_node_name = 1,	.get_starget_port_name = qla2x00_get_starget_port_name,	.show_starget_port_name = 1,	.get_starget_port_id  = qla2x00_get_starget_port_id,	.show_starget_port_id = 1,	.get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo,	.set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,	.show_rport_dev_loss_tmo = 1,	.issue_fc_host_lip = qla2x00_issue_lip,	.get_fc_host_stats = qla2x00_get_fc_host_stats,	.vport_create = qla24xx_vport_create,	.vport_disable = qla24xx_vport_disable,	.vport_delete = qla24xx_vport_delete,};struct fc_function_template qla2xxx_transport_vport_functions = {	.show_host_node_name = 1,	.show_host_port_name = 1,	.show_host_supported_classes = 1,	.get_host_port_id = qla2x00_get_host_port_id,	.show_host_port_id = 1,	.get_host_speed = qla2x00_get_host_speed,	.show_host_speed = 1,	.get_host_port_type = qla2x00_get_host_port_type,	.show_host_port_type = 1,	.get_host_symbolic_name = qla2x00_get_host_symbolic_name,	.show_host_symbolic_name = 1,	.set_host_system_hostname = qla2x00_set_host_system_hostname,	.show_host_system_hostname = 1,	.get_host_fabric_name = qla2x00_get_host_fabric_name,	.show_host_fabric_name = 1,	.get_host_port_state = qla2x00_get_host_port_state,	.show_host_port_state = 1,	.dd_fcrport_size = sizeof(struct fc_port *),	.show_rport_supported_classes = 1,	.get_starget_node_name = qla2x00_get_starget_node_name,	.show_starget_node_name = 1,	.get_starget_port_name = qla2x00_get_starget_port_name,	.show_starget_port_name = 1,	.get_starget_port_id  = qla2x00_get_starget_port_id,	.show_starget_port_id = 1,	.get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo,	.set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo,	.show_rport_dev_loss_tmo = 1,	.issue_fc_host_lip = qla2x00_issue_lip,	.get_fc_host_stats = qla2x00_get_fc_host_stats,};voidqla2x00_init_host_attr(scsi_qla_host_t *ha){	fc_host_node_name(ha->host) = wwn_to_u64(ha->node_name);	fc_host_port_name(ha->host) = wwn_to_u64(ha->port_name);	fc_host_supported_classes(ha->host) = FC_COS_CLASS3;	fc_host_max_npiv_vports(ha->host) = ha->max_npiv_vports;;	fc_host_npiv_vports_inuse(ha->host) = ha->cur_vport_count;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?