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