Linux Audio

Check our new training course

Loading...
v3.15
   1/*
   2 *	procfs handler for Linux I2O subsystem
   3 *
   4 *	(c) Copyright 1999	Deepak Saxena
   5 *
   6 *	Originally written by Deepak Saxena(deepak@plexity.net)
   7 *
   8 *	This program is free software; you can redistribute it and/or modify it
   9 *	under the terms of the GNU General Public License as published by the
  10 *	Free Software Foundation; either version 2 of the License, or (at your
  11 *	option) any later version.
  12 *
  13 *	This is an initial test release. The code is based on the design of the
  14 *	ide procfs system (drivers/block/ide-proc.c). Some code taken from
  15 *	i2o-core module by Alan Cox.
  16 *
  17 *	DISCLAIMER: This code is still under development/test and may cause
  18 *	your system to behave unpredictably.  Use at your own discretion.
  19 *
  20 *
  21 *	Fixes/additions:
  22 *		Juha Sievänen (Juha.Sievanen@cs.Helsinki.FI),
  23 *		Auvo Häkkinen (Auvo.Hakkinen@cs.Helsinki.FI)
  24 *		University of Helsinki, Department of Computer Science
  25 *			LAN entries
  26 *		Markus Lidel <Markus.Lidel@shadowconnect.com>
  27 *			Changes for new I2O API
  28 */
  29
  30#define OSM_NAME	"proc-osm"
  31#define OSM_VERSION	"1.316"
  32#define OSM_DESCRIPTION	"I2O ProcFS OSM"
  33
  34#define I2O_MAX_MODULES 4
  35// FIXME!
  36#define FMT_U64_HEX "0x%08x%08x"
  37#define U64_VAL(pu64) *((u32*)(pu64)+1), *((u32*)(pu64))
  38
  39#include <linux/types.h>
  40#include <linux/kernel.h>
  41#include <linux/pci.h>
  42#include <linux/i2o.h>
  43#include <linux/slab.h>
  44#include <linux/proc_fs.h>
  45#include <linux/seq_file.h>
  46#include <linux/init.h>
  47#include <linux/module.h>
  48#include <linux/errno.h>
  49#include <linux/spinlock.h>
  50#include <linux/workqueue.h>
  51
  52#include <asm/io.h>
  53#include <asm/uaccess.h>
  54#include <asm/byteorder.h>
  55
  56/* Structure used to define /proc entries */
  57typedef struct _i2o_proc_entry_t {
  58	char *name;		/* entry name */
  59	umode_t mode;		/* mode */
  60	const struct file_operations *fops;	/* open function */
  61} i2o_proc_entry;
  62
  63/* global I2O /proc/i2o entry */
  64static struct proc_dir_entry *i2o_proc_dir_root;
  65
  66/* proc OSM driver struct */
  67static struct i2o_driver i2o_proc_driver = {
  68	.name = OSM_NAME,
  69};
  70
  71static int print_serial_number(struct seq_file *seq, u8 * serialno, int max_len)
  72{
  73	int i;
  74
  75	/* 19990419 -sralston
  76	 *      The I2O v1.5 (and v2.0 so far) "official specification"
  77	 *      got serial numbers WRONG!
  78	 *      Apparently, and despite what Section 3.4.4 says and
  79	 *      Figure 3-35 shows (pg 3-39 in the pdf doc),
  80	 *      the convention / consensus seems to be:
  81	 *        + First byte is SNFormat
  82	 *        + Second byte is SNLen (but only if SNFormat==7 (?))
  83	 *        + (v2.0) SCSI+BS may use IEEE Registered (64 or 128 bit) format
  84	 */
  85	switch (serialno[0]) {
  86	case I2O_SNFORMAT_BINARY:	/* Binary */
  87		seq_printf(seq, "0x");
  88		for (i = 0; i < serialno[1]; i++) {
  89			seq_printf(seq, "%02X", serialno[2 + i]);
  90		}
  91		break;
  92
  93	case I2O_SNFORMAT_ASCII:	/* ASCII */
  94		if (serialno[1] < ' ') {	/* printable or SNLen? */
  95			/* sanity */
  96			max_len =
  97			    (max_len < serialno[1]) ? max_len : serialno[1];
  98			serialno[1 + max_len] = '\0';
  99
 100			/* just print it */
 101			seq_printf(seq, "%s", &serialno[2]);
 102		} else {
 103			/* print chars for specified length */
 104			for (i = 0; i < serialno[1]; i++) {
 105				seq_printf(seq, "%c", serialno[2 + i]);
 106			}
 107		}
 108		break;
 109
 110	case I2O_SNFORMAT_UNICODE:	/* UNICODE */
 111		seq_printf(seq, "UNICODE Format.  Can't Display\n");
 112		break;
 113
 114	case I2O_SNFORMAT_LAN48_MAC:	/* LAN-48 MAC Address */
 115		seq_printf(seq, "LAN-48 MAC address @ %pM", &serialno[2]);
 116		break;
 117
 118	case I2O_SNFORMAT_WAN:	/* WAN MAC Address */
 119		/* FIXME: Figure out what a WAN access address looks like?? */
 120		seq_printf(seq, "WAN Access Address");
 121		break;
 122
 123/* plus new in v2.0 */
 124	case I2O_SNFORMAT_LAN64_MAC:	/* LAN-64 MAC Address */
 125		/* FIXME: Figure out what a LAN-64 address really looks like?? */
 126		seq_printf(seq,
 127			   "LAN-64 MAC address @ [?:%02X:%02X:?] %pM",
 128			   serialno[8], serialno[9], &serialno[2]);
 129		break;
 130
 131	case I2O_SNFORMAT_DDM:	/* I2O DDM */
 132		seq_printf(seq,
 133			   "DDM: Tid=%03Xh, Rsvd=%04Xh, OrgId=%04Xh",
 134			   *(u16 *) & serialno[2],
 135			   *(u16 *) & serialno[4], *(u16 *) & serialno[6]);
 136		break;
 137
 138	case I2O_SNFORMAT_IEEE_REG64:	/* IEEE Registered (64-bit) */
 139	case I2O_SNFORMAT_IEEE_REG128:	/* IEEE Registered (128-bit) */
 140		/* FIXME: Figure if this is even close?? */
 141		seq_printf(seq,
 142			   "IEEE NodeName(hi,lo)=(%08Xh:%08Xh), PortName(hi,lo)=(%08Xh:%08Xh)\n",
 143			   *(u32 *) & serialno[2],
 144			   *(u32 *) & serialno[6],
 145			   *(u32 *) & serialno[10], *(u32 *) & serialno[14]);
 146		break;
 147
 148	case I2O_SNFORMAT_UNKNOWN:	/* Unknown 0    */
 149	case I2O_SNFORMAT_UNKNOWN2:	/* Unknown 0xff */
 150	default:
 151		seq_printf(seq, "Unknown data format (0x%02x)", serialno[0]);
 152		break;
 153	}
 154
 155	return 0;
 156}
 157
 158/**
 159 *	i2o_get_class_name - 	do i2o class name lookup
 160 *	@class: class number
 161 *
 162 *	Return a descriptive string for an i2o class.
 163 */
 164static const char *i2o_get_class_name(int class)
 165{
 166	int idx = 16;
 167	static char *i2o_class_name[] = {
 168		"Executive",
 169		"Device Driver Module",
 170		"Block Device",
 171		"Tape Device",
 172		"LAN Interface",
 173		"WAN Interface",
 174		"Fibre Channel Port",
 175		"Fibre Channel Device",
 176		"SCSI Device",
 177		"ATE Port",
 178		"ATE Device",
 179		"Floppy Controller",
 180		"Floppy Device",
 181		"Secondary Bus Port",
 182		"Peer Transport Agent",
 183		"Peer Transport",
 184		"Unknown"
 185	};
 186
 187	switch (class & 0xfff) {
 188	case I2O_CLASS_EXECUTIVE:
 189		idx = 0;
 190		break;
 191	case I2O_CLASS_DDM:
 192		idx = 1;
 193		break;
 194	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
 195		idx = 2;
 196		break;
 197	case I2O_CLASS_SEQUENTIAL_STORAGE:
 198		idx = 3;
 199		break;
 200	case I2O_CLASS_LAN:
 201		idx = 4;
 202		break;
 203	case I2O_CLASS_WAN:
 204		idx = 5;
 205		break;
 206	case I2O_CLASS_FIBRE_CHANNEL_PORT:
 207		idx = 6;
 208		break;
 209	case I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL:
 210		idx = 7;
 211		break;
 212	case I2O_CLASS_SCSI_PERIPHERAL:
 213		idx = 8;
 214		break;
 215	case I2O_CLASS_ATE_PORT:
 216		idx = 9;
 217		break;
 218	case I2O_CLASS_ATE_PERIPHERAL:
 219		idx = 10;
 220		break;
 221	case I2O_CLASS_FLOPPY_CONTROLLER:
 222		idx = 11;
 223		break;
 224	case I2O_CLASS_FLOPPY_DEVICE:
 225		idx = 12;
 226		break;
 227	case I2O_CLASS_BUS_ADAPTER:
 228		idx = 13;
 229		break;
 230	case I2O_CLASS_PEER_TRANSPORT_AGENT:
 231		idx = 14;
 232		break;
 233	case I2O_CLASS_PEER_TRANSPORT:
 234		idx = 15;
 235		break;
 236	}
 237
 238	return i2o_class_name[idx];
 239}
 240
 241#define SCSI_TABLE_SIZE	13
 242static char *scsi_devices[] = {
 243	"Direct-Access Read/Write",
 244	"Sequential-Access Storage",
 245	"Printer",
 246	"Processor",
 247	"WORM Device",
 248	"CD-ROM Device",
 249	"Scanner Device",
 250	"Optical Memory Device",
 251	"Medium Changer Device",
 252	"Communications Device",
 253	"Graphics Art Pre-Press Device",
 254	"Graphics Art Pre-Press Device",
 255	"Array Controller Device"
 256};
 257
 258static char *chtostr(char *tmp, u8 *chars, int n)
 259{
 
 260	tmp[0] = 0;
 261	return strncat(tmp, (char *)chars, n);
 262}
 263
 264static int i2o_report_query_status(struct seq_file *seq, int block_status,
 265				   char *group)
 266{
 267	switch (block_status) {
 268	case -ETIMEDOUT:
 269		return seq_printf(seq, "Timeout reading group %s.\n", group);
 270	case -ENOMEM:
 271		return seq_printf(seq, "No free memory to read the table.\n");
 272	case -I2O_PARAMS_STATUS_INVALID_GROUP_ID:
 273		return seq_printf(seq, "Group %s not supported.\n", group);
 274	default:
 275		return seq_printf(seq,
 276				  "Error reading group %s. BlockStatus 0x%02X\n",
 277				  group, -block_status);
 278	}
 279}
 280
 281static char *bus_strings[] = {
 282	"Local Bus",
 283	"ISA",
 284	"EISA",
 285	"PCI",
 286	"PCMCIA",
 287	"NUBUS",
 288	"CARDBUS"
 289};
 290
 291static int i2o_seq_show_hrt(struct seq_file *seq, void *v)
 292{
 293	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 294	i2o_hrt *hrt = (i2o_hrt *) c->hrt.virt;
 295	u32 bus;
 296	int i;
 297
 298	if (hrt->hrt_version) {
 299		seq_printf(seq,
 300			   "HRT table for controller is too new a version.\n");
 301		return 0;
 302	}
 303
 304	seq_printf(seq, "HRT has %d entries of %d bytes each.\n",
 305		   hrt->num_entries, hrt->entry_len << 2);
 306
 307	for (i = 0; i < hrt->num_entries; i++) {
 308		seq_printf(seq, "Entry %d:\n", i);
 309		seq_printf(seq, "   Adapter ID: %0#10x\n",
 310			   hrt->hrt_entry[i].adapter_id);
 311		seq_printf(seq, "   Controlling tid: %0#6x\n",
 312			   hrt->hrt_entry[i].parent_tid);
 313
 314		if (hrt->hrt_entry[i].bus_type != 0x80) {
 315			bus = hrt->hrt_entry[i].bus_type;
 316			seq_printf(seq, "   %s Information\n",
 317				   bus_strings[bus]);
 318
 319			switch (bus) {
 320			case I2O_BUS_LOCAL:
 321				seq_printf(seq, "     IOBase: %0#6x,",
 322					   hrt->hrt_entry[i].bus.local_bus.
 323					   LbBaseIOPort);
 324				seq_printf(seq, " MemoryBase: %0#10x\n",
 325					   hrt->hrt_entry[i].bus.local_bus.
 326					   LbBaseMemoryAddress);
 327				break;
 328
 329			case I2O_BUS_ISA:
 330				seq_printf(seq, "     IOBase: %0#6x,",
 331					   hrt->hrt_entry[i].bus.isa_bus.
 332					   IsaBaseIOPort);
 333				seq_printf(seq, " MemoryBase: %0#10x,",
 334					   hrt->hrt_entry[i].bus.isa_bus.
 335					   IsaBaseMemoryAddress);
 336				seq_printf(seq, " CSN: %0#4x,",
 337					   hrt->hrt_entry[i].bus.isa_bus.CSN);
 338				break;
 339
 340			case I2O_BUS_EISA:
 341				seq_printf(seq, "     IOBase: %0#6x,",
 342					   hrt->hrt_entry[i].bus.eisa_bus.
 343					   EisaBaseIOPort);
 344				seq_printf(seq, " MemoryBase: %0#10x,",
 345					   hrt->hrt_entry[i].bus.eisa_bus.
 346					   EisaBaseMemoryAddress);
 347				seq_printf(seq, " Slot: %0#4x,",
 348					   hrt->hrt_entry[i].bus.eisa_bus.
 349					   EisaSlotNumber);
 350				break;
 351
 352			case I2O_BUS_PCI:
 353				seq_printf(seq, "     Bus: %0#4x",
 354					   hrt->hrt_entry[i].bus.pci_bus.
 355					   PciBusNumber);
 356				seq_printf(seq, " Dev: %0#4x",
 357					   hrt->hrt_entry[i].bus.pci_bus.
 358					   PciDeviceNumber);
 359				seq_printf(seq, " Func: %0#4x",
 360					   hrt->hrt_entry[i].bus.pci_bus.
 361					   PciFunctionNumber);
 362				seq_printf(seq, " Vendor: %0#6x",
 363					   hrt->hrt_entry[i].bus.pci_bus.
 364					   PciVendorID);
 365				seq_printf(seq, " Device: %0#6x\n",
 366					   hrt->hrt_entry[i].bus.pci_bus.
 367					   PciDeviceID);
 368				break;
 369
 370			default:
 371				seq_printf(seq, "      Unsupported Bus Type\n");
 372			}
 373		} else
 374			seq_printf(seq, "   Unknown Bus Type\n");
 375	}
 376
 377	return 0;
 378}
 379
 380static int i2o_seq_show_lct(struct seq_file *seq, void *v)
 381{
 382	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 383	i2o_lct *lct = (i2o_lct *) c->lct;
 384	int entries;
 385	int i;
 386
 387#define BUS_TABLE_SIZE 3
 388	static char *bus_ports[] = {
 389		"Generic Bus",
 390		"SCSI Bus",
 391		"Fibre Channel Bus"
 392	};
 393
 394	entries = (lct->table_size - 3) / 9;
 395
 396	seq_printf(seq, "LCT contains %d %s\n", entries,
 397		   entries == 1 ? "entry" : "entries");
 398	if (lct->boot_tid)
 399		seq_printf(seq, "Boot Device @ ID %d\n", lct->boot_tid);
 400
 401	seq_printf(seq, "Current Change Indicator: %#10x\n", lct->change_ind);
 402
 403	for (i = 0; i < entries; i++) {
 404		seq_printf(seq, "Entry %d\n", i);
 405		seq_printf(seq, "  Class, SubClass  : %s",
 406			   i2o_get_class_name(lct->lct_entry[i].class_id));
 407
 408		/*
 409		 *      Classes which we'll print subclass info for
 410		 */
 411		switch (lct->lct_entry[i].class_id & 0xFFF) {
 412		case I2O_CLASS_RANDOM_BLOCK_STORAGE:
 413			switch (lct->lct_entry[i].sub_class) {
 414			case 0x00:
 415				seq_printf(seq, ", Direct-Access Read/Write");
 416				break;
 417
 418			case 0x04:
 419				seq_printf(seq, ", WORM Drive");
 420				break;
 421
 422			case 0x05:
 423				seq_printf(seq, ", CD-ROM Drive");
 424				break;
 425
 426			case 0x07:
 427				seq_printf(seq, ", Optical Memory Device");
 428				break;
 429
 430			default:
 431				seq_printf(seq, ", Unknown (0x%02x)",
 432					   lct->lct_entry[i].sub_class);
 433				break;
 434			}
 435			break;
 436
 437		case I2O_CLASS_LAN:
 438			switch (lct->lct_entry[i].sub_class & 0xFF) {
 439			case 0x30:
 440				seq_printf(seq, ", Ethernet");
 441				break;
 442
 443			case 0x40:
 444				seq_printf(seq, ", 100base VG");
 445				break;
 446
 447			case 0x50:
 448				seq_printf(seq, ", IEEE 802.5/Token-Ring");
 449				break;
 450
 451			case 0x60:
 452				seq_printf(seq, ", ANSI X3T9.5 FDDI");
 453				break;
 454
 455			case 0x70:
 456				seq_printf(seq, ", Fibre Channel");
 457				break;
 458
 459			default:
 460				seq_printf(seq, ", Unknown Sub-Class (0x%02x)",
 461					   lct->lct_entry[i].sub_class & 0xFF);
 462				break;
 463			}
 464			break;
 465
 466		case I2O_CLASS_SCSI_PERIPHERAL:
 467			if (lct->lct_entry[i].sub_class < SCSI_TABLE_SIZE)
 468				seq_printf(seq, ", %s",
 469					   scsi_devices[lct->lct_entry[i].
 470							sub_class]);
 471			else
 472				seq_printf(seq, ", Unknown Device Type");
 473			break;
 474
 475		case I2O_CLASS_BUS_ADAPTER:
 476			if (lct->lct_entry[i].sub_class < BUS_TABLE_SIZE)
 477				seq_printf(seq, ", %s",
 478					   bus_ports[lct->lct_entry[i].
 479						     sub_class]);
 480			else
 481				seq_printf(seq, ", Unknown Bus Type");
 482			break;
 483		}
 484		seq_printf(seq, "\n");
 485
 486		seq_printf(seq, "  Local TID        : 0x%03x\n",
 487			   lct->lct_entry[i].tid);
 488		seq_printf(seq, "  User TID         : 0x%03x\n",
 489			   lct->lct_entry[i].user_tid);
 490		seq_printf(seq, "  Parent TID       : 0x%03x\n",
 491			   lct->lct_entry[i].parent_tid);
 492		seq_printf(seq, "  Identity Tag     : 0x%x%x%x%x%x%x%x%x\n",
 493			   lct->lct_entry[i].identity_tag[0],
 494			   lct->lct_entry[i].identity_tag[1],
 495			   lct->lct_entry[i].identity_tag[2],
 496			   lct->lct_entry[i].identity_tag[3],
 497			   lct->lct_entry[i].identity_tag[4],
 498			   lct->lct_entry[i].identity_tag[5],
 499			   lct->lct_entry[i].identity_tag[6],
 500			   lct->lct_entry[i].identity_tag[7]);
 501		seq_printf(seq, "  Change Indicator : %0#10x\n",
 502			   lct->lct_entry[i].change_ind);
 503		seq_printf(seq, "  Event Capab Mask : %0#10x\n",
 504			   lct->lct_entry[i].device_flags);
 505	}
 506
 507	return 0;
 508}
 509
 510static int i2o_seq_show_status(struct seq_file *seq, void *v)
 511{
 512	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 513	char prodstr[25];
 514	int version;
 515	i2o_status_block *sb = c->status_block.virt;
 516
 517	i2o_status_get(c);	// reread the status block
 518
 519	seq_printf(seq, "Organization ID        : %0#6x\n", sb->org_id);
 520
 521	version = sb->i2o_version;
 522
 523/* FIXME for Spec 2.0
 524	if (version == 0x02) {
 525		seq_printf(seq, "Lowest I2O version supported: ");
 526		switch(workspace[2]) {
 527			case 0x00:
 528				seq_printf(seq, "1.0\n");
 529				break;
 530			case 0x01:
 531				seq_printf(seq, "1.5\n");
 532				break;
 533			case 0x02:
 534				seq_printf(seq, "2.0\n");
 535				break;
 536		}
 537
 538		seq_printf(seq, "Highest I2O version supported: ");
 539		switch(workspace[3]) {
 540			case 0x00:
 541				seq_printf(seq, "1.0\n");
 542				break;
 543			case 0x01:
 544				seq_printf(seq, "1.5\n");
 545				break;
 546			case 0x02:
 547				seq_printf(seq, "2.0\n");
 548				break;
 549		}
 550	}
 551*/
 552	seq_printf(seq, "IOP ID                 : %0#5x\n", sb->iop_id);
 553	seq_printf(seq, "Host Unit ID           : %0#6x\n", sb->host_unit_id);
 554	seq_printf(seq, "Segment Number         : %0#5x\n", sb->segment_number);
 555
 556	seq_printf(seq, "I2O version            : ");
 557	switch (version) {
 558	case 0x00:
 559		seq_printf(seq, "1.0\n");
 560		break;
 561	case 0x01:
 562		seq_printf(seq, "1.5\n");
 563		break;
 564	case 0x02:
 565		seq_printf(seq, "2.0\n");
 566		break;
 567	default:
 568		seq_printf(seq, "Unknown version\n");
 569	}
 570
 571	seq_printf(seq, "IOP State              : ");
 572	switch (sb->iop_state) {
 573	case 0x01:
 574		seq_printf(seq, "INIT\n");
 575		break;
 576
 577	case 0x02:
 578		seq_printf(seq, "RESET\n");
 579		break;
 580
 581	case 0x04:
 582		seq_printf(seq, "HOLD\n");
 583		break;
 584
 585	case 0x05:
 586		seq_printf(seq, "READY\n");
 587		break;
 588
 589	case 0x08:
 590		seq_printf(seq, "OPERATIONAL\n");
 591		break;
 592
 593	case 0x10:
 594		seq_printf(seq, "FAILED\n");
 595		break;
 596
 597	case 0x11:
 598		seq_printf(seq, "FAULTED\n");
 599		break;
 600
 601	default:
 602		seq_printf(seq, "Unknown\n");
 603		break;
 604	}
 605
 606	seq_printf(seq, "Messenger Type         : ");
 607	switch (sb->msg_type) {
 608	case 0x00:
 609		seq_printf(seq, "Memory mapped\n");
 610		break;
 611	case 0x01:
 612		seq_printf(seq, "Memory mapped only\n");
 613		break;
 614	case 0x02:
 615		seq_printf(seq, "Remote only\n");
 616		break;
 617	case 0x03:
 618		seq_printf(seq, "Memory mapped and remote\n");
 619		break;
 620	default:
 621		seq_printf(seq, "Unknown\n");
 622	}
 623
 624	seq_printf(seq, "Inbound Frame Size     : %d bytes\n",
 625		   sb->inbound_frame_size << 2);
 626	seq_printf(seq, "Max Inbound Frames     : %d\n",
 627		   sb->max_inbound_frames);
 628	seq_printf(seq, "Current Inbound Frames : %d\n",
 629		   sb->cur_inbound_frames);
 630	seq_printf(seq, "Max Outbound Frames    : %d\n",
 631		   sb->max_outbound_frames);
 632
 633	/* Spec doesn't say if NULL terminated or not... */
 634	memcpy(prodstr, sb->product_id, 24);
 635	prodstr[24] = '\0';
 636	seq_printf(seq, "Product ID             : %s\n", prodstr);
 637	seq_printf(seq, "Expected LCT Size      : %d bytes\n",
 638		   sb->expected_lct_size);
 639
 640	seq_printf(seq, "IOP Capabilities\n");
 641	seq_printf(seq, "    Context Field Size Support : ");
 642	switch (sb->iop_capabilities & 0x0000003) {
 643	case 0:
 644		seq_printf(seq, "Supports only 32-bit context fields\n");
 645		break;
 646	case 1:
 647		seq_printf(seq, "Supports only 64-bit context fields\n");
 648		break;
 649	case 2:
 650		seq_printf(seq, "Supports 32-bit and 64-bit context fields, "
 651			   "but not concurrently\n");
 652		break;
 653	case 3:
 654		seq_printf(seq, "Supports 32-bit and 64-bit context fields "
 655			   "concurrently\n");
 656		break;
 657	default:
 658		seq_printf(seq, "0x%08x\n", sb->iop_capabilities);
 659	}
 660	seq_printf(seq, "    Current Context Field Size : ");
 661	switch (sb->iop_capabilities & 0x0000000C) {
 662	case 0:
 663		seq_printf(seq, "not configured\n");
 664		break;
 665	case 4:
 666		seq_printf(seq, "Supports only 32-bit context fields\n");
 667		break;
 668	case 8:
 669		seq_printf(seq, "Supports only 64-bit context fields\n");
 670		break;
 671	case 12:
 672		seq_printf(seq, "Supports both 32-bit or 64-bit context fields "
 673			   "concurrently\n");
 674		break;
 675	default:
 676		seq_printf(seq, "\n");
 677	}
 678	seq_printf(seq, "    Inbound Peer Support       : %s\n",
 679		   (sb->
 680		    iop_capabilities & 0x00000010) ? "Supported" :
 681		   "Not supported");
 682	seq_printf(seq, "    Outbound Peer Support      : %s\n",
 683		   (sb->
 684		    iop_capabilities & 0x00000020) ? "Supported" :
 685		   "Not supported");
 686	seq_printf(seq, "    Peer to Peer Support       : %s\n",
 687		   (sb->
 688		    iop_capabilities & 0x00000040) ? "Supported" :
 689		   "Not supported");
 690
 691	seq_printf(seq, "Desired private memory size   : %d kB\n",
 692		   sb->desired_mem_size >> 10);
 693	seq_printf(seq, "Allocated private memory size : %d kB\n",
 694		   sb->current_mem_size >> 10);
 695	seq_printf(seq, "Private memory base address   : %0#10x\n",
 696		   sb->current_mem_base);
 697	seq_printf(seq, "Desired private I/O size      : %d kB\n",
 698		   sb->desired_io_size >> 10);
 699	seq_printf(seq, "Allocated private I/O size    : %d kB\n",
 700		   sb->current_io_size >> 10);
 701	seq_printf(seq, "Private I/O base address      : %0#10x\n",
 702		   sb->current_io_base);
 703
 704	return 0;
 705}
 706
 707static int i2o_seq_show_hw(struct seq_file *seq, void *v)
 708{
 709	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 710	static u32 work32[5];
 711	static u8 *work8 = (u8 *) work32;
 712	static u16 *work16 = (u16 *) work32;
 713	int token;
 714	u32 hwcap;
 715
 716	static char *cpu_table[] = {
 717		"Intel 80960 series",
 718		"AMD2900 series",
 719		"Motorola 68000 series",
 720		"ARM series",
 721		"MIPS series",
 722		"Sparc series",
 723		"PowerPC series",
 724		"Intel x86 series"
 725	};
 726
 727	token =
 728	    i2o_parm_field_get(c->exec, 0x0000, -1, &work32, sizeof(work32));
 729
 730	if (token < 0) {
 731		i2o_report_query_status(seq, token, "0x0000 IOP Hardware");
 732		return 0;
 733	}
 734
 735	seq_printf(seq, "I2O Vendor ID    : %0#6x\n", work16[0]);
 736	seq_printf(seq, "Product ID       : %0#6x\n", work16[1]);
 737	seq_printf(seq, "CPU              : ");
 738	if (work8[16] > 8)
 739		seq_printf(seq, "Unknown\n");
 740	else
 741		seq_printf(seq, "%s\n", cpu_table[work8[16]]);
 742	/* Anyone using ProcessorVersion? */
 743
 744	seq_printf(seq, "RAM              : %dkB\n", work32[1] >> 10);
 745	seq_printf(seq, "Non-Volatile Mem : %dkB\n", work32[2] >> 10);
 746
 747	hwcap = work32[3];
 748	seq_printf(seq, "Capabilities : 0x%08x\n", hwcap);
 749	seq_printf(seq, "   [%s] Self booting\n",
 750		   (hwcap & 0x00000001) ? "+" : "-");
 751	seq_printf(seq, "   [%s] Upgradable IRTOS\n",
 752		   (hwcap & 0x00000002) ? "+" : "-");
 753	seq_printf(seq, "   [%s] Supports downloading DDMs\n",
 754		   (hwcap & 0x00000004) ? "+" : "-");
 755	seq_printf(seq, "   [%s] Supports installing DDMs\n",
 756		   (hwcap & 0x00000008) ? "+" : "-");
 757	seq_printf(seq, "   [%s] Battery-backed RAM\n",
 758		   (hwcap & 0x00000010) ? "+" : "-");
 759
 760	return 0;
 761}
 762
 763/* Executive group 0003h - Executing DDM List (table) */
 764static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v)
 765{
 766	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 767	int token;
 768	int i;
 769
 770	typedef struct _i2o_exec_execute_ddm_table {
 771		u16 ddm_tid;
 772		u8 module_type;
 773		u8 reserved;
 774		u16 i2o_vendor_id;
 775		u16 module_id;
 776		u8 module_name_version[28];
 777		u32 data_size;
 778		u32 code_size;
 779	} i2o_exec_execute_ddm_table;
 780
 781	struct {
 782		u16 result_count;
 783		u16 pad;
 784		u16 block_size;
 785		u8 block_status;
 786		u8 error_info_size;
 787		u16 row_count;
 788		u16 more_flag;
 789		i2o_exec_execute_ddm_table ddm_table[I2O_MAX_MODULES];
 790	} *result;
 791
 792	i2o_exec_execute_ddm_table ddm_table;
 793	char tmp[28 + 1];
 794
 795	result = kmalloc(sizeof(*result), GFP_KERNEL);
 796	if (!result)
 797		return -ENOMEM;
 798
 799	token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0003, -1,
 800				   NULL, 0, result, sizeof(*result));
 801
 802	if (token < 0) {
 803		i2o_report_query_status(seq, token,
 804					"0x0003 Executing DDM List");
 805		goto out;
 806	}
 807
 808	seq_printf(seq,
 809		   "Tid   Module_type     Vendor Mod_id  Module_name             Vrs  Data_size Code_size\n");
 810	ddm_table = result->ddm_table[0];
 811
 812	for (i = 0; i < result->row_count; ddm_table = result->ddm_table[++i]) {
 813		seq_printf(seq, "0x%03x ", ddm_table.ddm_tid & 0xFFF);
 814
 815		switch (ddm_table.module_type) {
 816		case 0x01:
 817			seq_printf(seq, "Downloaded DDM  ");
 818			break;
 819		case 0x22:
 820			seq_printf(seq, "Embedded DDM    ");
 821			break;
 822		default:
 823			seq_printf(seq, "                ");
 824		}
 825
 826		seq_printf(seq, "%-#7x", ddm_table.i2o_vendor_id);
 827		seq_printf(seq, "%-#8x", ddm_table.module_id);
 828		seq_printf(seq, "%-29s",
 829			   chtostr(tmp, ddm_table.module_name_version, 28));
 830		seq_printf(seq, "%9d  ", ddm_table.data_size);
 831		seq_printf(seq, "%8d", ddm_table.code_size);
 832
 833		seq_printf(seq, "\n");
 834	}
 835      out:
 836	kfree(result);
 837	return 0;
 838}
 839
 840/* Executive group 0004h - Driver Store (scalar) */
 841static int i2o_seq_show_driver_store(struct seq_file *seq, void *v)
 842{
 843	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 844	u32 work32[8];
 845	int token;
 846
 847	token =
 848	    i2o_parm_field_get(c->exec, 0x0004, -1, &work32, sizeof(work32));
 849	if (token < 0) {
 850		i2o_report_query_status(seq, token, "0x0004 Driver Store");
 851		return 0;
 852	}
 853
 854	seq_printf(seq, "Module limit  : %d\n"
 855		   "Module count  : %d\n"
 856		   "Current space : %d kB\n"
 857		   "Free space    : %d kB\n",
 858		   work32[0], work32[1], work32[2] >> 10, work32[3] >> 10);
 859
 860	return 0;
 861}
 862
 863/* Executive group 0005h - Driver Store Table (table) */
 864static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v)
 865{
 866	typedef struct _i2o_driver_store {
 867		u16 stored_ddm_index;
 868		u8 module_type;
 869		u8 reserved;
 870		u16 i2o_vendor_id;
 871		u16 module_id;
 872		u8 module_name_version[28];
 873		u8 date[8];
 874		u32 module_size;
 875		u32 mpb_size;
 876		u32 module_flags;
 877	} i2o_driver_store_table;
 878
 879	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 880	int token;
 881	int i;
 882
 883	typedef struct {
 884		u16 result_count;
 885		u16 pad;
 886		u16 block_size;
 887		u8 block_status;
 888		u8 error_info_size;
 889		u16 row_count;
 890		u16 more_flag;
 891		i2o_driver_store_table dst[I2O_MAX_MODULES];
 892	} i2o_driver_result_table;
 893
 894	i2o_driver_result_table *result;
 895	i2o_driver_store_table *dst;
 896	char tmp[28 + 1];
 897
 898	result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL);
 899	if (result == NULL)
 900		return -ENOMEM;
 901
 902	token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0005, -1,
 903				   NULL, 0, result, sizeof(*result));
 904
 905	if (token < 0) {
 906		i2o_report_query_status(seq, token,
 907					"0x0005 DRIVER STORE TABLE");
 908		kfree(result);
 909		return 0;
 910	}
 911
 912	seq_printf(seq,
 913		   "#  Module_type     Vendor Mod_id  Module_name             Vrs"
 914		   "Date     Mod_size Par_size Flags\n");
 915	for (i = 0, dst = &result->dst[0]; i < result->row_count;
 916	     dst = &result->dst[++i]) {
 917		seq_printf(seq, "%-3d", dst->stored_ddm_index);
 918		switch (dst->module_type) {
 919		case 0x01:
 920			seq_printf(seq, "Downloaded DDM  ");
 921			break;
 922		case 0x22:
 923			seq_printf(seq, "Embedded DDM    ");
 924			break;
 925		default:
 926			seq_printf(seq, "                ");
 927		}
 928
 929		seq_printf(seq, "%-#7x", dst->i2o_vendor_id);
 930		seq_printf(seq, "%-#8x", dst->module_id);
 931		seq_printf(seq, "%-29s",
 932			   chtostr(tmp, dst->module_name_version, 28));
 933		seq_printf(seq, "%-9s", chtostr(tmp, dst->date, 8));
 934		seq_printf(seq, "%8d ", dst->module_size);
 935		seq_printf(seq, "%8d ", dst->mpb_size);
 936		seq_printf(seq, "0x%04x", dst->module_flags);
 937		seq_printf(seq, "\n");
 938	}
 939
 940	kfree(result);
 941	return 0;
 942}
 943
 944/* Generic group F000h - Params Descriptor (table) */
 945static int i2o_seq_show_groups(struct seq_file *seq, void *v)
 946{
 947	struct i2o_device *d = (struct i2o_device *)seq->private;
 948	int token;
 949	int i;
 950	u8 properties;
 951
 952	typedef struct _i2o_group_info {
 953		u16 group_number;
 954		u16 field_count;
 955		u16 row_count;
 956		u8 properties;
 957		u8 reserved;
 958	} i2o_group_info;
 959
 960	struct {
 961		u16 result_count;
 962		u16 pad;
 963		u16 block_size;
 964		u8 block_status;
 965		u8 error_info_size;
 966		u16 row_count;
 967		u16 more_flag;
 968		i2o_group_info group[256];
 969	} *result;
 970
 971	result = kmalloc(sizeof(*result), GFP_KERNEL);
 972	if (!result)
 973		return -ENOMEM;
 974
 975	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF000, -1, NULL, 0,
 976				   result, sizeof(*result));
 977
 978	if (token < 0) {
 979		i2o_report_query_status(seq, token, "0xF000 Params Descriptor");
 980		goto out;
 981	}
 982
 983	seq_printf(seq,
 984		   "#  Group   FieldCount RowCount Type   Add Del Clear\n");
 985
 986	for (i = 0; i < result->row_count; i++) {
 987		seq_printf(seq, "%-3d", i);
 988		seq_printf(seq, "0x%04X ", result->group[i].group_number);
 989		seq_printf(seq, "%10d ", result->group[i].field_count);
 990		seq_printf(seq, "%8d ", result->group[i].row_count);
 991
 992		properties = result->group[i].properties;
 993		if (properties & 0x1)
 994			seq_printf(seq, "Table  ");
 995		else
 996			seq_printf(seq, "Scalar ");
 997		if (properties & 0x2)
 998			seq_printf(seq, " + ");
 999		else
1000			seq_printf(seq, " - ");
1001		if (properties & 0x4)
1002			seq_printf(seq, "  + ");
1003		else
1004			seq_printf(seq, "  - ");
1005		if (properties & 0x8)
1006			seq_printf(seq, "  + ");
1007		else
1008			seq_printf(seq, "  - ");
1009
1010		seq_printf(seq, "\n");
1011	}
1012
1013	if (result->more_flag)
1014		seq_printf(seq, "There is more...\n");
1015      out:
1016	kfree(result);
1017	return 0;
1018}
1019
1020/* Generic group F001h - Physical Device Table (table) */
1021static int i2o_seq_show_phys_device(struct seq_file *seq, void *v)
1022{
1023	struct i2o_device *d = (struct i2o_device *)seq->private;
1024	int token;
1025	int i;
1026
1027	struct {
1028		u16 result_count;
1029		u16 pad;
1030		u16 block_size;
1031		u8 block_status;
1032		u8 error_info_size;
1033		u16 row_count;
1034		u16 more_flag;
1035		u32 adapter_id[64];
1036	} result;
1037
1038	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF001, -1, NULL, 0,
1039				   &result, sizeof(result));
1040
1041	if (token < 0) {
1042		i2o_report_query_status(seq, token,
1043					"0xF001 Physical Device Table");
1044		return 0;
1045	}
1046
1047	if (result.row_count)
1048		seq_printf(seq, "#  AdapterId\n");
1049
1050	for (i = 0; i < result.row_count; i++) {
1051		seq_printf(seq, "%-2d", i);
1052		seq_printf(seq, "%#7x\n", result.adapter_id[i]);
1053	}
1054
1055	if (result.more_flag)
1056		seq_printf(seq, "There is more...\n");
1057
1058	return 0;
1059}
1060
1061/* Generic group F002h - Claimed Table (table) */
1062static int i2o_seq_show_claimed(struct seq_file *seq, void *v)
1063{
1064	struct i2o_device *d = (struct i2o_device *)seq->private;
1065	int token;
1066	int i;
1067
1068	struct {
1069		u16 result_count;
1070		u16 pad;
1071		u16 block_size;
1072		u8 block_status;
1073		u8 error_info_size;
1074		u16 row_count;
1075		u16 more_flag;
1076		u16 claimed_tid[64];
1077	} result;
1078
1079	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF002, -1, NULL, 0,
1080				   &result, sizeof(result));
1081
1082	if (token < 0) {
1083		i2o_report_query_status(seq, token, "0xF002 Claimed Table");
1084		return 0;
1085	}
1086
1087	if (result.row_count)
1088		seq_printf(seq, "#  ClaimedTid\n");
1089
1090	for (i = 0; i < result.row_count; i++) {
1091		seq_printf(seq, "%-2d", i);
1092		seq_printf(seq, "%#7x\n", result.claimed_tid[i]);
1093	}
1094
1095	if (result.more_flag)
1096		seq_printf(seq, "There is more...\n");
1097
1098	return 0;
1099}
1100
1101/* Generic group F003h - User Table (table) */
1102static int i2o_seq_show_users(struct seq_file *seq, void *v)
1103{
1104	struct i2o_device *d = (struct i2o_device *)seq->private;
1105	int token;
1106	int i;
1107
1108	typedef struct _i2o_user_table {
1109		u16 instance;
1110		u16 user_tid;
1111		u8 claim_type;
1112		u8 reserved1;
1113		u16 reserved2;
1114	} i2o_user_table;
1115
1116	struct {
1117		u16 result_count;
1118		u16 pad;
1119		u16 block_size;
1120		u8 block_status;
1121		u8 error_info_size;
1122		u16 row_count;
1123		u16 more_flag;
1124		i2o_user_table user[64];
1125	} *result;
1126
1127	result = kmalloc(sizeof(*result), GFP_KERNEL);
1128	if (!result)
1129		return -ENOMEM;
1130
1131	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF003, -1, NULL, 0,
1132				   result, sizeof(*result));
1133
1134	if (token < 0) {
1135		i2o_report_query_status(seq, token, "0xF003 User Table");
1136		goto out;
1137	}
1138
1139	seq_printf(seq, "#  Instance UserTid ClaimType\n");
1140
1141	for (i = 0; i < result->row_count; i++) {
1142		seq_printf(seq, "%-3d", i);
1143		seq_printf(seq, "%#8x ", result->user[i].instance);
1144		seq_printf(seq, "%#7x ", result->user[i].user_tid);
1145		seq_printf(seq, "%#9x\n", result->user[i].claim_type);
1146	}
1147
1148	if (result->more_flag)
1149		seq_printf(seq, "There is more...\n");
1150      out:
1151	kfree(result);
1152	return 0;
1153}
1154
1155/* Generic group F005h - Private message extensions (table) (optional) */
1156static int i2o_seq_show_priv_msgs(struct seq_file *seq, void *v)
1157{
1158	struct i2o_device *d = (struct i2o_device *)seq->private;
1159	int token;
1160	int i;
1161
1162	typedef struct _i2o_private {
1163		u16 ext_instance;
1164		u16 organization_id;
1165		u16 x_function_code;
1166	} i2o_private;
1167
1168	struct {
1169		u16 result_count;
1170		u16 pad;
1171		u16 block_size;
1172		u8 block_status;
1173		u8 error_info_size;
1174		u16 row_count;
1175		u16 more_flag;
1176		i2o_private extension[64];
1177	} result;
1178
1179	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF000, -1, NULL, 0,
1180				   &result, sizeof(result));
1181
1182	if (token < 0) {
1183		i2o_report_query_status(seq, token,
1184					"0xF005 Private Message Extensions (optional)");
1185		return 0;
1186	}
1187
1188	seq_printf(seq, "Instance#  OrgId  FunctionCode\n");
1189
1190	for (i = 0; i < result.row_count; i++) {
1191		seq_printf(seq, "%0#9x ", result.extension[i].ext_instance);
1192		seq_printf(seq, "%0#6x ", result.extension[i].organization_id);
1193		seq_printf(seq, "%0#6x", result.extension[i].x_function_code);
1194
1195		seq_printf(seq, "\n");
1196	}
1197
1198	if (result.more_flag)
1199		seq_printf(seq, "There is more...\n");
1200
1201	return 0;
1202}
1203
1204/* Generic group F006h - Authorized User Table (table) */
1205static int i2o_seq_show_authorized_users(struct seq_file *seq, void *v)
1206{
1207	struct i2o_device *d = (struct i2o_device *)seq->private;
1208	int token;
1209	int i;
1210
1211	struct {
1212		u16 result_count;
1213		u16 pad;
1214		u16 block_size;
1215		u8 block_status;
1216		u8 error_info_size;
1217		u16 row_count;
1218		u16 more_flag;
1219		u32 alternate_tid[64];
1220	} result;
1221
1222	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF006, -1, NULL, 0,
1223				   &result, sizeof(result));
1224
1225	if (token < 0) {
1226		i2o_report_query_status(seq, token,
1227					"0xF006 Autohorized User Table");
1228		return 0;
1229	}
1230
1231	if (result.row_count)
1232		seq_printf(seq, "#  AlternateTid\n");
1233
1234	for (i = 0; i < result.row_count; i++) {
1235		seq_printf(seq, "%-2d", i);
1236		seq_printf(seq, "%#7x ", result.alternate_tid[i]);
1237	}
1238
1239	if (result.more_flag)
1240		seq_printf(seq, "There is more...\n");
1241
1242	return 0;
1243}
1244
1245/* Generic group F100h - Device Identity (scalar) */
1246static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v)
1247{
1248	struct i2o_device *d = (struct i2o_device *)seq->private;
1249	static u32 work32[128];	// allow for "stuff" + up to 256 byte (max) serial number
1250	// == (allow) 512d bytes (max)
1251	static u16 *work16 = (u16 *) work32;
1252	int token;
1253	char tmp[16 + 1];
1254
1255	token = i2o_parm_field_get(d, 0xF100, -1, &work32, sizeof(work32));
1256
1257	if (token < 0) {
1258		i2o_report_query_status(seq, token, "0xF100 Device Identity");
1259		return 0;
1260	}
1261
1262	seq_printf(seq, "Device Class  : %s\n", i2o_get_class_name(work16[0]));
1263	seq_printf(seq, "Owner TID     : %0#5x\n", work16[2]);
1264	seq_printf(seq, "Parent TID    : %0#5x\n", work16[3]);
1265	seq_printf(seq, "Vendor info   : %s\n",
1266		   chtostr(tmp, (u8 *) (work32 + 2), 16));
1267	seq_printf(seq, "Product info  : %s\n",
1268		   chtostr(tmp, (u8 *) (work32 + 6), 16));
1269	seq_printf(seq, "Description   : %s\n",
1270		   chtostr(tmp, (u8 *) (work32 + 10), 16));
1271	seq_printf(seq, "Product rev.  : %s\n",
1272		   chtostr(tmp, (u8 *) (work32 + 14), 8));
1273
1274	seq_printf(seq, "Serial number : ");
1275	print_serial_number(seq, (u8 *) (work32 + 16),
1276			    /* allow for SNLen plus
1277			     * possible trailing '\0'
1278			     */
1279			    sizeof(work32) - (16 * sizeof(u32)) - 2);
1280	seq_printf(seq, "\n");
1281
1282	return 0;
1283}
1284
1285static int i2o_seq_show_dev_name(struct seq_file *seq, void *v)
1286{
1287	struct i2o_device *d = (struct i2o_device *)seq->private;
1288
1289	seq_printf(seq, "%s\n", dev_name(&d->device));
1290
1291	return 0;
1292}
1293
1294/* Generic group F101h - DDM Identity (scalar) */
1295static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v)
1296{
1297	struct i2o_device *d = (struct i2o_device *)seq->private;
1298	int token;
1299
1300	struct {
1301		u16 ddm_tid;
1302		u8 module_name[24];
1303		u8 module_rev[8];
1304		u8 sn_format;
1305		u8 serial_number[12];
1306		u8 pad[256];	// allow up to 256 byte (max) serial number
1307	} result;
1308
1309	char tmp[24 + 1];
1310
1311	token = i2o_parm_field_get(d, 0xF101, -1, &result, sizeof(result));
1312
1313	if (token < 0) {
1314		i2o_report_query_status(seq, token, "0xF101 DDM Identity");
1315		return 0;
1316	}
1317
1318	seq_printf(seq, "Registering DDM TID : 0x%03x\n", result.ddm_tid);
1319	seq_printf(seq, "Module name         : %s\n",
1320		   chtostr(tmp, result.module_name, 24));
1321	seq_printf(seq, "Module revision     : %s\n",
1322		   chtostr(tmp, result.module_rev, 8));
1323
1324	seq_printf(seq, "Serial number       : ");
1325	print_serial_number(seq, result.serial_number, sizeof(result) - 36);
1326	/* allow for SNLen plus possible trailing '\0' */
1327
1328	seq_printf(seq, "\n");
1329
1330	return 0;
1331}
1332
1333/* Generic group F102h - User Information (scalar) */
1334static int i2o_seq_show_uinfo(struct seq_file *seq, void *v)
1335{
1336	struct i2o_device *d = (struct i2o_device *)seq->private;
1337	int token;
1338
1339	struct {
1340		u8 device_name[64];
1341		u8 service_name[64];
1342		u8 physical_location[64];
1343		u8 instance_number[4];
1344	} result;
1345
1346	char tmp[64 + 1];
1347
1348	token = i2o_parm_field_get(d, 0xF102, -1, &result, sizeof(result));
1349
1350	if (token < 0) {
1351		i2o_report_query_status(seq, token, "0xF102 User Information");
1352		return 0;
1353	}
1354
1355	seq_printf(seq, "Device name     : %s\n",
1356		   chtostr(tmp, result.device_name, 64));
1357	seq_printf(seq, "Service name    : %s\n",
1358		   chtostr(tmp, result.service_name, 64));
1359	seq_printf(seq, "Physical name   : %s\n",
1360		   chtostr(tmp, result.physical_location, 64));
1361	seq_printf(seq, "Instance number : %s\n",
1362		   chtostr(tmp, result.instance_number, 4));
1363
1364	return 0;
1365}
1366
1367/* Generic group F103h - SGL Operating Limits (scalar) */
1368static int i2o_seq_show_sgl_limits(struct seq_file *seq, void *v)
1369{
1370	struct i2o_device *d = (struct i2o_device *)seq->private;
1371	static u32 work32[12];
1372	static u16 *work16 = (u16 *) work32;
1373	static u8 *work8 = (u8 *) work32;
1374	int token;
1375
1376	token = i2o_parm_field_get(d, 0xF103, -1, &work32, sizeof(work32));
1377
1378	if (token < 0) {
1379		i2o_report_query_status(seq, token,
1380					"0xF103 SGL Operating Limits");
1381		return 0;
1382	}
1383
1384	seq_printf(seq, "SGL chain size        : %d\n", work32[0]);
1385	seq_printf(seq, "Max SGL chain size    : %d\n", work32[1]);
1386	seq_printf(seq, "SGL chain size target : %d\n", work32[2]);
1387	seq_printf(seq, "SGL frag count        : %d\n", work16[6]);
1388	seq_printf(seq, "Max SGL frag count    : %d\n", work16[7]);
1389	seq_printf(seq, "SGL frag count target : %d\n", work16[8]);
1390
1391/* FIXME
1392	if (d->i2oversion == 0x02)
1393	{
1394*/
1395	seq_printf(seq, "SGL data alignment    : %d\n", work16[8]);
1396	seq_printf(seq, "SGL addr limit        : %d\n", work8[20]);
1397	seq_printf(seq, "SGL addr sizes supported : ");
1398	if (work8[21] & 0x01)
1399		seq_printf(seq, "32 bit ");
1400	if (work8[21] & 0x02)
1401		seq_printf(seq, "64 bit ");
1402	if (work8[21] & 0x04)
1403		seq_printf(seq, "96 bit ");
1404	if (work8[21] & 0x08)
1405		seq_printf(seq, "128 bit ");
1406	seq_printf(seq, "\n");
1407/*
1408	}
1409*/
1410
1411	return 0;
1412}
1413
1414/* Generic group F200h - Sensors (scalar) */
1415static int i2o_seq_show_sensors(struct seq_file *seq, void *v)
1416{
1417	struct i2o_device *d = (struct i2o_device *)seq->private;
1418	int token;
1419
1420	struct {
1421		u16 sensor_instance;
1422		u8 component;
1423		u16 component_instance;
1424		u8 sensor_class;
1425		u8 sensor_type;
1426		u8 scaling_exponent;
1427		u32 actual_reading;
1428		u32 minimum_reading;
1429		u32 low2lowcat_treshold;
1430		u32 lowcat2low_treshold;
1431		u32 lowwarn2low_treshold;
1432		u32 low2lowwarn_treshold;
1433		u32 norm2lowwarn_treshold;
1434		u32 lowwarn2norm_treshold;
1435		u32 nominal_reading;
1436		u32 hiwarn2norm_treshold;
1437		u32 norm2hiwarn_treshold;
1438		u32 high2hiwarn_treshold;
1439		u32 hiwarn2high_treshold;
1440		u32 hicat2high_treshold;
1441		u32 hi2hicat_treshold;
1442		u32 maximum_reading;
1443		u8 sensor_state;
1444		u16 event_enable;
1445	} result;
1446
1447	token = i2o_parm_field_get(d, 0xF200, -1, &result, sizeof(result));
1448
1449	if (token < 0) {
1450		i2o_report_query_status(seq, token,
1451					"0xF200 Sensors (optional)");
1452		return 0;
1453	}
1454
1455	seq_printf(seq, "Sensor instance       : %d\n", result.sensor_instance);
1456
1457	seq_printf(seq, "Component             : %d = ", result.component);
1458	switch (result.component) {
1459	case 0:
1460		seq_printf(seq, "Other");
1461		break;
1462	case 1:
1463		seq_printf(seq, "Planar logic Board");
1464		break;
1465	case 2:
1466		seq_printf(seq, "CPU");
1467		break;
1468	case 3:
1469		seq_printf(seq, "Chassis");
1470		break;
1471	case 4:
1472		seq_printf(seq, "Power Supply");
1473		break;
1474	case 5:
1475		seq_printf(seq, "Storage");
1476		break;
1477	case 6:
1478		seq_printf(seq, "External");
1479		break;
1480	}
1481	seq_printf(seq, "\n");
1482
1483	seq_printf(seq, "Component instance    : %d\n",
1484		   result.component_instance);
1485	seq_printf(seq, "Sensor class          : %s\n",
1486		   result.sensor_class ? "Analog" : "Digital");
1487
1488	seq_printf(seq, "Sensor type           : %d = ", result.sensor_type);
1489	switch (result.sensor_type) {
1490	case 0:
1491		seq_printf(seq, "Other\n");
1492		break;
1493	case 1:
1494		seq_printf(seq, "Thermal\n");
1495		break;
1496	case 2:
1497		seq_printf(seq, "DC voltage (DC volts)\n");
1498		break;
1499	case 3:
1500		seq_printf(seq, "AC voltage (AC volts)\n");
1501		break;
1502	case 4:
1503		seq_printf(seq, "DC current (DC amps)\n");
1504		break;
1505	case 5:
1506		seq_printf(seq, "AC current (AC volts)\n");
1507		break;
1508	case 6:
1509		seq_printf(seq, "Door open\n");
1510		break;
1511	case 7:
1512		seq_printf(seq, "Fan operational\n");
1513		break;
1514	}
1515
1516	seq_printf(seq, "Scaling exponent      : %d\n",
1517		   result.scaling_exponent);
1518	seq_printf(seq, "Actual reading        : %d\n", result.actual_reading);
1519	seq_printf(seq, "Minimum reading       : %d\n", result.minimum_reading);
1520	seq_printf(seq, "Low2LowCat treshold   : %d\n",
1521		   result.low2lowcat_treshold);
1522	seq_printf(seq, "LowCat2Low treshold   : %d\n",
1523		   result.lowcat2low_treshold);
1524	seq_printf(seq, "LowWarn2Low treshold  : %d\n",
1525		   result.lowwarn2low_treshold);
1526	seq_printf(seq, "Low2LowWarn treshold  : %d\n",
1527		   result.low2lowwarn_treshold);
1528	seq_printf(seq, "Norm2LowWarn treshold : %d\n",
1529		   result.norm2lowwarn_treshold);
1530	seq_printf(seq, "LowWarn2Norm treshold : %d\n",
1531		   result.lowwarn2norm_treshold);
1532	seq_printf(seq, "Nominal reading       : %d\n", result.nominal_reading);
1533	seq_printf(seq, "HiWarn2Norm treshold  : %d\n",
1534		   result.hiwarn2norm_treshold);
1535	seq_printf(seq, "Norm2HiWarn treshold  : %d\n",
1536		   result.norm2hiwarn_treshold);
1537	seq_printf(seq, "High2HiWarn treshold  : %d\n",
1538		   result.high2hiwarn_treshold);
1539	seq_printf(seq, "HiWarn2High treshold  : %d\n",
1540		   result.hiwarn2high_treshold);
1541	seq_printf(seq, "HiCat2High treshold   : %d\n",
1542		   result.hicat2high_treshold);
1543	seq_printf(seq, "High2HiCat treshold   : %d\n",
1544		   result.hi2hicat_treshold);
1545	seq_printf(seq, "Maximum reading       : %d\n", result.maximum_reading);
1546
1547	seq_printf(seq, "Sensor state          : %d = ", result.sensor_state);
1548	switch (result.sensor_state) {
1549	case 0:
1550		seq_printf(seq, "Normal\n");
1551		break;
1552	case 1:
1553		seq_printf(seq, "Abnormal\n");
1554		break;
1555	case 2:
1556		seq_printf(seq, "Unknown\n");
1557		break;
1558	case 3:
1559		seq_printf(seq, "Low Catastrophic (LoCat)\n");
1560		break;
1561	case 4:
1562		seq_printf(seq, "Low (Low)\n");
1563		break;
1564	case 5:
1565		seq_printf(seq, "Low Warning (LoWarn)\n");
1566		break;
1567	case 6:
1568		seq_printf(seq, "High Warning (HiWarn)\n");
1569		break;
1570	case 7:
1571		seq_printf(seq, "High (High)\n");
1572		break;
1573	case 8:
1574		seq_printf(seq, "High Catastrophic (HiCat)\n");
1575		break;
1576	}
1577
1578	seq_printf(seq, "Event_enable : 0x%02X\n", result.event_enable);
1579	seq_printf(seq, "    [%s] Operational state change. \n",
1580		   (result.event_enable & 0x01) ? "+" : "-");
1581	seq_printf(seq, "    [%s] Low catastrophic. \n",
1582		   (result.event_enable & 0x02) ? "+" : "-");
1583	seq_printf(seq, "    [%s] Low reading. \n",
1584		   (result.event_enable & 0x04) ? "+" : "-");
1585	seq_printf(seq, "    [%s] Low warning. \n",
1586		   (result.event_enable & 0x08) ? "+" : "-");
1587	seq_printf(seq,
1588		   "    [%s] Change back to normal from out of range state. \n",
1589		   (result.event_enable & 0x10) ? "+" : "-");
1590	seq_printf(seq, "    [%s] High warning. \n",
1591		   (result.event_enable & 0x20) ? "+" : "-");
1592	seq_printf(seq, "    [%s] High reading. \n",
1593		   (result.event_enable & 0x40) ? "+" : "-");
1594	seq_printf(seq, "    [%s] High catastrophic. \n",
1595		   (result.event_enable & 0x80) ? "+" : "-");
1596
1597	return 0;
1598}
1599
1600static int i2o_seq_open_hrt(struct inode *inode, struct file *file)
1601{
1602	return single_open(file, i2o_seq_show_hrt, PDE_DATA(inode));
1603};
1604
1605static int i2o_seq_open_lct(struct inode *inode, struct file *file)
1606{
1607	return single_open(file, i2o_seq_show_lct, PDE_DATA(inode));
1608};
1609
1610static int i2o_seq_open_status(struct inode *inode, struct file *file)
1611{
1612	return single_open(file, i2o_seq_show_status, PDE_DATA(inode));
1613};
1614
1615static int i2o_seq_open_hw(struct inode *inode, struct file *file)
1616{
1617	return single_open(file, i2o_seq_show_hw, PDE_DATA(inode));
1618};
1619
1620static int i2o_seq_open_ddm_table(struct inode *inode, struct file *file)
1621{
1622	return single_open(file, i2o_seq_show_ddm_table, PDE_DATA(inode));
1623};
1624
1625static int i2o_seq_open_driver_store(struct inode *inode, struct file *file)
1626{
1627	return single_open(file, i2o_seq_show_driver_store, PDE_DATA(inode));
1628};
1629
1630static int i2o_seq_open_drivers_stored(struct inode *inode, struct file *file)
1631{
1632	return single_open(file, i2o_seq_show_drivers_stored, PDE_DATA(inode));
1633};
1634
1635static int i2o_seq_open_groups(struct inode *inode, struct file *file)
1636{
1637	return single_open(file, i2o_seq_show_groups, PDE_DATA(inode));
1638};
1639
1640static int i2o_seq_open_phys_device(struct inode *inode, struct file *file)
1641{
1642	return single_open(file, i2o_seq_show_phys_device, PDE_DATA(inode));
1643};
1644
1645static int i2o_seq_open_claimed(struct inode *inode, struct file *file)
1646{
1647	return single_open(file, i2o_seq_show_claimed, PDE_DATA(inode));
1648};
1649
1650static int i2o_seq_open_users(struct inode *inode, struct file *file)
1651{
1652	return single_open(file, i2o_seq_show_users, PDE_DATA(inode));
1653};
1654
1655static int i2o_seq_open_priv_msgs(struct inode *inode, struct file *file)
1656{
1657	return single_open(file, i2o_seq_show_priv_msgs, PDE_DATA(inode));
1658};
1659
1660static int i2o_seq_open_authorized_users(struct inode *inode, struct file *file)
1661{
1662	return single_open(file, i2o_seq_show_authorized_users,
1663			   PDE_DATA(inode));
1664};
1665
1666static int i2o_seq_open_dev_identity(struct inode *inode, struct file *file)
1667{
1668	return single_open(file, i2o_seq_show_dev_identity, PDE_DATA(inode));
1669};
1670
1671static int i2o_seq_open_ddm_identity(struct inode *inode, struct file *file)
1672{
1673	return single_open(file, i2o_seq_show_ddm_identity, PDE_DATA(inode));
1674};
1675
1676static int i2o_seq_open_uinfo(struct inode *inode, struct file *file)
1677{
1678	return single_open(file, i2o_seq_show_uinfo, PDE_DATA(inode));
1679};
1680
1681static int i2o_seq_open_sgl_limits(struct inode *inode, struct file *file)
1682{
1683	return single_open(file, i2o_seq_show_sgl_limits, PDE_DATA(inode));
1684};
1685
1686static int i2o_seq_open_sensors(struct inode *inode, struct file *file)
1687{
1688	return single_open(file, i2o_seq_show_sensors, PDE_DATA(inode));
1689};
1690
1691static int i2o_seq_open_dev_name(struct inode *inode, struct file *file)
1692{
1693	return single_open(file, i2o_seq_show_dev_name, PDE_DATA(inode));
1694};
1695
1696static const struct file_operations i2o_seq_fops_lct = {
1697	.open = i2o_seq_open_lct,
1698	.read = seq_read,
1699	.llseek = seq_lseek,
1700	.release = single_release,
1701};
1702
1703static const struct file_operations i2o_seq_fops_hrt = {
1704	.open = i2o_seq_open_hrt,
1705	.read = seq_read,
1706	.llseek = seq_lseek,
1707	.release = single_release,
1708};
1709
1710static const struct file_operations i2o_seq_fops_status = {
1711	.open = i2o_seq_open_status,
1712	.read = seq_read,
1713	.llseek = seq_lseek,
1714	.release = single_release,
1715};
1716
1717static const struct file_operations i2o_seq_fops_hw = {
1718	.open = i2o_seq_open_hw,
1719	.read = seq_read,
1720	.llseek = seq_lseek,
1721	.release = single_release,
1722};
1723
1724static const struct file_operations i2o_seq_fops_ddm_table = {
1725	.open = i2o_seq_open_ddm_table,
1726	.read = seq_read,
1727	.llseek = seq_lseek,
1728	.release = single_release,
1729};
1730
1731static const struct file_operations i2o_seq_fops_driver_store = {
1732	.open = i2o_seq_open_driver_store,
1733	.read = seq_read,
1734	.llseek = seq_lseek,
1735	.release = single_release,
1736};
1737
1738static const struct file_operations i2o_seq_fops_drivers_stored = {
1739	.open = i2o_seq_open_drivers_stored,
1740	.read = seq_read,
1741	.llseek = seq_lseek,
1742	.release = single_release,
1743};
1744
1745static const struct file_operations i2o_seq_fops_groups = {
1746	.open = i2o_seq_open_groups,
1747	.read = seq_read,
1748	.llseek = seq_lseek,
1749	.release = single_release,
1750};
1751
1752static const struct file_operations i2o_seq_fops_phys_device = {
1753	.open = i2o_seq_open_phys_device,
1754	.read = seq_read,
1755	.llseek = seq_lseek,
1756	.release = single_release,
1757};
1758
1759static const struct file_operations i2o_seq_fops_claimed = {
1760	.open = i2o_seq_open_claimed,
1761	.read = seq_read,
1762	.llseek = seq_lseek,
1763	.release = single_release,
1764};
1765
1766static const struct file_operations i2o_seq_fops_users = {
1767	.open = i2o_seq_open_users,
1768	.read = seq_read,
1769	.llseek = seq_lseek,
1770	.release = single_release,
1771};
1772
1773static const struct file_operations i2o_seq_fops_priv_msgs = {
1774	.open = i2o_seq_open_priv_msgs,
1775	.read = seq_read,
1776	.llseek = seq_lseek,
1777	.release = single_release,
1778};
1779
1780static const struct file_operations i2o_seq_fops_authorized_users = {
1781	.open = i2o_seq_open_authorized_users,
1782	.read = seq_read,
1783	.llseek = seq_lseek,
1784	.release = single_release,
1785};
1786
1787static const struct file_operations i2o_seq_fops_dev_name = {
1788	.open = i2o_seq_open_dev_name,
1789	.read = seq_read,
1790	.llseek = seq_lseek,
1791	.release = single_release,
1792};
1793
1794static const struct file_operations i2o_seq_fops_dev_identity = {
1795	.open = i2o_seq_open_dev_identity,
1796	.read = seq_read,
1797	.llseek = seq_lseek,
1798	.release = single_release,
1799};
1800
1801static const struct file_operations i2o_seq_fops_ddm_identity = {
1802	.open = i2o_seq_open_ddm_identity,
1803	.read = seq_read,
1804	.llseek = seq_lseek,
1805	.release = single_release,
1806};
1807
1808static const struct file_operations i2o_seq_fops_uinfo = {
1809	.open = i2o_seq_open_uinfo,
1810	.read = seq_read,
1811	.llseek = seq_lseek,
1812	.release = single_release,
1813};
1814
1815static const struct file_operations i2o_seq_fops_sgl_limits = {
1816	.open = i2o_seq_open_sgl_limits,
1817	.read = seq_read,
1818	.llseek = seq_lseek,
1819	.release = single_release,
1820};
1821
1822static const struct file_operations i2o_seq_fops_sensors = {
1823	.open = i2o_seq_open_sensors,
1824	.read = seq_read,
1825	.llseek = seq_lseek,
1826	.release = single_release,
1827};
1828
1829/*
1830 * IOP specific entries...write field just in case someone
1831 * ever wants one.
1832 */
1833static i2o_proc_entry i2o_proc_generic_iop_entries[] = {
1834	{"hrt", S_IFREG | S_IRUGO, &i2o_seq_fops_hrt},
1835	{"lct", S_IFREG | S_IRUGO, &i2o_seq_fops_lct},
1836	{"status", S_IFREG | S_IRUGO, &i2o_seq_fops_status},
1837	{"hw", S_IFREG | S_IRUGO, &i2o_seq_fops_hw},
1838	{"ddm_table", S_IFREG | S_IRUGO, &i2o_seq_fops_ddm_table},
1839	{"driver_store", S_IFREG | S_IRUGO, &i2o_seq_fops_driver_store},
1840	{"drivers_stored", S_IFREG | S_IRUGO, &i2o_seq_fops_drivers_stored},
1841	{NULL, 0, NULL}
1842};
1843
1844/*
1845 * Device specific entries
1846 */
1847static i2o_proc_entry generic_dev_entries[] = {
1848	{"groups", S_IFREG | S_IRUGO, &i2o_seq_fops_groups},
1849	{"phys_dev", S_IFREG | S_IRUGO, &i2o_seq_fops_phys_device},
1850	{"claimed", S_IFREG | S_IRUGO, &i2o_seq_fops_claimed},
1851	{"users", S_IFREG | S_IRUGO, &i2o_seq_fops_users},
1852	{"priv_msgs", S_IFREG | S_IRUGO, &i2o_seq_fops_priv_msgs},
1853	{"authorized_users", S_IFREG | S_IRUGO, &i2o_seq_fops_authorized_users},
1854	{"dev_identity", S_IFREG | S_IRUGO, &i2o_seq_fops_dev_identity},
1855	{"ddm_identity", S_IFREG | S_IRUGO, &i2o_seq_fops_ddm_identity},
1856	{"user_info", S_IFREG | S_IRUGO, &i2o_seq_fops_uinfo},
1857	{"sgl_limits", S_IFREG | S_IRUGO, &i2o_seq_fops_sgl_limits},
1858	{"sensors", S_IFREG | S_IRUGO, &i2o_seq_fops_sensors},
1859	{NULL, 0, NULL}
1860};
1861
1862/*
1863 *  Storage unit specific entries (SCSI Periph, BS) with device names
1864 */
1865static i2o_proc_entry rbs_dev_entries[] = {
1866	{"dev_name", S_IFREG | S_IRUGO, &i2o_seq_fops_dev_name},
1867	{NULL, 0, NULL}
1868};
1869
1870/**
1871 *	i2o_proc_create_entries - Creates proc dir entries
1872 *	@dir: proc dir entry under which the entries should be placed
1873 *	@i2o_pe: pointer to the entries which should be added
1874 *	@data: pointer to I2O controller or device
1875 *
1876 *	Create proc dir entries for a I2O controller or I2O device.
1877 *
1878 *	Returns 0 on success or negative error code on failure.
1879 */
1880static int i2o_proc_create_entries(struct proc_dir_entry *dir,
1881				   i2o_proc_entry * i2o_pe, void *data)
1882{
1883	struct proc_dir_entry *tmp;
1884
1885	while (i2o_pe->name) {
1886		tmp = proc_create_data(i2o_pe->name, i2o_pe->mode, dir,
1887				       i2o_pe->fops, data);
1888		if (!tmp)
1889			return -1;
1890
1891		i2o_pe++;
1892	}
1893
1894	return 0;
1895}
1896
1897/**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1898 *	i2o_proc_device_add - Add an I2O device to the proc dir
1899 *	@dir: proc dir entry to which the device should be added
1900 *	@dev: I2O device which should be added
1901 *
1902 *	Add an I2O device to the proc dir entry dir and create the entries for
1903 *	the device depending on the class of the I2O device.
1904 */
1905static void i2o_proc_device_add(struct proc_dir_entry *dir,
1906				struct i2o_device *dev)
1907{
1908	char buff[10];
1909	struct proc_dir_entry *devdir;
1910	i2o_proc_entry *i2o_pe = NULL;
1911
1912	sprintf(buff, "%03x", dev->lct_data.tid);
1913
1914	osm_debug("adding device /proc/i2o/%s/%s\n", dev->iop->name, buff);
1915
1916	devdir = proc_mkdir_data(buff, 0, dir, dev);
1917	if (!devdir) {
1918		osm_warn("Could not allocate procdir!\n");
1919		return;
1920	}
1921
 
 
1922	i2o_proc_create_entries(devdir, generic_dev_entries, dev);
1923
1924	/* Inform core that we want updates about this device's status */
1925	switch (dev->lct_data.class_id) {
1926	case I2O_CLASS_SCSI_PERIPHERAL:
1927	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
1928		i2o_pe = rbs_dev_entries;
1929		break;
1930	default:
1931		break;
1932	}
1933	if (i2o_pe)
1934		i2o_proc_create_entries(devdir, i2o_pe, dev);
1935}
1936
1937/**
1938 *	i2o_proc_iop_add - Add an I2O controller to the i2o proc tree
1939 *	@dir: parent proc dir entry
1940 *	@c: I2O controller which should be added
1941 *
1942 *	Add the entries to the parent proc dir entry. Also each device is added
1943 *	to the controllers proc dir entry.
1944 *
1945 *	Returns 0 on success or negative error code on failure.
1946 */
1947static int i2o_proc_iop_add(struct proc_dir_entry *dir,
1948			    struct i2o_controller *c)
1949{
1950	struct proc_dir_entry *iopdir;
1951	struct i2o_device *dev;
1952
1953	osm_debug("adding IOP /proc/i2o/%s\n", c->name);
1954
1955	iopdir = proc_mkdir_data(c->name, 0, dir, c);
1956	if (!iopdir)
1957		return -1;
1958
 
 
1959	i2o_proc_create_entries(iopdir, i2o_proc_generic_iop_entries, c);
1960
1961	list_for_each_entry(dev, &c->devices, list)
1962	    i2o_proc_device_add(iopdir, dev);
1963
1964	return 0;
1965}
1966
1967/**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1968 *	i2o_proc_fs_create - Create the i2o proc fs.
1969 *
1970 *	Iterate over each I2O controller and create the entries for it.
1971 *
1972 *	Returns 0 on success or negative error code on failure.
1973 */
1974static int __init i2o_proc_fs_create(void)
1975{
1976	struct i2o_controller *c;
1977
1978	i2o_proc_dir_root = proc_mkdir("i2o", NULL);
1979	if (!i2o_proc_dir_root)
1980		return -1;
1981
1982	list_for_each_entry(c, &i2o_controllers, list)
1983	    i2o_proc_iop_add(i2o_proc_dir_root, c);
1984
1985	return 0;
1986};
1987
1988/**
1989 *	i2o_proc_fs_destroy - Cleanup the all i2o proc entries
1990 *
1991 *	Iterate over each I2O controller and remove the entries for it.
1992 *
1993 *	Returns 0 on success or negative error code on failure.
1994 */
1995static int __exit i2o_proc_fs_destroy(void)
1996{
1997	remove_proc_subtree("i2o", NULL);
 
 
 
 
 
1998
1999	return 0;
2000};
2001
2002/**
2003 *	i2o_proc_init - Init function for procfs
2004 *
2005 *	Registers Proc OSM and creates procfs entries.
2006 *
2007 *	Returns 0 on success or negative error code on failure.
2008 */
2009static int __init i2o_proc_init(void)
2010{
2011	int rc;
2012
2013	printk(KERN_INFO OSM_DESCRIPTION " v" OSM_VERSION "\n");
2014
2015	rc = i2o_driver_register(&i2o_proc_driver);
2016	if (rc)
2017		return rc;
2018
2019	rc = i2o_proc_fs_create();
2020	if (rc) {
2021		i2o_driver_unregister(&i2o_proc_driver);
2022		return rc;
2023	}
2024
2025	return 0;
2026};
2027
2028/**
2029 *	i2o_proc_exit - Exit function for procfs
2030 *
2031 *	Unregisters Proc OSM and removes procfs entries.
2032 */
2033static void __exit i2o_proc_exit(void)
2034{
2035	i2o_driver_unregister(&i2o_proc_driver);
2036	i2o_proc_fs_destroy();
2037};
2038
2039MODULE_AUTHOR("Deepak Saxena");
2040MODULE_LICENSE("GPL");
2041MODULE_DESCRIPTION(OSM_DESCRIPTION);
2042MODULE_VERSION(OSM_VERSION);
2043
2044module_init(i2o_proc_init);
2045module_exit(i2o_proc_exit);
v3.5.6
   1/*
   2 *	procfs handler for Linux I2O subsystem
   3 *
   4 *	(c) Copyright 1999	Deepak Saxena
   5 *
   6 *	Originally written by Deepak Saxena(deepak@plexity.net)
   7 *
   8 *	This program is free software; you can redistribute it and/or modify it
   9 *	under the terms of the GNU General Public License as published by the
  10 *	Free Software Foundation; either version 2 of the License, or (at your
  11 *	option) any later version.
  12 *
  13 *	This is an initial test release. The code is based on the design of the
  14 *	ide procfs system (drivers/block/ide-proc.c). Some code taken from
  15 *	i2o-core module by Alan Cox.
  16 *
  17 *	DISCLAIMER: This code is still under development/test and may cause
  18 *	your system to behave unpredictably.  Use at your own discretion.
  19 *
  20 *
  21 *	Fixes/additions:
  22 *		Juha Sievänen (Juha.Sievanen@cs.Helsinki.FI),
  23 *		Auvo Häkkinen (Auvo.Hakkinen@cs.Helsinki.FI)
  24 *		University of Helsinki, Department of Computer Science
  25 *			LAN entries
  26 *		Markus Lidel <Markus.Lidel@shadowconnect.com>
  27 *			Changes for new I2O API
  28 */
  29
  30#define OSM_NAME	"proc-osm"
  31#define OSM_VERSION	"1.316"
  32#define OSM_DESCRIPTION	"I2O ProcFS OSM"
  33
  34#define I2O_MAX_MODULES 4
  35// FIXME!
  36#define FMT_U64_HEX "0x%08x%08x"
  37#define U64_VAL(pu64) *((u32*)(pu64)+1), *((u32*)(pu64))
  38
  39#include <linux/types.h>
  40#include <linux/kernel.h>
  41#include <linux/pci.h>
  42#include <linux/i2o.h>
  43#include <linux/slab.h>
  44#include <linux/proc_fs.h>
  45#include <linux/seq_file.h>
  46#include <linux/init.h>
  47#include <linux/module.h>
  48#include <linux/errno.h>
  49#include <linux/spinlock.h>
  50#include <linux/workqueue.h>
  51
  52#include <asm/io.h>
  53#include <asm/uaccess.h>
  54#include <asm/byteorder.h>
  55
  56/* Structure used to define /proc entries */
  57typedef struct _i2o_proc_entry_t {
  58	char *name;		/* entry name */
  59	umode_t mode;		/* mode */
  60	const struct file_operations *fops;	/* open function */
  61} i2o_proc_entry;
  62
  63/* global I2O /proc/i2o entry */
  64static struct proc_dir_entry *i2o_proc_dir_root;
  65
  66/* proc OSM driver struct */
  67static struct i2o_driver i2o_proc_driver = {
  68	.name = OSM_NAME,
  69};
  70
  71static int print_serial_number(struct seq_file *seq, u8 * serialno, int max_len)
  72{
  73	int i;
  74
  75	/* 19990419 -sralston
  76	 *      The I2O v1.5 (and v2.0 so far) "official specification"
  77	 *      got serial numbers WRONG!
  78	 *      Apparently, and despite what Section 3.4.4 says and
  79	 *      Figure 3-35 shows (pg 3-39 in the pdf doc),
  80	 *      the convention / consensus seems to be:
  81	 *        + First byte is SNFormat
  82	 *        + Second byte is SNLen (but only if SNFormat==7 (?))
  83	 *        + (v2.0) SCSI+BS may use IEEE Registered (64 or 128 bit) format
  84	 */
  85	switch (serialno[0]) {
  86	case I2O_SNFORMAT_BINARY:	/* Binary */
  87		seq_printf(seq, "0x");
  88		for (i = 0; i < serialno[1]; i++) {
  89			seq_printf(seq, "%02X", serialno[2 + i]);
  90		}
  91		break;
  92
  93	case I2O_SNFORMAT_ASCII:	/* ASCII */
  94		if (serialno[1] < ' ') {	/* printable or SNLen? */
  95			/* sanity */
  96			max_len =
  97			    (max_len < serialno[1]) ? max_len : serialno[1];
  98			serialno[1 + max_len] = '\0';
  99
 100			/* just print it */
 101			seq_printf(seq, "%s", &serialno[2]);
 102		} else {
 103			/* print chars for specified length */
 104			for (i = 0; i < serialno[1]; i++) {
 105				seq_printf(seq, "%c", serialno[2 + i]);
 106			}
 107		}
 108		break;
 109
 110	case I2O_SNFORMAT_UNICODE:	/* UNICODE */
 111		seq_printf(seq, "UNICODE Format.  Can't Display\n");
 112		break;
 113
 114	case I2O_SNFORMAT_LAN48_MAC:	/* LAN-48 MAC Address */
 115		seq_printf(seq, "LAN-48 MAC address @ %pM", &serialno[2]);
 116		break;
 117
 118	case I2O_SNFORMAT_WAN:	/* WAN MAC Address */
 119		/* FIXME: Figure out what a WAN access address looks like?? */
 120		seq_printf(seq, "WAN Access Address");
 121		break;
 122
 123/* plus new in v2.0 */
 124	case I2O_SNFORMAT_LAN64_MAC:	/* LAN-64 MAC Address */
 125		/* FIXME: Figure out what a LAN-64 address really looks like?? */
 126		seq_printf(seq,
 127			   "LAN-64 MAC address @ [?:%02X:%02X:?] %pM",
 128			   serialno[8], serialno[9], &serialno[2]);
 129		break;
 130
 131	case I2O_SNFORMAT_DDM:	/* I2O DDM */
 132		seq_printf(seq,
 133			   "DDM: Tid=%03Xh, Rsvd=%04Xh, OrgId=%04Xh",
 134			   *(u16 *) & serialno[2],
 135			   *(u16 *) & serialno[4], *(u16 *) & serialno[6]);
 136		break;
 137
 138	case I2O_SNFORMAT_IEEE_REG64:	/* IEEE Registered (64-bit) */
 139	case I2O_SNFORMAT_IEEE_REG128:	/* IEEE Registered (128-bit) */
 140		/* FIXME: Figure if this is even close?? */
 141		seq_printf(seq,
 142			   "IEEE NodeName(hi,lo)=(%08Xh:%08Xh), PortName(hi,lo)=(%08Xh:%08Xh)\n",
 143			   *(u32 *) & serialno[2],
 144			   *(u32 *) & serialno[6],
 145			   *(u32 *) & serialno[10], *(u32 *) & serialno[14]);
 146		break;
 147
 148	case I2O_SNFORMAT_UNKNOWN:	/* Unknown 0    */
 149	case I2O_SNFORMAT_UNKNOWN2:	/* Unknown 0xff */
 150	default:
 151		seq_printf(seq, "Unknown data format (0x%02x)", serialno[0]);
 152		break;
 153	}
 154
 155	return 0;
 156}
 157
 158/**
 159 *	i2o_get_class_name - 	do i2o class name lookup
 160 *	@class: class number
 161 *
 162 *	Return a descriptive string for an i2o class.
 163 */
 164static const char *i2o_get_class_name(int class)
 165{
 166	int idx = 16;
 167	static char *i2o_class_name[] = {
 168		"Executive",
 169		"Device Driver Module",
 170		"Block Device",
 171		"Tape Device",
 172		"LAN Interface",
 173		"WAN Interface",
 174		"Fibre Channel Port",
 175		"Fibre Channel Device",
 176		"SCSI Device",
 177		"ATE Port",
 178		"ATE Device",
 179		"Floppy Controller",
 180		"Floppy Device",
 181		"Secondary Bus Port",
 182		"Peer Transport Agent",
 183		"Peer Transport",
 184		"Unknown"
 185	};
 186
 187	switch (class & 0xfff) {
 188	case I2O_CLASS_EXECUTIVE:
 189		idx = 0;
 190		break;
 191	case I2O_CLASS_DDM:
 192		idx = 1;
 193		break;
 194	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
 195		idx = 2;
 196		break;
 197	case I2O_CLASS_SEQUENTIAL_STORAGE:
 198		idx = 3;
 199		break;
 200	case I2O_CLASS_LAN:
 201		idx = 4;
 202		break;
 203	case I2O_CLASS_WAN:
 204		idx = 5;
 205		break;
 206	case I2O_CLASS_FIBRE_CHANNEL_PORT:
 207		idx = 6;
 208		break;
 209	case I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL:
 210		idx = 7;
 211		break;
 212	case I2O_CLASS_SCSI_PERIPHERAL:
 213		idx = 8;
 214		break;
 215	case I2O_CLASS_ATE_PORT:
 216		idx = 9;
 217		break;
 218	case I2O_CLASS_ATE_PERIPHERAL:
 219		idx = 10;
 220		break;
 221	case I2O_CLASS_FLOPPY_CONTROLLER:
 222		idx = 11;
 223		break;
 224	case I2O_CLASS_FLOPPY_DEVICE:
 225		idx = 12;
 226		break;
 227	case I2O_CLASS_BUS_ADAPTER:
 228		idx = 13;
 229		break;
 230	case I2O_CLASS_PEER_TRANSPORT_AGENT:
 231		idx = 14;
 232		break;
 233	case I2O_CLASS_PEER_TRANSPORT:
 234		idx = 15;
 235		break;
 236	}
 237
 238	return i2o_class_name[idx];
 239}
 240
 241#define SCSI_TABLE_SIZE	13
 242static char *scsi_devices[] = {
 243	"Direct-Access Read/Write",
 244	"Sequential-Access Storage",
 245	"Printer",
 246	"Processor",
 247	"WORM Device",
 248	"CD-ROM Device",
 249	"Scanner Device",
 250	"Optical Memory Device",
 251	"Medium Changer Device",
 252	"Communications Device",
 253	"Graphics Art Pre-Press Device",
 254	"Graphics Art Pre-Press Device",
 255	"Array Controller Device"
 256};
 257
 258static char *chtostr(u8 * chars, int n)
 259{
 260	char tmp[256];
 261	tmp[0] = 0;
 262	return strncat(tmp, (char *)chars, n);
 263}
 264
 265static int i2o_report_query_status(struct seq_file *seq, int block_status,
 266				   char *group)
 267{
 268	switch (block_status) {
 269	case -ETIMEDOUT:
 270		return seq_printf(seq, "Timeout reading group %s.\n", group);
 271	case -ENOMEM:
 272		return seq_printf(seq, "No free memory to read the table.\n");
 273	case -I2O_PARAMS_STATUS_INVALID_GROUP_ID:
 274		return seq_printf(seq, "Group %s not supported.\n", group);
 275	default:
 276		return seq_printf(seq,
 277				  "Error reading group %s. BlockStatus 0x%02X\n",
 278				  group, -block_status);
 279	}
 280}
 281
 282static char *bus_strings[] = {
 283	"Local Bus",
 284	"ISA",
 285	"EISA",
 286	"PCI",
 287	"PCMCIA",
 288	"NUBUS",
 289	"CARDBUS"
 290};
 291
 292static int i2o_seq_show_hrt(struct seq_file *seq, void *v)
 293{
 294	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 295	i2o_hrt *hrt = (i2o_hrt *) c->hrt.virt;
 296	u32 bus;
 297	int i;
 298
 299	if (hrt->hrt_version) {
 300		seq_printf(seq,
 301			   "HRT table for controller is too new a version.\n");
 302		return 0;
 303	}
 304
 305	seq_printf(seq, "HRT has %d entries of %d bytes each.\n",
 306		   hrt->num_entries, hrt->entry_len << 2);
 307
 308	for (i = 0; i < hrt->num_entries; i++) {
 309		seq_printf(seq, "Entry %d:\n", i);
 310		seq_printf(seq, "   Adapter ID: %0#10x\n",
 311			   hrt->hrt_entry[i].adapter_id);
 312		seq_printf(seq, "   Controlling tid: %0#6x\n",
 313			   hrt->hrt_entry[i].parent_tid);
 314
 315		if (hrt->hrt_entry[i].bus_type != 0x80) {
 316			bus = hrt->hrt_entry[i].bus_type;
 317			seq_printf(seq, "   %s Information\n",
 318				   bus_strings[bus]);
 319
 320			switch (bus) {
 321			case I2O_BUS_LOCAL:
 322				seq_printf(seq, "     IOBase: %0#6x,",
 323					   hrt->hrt_entry[i].bus.local_bus.
 324					   LbBaseIOPort);
 325				seq_printf(seq, " MemoryBase: %0#10x\n",
 326					   hrt->hrt_entry[i].bus.local_bus.
 327					   LbBaseMemoryAddress);
 328				break;
 329
 330			case I2O_BUS_ISA:
 331				seq_printf(seq, "     IOBase: %0#6x,",
 332					   hrt->hrt_entry[i].bus.isa_bus.
 333					   IsaBaseIOPort);
 334				seq_printf(seq, " MemoryBase: %0#10x,",
 335					   hrt->hrt_entry[i].bus.isa_bus.
 336					   IsaBaseMemoryAddress);
 337				seq_printf(seq, " CSN: %0#4x,",
 338					   hrt->hrt_entry[i].bus.isa_bus.CSN);
 339				break;
 340
 341			case I2O_BUS_EISA:
 342				seq_printf(seq, "     IOBase: %0#6x,",
 343					   hrt->hrt_entry[i].bus.eisa_bus.
 344					   EisaBaseIOPort);
 345				seq_printf(seq, " MemoryBase: %0#10x,",
 346					   hrt->hrt_entry[i].bus.eisa_bus.
 347					   EisaBaseMemoryAddress);
 348				seq_printf(seq, " Slot: %0#4x,",
 349					   hrt->hrt_entry[i].bus.eisa_bus.
 350					   EisaSlotNumber);
 351				break;
 352
 353			case I2O_BUS_PCI:
 354				seq_printf(seq, "     Bus: %0#4x",
 355					   hrt->hrt_entry[i].bus.pci_bus.
 356					   PciBusNumber);
 357				seq_printf(seq, " Dev: %0#4x",
 358					   hrt->hrt_entry[i].bus.pci_bus.
 359					   PciDeviceNumber);
 360				seq_printf(seq, " Func: %0#4x",
 361					   hrt->hrt_entry[i].bus.pci_bus.
 362					   PciFunctionNumber);
 363				seq_printf(seq, " Vendor: %0#6x",
 364					   hrt->hrt_entry[i].bus.pci_bus.
 365					   PciVendorID);
 366				seq_printf(seq, " Device: %0#6x\n",
 367					   hrt->hrt_entry[i].bus.pci_bus.
 368					   PciDeviceID);
 369				break;
 370
 371			default:
 372				seq_printf(seq, "      Unsupported Bus Type\n");
 373			}
 374		} else
 375			seq_printf(seq, "   Unknown Bus Type\n");
 376	}
 377
 378	return 0;
 379}
 380
 381static int i2o_seq_show_lct(struct seq_file *seq, void *v)
 382{
 383	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 384	i2o_lct *lct = (i2o_lct *) c->lct;
 385	int entries;
 386	int i;
 387
 388#define BUS_TABLE_SIZE 3
 389	static char *bus_ports[] = {
 390		"Generic Bus",
 391		"SCSI Bus",
 392		"Fibre Channel Bus"
 393	};
 394
 395	entries = (lct->table_size - 3) / 9;
 396
 397	seq_printf(seq, "LCT contains %d %s\n", entries,
 398		   entries == 1 ? "entry" : "entries");
 399	if (lct->boot_tid)
 400		seq_printf(seq, "Boot Device @ ID %d\n", lct->boot_tid);
 401
 402	seq_printf(seq, "Current Change Indicator: %#10x\n", lct->change_ind);
 403
 404	for (i = 0; i < entries; i++) {
 405		seq_printf(seq, "Entry %d\n", i);
 406		seq_printf(seq, "  Class, SubClass  : %s",
 407			   i2o_get_class_name(lct->lct_entry[i].class_id));
 408
 409		/*
 410		 *      Classes which we'll print subclass info for
 411		 */
 412		switch (lct->lct_entry[i].class_id & 0xFFF) {
 413		case I2O_CLASS_RANDOM_BLOCK_STORAGE:
 414			switch (lct->lct_entry[i].sub_class) {
 415			case 0x00:
 416				seq_printf(seq, ", Direct-Access Read/Write");
 417				break;
 418
 419			case 0x04:
 420				seq_printf(seq, ", WORM Drive");
 421				break;
 422
 423			case 0x05:
 424				seq_printf(seq, ", CD-ROM Drive");
 425				break;
 426
 427			case 0x07:
 428				seq_printf(seq, ", Optical Memory Device");
 429				break;
 430
 431			default:
 432				seq_printf(seq, ", Unknown (0x%02x)",
 433					   lct->lct_entry[i].sub_class);
 434				break;
 435			}
 436			break;
 437
 438		case I2O_CLASS_LAN:
 439			switch (lct->lct_entry[i].sub_class & 0xFF) {
 440			case 0x30:
 441				seq_printf(seq, ", Ethernet");
 442				break;
 443
 444			case 0x40:
 445				seq_printf(seq, ", 100base VG");
 446				break;
 447
 448			case 0x50:
 449				seq_printf(seq, ", IEEE 802.5/Token-Ring");
 450				break;
 451
 452			case 0x60:
 453				seq_printf(seq, ", ANSI X3T9.5 FDDI");
 454				break;
 455
 456			case 0x70:
 457				seq_printf(seq, ", Fibre Channel");
 458				break;
 459
 460			default:
 461				seq_printf(seq, ", Unknown Sub-Class (0x%02x)",
 462					   lct->lct_entry[i].sub_class & 0xFF);
 463				break;
 464			}
 465			break;
 466
 467		case I2O_CLASS_SCSI_PERIPHERAL:
 468			if (lct->lct_entry[i].sub_class < SCSI_TABLE_SIZE)
 469				seq_printf(seq, ", %s",
 470					   scsi_devices[lct->lct_entry[i].
 471							sub_class]);
 472			else
 473				seq_printf(seq, ", Unknown Device Type");
 474			break;
 475
 476		case I2O_CLASS_BUS_ADAPTER:
 477			if (lct->lct_entry[i].sub_class < BUS_TABLE_SIZE)
 478				seq_printf(seq, ", %s",
 479					   bus_ports[lct->lct_entry[i].
 480						     sub_class]);
 481			else
 482				seq_printf(seq, ", Unknown Bus Type");
 483			break;
 484		}
 485		seq_printf(seq, "\n");
 486
 487		seq_printf(seq, "  Local TID        : 0x%03x\n",
 488			   lct->lct_entry[i].tid);
 489		seq_printf(seq, "  User TID         : 0x%03x\n",
 490			   lct->lct_entry[i].user_tid);
 491		seq_printf(seq, "  Parent TID       : 0x%03x\n",
 492			   lct->lct_entry[i].parent_tid);
 493		seq_printf(seq, "  Identity Tag     : 0x%x%x%x%x%x%x%x%x\n",
 494			   lct->lct_entry[i].identity_tag[0],
 495			   lct->lct_entry[i].identity_tag[1],
 496			   lct->lct_entry[i].identity_tag[2],
 497			   lct->lct_entry[i].identity_tag[3],
 498			   lct->lct_entry[i].identity_tag[4],
 499			   lct->lct_entry[i].identity_tag[5],
 500			   lct->lct_entry[i].identity_tag[6],
 501			   lct->lct_entry[i].identity_tag[7]);
 502		seq_printf(seq, "  Change Indicator : %0#10x\n",
 503			   lct->lct_entry[i].change_ind);
 504		seq_printf(seq, "  Event Capab Mask : %0#10x\n",
 505			   lct->lct_entry[i].device_flags);
 506	}
 507
 508	return 0;
 509}
 510
 511static int i2o_seq_show_status(struct seq_file *seq, void *v)
 512{
 513	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 514	char prodstr[25];
 515	int version;
 516	i2o_status_block *sb = c->status_block.virt;
 517
 518	i2o_status_get(c);	// reread the status block
 519
 520	seq_printf(seq, "Organization ID        : %0#6x\n", sb->org_id);
 521
 522	version = sb->i2o_version;
 523
 524/* FIXME for Spec 2.0
 525	if (version == 0x02) {
 526		seq_printf(seq, "Lowest I2O version supported: ");
 527		switch(workspace[2]) {
 528			case 0x00:
 529				seq_printf(seq, "1.0\n");
 530				break;
 531			case 0x01:
 532				seq_printf(seq, "1.5\n");
 533				break;
 534			case 0x02:
 535				seq_printf(seq, "2.0\n");
 536				break;
 537		}
 538
 539		seq_printf(seq, "Highest I2O version supported: ");
 540		switch(workspace[3]) {
 541			case 0x00:
 542				seq_printf(seq, "1.0\n");
 543				break;
 544			case 0x01:
 545				seq_printf(seq, "1.5\n");
 546				break;
 547			case 0x02:
 548				seq_printf(seq, "2.0\n");
 549				break;
 550		}
 551	}
 552*/
 553	seq_printf(seq, "IOP ID                 : %0#5x\n", sb->iop_id);
 554	seq_printf(seq, "Host Unit ID           : %0#6x\n", sb->host_unit_id);
 555	seq_printf(seq, "Segment Number         : %0#5x\n", sb->segment_number);
 556
 557	seq_printf(seq, "I2O version            : ");
 558	switch (version) {
 559	case 0x00:
 560		seq_printf(seq, "1.0\n");
 561		break;
 562	case 0x01:
 563		seq_printf(seq, "1.5\n");
 564		break;
 565	case 0x02:
 566		seq_printf(seq, "2.0\n");
 567		break;
 568	default:
 569		seq_printf(seq, "Unknown version\n");
 570	}
 571
 572	seq_printf(seq, "IOP State              : ");
 573	switch (sb->iop_state) {
 574	case 0x01:
 575		seq_printf(seq, "INIT\n");
 576		break;
 577
 578	case 0x02:
 579		seq_printf(seq, "RESET\n");
 580		break;
 581
 582	case 0x04:
 583		seq_printf(seq, "HOLD\n");
 584		break;
 585
 586	case 0x05:
 587		seq_printf(seq, "READY\n");
 588		break;
 589
 590	case 0x08:
 591		seq_printf(seq, "OPERATIONAL\n");
 592		break;
 593
 594	case 0x10:
 595		seq_printf(seq, "FAILED\n");
 596		break;
 597
 598	case 0x11:
 599		seq_printf(seq, "FAULTED\n");
 600		break;
 601
 602	default:
 603		seq_printf(seq, "Unknown\n");
 604		break;
 605	}
 606
 607	seq_printf(seq, "Messenger Type         : ");
 608	switch (sb->msg_type) {
 609	case 0x00:
 610		seq_printf(seq, "Memory mapped\n");
 611		break;
 612	case 0x01:
 613		seq_printf(seq, "Memory mapped only\n");
 614		break;
 615	case 0x02:
 616		seq_printf(seq, "Remote only\n");
 617		break;
 618	case 0x03:
 619		seq_printf(seq, "Memory mapped and remote\n");
 620		break;
 621	default:
 622		seq_printf(seq, "Unknown\n");
 623	}
 624
 625	seq_printf(seq, "Inbound Frame Size     : %d bytes\n",
 626		   sb->inbound_frame_size << 2);
 627	seq_printf(seq, "Max Inbound Frames     : %d\n",
 628		   sb->max_inbound_frames);
 629	seq_printf(seq, "Current Inbound Frames : %d\n",
 630		   sb->cur_inbound_frames);
 631	seq_printf(seq, "Max Outbound Frames    : %d\n",
 632		   sb->max_outbound_frames);
 633
 634	/* Spec doesn't say if NULL terminated or not... */
 635	memcpy(prodstr, sb->product_id, 24);
 636	prodstr[24] = '\0';
 637	seq_printf(seq, "Product ID             : %s\n", prodstr);
 638	seq_printf(seq, "Expected LCT Size      : %d bytes\n",
 639		   sb->expected_lct_size);
 640
 641	seq_printf(seq, "IOP Capabilities\n");
 642	seq_printf(seq, "    Context Field Size Support : ");
 643	switch (sb->iop_capabilities & 0x0000003) {
 644	case 0:
 645		seq_printf(seq, "Supports only 32-bit context fields\n");
 646		break;
 647	case 1:
 648		seq_printf(seq, "Supports only 64-bit context fields\n");
 649		break;
 650	case 2:
 651		seq_printf(seq, "Supports 32-bit and 64-bit context fields, "
 652			   "but not concurrently\n");
 653		break;
 654	case 3:
 655		seq_printf(seq, "Supports 32-bit and 64-bit context fields "
 656			   "concurrently\n");
 657		break;
 658	default:
 659		seq_printf(seq, "0x%08x\n", sb->iop_capabilities);
 660	}
 661	seq_printf(seq, "    Current Context Field Size : ");
 662	switch (sb->iop_capabilities & 0x0000000C) {
 663	case 0:
 664		seq_printf(seq, "not configured\n");
 665		break;
 666	case 4:
 667		seq_printf(seq, "Supports only 32-bit context fields\n");
 668		break;
 669	case 8:
 670		seq_printf(seq, "Supports only 64-bit context fields\n");
 671		break;
 672	case 12:
 673		seq_printf(seq, "Supports both 32-bit or 64-bit context fields "
 674			   "concurrently\n");
 675		break;
 676	default:
 677		seq_printf(seq, "\n");
 678	}
 679	seq_printf(seq, "    Inbound Peer Support       : %s\n",
 680		   (sb->
 681		    iop_capabilities & 0x00000010) ? "Supported" :
 682		   "Not supported");
 683	seq_printf(seq, "    Outbound Peer Support      : %s\n",
 684		   (sb->
 685		    iop_capabilities & 0x00000020) ? "Supported" :
 686		   "Not supported");
 687	seq_printf(seq, "    Peer to Peer Support       : %s\n",
 688		   (sb->
 689		    iop_capabilities & 0x00000040) ? "Supported" :
 690		   "Not supported");
 691
 692	seq_printf(seq, "Desired private memory size   : %d kB\n",
 693		   sb->desired_mem_size >> 10);
 694	seq_printf(seq, "Allocated private memory size : %d kB\n",
 695		   sb->current_mem_size >> 10);
 696	seq_printf(seq, "Private memory base address   : %0#10x\n",
 697		   sb->current_mem_base);
 698	seq_printf(seq, "Desired private I/O size      : %d kB\n",
 699		   sb->desired_io_size >> 10);
 700	seq_printf(seq, "Allocated private I/O size    : %d kB\n",
 701		   sb->current_io_size >> 10);
 702	seq_printf(seq, "Private I/O base address      : %0#10x\n",
 703		   sb->current_io_base);
 704
 705	return 0;
 706}
 707
 708static int i2o_seq_show_hw(struct seq_file *seq, void *v)
 709{
 710	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 711	static u32 work32[5];
 712	static u8 *work8 = (u8 *) work32;
 713	static u16 *work16 = (u16 *) work32;
 714	int token;
 715	u32 hwcap;
 716
 717	static char *cpu_table[] = {
 718		"Intel 80960 series",
 719		"AMD2900 series",
 720		"Motorola 68000 series",
 721		"ARM series",
 722		"MIPS series",
 723		"Sparc series",
 724		"PowerPC series",
 725		"Intel x86 series"
 726	};
 727
 728	token =
 729	    i2o_parm_field_get(c->exec, 0x0000, -1, &work32, sizeof(work32));
 730
 731	if (token < 0) {
 732		i2o_report_query_status(seq, token, "0x0000 IOP Hardware");
 733		return 0;
 734	}
 735
 736	seq_printf(seq, "I2O Vendor ID    : %0#6x\n", work16[0]);
 737	seq_printf(seq, "Product ID       : %0#6x\n", work16[1]);
 738	seq_printf(seq, "CPU              : ");
 739	if (work8[16] > 8)
 740		seq_printf(seq, "Unknown\n");
 741	else
 742		seq_printf(seq, "%s\n", cpu_table[work8[16]]);
 743	/* Anyone using ProcessorVersion? */
 744
 745	seq_printf(seq, "RAM              : %dkB\n", work32[1] >> 10);
 746	seq_printf(seq, "Non-Volatile Mem : %dkB\n", work32[2] >> 10);
 747
 748	hwcap = work32[3];
 749	seq_printf(seq, "Capabilities : 0x%08x\n", hwcap);
 750	seq_printf(seq, "   [%s] Self booting\n",
 751		   (hwcap & 0x00000001) ? "+" : "-");
 752	seq_printf(seq, "   [%s] Upgradable IRTOS\n",
 753		   (hwcap & 0x00000002) ? "+" : "-");
 754	seq_printf(seq, "   [%s] Supports downloading DDMs\n",
 755		   (hwcap & 0x00000004) ? "+" : "-");
 756	seq_printf(seq, "   [%s] Supports installing DDMs\n",
 757		   (hwcap & 0x00000008) ? "+" : "-");
 758	seq_printf(seq, "   [%s] Battery-backed RAM\n",
 759		   (hwcap & 0x00000010) ? "+" : "-");
 760
 761	return 0;
 762}
 763
 764/* Executive group 0003h - Executing DDM List (table) */
 765static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v)
 766{
 767	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 768	int token;
 769	int i;
 770
 771	typedef struct _i2o_exec_execute_ddm_table {
 772		u16 ddm_tid;
 773		u8 module_type;
 774		u8 reserved;
 775		u16 i2o_vendor_id;
 776		u16 module_id;
 777		u8 module_name_version[28];
 778		u32 data_size;
 779		u32 code_size;
 780	} i2o_exec_execute_ddm_table;
 781
 782	struct {
 783		u16 result_count;
 784		u16 pad;
 785		u16 block_size;
 786		u8 block_status;
 787		u8 error_info_size;
 788		u16 row_count;
 789		u16 more_flag;
 790		i2o_exec_execute_ddm_table ddm_table[I2O_MAX_MODULES];
 791	} *result;
 792
 793	i2o_exec_execute_ddm_table ddm_table;
 
 794
 795	result = kmalloc(sizeof(*result), GFP_KERNEL);
 796	if (!result)
 797		return -ENOMEM;
 798
 799	token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0003, -1,
 800				   NULL, 0, result, sizeof(*result));
 801
 802	if (token < 0) {
 803		i2o_report_query_status(seq, token,
 804					"0x0003 Executing DDM List");
 805		goto out;
 806	}
 807
 808	seq_printf(seq,
 809		   "Tid   Module_type     Vendor Mod_id  Module_name             Vrs  Data_size Code_size\n");
 810	ddm_table = result->ddm_table[0];
 811
 812	for (i = 0; i < result->row_count; ddm_table = result->ddm_table[++i]) {
 813		seq_printf(seq, "0x%03x ", ddm_table.ddm_tid & 0xFFF);
 814
 815		switch (ddm_table.module_type) {
 816		case 0x01:
 817			seq_printf(seq, "Downloaded DDM  ");
 818			break;
 819		case 0x22:
 820			seq_printf(seq, "Embedded DDM    ");
 821			break;
 822		default:
 823			seq_printf(seq, "                ");
 824		}
 825
 826		seq_printf(seq, "%-#7x", ddm_table.i2o_vendor_id);
 827		seq_printf(seq, "%-#8x", ddm_table.module_id);
 828		seq_printf(seq, "%-29s",
 829			   chtostr(ddm_table.module_name_version, 28));
 830		seq_printf(seq, "%9d  ", ddm_table.data_size);
 831		seq_printf(seq, "%8d", ddm_table.code_size);
 832
 833		seq_printf(seq, "\n");
 834	}
 835      out:
 836	kfree(result);
 837	return 0;
 838}
 839
 840/* Executive group 0004h - Driver Store (scalar) */
 841static int i2o_seq_show_driver_store(struct seq_file *seq, void *v)
 842{
 843	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 844	u32 work32[8];
 845	int token;
 846
 847	token =
 848	    i2o_parm_field_get(c->exec, 0x0004, -1, &work32, sizeof(work32));
 849	if (token < 0) {
 850		i2o_report_query_status(seq, token, "0x0004 Driver Store");
 851		return 0;
 852	}
 853
 854	seq_printf(seq, "Module limit  : %d\n"
 855		   "Module count  : %d\n"
 856		   "Current space : %d kB\n"
 857		   "Free space    : %d kB\n",
 858		   work32[0], work32[1], work32[2] >> 10, work32[3] >> 10);
 859
 860	return 0;
 861}
 862
 863/* Executive group 0005h - Driver Store Table (table) */
 864static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v)
 865{
 866	typedef struct _i2o_driver_store {
 867		u16 stored_ddm_index;
 868		u8 module_type;
 869		u8 reserved;
 870		u16 i2o_vendor_id;
 871		u16 module_id;
 872		u8 module_name_version[28];
 873		u8 date[8];
 874		u32 module_size;
 875		u32 mpb_size;
 876		u32 module_flags;
 877	} i2o_driver_store_table;
 878
 879	struct i2o_controller *c = (struct i2o_controller *)seq->private;
 880	int token;
 881	int i;
 882
 883	typedef struct {
 884		u16 result_count;
 885		u16 pad;
 886		u16 block_size;
 887		u8 block_status;
 888		u8 error_info_size;
 889		u16 row_count;
 890		u16 more_flag;
 891		i2o_driver_store_table dst[I2O_MAX_MODULES];
 892	} i2o_driver_result_table;
 893
 894	i2o_driver_result_table *result;
 895	i2o_driver_store_table *dst;
 
 896
 897	result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL);
 898	if (result == NULL)
 899		return -ENOMEM;
 900
 901	token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0005, -1,
 902				   NULL, 0, result, sizeof(*result));
 903
 904	if (token < 0) {
 905		i2o_report_query_status(seq, token,
 906					"0x0005 DRIVER STORE TABLE");
 907		kfree(result);
 908		return 0;
 909	}
 910
 911	seq_printf(seq,
 912		   "#  Module_type     Vendor Mod_id  Module_name             Vrs"
 913		   "Date     Mod_size Par_size Flags\n");
 914	for (i = 0, dst = &result->dst[0]; i < result->row_count;
 915	     dst = &result->dst[++i]) {
 916		seq_printf(seq, "%-3d", dst->stored_ddm_index);
 917		switch (dst->module_type) {
 918		case 0x01:
 919			seq_printf(seq, "Downloaded DDM  ");
 920			break;
 921		case 0x22:
 922			seq_printf(seq, "Embedded DDM    ");
 923			break;
 924		default:
 925			seq_printf(seq, "                ");
 926		}
 927
 928		seq_printf(seq, "%-#7x", dst->i2o_vendor_id);
 929		seq_printf(seq, "%-#8x", dst->module_id);
 930		seq_printf(seq, "%-29s", chtostr(dst->module_name_version, 28));
 931		seq_printf(seq, "%-9s", chtostr(dst->date, 8));
 
 932		seq_printf(seq, "%8d ", dst->module_size);
 933		seq_printf(seq, "%8d ", dst->mpb_size);
 934		seq_printf(seq, "0x%04x", dst->module_flags);
 935		seq_printf(seq, "\n");
 936	}
 937
 938	kfree(result);
 939	return 0;
 940}
 941
 942/* Generic group F000h - Params Descriptor (table) */
 943static int i2o_seq_show_groups(struct seq_file *seq, void *v)
 944{
 945	struct i2o_device *d = (struct i2o_device *)seq->private;
 946	int token;
 947	int i;
 948	u8 properties;
 949
 950	typedef struct _i2o_group_info {
 951		u16 group_number;
 952		u16 field_count;
 953		u16 row_count;
 954		u8 properties;
 955		u8 reserved;
 956	} i2o_group_info;
 957
 958	struct {
 959		u16 result_count;
 960		u16 pad;
 961		u16 block_size;
 962		u8 block_status;
 963		u8 error_info_size;
 964		u16 row_count;
 965		u16 more_flag;
 966		i2o_group_info group[256];
 967	} *result;
 968
 969	result = kmalloc(sizeof(*result), GFP_KERNEL);
 970	if (!result)
 971		return -ENOMEM;
 972
 973	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF000, -1, NULL, 0,
 974				   result, sizeof(*result));
 975
 976	if (token < 0) {
 977		i2o_report_query_status(seq, token, "0xF000 Params Descriptor");
 978		goto out;
 979	}
 980
 981	seq_printf(seq,
 982		   "#  Group   FieldCount RowCount Type   Add Del Clear\n");
 983
 984	for (i = 0; i < result->row_count; i++) {
 985		seq_printf(seq, "%-3d", i);
 986		seq_printf(seq, "0x%04X ", result->group[i].group_number);
 987		seq_printf(seq, "%10d ", result->group[i].field_count);
 988		seq_printf(seq, "%8d ", result->group[i].row_count);
 989
 990		properties = result->group[i].properties;
 991		if (properties & 0x1)
 992			seq_printf(seq, "Table  ");
 993		else
 994			seq_printf(seq, "Scalar ");
 995		if (properties & 0x2)
 996			seq_printf(seq, " + ");
 997		else
 998			seq_printf(seq, " - ");
 999		if (properties & 0x4)
1000			seq_printf(seq, "  + ");
1001		else
1002			seq_printf(seq, "  - ");
1003		if (properties & 0x8)
1004			seq_printf(seq, "  + ");
1005		else
1006			seq_printf(seq, "  - ");
1007
1008		seq_printf(seq, "\n");
1009	}
1010
1011	if (result->more_flag)
1012		seq_printf(seq, "There is more...\n");
1013      out:
1014	kfree(result);
1015	return 0;
1016}
1017
1018/* Generic group F001h - Physical Device Table (table) */
1019static int i2o_seq_show_phys_device(struct seq_file *seq, void *v)
1020{
1021	struct i2o_device *d = (struct i2o_device *)seq->private;
1022	int token;
1023	int i;
1024
1025	struct {
1026		u16 result_count;
1027		u16 pad;
1028		u16 block_size;
1029		u8 block_status;
1030		u8 error_info_size;
1031		u16 row_count;
1032		u16 more_flag;
1033		u32 adapter_id[64];
1034	} result;
1035
1036	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF001, -1, NULL, 0,
1037				   &result, sizeof(result));
1038
1039	if (token < 0) {
1040		i2o_report_query_status(seq, token,
1041					"0xF001 Physical Device Table");
1042		return 0;
1043	}
1044
1045	if (result.row_count)
1046		seq_printf(seq, "#  AdapterId\n");
1047
1048	for (i = 0; i < result.row_count; i++) {
1049		seq_printf(seq, "%-2d", i);
1050		seq_printf(seq, "%#7x\n", result.adapter_id[i]);
1051	}
1052
1053	if (result.more_flag)
1054		seq_printf(seq, "There is more...\n");
1055
1056	return 0;
1057}
1058
1059/* Generic group F002h - Claimed Table (table) */
1060static int i2o_seq_show_claimed(struct seq_file *seq, void *v)
1061{
1062	struct i2o_device *d = (struct i2o_device *)seq->private;
1063	int token;
1064	int i;
1065
1066	struct {
1067		u16 result_count;
1068		u16 pad;
1069		u16 block_size;
1070		u8 block_status;
1071		u8 error_info_size;
1072		u16 row_count;
1073		u16 more_flag;
1074		u16 claimed_tid[64];
1075	} result;
1076
1077	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF002, -1, NULL, 0,
1078				   &result, sizeof(result));
1079
1080	if (token < 0) {
1081		i2o_report_query_status(seq, token, "0xF002 Claimed Table");
1082		return 0;
1083	}
1084
1085	if (result.row_count)
1086		seq_printf(seq, "#  ClaimedTid\n");
1087
1088	for (i = 0; i < result.row_count; i++) {
1089		seq_printf(seq, "%-2d", i);
1090		seq_printf(seq, "%#7x\n", result.claimed_tid[i]);
1091	}
1092
1093	if (result.more_flag)
1094		seq_printf(seq, "There is more...\n");
1095
1096	return 0;
1097}
1098
1099/* Generic group F003h - User Table (table) */
1100static int i2o_seq_show_users(struct seq_file *seq, void *v)
1101{
1102	struct i2o_device *d = (struct i2o_device *)seq->private;
1103	int token;
1104	int i;
1105
1106	typedef struct _i2o_user_table {
1107		u16 instance;
1108		u16 user_tid;
1109		u8 claim_type;
1110		u8 reserved1;
1111		u16 reserved2;
1112	} i2o_user_table;
1113
1114	struct {
1115		u16 result_count;
1116		u16 pad;
1117		u16 block_size;
1118		u8 block_status;
1119		u8 error_info_size;
1120		u16 row_count;
1121		u16 more_flag;
1122		i2o_user_table user[64];
1123	} *result;
1124
1125	result = kmalloc(sizeof(*result), GFP_KERNEL);
1126	if (!result)
1127		return -ENOMEM;
1128
1129	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF003, -1, NULL, 0,
1130				   result, sizeof(*result));
1131
1132	if (token < 0) {
1133		i2o_report_query_status(seq, token, "0xF003 User Table");
1134		goto out;
1135	}
1136
1137	seq_printf(seq, "#  Instance UserTid ClaimType\n");
1138
1139	for (i = 0; i < result->row_count; i++) {
1140		seq_printf(seq, "%-3d", i);
1141		seq_printf(seq, "%#8x ", result->user[i].instance);
1142		seq_printf(seq, "%#7x ", result->user[i].user_tid);
1143		seq_printf(seq, "%#9x\n", result->user[i].claim_type);
1144	}
1145
1146	if (result->more_flag)
1147		seq_printf(seq, "There is more...\n");
1148      out:
1149	kfree(result);
1150	return 0;
1151}
1152
1153/* Generic group F005h - Private message extensions (table) (optional) */
1154static int i2o_seq_show_priv_msgs(struct seq_file *seq, void *v)
1155{
1156	struct i2o_device *d = (struct i2o_device *)seq->private;
1157	int token;
1158	int i;
1159
1160	typedef struct _i2o_private {
1161		u16 ext_instance;
1162		u16 organization_id;
1163		u16 x_function_code;
1164	} i2o_private;
1165
1166	struct {
1167		u16 result_count;
1168		u16 pad;
1169		u16 block_size;
1170		u8 block_status;
1171		u8 error_info_size;
1172		u16 row_count;
1173		u16 more_flag;
1174		i2o_private extension[64];
1175	} result;
1176
1177	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF000, -1, NULL, 0,
1178				   &result, sizeof(result));
1179
1180	if (token < 0) {
1181		i2o_report_query_status(seq, token,
1182					"0xF005 Private Message Extensions (optional)");
1183		return 0;
1184	}
1185
1186	seq_printf(seq, "Instance#  OrgId  FunctionCode\n");
1187
1188	for (i = 0; i < result.row_count; i++) {
1189		seq_printf(seq, "%0#9x ", result.extension[i].ext_instance);
1190		seq_printf(seq, "%0#6x ", result.extension[i].organization_id);
1191		seq_printf(seq, "%0#6x", result.extension[i].x_function_code);
1192
1193		seq_printf(seq, "\n");
1194	}
1195
1196	if (result.more_flag)
1197		seq_printf(seq, "There is more...\n");
1198
1199	return 0;
1200}
1201
1202/* Generic group F006h - Authorized User Table (table) */
1203static int i2o_seq_show_authorized_users(struct seq_file *seq, void *v)
1204{
1205	struct i2o_device *d = (struct i2o_device *)seq->private;
1206	int token;
1207	int i;
1208
1209	struct {
1210		u16 result_count;
1211		u16 pad;
1212		u16 block_size;
1213		u8 block_status;
1214		u8 error_info_size;
1215		u16 row_count;
1216		u16 more_flag;
1217		u32 alternate_tid[64];
1218	} result;
1219
1220	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF006, -1, NULL, 0,
1221				   &result, sizeof(result));
1222
1223	if (token < 0) {
1224		i2o_report_query_status(seq, token,
1225					"0xF006 Autohorized User Table");
1226		return 0;
1227	}
1228
1229	if (result.row_count)
1230		seq_printf(seq, "#  AlternateTid\n");
1231
1232	for (i = 0; i < result.row_count; i++) {
1233		seq_printf(seq, "%-2d", i);
1234		seq_printf(seq, "%#7x ", result.alternate_tid[i]);
1235	}
1236
1237	if (result.more_flag)
1238		seq_printf(seq, "There is more...\n");
1239
1240	return 0;
1241}
1242
1243/* Generic group F100h - Device Identity (scalar) */
1244static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v)
1245{
1246	struct i2o_device *d = (struct i2o_device *)seq->private;
1247	static u32 work32[128];	// allow for "stuff" + up to 256 byte (max) serial number
1248	// == (allow) 512d bytes (max)
1249	static u16 *work16 = (u16 *) work32;
1250	int token;
 
1251
1252	token = i2o_parm_field_get(d, 0xF100, -1, &work32, sizeof(work32));
1253
1254	if (token < 0) {
1255		i2o_report_query_status(seq, token, "0xF100 Device Identity");
1256		return 0;
1257	}
1258
1259	seq_printf(seq, "Device Class  : %s\n", i2o_get_class_name(work16[0]));
1260	seq_printf(seq, "Owner TID     : %0#5x\n", work16[2]);
1261	seq_printf(seq, "Parent TID    : %0#5x\n", work16[3]);
1262	seq_printf(seq, "Vendor info   : %s\n",
1263		   chtostr((u8 *) (work32 + 2), 16));
1264	seq_printf(seq, "Product info  : %s\n",
1265		   chtostr((u8 *) (work32 + 6), 16));
1266	seq_printf(seq, "Description   : %s\n",
1267		   chtostr((u8 *) (work32 + 10), 16));
1268	seq_printf(seq, "Product rev.  : %s\n",
1269		   chtostr((u8 *) (work32 + 14), 8));
1270
1271	seq_printf(seq, "Serial number : ");
1272	print_serial_number(seq, (u8 *) (work32 + 16),
1273			    /* allow for SNLen plus
1274			     * possible trailing '\0'
1275			     */
1276			    sizeof(work32) - (16 * sizeof(u32)) - 2);
1277	seq_printf(seq, "\n");
1278
1279	return 0;
1280}
1281
1282static int i2o_seq_show_dev_name(struct seq_file *seq, void *v)
1283{
1284	struct i2o_device *d = (struct i2o_device *)seq->private;
1285
1286	seq_printf(seq, "%s\n", dev_name(&d->device));
1287
1288	return 0;
1289}
1290
1291/* Generic group F101h - DDM Identity (scalar) */
1292static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v)
1293{
1294	struct i2o_device *d = (struct i2o_device *)seq->private;
1295	int token;
1296
1297	struct {
1298		u16 ddm_tid;
1299		u8 module_name[24];
1300		u8 module_rev[8];
1301		u8 sn_format;
1302		u8 serial_number[12];
1303		u8 pad[256];	// allow up to 256 byte (max) serial number
1304	} result;
1305
 
 
1306	token = i2o_parm_field_get(d, 0xF101, -1, &result, sizeof(result));
1307
1308	if (token < 0) {
1309		i2o_report_query_status(seq, token, "0xF101 DDM Identity");
1310		return 0;
1311	}
1312
1313	seq_printf(seq, "Registering DDM TID : 0x%03x\n", result.ddm_tid);
1314	seq_printf(seq, "Module name         : %s\n",
1315		   chtostr(result.module_name, 24));
1316	seq_printf(seq, "Module revision     : %s\n",
1317		   chtostr(result.module_rev, 8));
1318
1319	seq_printf(seq, "Serial number       : ");
1320	print_serial_number(seq, result.serial_number, sizeof(result) - 36);
1321	/* allow for SNLen plus possible trailing '\0' */
1322
1323	seq_printf(seq, "\n");
1324
1325	return 0;
1326}
1327
1328/* Generic group F102h - User Information (scalar) */
1329static int i2o_seq_show_uinfo(struct seq_file *seq, void *v)
1330{
1331	struct i2o_device *d = (struct i2o_device *)seq->private;
1332	int token;
1333
1334	struct {
1335		u8 device_name[64];
1336		u8 service_name[64];
1337		u8 physical_location[64];
1338		u8 instance_number[4];
1339	} result;
1340
 
 
1341	token = i2o_parm_field_get(d, 0xF102, -1, &result, sizeof(result));
1342
1343	if (token < 0) {
1344		i2o_report_query_status(seq, token, "0xF102 User Information");
1345		return 0;
1346	}
1347
1348	seq_printf(seq, "Device name     : %s\n",
1349		   chtostr(result.device_name, 64));
1350	seq_printf(seq, "Service name    : %s\n",
1351		   chtostr(result.service_name, 64));
1352	seq_printf(seq, "Physical name   : %s\n",
1353		   chtostr(result.physical_location, 64));
1354	seq_printf(seq, "Instance number : %s\n",
1355		   chtostr(result.instance_number, 4));
1356
1357	return 0;
1358}
1359
1360/* Generic group F103h - SGL Operating Limits (scalar) */
1361static int i2o_seq_show_sgl_limits(struct seq_file *seq, void *v)
1362{
1363	struct i2o_device *d = (struct i2o_device *)seq->private;
1364	static u32 work32[12];
1365	static u16 *work16 = (u16 *) work32;
1366	static u8 *work8 = (u8 *) work32;
1367	int token;
1368
1369	token = i2o_parm_field_get(d, 0xF103, -1, &work32, sizeof(work32));
1370
1371	if (token < 0) {
1372		i2o_report_query_status(seq, token,
1373					"0xF103 SGL Operating Limits");
1374		return 0;
1375	}
1376
1377	seq_printf(seq, "SGL chain size        : %d\n", work32[0]);
1378	seq_printf(seq, "Max SGL chain size    : %d\n", work32[1]);
1379	seq_printf(seq, "SGL chain size target : %d\n", work32[2]);
1380	seq_printf(seq, "SGL frag count        : %d\n", work16[6]);
1381	seq_printf(seq, "Max SGL frag count    : %d\n", work16[7]);
1382	seq_printf(seq, "SGL frag count target : %d\n", work16[8]);
1383
1384/* FIXME
1385	if (d->i2oversion == 0x02)
1386	{
1387*/
1388	seq_printf(seq, "SGL data alignment    : %d\n", work16[8]);
1389	seq_printf(seq, "SGL addr limit        : %d\n", work8[20]);
1390	seq_printf(seq, "SGL addr sizes supported : ");
1391	if (work8[21] & 0x01)
1392		seq_printf(seq, "32 bit ");
1393	if (work8[21] & 0x02)
1394		seq_printf(seq, "64 bit ");
1395	if (work8[21] & 0x04)
1396		seq_printf(seq, "96 bit ");
1397	if (work8[21] & 0x08)
1398		seq_printf(seq, "128 bit ");
1399	seq_printf(seq, "\n");
1400/*
1401	}
1402*/
1403
1404	return 0;
1405}
1406
1407/* Generic group F200h - Sensors (scalar) */
1408static int i2o_seq_show_sensors(struct seq_file *seq, void *v)
1409{
1410	struct i2o_device *d = (struct i2o_device *)seq->private;
1411	int token;
1412
1413	struct {
1414		u16 sensor_instance;
1415		u8 component;
1416		u16 component_instance;
1417		u8 sensor_class;
1418		u8 sensor_type;
1419		u8 scaling_exponent;
1420		u32 actual_reading;
1421		u32 minimum_reading;
1422		u32 low2lowcat_treshold;
1423		u32 lowcat2low_treshold;
1424		u32 lowwarn2low_treshold;
1425		u32 low2lowwarn_treshold;
1426		u32 norm2lowwarn_treshold;
1427		u32 lowwarn2norm_treshold;
1428		u32 nominal_reading;
1429		u32 hiwarn2norm_treshold;
1430		u32 norm2hiwarn_treshold;
1431		u32 high2hiwarn_treshold;
1432		u32 hiwarn2high_treshold;
1433		u32 hicat2high_treshold;
1434		u32 hi2hicat_treshold;
1435		u32 maximum_reading;
1436		u8 sensor_state;
1437		u16 event_enable;
1438	} result;
1439
1440	token = i2o_parm_field_get(d, 0xF200, -1, &result, sizeof(result));
1441
1442	if (token < 0) {
1443		i2o_report_query_status(seq, token,
1444					"0xF200 Sensors (optional)");
1445		return 0;
1446	}
1447
1448	seq_printf(seq, "Sensor instance       : %d\n", result.sensor_instance);
1449
1450	seq_printf(seq, "Component             : %d = ", result.component);
1451	switch (result.component) {
1452	case 0:
1453		seq_printf(seq, "Other");
1454		break;
1455	case 1:
1456		seq_printf(seq, "Planar logic Board");
1457		break;
1458	case 2:
1459		seq_printf(seq, "CPU");
1460		break;
1461	case 3:
1462		seq_printf(seq, "Chassis");
1463		break;
1464	case 4:
1465		seq_printf(seq, "Power Supply");
1466		break;
1467	case 5:
1468		seq_printf(seq, "Storage");
1469		break;
1470	case 6:
1471		seq_printf(seq, "External");
1472		break;
1473	}
1474	seq_printf(seq, "\n");
1475
1476	seq_printf(seq, "Component instance    : %d\n",
1477		   result.component_instance);
1478	seq_printf(seq, "Sensor class          : %s\n",
1479		   result.sensor_class ? "Analog" : "Digital");
1480
1481	seq_printf(seq, "Sensor type           : %d = ", result.sensor_type);
1482	switch (result.sensor_type) {
1483	case 0:
1484		seq_printf(seq, "Other\n");
1485		break;
1486	case 1:
1487		seq_printf(seq, "Thermal\n");
1488		break;
1489	case 2:
1490		seq_printf(seq, "DC voltage (DC volts)\n");
1491		break;
1492	case 3:
1493		seq_printf(seq, "AC voltage (AC volts)\n");
1494		break;
1495	case 4:
1496		seq_printf(seq, "DC current (DC amps)\n");
1497		break;
1498	case 5:
1499		seq_printf(seq, "AC current (AC volts)\n");
1500		break;
1501	case 6:
1502		seq_printf(seq, "Door open\n");
1503		break;
1504	case 7:
1505		seq_printf(seq, "Fan operational\n");
1506		break;
1507	}
1508
1509	seq_printf(seq, "Scaling exponent      : %d\n",
1510		   result.scaling_exponent);
1511	seq_printf(seq, "Actual reading        : %d\n", result.actual_reading);
1512	seq_printf(seq, "Minimum reading       : %d\n", result.minimum_reading);
1513	seq_printf(seq, "Low2LowCat treshold   : %d\n",
1514		   result.low2lowcat_treshold);
1515	seq_printf(seq, "LowCat2Low treshold   : %d\n",
1516		   result.lowcat2low_treshold);
1517	seq_printf(seq, "LowWarn2Low treshold  : %d\n",
1518		   result.lowwarn2low_treshold);
1519	seq_printf(seq, "Low2LowWarn treshold  : %d\n",
1520		   result.low2lowwarn_treshold);
1521	seq_printf(seq, "Norm2LowWarn treshold : %d\n",
1522		   result.norm2lowwarn_treshold);
1523	seq_printf(seq, "LowWarn2Norm treshold : %d\n",
1524		   result.lowwarn2norm_treshold);
1525	seq_printf(seq, "Nominal reading       : %d\n", result.nominal_reading);
1526	seq_printf(seq, "HiWarn2Norm treshold  : %d\n",
1527		   result.hiwarn2norm_treshold);
1528	seq_printf(seq, "Norm2HiWarn treshold  : %d\n",
1529		   result.norm2hiwarn_treshold);
1530	seq_printf(seq, "High2HiWarn treshold  : %d\n",
1531		   result.high2hiwarn_treshold);
1532	seq_printf(seq, "HiWarn2High treshold  : %d\n",
1533		   result.hiwarn2high_treshold);
1534	seq_printf(seq, "HiCat2High treshold   : %d\n",
1535		   result.hicat2high_treshold);
1536	seq_printf(seq, "High2HiCat treshold   : %d\n",
1537		   result.hi2hicat_treshold);
1538	seq_printf(seq, "Maximum reading       : %d\n", result.maximum_reading);
1539
1540	seq_printf(seq, "Sensor state          : %d = ", result.sensor_state);
1541	switch (result.sensor_state) {
1542	case 0:
1543		seq_printf(seq, "Normal\n");
1544		break;
1545	case 1:
1546		seq_printf(seq, "Abnormal\n");
1547		break;
1548	case 2:
1549		seq_printf(seq, "Unknown\n");
1550		break;
1551	case 3:
1552		seq_printf(seq, "Low Catastrophic (LoCat)\n");
1553		break;
1554	case 4:
1555		seq_printf(seq, "Low (Low)\n");
1556		break;
1557	case 5:
1558		seq_printf(seq, "Low Warning (LoWarn)\n");
1559		break;
1560	case 6:
1561		seq_printf(seq, "High Warning (HiWarn)\n");
1562		break;
1563	case 7:
1564		seq_printf(seq, "High (High)\n");
1565		break;
1566	case 8:
1567		seq_printf(seq, "High Catastrophic (HiCat)\n");
1568		break;
1569	}
1570
1571	seq_printf(seq, "Event_enable : 0x%02X\n", result.event_enable);
1572	seq_printf(seq, "    [%s] Operational state change. \n",
1573		   (result.event_enable & 0x01) ? "+" : "-");
1574	seq_printf(seq, "    [%s] Low catastrophic. \n",
1575		   (result.event_enable & 0x02) ? "+" : "-");
1576	seq_printf(seq, "    [%s] Low reading. \n",
1577		   (result.event_enable & 0x04) ? "+" : "-");
1578	seq_printf(seq, "    [%s] Low warning. \n",
1579		   (result.event_enable & 0x08) ? "+" : "-");
1580	seq_printf(seq,
1581		   "    [%s] Change back to normal from out of range state. \n",
1582		   (result.event_enable & 0x10) ? "+" : "-");
1583	seq_printf(seq, "    [%s] High warning. \n",
1584		   (result.event_enable & 0x20) ? "+" : "-");
1585	seq_printf(seq, "    [%s] High reading. \n",
1586		   (result.event_enable & 0x40) ? "+" : "-");
1587	seq_printf(seq, "    [%s] High catastrophic. \n",
1588		   (result.event_enable & 0x80) ? "+" : "-");
1589
1590	return 0;
1591}
1592
1593static int i2o_seq_open_hrt(struct inode *inode, struct file *file)
1594{
1595	return single_open(file, i2o_seq_show_hrt, PDE(inode)->data);
1596};
1597
1598static int i2o_seq_open_lct(struct inode *inode, struct file *file)
1599{
1600	return single_open(file, i2o_seq_show_lct, PDE(inode)->data);
1601};
1602
1603static int i2o_seq_open_status(struct inode *inode, struct file *file)
1604{
1605	return single_open(file, i2o_seq_show_status, PDE(inode)->data);
1606};
1607
1608static int i2o_seq_open_hw(struct inode *inode, struct file *file)
1609{
1610	return single_open(file, i2o_seq_show_hw, PDE(inode)->data);
1611};
1612
1613static int i2o_seq_open_ddm_table(struct inode *inode, struct file *file)
1614{
1615	return single_open(file, i2o_seq_show_ddm_table, PDE(inode)->data);
1616};
1617
1618static int i2o_seq_open_driver_store(struct inode *inode, struct file *file)
1619{
1620	return single_open(file, i2o_seq_show_driver_store, PDE(inode)->data);
1621};
1622
1623static int i2o_seq_open_drivers_stored(struct inode *inode, struct file *file)
1624{
1625	return single_open(file, i2o_seq_show_drivers_stored, PDE(inode)->data);
1626};
1627
1628static int i2o_seq_open_groups(struct inode *inode, struct file *file)
1629{
1630	return single_open(file, i2o_seq_show_groups, PDE(inode)->data);
1631};
1632
1633static int i2o_seq_open_phys_device(struct inode *inode, struct file *file)
1634{
1635	return single_open(file, i2o_seq_show_phys_device, PDE(inode)->data);
1636};
1637
1638static int i2o_seq_open_claimed(struct inode *inode, struct file *file)
1639{
1640	return single_open(file, i2o_seq_show_claimed, PDE(inode)->data);
1641};
1642
1643static int i2o_seq_open_users(struct inode *inode, struct file *file)
1644{
1645	return single_open(file, i2o_seq_show_users, PDE(inode)->data);
1646};
1647
1648static int i2o_seq_open_priv_msgs(struct inode *inode, struct file *file)
1649{
1650	return single_open(file, i2o_seq_show_priv_msgs, PDE(inode)->data);
1651};
1652
1653static int i2o_seq_open_authorized_users(struct inode *inode, struct file *file)
1654{
1655	return single_open(file, i2o_seq_show_authorized_users,
1656			   PDE(inode)->data);
1657};
1658
1659static int i2o_seq_open_dev_identity(struct inode *inode, struct file *file)
1660{
1661	return single_open(file, i2o_seq_show_dev_identity, PDE(inode)->data);
1662};
1663
1664static int i2o_seq_open_ddm_identity(struct inode *inode, struct file *file)
1665{
1666	return single_open(file, i2o_seq_show_ddm_identity, PDE(inode)->data);
1667};
1668
1669static int i2o_seq_open_uinfo(struct inode *inode, struct file *file)
1670{
1671	return single_open(file, i2o_seq_show_uinfo, PDE(inode)->data);
1672};
1673
1674static int i2o_seq_open_sgl_limits(struct inode *inode, struct file *file)
1675{
1676	return single_open(file, i2o_seq_show_sgl_limits, PDE(inode)->data);
1677};
1678
1679static int i2o_seq_open_sensors(struct inode *inode, struct file *file)
1680{
1681	return single_open(file, i2o_seq_show_sensors, PDE(inode)->data);
1682};
1683
1684static int i2o_seq_open_dev_name(struct inode *inode, struct file *file)
1685{
1686	return single_open(file, i2o_seq_show_dev_name, PDE(inode)->data);
1687};
1688
1689static const struct file_operations i2o_seq_fops_lct = {
1690	.open = i2o_seq_open_lct,
1691	.read = seq_read,
1692	.llseek = seq_lseek,
1693	.release = single_release,
1694};
1695
1696static const struct file_operations i2o_seq_fops_hrt = {
1697	.open = i2o_seq_open_hrt,
1698	.read = seq_read,
1699	.llseek = seq_lseek,
1700	.release = single_release,
1701};
1702
1703static const struct file_operations i2o_seq_fops_status = {
1704	.open = i2o_seq_open_status,
1705	.read = seq_read,
1706	.llseek = seq_lseek,
1707	.release = single_release,
1708};
1709
1710static const struct file_operations i2o_seq_fops_hw = {
1711	.open = i2o_seq_open_hw,
1712	.read = seq_read,
1713	.llseek = seq_lseek,
1714	.release = single_release,
1715};
1716
1717static const struct file_operations i2o_seq_fops_ddm_table = {
1718	.open = i2o_seq_open_ddm_table,
1719	.read = seq_read,
1720	.llseek = seq_lseek,
1721	.release = single_release,
1722};
1723
1724static const struct file_operations i2o_seq_fops_driver_store = {
1725	.open = i2o_seq_open_driver_store,
1726	.read = seq_read,
1727	.llseek = seq_lseek,
1728	.release = single_release,
1729};
1730
1731static const struct file_operations i2o_seq_fops_drivers_stored = {
1732	.open = i2o_seq_open_drivers_stored,
1733	.read = seq_read,
1734	.llseek = seq_lseek,
1735	.release = single_release,
1736};
1737
1738static const struct file_operations i2o_seq_fops_groups = {
1739	.open = i2o_seq_open_groups,
1740	.read = seq_read,
1741	.llseek = seq_lseek,
1742	.release = single_release,
1743};
1744
1745static const struct file_operations i2o_seq_fops_phys_device = {
1746	.open = i2o_seq_open_phys_device,
1747	.read = seq_read,
1748	.llseek = seq_lseek,
1749	.release = single_release,
1750};
1751
1752static const struct file_operations i2o_seq_fops_claimed = {
1753	.open = i2o_seq_open_claimed,
1754	.read = seq_read,
1755	.llseek = seq_lseek,
1756	.release = single_release,
1757};
1758
1759static const struct file_operations i2o_seq_fops_users = {
1760	.open = i2o_seq_open_users,
1761	.read = seq_read,
1762	.llseek = seq_lseek,
1763	.release = single_release,
1764};
1765
1766static const struct file_operations i2o_seq_fops_priv_msgs = {
1767	.open = i2o_seq_open_priv_msgs,
1768	.read = seq_read,
1769	.llseek = seq_lseek,
1770	.release = single_release,
1771};
1772
1773static const struct file_operations i2o_seq_fops_authorized_users = {
1774	.open = i2o_seq_open_authorized_users,
1775	.read = seq_read,
1776	.llseek = seq_lseek,
1777	.release = single_release,
1778};
1779
1780static const struct file_operations i2o_seq_fops_dev_name = {
1781	.open = i2o_seq_open_dev_name,
1782	.read = seq_read,
1783	.llseek = seq_lseek,
1784	.release = single_release,
1785};
1786
1787static const struct file_operations i2o_seq_fops_dev_identity = {
1788	.open = i2o_seq_open_dev_identity,
1789	.read = seq_read,
1790	.llseek = seq_lseek,
1791	.release = single_release,
1792};
1793
1794static const struct file_operations i2o_seq_fops_ddm_identity = {
1795	.open = i2o_seq_open_ddm_identity,
1796	.read = seq_read,
1797	.llseek = seq_lseek,
1798	.release = single_release,
1799};
1800
1801static const struct file_operations i2o_seq_fops_uinfo = {
1802	.open = i2o_seq_open_uinfo,
1803	.read = seq_read,
1804	.llseek = seq_lseek,
1805	.release = single_release,
1806};
1807
1808static const struct file_operations i2o_seq_fops_sgl_limits = {
1809	.open = i2o_seq_open_sgl_limits,
1810	.read = seq_read,
1811	.llseek = seq_lseek,
1812	.release = single_release,
1813};
1814
1815static const struct file_operations i2o_seq_fops_sensors = {
1816	.open = i2o_seq_open_sensors,
1817	.read = seq_read,
1818	.llseek = seq_lseek,
1819	.release = single_release,
1820};
1821
1822/*
1823 * IOP specific entries...write field just in case someone
1824 * ever wants one.
1825 */
1826static i2o_proc_entry i2o_proc_generic_iop_entries[] = {
1827	{"hrt", S_IFREG | S_IRUGO, &i2o_seq_fops_hrt},
1828	{"lct", S_IFREG | S_IRUGO, &i2o_seq_fops_lct},
1829	{"status", S_IFREG | S_IRUGO, &i2o_seq_fops_status},
1830	{"hw", S_IFREG | S_IRUGO, &i2o_seq_fops_hw},
1831	{"ddm_table", S_IFREG | S_IRUGO, &i2o_seq_fops_ddm_table},
1832	{"driver_store", S_IFREG | S_IRUGO, &i2o_seq_fops_driver_store},
1833	{"drivers_stored", S_IFREG | S_IRUGO, &i2o_seq_fops_drivers_stored},
1834	{NULL, 0, NULL}
1835};
1836
1837/*
1838 * Device specific entries
1839 */
1840static i2o_proc_entry generic_dev_entries[] = {
1841	{"groups", S_IFREG | S_IRUGO, &i2o_seq_fops_groups},
1842	{"phys_dev", S_IFREG | S_IRUGO, &i2o_seq_fops_phys_device},
1843	{"claimed", S_IFREG | S_IRUGO, &i2o_seq_fops_claimed},
1844	{"users", S_IFREG | S_IRUGO, &i2o_seq_fops_users},
1845	{"priv_msgs", S_IFREG | S_IRUGO, &i2o_seq_fops_priv_msgs},
1846	{"authorized_users", S_IFREG | S_IRUGO, &i2o_seq_fops_authorized_users},
1847	{"dev_identity", S_IFREG | S_IRUGO, &i2o_seq_fops_dev_identity},
1848	{"ddm_identity", S_IFREG | S_IRUGO, &i2o_seq_fops_ddm_identity},
1849	{"user_info", S_IFREG | S_IRUGO, &i2o_seq_fops_uinfo},
1850	{"sgl_limits", S_IFREG | S_IRUGO, &i2o_seq_fops_sgl_limits},
1851	{"sensors", S_IFREG | S_IRUGO, &i2o_seq_fops_sensors},
1852	{NULL, 0, NULL}
1853};
1854
1855/*
1856 *  Storage unit specific entries (SCSI Periph, BS) with device names
1857 */
1858static i2o_proc_entry rbs_dev_entries[] = {
1859	{"dev_name", S_IFREG | S_IRUGO, &i2o_seq_fops_dev_name},
1860	{NULL, 0, NULL}
1861};
1862
1863/**
1864 *	i2o_proc_create_entries - Creates proc dir entries
1865 *	@dir: proc dir entry under which the entries should be placed
1866 *	@i2o_pe: pointer to the entries which should be added
1867 *	@data: pointer to I2O controller or device
1868 *
1869 *	Create proc dir entries for a I2O controller or I2O device.
1870 *
1871 *	Returns 0 on success or negative error code on failure.
1872 */
1873static int i2o_proc_create_entries(struct proc_dir_entry *dir,
1874				   i2o_proc_entry * i2o_pe, void *data)
1875{
1876	struct proc_dir_entry *tmp;
1877
1878	while (i2o_pe->name) {
1879		tmp = proc_create_data(i2o_pe->name, i2o_pe->mode, dir,
1880				       i2o_pe->fops, data);
1881		if (!tmp)
1882			return -1;
1883
1884		i2o_pe++;
1885	}
1886
1887	return 0;
1888}
1889
1890/**
1891 *	i2o_proc_subdir_remove - Remove child entries from a proc entry
1892 *	@dir: proc dir entry from which the childs should be removed
1893 *
1894 *	Iterate over each i2o proc entry under dir and remove it. If the child
1895 *	also has entries, remove them too.
1896 */
1897static void i2o_proc_subdir_remove(struct proc_dir_entry *dir)
1898{
1899	struct proc_dir_entry *pe, *tmp;
1900	pe = dir->subdir;
1901	while (pe) {
1902		tmp = pe->next;
1903		i2o_proc_subdir_remove(pe);
1904		remove_proc_entry(pe->name, dir);
1905		pe = tmp;
1906	}
1907};
1908
1909/**
1910 *	i2o_proc_device_add - Add an I2O device to the proc dir
1911 *	@dir: proc dir entry to which the device should be added
1912 *	@dev: I2O device which should be added
1913 *
1914 *	Add an I2O device to the proc dir entry dir and create the entries for
1915 *	the device depending on the class of the I2O device.
1916 */
1917static void i2o_proc_device_add(struct proc_dir_entry *dir,
1918				struct i2o_device *dev)
1919{
1920	char buff[10];
1921	struct proc_dir_entry *devdir;
1922	i2o_proc_entry *i2o_pe = NULL;
1923
1924	sprintf(buff, "%03x", dev->lct_data.tid);
1925
1926	osm_debug("adding device /proc/i2o/%s/%s\n", dev->iop->name, buff);
1927
1928	devdir = proc_mkdir(buff, dir);
1929	if (!devdir) {
1930		osm_warn("Could not allocate procdir!\n");
1931		return;
1932	}
1933
1934	devdir->data = dev;
1935
1936	i2o_proc_create_entries(devdir, generic_dev_entries, dev);
1937
1938	/* Inform core that we want updates about this device's status */
1939	switch (dev->lct_data.class_id) {
1940	case I2O_CLASS_SCSI_PERIPHERAL:
1941	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
1942		i2o_pe = rbs_dev_entries;
1943		break;
1944	default:
1945		break;
1946	}
1947	if (i2o_pe)
1948		i2o_proc_create_entries(devdir, i2o_pe, dev);
1949}
1950
1951/**
1952 *	i2o_proc_iop_add - Add an I2O controller to the i2o proc tree
1953 *	@dir: parent proc dir entry
1954 *	@c: I2O controller which should be added
1955 *
1956 *	Add the entries to the parent proc dir entry. Also each device is added
1957 *	to the controllers proc dir entry.
1958 *
1959 *	Returns 0 on success or negative error code on failure.
1960 */
1961static int i2o_proc_iop_add(struct proc_dir_entry *dir,
1962			    struct i2o_controller *c)
1963{
1964	struct proc_dir_entry *iopdir;
1965	struct i2o_device *dev;
1966
1967	osm_debug("adding IOP /proc/i2o/%s\n", c->name);
1968
1969	iopdir = proc_mkdir(c->name, dir);
1970	if (!iopdir)
1971		return -1;
1972
1973	iopdir->data = c;
1974
1975	i2o_proc_create_entries(iopdir, i2o_proc_generic_iop_entries, c);
1976
1977	list_for_each_entry(dev, &c->devices, list)
1978	    i2o_proc_device_add(iopdir, dev);
1979
1980	return 0;
1981}
1982
1983/**
1984 *	i2o_proc_iop_remove - Removes an I2O controller from the i2o proc tree
1985 *	@dir: parent proc dir entry
1986 *	@c: I2O controller which should be removed
1987 *
1988 *	Iterate over each i2o proc entry and search controller c. If it is found
1989 *	remove it from the tree.
1990 */
1991static void i2o_proc_iop_remove(struct proc_dir_entry *dir,
1992				struct i2o_controller *c)
1993{
1994	struct proc_dir_entry *pe, *tmp;
1995
1996	pe = dir->subdir;
1997	while (pe) {
1998		tmp = pe->next;
1999		if (pe->data == c) {
2000			i2o_proc_subdir_remove(pe);
2001			remove_proc_entry(pe->name, dir);
2002		}
2003		osm_debug("removing IOP /proc/i2o/%s\n", c->name);
2004		pe = tmp;
2005	}
2006}
2007
2008/**
2009 *	i2o_proc_fs_create - Create the i2o proc fs.
2010 *
2011 *	Iterate over each I2O controller and create the entries for it.
2012 *
2013 *	Returns 0 on success or negative error code on failure.
2014 */
2015static int __init i2o_proc_fs_create(void)
2016{
2017	struct i2o_controller *c;
2018
2019	i2o_proc_dir_root = proc_mkdir("i2o", NULL);
2020	if (!i2o_proc_dir_root)
2021		return -1;
2022
2023	list_for_each_entry(c, &i2o_controllers, list)
2024	    i2o_proc_iop_add(i2o_proc_dir_root, c);
2025
2026	return 0;
2027};
2028
2029/**
2030 *	i2o_proc_fs_destroy - Cleanup the all i2o proc entries
2031 *
2032 *	Iterate over each I2O controller and remove the entries for it.
2033 *
2034 *	Returns 0 on success or negative error code on failure.
2035 */
2036static int __exit i2o_proc_fs_destroy(void)
2037{
2038	struct i2o_controller *c;
2039
2040	list_for_each_entry(c, &i2o_controllers, list)
2041	    i2o_proc_iop_remove(i2o_proc_dir_root, c);
2042
2043	remove_proc_entry("i2o", NULL);
2044
2045	return 0;
2046};
2047
2048/**
2049 *	i2o_proc_init - Init function for procfs
2050 *
2051 *	Registers Proc OSM and creates procfs entries.
2052 *
2053 *	Returns 0 on success or negative error code on failure.
2054 */
2055static int __init i2o_proc_init(void)
2056{
2057	int rc;
2058
2059	printk(KERN_INFO OSM_DESCRIPTION " v" OSM_VERSION "\n");
2060
2061	rc = i2o_driver_register(&i2o_proc_driver);
2062	if (rc)
2063		return rc;
2064
2065	rc = i2o_proc_fs_create();
2066	if (rc) {
2067		i2o_driver_unregister(&i2o_proc_driver);
2068		return rc;
2069	}
2070
2071	return 0;
2072};
2073
2074/**
2075 *	i2o_proc_exit - Exit function for procfs
2076 *
2077 *	Unregisters Proc OSM and removes procfs entries.
2078 */
2079static void __exit i2o_proc_exit(void)
2080{
2081	i2o_driver_unregister(&i2o_proc_driver);
2082	i2o_proc_fs_destroy();
2083};
2084
2085MODULE_AUTHOR("Deepak Saxena");
2086MODULE_LICENSE("GPL");
2087MODULE_DESCRIPTION(OSM_DESCRIPTION);
2088MODULE_VERSION(OSM_VERSION);
2089
2090module_init(i2o_proc_init);
2091module_exit(i2o_proc_exit);