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

📄 i2o_proc.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 5 页
字号:
{	struct i2o_device *d = (struct i2o_device*)data;	int token;	struct	{		u16 ddm_tid;		u8 module_name[24];		u8 module_rev[8];		u8 sn_format;		u8 serial_number[12];		u8 pad[256]; // allow up to 256 byte (max) serial number	} result;		spin_lock(&i2o_proc_lock);		len = 0;	token = i2o_query_scalar(d->controller, d->lct_data.tid, 				0xF101,	-1,				&result, sizeof(result));	if (token < 0) {		len += i2o_report_query_status(buf+len, token,"0xF101 DDM Identity");		spin_unlock(&i2o_proc_lock);		return len;	}	len += sprintf(buf,     "Registering DDM TID : 0x%03x\n", result.ddm_tid);	len += sprintf(buf+len, "Module name         : %s\n", chtostr(result.module_name, 24));	len += sprintf(buf+len, "Module revision     : %s\n", chtostr(result.module_rev, 8));	len += sprintf(buf+len, "Serial number       : ");	len = print_serial_number(buf, len, result.serial_number, sizeof(result)-36);				/* allow for SNLen plus possible trailing '\0' */	len += sprintf(buf+len, "\n");	spin_unlock(&i2o_proc_lock);	return len;}/* Generic group F102h - User Information (scalar) */int i2o_proc_read_uinfo(char *buf, char **start, off_t offset, int len, 			int *eof, void *data){	struct i2o_device *d = (struct i2o_device*)data;	int token; 	struct	{		u8 device_name[64];		u8 service_name[64];		u8 physical_location[64];		u8 instance_number[4];	} result;	spin_lock(&i2o_proc_lock);	len = 0;	token = i2o_query_scalar(d->controller, d->lct_data.tid,				0xF102,	-1,				&result, sizeof(result));	if (token < 0) {		len += i2o_report_query_status(buf+len, token,"0xF102 User Information");		spin_unlock(&i2o_proc_lock);		return len;	}	len += sprintf(buf,     "Device name     : %s\n", chtostr(result.device_name, 64));	len += sprintf(buf+len, "Service name    : %s\n", chtostr(result.service_name, 64));	len += sprintf(buf+len, "Physical name   : %s\n", chtostr(result.physical_location, 64));	len += sprintf(buf+len, "Instance number : %s\n", chtostr(result.instance_number, 4));	spin_unlock(&i2o_proc_lock);	return len;}/* Generic group F103h - SGL Operating Limits (scalar) */int i2o_proc_read_sgl_limits(char *buf, char **start, off_t offset, int len, 			     int *eof, void *data){	struct i2o_device *d = (struct i2o_device*)data;	static u32 work32[12];	static u16 *work16 = (u16 *)work32;	static u8 *work8 = (u8 *)work32;	int token;	spin_lock(&i2o_proc_lock);		len = 0;	token = i2o_query_scalar(d->controller, d->lct_data.tid, 				 0xF103, -1,				 &work32, sizeof(work32));	if (token < 0) {		len += i2o_report_query_status(buf+len, token,"0xF103 SGL Operating Limits");		spin_unlock(&i2o_proc_lock);		return len;	}	len += sprintf(buf,     "SGL chain size        : %d\n", work32[0]);	len += sprintf(buf+len, "Max SGL chain size    : %d\n", work32[1]);	len += sprintf(buf+len, "SGL chain size target : %d\n", work32[2]);	len += sprintf(buf+len, "SGL frag count        : %d\n", work16[6]);	len += sprintf(buf+len, "Max SGL frag count    : %d\n", work16[7]);	len += sprintf(buf+len, "SGL frag count target : %d\n", work16[8]);	if (d->i2oversion == 0x02)	{		len += sprintf(buf+len, "SGL data alignment    : %d\n", work16[8]);		len += sprintf(buf+len, "SGL addr limit        : %d\n", work8[20]);		len += sprintf(buf+len, "SGL addr sizes supported : ");		if (work8[21] & 0x01)			len += sprintf(buf+len, "32 bit ");		if (work8[21] & 0x02)			len += sprintf(buf+len, "64 bit ");		if (work8[21] & 0x04)			len += sprintf(buf+len, "96 bit ");		if (work8[21] & 0x08)			len += sprintf(buf+len, "128 bit ");		len += sprintf(buf+len, "\n");	}	spin_unlock(&i2o_proc_lock);	return len;}/* Generic group F200h - Sensors (scalar) */int i2o_proc_read_sensors(char *buf, char **start, off_t offset, int len,			  int *eof, void *data){	struct i2o_device *d = (struct i2o_device*)data;	int token;	struct	{		u16 sensor_instance;		u8  component;		u16 component_instance;		u8  sensor_class;		u8  sensor_type;		u8  scaling_exponent;		u32 actual_reading;		u32 minimum_reading;		u32 low2lowcat_treshold;		u32 lowcat2low_treshold;		u32 lowwarn2low_treshold;		u32 low2lowwarn_treshold;		u32 norm2lowwarn_treshold;		u32 lowwarn2norm_treshold;		u32 nominal_reading;		u32 hiwarn2norm_treshold;		u32 norm2hiwarn_treshold;		u32 high2hiwarn_treshold;		u32 hiwarn2high_treshold;		u32 hicat2high_treshold;		u32 hi2hicat_treshold;		u32 maximum_reading;		u8  sensor_state;		u16 event_enable;	} result;		spin_lock(&i2o_proc_lock);		len = 0;	token = i2o_query_scalar(d->controller, d->lct_data.tid,				 0xF200, -1,				 &result, sizeof(result));	if (token < 0) {		len += i2o_report_query_status(buf+len, token,"0xF200 Sensors (optional)");		spin_unlock(&i2o_proc_lock);		return len;	}		len += sprintf(buf+len, "Sensor instance       : %d\n", result.sensor_instance);	len += sprintf(buf+len, "Component             : %d = ", result.component);	switch (result.component)	{	case 0:	len += sprintf(buf+len, "Other");				break;	case 1: len += sprintf(buf+len, "Planar logic Board");		break;	case 2: len += sprintf(buf+len, "CPU");		break;	case 3: len += sprintf(buf+len, "Chassis");		break;	case 4: len += sprintf(buf+len, "Power Supply");		break;	case 5: len += sprintf(buf+len, "Storage");		break;	case 6: len += sprintf(buf+len, "External");		break;	}			len += sprintf(buf+len,"\n");	len += sprintf(buf+len, "Component instance    : %d\n", result.component_instance);	len += sprintf(buf+len, "Sensor class          : %s\n",				result.sensor_class ? "Analog" : "Digital");		len += sprintf(buf+len, "Sensor type           : %d = ",result.sensor_type);	switch (result.sensor_type)	{	case 0:	len += sprintf(buf+len, "Other\n");		break;	case 1: len += sprintf(buf+len, "Thermal\n");		break;	case 2: len += sprintf(buf+len, "DC voltage (DC volts)\n");		break;	case 3: len += sprintf(buf+len, "AC voltage (AC volts)\n");		break;	case 4: len += sprintf(buf+len, "DC current (DC amps)\n");		break;	case 5: len += sprintf(buf+len, "AC current (AC volts)\n");		break;	case 6: len += sprintf(buf+len, "Door open\n");		break;	case 7: len += sprintf(buf+len, "Fan operational\n");		break; 	}				len += sprintf(buf+len, "Scaling exponent      : %d\n", result.scaling_exponent);	len += sprintf(buf+len, "Actual reading        : %d\n", result.actual_reading);	len += sprintf(buf+len, "Minimum reading       : %d\n", result.minimum_reading);	len += sprintf(buf+len, "Low2LowCat treshold   : %d\n", result.low2lowcat_treshold);	len += sprintf(buf+len, "LowCat2Low treshold   : %d\n", result.lowcat2low_treshold);	len += sprintf(buf+len, "LowWarn2Low treshold  : %d\n", result.lowwarn2low_treshold);	len += sprintf(buf+len, "Low2LowWarn treshold  : %d\n", result.low2lowwarn_treshold);	len += sprintf(buf+len, "Norm2LowWarn treshold : %d\n", result.norm2lowwarn_treshold);	len += sprintf(buf+len, "LowWarn2Norm treshold : %d\n", result.lowwarn2norm_treshold);	len += sprintf(buf+len, "Nominal reading       : %d\n", result.nominal_reading);	len += sprintf(buf+len, "HiWarn2Norm treshold  : %d\n", result.hiwarn2norm_treshold);	len += sprintf(buf+len, "Norm2HiWarn treshold  : %d\n", result.norm2hiwarn_treshold);	len += sprintf(buf+len, "High2HiWarn treshold  : %d\n", result.high2hiwarn_treshold);	len += sprintf(buf+len, "HiWarn2High treshold  : %d\n", result.hiwarn2high_treshold);	len += sprintf(buf+len, "HiCat2High treshold   : %d\n", result.hicat2high_treshold);	len += sprintf(buf+len, "High2HiCat treshold   : %d\n", result.hi2hicat_treshold);	len += sprintf(buf+len, "Maximum reading       : %d\n", result.maximum_reading);	len += sprintf(buf+len, "Sensor state          : %d = ", result.sensor_state);	switch (result.sensor_state)	{	case 0:	 len += sprintf(buf+len, "Normal\n");		 break;	case 1:  len += sprintf(buf+len, "Abnormal\n");		 break;	case 2:  len += sprintf(buf+len, "Unknown\n");		 break;	case 3:  len += sprintf(buf+len, "Low Catastrophic (LoCat)\n");		 break;	case 4:  len += sprintf(buf+len, "Low (Low)\n");		 break;	case 5:  len += sprintf(buf+len, "Low Warning (LoWarn)\n");		 break;	case 6:  len += sprintf(buf+len, "High Warning (HiWarn)\n");		 break;	case 7:  len += sprintf(buf+len, "High (High)\n");		 break;	case 8:  len += sprintf(buf+len, "High Catastrophic (HiCat)\n");		 break;	}				len += sprintf(buf+len, "Event_enable : 0x%02X\n", result.event_enable);	len += sprintf(buf+len, "    [%s] Operational state change. \n",			(result.event_enable & 0x01) ? "+" : "-" );	len += sprintf(buf+len, "    [%s] Low catastrophic. \n",			(result.event_enable & 0x02) ? "+" : "-" );	len += sprintf(buf+len, "    [%s] Low reading. \n",			(result.event_enable & 0x04) ? "+" : "-" );	len += sprintf(buf+len, "    [%s] Low warning. \n",			(result.event_enable & 0x08) ? "+" : "-" );	len += sprintf(buf+len, "    [%s] Change back to normal from out of range state. \n",			(result.event_enable & 0x10) ? "+" : "-" );	len += sprintf(buf+len, "    [%s] High warning. \n",			(result.event_enable & 0x20) ? "+" : "-" );	len += sprintf(buf+len, "    [%s] High reading. \n",			(result.event_enable & 0x40) ? "+" : "-" );	len += sprintf(buf+len, "    [%s] High catastrophic. \n",			(result.event_enable & 0x80) ? "+" : "-" );	spin_unlock(&i2o_proc_lock);	return len;}static int print_serial_number(char *buff, int pos, u8 *serialno, int max_len){	int i;	/* 19990419 -sralston	 *	The I2O v1.5 (and v2.0 so far) "official specification"	 *	got serial numbers WRONG!	 *	Apparently, and despite what Section 3.4.4 says and	 *	Figure 3-35 shows (pg 3-39 in the pdf doc),	 *	the convention / consensus seems to be:	 *	  + First byte is SNFormat	 *	  + Second byte is SNLen (but only if SNFormat==7 (?))	 *	  + (v2.0) SCSI+BS may use IEEE Registered (64 or 128 bit) format	 */	switch(serialno[0])	{		case I2O_SNFORMAT_BINARY:		/* Binary */			pos += sprintf(buff+pos, "0x");			for(i = 0; i < serialno[1]; i++)			{				pos += sprintf(buff+pos, "%02X", serialno[2+i]);			}			break;			case I2O_SNFORMAT_ASCII:		/* ASCII */			if ( serialno[1] < ' ' )	/* printable or SNLen? */			{				/* sanity */				max_len = (max_len < serialno[1]) ? max_len : serialno[1];				serialno[1+max_len] = '\0';				/* just print it */				pos += sprintf(buff+pos, "%s", &serialno[2]);			}			else			{				/* print chars for specified length */				for(i = 0; i < serialno[1]; i++)				{					pos += sprintf(buff+pos, "%c", serialno[2+i]);				}			}			break;		case I2O_SNFORMAT_UNICODE:		/* UNICODE */			pos += sprintf(buff+pos, "UNICODE Format.  Can't Display\n");			break;		case I2O_SNFORMAT_LAN48_MAC:		/* LAN-48 MAC Address */			pos += sprintf(buff+pos, 						"LAN-48 MAC address @ %02X:%02X:%02X:%02X:%02X:%02X",						serialno[2], serialno[3],						serialno[4], serialno[5],						serialno[6], serialno[7]);			break;		case I2O_SNFORMAT_WAN:			/* WAN MAC Address */			/* FIXME: Figure out what a WAN access address looks like?? */			pos += sprintf(buff+pos, "WAN Access Address");			break;/* plus new in v2.0 */		case I2O_SNFORMAT_LAN64_MAC:		/* LAN-64 MAC Address */			/* FIXME: Figure out what a LAN-64 address really looks like?? */			pos += sprintf(buff+pos, 						"LAN-64 MAC address @ [?:%02X:%02X:?] %02X:%02X:%02X:%02X:%02X:%02X",						serialno[8], serialno[9],						serialno[2], serialno[3],						serialno[4], serialno[5],						serialno[6], serialno[7]);			break;		case I2O_SNFORMAT_DDM:			/* I2O DDM */			pos += sprintf(buff+pos, 						"DDM: Tid=%03Xh, Rsvd=%04Xh, OrgId=%04Xh",						*(u16*)&serialno[2],						*(u16*)&serialno[4],						*(u16*)&serialno[6]);			break;		case I2O_SNFORMAT_IEEE_REG64:		/* IEEE Registered (64-bit) */		case I2O_SNFORMAT_IEEE_REG128:		/* IEEE Registered (128-bit) */			/* FIXME: Figure if this is even close?? */			pos += sprintf(buff+pos, 						"IEEE NodeName(hi,lo)=(%08Xh:%08Xh), PortName(hi,lo)=(%08Xh:%08Xh)\n",						*(u32*)&serialno[2],						*(u32*)&serialno[6],						*(u32*)&serialno[10],						*(u32*)&serialno[14]);			break;		case I2O_SNFORMAT_UNKNOWN:		/* Unknown 0    */		case I2O_SNFORMAT_UNKNOWN2:		/* Unknown 0xff */		default:			pos += sprintf(buff+pos, "Unknown data format (0x%02x)",				       serialno[0]);			break;	}	return pos;}const char * i2o_get_connector_type(int conn){	int idx = 16;	static char *i2o_connector_type[] = {		"OTHER",		"UNKNOWN",		"AUI",		"UTP",		"BNC",		"RJ45",		"STP DB9",		"FIBER MIC",		"APPLE AUI",		"MII",		"DB9",		"HSSDC",		"DUPLEX SC FIBER",		"DUPLEX ST FIBER",		"TNC/BNC",		"HW DEFAULT"	};	switch(conn)	{	case 0x00000000:		idx = 0;		break;	case 0x00000001:		idx = 1;		break;	case 0x00000002:		idx = 2;		break;	case 0x00000003:		idx = 3;		break;	case 0x00000004:		idx = 4;		break;	case 0x00000005:		idx = 5;		break;	case 0x00000006:		idx = 6;		break;	case 0x00000007:		idx = 7;		break;	case 0x00000008:		idx = 8;		break;	case 0x00000009:		idx = 9;		break;	case 0x0000000A:		idx = 10;		break;	case 0x0000000B:		idx = 11;		break;	case 0x0000000C:		idx = 12;		break;	case 0x0000000D:		idx = 13;		break;	case 0x0000000E:		idx = 14;		break;	case 0xFFFFFFFF:		idx = 15;		break;	}	return i2o_connector_type[idx];}const char * i2o_get_connection_type(int conn){	int idx = 0;	static char *i2o_connection_type[] = {		"Unknown",

⌨️ 快捷键说明

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