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

📄 lpfc_ct.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -