📄 lpfc_attr.c
字号:
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 + -