📄 lpfc_ct.c
字号:
ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + sizeof (struct lpfc_name)); memcpy(&ae->un.NodeName, &phba->fc_sparam.nodeName, sizeof (struct lpfc_name)); ab->EntryCnt++; size += FOURBYTES + sizeof (struct lpfc_name); /* #2 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(MANUFACTURER); strcpy(ae->un.Manufacturer, "Emulex Corporation"); len = strlen(ae->un.Manufacturer); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #3 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(SERIAL_NUMBER); strcpy(ae->un.SerialNumber, phba->SerialNumber); len = strlen(ae->un.SerialNumber); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #4 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(MODEL); strcpy(ae->un.Model, phba->ModelName); len = strlen(ae->un.Model); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #5 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(MODEL_DESCRIPTION); strcpy(ae->un.ModelDescription, phba->ModelDesc); len = strlen(ae->un.ModelDescription); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #6 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(HARDWARE_VERSION); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 8); /* Convert JEDEC ID to ascii for hardware version */ incr = vp->rev.biuRev; for (i = 0; i < 8; i++) { j = (incr & 0xf); if (j <= 9) ae->un.HardwareVersion[7 - i] = (char)((uint8_t) 0x30 + (uint8_t) j); else ae->un.HardwareVersion[7 - i] = (char)((uint8_t) 0x61 + (uint8_t) (j - 10)); incr = (incr >> 4); } ab->EntryCnt++; size += FOURBYTES + 8; /* #7 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(DRIVER_VERSION); strcpy(ae->un.DriverVersion, lpfc_release_version); len = strlen(ae->un.DriverVersion); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #8 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(OPTION_ROM_VERSION); strcpy(ae->un.OptionROMVersion, phba->OptionROMVersion); len = strlen(ae->un.OptionROMVersion); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #9 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(FIRMWARE_VERSION); lpfc_decode_firmware_rev(phba, ae->un.FirmwareVersion, 1); len = strlen(ae->un.FirmwareVersion); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #10 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(OS_NAME_VERSION); sprintf(ae->un.OsNameVersion, "%s %s %s", system_utsname.sysname, system_utsname.release, system_utsname.version); len = strlen(ae->un.OsNameVersion); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); ab->EntryCnt++; size += FOURBYTES + len; /* #11 HBA attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size); ae->ad.bits.AttrType = be16_to_cpu(MAX_CT_PAYLOAD_LEN); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4); ae->un.MaxCTPayloadLen = (65 * 4096); ab->EntryCnt++; size += FOURBYTES + 4; ab->EntryCnt = be32_to_cpu(ab->EntryCnt); /* Total size */ size = GID_REQUEST_SZ - 4 + size; } break; case SLI_MGMT_RPA: { lpfc_vpd_t *vp; struct serv_parm *hsp; int len; vp = &phba->vpd; CtReq->CommandResponse.bits.CmdRsp = be16_to_cpu(SLI_MGMT_RPA); CtReq->CommandResponse.bits.Size = 0; pab = (REG_PORT_ATTRIBUTE *) & CtReq->un.PortID; size = sizeof (struct lpfc_name) + FOURBYTES; memcpy((uint8_t *) & pab->PortName, (uint8_t *) & phba->fc_sparam.portName, sizeof (struct lpfc_name)); pab->ab.EntryCnt = 0; /* #1 Port attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(SUPPORTED_FC4_TYPES); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 32); ae->un.SupportFC4Types[2] = 1; ae->un.SupportFC4Types[7] = 1; pab->ab.EntryCnt++; size += FOURBYTES + 32; /* #2 Port attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(SUPPORTED_SPEED); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4); if (FC_JEDEC_ID(vp->rev.biuRev) == VIPER_JEDEC_ID) ae->un.SupportSpeed = HBA_PORTSPEED_10GBIT; else if (FC_JEDEC_ID(vp->rev.biuRev) == HELIOS_JEDEC_ID) ae->un.SupportSpeed = HBA_PORTSPEED_4GBIT; else if ((FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID) || (FC_JEDEC_ID(vp->rev.biuRev) == PEGASUS_JEDEC_ID) || (FC_JEDEC_ID(vp->rev.biuRev) == THOR_JEDEC_ID)) ae->un.SupportSpeed = HBA_PORTSPEED_2GBIT; else ae->un.SupportSpeed = HBA_PORTSPEED_1GBIT; pab->ab.EntryCnt++; size += FOURBYTES + 4; /* #3 Port attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(PORT_SPEED); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4); switch(phba->fc_linkspeed) { case LA_1GHZ_LINK: ae->un.PortSpeed = HBA_PORTSPEED_1GBIT; break; case LA_2GHZ_LINK: ae->un.PortSpeed = HBA_PORTSPEED_2GBIT; break; case LA_4GHZ_LINK: ae->un.PortSpeed = HBA_PORTSPEED_4GBIT; break; default: ae->un.PortSpeed = HBA_PORTSPEED_UNKNOWN; break; } pab->ab.EntryCnt++; size += FOURBYTES + 4; /* #4 Port attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(MAX_FRAME_SIZE); ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4); hsp = (struct serv_parm *) & phba->fc_sparam; ae->un.MaxFrameSize = (((uint32_t) hsp->cmn. bbRcvSizeMsb) << 8) | (uint32_t) hsp->cmn. bbRcvSizeLsb; pab->ab.EntryCnt++; size += FOURBYTES + 4; /* #5 Port attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(OS_DEVICE_NAME); strcpy((char *)ae->un.OsDeviceName, LPFC_DRIVER_NAME); len = strlen((char *)ae->un.OsDeviceName); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); pab->ab.EntryCnt++; size += FOURBYTES + len; if (phba->cfg_fdmi_on == 2) { /* #6 Port attribute entry */ ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size); ae->ad.bits.AttrType = be16_to_cpu(HOST_NAME); sprintf(ae->un.HostName, "%s", system_utsname.nodename); len = strlen(ae->un.HostName); len += (len & 3) ? (4 - (len & 3)) : 4; ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len); pab->ab.EntryCnt++; size += FOURBYTES + len; } pab->ab.EntryCnt = be32_to_cpu(pab->ab.EntryCnt); /* Total size */ size = GID_REQUEST_SZ - 4 + size; } break; case SLI_MGMT_DHBA: CtReq->CommandResponse.bits.CmdRsp = be16_to_cpu(SLI_MGMT_DHBA); CtReq->CommandResponse.bits.Size = 0; pe = (PORT_ENTRY *) & CtReq->un.PortID; memcpy((uint8_t *) & pe->PortName, (uint8_t *) & phba->fc_sparam.portName, sizeof (struct lpfc_name)); size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name); break; case SLI_MGMT_DPRT: CtReq->CommandResponse.bits.CmdRsp = be16_to_cpu(SLI_MGMT_DPRT); CtReq->CommandResponse.bits.Size = 0; pe = (PORT_ENTRY *) & CtReq->un.PortID; memcpy((uint8_t *) & pe->PortName, (uint8_t *) & phba->fc_sparam.portName, sizeof (struct lpfc_name)); size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name); break; } bpl = (struct ulp_bde64 *) bmp->virt; bpl->addrHigh = le32_to_cpu( putPaddrHigh(mp->phys) ); bpl->addrLow = le32_to_cpu( putPaddrLow(mp->phys) ); bpl->tus.f.bdeFlags = 0; bpl->tus.f.bdeSize = size; bpl->tus.w = le32_to_cpu(bpl->tus.w); cmpl = lpfc_cmpl_ct_cmd_fdmi; if (!lpfc_ct_cmd(phba, mp, bmp, ndlp, cmpl, FC_MAX_NS_RSP)) return 0; lpfc_mbuf_free(phba, bmp->virt, bmp->phys);fdmi_cmd_free_bmp: kfree(bmp);fdmi_cmd_free_mpvirt: lpfc_mbuf_free(phba, mp->virt, mp->phys);fdmi_cmd_free_mp: kfree(mp);fdmi_cmd_exit: /* Issue FDMI request failed */ lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, "%d:0244 Issue FDMI request failed Data: x%x\n", phba->brd_no, cmdcode); return 1;}voidlpfc_fdmi_tmo(unsigned long ptr){ struct lpfc_hba *phba = (struct lpfc_hba *)ptr; unsigned long iflag; spin_lock_irqsave(phba->host->host_lock, iflag); if (!(phba->work_hba_events & WORKER_FDMI_TMO)) { phba->work_hba_events |= WORKER_FDMI_TMO; if (phba->work_wait) wake_up(phba->work_wait); } spin_unlock_irqrestore(phba->host->host_lock,iflag);}voidlpfc_fdmi_tmo_handler(struct lpfc_hba *phba){ struct lpfc_nodelist *ndlp; spin_lock_irq(phba->host->host_lock); if (!(phba->work_hba_events & WORKER_FDMI_TMO)) { spin_unlock_irq(phba->host->host_lock); return; } ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, FDMI_DID); if (ndlp) { if (system_utsname.nodename[0] != '\0') { lpfc_fdmi_cmd(phba, ndlp, SLI_MGMT_DHBA); } else { mod_timer(&phba->fc_fdmitmo, jiffies + HZ * 60); } } spin_unlock_irq(phba->host->host_lock); return;}voidlpfc_decode_firmware_rev(struct lpfc_hba * phba, char *fwrevision, int flag){ struct lpfc_sli *psli = &phba->sli; lpfc_vpd_t *vp = &phba->vpd; uint32_t b1, b2, b3, b4, i, rev; char c; uint32_t *ptr, str[4]; uint8_t *fwname; if (vp->rev.rBit) { if (psli->sli_flag & LPFC_SLI2_ACTIVE) rev = vp->rev.sli2FwRev; else rev = vp->rev.sli1FwRev; b1 = (rev & 0x0000f000) >> 12; b2 = (rev & 0x00000f00) >> 8; b3 = (rev & 0x000000c0) >> 6; b4 = (rev & 0x00000030) >> 4; switch (b4) { case 0: c = 'N'; break; case 1: c = 'A'; break; case 2: c = 'B'; break; default: c = 0; break; } b4 = (rev & 0x0000000f); if (psli->sli_flag & LPFC_SLI2_ACTIVE) fwname = vp->rev.sli2FwName; else fwname = vp->rev.sli1FwName; for (i = 0; i < 16; i++) if (fwname[i] == 0x20) fwname[i] = 0; ptr = (uint32_t*)fwname; for (i = 0; i < 3; i++) str[i] = be32_to_cpu(*ptr++); if (c == 0) { if (flag) sprintf(fwrevision, "%d.%d%d (%s)", b1, b2, b3, (char *)str); else sprintf(fwrevision, "%d.%d%d", b1, b2, b3); } else { if (flag) sprintf(fwrevision, "%d.%d%d%c%d (%s)", b1, b2, b3, c, b4, (char *)str); else sprintf(fwrevision, "%d.%d%d%c%d", b1, b2, b3, c, b4); } } else { rev = vp->rev.smFwRev; b1 = (rev & 0xff000000) >> 24; b2 = (rev & 0x00f00000) >> 20; b3 = (rev & 0x000f0000) >> 16; c = (rev & 0x0000ff00) >> 8; b4 = (rev & 0x000000ff); if (flag) sprintf(fwrevision, "%d.%d%d%c%d ", b1, b2, b3, c, b4); else sprintf(fwrevision, "%d.%d%d%c%d ", b1, b2, b3, c, b4); } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -