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

📄 lpfc_attr.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
out:	return error;}voidlpfc_free_sysfs_attr(struct lpfc_hba *phba){	struct Scsi_Host *host = phba->host;	sysfs_remove_bin_file(&host->shost_classdev.kobj, &sysfs_mbox_attr);	sysfs_remove_bin_file(&host->shost_classdev.kobj, &sysfs_ctlreg_attr);}/* * Dynamic FC Host Attributes Support */static voidlpfc_get_host_port_id(struct Scsi_Host *shost){	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];	/* note: fc_myDID already in cpu endianness */	fc_host_port_id(shost) = phba->fc_myDID;}static voidlpfc_get_host_port_type(struct Scsi_Host *shost){	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];	spin_lock_irq(shost->host_lock);	if (phba->hba_state == LPFC_HBA_READY) {		if (phba->fc_topology == TOPOLOGY_LOOP) {			if (phba->fc_flag & FC_PUBLIC_LOOP)				fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;			else				fc_host_port_type(shost) = FC_PORTTYPE_LPORT;		} else {			if (phba->fc_flag & FC_FABRIC)				fc_host_port_type(shost) = FC_PORTTYPE_NPORT;			else				fc_host_port_type(shost) = FC_PORTTYPE_PTP;		}	} else		fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN;	spin_unlock_irq(shost->host_lock);}static voidlpfc_get_host_port_state(struct Scsi_Host *shost){	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];	spin_lock_irq(shost->host_lock);	if (phba->fc_flag & FC_OFFLINE_MODE)		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;	else {		switch (phba->hba_state) {		case LPFC_INIT_START:		case LPFC_INIT_MBX_CMDS:		case LPFC_LINK_DOWN:			fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;			break;		case LPFC_LINK_UP:		case LPFC_LOCAL_CFG_LINK:		case LPFC_FLOGI:		case LPFC_FABRIC_CFG_LINK:		case LPFC_NS_REG:		case LPFC_NS_QRY:		case LPFC_BUILD_DISC_LIST:		case LPFC_DISC_AUTH:		case LPFC_CLEAR_LA:		case LPFC_HBA_READY:			/* Links up, beyond this port_type reports state */			fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;			break;		case LPFC_HBA_ERROR:			fc_host_port_state(shost) = FC_PORTSTATE_ERROR;			break;		default:			fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;			break;		}	}	spin_unlock_irq(shost->host_lock);}static voidlpfc_get_host_speed(struct Scsi_Host *shost){	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];	spin_lock_irq(shost->host_lock);	if (phba->hba_state == LPFC_HBA_READY) {		switch(phba->fc_linkspeed) {			case LA_1GHZ_LINK:				fc_host_speed(shost) = FC_PORTSPEED_1GBIT;			break;			case LA_2GHZ_LINK:				fc_host_speed(shost) = FC_PORTSPEED_2GBIT;			break;			case LA_4GHZ_LINK:				fc_host_speed(shost) = FC_PORTSPEED_4GBIT;			break;			default:				fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;			break;		}	}	spin_unlock_irq(shost->host_lock);}static voidlpfc_get_host_fabric_name (struct Scsi_Host *shost){	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];	u64 node_name;	spin_lock_irq(shost->host_lock);	if ((phba->fc_flag & FC_FABRIC) ||	    ((phba->fc_topology == TOPOLOGY_LOOP) &&	     (phba->fc_flag & FC_PUBLIC_LOOP)))		node_name = wwn_to_u64(phba->fc_fabparam.nodeName.u.wwn);	else		/* fabric is local port if there is no F/FL_Port */		node_name = wwn_to_u64(phba->fc_nodename.u.wwn);	spin_unlock_irq(shost->host_lock);	fc_host_fabric_name(shost) = node_name;}static struct fc_host_statistics *lpfc_get_stats(struct Scsi_Host *shost){	struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0];	struct lpfc_sli *psli = &phba->sli;	struct fc_host_statistics *hs = &phba->link_stats;	LPFC_MBOXQ_t *pmboxq;	MAILBOX_t *pmb;	int rc = 0;	pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);	if (!pmboxq)		return NULL;	memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));	pmb = &pmboxq->mb;	pmb->mbxCommand = MBX_READ_STATUS;	pmb->mbxOwner = OWN_HOST;	pmboxq->context1 = NULL;	if ((phba->fc_flag & FC_OFFLINE_MODE) ||		(!(psli->sli_flag & LPFC_SLI2_ACTIVE)))		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);	else		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);	if (rc != MBX_SUCCESS) {		if (rc == MBX_TIMEOUT)			pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;		else			mempool_free(pmboxq, phba->mbox_mem_pool);		return NULL;	}	memset(hs, 0, sizeof (struct fc_host_statistics));	hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt;	hs->tx_words = (pmb->un.varRdStatus.xmitByteCnt * 256);	hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt;	hs->rx_words = (pmb->un.varRdStatus.rcvByteCnt * 256);	memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));	pmb->mbxCommand = MBX_READ_LNK_STAT;	pmb->mbxOwner = OWN_HOST;	pmboxq->context1 = NULL;	if ((phba->fc_flag & FC_OFFLINE_MODE) ||	    (!(psli->sli_flag & LPFC_SLI2_ACTIVE)))		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);	else		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);	if (rc != MBX_SUCCESS) {		if (rc == MBX_TIMEOUT)			pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;		else			mempool_free( pmboxq, phba->mbox_mem_pool);		return NULL;	}	hs->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;	hs->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;	hs->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;	hs->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;	hs->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;	hs->invalid_crc_count = pmb->un.varRdLnk.crcCnt;	hs->error_frames = pmb->un.varRdLnk.crcCnt;	if (phba->fc_topology == TOPOLOGY_LOOP) {		hs->lip_count = (phba->fc_eventTag >> 1);		hs->nos_count = -1;	} else {		hs->lip_count = -1;		hs->nos_count = (phba->fc_eventTag >> 1);	}	hs->dumped_frames = -1;/* FIX ME */	/*hs->SecondsSinceLastReset = (jiffies - lpfc_loadtime) / HZ;*/	return hs;}/* * The LPFC driver treats linkdown handling as target loss events so there * are no sysfs handlers for link_down_tmo. */static voidlpfc_get_starget_port_id(struct scsi_target *starget){	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0];	uint32_t did = -1;	struct lpfc_nodelist *ndlp = NULL;	spin_lock_irq(shost->host_lock);	/* Search the mapped list for this target ID */	list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) {		if (starget->id == ndlp->nlp_sid) {			did = ndlp->nlp_DID;			break;		}	}	spin_unlock_irq(shost->host_lock);	fc_starget_port_id(starget) = did;}static voidlpfc_get_starget_node_name(struct scsi_target *starget){	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0];	u64 node_name = 0;	struct lpfc_nodelist *ndlp = NULL;	spin_lock_irq(shost->host_lock);	/* Search the mapped list for this target ID */	list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) {		if (starget->id == ndlp->nlp_sid) {			node_name = wwn_to_u64(ndlp->nlp_nodename.u.wwn);			break;		}	}	spin_unlock_irq(shost->host_lock);	fc_starget_node_name(starget) = node_name;}static voidlpfc_get_starget_port_name(struct scsi_target *starget){	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0];	u64 port_name = 0;	struct lpfc_nodelist *ndlp = NULL;	spin_lock_irq(shost->host_lock);	/* Search the mapped list for this target ID */	list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) {		if (starget->id == ndlp->nlp_sid) {			port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn);			break;		}	}	spin_unlock_irq(shost->host_lock);	fc_starget_port_name(starget) = port_name;}static voidlpfc_get_rport_loss_tmo(struct fc_rport *rport){	/*	 * Return the driver's global value for device loss timeout plus	 * five seconds to allow the driver's nodev timer to run.	 */	rport->dev_loss_tmo = lpfc_nodev_tmo + 5;}static voidlpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout){	/*	 * The driver doesn't have a per-target timeout setting.  Set	 * this value globally. lpfc_nodev_tmo should be greater then 0.	 */	if (timeout)		lpfc_nodev_tmo = timeout;	else		lpfc_nodev_tmo = 1;	rport->dev_loss_tmo = lpfc_nodev_tmo + 5;}#define lpfc_rport_show_function(field, format_string, sz, cast)	\static ssize_t								\lpfc_show_rport_##field (struct class_device *cdev, char *buf)		\{									\	struct fc_rport *rport = transport_class_to_rport(cdev);	\	struct lpfc_rport_data *rdata = rport->hostdata;		\	return snprintf(buf, sz, format_string,				\		(rdata->target) ? cast rdata->target->field : 0);	\}#define lpfc_rport_rd_attr(field, format_string, sz)			\	lpfc_rport_show_function(field, format_string, sz, )		\static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL)struct fc_function_template lpfc_transport_functions = {	/* fixed attributes the driver supports */	.show_host_node_name = 1,	.show_host_port_name = 1,	.show_host_supported_classes = 1,	.show_host_supported_fc4s = 1,	.show_host_symbolic_name = 1,	.show_host_supported_speeds = 1,	.show_host_maxframe_size = 1,	/* dynamic attributes the driver supports */	.get_host_port_id = lpfc_get_host_port_id,	.show_host_port_id = 1,	.get_host_port_type = lpfc_get_host_port_type,	.show_host_port_type = 1,	.get_host_port_state = lpfc_get_host_port_state,	.show_host_port_state = 1,	/* active_fc4s is shown but doesn't change (thus no get function) */	.show_host_active_fc4s = 1,	.get_host_speed = lpfc_get_host_speed,	.show_host_speed = 1,	.get_host_fabric_name = lpfc_get_host_fabric_name,	.show_host_fabric_name = 1,	/*	 * The LPFC driver treats linkdown handling as target loss events	 * so there are no sysfs handlers for link_down_tmo.	 */	.get_fc_host_stats = lpfc_get_stats,	/* the LPFC driver doesn't support resetting stats yet */	.dd_fcrport_size = sizeof(struct lpfc_rport_data),	.show_rport_maxframe_size = 1,	.show_rport_supported_classes = 1,	.get_rport_dev_loss_tmo = lpfc_get_rport_loss_tmo,	.set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,	.show_rport_dev_loss_tmo = 1,	.get_starget_port_id  = lpfc_get_starget_port_id,	.show_starget_port_id = 1,	.get_starget_node_name = lpfc_get_starget_node_name,	.show_starget_node_name = 1,	.get_starget_port_name = lpfc_get_starget_port_name,	.show_starget_port_name = 1,	.issue_fc_host_lip = lpfc_issue_lip,};voidlpfc_get_cfgparam(struct lpfc_hba *phba){	lpfc_log_verbose_init(phba, lpfc_log_verbose);	lpfc_cr_delay_init(phba, lpfc_cr_delay);	lpfc_cr_count_init(phba, lpfc_cr_count);	lpfc_lun_queue_depth_init(phba, lpfc_lun_queue_depth);	lpfc_fcp_class_init(phba, lpfc_fcp_class);	lpfc_use_adisc_init(phba, lpfc_use_adisc);	lpfc_ack0_init(phba, lpfc_ack0);	lpfc_topology_init(phba, lpfc_topology);	lpfc_scan_down_init(phba, lpfc_scan_down);	lpfc_nodev_tmo_init(phba, lpfc_nodev_tmo);	lpfc_link_speed_init(phba, lpfc_link_speed);	lpfc_fdmi_on_init(phba, lpfc_fdmi_on);	lpfc_discovery_threads_init(phba, lpfc_discovery_threads);	lpfc_max_luns_init(phba, lpfc_max_luns);	/*	 * The total number of segments is the configuration value plus 2	 * since the IOCB need a command and response bde.	 */	phba->cfg_sg_seg_cnt = LPFC_SG_SEG_CNT + 2;	/*	 * Since the sg_tablesize is module parameter, the sg_dma_buf_size	 * used to create the sg_dma_buf_pool must be dynamically calculated	 */	phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) +			sizeof(struct fcp_rsp) +			(phba->cfg_sg_seg_cnt * sizeof(struct ulp_bde64));	switch (phba->pcidev->device) {	case PCI_DEVICE_ID_LP101:	case PCI_DEVICE_ID_BSMB:	case PCI_DEVICE_ID_ZSMB:		phba->cfg_hba_queue_depth = LPFC_LP101_HBA_Q_DEPTH;		break;	case PCI_DEVICE_ID_RFLY:	case PCI_DEVICE_ID_PFLY:	case PCI_DEVICE_ID_BMID:	case PCI_DEVICE_ID_ZMID:	case PCI_DEVICE_ID_TFLY:		phba->cfg_hba_queue_depth = LPFC_LC_HBA_Q_DEPTH;		break;	default:		phba->cfg_hba_queue_depth = LPFC_DFT_HBA_Q_DEPTH;	}	return;}

⌨️ 快捷键说明

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